Min-Max堆的Java实现?

时间:2009-07-08 14:02:07

标签: java data-structures minmax-heap

你知道一个流行的库(Apache,谷歌等集合),它有一个最小最大堆的可靠Java实现,这是一个允许在{{1}中查看其最小值和最大值的堆并删除O(1)中的元素?

6 个答案:

答案 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可能是个问题。

请参阅this related paper

虽然没有实现reduceKey或increaseKey。

答案 4 :(得分:1)

最小堆: PriorityQueue minHeap= new PriorityQueue<>();

最大堆 PriorityQueue maxHeap= new PriorityQueue<>(Comparator.reverseOrder());

答案 5 :(得分:0)