Mi sono confuso mentre risolvo il seguente problema (domande 1–3).
Domanda
Un heap d -ary è come un heap binario, ma (con una possibile eccezione) i nodi non foglia hanno d figli invece di 2 figli.
Come rappresenteresti un heap d -ary in un array?
Qual è l'altezza di un heap d -ary di n elementi in termini di n e d ?
Fornire un'implementazione efficiente di EXTRACT-MAX in un d -ary max-heap. Analizzare il suo tempo di esecuzione in termini di d e n .
Fornire un'implementazione efficiente di INSERT in un max-heap d -ary. Analizzare il suo tempo di esecuzione in termini di d e n .
Fornire un'implementazione efficiente di INCREASE-KEY ( A , i , k ), che contrassegna un errore se k <A [i] = k e quindi aggiorna la struttura heap della matrice d -ary in modo appropriato. Analizzare il suo tempo di esecuzione in termini di d e n .
La mia soluzione
Assegna un array
→ La mia notazione sembra un po 'sofisticata. Ce n'è un altro più semplice?
Let h indica l'altezza dell'heap d -ary.
Supponiamo che l'heap sia un albero d -ary completo
Questa è la mia implementazione:
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) )
Il tempo di esecuzione di MAX-HEAPIFY:
dove denota il costo dei -esimo linea sopra.EXTRACT-MAX:
→ È una soluzione efficiente? O c'è qualcosa di sbagliato nella mia soluzione?
h = (log [nd−1+1])− 1
Pertanto la spiegazione sopra l'altezza non sarà valida. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Sebbene comunque, l'altezza dell'albero è scritta comeΘ(log(n)).
Nota: il log è sempre alla base d per un heap d-ary .