能实现一个既能自动扩容又能只保留前N个最值的优先级队列吗

孤街醉人 提交于 2019-12-14 19:46:28

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

注意:这里讨论的是基于堆实现的优先级队列!

基于java自带的PriorityQueue是一个能自动扩容的优先级队列,而lucene实现了一个能够维护固定尺寸的队列(只保留最大或最小的前N个数值)但是不能自动扩容。于是想象能着能不能将两者的优点结合,做一个既能自动扩容,又能维护固定尺寸的优先级队列。

实际上最后没能实现,原因如下:

假设我们的需求是从队列中获取最小的元素

1、既然是获取最小的元素,那么该堆一定是个最小堆(即堆顶部的元素值最小);

2、如果要保留最小的前N个数值,每次在插入新的元素时需要将队列中最大的元素给替换掉,这样我们就需要将堆变成一个最大堆(这样就与已经是最小堆的情况形成了矛盾)!

3、实际上lucene在实现的时候使用了一些小技巧:由于第1步我们采用了最小堆,到第2步的时候与第1步产生了矛盾,所以我们通过最小堆不能生成前N个最小的序列了。反过来我们可以实现保留最大的前N个数值,因为每次插入新元素时只需将队列中最小的元素给替换掉!

实际上lucene在实现堆的时候,数组下标是从1开始的(这是因为在计算父子节点的下标时可以少一些加法运算)。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!