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.
d-ary-parent(i) return ⌊(i−2)/d+1⌋
d-ary-child(i,j) return d(i−1)+j+1
Évidemment . Vous pouvez vérifier ces fonctions en vérifiant que1≤j≤dd-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.dd=2d2
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)−1logd(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.AUXd-ary-parentd-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-MAXMAX-HEAPIFYO(d logd(n(d−1)))
O(d logd(n(d−1)))=O(d(logd(n)+log(d−1)))=O(d logd(n)+d logd(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≪ndlogd(d−1)O(dlogd(n))MAX-HEAPIFYOΘ
Le livre CLRS fournit déjà la procédure INSERT. Qui ressemble à ceci:
INSERT(A,key) A.heap_size=A.heap_size+1 A[A.heap_size]=−∞ INCREASE-KEY(A,A.heap_size,key)
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:
INCREASE-KEY(A,i,key) if key<A[i] error"new key is smaller then current" A[i]=key while i>1 and A[i]>A[d-ary-parent(i)] A[i]↔A[d-ary-parent(i)] i=d-ary-parent(i)
La complexité est évidemment (voir point précédent).O(logd(n))
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 .