信息竞赛进阶指南--二叉堆(模板)
啥是二叉堆
二叉堆是一種特殊的堆,二叉堆是完全二元樹(二叉樹)或者是近似完全二元樹(二叉樹)。二叉堆有兩種:最大堆和最小堆。最大堆:父結(jié)點的鍵值總是大于或等于任何一個子節(jié)點的鍵值;最小堆:父結(jié)點的鍵值總是小于或等于任何一個子節(jié)點的鍵值。
插入節(jié)點
在數(shù)組的最末尾插入新節(jié)點。然后自下而上調(diào)整子節(jié)點與父節(jié)點(稱作up-heap或bubble-up, percolate-up, sift-up, trickle up, heapify-up, cascade-up操作):比較當前節(jié)點與父節(jié)點,不滿足堆性質(zhì)則交換。從而使得當前子樹滿足二叉堆的性質(zhì)。時間復雜度為 。
刪除根節(jié)點
刪除根節(jié)點用于堆排序。
對于最大堆,刪除根節(jié)點就是刪除最大值;對于最小堆,是刪除最小值。然后,把堆存儲的最后那個節(jié)點移到填在根節(jié)點處。再從上而下調(diào)整父節(jié)點與它的子節(jié)點:對于最大堆,父節(jié)點如果小于具有最大值的子節(jié)點,則交換二者。這一操作稱作down-heap或bubble-down, percolate-down, sift-down, trickle down, heapify-down, cascade-down,extract-min/max等。直至當前節(jié)點與它的子節(jié)點滿足堆性質(zhì)為止。
構造二叉堆
一個直觀辦法是從單節(jié)點的二叉堆開始,每次插入一個節(jié)點。其時間復雜度為。
最優(yōu)算法是從一個節(jié)點元素任意放置的二叉樹開始,自底向上對每一個子樹執(zhí)行刪除根節(jié)點時的Max-Heapify算法(這是對最大堆而言)使得當前子樹成為一個二叉堆。具體而言,假設高度為h的子樹均已完成二叉堆化,那么對于高度為h+1的子樹,把其根節(jié)點沿著最大子節(jié)點的分枝做調(diào)整,最多需要h步完成二叉堆化。可以證明,這個算法的時間復雜度為O(n)。
合并兩個二叉堆
最優(yōu)方法是把兩個二叉堆首尾相連放在一個數(shù)組中,然后構造新的二叉堆。時間復雜度為,其中n、k為兩個堆的元素數(shù)目。
如果經(jīng)常需要合并兩個堆的操作,那么使用二項式堆更好,其時間復雜度為。
實現(xiàn):
總結(jié)
以上是生活随笔為你收集整理的信息竞赛进阶指南--二叉堆(模板)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米9有液冷散热吗(小米官方售后服务)
- 下一篇: 信息竞赛进阶指南--搜索相关(模板)