Per costruire un albero di heap MAX, possiamo sia siftDown
o siftUp
, passando al setpoint iniziamo dalla radice e confrontiamolo con i suoi due figli, quindi lo sostituiamo con l'elemento più grande dei due bambini, se entrambi i bambini sono più piccoli poi ci fermiamo, altrimenti continuiamo a setacciare quell'elemento finché non raggiungiamo un nodo foglia (o, naturalmente, ancora una volta, finché quell'elemento è più grande di entrambi i suoi figli).Perché siftDown è meglio di siftUp in heapify?
Ora avremo solo bisogno di fare quello n/2
volte, perché il numero di foglie è n/2
, e le foglie soddisfano la proprietà heap quando finiamo di ammucchiare l'ultimo elemento sul livello prima dell'ultimo (prima delle foglie) - quindi rimarremo con gli elementi n/2
per l'heap.
Ora se usiamo siftUp
, inizieremo con le foglie e alla fine avremo bisogno di ingrandire tutti gli elementi n
.
La mia domanda è: non quando usiamo siftDown
, stiamo facendo fondamentalmente due confronti (confrontando l'elemento ai suoi due figli), invece di un solo confronto quando si utilizza siftUp
, dal momento che si confronta solo elemento alla sua uno dei genitori ? Se sì, non significherebbe che raddoppiamo la complessità e finiamo per finire con la stessa esatto complessità del setacciare?
Penso che si applichino le risposte a questa domanda. Forse un duplicato. https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity –