minheap.java

来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Java 代码 · 共 102 行

JAVA
102
字号
package edu.umass.cs.mallet.base.util.search;/** * Created by IntelliJ IDEA. * User: pereira * Date: Jun 18, 2005 * Time: 9:11:24 PM * * Binary heap implementation of <code>PriorityQueue</code>. * Based on algorithm in Corman, Leiserson, Rivest, and Stein (Section 6.5). */public class MinHeap implements PriorityQueue {  private QueueElement[] elts;  private int size = 0;  private static final int MIN_CAPACITY = 16; /** Create a binary heap with initial capacity <code>capacity</code>.  *  The heap's capacity grows as needed to accomodate insertions.  *  * @param capacity initial capacity  */ public MinHeap(int capacity) {    if (capacity < MIN_CAPACITY)      capacity = MIN_CAPACITY;    elts = new QueueElement[capacity];    size = 0;  }  /**   * Create a binary heap with minimum initial capacity.   */  public MinHeap() {    this(MIN_CAPACITY);  }  private void heapify(int i) {    int l = 2*i + 1;    int r = 2*i + 2;    int first;    if (l < size && elts[l].getPriority() < elts[i].getPriority())      first = l;    else      first = i;    if (r < size && elts[r].getPriority() < elts[first].getPriority())      first = r;    if (first != i) {      QueueElement e = elts[i];      elts[i] = elts[first];      elts[i].setPosition(i);      elts[first] = e;      e.setPosition(first);      heapify(first);    }  }  public int size() {    return size;  }  public QueueElement min() {    if (size == 0)      throw new IndexOutOfBoundsException("queue empty");    return elts[0];  }  public QueueElement extractMin() {    if (size == 0)      throw new IndexOutOfBoundsException("queue empty");    QueueElement min = elts[0];    elts[0] = elts[--size];    heapify(0);    min.setPosition(-1);    return min;  }  public void decreaseKey(QueueElement e, double priority) {    if (!contains(e))      throw new IllegalArgumentException("Element not in queue");    if (priority > e.getPriority())      throw new IllegalArgumentException("new priority higher than older");    e.setPriority(priority);    int i = e.getPosition();    int j;    while (i > 0 && elts[j = (i-1)/2].getPriority() > elts[i].getPriority()) {      QueueElement p = elts[j];      elts[j] = elts[i];      elts[j].setPosition(j);      elts[i] = p;      p.setPosition(i);      i = j;    }  }  public void insert(QueueElement e) {    if (size == elts.length) {      QueueElement[] newElts = new QueueElement[size + size/2];      for (int i = 0; i < size; i++)        newElts[i] = elts[i];      elts = newElts;    }    e.setPosition(size);    elts[size++] = e;    decreaseKey(e, e.getPriority());  }  public boolean contains(QueueElement e) {    int pos = e.getPosition();   return pos >= 0 && pos < size && e == elts[pos];  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?