PriorityQueue的深入理解

2021-10-19 23:39:46 字數 2160 閱讀 7085

1、並非按fifo進出

傳統的queue 是按先進先出的順序執行。而priorityqueue是按優先順序來絕對的。優先順序低的先出queue

2、如何排序

priorityqueue既然有優先順序排序 那麼如何排序的。

a. 放入佇列的元素實現了comparable介面 按其自然順序排序 從小到大。

b. 初始化佇列時指明comparator外部比較器。

priorityqueue queue1 = new priorityqueue<

>()

;priorityqueue queue2 = new priorityqueue<

>(10

);priorityqueue queue3 = new priorityqueue<

>

((a,b)

->a.

compareto

(b))

;priorityqueue queue3 = new priorityqueue<

>(10

,(a,b)

->a.

compareto

(b))

;

3.方法add()和offer()

add(e e)和offer(e e)的語義相同,都是向優先佇列中插入元素,只是queue介面規定二者對插入失敗時的處理不同,前者在插入失敗時丟擲異常,後則則會返回false。對於priorityqueue這兩個方法其實沒什麼差別。

element()和peek()

element()和peek()的語義完全相同,都是獲取但不刪除隊首元素,也就是佇列中權值最小的那個元素,二者唯一的區別是當方法失敗時前者丟擲異常,後者返回null。根據小頂堆的性質,堆頂那個元素就是全域性最小的那個;由於堆用陣列表示,根據下標關係,0下標處的那個元素既是堆頂元素。所以直接返回陣列0下標處的那個元素即可。

remove()和poll()

remove()和poll()方法的語義也完全相同,都是獲取並刪除隊首元素,區別是當方法失敗時前者丟擲異常,後者返回null。由於刪除操作會改變佇列的結構,為維護小頂堆的性質,需要進行必要的調整。

remove(object o)

remove(object o)方法用於刪除佇列中跟o相等的某乙個元素(如果有多個相等,只刪除乙個),該方法不是queue介面內的方法,而是collection介面的方法。由於刪除操作會改變佇列結構,所以要進行調整;又由於刪除元素的位置可能是任意的,所以調整過程比其它函式稍加繁瑣。具體來說,remove(object o)可以分為2種情況:1. 刪除的是最後乙個元素。直接刪除即可,不需要調整。2. 刪除的不是最後乙個元素,從刪除點開始以最後乙個元素為參照呼叫一次siftdown()即可。

具體可以參考[priorityqueue的深入理解](

4.內部結構

內部使用陣列存放元素:

transient object[

] queue;

陣列預設容量11 (初始化時可以指定)  

動態擴容機制

容量<64 擴容為2*n+2,否則跟arraylist一樣擴大為1.5n

(64是乙個權衡的不大不小的值)

private void

grow

(int mincapacity)

小根堆實現

小根堆:是一種完全二叉樹 且滿足父節點不大於任意乙個左右子節點。(注意左右節點是沒有順序的)

所以小根堆的頂點必然是最小的 (如何要實現從大到小排序,指定的comparator中取相反順序即可)

而完全二叉樹(所有節點滿足從左到右排列 不會垮節點)是可以用陣列表示的。

priorityqueue就是使用陣列來實現的小根堆: 滿足每次取的資料都是最小的,但不滿足整體都是有序的。

5.非執行緒安全

priorityqueue的執行緒安全版本:priorityblockingqueue,使用reentrantlock加鎖保護

C STL的priority queue用法總結

翻了很多部落格的總結 1 標頭檔案 include 2 定義 cpp view plain copy priority queue int p 3 優先輸出大資料 priority queue type為資料型別,container為儲存資料的容器,functional為元素比較方式。如果不寫後兩個...

priority queue的常見用法

其底層是用堆來進行實現的 在優先佇列中,隊首元素一定是當前佇列中優先順序最高的那乙個 當然,可以在任何時候往優先佇列裡面加入push元素 而優先佇列底層的資料結構堆 heap 會隨時調整結構 使得每次的隊首元素都是優先順序最大的 1 定義 priority queuename 2 容器內元素的訪問 ...

PriorityQueue實現原理

priorityqueue priorityqueue是個基於優先順序堆的極大優先順序佇列 此佇列按照在構造時所指定的順序對元素排序,既可以根據元素的自然順序來指定排序 參閱 comparable 也可以根據 comparator 來指定 這取決於使用哪種構造方法。優先順序佇列不允許 null 元素...