Vorrei memorizzare un set di oggetti in un heap minimo definendo una funzione di confronto personalizzata. Vedo che c'è un modulo heapq disponibile come parte della distribuzione python. C'è un modo per usare un comparatore personalizzato con questo modulo? In caso contrario, qualcun altro ha creato un heap minimo personalizzato?min heap in python
risposta
Sì, c'è un modo. Definisci una classe di wrapping che implementa il tuo comparatore personalizzato e utilizza un elenco di quelli al posto di un elenco dei tuoi oggetti reali. Questo è quanto di meglio ci sia mentre si usa ancora il modulo heapq, poiché non fornisce argomenti key = o cmp = come le funzioni/metodi di ordinamento.
def gen_wrapper(cmp):
class Wrapper(object):
def __init__(self, value): self.value = value
def __cmp__(self, obj): return cmp(self.value, obj.value)
return Wrapper
Nota che questo non funzionerà con python 3.0, che elimina __cmp__. –
No, non funzionerà in Python 3.0, ma non importa, perché in Python 3.0 manca l'intero concetto di "funzione comparatore". La domanda semplicemente non si applica in quel caso. –
Um. Dovresti definire __le__ piuttosto che __cmp__. Ciò manterrebbe la compatibilità con Python 2/3. Dopo tutto, le operazioni heapq e le operazioni di ordinamento utilizzano <= come funzione di confronto. – tzot
due opzioni (a parte il suggerimento di Devin Jeanpierre):
Decora i tuoi dati prima di utilizzare l'heap. Questo è l'equivalente dell'opzione
key=
all'ordinamento. per esempio. se (per qualche motivo) voleva heapify un elenco di numeri in base alla loro sine:data = [ # list of numbers ] heap = [(math.sin(x), x) for x in data] heapq.heapify(heap) # get the min element item = heappop(heap)[1]
Il modulo
heapq
è implementato in puro Python. Potresti semplicemente copiarlo nella tua directory di lavoro e cambiare i bit rilevanti. Da un rapido sguardo, dovresti modificare siftdown() e siftup(), e probabilmente nlargest e nsmallest se ne hai bisogno.
+1: decora i tuoi dati. –
Inoltre, il modulo heapq è implementato sia in C che in Python. L'importazione di heapq utilizza il modulo C, se disponibile. – tzot
Ah, hai ragione. Bene, la cosa importante per il mio secondo suggerimento è che il codice python è disponibile nella directory lib se vuoi eseguire il rollover. –
- 1. Metodo Min Heapify - Algoritmo min heap
- 2. Implementazione Java per Min-Max Heap?
- 3. heap min C++ con tipo definito dall'utente
- 4. Implementazione dell'algoritmo di Dijkstra usando min-heap ma fallito
- 5. Restituisce min/max di multidimensionale in Python?
- 6. API max heap integrata in Python
- 7. Python: valori Max e Min utilizzabili
- 8. Python trovare min & max di due liste
- 9. Confondere circa un Python min quiz
- 10. Come mantenere il dizionario in un heap in python?
- 11. dimostrare l'algoritmo che utilizza il min-heap per unire k liste ordinate
- 12. SELEZIONE min min e max min valore da una parte di una tabella in MySQL
- 13. Un min = idioma in C++?
- 14. chiave predefinita per Python incorporato max/min funzioni
- 15. Python json.dumps (<val>) per l'output di JSON min.?
- 16. Libreria min-cut veloce per Max-flow per Python
- 17. Overflow di heap in Haskell
- 18. Python: funzioni built-max/min dipendono ordine parametro
- 19. Implementazione C++ di un heap binario
- 20. Aumentare lo spazio di heap in Eclipse: (java.lang.OutOfMemoryError)
- 21. Come implementare un heap mediano
- 22. Qual è la relazione tra "un" heap e "l'" heap?
- 23. Linq (MIN && MAX)
- 24. MIN() nella clausola WHERE
- 25. off-heap, heap nativo, memoria diretta e memoria nativa
- 26. jQuery css min-height
- 27. Implementazione corretta del min
- 28. versione jquery-min?
- 29. Impostazione min-width - jQuery
- 30. SQL MIN() valore strano
Per un frammento più confortevole - (e Python 3 pronto), controllare la mia risposta a http://stackoverflow.com/questions/8875706/python-heapq-with-custom-compare-predicate/8875823#8875823 – jsbueno