1、什麼是優先隊列
優先隊列顧名思義,就是優先權最大的排在隊列的頭部,而優先權的判斷是根據對象的compare方法比較獲取的,保證根節點的優先級一定比子節點的優先級大。所以放入到優先隊列的元素要麼實現了Comparable接口,要麼在創造這個優先隊列時,指定一個比較器。
2、java之PriorityQueue分析
1、存儲:java底層採用數據數組Object[] queue來存儲隊裏的數據 默認初始大小爲11,最大長度爲 Integer.MAX_VALUE - 8
優先隊列代表平衡二叉堆,數組中元素的關係:the two children of queue[n] are queue[2*n+1] and queue[2*(n+1)]
初始化優先隊列的方式有兩種:
a.不指定比較器:比較器默認爲null 此時隊列中的元素需要實現Comparable接口,重寫compareTo方法。
如果不指定比較器 而且元素類型也不實現Comparable方法 會拋出
java.lang.ClassCastException: com.hyj.priorityque.Dog cannot be cast to java.lang.Comparable
b.指定比較器
2、添加
SiftUp方法主要講述:
如果插入元素的位置k>0 則尋找k處元素的父親節點的位置 也就是(k-1)>>>1 比較父節點和插入元素的優先級,如果插入元素的優先級小於父節點的,將父節點插入k所在的位置,k=parent再從此處進行判斷 直到k不大於0 則將key值插入queue[k]中。
簡單說來 就是不斷通過比較跟父元素的優先級 確定插入元素的位置
3、刪除元素
通過indexOf查詢
如果刪除的不是最後一個元素:從刪除點開始以最後一個元素爲參照進行siftDown
4、隊列頭部的元素
peek() poll() 都可以獲取頭部的元素 區別就是poll() 會進行刪除操作。
siftDown(int k, E x)
方法,該方法的作用是從k
指定的位置開始,將x
逐層向下與當前點的左右孩子中較小的那個交換,直到x
小於或等於左右孩子中的任何一個爲止。
參考文章:
http://blog.csdn.net/dy5623405/article/details/51487390
SiftUp方法主要講述: