Gibt es einen Haufen in Java?

74

Ich portiere eine C ++ - Bibliothek nach Java und benötige eine Heap-Datenstruktur. Gibt es eine Standardimplementierung oder muss ich diese selbst durchführen?

user1796942
quelle
Zusätzlich zu den Eingeborenen PriorityQueuebietet Guave einenMinMaxPriorityQueue
Elliott Frisch
verwandte stackoverflow.com/questions/1098277/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Antworten:

29

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);
    }
});
user2015398
quelle
24

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)

Ahmed Hamdy
quelle
10

In Java kann PriorityQueue als Heap verwendet werden.

Min Heap

PriorityQueue<Integer> minHeap = new PriorityQueue<>();

Max Heap:

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Comparator.reverseOrder());
Boas
quelle
8

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.

Pete
quelle
3

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());
Anubhav Mishra
quelle
0

Sie können auch TreeSet in Betracht ziehen , das die Protokollzeit (n) für grundlegende Vorgänge (Hinzufügen, Entfernen, Enthalten) garantiert.

Adriana Cosma
quelle
1
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.
Alfredo Osorio