Code di Priorità
Algoritmi e Calcolo Parallelo

Prof. Pier Luca Lanzi
Riferimenti

•

•

2

Bertossi Alan A., Montresor Alberto. “Algoritmi e
strutture di dati” (seconda edizione), CittàStudi ...
Code con Priorità

•

•
•

3

Una struttura dati detta heap che mantiene dati in modo
parzialmente ordinato

Code con prio...
Alberi Binari

4

• Albero binario perfetto • Albero binario
 Tutte le foglie hanno la


stessa altezza h
I nodi interni...
Heap = Albero binario completo
che soddisfa la “heap property”
Min-heap: i valori dei nodi sono minori dei valori sui nodi...
Esempio di min-heap e max-heap

Immagini da Wikipedia
http://upload.wikimedia.org/wikipedia/commons/b/bf/Max-heap.png
http...
Come rappresento una (min/max) heap?

7

Due rappresentazioni: alberi binari oppure
array-heap per alberi binari completi
...
Rappresentare un max-heap con un array?

# elementi heap ≤ # elementi array
A[1] contiene la radice
Parent(i) = i/2

Left(...
Gestione delle max-heap
Max-heapify
mantiene la proprietà di max-heap
Build-Max-Heap
costruisce un max-heap da zero
Heapso...
Procedura Max-heapify

•
•

•

10

Heapify(A,i): ripristina la proprietà di Heap nel sottoalbero
radicato in i assumendo c...
Esempio di Heapify(a,i)

•

11

Assumiamo di avere due heap H1 e H2 con radici A[2i] e
A[2i+1] (nel caso di implementazion...
Esempio di Heapify(a,i)

•

12

Assumiamo che il valore v in posizione i violi la proprietà
di heap ovvero, v<A[2i] oppure...
Esempio di Heapify(a,i)

•
•

13

Scambia v in posizione i con la più grande delle radici
Supponiamo ad esempio che A[2i]≥...
Esempio di Heapify(a,i)

•

14

Scambia A[i] con A[2i]

A[i]=x
A[2i]=v

A[2i+1]

H1

H2
Prof. Pier Luca Lanzi
Esempio di Heapify(A,i)

•

•

15

Applica ricorsivamente la procedura di Heapify sul
sottoalbero la cui radice è stata sc...
Pseudocodice Max-Heapify

16

max-heapify(A, i)
l := left(i)
r := right(i)
if (l ≤ A.heapsize and A[l] > A[i])
then max :=...
Procedura Build-Max-Heap()

•

•

17

Principio generale
Sia A[1..N] un array da ordinare
I nodi A[ N/2 +1..N] sono foglie...
Complessità Build-Max-Heap()

•
•

18

Formulazione semplice (Cormen): la procedura maxheapify viene applicata n/2 volte, ...
Heapsort

•

19

Intuizione
Il primo elemento dello heap è sempre il massimo
Andrebbe collocato nell'ultima posizione
L'el...
Animazione Heapsort

Animazione del heapsort da Wikipedia
http://en.wikipedia.org/wiki/Heapsort
http://de.wikipedia.org/wi...
Code di priorità
memorizzano insiemi di oggetti
a cui è associata una priorità
restituisce l’elemento di priorità maggiore...
Operazioni su Code di Max Priorità

•

•
•
•

22

insert(S, x)
inserisce l'elemento x nella coda

maximum(S)
restituisce l...
Complessità?
Max-heapify, nel caso medio, è Θ(log n)
Build-Max-Heap è Θ(n)
Heapsort è Θ(nlog n)
max-heap-insert, heap-extr...
Problemi

•

24

Problema 1: Considerare i valori memorizzati in un vettore,
1 3 20 32 80 15 22 40 60 93 81 42
Rappresenta...
Sommario

•
•
•
•

25

Heap: albero binario completo che soddisfa la heap property
Due implementazioni
Alberi binari
Array...
Code di Priorità in C++

•

•

•

26

Disponibili attraverso la classe priority_queue
Metodi disponibili
empty
size
top
pu...
Upcoming SlideShare
Loading in …5
×

Algoritmi e Calcolo Parallelo 2012/2013 - Code di Priorita'

332
-1

Published on

Slide del corso di Algoritmi e Calcolo Parallelo per il corso di laurea magistrale in Ingegneria Matematica 2012/2013 - Politecnico di Milano

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
332
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \begin{eqnarray*}%x &amp; = &amp; 3\\T(n) &amp; = &amp; O(\sum_{h=0}^{log_2 n} \frac{n}{2^{h+1}} h) \\ &amp; = &amp; O(n \sum_{h=0}^{\infty} \frac{h}{2^{h}} )\\ &amp; = &amp; O(n)\\\end{eqnarray*}
  • Algoritmi e Calcolo Parallelo 2012/2013 - Code di Priorita'

    1. 1. Code di Priorità Algoritmi e Calcolo Parallelo Prof. Pier Luca Lanzi
    2. 2. Riferimenti • • 2 Bertossi Alan A., Montresor Alberto. “Algoritmi e strutture di dati” (seconda edizione), CittàStudi 2010 Stanley B. Lippman, Barbara E. Moo, Josee Lajoie “C++ Primer”, 5th Edition Addison-Wesley Prof. Pier Luca Lanzi
    3. 3. Code con Priorità • • • 3 Una struttura dati detta heap che mantiene dati in modo parzialmente ordinato Code con priorità Gli elementi sono estratti in base alla loro priorità  Heapsort Algoritmo di ordinamento Costo computazionale: O(n log n) Ordinamento sul posto    Prof. Pier Luca Lanzi
    4. 4. Alberi Binari 4 • Albero binario perfetto • Albero binario  Tutte le foglie hanno la  stessa altezza h I nodi interni hanno due figli (sono di grado 2) • Un albero perfetto  Ha altezza log N  Un albero di altezza h, contiene 2h+1-1 Prof. Pier Luca Lanzi completo  Tutte le foglie hanno   profondità h o h-1 Tutti i nodi a livello h sono “accatastati” a sinistra Tutti i nodi interni hanno grado 2, eccetto al più uno
    5. 5. Heap = Albero binario completo che soddisfa la “heap property” Min-heap: i valori dei nodi sono minori dei valori sui nodi figlio ovvero, A[Parent(i)] ≤ A[i] Max-heap: i valori dei nodi sono maggiori dei valori sui nodi figlio ovvero, A[Parent(i)] ≥ A[i] C’è un ordinamento parziale sui valori nei nodi Prof. Pier Luca Lanzi
    6. 6. Esempio di min-heap e max-heap Immagini da Wikipedia http://upload.wikimedia.org/wikipedia/commons/b/bf/Max-heap.png http://upload.wikimedia.org/wikipedia/commons/6/69/Min-heap.png Prof. Pier Luca Lanzi 6
    7. 7. Come rappresento una (min/max) heap? 7 Due rappresentazioni: alberi binari oppure array-heap per alberi binari completi • • • A[1] contiene la radice Parent(i) = i/2 Left(i) = 2i mentre Right(i) = 2i+1 Prof. Pier Luca Lanzi
    8. 8. Rappresentare un max-heap con un array? # elementi heap ≤ # elementi array A[1] contiene la radice Parent(i) = i/2 Left(i) = 2i mentre Right(i) = 2i+1 Prof. Pier Luca Lanzi
    9. 9. Gestione delle max-heap Max-heapify mantiene la proprietà di max-heap Build-Max-Heap costruisce un max-heap da zero Heapsort ordina un array sul posto Prof. Pier Luca Lanzi
    10. 10. Procedura Max-heapify • • • 10 Heapify(A,i): ripristina la proprietà di Heap nel sottoalbero radicato in i assumendo che i suoi sottoalberi destro e sinistro siano già degli Heap Input Un array A e un indice i Gli alberi binari con radici Left(i) e Right(i) sono max-heap Ma l’albero binario con radice i non è un max-heap    Obiettivo Ripristinare la proprietà di max-heap sul sottoalbero con radice i Far “scendere” l'elemento A[i] nell'array   Prof. Pier Luca Lanzi
    11. 11. Esempio di Heapify(a,i) • 11 Assumiamo di avere due heap H1 e H2 con radici A[2i] e A[2i+1] (nel caso di implementazione in un vettore) e un nuovo elemento v in posizione i A[i]=v A[2i] A[2i+1] H1 H2 Prof. Pier Luca Lanzi
    12. 12. Esempio di Heapify(a,i) • 12 Assumiamo che il valore v in posizione i violi la proprietà di heap ovvero, v<A[2i] oppure v<A[2i+1] A[i]=v A[2i] = x A[2i+1] H1 H2 Prof. Pier Luca Lanzi
    13. 13. Esempio di Heapify(a,i) • • 13 Scambia v in posizione i con la più grande delle radici Supponiamo ad esempio che A[2i]≥A[2i+1] A[i]=v A[2i] = x A[2i+1] H1 H2 Prof. Pier Luca Lanzi
    14. 14. Esempio di Heapify(a,i) • 14 Scambia A[i] con A[2i] A[i]=x A[2i]=v A[2i+1] H1 H2 Prof. Pier Luca Lanzi
    15. 15. Esempio di Heapify(A,i) • • 15 Applica ricorsivamente la procedura di Heapify sul sottoalbero la cui radice è stata scambiata In questo caso si riapplica al sottoalbero di radice 2i, ovvero Heapify(A,2i) A[i]=x Heapify(A,2i) A[2i+1] H1 H2 Prof. Pier Luca Lanzi
    16. 16. Pseudocodice Max-Heapify 16 max-heapify(A, i) l := left(i) r := right(i) if (l ≤ A.heapsize and A[l] > A[i]) then max := l else max := i if (r ≤ A.heapsize and A[r] > A[max]) then max := r if max ≠ i then swap(A, i, max) max-heapify(A, max) Prof. Pier Luca Lanzi
    17. 17. Procedura Build-Max-Heap() • • 17 Principio generale Sia A[1..N] un array da ordinare I nodi A[ N/2 +1..N] sono foglie dell'albero e quindi heap di un elemento da cui iniziare   La procedura build-max-heap() attraversa i restanti nodi dell'albero ed esegue max-heapify() build-max-heap(A) A.heapsize := A.length for(i=A.length/2; i>=1; i--) max-heapify(A, i); Prof. Pier Luca Lanzi
    18. 18. Complessità Build-Max-Heap() • • 18 Formulazione semplice (Cormen): la procedura maxheapify viene applicata n/2 volte, ottenendo quindi O(n log n) Formulazione esatta La max-heapify applicata a un nodo di altezza h è O(h) Dato un albero di n elementi, il numero di nodi di altezza h è n/(2h+1), da cui,   Prof. Pier Luca Lanzi
    19. 19. Heapsort • 19 Intuizione Il primo elemento dello heap è sempre il massimo Andrebbe collocato nell'ultima posizione L'elemento in ultima posizione? Viene messo in testa Chiama max-heapify() su n-1 elementi, per ripristinare la situazione     heapsort(A) // array di n elementi build-max-heap(A) for (i=n; n>=2; i--) swap(A, 1, i) A.heapsize := A.heapsize-1 max-heapify(A, 1) Prof. Pier Luca Lanzi
    20. 20. Animazione Heapsort Animazione del heapsort da Wikipedia http://en.wikipedia.org/wiki/Heapsort http://de.wikipedia.org/wiki/Image:Sorting_heapsort_anim.gif Prof. Pier Luca Lanzi 20
    21. 21. Code di priorità memorizzano insiemi di oggetti a cui è associata una priorità restituisce l’elemento di priorità maggiore Esempio: sistema operativo multitasking, i job in esecuzione hanno diverse priorità Implementazione: max-heap Prof. Pier Luca Lanzi
    22. 22. Operazioni su Code di Max Priorità • • • • 22 insert(S, x) inserisce l'elemento x nella coda maximum(S) restituisce l'elemento in S con priorità più alta extract-max(S): rimuove e restituisce l'elemento in S con priorità più alta increase-priority(S, x, k): aumenta la priorità di x al nuovo valore k, dove k>x.p Prof. Pier Luca Lanzi
    23. 23. Complessità? Max-heapify, nel caso medio, è Θ(log n) Build-Max-Heap è Θ(n) Heapsort è Θ(nlog n) max-heap-insert, heap-extract-max, heap-increase-key, ecc. sono O(log n) Prof. Pier Luca Lanzi
    24. 24. Problemi • 24 Problema 1: Considerare i valori memorizzati in un vettore, 1 3 20 32 80 15 22 40 60 93 81 42 Rappresenta una heap? (motivare opportunamente la risposta) • • • Problema 2: Definiamo “invecchiamento” della heap l’operazione con cui è possibile decrementare/incrementare tutte le chiavi della stessa quantità. Esiste un algoritmo banale di complessità Θ(n). Delineare una struttura dati che estendendo il concetto di heap che abbiamo visto permetta di effettuare l’invecchiamento in Θ(1). Problema 3: Scrivere una classe C++ per implementare una coda FIFO utilizzando una heap. Problema 4: Qual è il numero minimo e massimo di una heap di altezza h? (motivare opportunamente la risposta). Prof. Pier Luca Lanzi
    25. 25. Sommario • • • • 25 Heap: albero binario completo che soddisfa la heap property Due implementazioni Alberi binari Array   Tre procedure principali (max o min) Max-heapify: mantiene la proprietà di max-heap Build-Max-Heap: costruisce un max-heap da zero Heapsort: ordina un array sul posto    Code di priorità Memorizzano insiemi di oggetti con una priorità Implementate tipicamente con una max-heap   Prof. Pier Luca Lanzi
    26. 26. Code di Priorità in C++ • • • 26 Disponibili attraverso la classe priority_queue Metodi disponibili empty size top push Pop      Documentazione http://www.cplusplus.com/reference/stl/priority_queue/  Prof. Pier Luca Lanzi

    ×