Python inclut le module heapq pour les tas min, mais j'ai besoin d'un tas max. Que dois-je utiliser pour une implémentation max-heap en Python?
python
data-structures
heap
recursive-datastructures
Douglas Mayle
la source
la source
heapq
ne pas fournir un revers.heapq
et qu'il n'y ait pas de bonne alternative.int
/float
, vous pouvez inverser l'ordre en les enveloppant dans une classe avec un__lt__
opérateur inversé .Vous pouvez utiliser
Si vous souhaitez ensuite faire apparaître des éléments, utilisez:
la source
_heapify_max
,_heappushpop_max
,_siftdown_max
et_siftup_max
.La solution consiste à annuler vos valeurs lorsque vous les stockez dans le tas ou à inverser votre comparaison d'objet comme suit:
Exemple d'un tas max:
Mais vous devez vous rappeler d'envelopper et de déballer vos valeurs, ce qui nécessite de savoir si vous avez affaire à un tas min ou max.
Classes MinHeap, MaxHeap
L'ajout de classes pour
MinHeap
et d'MaxHeap
objets peut simplifier votre code:Exemple d'utilisation:
la source
list
paramètre facultatif à __init__ auquel cas j'appelleheapq.heapify
et j'ai également ajouté uneheapreplace
méthode.La solution la plus simple et idéale
Voilà. Tous les nombres les plus élevés sont désormais les plus bas et vice versa.
N'oubliez pas que lorsque vous éclatez un élément pour le multiplier par -1 afin d'obtenir à nouveau la valeur d'origine.
la source
J'ai implémenté une version max heap de heapq et l'ai soumise à PyPI. (Très léger changement de code CPython du module heapq.)
https://pypi.python.org/pypi/heapq_max/
https://github.com/he-zhe/heapq_max
Installation
Usage
tl; dr: identique au module heapq sauf en ajoutant '_max' à toutes les fonctions.
la source
Si vous insérez des clés comparables mais pas de type int, vous pouvez potentiellement remplacer les opérateurs de comparaison sur celles-ci (c'est-à-dire <= devenir> et> devient <=). Sinon, vous pouvez remplacer heapq._siftup dans le module heapq (c'est tout simplement du code Python, à la fin).
la source
# If available, use C implementation
) qui fait exactement ce que le commentaire décrit.Vous permettant de choisir une quantité arbitraire d'articles les plus grands ou les plus petits
la source
Étendre la classe int et remplacer __lt__ est l'une des façons.
la source
J'ai créé un wrapper de tas qui inverse les valeurs pour créer un max-heap, ainsi qu'une classe de wrapper pour un min-heap pour rendre la bibliothèque plus proche de la POO. Voici l'essentiel. Il y a trois classes; Heap (classe abstraite), HeapMin et HeapMax.
Méthodes:
la source
Si vous souhaitez obtenir le plus grand élément K en utilisant le tas max, vous pouvez faire l'astuce suivante:
la source
nlargest
ici -> github.com/python/cpython/blob/…Suite à l'excellente réponse d'Isaac Turner , j'aimerais mettre un exemple basé sur K points les plus proches de l'origine en utilisant le tas max.
la source
Pour élaborer sur https://stackoverflow.com/a/59311063/1328979 , voici une implémentation Python 3 entièrement documentée, annotée et testée pour le cas général.
https://gist.github.com/marccarre/577a55850998da02af3d4b7b98152cf4
la source
Il s'agit d'une
MaxHeap
implémentation simple basée surheapq
. Bien que cela ne fonctionne qu'avec des valeurs numériques.Usage:
la source