PriorityQueue源碼分析

優先隊列

  1. 內部實現是是堆,結構是數組,使用堆排序
  2. 初始化容量11,如果插入數的時候,大於當前隊列數組容量,則擴容
  3. 擴容方案:如果當前數組小於64,則擴容一倍,如果大於,則擴容50%, 這用Arrays.copyOf將原有數組放到另一塊新的空間

內部實現堆排序主要靠三個函數(private):
堆排序,父節點:i,兩個兒子節點:2i+1、2i+2
最大堆爲例(可以comparator來自定義優先級):

  1. siftup(k,E):k插入位置,E插入的元素,將E從當前位置k不斷上浮(與父節點比較,如果大於父節點,父子交換,繼續上浮),找到E元素應該的位置
  2. siftDown(k,E):k插入位置,E插入的元素,將E從當前位置k不斷下浮(與當前節點左右子節點比較,如果小於左or右子節點,父子交換,繼續下沉),找到E元素應該的位置
  3. heapify(): 初始化堆,從非葉子結點進行下沉siftDown調整,最終結果最大元素在堆頂。相當於堆排序的第一步。
    可見:PriorityQueue隊列並非所有元素有序,只是保證第一個元素優先級最高。

核心函數(public):

  1. offer(E e),隊列中插入e元素:1. 是否需要擴容;2. 將e元素插入隊尾,上浮siftup(size, E)
  2. remove(E e), 隊列中刪除e元素:
    1)找到e元素在隊列中的index(直接遍歷數組找就行),
    2) 如果index==size-1,index位置直接爲null即可;
    3) 將末尾的元素放到index位置,下浮siftDown(index, E),如果沒有下浮,則上浮,如果上浮成功,則返回最末尾元素(因爲如果是遍歷,因爲最末尾元素上浮,無法訪問到該元素,要把該元素返回供訪問)其他情況返回null(因爲下浮或者在index位置,都可以訪問到該元素,所以直接返回null即可)

參考:
https://www.jianshu.com/p/df781ec91740

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章