Problem sterty d-ary z CLRS


10

Byłem zdezorientowany podczas rozwiązywania następującego problemu (pytania 1–3).

Pytanie

D -ary sterty jest jak stos binarny, lecz (z wyjątkiem jednej z możliwych) węzły nie liść ma d dzieci zamiast 2 dzieci.

  1. Jak byś stanowią d -ary sterty w tablicy?

  2. Jaka jest wysokość d -ary sterty n elementów pod względem n a d ?

  3. Daj wydajną implementację EXTRACT-MAX w d -ary max-heap. Przeanalizuj jego czas działania w kategoriach d i n .

  4. Daj skutecznego wdrażania dodanie w d -ary max-sterty. Przeanalizuj jego czas działania w kategoriach d i n .

  5. Podaj wydajną implementację ZWIĘKSZENIA KLUCZA ( A , i , k ), który oznacza błąd, jeśli k <A [i] = k, a następnie odpowiednio aktualizuje strukturę sterty macierzy d -ary. Przeanalizuj jego czas działania w kategoriach d i n .

Moje rozwiązanie

  1. Podaj tablicę A[a1..an]

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

    Moja notacja wydaje się nieco wyrafinowana. Czy jest jakiś inny prostszy?

  2. Niech h oznacza wysokość stosu d -ary.

    Załóżmy, że stertą jest kompletne drzewo d -ary

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. To jest moja realizacja:

    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) )
    
    • Czas działania MAX-HEAPIFY:

      w którym C i oznacza koszt: i-tego wiersza powyżej.

      TM=d(c8d+(c9+..+c13)d+c14d)
      ci
    • Ekstraktu MAX:

      TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    Czy to skuteczne rozwiązanie? Czy coś jest nie tak z moim rozwiązaniem?


Wydaje mi się, że w pytaniu oraz w wyjaśnieniu występuje niewielki błąd: wysokość stosu d-ary wynosi h = (log [nd - n + 1]) - 1 // UWAGA jego „-n”, a nie „-1”, a nie h = (log [nd−1+1])− 1my. Zatem powyższe wyjaśnienie wysokości nie będzie prawdziwe. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Mimo to wysokość drzewa jest zapisywana jako Θ(log(n)).Uwaga: log jest zawsze w bazie d dla stosu d-ary .
Surabhi Raje,

Odpowiedzi:


10
  1. Twoje rozwiązanie jest poprawne i zgodne z definicją sterty d -ary. Ale jak zauważyłeś, twoja notacja jest nieco wyrafinowana.

    Tych dwóch poniższych funkcji można użyć do pobrania elementu nadrzędnego i-tego elementu i j-tego podrzędnego elementu i-tego elementu.

    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. Książka CLRS już udostępnia procedurę INSERT. Który wygląda tak:

    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. Podobnie jak WSTAW, ZWIĘKSZENIE KLUCZA jest również zdefiniowane w podręczniku jako:

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


dzięki! Co powiesz na wdrożenie INCREASE-KEY i INSERT? Próbuję to napisać, ale dało to dwukrotnie rekurencyjne wezwanie MAX-HEAPIFY. Czy jest lepsze rozwiązanie? Znalazłem niewiele informacji w Internecie i na wiki
lucasKo,

Czy to reszta ćwiczeń? Jeśli tak, zaktualizuj swoje pytanie, a chętnie odpowiem na temat.
Bartosz Przybylski

Zadałem to pytanie w edytowanym poście.
lucasKo

ponownie wdrożyć procedurę INSERT? Masz na myśli, że po wstawieniu nowego elementu nie musi wywoływać procedury, która dostosowuje kolejność w stercie? Nie rozumiem ...
lucasKo

Ten opis był trochę niefortunny, zobacz poprawki dla poprawek.
Bartosz Przybylski

1

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

-1

Odpowiedź na drugie pytanie to h = log d (n (d-1) + 1) - 1 Więc h = log d (nd - n + 1) - 1


4
Dlaczego to jest odpowiedź? Formuła bez wyjaśnienia tak naprawdę nikomu nie pomaga.
David Richerby,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.