堆
邏輯定義
n個元素序列{k 1 ,k 2 ...k i ...k n },當(dāng)且僅當(dāng)滿足下列關(guān)系時稱之為堆: (k i <= k 2i ,k i = k 2i ,k i >= k 2i+1 ), (i = 1,2,3,4...n/2)
性質(zhì)
堆的實現(xiàn)通過構(gòu)造 二叉堆 (binary heap),實為二叉樹的一種;由于其應(yīng)用的普遍性,當(dāng)不加限定時,均指該數(shù)據(jù)結(jié)構(gòu)的這種實現(xiàn)。這種數(shù)據(jù)結(jié)構(gòu)具有以下性質(zhì)。
任意節(jié)點小于(或大于)它的所有后裔,最小元(或最大元)在堆的根上( 堆序性 )。
堆總是一棵完全樹。即除了最底層,其他層的節(jié)點都被元素填滿,且最底層盡可能地從左到右填入。
將根節(jié)點最大的堆叫做 最大堆 或 大根堆 ,根節(jié)點最小的堆叫做 最小堆 或 小根堆 。常見的堆有二叉堆、斐波那契堆等。
支持的基本操作
某些堆實現(xiàn)還支持其他的一些操作,如斐波那契堆支持檢查一個堆中是否存在某個元素。
例程
為將元素X插入堆中,找到空閑位置,創(chuàng)建一個空穴,若滿足 堆序性 (英文: heap order ),則插入完成;否則將父節(jié)點元素裝入空穴,刪除該父節(jié)點元素,完成空穴上移。直至滿足堆序性。這種策略叫做 上濾 (percolate up)。
voidInsert(ElementTypeX,PriorityQueueH){inti;if(IsFull(H)){printf("Queue is full.\n");return;}for(i=++H->Size;H->Element[i/2]>X;i/=2)H->Elements[i]=H->Elements[i/2];H->Elements[i]=X;}
以上是插入到一個二叉堆的過程。
DeleteMin ,刪除最小元,即二叉樹的根或父節(jié)點。刪除該節(jié)點元素后,隊列最后一個元素必須移動到堆得某個位置,使得堆仍然滿足堆序性質(zhì)。這種向下替換元素的過程叫作 下濾 。
ElementTypeDeleteMin(PriorityQueueH){inti,Child;ElementTypeMinElement,LastElement;if(IsEmpty(H)){printf("Queue is empty.\n");returnH->Elements[0];}MinElement=H->Elements[1];LastElement=H->Elements[H->Size--];for(i=1;i*2Size;i=Child){/* Find smaller child. */Child=i*2;if(Child!=H->Size&&H->Elements[Child+1]Elements[Child])Child++;/* Percolate one level. */if(LastElement>H->Elements[Child])H->Elements[i]=H->Elements[Child];elsebreak;}H->Elements[i]=LastElement;returnMinElement;}
應(yīng)用
堆排序
堆(通常是二叉堆)常用于排序。這種算法稱作堆排序。
事件模擬
主要運用堆的排序以選擇優(yōu)先。
參見
二叉堆
二項式堆
最大-最小堆
斐波納契堆
數(shù)據(jù)結(jié)構(gòu)
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價值
- 一般般
- 沒價值
{{item.userName}} 舉報
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.userName}} 舉報
{{_reply.time}}