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