日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

信息竞赛进阶指南--二叉堆(模板)

發(fā)布時(shí)間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 信息竞赛进阶指南--二叉堆(模板) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

啥是二叉堆
二叉堆是一種特殊的堆,二叉堆是完全二元樹(二叉樹)或者是近似完全二元樹(二叉樹)。二叉堆有兩種:最大堆和最小堆。最大堆:父結(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):

// 二叉堆 int heap[SIZE], n; void up(int p) {while (p > 1) {if (heap[p] > heap[p/2]) {swap(heap[p], heap[p/2]);p/=2;}else break;} } void down(int p) {int s = p*2;while (s <= n) {if (s < n && heap[s] < heap[s+1]) s++;if (heap[s] > heap[p]) {swap(heap[s], heap[p]);p = s, s = p*2;}else break;} } void Insert(int val) {heap[++n] = val;up(n); } int GetTop() {return heap[1]; } void Extract() {heap[1] = heap[n--];down(1); } void Remove(int k) {heap[k] = heap[n--];up(k), down(k); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的信息竞赛进阶指南--二叉堆(模板)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。