Ich portiere eine C ++ - Bibliothek nach Java und benötige eine Heap-Datenstruktur. Gibt es eine Standardimplementierung oder muss ich diese selbst durchführen?
Aktualisieren einer vorhandenen Antwort für Java 8 :
Sie können die Java Priority Queue als Heap verwenden.
Min Heap: -> um das min-Element immer oben zu halten, damit Sie in O (1) darauf zugreifen können.
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Max Heap: -> damit das max-Element immer oben bleibt, in der gleichen Reihenfolge wie oben.
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
Welches ist das gleiche wie (Integer o1, Integer o2) -> (- Integer.compare(o1,o2))aus anderen Antworten vorgeschlagen.
Und Sie können Folgendes verwenden: add->, um der Warteschlange ein Element hinzuzufügen. O (log n) remove-> um die min / max zu erhalten und zu entfernen. O (log n) peek-> um die min / max zu erhalten, aber nicht zu entfernen. O (1)
PriorityQueue verwendet einen Heap. Basierend auf der Oracle-Dokumentation unter https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html ist es wahrscheinlich, dass es sich um eine Implementierung eines binären Heaps handelt. Ich glaube nicht, dass es eine offizielle Implementierung eines Fibonacci oder eines Paarungshaufens gibt, obwohl ich gerne einen der beiden verfügbaren sehen würde.
Nein, als solches gibt es keine, aber Sie können die Prioritätswarteschlange als Heap verwenden. Es wurde von Oracle offiziell angewiesen, Priority Queue als Heap zu verwenden. Weitere Informationen finden Sie unter diesem Link .
PriorityQueue<Integer> MinHeap = new PriorityQueue<>();
PriorityQueue<Integer> MaxHeap = new PriorityQueue<>(Comparator.reverseOrder());
TreeSet bietet andere Eigenschaften als ein Heap. Die Prioritätswarteschlange ist die Heap-Struktur in java.util. *
ahains
2
Tatsächlich verwendet TreeSet intern eine TreeMap, bei der es sich um eine Rot-Schwarz-Baum-Implementierung handelt, die sich von einem Heap unterscheidet.
PriorityQueue
bietet Guave einenMinMaxPriorityQueue
Antworten:
Min Haufen:
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Max Haufen:
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return - Integer.compare(o1, o2); } });
quelle
Aktualisieren einer vorhandenen Antwort für Java 8 :
Sie können die Java Priority Queue als Heap verwenden.
Min Heap: -> um das min-Element immer oben zu halten, damit Sie in O (1) darauf zugreifen können.
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Max Heap: -> damit das max-Element immer oben bleibt, in der gleichen Reihenfolge wie oben.
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
Welches ist das gleiche wie
(Integer o1, Integer o2) -> (- Integer.compare(o1,o2))
aus anderen Antworten vorgeschlagen.Und Sie können Folgendes verwenden:
add
->, um der Warteschlange ein Element hinzuzufügen. O (log n)remove
-> um die min / max zu erhalten und zu entfernen. O (log n)peek
-> um die min / max zu erhalten, aber nicht zu entfernen. O (1)quelle
In Java kann PriorityQueue als Heap verwendet werden.
Min Heap
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
Max Heap:
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
quelle
PriorityQueue verwendet einen Heap. Basierend auf der Oracle-Dokumentation unter https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html ist es wahrscheinlich, dass es sich um eine Implementierung eines binären Heaps handelt. Ich glaube nicht, dass es eine offizielle Implementierung eines Fibonacci oder eines Paarungshaufens gibt, obwohl ich gerne einen der beiden verfügbaren sehen würde.
quelle
Nein, als solches gibt es keine, aber Sie können die Prioritätswarteschlange als Heap verwenden. Es wurde von Oracle offiziell angewiesen, Priority Queue als Heap zu verwenden. Weitere Informationen finden Sie unter diesem Link .
PriorityQueue<Integer> MinHeap = new PriorityQueue<>(); PriorityQueue<Integer> MaxHeap = new PriorityQueue<>(Comparator.reverseOrder());
quelle
Sie können auch TreeSet in Betracht ziehen , das die Protokollzeit (n) für grundlegende Vorgänge (Hinzufügen, Entfernen, Enthalten) garantiert.
quelle