Python enthält das Heapq-Modul für Min-Heaps, aber ich brauche einen Max-Heap. Was soll ich für eine Max-Heap-Implementierung in Python verwenden?
python
data-structures
heap
recursive-datastructures
Douglas Mayle
quelle
quelle
heapq
bietet keine Umkehrung.heapq
und dass es keine gute Alternative gibt.int
/ abgebildet werden kann, könnenfloat
Sie die Reihenfolge invertieren, indem Sie sie in eine Klasse mit einem invertierten__lt__
Operator einschließen .Sie können verwenden
Wenn Sie dann Elemente einfügen möchten, verwenden Sie:
quelle
_heapify_max
,_heappushpop_max
,_siftdown_max
, und_siftup_max
.Die Lösung besteht darin, Ihre Werte zu negieren, wenn Sie sie im Heap speichern, oder Ihren Objektvergleich wie folgt umzukehren:
Beispiel eines Max-Heaps:
Sie müssen jedoch daran denken, Ihre Werte zu verpacken und zu entpacken. Dazu müssen Sie wissen, ob es sich um einen Min- oder Max-Heap handelt.
MinHeap-, MaxHeap-Klassen
Das Hinzufügen von Klassen für
MinHeap
undMaxHeap
Objekte kann Ihren Code vereinfachen:Anwendungsbeispiel:
quelle
list
__init__ einen optionalen Parameter hinzugefügt. In diesem Fall rufe ich aufheapq.heapify
und füge auch eineheapreplace
Methode hinzu .Die einfachste und ideale Lösung
Los geht's. Alle höchsten Zahlen sind jetzt die niedrigsten und umgekehrt.
Denken Sie daran, wenn Sie ein Element platzen lassen, um es mit -1 zu multiplizieren, um den ursprünglichen Wert wieder zu erhalten.
quelle
Ich habe eine Max-Heap-Version von Heapq implementiert und an PyPI gesendet. (Sehr geringfügige Änderung des CPython-Codes des Heapq-Moduls.)
https://pypi.python.org/pypi/heapq_max/
https://github.com/he-zhe/heapq_max
Installation
Verwendung
tl; dr: Entspricht dem Heapq-Modul, außer dass allen Funktionen '_max' hinzugefügt wird.
quelle
Wenn Sie Schlüssel einfügen, die vergleichbar, aber nicht int-ähnlich sind, können Sie möglicherweise die Vergleichsoperatoren überschreiben (dh <= werden> und> werden <=). Andernfalls können Sie heapq._siftup im heapq-Modul überschreiben (am Ende ist alles nur Python-Code).
quelle
# If available, use C implementation
) einen Code , der genau das tut, was der Kommentar beschreibt.Sie können eine beliebige Anzahl der größten oder kleinsten Elemente auswählen
quelle
Das Erweitern der int-Klasse und das Überschreiben von __lt__ ist eine der Möglichkeiten.
quelle
Ich habe einen Heap-Wrapper erstellt, der die Werte invertiert, um einen Max-Heap zu erstellen, sowie eine Wrapper-Klasse für einen Min-Heap, um die Bibliothek OOP-ähnlicher zu machen. Hier ist das Wesentliche. Es gibt drei Klassen; Heap (abstrakte Klasse), HeapMin und HeapMax.
Methoden:
quelle
Wenn Sie das größte K-Element mit max heap erhalten möchten, können Sie den folgenden Trick ausführen:
quelle
nlargest
hier -> github.com/python/cpython/blob/…Nach Isaac Turners hervorragender Antwort möchte ich ein Beispiel basierend auf K Closest Points to the Origin unter Verwendung von Max Heap setzen.
quelle
Zur Erläuterung von https://stackoverflow.com/a/59311063/1328979 finden Sie hier eine vollständig dokumentierte, kommentierte und getestete Python 3-Implementierung für den allgemeinen Fall.
https://gist.github.com/marccarre/577a55850998da02af3d4b7b98152cf4
quelle
Dies ist eine einfache
MaxHeap
Implementierung basierend aufheapq
. Es funktioniert jedoch nur mit numerischen Werten.Verwendung:
quelle