Python zawiera moduł heapq dla min-stert, ale potrzebuję maksymalnej sterty. Czego powinienem użyć do implementacji max-sterty w Pythonie?
python
data-structures
heap
recursive-datastructures
Douglas Mayle
źródło
źródło
heapq
że nie zapewnia odwrotności.heapq
i że nie ma dobrej alternatywy.int
/float
, możesz odwrócić kolejność, zawijając je w klasie odwróconym__lt__
operatorem.Możesz użyć
Jeśli następnie chcesz wyskoczyć elementy, użyj:
źródło
_heapify_max
,_heappushpop_max
,_siftdown_max
, i_siftup_max
.Rozwiązaniem jest zanegowanie wartości podczas przechowywania ich w stercie lub odwrócenie porównania obiektów w następujący sposób:
Przykład maksymalnego stosu:
Ale musisz pamiętać, aby zawijać i rozpakowywać swoje wartości, co wymaga wiedzy, czy masz do czynienia ze stertą minimalną lub maksymalną.
Klasy MinHeap, MaxHeap
Dodanie klas
MinHeap
iMaxHeap
obiektów może uprościć kod:Przykładowe użycie:
źródło
list
parametr do __init__, w którym to przypadku wywołujęheapq.heapify
i dodałem równieżheapreplace
metodę.Najłatwiejsze i idealne rozwiązanie
Proszę bardzo. Wszystkie najwyższe liczby są teraz najniższe i odwrotnie.
Pamiętaj tylko, że kiedy wstawisz element, pomnóż go przez -1, aby ponownie uzyskać oryginalną wartość.
źródło
Zaimplementowałem wersję sterty o maksymalnej wysokości stosu i przesłałem ją do PyPI. (Bardzo niewielka zmiana kodu CPython modułu heapq.)
https://pypi.python.org/pypi/heapq_max/
https://github.com/he-zhe/heapq_max
Instalacja
Stosowanie
tl; dr: to samo co moduł heapq z wyjątkiem dodania „_max” do wszystkich funkcji.
źródło
Jeśli wstawiasz klucze, które są porównywalne, ale nie int-like, możesz potencjalnie zastąpić na nich operatory porównania (tj. <= Stać się> i> stać <=). W przeciwnym razie możesz zastąpić heapq._siftup w module heapq (w końcu to wszystko jest tylko kodem Python).
źródło
# If available, use C implementation
), który robi dokładnie to, co opisuje komentarz.Pozwala wybrać dowolną liczbę największych lub najmniejszych przedmiotów
źródło
Rozszerzenie klasy int i przesłonięcie __lt__ jest jednym ze sposobów.
źródło
Utworzyłem opakowanie sterty, które odwraca wartości, aby utworzyć stertę maksymalną, a także klasę opakowania dla sterty min, aby biblioteka była bardziej podobna do OOP. Tutaj sedno. Istnieją trzy klasy; Heap (klasa abstrakcyjna), HeapMin i HeapMax.
Metody:
źródło
W przypadku, gdy chcesz uzyskać największy element K za pomocą maksymalnej sterty, możesz wykonać następującą sztuczkę:
źródło
nlargest
tutaj -> github.com/python/cpython/blob/…Idąc za doskonałą odpowiedzią Izaaka Turnera , chciałbym podać przykład oparty na K najbliższych punktach pochodzenia przy użyciu maksymalnego sterty.
źródło
Aby rozwinąć na https://stackoverflow.com/a/59311063/1328979 , oto w pełni udokumentowana, opatrzona adnotacjami i przetestowana implementacja języka Python 3 dla ogólnego przypadku.
https://gist.github.com/marccarre/577a55850998da02af3d4b7b98152cf4
źródło
Jest to prosta
MaxHeap
implementacja oparta naheapq
. Chociaż działa tylko z wartościami liczbowymi.Stosowanie:
źródło