Min-Max堆的Java实现?

Yuv*_*dam 36 java data-structures minmax-heap

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

Lou*_*man 33

来自番石榴:MinMaxPriorityQueue.


Il-*_*ima 26

您可以使用包含相同元素的java.util.PriorityQueue的两个实例而不是max-min堆吗?第一个实例将通过一个比较器,它将最大值放在头部,第二个实例将使用一个比较器,它将最小值放在头部.

缺点是必须在两个结构上执行添加,删除等,但它应该满足您的要求.

  • +1.鉴于要求在O(1)中查看根并在O(log.n)中删除它,这是一个很好的答案.但请注意,PriorityQueue不会实现所有堆操作(例如,reduceKey,increaseKey). (5认同)
  • 注意,从队列头部删除的无参数`remove()`是'O(log(n))`,而`remove(Object o)`是'O(n)`.参考:http://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html (4认同)
  • 被否决,因为删除不再是 O(log n)。从一个队列中删除最小值是 O(log n),但是删除将在另一个队列末尾的相同项目是 O(n)。 (2认同)

Vah*_*hid 17

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()+" ");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

要实现具有优先级队列的最小堆,请尝试以下操作:

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()+" ");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请访问:

  • 使用[Collections.reverseOrder()](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#reverseOrder--)作为MaxHeap中PriorityQueue的参数更方便类. (10认同)
  • 在Lambda表达式中,由于[整数溢出],可以很容易地打破逐个减法技巧(/sf/ask/191015541/ ).建议进行简单比较:`(x,y) - > x <y?-1:x == y?0:1` (3认同)
  • 对于这部分,我使用了 lambda 表达式(Java 8)。但是,这是基于偏好的。你的建议也很好。我很欣赏你的选择。 (2认同)

Vip*_*yal 11

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

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


小智 9

那么您可以简单地传递用于比较元素的比较器。即使您想根据某些属性对对象进行排序,这也会变得很有用。看下面的例子: