Java集合Queue-PriorityQueue

優先隊列有兩種:最大優先隊列,當前最大的元素優先出隊;最小優先隊列,當前最小的元素優先出隊。api

PriorityQueue 經過用數組表示的小頂堆來實現,具體結構以下圖所示數組

首先任何結點都小於其左右子結點,除此以外,對於任何一個結點,假設它的下標爲n:函數

  • 左子結點:2 * n + 1
  • 右子結點:2 * n + 2
  • 父結點:(n + 1) / 2

1 構造

  1. 成員變量spa

  2. 構造函數code

    看起來有7種實際上只有4種隊列

    除了第一種,其它的是對PriorityQueueSortedSet 和其它Collection 進行初始化,其中SortedSet 自己就已是排好序,因此不須要通過什麼特殊處理,而其它的則須要調用heapify()進行處理。rem

    進入heapify() 源碼能夠看到用到了siftDown() 函數,後面會講到源碼

2 增長

addoffer 的語義是相同的,add也是調用了offer ,主要的是擴容函數grow 和篩選函數siftUp 。擴容函數後面講,先來分析篩選函數(siftUp/siftDown)it

假設待插入的元素是4,這個gif圖有個缺陷就是,比較完後,並非4和待比較的結點交換,而是單純把父節點移下來。io

3 刪除

siftDownsiftUp 差很少,都是包含有比較器和沒有比較器兩種方法,這裏就拿一個分析便可。

4 查詢

因爲查詢並無涉及結構的變化和調整,因此源碼是很是簡單的。

5 擴容

擴容發生在添加元素的時候,當size >= queue.length 的時候就會發生擴容。

相關文章
相關標籤/搜索