Java優先順序佇列(Priority Queue)?
阿新 • • 發佈:2019-01-24
注意:這裡的優先順序佇列不是資料結構中的概念,而是java中的集合類。
注意:建議先把我部落格裡的堆,比較器這兩篇文章看一哈
優先順序佇列的定義
- 優先順序佇列是邏輯結構是小根堆,儲存結構是動態陣列(到達上限,容量自動加一)的集合類。
優先順序佇列的特點
- 優先順序佇列裡的元素必須有優先順序!!!優先順序是前後排序的“規則”,也就是說插入佇列的類必須實現內部比較器或擁有外部比較器(在建構函式中當引數)!!!!
- 優先順序佇列的擁有小根堆的所有特性。
- 優先順序佇列不是執行緒安全的。
- 優先順序佇列不允許使用null元素。
- 優先順序佇列本身並一個有序(從a[0]-a[n]全部升序)序列,只有當你把元素一個個取出的時候,這些取出的元素所排成的序列才是有序序列。原因很簡單,
- 優先順序佇列(堆)中的插入就只能插到最後,也就是說新增和插入一個意思;刪除也只能刪第一個。
- 注:每個元素的優先順序根據問題的要求而定。當從優先順序佇列中取出一個元素後,可能出現多個元素具有相同的優先權。在這種情況下,把這些具有相同優先權的元素視為一個先來先服務的佇列,按他們的入隊順序進行先後處理。
常用方法:
新增(插入):
publicbooleanadd(E e)
檢視(只返回根節點元素,不刪除):
public E peek()
取出(返回根節點元素,會刪除源資料):
public E poll()
刪除(如果有多個相同元素,只會刪除第一個):
publicbooleanremove(Object o)
還有就是一些collection類通有的方法,不多說了
記住!!!所有會破壞堆的特性的方法(比如插入刪除等)的原始碼裡最後都會加一個建堆方法(siftUp(i, e),也可以說交換方法,調整方法),使佇列保持堆的特性
感謝幾位大佬,想了解更多原始碼,例子,例項圖的可以去看看:
https://www.cnblogs.com/demingblog/p/6485193.html
https://www.cnblogs.com/CarpenterLee/p/5488070.html
https://blog.csdn.net/u013309870/article/details/71189189
https://blog.csdn.net/cainv89/article/details/51588920