高階資料結構-可並堆

mcr130102發表於2024-07-14

可並堆,就是可以合併的堆。堆滿足一個性質,就是當前節點,都大於或者等於他的所有子樹上的節點,自然在這裡我所講的是結點的權值。顯而易見,既然可並堆是堆的一種,容易推出,可並堆也滿足這個性質。

現在思考一個問題,當題目裡需要合併兩個堆的時候,該如何合併呢?如果只是普通的堆的話,我們可以運用啟發式合併的思想,每一次把size小的堆的點暴力插入到size大的堆裡面,這個方法十分不優秀,時間複雜度是O(nlog2n)。所以我們會用可並堆來實現這個問題。

可並堆是一種運用到左偏樹思想的堆,何為左偏樹?左偏樹顧名思義就是偏向左面的樹,如左圖就是一棵左偏樹,這棵樹明顯滿足一個性質。我們定義dis[p]為從p節點出發可以向右走的最大步數,從右圖中可以看到,當前點的左兒子的dis值都比右兒子的dis值大,只要滿足這個性質就是左偏樹。

學過左偏樹之後,我們就可以學習可並堆了,可並堆的難點就是合併,那麼應該如何合併呢?為了能保證時間複雜度,我們每一次合併都應該把新的節點放在當前的節點的右兒子上,這個是一個遞迴的過程,每一次把當前的兩個節點進行比較,留下權值大的點,然後遞迴下去把另一個點和留下的點的右兒子進行比較,如此下去,進行合併。當然每一次回溯之前,我們都需要判斷當前節點的左右兩個兒子的dis值,如果右兒子的dis值大於左兒子的dis值,則交換左右兒子。

相關文章