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?


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


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

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