Je suis devenu confus en résolvant le problème suivant (questions 1 à 3).
Question
Un tas d -ary est comme un tas binaire, mais (à une exception possible) les nœuds non-feuilles ont d enfants au lieu de 2 enfants.
Comment représenteriez-vous un tas d -ary dans un tableau?
Quelle est la hauteur d'un tas d -aire de n éléments en termes de n et d ?
Donner une implémentation efficace d'EXTRACT-MAX dans un tas max d -ary. Analysez son temps de fonctionnement en termes de d et n .
Donner une implémentation efficace de INSERT dans un tas max d -ary. Analysez son temps de fonctionnement en termes de d et n .
Donnez une implémentation efficace de INCREASE-KEY ( A , i , k ), qui signale une erreur si k <A [i] = k, puis met à jour la structure de tas de la matrice d -ary de manière appropriée. Analysez son temps de fonctionnement en termes de d et n .
Ma solution
Donnez un tableau
→ Ma notation semble un peu sophistiquée. Y en a-t-il un autre plus simple?
Soit h la hauteur du tas d -aire.
Supposons que le tas soit un arbre d -ary complet
Voici ma mise en œuvre:
EXTRACT-MAX(A) 1 if A.heapsize < 1 2 error "heap underflow" 3 max = A[1] 4 A[1] = A[A.heapsize] 5 A.heap-size = A.heap-size - 1 6 MAX-HEAPIFY(A, 1) 7 return max MAX-HEAPIFY(A, i) 1 assign depthk-children to AUX[1..d] 2 for k=1 to d 3 compare A[i] with AUX[k] 4 if A[i] <= AUX[k] 5 exchange A[i] with AUX[k] 6 k = largest 7 assign AUX[1..d] back to A[depthk-children] 8 if largest != i 9 MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
La durée de fonctionnement de MAX-HEAPIFY:
où désigne le coût de la i- ème ligne ci-dessus.EXTRACT-MAX:
→ Est-ce une solution efficace? Ou il y a quelque chose qui ne va pas dans ma solution?
h = (log [nd−1+1])− 1
Ainsi, l'explication ci-dessus pour la hauteur ne sera pas vraie. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Bien que néanmoins, la hauteur de l'arbre soit écrite commeΘ(log(n)).
Remarque: log est toujours à la base d pour un tas d-aire .Réponses:
Votre solution est valide et suit la définition du tas d -ary. Mais comme vous l'avez souligné, votre notation est un peu sophistiquée.
Vous pouvez utiliser les deux fonctions suivantes pour récupérer le parent du i- ème élément et le j- ème enfant du i- ème élément.
Évidemment . Vous pouvez vérifier ces fonctions en vérifiant que1≤j≤d d-ary-parent(d-ary-child(i,j))=i
Il est également facile de voir que le tas binaire est un type spécial de tas -ary où , si vous remplacez par , alors vous verrez qu'ils correspondent aux fonctions PARENT, LEFT et RIGHT mentionnées dans le livre.d d=2 d 2
Si je comprends bien votre réponse, vous utilisez une progression géométrique . Dans votre cas, vous obtenez go , qui est évidemment , qui est en fait une solution valide et correcte. Mais juste pour gérer les fluctuations constantes, vous voudrez peut-être écrire .h=logd(nd−1+1)−1 logd(nd)−1=logd(n)+logd(d)−1=logd(n)+1−1=logd(n) Θ(logd(n))
La raison en est que certains tas peuvent ne pas être équilibrés, donc leur chemin le plus long et le chemin le plus court migrent varient selon une constante , en utilisant la notation , vous éliminez ce problème.c Θ
Vous n'avez pas besoin de réimplémenter la procédure donnée dans le manuel, mais vous devez la modifier un peu, par exemple en affectant tous les enfants à la table utilisant et les fonctions.AUX d-ary-parent d-ary-child
Étant donné que n'a pas été modifié, cela dépend du temps d'exécution de . Dans votre analyse, vous devez maintenant utiliser le pire des cas proportionnel à la taille et au nombre d'enfants que chaque nœud doit examiner (qui est au plus d ). Encore une fois votre analyse est très précise, vous avez finalement obtenu , qui peut être transformé en:EXTRACT-MAX MAX-HEAPIFY O(d logd(n(d−1)))
Pour des raisons pratiques, nous pouvons toujours supposer que , nous pouvons donc perdre la partie de la notation O , puis nous obtiendrons . Ce qui est également une solution valable. Mais sans surprise, vous pouvez également analyser le temps d'exécution des fonctions en utilisant le théorème maître , qui montrera que n'est pas seulement mais même .d≪n dlogd(d−1) O(dlogd(n)) MAX-HEAPIFY O Θ
Le livre CLRS fournit déjà la procédure INSERT. Qui ressemble à ceci:
Cela peut être facile à prouver, mais le bon sens veut que sa complexité temporelle soit . C'est parce que le tas peut être traversé jusqu'à la racine.O(logd(n))
Tout comme INSERT, INCREASE-KEY est également défini dans le manuel comme:
La complexité est évidemment (voir point précédent).O(logd(n))
la source
Ce n'est pas une réponse complète. partie b) la solution n'est pas Son comme l'a souligné l'utilisateur 55463 (parce qu'il ne peut pas commenter, mais répondre), mais a voté en raison du manque d'explication . La réponse votée l'a également résolu par erreur. La réponse sera toujours Source: problème 2-2. Analyse des tas d -ary, partie b)
la source
La réponse à la deuxième question est h = log d (n (d-1) + 1) - 1 Donc, h = log d (nd - n + 1) - 1
la source