優先順序佇列(堆)

2021-10-23 05:08:13 字數 1489 閱讀 8449

1.二叉樹的順序儲存

1.1儲存方式

使用陣列儲存二叉樹結構,方式即將二叉樹用層序遍歷的方式放入陣列中,一般只適合表示完全二叉樹,因為非完全二叉樹會有空間的浪費

1.2下標關係

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

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

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

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

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

2.堆(heap)

2.1概念

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

2)堆物理上是儲存在陣列中

3)滿足任意節點的值都大於其子樹中結點的值,叫做大堆

4)反之,則是小堆

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

2.2操作-向下調整

前提:左右子樹必須是乙個堆,才能調整

//通過size來指定array中哪些元素是有效的堆元素

//index表示從哪個位置的下標開始調整

//左右子樹都是堆,才能進行向下調整

public

static

void

shiftdown

(int

array,

int size,

int index)

//經過上面的比較,已經不知道child是左子樹還是右子樹了,知道的是child下標一定對應左右子樹最小值的下標

if(array[child]

< array[parent]

)else

parent = child;

child = parent *2+

1;}}

時間複雜度分析:

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

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

2.3建堆

public

static

void

creatheap

(int

array)

}

3.堆的應用 --優先順序佇列

3.1概念:

在很多應用中,我們通常需要按照優先順序情況對待處理物件進行處理,比如首先處理優先順序最高的物件,然後處理次高階的物件,在這種情況下,我們的資料結構應該提供兩個最基本的操作,乙個是返回最高優先順序物件,乙個是新增新的物件,這種資料結構就是優先順序佇列

3.2內部原理

優先順序佇列的實現方式有很多,但最常見的是使用堆來構建

3.3入佇列

過程(以大堆為例)

a)首先按尾插方式放入陣列

b)比較其和雙親值的大小,如果雙親的值大,則滿足堆的性質,插入結束

c)否則,交換其和雙親位置的值,重新進行上述步驟

d)直到根結點

堆(優先順序佇列)

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

堆 優先順序佇列

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

優先順序佇列 堆

1.1 堆的概念 堆邏輯上是一棵完全二叉樹 堆物理上是儲存在陣列中位元科技 滿足任意結點的值都大於其子樹中結點的值,叫做大堆,或者大根堆,或者最大堆 反之,則是小堆,或者小根堆,或者最小堆 堆的基本作用是,快速找集合中的最值 1.2儲存方式 使用陣列儲存二叉樹結構,方式是將二叉樹用層序遍歷方式放入陣...