Go标准库heap源码中的一个细节问题

wallace_lai · · 2257 次点击
能不能举个具体的例子?
#2
更多评论
以一個最小堆為例,即使交換的元素已經大於它的子節點,但我們仍然需要確保該元素小於或等於它的父節點,這是因為交換的元素可能大於原來位置的元素,因此需要通過呼叫 up() 來進行向上的調整。這就確保了堆的性質仍然保持,即每個節點都小於或等於它的子節點,並且大於或等於它的父節點。
#1
假設有以下的最小堆 1 / \ 3 2 / \ / \ 5 6 7 8 \ 9 移除元素 3,它將與最後一個元素 9 進行交換: 1 / \ 9 2 / \ / \ 5 6 7 8 元素 9 的位置違反了最小堆的性質,因為它大於它的兩個子節點 5 和 6。嘗試進行下行調整,可以將 9 與它的兩個子節點中的最小者(也就是 5)進行交換: 1 / \ 5 2 / \ / \ 9 6 7 8 下行調整可以成功地將 9 移到它應該在的位置。現在假設要移除元素 2,將它與最後一個元素 9 進行交換: 1 / \ 5 9 / \ / \ 6 7 3 8 這次,元素 9 在它的位置違反了最小堆的性質,因為它大於它的子節點 3。所以進行下行調整,可以將 9 與它的子節點 3 進行交換: 1 / \ 5 3 / \ / \ 6 7 9 8 此時,堆已經符合最小堆的性質。在這個例子中,儘管初始的下行調整不能將 9 移到它應該在的位置 大蓋4J個樣子
#3