注意:這裏討論的是基於堆實現的優先級隊列!java
基於java自帶的PriorityQueue是一個能自動擴容的優先級隊列,而lucene實現了一個可以維護固定尺寸的隊列(只保留最大或最小的前N個數值)可是不能自動擴容。因而想象能着能不能將二者的優勢結合,作一個既能自動擴容,又能維護固定尺寸的優先級隊列。數組
實際上最後沒能實現,緣由以下:隊列
假設咱們的需求是從隊列中獲取最小的元素it
一、既然是獲取最小的元素,那麼該堆必定是個最小堆(即堆頂部的元素值最小);io
二、若是要保留最小的前N個數值,每次在插入新的元素時須要將隊列中最大的元素給替換掉,所以咱們須要將堆變成一個最大堆(這樣就與已是最小堆的狀況造成了矛盾)!技巧
三、現假設隊列能自動擴容,那麼在插入的時候隊列保留的是全部元素而不是前N個最小元素,所以又造成了矛盾。lucene
四、實際上lucene在實現的時候使用了一些小技巧:因爲第1步咱們採用了最小堆,到第2步的時候與第1步產生了矛盾,因此咱們經過最小堆不能生成前N個最小的序列了。反過來咱們能夠實現保留最大的前N個數值,由於每次插入新元素時只需將隊列中最小的元素給替換掉!生成
注:lucene在實現堆的時候,數組下標是從1開始的(這是由於在計算父子節點的下標時能夠少一些加法運算)。