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 元素...