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:a2…a2+d−1level 2:a2+d…a2+d+d2−1⋮level k:a2+∑i=1k−1di…a2+∑i=1kdi−1

    → 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+1−1d−1=nh=logd[nd−1+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(c8∗d+(c9+..+c13)∗d+c14∗d)
      ci
    • TE=(c1+..+c7)+TM≤C∗d∗h=C∗d∗(logd[n(d−1)+1]−1)=O(dlogd[n(d−1)])

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


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 ⌊(i−2)/d+1⌋

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

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

    dd=2d2

  2. h=logd(nd−1+1)−1logd⁡(nd)−1=logd⁡(n)+logd⁡(d)−1=logd⁡(n)+1−1=logd⁡(n)Θ(logd⁡(n))

    cΘ

  3. AUXd-ary-parentd-ary-child

    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))

    d≪ndlogd⁡(d−1)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))


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[nd−1+1]−1
1+d+d2+..+dh=ndh+1−1d−1=nh=logd[n(d−1)+1]−1
h=Θ(logd⁡(n))

-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


4
Warum ist das die Antwort? Eine Formel ohne Erklärung hilft niemandem wirklich.
— David Richerby
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.