Questo modulo fornisce un'implementazione dell'algoritmo heap queue, conosciuto anche come algoritmo di coda con priorità.
Gli Heap sono vettori tali che
heap[k] <= heap[2*k+1]
e
heap[k] <= heap[2*k+2]
per ogni
k, contando gli elementi da zero. Per esigenze di confronto,
gli elementi non presenti vengono considerati infiniti, quindi maggiori di qualunque
altro. L'interessante proprietà dello heap è che heap[0]
è sempre l'elemento più piccolo.
L'API seguente differisce dagli algoritmi di heap dei manuali informatici per due aspetti: (a) Noi usiamo indici che iniziano da zero. Questo rende le relazioni tra l'indice di un nodo e gli indici dei suoi figli leggermente meno ovvie, ma è più conveniente poiché anche Python usa indicizza da zero. (b) Il nostro metodo pop restituisce l'elemento più piccolo, non il più grande (chiamato il "min heap" nei manuali; un "max heap" è più comune nei testi grazie alla sua adattabilità all'ordinamento sul posto).
Questi due punti permettono di trattare l'heap come una normale
lista Python senza sorprese: heap[0]
è l'elemento più
piccolo e heap.sort()
mantiene l'heap invariato!
Per creare uno heap, potete utilizzare una lista inizializzata a []
o
trasformare una lista non vuota in uno heap tramite la funzione
heapify().
Vengono fornite le seguenti funzioni :
heap, item) |
heap) |
x) |
heap, item) |
Esempio di utilizzo:
>>> from heapq import heappush, heappop >>> heap = [] >>> data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0] >>> for item in data: ... heappush(heap, item) ... >>> sorted = [] >>> while heap: ... sorted.append(heappop(heap)) ... >>> print sorted [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> data.sort() >>> print data == sorted True >>>