Lucene中的优先PriorityQueue排序实现

来源:互联网 发布:淘宝直播怎么开通不了 编辑:程序博客网 时间:2024/06/18 13:20

这个队列的作用是维护一个固定长度的队列,队列中存放的值为最高评分的一组实体类,好比期末考试的全年级学生成绩单,这个成绩单只有前一百名的学生成绩。

lucene中的优先队列的具体实现:
先初始化创建一个固定长度n的数组heap[n](heap[0]不插入实体,一直未null,方便计数),在插入需要排序的实体到heap数组过程中有两个步骤,
1、在未插满数组的时候,upHeap()方法始终保证heap[1]为排序规则最小的那一个,直至填满heap数组。
2、在这个数据被填满后,如果需要继续插入实体,新插入的数据通过与heap[1]比较大小,比heap[1]小的丢弃,比heap[1]大的实体,则通过downHeap()方法去插入heap中。

成员变量

  private int size;  private int maxSize;  protected Object[] heap;

实现排序的两个重要方法

private final void upHeap() {    int i = size;    Object node = heap[i];            // save bottom node    int j = i >>> 1;    while (j > 0 && lessThan(node, heap[j])) {      heap[i] = heap[j];              // shift parents down      i = j;      j = j >>> 1;    }    heap[i] = node;               // install saved node  }
 private final void downHeap() {    int i = 1;    Object node = heap[i];            // save top node    int j = i << 1;               // find smaller child    int k = j + 1;    if (k <= size && lessThan(heap[k], heap[j])) {      j = k;    }    while (j <= size && lessThan(heap[j], node)) {      heap[i] = heap[j];              // shift up child      i = j;      j = i << 1;      k = j + 1;      if (k <= size && lessThan(heap[k], heap[j])) {        j = k;      }    }    heap[i] = node;               // install saved node  }
0 0
原创粉丝点击