Java中有堆吗?
我正在将一个C++库移植到Java,我需要一个堆数据结构。是否有标准实现,或者我需要自己做吗?
对于 Java 8,更新现有答案:
您可以将 Java 优先级队列用作堆。
最小堆: -->保持最小元素始终在顶部, 所以你可以在 O(1) 中访问它。
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
最大堆: -->使 max 元素始终位于顶部,顺序与上述顺序相同。
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
这与其他答案相同或建议。(Integer o1, Integer o2) -> Integer.compare(o2, o1)
- Integer.compare(o1, o2)
您可以使用:
-->将元素添加到队列中。O(log n)
-->获取并删除最小值/最大值 O(log n)
-->获取,但不删除最小值/最大值 O(1)add
remove
peek
最小堆:
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
最大堆数:
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return - Integer.compare(o1, o2);
}
});