我正在将C ++库移植到Java,并且需要堆数据结构。是否有标准的实现,还是我需要自己做?
我正在将C ++库移植到Java,并且需要堆数据结构。是否有标准的实现,还是我需要自己做?
Answers:
对于Java 8,更新现有答案:
您可以将Java Priority Queue用作堆。
Min Heap: ->使min元素始终位于顶部,因此您可以在O(1)中对其进行访问。
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Max Heap: ->使max元素始终位于顶部,与上述顺序相同。
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
(Integer o1, Integer o2) -> (- Integer.compare(o1,o2))与其他答案所建议的相同。
您可以使用:
add->将元素添加到队列中。O(log n)
remove->获取和删除最小值/最大值。O(log n)
peek->获取,但不删除最小值/最大值。O(1)
在Java中,PriorityQueue可以用作堆。
最小堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
最大堆:
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
PriorityQueue使用堆。根据https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html上的oracle文档,似乎它是二进制堆的实现。我不认为斐波那契或配对堆没有正式实现,尽管我很乐意看到两者中的任何一个。
否,没有,但是您可以将Priority Queue用作堆。Oracle正式告知其使用Priority Queue作为堆,您也可以参考此链接进行进一步说明。
PriorityQueue<Integer> MinHeap = new PriorityQueue<>();
PriorityQueue<Integer> MaxHeap = new PriorityQueue<>(Comparator.reverseOrder());
您还可以考虑TreeSet,它保证基本操作(添加,删除,包含)的log(n)时间。
PriorityQueue,番石榴还提供MinMaxPriorityQueue