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.
Jak byś stanowią d -ary sterty w tablicy?
Jaka jest wysokość d -ary sterty n elementów pod względem n a d ?
Daj wydajną implementację EXTRACT-MAX w d -ary max-heap. Przeanalizuj jego czas działania w kategoriach d i n .
Daj skutecznego wdrażania dodanie w d -ary max-sterty. Przeanalizuj jego czas działania w kategoriach d i n .
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
Podaj tablicę
→ Moja notacja wydaje się nieco wyrafinowana. Czy jest jakiś inny prostszy?
Niech h oznacza wysokość stosu d -ary.
Załóżmy, że stertą jest kompletne drzewo d -ary
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.
Ekstraktu MAX:
→ Czy to skuteczne rozwiązanie? Czy coś jest nie tak z moim rozwiązaniem?
h = (log [nd−1+1])− 1
my. 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 .