資料結構筆記(5)優先佇列(堆)

2021-08-14 02:02:20 字數 1128 閱讀 7237

優先佇列允許至少下列兩種操作的資料結構: 實現

二叉堆結構性

堆是一顆被完全填滿的二叉樹,有可能的例外是在底層,底層上的元素從左到右的填入,這樣的樹被稱為完全二叉樹

一顆高為h的完全二叉樹有2^h到2^(h+1)-1個節點。

根據完全二叉樹的特性,我們可以用陣列來表示完全二叉樹:

堆序性

在乙個堆中,對於每乙個節點x,x的父親中的關鍵字小於(或等於)x中的關鍵字,根節點除外。(最小堆情況)

基本的堆操作

insert

插入新節點時,在下乙個空閒位置建立乙個空穴,否則該堆將不滿足其結構性——完全二叉樹的性質。

如果被插入的節點可以放在該空穴而且不破壞該堆的堆序性,則插入完成。如果被插入的節點破壞了堆序性質,我們採取上濾(percolate up)的策略來使其找到正確的位置。

上濾過程圖示:

(圖)**實現

void insert(int x,priorityqueue h)

for(i=++h->size;h->elements[i/2]>x;i/=2)//當前元素個數加一,細

h->elements[i]=h->elements[i/2];//上濾過程,將空穴上冒

h->elements[i]=x;//將元素插入到正確位置

}

deletemin

找到最小元(根節點),刪除,此時堆中產生乙個空穴。

將空穴的兩個兒子中的較小者移入空穴,以保持堆序性。

重複步驟2,直到堆中最後乙個元素x被放入空穴。

與上濾對應,這個過程稱為下濾(percolate down)。

下濾圖示:

(圖)**實現:

int deletemin(priorityqueue h)

minelement=h->elements[1];

lastelement=h->elements[h->size--];

for(i=1;i*2

<=h->size;i=child)

h->elements[i]=lastelement;//將空節點與最後乙個節點交換

return minelement;//返回堆中最小值

}

資料結構 堆(優先佇列)

一種樹形資料結構,分大根堆,小根堆。大根堆 max heap 滿足所有父節點不小於其任意子節點。小根堆 min heap 滿足所有父節點不大於其任意子節點。在這裡,我們只考慮二叉堆。二叉堆是一棵完全二叉樹。solution 可見,每堆果子分別被合併了n 1次,n 2次,n 3次 1次 則數量越小的堆...

資料結構 優先佇列(堆)

什麼是堆 堆是一棵具有特定性質的二叉樹 堆的基本要求是堆中所有節點的值必須大於等於 或者小於等於 其孩子節點的值 堆應該是一棵完全二叉樹 堆的表示 由於堆在形式上是一棵完全二叉樹,所以用陣列不會浪費儲存空間 public class heap private int ary private int ...

資料結構 優先佇列(堆)

堆 堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質 結構性質 堆總是一棵完全樹。堆序性 堆中某個節點的值總是不大於或不小於其父節點的值 將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。堆的意義就在於 最快的找到最大 最小值,在堆結構中插入乙個值重新構造堆結構,取走最...