要構建MAX堆樹,我們可以使用siftDown
或siftUp
,通過篩選我們從根開始並將其與兩個孩子進行比較,然後用兩個孩子中較大的元素替換它,如果兩個孩子都較小那麼我們停下來,否則我們繼續篩選那個元素直到我們到達一個葉節點(或者當然,直到那個元素大於它的兩個孩子)。爲什麼siftDown比heapify中的siftUp更好?
現在我們只需要做n/2
次,因爲樹葉的數量是n/2
,當我們在最後一層之前(樹葉之前)完成層上最後一個元素的堆疊時,樹葉將滿足堆屬性。所以我們將留下n/2
元素來堆積。
現在,如果我們使用siftUp
,我們將從葉子開始,最終我們將需要堆積所有n
元素。
我的問題是:當我們使用siftDown
,不是我們基本上做兩個比較(元素比較它的兩個孩子),而不是隻有一個比較使用siftUp
的時候,因爲我們只該元素比較其父母一方?如果是的話,那不就意味着我們將複雜性加倍,真正結束與篩選一樣的複雜性嗎?
我認爲這個問題的答案適用。也許是重複的。 https://stackoverflow.com/questions/9755721/how-can-building-a-heap-be-on-time-complexity –