麻蛋,原来是最小堆呀!  数据结构不熟害死人呀! 看来待复习复习数据结构了

  在lucene源码中对多个段合并的时候,会先将多个段放到一个PriorityQueue中,不要被这个名字迷惑,这个PriorityQueue和JDK的PriorityQueue是完全两个类,而且底层实现也完全不一样,lucene的队列并不是数据结构里学的先进先出的结构,lucene的这个PriorityQueue(org.apache.lucene.util.PriorityQueue)只满足部分有序,为什么要这样设计? 可能是为了性能。那哪部分有序? 这个需要了解基础的操作put和pop的实现,PriorityQueue底层也是一个Object数组,对该队列的操作主要是两个:

PUT:

  put操作就是往队列里新增一个元素,当put时候是把新增的元素放到Object数字的最后一个位置上,在PriorityQueue中有个size变量用于存储当前Object数字存储的真实元素有多少个,每次put时候就是把size++然后存到size的位置上,存完以后内部会再执行一个upHeap的操作,这个操作就是将新增的这个元素调整到合适的位置,为什么叫upHeap,是因为新增的元素在数组的最后一个位置上,调整的方向是从后往前,找到这个新增的元素大小合适的地方,排序的规则是由lessThan方法决定,这个由使用PriorityQueue的地方实现该方法。具体的找的逻辑类似二分查找,每次都查找折半位置处的元素是否大于新添加的元素,比如一个size=32的数组,折半查找过程是 32 / 2 = 16、16 / 2 = 8 、8 / 2 = 4、4 / 2 = 2 、 2 / 2 = 1,从前往后依次查找位置 16、8、4、2、1处的元素是否大于新添加的元素(Object[size]),如果不大于,则停止后续的查找,这就解释了上面说的局部有序的问题,这个局部不确定,根据添加的元素有关系,但是基本保证了小的值在前,大的在后。

POP:

  pop操作就是把队列头的数据取出,取出后会将最后一个元素放到第一位,然后再执行downHeap的操作,这个操作和upHeap差不多,只是方向是从前往后,不断折半找到一个第一个位数大的元素,找到就调换位置,没有找到就结束

Lucene PriorityQueue & JDK PriorityQueue的更多相关文章

  1. JDK源码分析实战系列-PriorityQueue

    完全二叉树 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下.从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树 ...

  2. Java中的集合(四)PriorityQueue常用方法

    Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...

  3. 计算机程序的思维逻辑 (46) - 剖析PriorityQueue

    上节介绍了堆的基本概念和算法,本节我们来探讨堆在Java中的具体实现类 - PriorityQueue. 我们先从基本概念谈起,然后介绍其用法,接着分析实现代码,最后总结分析其特点. 基本概念 顾名思 ...

  4. 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用

    45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...

  5. Java中的队列Queue,优先级队列PriorityQueue

    队列Queue 在java5中新增加了java.util.Queue接口,用以支持队列的常见操作.该接口扩展了java.util.Collection接口. Queue使用时要尽量避免Collecti ...

  6. PriorityQueue

    基本概念 顾名思义,PriorityQueue是优先级队列,它首先实现了队列接口(Queue),与LinkedList类似,它的队列长度也没有限制,与一般队列的区别是,它有优先级的概念,每个元素都有优 ...

  7. java中PriorityQueue优先级队列使用方法

    优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...

  8. 数据结构【三】:简单优先队列PriorityQueue

    在数据结构[二]:简单阻塞队列BlockingQueue的基础上添加权限属性:priority,并控制enqueue时根据priority排序插入. 1.定义priority取值范围0~9 2.deq ...

  9. 优先队列(priorityqueue)

    队列是先进先出的线性表,顾名思义,优先队列则是元素有优先级的队列,出列的顺序由元素的优先级决定.从优先队列中删除元素是根据优先权的高低次序,而不是元素进入队列的次序.优先队列的典型应用是机器调度等. ...

随机推荐

  1. pyhive client连接hive报错处理:Could not start SASL

    本来一切就绪,镜像里已安装如下主要的pip包. pyhive configparser pandas hdfs thrift sqlparse sasl thrift-sasl 但,使用pyhive ...

  2. 201871010126 王亚涛 《面向对象程序设计 Java》 第十五周学习总结

    内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p/11 ...

  3. z+f数据解析

    1.先打开cmd2.把D:\qcc\编译和解析\debug_jiexi\SampleZFS.exe 拉进来.3.SampleZFS.exe -i *.zfs -o D:\*.txt 注意:*号代表文件 ...

  4. ubuntu自定义截图截图

    如果只需要获取一张屏幕截图,不对其进行编辑的话,那么键盘的默认快捷键就可以满足要求了.而且不仅仅是 Ubuntu ,绝大部分的 Linux 发行版和桌面环境都支持以下这些快捷键: PrtSc – 获取 ...

  5. WebSocket协议-基础篇

    本篇文章主要讲述以下几点: WebSocket协议出现的背景 WebSocket与HTTP WebSocket API WebSocket协议出现的背景 我们在上网过程中经常用到的是HTTP和HTTP ...

  6. ABP 相关基础知识

    好文章: https://www.cnblogs.com/1zhk/p/5268054.html 关键字:Internal 限定的是只有在同一程序集中可访问,可以跨类 关键字:volatile 一个变 ...

  7. 判断所有的input框不能为空

    // 判断input框(除了类名为min1和max7)是否为空 function isEmpty(){ var flag=true; $("input[type='text']") ...

  8. nginx配置代理时参数说明

  9. CSP2019&&AFO

    day-1 attack回来了,颓废,吃蛋糕. day-0 和attack继续车上颓废. 报道,志愿者胖乎乎的,学校很新. day-1 T1写完写T2,两小时T310分 出来发现,T2好像有个地方没路 ...

  10. 洛谷 P1156 垃圾陷阱 题解

    题目传送门 dp+排序+01背包 就完事了??? 貌似就是这样的 代码: //dp 排序 01背包 #include<iostream> #include<cstdio> #i ...