你知道一个流行的库(Apache,谷歌等集合),它有一个最小最大堆的可靠Java实现,这是一个允许在{{1}中查看其最小值和最大值的堆并删除O(1)
中的元素?
答案 0 :(得分:32)
来自番石榴:MinMaxPriorityQueue
。
答案 1 :(得分:24)
您可以使用包含相同元素的java.util.PriorityQueue的两个实例,而不是max-min堆吗?第一个实例将通过一个比较器,它将最大值放在头部,第二个实例将使用一个比较器,将最小值放在头部。
缺点是必须在两个结构上执行添加,删除等,但它应该满足您的要求。
答案 2 :(得分:15)
Java有很好的工具来实现最小和最大堆。我的建议是使用优先级队列数据结构来实现这些堆。要实现具有优先级队列的最大堆,请尝试以下:
import java.util.PriorityQueue;
public class MaxHeapWithPriorityQueue {
public static void main(String args[]) {
// create priority queue
PriorityQueue<Integer> prq = new PriorityQueue<>((x,y) -> y-x);
// insert values in the queue
prq.add(6);
prq.add(9);
prq.add(5);
prq.add(64);
prq.add(6);
//print values
while (!prq.isEmpty()) {
System.out.print(prq.poll()+" ");
}
}
}
要实现具有优先级队列的最小堆,请尝试:
import java.util.PriorityQueue;
public class MinHeapWithPriorityQueue {
public static void main(String args[]) {
// create priority queue
PriorityQueue< Integer > prq = new PriorityQueue <> ();
// insert values in the queue
prq.add(6);
prq.add(9);
prq.add(5);
prq.add(64);
prq.add(6);
//print values
while (!prq.isEmpty()) {
System.out.print(prq.poll()+" ");
}
}
}
有关详细信息,请访问:
答案 3 :(得分:2)
com.aliasi.util.MinMaxHeap怎么样?这是LingPipe的一部分;不幸的是,licensing可能是个问题。
虽然没有实现reduceKey或increaseKey。
答案 4 :(得分:1)
最小堆: PriorityQueue minHeap= new PriorityQueue<>();
最大堆 PriorityQueue maxHeap= new PriorityQueue<>(Comparator.reverseOrder());
答案 5 :(得分:0)