Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Code di priorità
Code di max-priorità tramite heap
Heap-sort
Heap
2 4 1
A 16 14 10 8 7 9 3 2 4 1
Heap
Heap
Max-heap e min-heap
Max-heap e min-heap
Gli eventi devono essere simulati secondo l’ordine dei loro tempi,
questo perchè un evento può generare altri eventi
Inserimento
1 2 3 4 5 6 7 8 9 10
Insert(A, 15) A 16 14 10 8 7 9 3 2 4 1
1 2 3 4 5 6 7 8 9 10 i=11
A 16 14 10 8 7 9 3 2 4 1 15
A[parent[i]] < A[i]
1 2 3 4 i=5 6 7 8 9 10 11
A 16 14 10 8 15 9 3 2 4 1 7
1 i=2 3 4 5 6 7 8 9 10 11
A 16 15 10 8 14 9 3 2 4 1 7
A[parent[i]] ≥ A[i]
Max-Heap-Insert(A, x)
Max-Heap-Insert(A, x)
heap-size[A] = heap-size[A] + 1
. aumentiamo la dimensione dell’heap
i = heap-size[A]
A[i] ← x
while i > 1 and A[parent[i]] < A[i]
do scambia A[i] ↔ A[parent[i]]
i ← parent[i]
Il numero di scambi è pari al più all’altezza dello heap, quindi
Max-Heap-Insert viene eseguita in un tempo
O(log2 n)
Di Berardini, Merelli Algoritmi e Strutture Dati
Heap binari: definizione inserimento
Code di priorità restituzione del massimo
Code di max-priorità tramite heap estrazione del massimo
Heap-sort incremento di una chiave
Max-Heap-Insert(A, x)
16 16
14 10 14 10
8 7 9 3 8 i=5 15 9 3
2 4 1 15 i = 11 2 4 1 7
(a) (b)
16 16
i=2 15 10 15 10
8 14 9 3 8 14 9 3
2 4 1 7 2 4 1 7
(c)
Di Berardini, Merelli Algoritmi e Strutture Dati
Heap binari: definizione inserimento
Code di priorità restituzione del massimo
Code di max-priorità tramite heap estrazione del massimo
Heap-sort incremento di una chiave
Heap-Maximum(A)
return A[1]
16 max 16
1
14 10
14 10
8 7 9 3
8 7 9 3
2 4 1
2 4 1
8 7 9 3
2 4
Max-Heapify(A, i)
Max-Heapify(A, i)
Heaps
A B
?
Facciamo scendere il
Heap nodo i nell’albero fino
Heaps
A Bi a trovare la sua
posizione
Max-Heapify(A, i)
1 14
14 10 1 10
8 7 9 3 8 7 9 3
14
14
8 10
8 10
4 7 9 3
1 7 9 3
2 1
2 4 max(2, 4) = 4
Max-Heapify(A, i)
Max-Heapify(A, i)
l ← left[i]
r ← right[i]
if massimo 6= i
then scambia A[i] ↔ A[massimo]
Max-Heapify(A, massimo)
Di Berardini, Merelli Algoritmi e Strutture Dati
Heap binari: definizione inserimento
Code di priorità restituzione del massimo
Code di max-priorità tramite heap estrazione del massimo
Heap-sort incremento di una chiave
Max-Heapify(A, i)
Max-Heapfy( 1 ) 14
14 10 Max-Heapfy( 1 ) 10
8 7 9 3 8 7 9 3
2 4 2 4
14
14
8 10
8 10
Max-Heapfy( 1 ) 4 7 9 3
7 9 3
2 1
2 4
Esercizio
Heap-Extract-Max(A)
if heap-size[A] < 1
then error “underflow dell’heap”
max ← A[1]
A[1] ← A[heap-size[A]]
heap-size[A] ← heap-size[A] − 1
Max-Heapify(A, 1)
return max
Increase-Key(A, 9, 15) A 16 14 10 8 7 9 3 2 4 1
1 2 3 4 5 6 7 8 i=9 10
A 16 14 10 8 7 9 3 2 15 1
1 2 3 i=4 5 6 7 8 9 10
A 16 14 10 15 7 9 3 2 8 1
1 i=2 3 4 5 6 7 8 9 10
A 16 15 10 14 7 9 3 2 8 1
A[parent[i]] ≥ A[i]
Heap-Increase-Key(A, i, key )
È molto simile alla Max-Heap-Insert
Heap-Increase-Key(A, i, key )
if key < A[i]
then error “la nuova chiave è più piccola di quella corrente”
A[i] ← key
while i > 1 or A[parent[i]] < A[i]
do scambia A[i] ↔ A[parent[i]]
i ← parent[i]
O(log2 n)
16 16
14 10 14 10
8 7 9 3 8 7 9 3
2 4 1 2 15 1
(a) (b)
16 16
14 10 15 10
15 7 9 3 14 7 9 3
2 8 1 2 8 1
(c) (d)
Di Berardini, Merelli Algoritmi e Strutture Dati
Heap binari: definizione
Code di priorità
Code di max-priorità tramite heap
Heap-sort
Costruzione di un heap
Costruzione di un heap
4 1 4 1
1 2 3 3 1 2 3 3
2 4 7 5 9 6 10 7 2 4 7 5 9 6 10 7
14 8 8 9 16 10 14 8 8 9 16 10
(a)
4 1 4 1
1 2 3 3 1 2 3 3
2 4 16 5 9 6 10 7 14 4 16 5 9 6 10 7
14 8 8 9 7 10 2 8 8 9 7 10
(b) (c)
Costruzione di un heap
4 1 4 1
1 2 10 3 16 2 10 3
14 4 16 5 9 6 3 7 14 4 7 5 9 6 3 7
2 8 8 9 7 10 2 8 8 9 1 10 (e)
(d)
16 1
14 2 10 3
8 4 7 5 9 6 3 7
2 8 4 9 1 10
Build-Max-Heap(A)
Build-Max-Heap(A)
heap-size[A] ← length[A]
for i ← blength[A]/2c downto 1
do Max-Heapify(A, i)
Build-Max-Heap(A)
Build-Max-Heap(A)
Poniamo
blog
P2 nc blog
P2 nc blog
P2 nc
n n k
f (n) = d 2k+1 ek ≤1 2k
k =n 2k
k=0 k=0 k=0
∞ ∞
k k
P P
≤ n 2k
=n k(1/2)
k=0 k=0
∞ ∞
kx k = x/(1 − x)2 , k(1/2)k = 2 e quindi
P P
poichè
k=0 k=0
blog2 nc
X n
d ek ≤ 2n = O(n)
2k+1
k=0
1
Poniamo m = n/2k ; allora dn/2k+1 e = dm/2e ≤ dm/2e + bm/2c = m = n/2k
Build-Max-Heap(A)
Ricapitolando ...
T (n) = O(n)
Ordinamento di un heap
heap-size
1 2 3 4 5 6 7 8 9 10
A 16 14 10 8 7 9 3 2 4 1 l’elemento massimo è in
posizione 1
1 2 3 4 5 6 7 8 9 10
A 1 14 10 8 7 9 3 2 4 16
1 2 3 4 5 6 7 8 9 10
A 14 8 10 4 7 9 3 2 1 16 ed ... iteriamo
Ordinamento di un heap
1 2 3 4 5 6 7 8 9 10
il secondo elemento
A 14 8 10 4
2 7 9 3 2 4
1 16
più grade è in posizione 1
1 2 3 4 5 6 7 8 9 10
A 14
1 8 10 4
2 7 9 3 2 14
4 16
Heapsort(A)
Heapsort(A)
Build-Max-Heap(A)
for i ← length[A] downto 2
do scambia A[1] ↔ A[i]
heap-size[A] ↔ heap-size[A] − 1
Max-Heapify(A, 1)