【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
注意:这里讨论的是基于堆实现的优先级队列!
基于java自带的PriorityQueue是一个能自动扩容的优先级队列,而lucene实现了一个能够维护固定尺寸的队列(只保留最大或最小的前N个数值)但是不能自动扩容。于是想象能着能不能将两者的优点结合,做一个既能自动扩容,又能维护固定尺寸的优先级队列。
实际上最后没能实现,原因如下:
假设我们的需求是从队列中获取最小的元素
1、既然是获取最小的元素,那么该堆一定是个最小堆(即堆顶部的元素值最小);
2、如果要保留最小的前N个数值,每次在插入新的元素时需要将队列中最大的元素给替换掉,这样我们就需要将堆变成一个最大堆(这样就与已经是最小堆的情况形成了矛盾)!
3、实际上lucene在实现的时候使用了一些小技巧:由于第1步我们采用了最小堆,到第2步的时候与第1步产生了矛盾,所以我们通过最小堆不能生成前N个最小的序列了。反过来我们可以实现保留最大的前N个数值,因为每次插入新元素时只需将队列中最小的元素给替换掉!
实际上lucene在实现堆的时候,数组下标是从1开始的(这是因为在计算父子节点的下标时可以少一些加法运算)。
来源:oschina
链接:https://my.oschina.net/u/1268334/blog/3143061