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 .