Ein D-Ary-Heap-Problem von CLRS

10

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.

  1. Wie würden Sie einen d -ary-Heap in einem Array darstellen?

  2. Wie hoch ist ein d -ary Haufen von n Elementen in Bezug auf n und d ?

  3. Geben Sie eine effiziente Implementierung von EXTRACT-MAX in einem d -ary max-Heap. Analysieren Sie die Laufzeit in d und n .

  4. Geben Sie eine effiziente Implementierung von INSERT in einem d -ary max-Heap an. Analysieren Sie die Laufzeit in d und n .

  5. 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

  1. Geben Sie ein Array A[a1..an]

    root:a1level 1:a2a2+d1level 2:a2+da2+d+d21level k:a2+i=1k1dia2+i=1kdi1

    Meine Notation wirkt etwas raffiniert. Gibt es eine andere einfachere?

  2. Lassen h die Höhe des bezeichnet d ary Heap.

    Angenommen, der Heap ist ein vollständiger d -ary-Baum

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. 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:

      TM=d(c8d+(c9+..+c13)d+c14d)
      ci
    • TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    Ist das eine effiziente Lösung? Oder stimmt etwas in meiner Lösung nicht?

lucasKo
quelle
Ich denke, es gibt einen kleinen Fehler in der Frage sowie in der Erklärung: Die Höhe des Tageshaufens beträgt h = (log [nd - n + 1]) - 1 // HINWEIS sein "-n" und nicht "-1" und nicht h = (log [nd−1+1])− 1Somit 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 .
Surabhi Raje

Antworten:

10
  1. 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.

    d-ary-parent(i)    return (i2)/d+1

    d-ary-child(i,j)    return d(i1)+j+1

    1jdd-ary-parent(d-ary-child(i,j))=i

    dd=2d2

  2. h=logd(nd1+1)1logd(nd)1=logd(n)+logd(d)1=logd(n)+11=logd(n)Θ(logd(n))

    cΘ

  3. AUXd-ary-parentd-ary-child

    EXTRACT-MAXMAX-HEAPIFYO(d logd(n(d1)))

    O(d logd(n(d1)))=O(d(logd(n)+log(d1)))=O(d logd(n)+d logd(d1))

    dndlogd(d1)O(dlogd(n))MAX-HEAPIFYOΘ

  4. Das CLRS-Buch bietet bereits das INSERT-Verfahren. Welches sieht so aus:

    INSERT(A,key)    A.heap_size=A.heap_size+1    A[A.heap_size]=    INCREASE-KEY(A,A.heap_size,key)

    O(logd(n))

  5. Wie INSERT wird INCREASE-KEY im Lehrbuch auch definiert als:

    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)

    O(logd(n))

Bartosz Przybylski
quelle
Vielen Dank! Wie wäre es mit der Implementierung von INCREASE-KEY und INSERT? Ich versuche es zu schreiben, aber es gab zweimal rekursiven Aufruf von MAX-HEAPIFY. Gibt es eine bessere Lösung? Ich fand wenig Informationen im Web und Wiki
lucasKo
Ist das Rest der Übung? Wenn ja, aktualisieren Sie bitte Ihre Frage und ich werde gerne das Thema beantworten.
Bartosz Przybylski
Ich habe diese Frage in den bearbeiteten Beitrag gestellt.
LucasKo
INSERT-Prozedur erneut implementieren? Sie meinen, es muss nicht die Prozedur aufgerufen werden, die die Reihenfolge innerhalb des Heaps anpasst, nachdem ein neues Element eingefügt wurde? Ich verstehe es nicht ...
lucasKo
Diese Beschreibung war etwas unglücklich, siehe Änderungen zur Klarstellung.
Bartosz Przybylski
1

h=logd[nd1+1]1
1+d+d2+..+dh=ndh+11d1=nh=logd[n(d1)+1]1
h=Θ(logd(n))
Ali Jazib Mahmood
quelle
-1

Die Antwort auf die zweite Frage lautet h = log d (n (d-1) + 1) - 1. Also ist h = log d (nd - n + 1) - 1

user55463
quelle
4
Warum ist das die Antwort? Eine Formel ohne Erklärung hilft niemandem wirklich.
David Richerby