Code di priorità
In una coda di priorità ogni elemento è associato ad un peso, che determina l'ordine di estrazione.
Se l'elemento estratto ha la priorità più alta allora è a massima priorità, altrimenti è a minima priorità.
Operazioni
Una realizzazione delle code a massima priorità sfrutta gli heap, portando ad operazioni al più da .
-
Massimo
maximum(Heap A) -> Elem return A[i]
quindi .
-
Estrazione del massimo
extract_max(Heap A) -> Elem max = A[1] A[1] = A[A.heap_size] // Mantengo le foglie a sinistra scegliendo l'ultima A.heap_size-- max_heapify(A, 1) return max
per cui per la
max_heapify
. -
Incremento di priorità
increase(Heap A, Node i, Elem k) A[i] = k while i > 1 and A[parent(i)] < A[i] // Al massimo h volte se i è foglia swap(A[i], A[parent(i)]) i = parent(i)
con , che è corretto per l'invariante del
while
:Su
A
c'è un max heap con la possibile eccezione cheA[i]
è più grande diA[parent(i)]
per cui al termine si presenta una situazione in cui:
i = 1
, allora l'eccezione sarebbe suA[1]
che non ha padreA[parent(i)] >= A[i]
, allora non c'è alcuna eccezione
quindi in entrambi i casi si può affermare che
A
è max heap. -
Inserimento
insert(Heap A, Elem k) A.heap_size++ A[A.heap_size] = -Infinity // Mantiene l'heap corretto per la funzione increase increase(A, A.heap_size, k)
con per
increase
.