優先順序佇列(堆)

2021-10-25 09:44:17 字數 1357 閱讀 4312

優先順序佇列(堆)

優先順序佇列

兩個最基本的操作,乙個是返回最高優先順序物件,乙個是新增新的物件。

priorityqueue和priorityblockingqueue

注:priorityqueue中放置的元素必須要能夠比較大小,不能插入無法比較大小的物件,否則會丟擲 classcastexception異常

不能插入null物件,否則會丟擲nullpointerexception

沒有容量限制,可以插入任意多個元素,其內部可以自動擴容

插入和刪除元素的時間複雜度為

priorityqueue底層使用了堆資料結構

priorityqueue常用介面介紹

優先順序佇列的構造

注意:預設情況下,priorityqueue佇列底層預設容量是11。

插入/刪除/獲取優先順序最高的元素方法

優先順序佇列的模擬實現

priorityqueue底層使用了堆的資料結構

堆的概念

如果有乙個關鍵碼的集合k = ,把它的所有元素按完全二叉樹的順序儲存方式儲存 在乙個一維陣列中,並滿足:ki <= k2i+1 且 ki<= k2i+2 (ki >= k2i+1 且 ki >= k2i+2) i = 0,1,2…,(i其實就是陣列下標)則稱為小堆(或大堆)。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆

堆的性質:

堆中某個節點的值總是不大於或不小於其父節點的值;

堆總是一棵完全二叉樹。

堆的儲存方式

堆是一棵完全二叉樹,因此可以層序的規則採用順序的方式來高效儲存,

注意:對於非完全二叉樹,則不適合使用順序方式進行儲存,因為為了能夠還原二叉樹,空間中必須要儲存空節點,就會導致空間利用率比較低。

堆的建立:底層是陣列

堆向下調整

時間複雜度:

堆的插入與刪除

堆的插入

堆的插入 堆的插入總共需要兩個步驟:

先將元素放入到底層空間中(注意:空間不夠時需要擴容)

將最後新插入的節點向上調整,直到滿足堆的性質

堆的刪除

注意:堆的刪除一定刪除的是堆頂元素。

將堆頂元素對堆中最後乙個元素交換

將堆中有效資料個數減少乙個

對堆頂元素進行向下調整

top-k問題

應用:public int smallestk(int arr, int k)

// 將優先順序佇列的前k個元素放到陣列中

int ret = new int[k]; for(int i = 0; i < k; ++i) return ret;

}實現方法:

找前 k 個最大的,要建 k 個大小的小堆

從小到大排序

大根堆

堆(優先順序佇列)

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

堆 優先順序佇列

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

優先順序佇列 堆

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