優先順序佇列 堆

2021-10-10 03:28:47 字數 1868 閱讀 5004

1.1 堆的概念

堆邏輯上是一棵完全二叉樹

堆物理上是儲存在陣列中位元科技

滿足任意結點的值都大於其子樹中結點的值,叫做大堆,或者大根堆,或者最大堆

反之,則是小堆,或者小根堆,或者最小堆

堆的基本作用是,快速找集合中的最值

1.2儲存方式

使用陣列儲存二叉樹結構,方式是將二叉樹用層序遍歷方式放入陣列中。

一般只適合表示完全二叉樹,因為非完全二叉樹會有空間的浪費。

這種方式的主要用法就是堆的表示。

1.3下標關係

已知雙親**(parent)**的下標,則:

左孩子(left)下標 = 2 * parent + 1;

右孩子(right)下標 = 2 * parent + 2;

**已知孩子(不區分左右)****(child)**下標,則:

雙親(parent)下標 = (child - 1) / 2;

2.1 向下調整

index 如果已經是葉子結點,則整個調整過程結束

判斷 index 位置有沒有孩子

因為堆是完全二叉樹,沒有左孩子就一定沒有右孩子,所以判斷是否有左孩子

因為堆的儲存結構是陣列,所以判斷是否有左孩子即判斷左孩子下標是否越界,即 left >= size 越界

確定 left 或 right,誰是 index 的最小孩子 min

如果右孩子不存在,則 min = left

否則,比較 array[left] 和 array[right] 值得大小,選擇小的為 min

比較 array[index] 的值 和 array[min] 的值,如果 array[index] <= array[min],則滿足堆的性質,調整結束

否則,交換 array[index] 和 array[min] 的值

然後因為 min 位置的堆的性質可能被破壞,所以把 min 視作 index,向下重複以上過程

時間複雜度分析:

最壞的情況即圖示的情況,從根一路比較到葉子,比較的次數為完全二叉樹的高度

即時間複雜度為 o(log(n))

**:

public void adjustdown(int arr, int index, int size)  else 

//將min和arr[index]比較

if (arr[index] > arr[min])

}index = min;

}}

2.2建堆

思路:從倒數的第乙個非葉子節點的子樹開始調整,一直 調整到根節點的樹,就可以調整成堆。

public

void

createheap

(int arr)

}

2.3 向上調整

相對簡單,不多做贅述

public

void

adjustup

(int arr,

int index,

int size)

int temp = arr[index]

; arr[index]

= arr[par]

; arr[par]

= temp;

index = par;

}}

堆(優先順序佇列)

c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...

堆 優先順序佇列

1一般二叉樹的順序儲存 層序遍歷方式 使用陣列儲存二叉樹結構,即將二叉樹 按照層序遍歷 的方式放入陣列.這種方式一般只適用於完全二叉樹,一般的二叉樹會造成空間浪費比較嚴重.2堆 heap 在邏輯上就是乙個 完全二叉樹,在物理上儲存在 陣列 中.1 滿足任意結點的值都大於其子樹的結點的值.叫做大堆,反...

優先順序佇列(堆)

2 堆 heap 3 優先順序佇列 使用陣列儲存二叉樹結構,方式即將二叉樹用層序遍歷方式放入陣列中。一般只適合表示完全二叉樹,因為非完全二叉樹會有空間的浪費。這種方式的主要用法就是堆的表示。已知雙親 parent 的下標,則 左孩子 left 下標 2 parent 1 右孩子 right 下標 2...