[英]Java implementation for Min-Max Heap?
你知道一個流行的庫(Apache、谷歌等,集合)有一個可靠的 Java 實現最小-最大堆,這是一個允許在O(1)
中查看其最小值和最大值並刪除的堆O(log n)
中的一個元素?
來自番石榴: MinMaxPriorityQueue
。
您可以使用包含相同元素的java.util.PriorityQueue 的兩個實例來代替最大-最小堆嗎? 第一個實例將傳遞一個比較器,該比較器將最大值放在頭部,第二個實例將使用一個比較器,將最小值放在頭部。
缺點是必須在兩個結構上執行添加、刪除等操作,但它應該滿足您的要求。
Java 有很好的工具來實現最小和最大堆。 我的建議是使用優先隊列數據結構來實現這些堆。 要使用優先級隊列實現最大堆,請嘗試以下操作:
import java.util.PriorityQueue;
public class MaxHeapWithPriorityQueue {
public static void main(String args[]) {
// create priority queue
PriorityQueue<Integer> prq = new PriorityQueue<>((a,b)->b-a);
// 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()+" ");
}
}
}
欲了解更多信息,請訪問:
好吧,您可以簡單地傳遞用於比較元素的比較器。 即使您想根據某些屬性對對象進行排序,這也會變得很有用。 請看以下示例:
最小堆:
PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> a - b);
最大堆:
PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> b - a);
對象的最小堆
PriorityQueue<MyObject> pq = new PriorityQueue<>((obj1, obj2) -> obj1.getId() - obj2.getId());
對象的最大堆
PriorityQueue<MyObject> pq = new PriorityQueue<>((obj1, obj2) -> obj2.getId() - obj1.getId());
com.aliasi.util.MinMaxHeap怎么樣? 這是LingPipe 的一部分; 不幸的是,許可可能是一個問題。
請參閱此相關文件。
但是,不實現decreaseKey 或increaseKey。
最小堆: PriorityQueue minHeap= new PriorityQueue<>();
Max Heap PriorityQueue maxHeap= new PriorityQueue<>(Comparator.reverseOrder());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.