java中有堆吗?

use*_*942 56 java

我正在将一个C++库移植到Java,我需要一个堆数据结构.是否有标准实施或我是否需要自己完成?

Ahm*_*mdy 69

对于 Java 8,更新现有答案

您可以将 Java 优先级队列用作堆。

最小堆: --> 使最小元素始终位于顶部,以便您可以在 O(1) 中访问它。

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Run Code Online (Sandbox Code Playgroud)

Max Heap: --> 保持最大元素始终在顶部,顺序与上面相同。

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
Run Code Online (Sandbox Code Playgroud)

这与其他答案中的建议相同(Integer o1, Integer o2) -> Integer.compare(o2, o1)- Integer.compare(o1, o2)建议。

您可以使用:
add--> 将元素添加到队列中。O(log n)
remove--> 获取和删除最小值/最大值。O(log n)
peek--> 获取,但不删除最小值/最大值。O(1)


Boa*_*oaz 12

在 Java PriorityQueue 中可以作为 Heap 使用。

最小堆

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
Run Code Online (Sandbox Code Playgroud)

最大堆:

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
Run Code Online (Sandbox Code Playgroud)

  • 它与[这个](/sf/answers/3826568301/)或[这个](/sf/answers/4048371001/)答案有什么不同? (2认同)

小智 10

最小堆:

        PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Run Code Online (Sandbox Code Playgroud)

最大堆:

PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return - Integer.compare(o1,o2);
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • `- Integer.compare(o1, o2);` 应与 `Integer.compare(o2, o1);` 相同 (2认同)

小智 6

PriorityQueue使用堆.基于https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html上的oracle文档,它似乎可能是二进制堆的实现.我不认为有一个斐波纳契或配对堆的正式实现,但我很乐意看到两者中的任何一个可用.


小智 0

您还可以考虑TreeSet,它保证基本操作(添加、删除、包含)的 log(n) 时间。

  • TreeSet 提供了与堆不同的特性。优先级队列是java.util.*中的Heap结构 (3认同)
  • 实际上,TreeSet 内部使用了 TreeMap,它是红黑树实现,因此它与堆不同。 (3认同)