Ich habe Prioritätswarteschlange in Java von Ganzzahlen:
PriorityQueue<Integer> pq= new PriorityQueue<Integer>();
Wenn ich anrufe, pq.poll()
bekomme ich das minimale Element.
Frage: Wie ändere ich den Code, um das maximale Element zu erhalten?
java
collections
priority-queue
Borut Flis
quelle
quelle
Antworten:
Wie wäre es so:
Das
Collections.reverseOrder()
sieht vor,Comparator
dass die Elemente in derPriorityQueue
entgegengesetzten Reihenfolge in ihrer natürlichen Reihenfolge in diesem Fall sortiert werden.quelle
Collections.reverseOrder()
ist auch überladen, um einen Komparator zu verwenden, sodass es auch funktioniert, wenn Sie benutzerdefinierte Objekte vergleichen.PriorityQueue(Comparator<? super E> comparator)
.Sie können den Lambda-Ausdruck seit Java 8 verwenden.
Der folgende Code gibt 10 aus, je größer.
Die Lambda-Funktion verwendet zwei Ganzzahlen als Eingabeparameter, subtrahiert sie voneinander und gibt das arithmetische Ergebnis zurück. Die Lambda-Funktion implementiert die Funktionsschnittstelle
Comparator<T>
. (Dies wird an Ort und Stelle verwendet, im Gegensatz zu einer anonymen Klasse oder einer diskreten Implementierung.)quelle
(x, y) -> y - x
aufgrund des Überlaufs möglicherweise nicht für lange Ganzzahlen geeignet. Zum Beispiel ergeben die Zahlen y = Integer.MIN_VALUE und x = 5 eine positive Zahl. Es ist besser zu benutzennew PriorityQueue<>((x, y) -> Integer.compare(y, x))
. Die bessere Lösung wird jedoch von @Edwin Dalorzo zur Verfügung gestelltCollections.reverseOrder()
.Sie können ein benutzerdefiniertes
Comparator
Objekt bereitstellen , das Elemente in umgekehrter Reihenfolge ordnet:Jetzt kehrt die Prioritätswarteschlange alle Vergleiche um, sodass Sie das maximale Element anstelle des minimalen Elements erhalten.
Hoffe das hilft!
quelle
if (rhs < lhs) return +1;
if (rhs > lhs) return -1;
if (lhs < rhs) return +1; if (lhs > rhs) return -1;
quelle
b-a
kann dazu führenoverflow
, sollte es vermeiden, es zu verwenden und sollteCollections.reverseOrder();
als Komparator verwendet werden oder ba ersetzen, mitInteger.compare(a,b);
dem inJava 8
In Java 8+ können Sie eine Warteschlange mit maximaler Priorität über eine der folgenden Methoden erstellen:
Methode 1:
Methode 2:
Methode 3:
quelle
Die Elemente der Prioritätswarteschlange werden gemäß ihrer natürlichen Reihenfolge oder von einem Komparator geordnet, der zur Zeit der Warteschlangenerstellung bereitgestellt wird.
Der Komparator sollte die Vergleichsmethode überschreiben.
Die Standardvergleichsmethode gibt eine negative Ganzzahl, Null oder eine positive Ganzzahl zurück, da das erste Argument kleiner, gleich oder größer als das zweite ist.
Die von Java bereitgestellte Standardprioritäts-Warteschlange ist Min-Heap. Wenn Sie einen maximalen Heap wünschen, folgt der folgende Code
Referenz: https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html#comparator ()
quelle
Hier ist ein Beispiel für Max-Heap in Java:
Die Ausgabe wird 10 sein
quelle
Dies kann durch den folgenden Code in Java 8 erreicht werden, der einen Konstruktor eingeführt hat, der nur einen Komparator benötigt.
quelle
Sie können verwenden
MinMaxPriorityQueue
(es ist ein Teil der Guava-Bibliothek): Hier ist die Dokumentation . Stattdessenpoll()
müssen Sie diepollLast()
Methode aufrufen .quelle
Ändern Sie PriorityQueue in MAX PriorityQueue Methode 1: Queue pq = new PriorityQueue <> (Collections.reverseOrder ()); Methode 2: Warteschlange pq1 = neue PriorityQueue <> ((a, b) -> b - a); Schauen wir uns einige Beispiele an:
Nehmen wir ein berühmtes Interview Problem: Kth größtes Element in einem Array mit PriorityQueue
Ein anderer Weg :
Wie wir sehen können, liefern beide das gleiche Ergebnis.
quelle
Dies kann durch Verwendung erreicht werden
quelle
Ich habe gerade eine Monte-Carlo-Simulation für beide Komparatoren mit Doppelhaufen-Sortierung min max durchgeführt und beide kamen zu demselben Ergebnis:
Dies sind die maximalen Komparatoren, die ich verwendet habe:
(A) Eingebauter Komparator für Sammlungen
(B) Benutzerdefinierter Komparator
quelle
if (rhs < lhs) return +1;
dh wenn die höchsten Elemente zuerst in einer Prioritätswarteschlange gedruckt werden sollen, sollte dies der Fall sein, wenn (rhs> lhs) -1 zurückgibt.Sie können etwas versuchen wie:
Was für jede andere Basisvergleichsfunktion funktioniert, die Sie möglicherweise haben.
quelle
quelle
Sie können versuchen, Elemente mit umgekehrtem Vorzeichen zu drücken. Beispiel: Addiere a = 2 & b = 5 und frage dann b = 5 ab.
Wenn Sie den Kopf der Warteschlange abgefragt haben, kehren Sie das Vorzeichen für Ihre Verwendung um. Dies druckt 5 (größeres Element). Kann in naiven Implementierungen verwendet werden. Auf keinen Fall eine zuverlässige Lösung. Ich empfehle es nicht.
quelle