Ich war verwirrt, als ich das folgende Problem löste (Fragen 1–3).
Frage
Ein d -ary-Heap ist wie ein binärer Heap, aber (mit einer möglichen Ausnahme) Nicht-Blattknoten haben d Kinder anstelle von 2 Kindern.
Wie würden Sie einen d -ary-Heap in einem Array darstellen?
Wie hoch ist ein d -ary Haufen von n Elementen in Bezug auf n und d ?
Geben Sie eine effiziente Implementierung von EXTRACT-MAX in einem d -ary max-Heap. Analysieren Sie die Laufzeit in d und n .
Geben Sie eine effiziente Implementierung von INSERT in einem d -ary max-Heap an. Analysieren Sie die Laufzeit in d und n .
Geben Sie eine effiziente Implementierung von INCREASE-KEY ( A , i , k ) an, die einen Fehler kennzeichnet , wenn k <A [i] = k ist, und dann die Heap-Struktur der d -ary-Matrix entsprechend aktualisiert . Analysieren Sie die Laufzeit in d und n .
Meine Lösung
Geben Sie ein Array
→ Meine Notation wirkt etwas raffiniert. Gibt es eine andere einfachere?
Lassen h die Höhe des bezeichnet d ary Heap.
Angenommen, der Heap ist ein vollständiger d -ary-Baum
Dies ist meine Implementierung:
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) )
Die Laufzeit von MAX-HEAPIFY:
→ Ist das eine effiziente Lösung? Oder stimmt etwas in meiner Lösung nicht?
h = (log [nd−1+1])− 1
Somit gilt die obige Erklärung für die Höhe nicht. h = log [nd - 1 + 1] −1 = log [nd] -1 = log [n] Obwohl die Höhe des Baums wie folgt geschrieben wird:Θ(log(n)).
Hinweis: log ist für einen d-ary Heap immer auf der Basis d .Antworten:
Ihre Lösung ist gültig und folgt der Definition von d -ary heap. Aber wie Sie betont haben, ist Ihre Notation etwas raffiniert.
Sie könnten die beiden folgenden Funktionen Eltern abrufen , von i - ten Element und j - te Kind von i -te Element.
Das CLRS-Buch bietet bereits das INSERT-Verfahren. Welches sieht so aus:
Wie INSERT wird INCREASE-KEY im Lehrbuch auch definiert als:
quelle
quelle
Die Antwort auf die zweite Frage lautet h = log d (n (d-1) + 1) - 1. Also ist h = log d (nd - n + 1) - 1
quelle