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

    → 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+1−1d−1=nh=logd[nd−1+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(c8∗d+(c9+..+c13)∗d+c14∗d)
      ci
    • Ekstraktu MAX:

      TE=(c1+..+c7)+TM≤C∗d∗h=C∗d∗(logd[n(d−1)+1]−1)=O(dlogd[n(d−1)])

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