Upload
phamnga
View
274
Download
10
Embed Size (px)
Citation preview
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Procedimento chiaro e non ambiguo per risolvere correttamente un problema in tempo finito
Cos’è un algoritmo?
• Esempio: algoritmo preparaCaffè
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Cos’è un algoritmo?
• Noi siamo interessati ad algoritmi che risolvono problemi computazionali, cioè che producono, per un dato input, un output che rispetta la relazione definita dal problema considerato.
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
• Gli algoritmi sono alla base dei programmi• Livello di astrazione più alto: concentrarsi
sull’essenza dei problemi, tralasciando dettagli implementativi
• Livello di dettaglio sufficiente a derivare facilmente un programma da un algoritmo
Perché studiare algoritmi?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Pseudocodice
Per mantenere massimo grado di generalità, descriveremo algoritmi in pseudocodice:– ricorda linguaggi di programmazione reali
come C, C++ o Java– può contenere alcune frasi in linguaggio naturale
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Progetto ed analisi di algoritmiVedremo come progettare ed analizzare
(teoreticamente) algoritmi che:• producano risultati corretti• siano efficienti in termini di tempo di
esecuzione ed occupazione di memoria
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
• Analisi teorica più affidabile di quella sperimentale: vale su tutte le possibili istanze di dati su cui l’algoritmo opera
• Ci aiuta a scegliere tra diverse soluzioni allo stesso problema
• Permette di predire le prestazioni del software, prima ancora di scriverne le prime linee di codice
Perché analizzare algoritmi?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Visita guidata al progetto e analisi di algoritmi tramite esempio “giocattolo”:
Calcolo dei numeri di Fibonacci
(problema semplice ma con molte soluzioni)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Leonardo da Pisa (noto anche come Fibonacci) si interessò di molte cose, tra cui il seguente problema (dinamica delle popolazioni):
L’isola dei conigli
Quanto velocemente si espande una popolazione di conigli sotto appropriate condizioni?
In particolare, se partiamo da una coppia di conigli (in un’isola deserta), quante coppie si avranno nell’anno n?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
• Come succede spesso in matematica (l’analisi di algoritmi è matematica), iniziamo con una semplificazione del problema, che ne racchiuda i tratti essenziali
• Il modello può essere in seguito esteso, per renderlo più realistico
Come modellare il problema?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
• Una coppia di conigli genera due coniglietti ogni anno
• I conigli cominciano a riprodursi soltanto al secondo anno dopo la loro nascita
• I conigli sono immortali
Modello e ipotesi sui conigli
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Fn : numero di coppie di conigli presenti nell’anno n
F1 = 1 (una sola coppia)F2 = 1 (troppo giovani per procreare)F3 = 2 (prima coppia di coniglietti)F4 = 3 (seconda coppia di coniglietti)F5 = 5 (prima coppia di nipotini)
Tasso di riproduzione dei conigli
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
L’albero dei conigliLa riproduzione dei conigli può essere descritta da:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
• In generale in un certo anno ci saranno tutte le coppie dell’anno precedente, più una nuova coppia di conigli per ogni coppia presente due anni prima
Regola di espansione
• Abbiamo quindi relazione di ricorrenza:Fn-1 + Fn-2 se n 3≥1 se n = 1,2
Fn =
• Problema algoritmico: come calcoliamo Fn ?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
• Possiamo usare direttamente una soluzione alla relazione di Fibonacci:
Un possibile approccio
dove:
0.618 è la sezione aurea di un segmento
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Algoritmo fibonacci1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
• Qual è l’accuratezza di Φ e Φ necessaria per ottenere un risultato corretto?
• Ad esempio, se usiamo solo 3 cifre decimali:
Correttezza?ˆ
258425832583.118987987986.69816
221.999923Fnarrotondamentofibonacci1(n)n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Algoritmo fibonacci2
algoritmo fibonacci2(intero n) → intero if (n ≤ 2) then return 1 else return fibonacci2(n-1) + fibonacci2(n-2)
Opera solo con numeri interi
Poiché fibonacci1 non dà risultati corretti, come approccio alternativo potremmo utilizzare direttamente la definizione (ricorsiva) :
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
• Quanto tempo richiede fibonacci2 ?• Come misuriamo il tempo?
– in secondi? (dipende da piattaforma)– in istruzioni macchina? (dipende da
compilatore…)• Prima approssimazione:
– numero linee di codice mandate in esecuzione(indipendente da piattaforma e compilatore)
Domande tipiche di questo corso
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Se n ≤ 2, una sola linea di codiceSe n = 3, 4 linee di codice:• 2 per la chiamata fibonacci2(3)• 1 per la chiamata fibonacci2(2)• 1 per la chiamata fibonacci2(1)
Tempo di esecuzione
algoritmo fibonacci2(intero n) → intero if (n ≤ 2) then return 1 else return fibonacci2(n-1) + fibonacci2(n-2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Relazione di ricorrenza
Per n ≥ 3 in ogni chiamata si eseguono 2 linee di codice, oltre a quelle eseguite nelle chiamate ricorsive:
T(n) = 2 + T(n-1) + T(n-2)
A parte il 2, è come per i conigli di Fibonacci!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Relazioni di ricorrenza
In generale, tempo richiesto da algoritmi ricorsivi genera relazioni di ricorrenza
Il tempo di ogni funzione è pari al tempo speso all’interno della chiamata più il tempo speso nelle chiamate ricorsive
Risolvendo la relazione di ricorrenza otteniamo l’espressione del tempo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Alberi della ricorsione• Utile per risolvere relazioni di ricorrenza• Nodi corrispondenti a chiamate ricorsive• Figli di un nodo corrispondenti alle sottochiamate
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Alberi della ricorsione
Per calcolare F(5) :4 nodi interni, 2 linee di codice ciascuno5 foglie, 1 linea di codice ciascuna
Totale = 4 * 2 + 5 * 1 = 13 linee di codice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
• Etichettiamo nodi dell’albero con numero di linee di codice eseguite nella chiamata corrispondente:– ogni nodo interno conta 2– ogni foglia conta 1
Numero di linee di codice per F(n)
• Per calcolare T(n) basta contare nell’albero della ricorsione:– numero di foglie– numero di nodi interni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
• Numero di foglie dell’albero della ricorsione di fibonacci2(n) è pari a F(n)
Calcolare numero di foglie
• Esercizio: dimostrate per induzione che:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
• Dimostreremo per induzione che
Calcolare numero di nodi interni
• Numero di nodi interni di un albero in cui ogni nodo ha zero oppure due figli è pari al numero di foglie - 1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
Induzione sul numero di foglie:
Dimostrazione
• Base. P (1) : 1 foglia, 0 nodi interni. Banale.
• Passo induttivo. P (k) implica P (k+1) Per generare albero con k+1 foglie, attacchiamo due figli ad una (vecchia) foglia
Numero di foglie: k -1 + 2 = k + 1Numero di nodi interni: (k -1) + 1 = k
P (k) : se albero ha k foglie ha (k-1) nodi interni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
Calcolare T(n)
• In totale numero di linee di codice eseguite è F(n) + 2 ( F(n) – 1 ) = 3 F(n) - 2
• Numero di foglie dell’albero della ricorsione di fibonacci2(n) è pari a F(n)
• Numero di nodi interni dell’albero della ricorsione di fibonacci2(n) è pari a F(n) - 1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
fibonacci2 è un algoritmo molto lento:
T(n) ≈ F(n) ≈ Φn
Possiamo fare di meglio?
Perché è lento? Continua a ricalcolare più volte la
soluzione dello stesso sottoproblema!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200431
Per evitare di risolvere più volte lo stesso sottoproblema, memorizziamo la soluzione dei vari sottoproblemi:
Programmazione Dinamica
algoritmo fibonacci3(intero n) → intero sia Fib un array di n interi Fib[1] ← Fib[2] ← 1 for i = 3 to n do Fib[i] ← Fib[i-1] + Fib[i-2] return Fib[n]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200432
Tempo richiesto da fibonacci3algoritmo fibonacci3(intero n) → intero sia Fib un array di n interi Fib[1] ← Fib[2] ← 1 for i = 3 to n do Fib[i] ← Fib[i-1] + Fib[i-2] return Fib[n]
3 linee di codice sono eseguite sempre Prima linea del ciclo eseguita (n-1) volte [ 1 per n=1]Seconda linea del ciclo eseguita (n-2) volte [ 0 per n=1]
T(n) = 3 + n-1 + n-2 = 2n [ T(1) = 3+1 = 4 ]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200433
• 2n molto meglio di 3Fn-2• L’algoritmo fibonacci3 impiega tempo
proporzionale a n piuttosto che esponenziale in n (fibonacci2)
• Tempo effettivo richiesto da implementazioni in C dei due algoritmi su piattaforme diverse:
fibonacci3 vs. fibonacci2
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200434
• Tempo di esecuzione non è sola risorsa che ci interessa.
• Tempo di programmazione e lunghezza del codice (Ingegneria del Software)
• Anche quantità di memoria richiesta può essere cruciale.– Se algoritmo lento, basta attendere più a lungo – Ma se algoritmo richiede più spazio (RAM) di quello
a disposizione, rischiamo di non ottenere mai la soluzione!
Occupazione di memoria
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200435
• fibonacci3 usa un array di dimensione n• In realtà non ci serve mantenere tutti i valori di Fn
precedenti, ma solo gli ultimi due, riducendo lo spazio a poche variabili in tutto:
Algoritmo fibonacci4
algoritmo fibonacci4(intero n) → intero a ← b ← 1 for i = 3 to n do c ← a+b a ← b b ← c return b
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200436
• Misurare T(n) come numero di linee di codice mandate in esecuzione è una misura molto approssimativa del tempo di esecuzione
• Se andiamo a capo più spesso, aumenteranno le linee di codice sorgente, ma certo non il tempo richiesto dall’esecuzione del programma!
Notazione asintotica (1 / 4)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200437
• Per lo stesso programma impaginato diversamente potremmo concludere ad esempio che T(n)=3n oppure T(n)=5n
• Vorremmo un modo per descrivere ordine di grandezza di T(n) ignorando dettagli inessenziali come costanti moltiplicative…
• Useremo a questo scopo la notazione asintotica O
Notazione asintotica (2 / 4)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200438
• Diremo che f(n) = O ( g(n) ) se f(n) ≤ c g(n) per qualche costante c, ed n abbastanza grande
Notazione asintotica (3 / 4)
cg(n)
f(n)
n0 n
f(n) = Ο( g(n) )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200439
• Ad esempio, possiamo rimpiazzare:–T(n)=3Fn con T(n)=O(Fn)–T(n)=2n e T(n)=4n con T(n)=O(n)–T(n)= Fn con O(2n)
Notazione asintotica (4 / 4)
• Notazione O semplifica la vita:–Trascurare dettagli di basso livello–Confrontare facilmente algoritmi –Alg 2 e alg 4 sono O(n): meglio di O(2n) !
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200440
• Possiamo calcolare Fn in tempo inferiore a O(n)?
• E’ semplice dimostrare (per induzione) la seguente proprietà di matrici:
Potenze ricorsive
1 1
1 0
n=
Fn+1 Fn
Fn Fn-1
• Useremo questa proprietà per progettare un algoritmo più efficiente di fibonacci4
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200441
Algoritmo fibonacci5
• Tempo di esecuzione è ancora O(n)• Cosa abbiamo guadagnato?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200442
• Possiamo calcolare la n-esima potenza elevando al quadrato la (n/2)-esima potenza
• Se n è dispari eseguiamo una ulteriore moltiplicazione
• Esempio: calcolare 38
32=9 34 =(9)2 =81 38=(81)2 =6561
Calcolo di potenze
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200443
Algoritmo fibonacci6
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200444
• Tutto il tempo è speso nella funzione potenzaDiMatrice– All’interno della funzione si spende tempo costante– Si esegue una chiamata ricorsiva con input n/2
• L’equazione di ricorrenza è pertanto:
Tempo di esecuzione
T(n) = O(1) + T(n/2)
• Come risolverla?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200445
T(n) ≤ c + T(n/2) ≤ c + c + T(n/4) = 2c + T(n/22)
Metodo dell’iterazione
In generale:
T(n) ≤ c k + T(n/2k)
Per k = log2 n si ottiene
T(n) ≤ c log2 n + T(1) = O(log2 n )
fibonacci6 è quindi esponenzialmente più veloce di fibonacci3!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200446
Riepilogo
fibonacci6
fibonacci5
fibonacci4
fibonacci3
fibonacci2
O(log n)O(n)
O(n)
O(n)
O(2n)
O(log n)O(1)
O(1)
O(n)
O(n)
Tempo di esecuzione
Occupazione di memoria
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200447
1. Progettare algoritmi efficienti cruciale2. Come misurare tempo/spazio?
– metrica indipendente da piattaforme e tecnologie3. In funzione di cosa esprimiamo risorse?
– dimensione dell’input (per Fn non è n ma log n)
4. Come confrontare algoritmi diversi?– stima dell’ordine di grandezza – notazione O
5. Progetto/analisi richiedono strumenti matematici– e.g., relazioni di ricorrenza, induzione, etc…
Cosa abbiamo imparato?
Fabrizio GrandoniAlgoritmi e strutture dati
Capitolo 2Modelli di calcolo e
metodologie di analisi
Algoritmi e Strutture Dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
• f (n) = risorsa (tempo di esecuzione / occupazione di memoria) richiesta da un algoritmo su input di dimensione n
• Notazione asintotica è astrazione utile per descrivere ordine di grandezza di f (n) ignorando dettagli non influenti, come ad esempio costanti moltiplicative e termini di ordine inferiore
Notazione asintotica
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
f (n) = O( g(n) ) se ∃ c > 0 e n0 ≥ 0 tali che f(n) ≤ c g(n) per ogni n ≥ n0
Notazione asintotica O
cg(n)
f(n)
n0 n
f(n) = Ο( g(n) )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
f (n) = Ω( g(n) ) se ∃ c > 0 e n0 ≥ 0 tali che f(n) ≥ c g(n) per ogni n ≥ n0
Notazione asintotica Ω
n0 n
f(n) = Ω( g(n) )f(n)
c g(n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
f (n) = Θ( g(n) ) se ∃ c1,c2 > 0 e n0 ≥ 0 tali che c1 g(n) ≤ f(n) ≤ c2 g(n) per ogni n ≥ n0
Notazione asintotica Θ
n0 n
f(n) = Θ( g(n) )f(n)
c1 g(n)
c2 g(n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Consideriamo g(n) = 3n2 + 10–g(n) = O(n2): basta scegliere c = 4 e n0 = 10–g(n) = Ω(n2): basta scegliere c = 1 e n0 = 0–g(n) = Θ(n2): infatti g(n) = Θ(f(n)) se e solo
se g(n) = Ο(f(n)) e g(n) = Ω(f(n)) –g(n) = O(n3) ma g(n) ≠ Θ(n3)
Notazione asintotica: esempi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Metodi di analisi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Ricerca di elemento x in lista L non ordinata
Ricerca sequenziale
Quanti confronti per trovare x in L ?Dipende da dove si trova x(all’inizio, alla fine, non c’è…)Vorremmo una risposta che non sia “dipende”
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
• Misuriamo risorse di calcolo (tempo di esecuzione / occupazione di memoria) richieste da un algoritmo in funzione della dimensione n dell’istanza d’ingresso
• A parità di dimensione, istanze diverse potrebbero richiedere risorse diverse
• Distinguiamo ulteriormente tra analisi nel caso peggiore, migliore e medio
Caso peggiore, migliore e medio
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
• Sia t (I) il tempo di esecuzione di un algoritmo su istanza I
Tworst(n) = max istanze I, |I| = n t (I)
• Intuitivamente, Tworst(n) è tempo di esecuzione su istanze di ingresso che comportano più lavoro per l’algoritmo
• Dà garanzie sulle prestazioni
Caso peggiore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Tbest(n) = min istanze I, |I| = n t (I)
• Intuitivamente, Tbest(n) è il tempo di esecuzione sulle istanze di ingresso che comportano meno lavoro per l’algoritmo
• Non ci dà molta informazione…
Caso migliore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
• P(I) probabilità di avere in ingresso istanza I
Tavg(n) = ∑ istanze I, |I| = n P(I) t (I)
• Intuitivamente, Tavg(n) è tempo medio di esecuzione (ovvero su istanze di ingresso “tipiche” per il problema)
• Richiede conoscenza di distribuzione statistica dell’input
Caso medio
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Tavg(n) = ∑ istanze I, |I| = n P(I) t (I)
• Ipotesi su distribuzione statistica dell’input?• Possiamo avere algoritmi per cui nessun
input richiede tempo medio (e.g., algoritmo richiede 1 o 100 passi)
• Più importante ma problematico nel definire input “tipico”
Caso medio
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Ricerca di elemento x in lista L non ordinata
Ricerca sequenziale
Tbest(n) = 1 (x è in prima posizione)Tworst(n) = n (x∉L oppure è in ultima posizione)
Tavg(n) = ???
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Tavg(n) = ∑ istanze I, |I| = n P(I) t (I) • Qual è la posizione “tipica” di x?• Ipotesi : se x∈L, potrebbe stare ovunque
P ( pos(x) = i ) = 1/n
Tavg(n) = ∑1,..,n P( pos(x) = i ) i = = ∑1,..,n (1/n) i = (1/n) ∑1,..,n i = = (n+1)/2
Caso medio di ricerca sequenziale
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Ricerca sequenziale
Tbest(n) = 1 x è in prima posizione
Tworst(n) = n x∉L oppure è in ultima posizione
Tavg(n) = (n+1)/2 ipotesi ragionevole: se x∈L, potrebbe stare ovunque
Tavg(n) = p (n+1)/2 + (1-p) n = n - p (n - 1) / 2
ipotesi di prima + P (x∈L) = p
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Ricerca di un elemento x in un array L ordinato
Ricerca Binaria
Confronta x con elemento centrale di L e prosegue a sinistra o a destra in base ad esito del confronto
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Analisi ricerca binaria
Tbest(n) = 1 l’elemento centrale è uguale a x
Tworst(n) = ???
Tavg(n) = ???
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Analisi di algoritmi ricorsivi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
L’algoritmo di ricerca binaria può essere riscritto ricorsivamente come:
Esempio
Come analizzarlo?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Tempo di esecuzione può essere descritto tramite relazioni di ricorrenza:
Relazioni di ricorrenza
c + T( n-1 / 2 ) se n > 11 se n = 1
T(n) =
Vari metodi per risolvere relazioni di ricorrenza: iterazione, sostituzione, teorema Master...
simile a fibonacci6
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Idea: “srotolare” ricorsione, ottenendo sommatoria dipendente solo da dimensione n del problema iniziale
1. Metodo dell’iterazione
Esempio: T(n) = c + T(n/2) T(n/2) = c + T(n/4) ...
T(n) = c + T(n/2) = 2c + T(n/4) = = ( ∑j=1...i c ) + T(n/2i) = i c + T(n/2i)
Per i = log2n: T(n) = c log2 n + T(1) = O(log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Analisi ricerca binaria
Tbest(n) = 1 l’elemento centrale è uguale a xTworst(n) = O( log n ) x∉L oppure viene trovato all’ultimo confronto
Tavg(n) = log n -1+1/n assumendo che le istanze siano equidistribuite
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Idea: “intuire” soluzione, e usare induzione per verificare che la soluzione della relazione di ricorrenza sia effettivamente quella intuita
2. Metodo della sostituzione
Esempio: T(n) = n + T(n/2), con T(1)=1
“Intuiamo” soluzione T(n) ≤ c n per opportuna costante cPasso base. T(1) =1 c 1 per ogni c 1≤ ≥Passo induttivo. T(n) = n + T(n/2) n + c (n/2) = (c/2+1) n ≤T(n) c n se≤ c/2+1 c ovvero per ogni c 2≤ ≥
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
3. Teorema MasterPermette di analizzare algoritmi basati su tecnica del divide et impera:- dividi il problema (di dimensione n) in a sottoproblemi di dimensione n/b- risolvi ricorsivamente i sottoproblemi- ricombina le soluzioni
Sia f(n) tempo per dividere e ricombinare istanze di dimensione n. La relazione di ricorrenza è data da:
a T(n/b) + f (n) se n > 11 se n = 1
T(n) =
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Relazione di ricorrenza:
Teorema Master
ammette soluzione:
a T(n/b) + f (n) se n > 11 se n = 1T(n) =
1. T(n) = Θ(n ) se f (n) = O(n ) per ε > 0logba logba - ε
2. T(n) = Θ(n log n) se f (n) = Θ(n ) logba logba
3. T(n) = Θ(f(n)) se f (n) = Ω(n ) per ε > 0 e a f (n/b) c≤ f (n) per c < 1 e n sufficientemente grande
logba + ε
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Teorema Master
Confronta le due funzioni n e f (n) :
a T(n/b) + f (n) se n > 11 se n = 1T(n) =
1. T(n) = Θ(n ) se “vince” n
logba logba
2. T(n) = Θ( f (n) log n ) se f (n) = Θ(n ) logba
3. T(n) = Θ( f (n) ) se “vince” f (n)
logba
N.B. nei casi 1. e 3. T(n) = Θ( f (n) + n ) logba
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
1) T(n) = n + 2 T(n/2) a = 2, b = 2, f(n) = n = Θ(n ) T(n) = Θ(n log n) (Caso 2 del Teorema Master)
Esempi
log22
2) T(n) = c + 3 T(n/9) a = 3, b = 9, f(n) = c = Ο(n ) T(n) = Θ(√n) (Caso 1 del Teorema Master)
log93 - ε
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
Esempi3) T(n) = n + 3 T(n/9) a = 3, b = 9, f(n) = n = Ω(n ) (Caso 3 del Teorema Master)
log93 + ε
T(n) = Θ(n)3(n/9) c n per c = 1/3≤
4) T(n) = n log2 n + 2 T(n/2) Il Teorema Master non può essere applicato! f (n) = n log2 n = Ω ( n ) = Ω ( n ) f (n) = n log2 n non è Ω ( n ) = Ω ( n )
log22 + ε
log22ε
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
Dimostrazione Teorema Master
a T(n/b) + f (n) se n > 11 se n = 1T(n) =
1. T(n) = Θ(n ) se f (n) = O(n ) per ε > 0logba logba - ε
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200431
T(n) = a T(n/b) + f (n) = a2 T(n/b2) + a f (n/b) + f (n) =
= a3 T(n/b3) + a2 f (n/b2) + a f (n/b) + f (n) =
= Σ i=0,…, log n ai f (n/bi)b
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200432
T(n) = Σ i=0,…, log n ai f (n/bi)b
f (n) = O(n )logba - ε
ai f (n/bi) = O( ai (n/bi ) ) =logba - ε
logba - ε= O ( n ( a b / b ) ) = ε logba i
logba - ε= O ( n (b ) ) ε i
T(n) = Σ logba - ε O ( n (b ) ) ε i= O ( n Σ ( b ) )
logba - ε ε i
= O ( n ( n ) )logba - ε ε = O ( n ) logba= …
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200433
• Esprimiamo quantità di una certa risorsa di calcolo (tempo, spazio) usata da un algoritmo in funzione della dimensione n dell’istanza di ingresso
• La notazione asintotica permette di esprimere quantità di risorsa usata dall’algoritmo in modo sintetico, ignorando dettagli non influenti
• A parità di dimensione n dell’istanza di ingresso, quantità di risorsa usata può essere diversa, da cui caso peggiore, caso medio
• Quantità di risorsa usata da algoritmi ricorsivi può essere espressa tramite relazioni di ricorrenza, risolvibili tramite metodi generali
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Capitolo 3Strutture dati elementari
Algoritmi e Strutture Dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Gestione di collezioni di oggetti
Tipo di dato:– Specifica delle operazioni di interesse su
una collezione di oggetti (es. inserisci, cancella, cerca)
Struttura dati:– Organizzazione dei dati che permette di
supportare le operazioni di un tipo di dato usando meno risorse di calcolo possibile
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Il tipo di dato Dizionario
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Il tipo di dato Pila
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Il tipo di dato Coda
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Tecniche di rappresentazione dei dati
Rappresentazioni indicizzate:– I dati sono contenuti in array
Rappresentazioni collegate:– I dati sono contenuti in record collegati fra
loro mediante puntatori
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Pro e contro
Rappresentazioni indicizzate:– Pro: accesso diretto ai dati mediante indici– Contro: dimensione fissa (riallocazione
array richiede tempo lineare)
Rappresentazioni collegate:– Pro: dimensione variabile (aggiunta e
rimozione record in tempo costante)– Contro: accesso sequenziale ai dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Esempi di strutture collegate
Lista semplice
Lista doppiamentecollegata
Lista circolaredoppiamentecollegata
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
AlberiOrganizzazione gerarchica dei dati
Dati contenuti nei nodi, relazioni gerarchichedefinite dagli archi che li collegano
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Rappresentazioni collegate di alberi
Rappresentazionecon puntatori ai figli (nodi con numero limitato di figli)
Rappresentazionecon liste di puntatori ai figli (nodi con numero arbitrario di figli)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Rappresentazioni collegate di alberi
Rappresentazionedi tipo primo figlio-fratello successivo (nodi con numero arbitrario di figli)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Visite di alberi
Algoritmi che consentono l’accesso sistematico ai nodi e agli archi di un albero
Gli algoritmi di visita si distinguono in base al particolare ordine di accesso ai nodi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Algoritmo di visita genericavisitaGenerica visita il nodo r e tutti i suoi discendenti in un albero
Richiede tempo O(n) per visitare un albero con n nodi a partire dalla radice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Algoritmo di visita in profondità
L’algoritmo di visita in profondità (DFS) parte da r e procede visitando nodi di figlio in figlio fino a raggiungere una foglia. Retrocede poi al primo antenato che ha ancora figli non visitati (se esiste) e ripete il procedimento a partire da uno di quei figli.
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Algoritmo di visita in profondità
Versione iterativa (per alberi binari):
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Algoritmo di visita in profondità
Versione ricorsiva (per alberi binari):
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Algoritmo di visita in ampiezza
L’algoritmo di visita in ampiezza (BFS) parte da r e procede visitando nodi per livelli successivi. Un nodo sul livello i può essere visitato solo se tutti i nodi sul livello i-1 sono stati visitati.
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Algoritmo di visita in ampiezza
Versione iterativa (per alberi binari):
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
• Nozione di tipo di dato come specifica delle operazioni su una collezione di oggetti
• Rappresentazioni indicizzate e collegate di collezioni di dati: pro e contro
• Organizzazione gerarchica dei dati mediante alberi
• Rappresentazioni collegate classiche di alberi• Algoritmi di esplorazione sistematica dei nodi di
un albero (algoritmi di visita)
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S
Ordinamento
• Subroutine di molti problemi
• E’ possibile effettuare ricerche in array ordinati in tempo O(log n)
• Esempi: ordinare alfabeticamente lista di nomi, o insieme di numeri, o insieme di compiti d’esame in base a cognome studente
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
• Numerosi algoritmi• Tre tempi tipici: O(n2), O(n log n), O(n)
Algoritmi e tempi tipici
n
n log2 n
n2
10
~ 33
100
100
~ 665
104
1000
106
106
~ 2 · 107
1012
109
1018
~ 104 ~ 3 · 1010
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Algoritmi di ordinamento
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
SelectionSort
1 2 4 5 3 7
7 2 4 5 3 1
1 2 4 5 3 7
1 2 3 5 4 7
1 2 3 4 5 7
1 2 3 4 5 7
1 2 3 4 5 7
Approccio incrementale. Estende ordinamento da k a (k+1) elementi, scegliendo minimo tra (n-k) elementi non ancora ordinati e mettendolo in posizione (k+1)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
SelectionSort: analisi
k - esima estrazione di minimo costa tempo O(n-k)
In totale, il tempo di esecuzione è:
∑k=1
n-1
O(n-k) ∑i=1
n-1
i= ( O ) = O(n2)
[ cambiamento di variabile (i = n – k) e serie aritmetica ]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
InsertionSort
2 7 4 5 3 1
7 2 4 5 3 1
2 4 7 5 3 1
2 4 5 7 3 1
2 3 4 5 7 1
1 2 3 4 5 7
Approccio incrementale. Estende ordinamento da k a (k+1) elementi, posizionando elemento (k+1)-esimo nella posizione corretta rispetto ai primi k elementi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
InsertionSort: analisi
Inserimento del k-esimo elemento nella posizione corretta rispetto ai primi k richiede tempo O(k) nel caso peggiore
In totale, il tempo di esecuzione è :
∑k=1
n-1
k( O ) = O(n2)
[ serie aritmetica ]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
BubbleSort• Esegue una serie di scansioni dell’array
– In ogni scansione confronta coppie di elementi adiacenti, scambiandoli se non sono nell’ordine corretto
– Dopo una scansione in cui non viene effettuato nessuno scambio l’array è ordinato
• Dopo la k-esima scansione, i k elementi più grandi sono correttamente ordinati ed occupano le k posizioni più a destra correttezza e tempo di esecuzione O(n2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Esempio di esecuzione
2 4 5 3 1 7
7 2 4 5 3 1
2 4 3 1 5 7
724 7
75731 7
424 5
5351
2 4 3 1 5 7
2 3 1 4 5 7
2 1 3 4 5 7
1 2 3 4 5 7
423 4
41
321 3
21
(1)
(2)
(3)
(4)
(5)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Possiamo fare di meglio ?
O( n2 ) è quanto di peggio si possa fare: tutti i confronti possibili!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
1. QuickSort2. MergeSort3. HeapSort
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
• Usa la tecnica del divide et impera:
1 Divide: scegli un elemento x della sequenza (pivot) e partiziona la sequenza in elementi ≤ x ed elementi > x
2 Risolvi i due sottoproblemi ricorsivamente3 Impera: restituisci la concatenazione delle
due sottosequenze ordinate
QuickSort
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Partizione in loco
• Scorri l’array “in parallelo” da sinistra verso destra e da destra verso sinistra – da sinistra verso destra, ci si ferma su un elemento
maggiore del pivot– da destra verso sinistra, ci si ferma su un elemento
minore del pivot• Scambia gli elementi e riprendi la scansione
Tempo di esecuzione: O(n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Partizione in loco: un esempio
45 12 21 3 67 43 85 29 24 92 63 3 93
45 12 21 3 3 43 85 29 24 92 63 67 93
45 12 21 3 3 43 2924 92 63 67 9385
45 12 93 3 67 43 85 29 24 92 63 3 21
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
• Nel caso peggiore, il pivot scelto ad ogni passo è il minimo o il massimo degli elementi nell’array
• Il numero di confronti nel caso peggiore è :C(n) = C(n-1) + O(n)
• Risolvendo per iterazione si ottiene C(n) = O(n2)
Analisi nel caso peggiore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Esempio di esecuzione
5 1 276
2 45 7 6
1 4 3
3
1 2 3 4 5 5 6 7
1 2 3 4 6
1 3 4
3
input
output
2 45 3 1 7 6 dopo partition5
3 1
5
2 631 4
5
5
43 5
3
5
5
5
1
6
6
6
5
45
77
3
L’albero delle chiamate ricorsive può essere sbilanciato
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Randomizzazione• Possiamo evitare il caso peggiore scegliendo
come pivot un elemento a caso• Poiché ogni elemento ha la stessa probabilità,
pari a 1/n, di essere scelto come pivot, il numero di confronti nel caso atteso è:
∑a=0
n-1
C(n)= n-1+C(a)+C(n-a-1)1n ∑
a=0
n-1
= n-1+ C(a)2n
dove a e (n-a-1) sono le dimensioni dei sottoproblemi risolti ricorsivamente
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
La relazione di ricorrenza
Analisi nel caso medio
∑a=0
n-1
C(n)= n-1+ C(a)2n
ha soluzione C(n) ≤ 2 n log n
Dimostrazione per sostituzioneAssumiamo per ipotesi induttiva che C(i) ≤ 2 i log i
∑i=0
n-1
C(n) n-1+≤ 2 i log i2n ∫
2
n
≤n-1+ x log x dx4n
Integrando per parti si dimostra che C(n) ≤ 2 n log n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Usiamo la tecnica del divide et impera:
1 Divide: dividi l’array a metà2 Risolvi il sottoproblema ricorsivamente3 Impera: fondi le due sottosequenze ordinate
MergeSort
Rispetto a QuickSort, divide semplice ed impera complicato
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
• Due array ordinati A e B possono essere fusi rapidamente:– estrai ripetutamente il minimo di A e B e copialo
nell’array di output, finché A oppure B non diventa vuoto
– copia gli elementi dell’array non vuoto alla fine dell’array di output
• Tempo: O(n), dove n è il numero totale di elementi
Fusione (Merge)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Mergesort: esempio di esecuzione7 2 4 5 3 1 5 6
7 2 4 5 3 1 5 6
7 2 4 5 3 1 5 6
7 2 4 5 3 1 5 6
1 2 3 4 5 5 6 7
2 4 5 7 1 3 5 6
2 7 4 5 1 3 5 6
7 2 4 5 3 1 5 6
input
output
Input ed output delle
chiamatericorsive
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
• Numero di confronti del MergeSort descritto da relazione di ricorrenza:
C(n) = 2 C(n/2) + O(n)
• Da Teorema Master si ottiene la soluzione
C(n) = O(n log n)
Tempo di esecuzione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
• Stesso approccio incrementale del SelectionSort• Usa però struttura dati più efficiente per estrarre
massimo ad ogni iterazione
• Struttura dati heap associata ad insieme S : albero binario radicato con le seguenti proprietà:1) completo fino al penultimo livello2) elementi di S memorizzati nei nodi dell’albero3) chiave(padre(v)) ≥ chiave(v) per ogni nodo v
HeapSort
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Struttura dati heap
37
22 31
14251513
37 912
37 22 31 13 15 25 14 7 3 12 9
vettore posizionale
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Rappresentazione ad albero e con vettore posizionale
sin(i) = 2ides(i) = 2i+1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Heap con struttura rafforzata
37
22 31
14251513
37 912
37 22 31 13 15 25 14 7 3 12 9
vettore posizionale
0 1 2 3 4 5 6 7 8 9 10 11
Le foglie nell’ultimo livello sono compattate a sinistra
Il vettoreposizionale haesattamente dimensione n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Proprietà salienti degli heap
1) Il massimo è contenuto nella radice
2) L’albero ha altezza O(log n)
1) Gli heap con struttura rafforzata possono essere rappresentati in un array di dimensione n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
fixHeap(nodo v, heap H)
if (v è una foglia) then return
else
sia u il figlio di v con chiave massima
if ( chiave(v) < chiave(u) ) then
scambia chiave(v) e chiave(u)
fixHeap(u,H)
La procedura fixHeapSe tutti i nodi di H tranne v soddisfano la proprietà di ordinamento a heap, possiamo ripristinarla come segue:
Tempo di esecuzione: O(log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
• Copia nella radice la chiave contenuta nella la foglia più a destra dell’ultimo livello
• Rimuovi la foglia
• Ripristina la proprietà di ordinamento a heap richiamando fixHeap sulla radice
Estrazione del massimo
Tempo di esecuzione: O(log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
heapify(heap H)
if (H è vuoto) then return
else
heapify(sottoalbero sinistro di H)
heapify(sottoalbero destro di H)
fixHeap(radice di H,H)
Costruzione dell’heapAlgoritmo ricorsivo basato su divide et impera
Tempo di esecuzione: T(n) = 2 T(n/2) + O(log n)
T(n) = O(n) dal Teorema Master
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200431
• Costruisci un heap tramite heapify
• Estrai ripetutamente il massimo per (n-1) volte– ad ogni estrazione memorizza il massimo
nella posizione dell’array che si è appena liberata
HeapSort
ordina “in loco” in tempo O(n log n)
O(n)
O(n log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200432
Esempio di esecuzione
37 31 22 13 15 25
37
31
251513
22
22
15 13
22 15 13 25 31 37
(1)
(4)
31
25
1513
22
31 25 22 13 15 37
15
13
15 13 22 25 31 37
(2)
(5)
25
15
13
22
25 15 22 13 31 37
13
13 15 22 25 31 37
(3)
(6)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200433
Possiamo fare meglio di O(n log n)?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200434
• Dimostrazione (matematica) che non possiamo andare più veloci di una certa quantità
• Più precisamente, ogni algoritmo all’interno di un certo modello di calcolo deve avere tempo di esecuzione almeno pari a quella quantità
• Non significa necessariamente che non è possibile fare di meglio (basta cambiare il modello…)
Lower bound
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200435
• Delimitazione inferiore: quantità di risorsa necessaria per risolvere un determinato problema
• Dimostrare che Ω(n log n) è lower bound al numero di confronti richiesti per ordinare n oggetti.
• Come?
• Dobbiamo dimostrare che tutti gli algoritmi richiedono Ω(n log n) confronti!
Lower bound
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200436
• In questo modello, per ordinare è possibile usare solo confronti tra oggetti
• Primitive quali operazioni aritmetiche (somme o prodotti), logiche (and e or), o altro (shift) sono proibite
• Sufficientemente generale per catturare le proprietà degli algoritmi più noti
Modello basato su confronti
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200437
• Consideriamo un qualsiasi algoritmo A, che ordina solo mediante confronti
• Non abbiamo assolutamente idea di come funziona A !
• Ciò nonostante, dimostreremo che A deve eseguire almeno Ω(n log n) confronti
• Dato che l’unica ipotesi su A è che ordini mediante confronti, il lower bound sarà valido per tutti gli algoritmi basati su confronti!
Come dimostrare lower bound
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200438
Alberi di decisione• Strumenti per rappresentare algoritmi di
ordinamento• Descrivono sequenza di confronti che un
algoritmo esegue su istanze di lunghezza n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200439
Alberi di decisione
• Ogni algoritmo basato su confronti può essere rappresentato da un albero di decisione:– confronti scelti dall’algoritmo possono dipendere solo
dagli esiti dei confronti precedenti!• Un albero di decisione può essere “letto” come
algoritmo basato su confronti:– per ogni input, il cammino nell’albero descrive confronti
da effettuare e permutazione che produce soluzione
= algoritmi basati su confronti!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200440
• Per una particolare istanza, i confronti eseguiti da A su quella istanza sono rappresentati da un cammino radice - foglia
• Il numero di confronti nel caso peggiore è pari all’altezza dell’albero di decisione
• Un albero di decisione per l’ordinamento di n elementi contiene almeno (n!) foglie
(una per ogni possibile permutazione degli n oggetti)
Proprietà alberi di decisione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200441
• Un albero binario con k foglie tale che ogni nodo interno ha esattamente due figli ha altezza almeno log2 k
• Dimostrazione per induzione su k:– Passo base: 0 ≥ log2 1– h(k) ≥ 1 + h(k/2) poiché uno dei due sottoalberi ha
almeno metà delle foglie– h(k/2) ≥ log2 (k/2) per ipotesi induttiva
– h(k) ≥ 1 + log2 (k/2) = log2 k
Lower bound
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200442
• L’albero di decisione ha almeno n! foglie
• La sua altezza è almeno log2 (n!)
• Formula di Stirling: n! ≥ (2πn)1/2 · (n/e) n
• Quindi: log2 (n!) = Ω (n log n)
Il lower bound Ω (n log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200443
Ordinamenti lineari(per dati con proprietà particolari)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200444
Sappiamo che gli n elementi da ordinare sono tutti distinti e nell’intervallo [1,n]
In quanto tempo possiamo ordinarli?
O(1)
Contraddice il lower bound?
No. Perché?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200445
IntegerSort: fase 1
(a) Calcolo di Y
X
Y 0 00 0 1 0 00
5 6861
1 2 3 4 5 6 7 8
1 00 0 1 0 11
5 6861
1 2 3 4 5 6 7 8
X
Y
1 00 0 1 0 00
5 6861
1 2 3 4 5 6 7 8
5 686
1 00 0 1 0 12
1
1 2 3 4 5 6 7 8
1 00 0 1 0 01
5 6861
1 2 3 4 5 6 7 8
Meno banale: ordinare n interi con valori in [1,k]
Mantieni array Y di k contatori tale che Y[x] = numero di occorrenze di x
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200446
IntegerSort: fase 2
(b) Ricostruzione di X
X
Y 1 00 0 1 0 12
1
1 2 3 4 5 6 7 8
X
Y 0 00 0 0 0 12
51 6 6
1 2 3 4 5 6 7 8
0 00 0 1 0 12
1
1 2 3 4 5 6 7 8
0 00 0 0 0 10
51 6 6
1 2 3 4 5 6 7 8
0 00 0 1 0 12
1 5
1 2 3 4 5 6 7 8
0 00 0 0 0 10
1 5 8
1 2 3 4 5 6 7 8
6 6
Scandisci Y da sinistra verso destra. Se Y[x] = k, scrivi in X il valore x per k volte
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200447
• O(k) per inizializzare contatori a 0• O(n) per calcolare valori dei contatori• O(n + k) per ricostruire sequenza ordinata
IntegerSort: analisi
O(n + k)
Tempo lineare se k = O(n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200448
BucketSort
Per ordinare n record con chiavi intere in [1,k]
• Basta mantenere un array di liste, anziché di contatori, ed operare come per IntegerSort
• La lista Y[x] conterrà gli elementi con chiave uguale a x
• Concatenare poi le liste
Tempo O(n + k) come per IntegerSort
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200449
• Un algoritmo è stabile se preserva ordine iniziale tra elementi uguali (stessa chiave)
• QuickSort è stabile se la partizione lo rende stabile
• MergeSort è stabile se divisione lo rende stabile (pari e dispari non lo rende stabile)
• HeapSort non è stabile• BucketSort può essere reso stabile appendendo
gli elementi di X in coda alla opportuna lista Y[i]
Stabilità
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200450
• Cosa fare se k > n, ad esempio k = Θ(nc)?• Rappresentiamo gli elementi in base b, ed
eseguiamo una serie di BucketSort
• Procediamo dalla cifra meno significativa a quella più significativa
RadixSort
239743685924
592423974368
592443682397
436823975924
239743685924
Per b=10
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200451
• Se x e y hanno una diversa t-esima cifra, la t-esima passata di BucketSort li ordina
• Se x e y hanno la stessa t-esima cifra, la proprietà di stabilità del BucketSort li mantiene ordinati correttamente
Correttezza
Dopo la t-esima passata di BucketSort, i numeri sono correttamente ordinati rispetto alle t cifre meno significative
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200452
• O(logb k) passate di bucketsort• Ciascuna passata richiede tempo O(n + b)
Tempo di esecuzione
O( (n + b) logb k)
Se b = Θ(n), si ha O(n logn k) = O nlog klog n
Tempo lineare se k = O(nc), c costante
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200453
• Nuove tecniche algoritmiche:– Incrementale (SelectionSort, InsertionSort)– Divide et impera (MergeSort, QuickSort)– Plug in di strutture dati efficienti (HeapSort)– Randomizzazione (QuickSort)
• Alberi di decisione per dimostrare lower bound• Sfruttare proprietà dei dati in ingresso (fuori dal
modello) per progettare algoritmi più efficienti: algoritmi lineari
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Capitolo 5Selezione e statistiche di ordine
Algoritmi e Strutture Dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Problemi di statistiche d’ordine• Estrarre da grandi quantità di dati un piccolo insieme di
indicatori che ne rappresentino caratteristiche statisticamente salienti
• Esempi: minimo, massimo, media, moda (valore più frequente), mediano.
Selezione (k,n): Dati insieme di n elementi ed intero k ∈ [1,n], trovare elemento che occuperebbe la k-esima posizione se l’insieme fosse ordinato
• Mediano: selezione per k = n/2
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
• Ordina gli elementi, poi restituisci quello in posizione k : O(n log n)
• Costruisci un heap, ed estrai il minimo per k volte: O(n + k log n)
Selezione: approcci naïf
O(n) se k = O(n/log n) … ma non risolve problema del mediano in tempo lineare!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Calcolo randomizzato del mediano (con numero atteso di confronti lineare )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
1. Divide: scegli pivot x e partiziona in elementi ≤ x ed elementi > x
2. Risolvi due sottoproblemi (QuickSort)3. Impera: concatena sottosequenze ordinate4. Restituisci k-esimo elemento nella sequenza
Usare QuickSort?
Numero atteso di confronti O(n log n)
Possiamo fare di meglio?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
1. Divide: scegli pivot x e partiziona in elementi ≤ x ed elementi > x
2. Risolvi UN SOTTOPROBLEMA (QuickSort)
3. Impera: concatena sottosequenze4. Restituisci k-esimo elemento nella sequenza
Usare QuickSort?
Numero atteso di confronti: ancora O(n log n)
Possiamo fare di meglio?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
1. Divide: scegli pivot x e partiziona in elementi ≤ x ed elementi > x
2. Risolvi un solo sottoproblema (RICORSIVAMENTE)
QuickSelect
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
QuickSelect
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
• Nel caso peggiore, pivot scelto ad ogni passo è minimo o massimo degli elementi nell’array
• Numero di confronti nel caso peggiore è:C(n) = C(n-1) + O(n)
• Risolvendo per iterazione si ottiene C(n) = O(n2)
Analisi nel caso peggiore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
QuickSelect Randomizzato
• Come per QuickSort, possiamo evitare caso peggiore scegliendo pivot a caso
• Ad ogni passo eliminiamo almeno |A2| + min |A1|, |A3| elementi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Numero atteso di confronti:• Relazione di ricorrenza dipenderà da k e da n• Difficile da risolvere• Ci aspettiamo caso più difficile per k = n/2
Analisi di QuickSelect
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
• Maggior numero di confronti in QuickSelect si ha per k = n/2 , ovvero nel caso del mediano
Intuizione
A1 A3
k
< x > x
A1 A3
k
< x > x
A1 A3
k
< x > x
(a)
(b)
(c)
n/2
n/2
n/2
Per k < n/2 ci sono maggiori possibilità di ricorrere sul più piccolo dei due insiemi A1 e A3
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Analisi di QuickSelect Randomizzato• Ad ogni passo eliminiamo almeno |
A2| + min |A1|, |A3| elementi• Ogni elemento ha stessa probabilità di essere
scelto come pivot: probabilità di ricorrere su array di dimensione i∈[n/2,n-1] è 2/n
• Numero di confronti nel caso atteso è quindi:
C(n) = ∑i=n/2
n-1
n-1+ C(i)2n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Analisi di QuickSelect Randomizzato
C(n) = ∑i=n/2
n-1
n-1+ C(i)2n
≤ ∑i=n/2
n-1
n-1+ A i 2n
Dimostriamo per sostituzione che C(n) A n≤
≤ ∑i=n/2
n-1
n-1+ i A2n
≤ ∑i=1
n-1
n-1+ i - A2n ∑
i=1
n/2-1
i ( )
≤ n-1+ 2n (A n2
2 - n2
8 - n4 ) = ( 1 + 3A
4 ) n -1- A2
≤ ( 1 + 3A4 ) n
C(n) A n ≤ se ( 1 + 3A4 ) A≤ A ≥ 4ovvero
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Relazione di ricorrenza del QuickSelect ha soluzione
Numero atteso di confronti
C(n) ≤ 4 n
Il numero atteso di confronti di QuickSelect è lineare
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Per convergere rapidamente, scegli il pivot il più vicino possibile al k-esimo (dal lato giusto)
Algoritmo usato in pratica
Come?
Scegli un campione opportuno (m elementi)
Scegli il pivot come il j-esimo degli m elementi:
j = k δmn
+-
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Calcolo deterministico del mediano (con un numero lineare di confronti nel
caso peggiore)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Segui l’idea dell’algoritmo usato in pratica
Algoritmo deterministico
Scegli un campione deterministico (non casuale)
Scegli il pivot come il mediano del campione
“Derandomizzare” l’algoritmo randomizzato
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Algoritmo deterministico: dettagli
1. Scegli n/5 quintuple2. Per ogni quintupla calcola il mediano3. Il campione è definito dai mediani delle
quintuple4. Calcola (ricorsivamente) il pivot come
mediano dei mediani 5. Prosegui ricorsivamente (come per
l’algoritmo randomizzato)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Select
Calcolo deterministico del pivot tramite una chiamata ricorsiva (riga 6)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Mediano dei mediani
• Mediano di 5 elementi può essere calcolato con al più 7 confronti l’implementazione della riga 5 richiede (7/5) n confronti (ordinando i 5 elementi)
• Pivot M è mediano dei mediani mi dei n/5 gruppi di 5 elementi
• La riga 6 è una chiamata ricorsiva su n/5 elementi
• La partizione (righe 7-10) richiede n-1 confronti
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Seconda chiamata ricorsiva
• La chiamata ricorsiva nella riga 11 (riga 12) viene effettuata su un insieme contenente al più 7n/10 +3 elementi
...
.........
......
n/5 mediani
dei gruppi di 5 3
n/10
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Algoritmo deterministico: analisi
1. Scegli n/5 quintuple2. Per ogni quintupla calcola mediano3. Campione definito da mediani delle
quintuple4. Calcola (ricorsivamente) il pivot come
mediano dei mediani 5. Partiziona intorno al pivot6. Prosegui ricorsivamente (come per
l’algoritmo randomizzato)
(7/5) n
n-1
T( n/5 )
T( (7/10) n )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Analisi
• La seguente relazione di ricorrenza descrive il numero di confronti eseguiti da select nel caso peggiore:
T(n) (12/5) n + T( n/5 ) + T( (7/10) n )≤
• La relazione di ricorrenza ha soluzione T(n) = O(n)
Facile dimostrare per sostituzione che T(n) ≤ c n per c ≥ 24
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
• Abbiamo risolto il problema del calcolo del mediano studiandone una generalizzazione, ovvero il calcolo del k-esimo elemento per k ∈ [1,n]
• A volte problema più generale più semplice da risolvere del problema originario (dà più facilmente luogo a sottoproblemi ricorsivi)
• Il problema della selezione può essere risolto in tempo lineare, sia con algoritmi randomizzati che con algoritmi deterministici
• L’algoritmo randomizzato, sebbena richieda tempo O(n2) nel caso peggiore, è più efficiente in pratica
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Dizionari
• Gli alberi di ricerca sono usati per realizzare in modo efficiente il tipo di dato dizionario
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Alberi binari di ricerca(BST = binary search tree)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Definizione
Albero binario che soddisfa le seguenti proprietà– ogni nodo v contiene un elemento elem(v) cui è
associata una chiave chiave(v) presa da un dominio totalmente ordinato
– le chiavi nel sottoalbero sinistro di v sono tutte ≤ chiave(v)
– le chiavi nel sottoalbero destro di v sono tutte ≥ chiave(v)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Albero binario di ricerca
Esempi
Albero binario NON di ricerca
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
search(chiave k) -> elem Traccia cammino nell’albero partendo da radice:
su ogni nodo, usa proprietà di ricerca per decidere se proseguire nel sottoalbero sinistro o destro
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
insert(elem e, chiave k)
1. Crea un nuovo nodo u con elem = e e chiave = k
3. Cerca la chiave k nell’albero, identificando così il nodo v che diventerà padre di u
4. Appendi u come figlio sinistro/destro di v in modo che sia mantenuta la proprietà di ricerca
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Ricerca del massimo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Ricerca del predecessore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
delete(elem e)
Sia u il nodo contenente l’elemento e da cancellare:
1) u è una foglia: rimuovila
2) u ha un solo figlio:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
delete(elem e)3) u ha due figli: sostituiscilo con il predecessore
(v) e rimuovi fisicamente il predecessore (che ha un solo figlio)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
• Tutte le operazioni hanno costo O(h) dove h è l’altezza dell’albero
• O(n) nel caso peggiore (alberi molto sbilanciati e profondi)
Costo delle operazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Alberi AVL(Adel’son-Vel’skii e Landis)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Definizioni
Alberi AVL = alberi binari di ricerca bilanciati in altezza
Un albero si dice bilanciato in altezza se ogni nodo v ha fattore di bilanciamento ≤ 1
Fattore di bilanciamento di un nodo v = | altezza sottoalbero sinistro di v - altezza sottoalbero destro di v |
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Altezza di alberi AVL
Idea della dimostrazione: tra tutti gli AVL di altezza h, consideriamo quelli con minimo numero di nodi nh
(alberi di Fibonacci)
Si può dimostrare che un albero AVL con n nodi ha altezza O(log n)
Si ha: nh= 1 + nh-1 + nh-2 = Fh+3-1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Implementazione delle operazioni
• L’operazione search procede come in un BST
• Ma inserimenti e cancellazioni potrebbero sbilanciare l’albero
• Manteniamo il bilanciamento tramite opportune rotazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Rotazione di base
• Mantiene la proprietà di ricerca• Richiede tempo O(1)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Ribilanciamento tramite rotazioni• Le rotazioni sono effettuate su nodi sbilanciati• Sia v un nodo con fattore di bilanciamento ≥ 2• Esiste un sottoalbero T di v che lo sbilancia• A seconda della posizione di T si hanno 4 casi:
• I quattro casi sono simmetrici (a coppie)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Rotazione SS• Applicare una rotazione semplice verso destra
su v• L’altezza dell’albero coinvolto nella rotazione
passa da h+3 a h+2
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Rotazione SD• Applicare due rotazioni semplici: una sul
figlio del nodo critico, l’altra sul nodo critico • L’altezza dell’albero coinvolto nella rotazione
passa da h+3 a h+2
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
insert(elem e, chiave k)1. Crea un nuovo nodo u con elem=e e chiave=k2. Inserisci u come in un BST3. Ricalcola i fattori di bilanciamento dei nodi
nel cammino dalla radice a u: sia v il più profondo nodo con fattore di bilanciamento pari a ±2 (nodo critico)
4. Esegui una rotazione opportuna su v
• N.B.: una sola rotazione è sempre sufficiente, poiché l’altezza dell’albero coinvolto diminuisce di 1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
delete(elem e)1. Cancella il nodo come in un BST2. Ricalcola i fattori di bilanciamento dei nodi
nel cammino dalla radice al padre del nodo eliminato fisicamente (che potrebbe essere il predecessore del nodo contenente e)
3. Ripercorrendo il cammino dal basso verso l’alto, esegui l’opportuna rotazione semplice o doppia sui nodi sbilanciati
• N.B.: potrebbero essere necessarie O(log n) rotazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Cancellazione con rotazioni a cascata
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Classe AlberoAVL
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
• Tutte le operazioni hanno costo O(log n) poché l’altezza dell’albero è O(log n) e ciascuna rotazione richiede solo tempo costante
Costo delle operazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
• Mantenere bilanciamento sembra cruciale per ottenere buone prestazioni
• Esistono vari approcci per mantenere bilanciamento:– Tramite rotazioni (alberi AVL )– Tramite fusioni o separazioni di nodi (alberi 2-3, B-alberi )
• In tutti questi casi si ottengono tempi di esecuzione logaritmici nel caso peggiore
• E’ anche possibile non mantenere in modo esplicito alcuna condizione di bilanciamento, ed ottenere tempi logaritmici ammortizzati su una intera sequenza di operazioni (alberi auto-aggiustanti)
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Implementazioni Dizionario
- Liste
- Alberi di ricerca non bilanciati
- Alberi di ricerca bilanciati
- Tavole hash
O(n)
O(n)
O(log n)
O(1)
Tempo richiesto dall’operazione più costosa:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Tavole ad accesso diretto
Idea:– dizionario memorizzato in array v di m celle– a ciascun elemento è associata una chiave
intera nell’intervallo [0,m-1]– elemento con chiave k contenuto in v[k]– al più n≤m elementi nel dizionario
Sono dizionari basati sulla proprietà di accesso diretto alle celle di un array
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Implementazione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Fattore di caricoMisuriamo il grado di riempimento di una tavola usando il fattore di carico
α = nm
Esempio: tavola con nomi di studenti indicizzati da numeri di matricola a 6 cifre n=100 m=106 α = 0,0001 = 0,01%Grande spreco di memoria!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Pregi e difetti
– Tutte le operazioni richiedono tempo O(1)
Pregi:
– Le chiavi devono essere necessariamente interi in [0, m-1]
– Lo spazio utilizzato è proporzionale ad m, non al numero n di elementi: può esserci grande spreco di memoria!
Difetti:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Tavole hash
Idea:– Chiavi prese da un universo totalmente
ordinato U (possono non essere numeri)– Funzione hash: h: U → [0, m-1]
(funzione che trasforma chiavi in indici)– Elemento con chiave k in posizione v[h(k)]
Per ovviare agli inconvenienti delle tavole ad accesso diretto ne consideriamo un’estensione: le tavole hash
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
CollisioniLe tavole hash possono soffrire del fenomeno delle collisioni.
Si ha una collisione quando si deve inserire nella tavola hash un elemento con chiave u, e nella tavola esiste già un elemento con chiave v tale che h(u)=h(v): il nuovo elemento andrebbe a sovrascrivere il vecchio!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Funzioni hash perfette
u ≠ v ⇒ h(u) ≠ h(v)
Una funzione hash si dice perfetta se è iniettiva, cioè per ogni u,v ∈ U:
Un modo per evitare il fenomeno delle collisioni è usare funzioni hash perfette.
Deve essere |U| ≤ m
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Implementazione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Esempio
Tavola hash con nomi di studenti aventi come chiavi numeri di matricola nell’insieme U=[234717, 235717]
Funzione hash perfetta: h(k) = k - 234717
n=100 m=1000 α = 0,1 = 10%L’assunzione |U| ≤ m necessaria per avere una funzione hash perfetta è raramente conveniente (o possibile)…
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Esempio
Tavola hash con elementi aventi come chiavi lettere dell’alfabeto U=A,B,C,…
Funzione hash non perfetta (ma buona in pratica per m primo): h(k) = ascii(k) mod m
Ad esempio, per m=11: h(‘C’) = h(‘N’)⇒ se volessimo inserire sia ‘C’ and ‘N’ nel dizionario avremmo una collisione!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Uniformità delle funzioni hash
Per ridurre la probabilità di collisioni, una buona funzione hash dovrebbe essere in grado di distribuire in modo uniforme le chiavi nello spazio degli indici della tavola
Questo si ha ad esempio se la funzione hash gode della proprietà di uniformità semplice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Uniformità sempliceSia P(k) la probabilità che la chiave k sia presente nel dizionario e sia:
la probabilità che la cella i sia occupata.
Una funzione hash h gode dell’uniformità semplice se:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Esempio
Se U è l’insieme dei numeri reali in [0,1] e ogni chiave ha la stessa probabilità di essere scelta, allora si può dimostrare che la funzione hash:
soddisfa la proprietà di uniformità semplice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Risoluzione delle collisioni
1. Liste di collisione. Gli elementi sono contenuti in liste esterne alla tabella: v[i] punta alla lista degli elementi tali che h(k)=i
2. Indirizzamento aperto. Tutti gli elementi sono contenuti nella tabella: se una cella è occupata, se ne cerca un’altra libera
Nel caso in cui non si possano evitare le collisioni, dobbiamo trovare un modo per risolverle. Due metodi classici sono i seguenti:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Liste di collisione
Esempio di tabella hash basata su liste di collisione contenente le lettere della parola:
PRECIPITEVOLISSIMEVOLMENTE
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Implementazione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Indirizzamento apertoSupponiamo di voler inserire un elemento con chiave k e la sua posizione “naturale” h(k) sia già occupata.
L’indirizzamento aperto consiste nell’occupare un’altra cella, anche se potrebbe spettare di diritto a un’altra chiave.
Cerchiamo la cella vuota (se c’è) scandendo le celle secondo una sequenza di indici:
c(k,0), c(k,1), c(k,2),…c(k,m-1)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Implementazione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Metodi di scansione: scansione lineare
c(k,i) = ( h(k) + i ) mod mper 0 i < m≤
Scansione lineare:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
EsempioInserimenti in tavola hash basata su indirizzamento aperto con scansione lineare delle lettere della parola:
PRECIPITEVOLISSIMEVOLMENTE
4,8 celle scandite in media per inserimento
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Metodi di scansione: hashing doppio
c(k,i) = h1(k) + i·h2(k) mod m
L’hashing doppio riduce il problema:
per 0 i < m, h≤ 1 e h2 funzioni hash
La scansione lineare provoca effetti di agglomerazione, cioè lunghi gruppi di celle consecutive occupate che rallentano la scansione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
EsempioInserimenti in tavola hash basata su indirizzamento aperto con hashing doppio delle lettere della parola:
PRECIPITEVOLISSIMEVOLMENTE
3,1 celle scandite in media per inserimento
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Analisi del costo di scansioneTempo richiesto in media da un’operazione di ricerca di una chiave, assumendo che le chiavi siano prese con probabilità uniforme da U:
dove α=n/m (fattore di carico)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Cancellazione elementi con indir. aperto
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
• La proprietà di accesso diretto alle celle di un array consente di realizzare dizionari con operazioni in tempo O(1) indicizzando gli elementi usando le loro stesse chiavi (purché siano intere)
• L’array può essere molto grande se lo spazio delle chiavi è grande
• Per ridurre questo problema si possono usare funzioni hash che trasformano chiavi (anche non numeriche) in indici
• Usando funzioni hash possono aversi collisioni• Tecniche classiche per risolvere le collisioni sono liste di
collisione e indirizzamento aperto
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Tipo di dato CodaPriorità (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Tipo di dato CodaPriorità (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Tre implementazioni
d-heap: generalizzazione degli heap binari visti per l’ordinamento
heap binomiali
heap di Fibonacci
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
d-heap
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Definizione
Un d-heap è un albero radicato d-ario con le seguenti proprietà:
2. Struttura: è completo almeno fino al penultimo livello
3. Contenuto informativo: ogni nodo v contiene un elemento elem(v) ed una chiave chiave(v) presa da un dominio totalmente ordinato
4. Ordinamento a heap: per ogni nodo v (diverso dalla radice) chiave(v) ≥ chiave(parent(v))
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Esempio
Heap d-ario con 18 nodi e d = 3
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Proprietà
1. Un d-heap con n nodi ha altezza O(logd n)
3. La radice contiene l’elemento con chiave minima (per via della proprietà di ordinamento a heap)
5. Può essere rappresentato implicitamente tramite vettore posizionale grazie alla proprietà di struttura
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Procedure ausiliarie
Utili per ripristinare la proprietà di ordinamento a heap su un nodo v che non la soddisfi T(n) = O(logd n)
T(n) = O(d logd n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
findMin
T(n) = O(1)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
insert(elem e, chiave k)
T(n) = O(logd n) ( muoviAlto )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
delete(elem e) e deleteMin
T(n) = O(d logd n) ( muoviBasso )
Può essere usata anche per implementare cancellazione del minimo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
decreaseKey(elem e, chiave d)
T(n) = O(logd n) ( muoviAlto )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
increaseKey(elem e, chiave d)
T(n) = O(d logd n) ( muoviBasso )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Heap binomiali
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Alberi binomialiAlbero binomiale Bh (definito ricorsivamente) :2. B0 consiste di un unico nodo3. Per i ≥ 0, Bi+1 ottenuto fondendo due alberi binomiali
Bi con radice di uno figlia della radice dell’altro
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Proprietà strutturali
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Definizione di heap binomiale
Un heap binomiale è una foresta di alberi binomiali con le seguenti proprietà:
2. Struttura: ogni albero Bi nella foresta è un albero binomiale
3. Unicità: per ogni i, esiste al più un Bi nella foresta4. Contenuto informativo: ogni nodo v contiene un
elemento elem(v) ed una chiave chiave(v) presa da un dominio totalmente ordinato
5. Ordinamento a heap: per ogni nodo v (diverso da una delle radici) chiave(v) ≥ chiave(parent(v))
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Proprietà
In un heap binomiale con n nodi, vi sono al più log2 n alberi binomiali, ciascuno con grado ed altezza O(log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Procedura ausiliaria
Utile per ripristinare la proprietà di unicità in un heap binomiale
T(n) è proporzionale al numero di alberi binomiali in input
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Realizzazione (1/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Realizzazione (2/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Realizzazione (3/3)
Tutte le operazioni richiedono tempo T(n) = O(log n)Durante l’esecuzione della procedura ristruttura esistono infatti al più tre Bi, per ogni i ≥ 0
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Analisi Ammortizzata
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Metodologie di analisi di algoritmi
Finora abbiamo visto tre tipi di analisi:
• Analisi nel caso peggiore
• Analisi nel caso medio
• Analisi nel caso atteso (algoritmi randomizzati)
Ne vedremo un altro:
• Analisi ammortizzata
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Analisi ammortizzata• Strutture dati con garanzia assoluta sui loro
tempi di esecuzione: analisi di caso peggiore per operazione (esempio: analisi di heap in heapsort)
• Analisi ammortizzata: • non ci interessa tanto caratterizzare tempo richiesto nel
caso peggiore da un’operazione sulla struttura dati• quanto caratterizzare tempo totale richiesto dalle
operazioni sulla struttura dati• ovvero tempo medio di un’operazione, dove la media è
sulla sequenza di operazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Analisi ammortizzata
• Supponiamo di avere una sequenza di σ operazioni su una particolare struttura dati
• La sequenza richiede tempo totale O(σ t) per essere eseguita
• Diremo che il tempo ammortizzato per ogni operazione della sequenza è O(t)
• Media sulla sequenza: O(σ t) / σ = O(t)• Nota: una singola operazione potrebbe
richiedere più di O(t) nel caso peggiore!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
Analisi ammortizzata
• Sequenza di σ operazioni richiede tempo O(σ t)
• Tempo ammortizzato: O(σ t) / σ = O(t)• OK per molte applicazioni• Abbiamo bisogno di utilizzare strutture dati su
sequenze di operazioni • Analizzare prestazioni su sequenze di
prestazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
Esempio 1
Pila con le seguenti due operazioni• push(x): push elemento x sulla pila• multipop(k): esegui k pop sulla pila (se la pila
ha almeno k elementi) Analisi nel caso peggiore: • push(x): O(1)• multipop(k): O( min k, |P| ) = O(n) dove |P|
è la dimensione della pila
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
Esempio 1
Analisi nel caso peggiore: • push(x): O(1)• multipop(k): O( min k, |P| ) = O(n) dove |P|
è la dimensione della pilaQuanto tempo richiederà una sequenza di
σ operazioni? O(σ n) ?No!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200431
Analisi ammortizzata dell’Esempio 1
Intuizione:• Prima di togliere un elemento x con una
multipop dobbiamo averlo inserito con una push(x)
• Ogni sequenza di σ push e multipop richiede in totale tempo O(σ )
• Tempo ammortizzato per operazione: O(σ ) / σ = Ο(1)
• Vedremo un’analisi più formale di questo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200432
Metodologie di analisi ammortizzata
Tre tipologie di analisi diverse:• Metodo cumulativo:
Sequenza di σ operazioni richiede tempo O(σ t)Tempo ammortizzato: O(σ t) / σ = O(t)
• Metodo del banchiere:Per eseguire un passo dobbiamo pagare 1 EURAllocare EUR in modo da pagare per tutti i passi
• Metodo del potenziale: Analogia con analisi potenziale (Fisica)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200433
Metodo del Banchiere per Esempio 1Quando esegui push(x) “sborsa” 2 EUR:• 1 EUR per pagare lavoro richiesto da push(x) • 1 EUR conservato nell’elemento xQuando esegui multipop(k) “sborsa” 0 EUR:• lavoro richiesto da multipop(k) pagato dagli
EUR conservati negli elementi! 1. Per ogni operazione “sborsi” al più O(1) EUR2. Tutti gli EUR “sborsati” sufficienti a pagare per
lavoro richiesto dalle operazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200434
Metodo del PotenzialeDefinisci potenziale Φ per struttura dati D
Φ(D) misura potenzialità di D ad eseguire lavoro (configurazione attuale)
Durante operazione i-esima, struttura dati passa da configurazione Di a configurazione Di+1
Passa da potenziale Φ(Di) a potenziale Φ(Di+1)Tenere in conto variazione di potenziale
∆ Φ = Φ(Di+1) - Φ(Di) Operazione può essere molto costosa ma mette struttura dati in grado di eseguire più efficientemente operazioni future (costo operazione compensato da ∆ Φ )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200435
Metodo del PotenzialeTipicamente potenziale Φ soddisfa le:
Φ(D0) = 0 e Φ(Di) ≥ 0 per ogni i
Definiamo tempo ammortizzato ai dell’operazione i-esima: ai = ti + Φ(Di+1) - Φ(Di)
dove ti è il tempo (attuale) operazione i-esima Sommando su sequenza di operazioni
Σi ai = Σi ti + Σi ( Φ(Di+1) - Φ(Di) ) Σi ai = Σi ti + ( Φ(Dn) - Φ(D0) ) Σi ai ≥ Σi ti
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200436
Metodo del Potenziale per Esempio 1
Definiamo potenziale Φ della pila P: Φ(P) = |P|Nota che: Φ(P0) = 0 e Φ(Pi) ≥ 0 per ogni i
Tempo ammortizzato ai di operazione i-esima: ai = ti + Φ(Di+1) - Φ(Di)
Costo ammortizzato di push(x) : ai = ti + Φ(Di+1) - Φ(Di) = 1 + 1 = 2 Costo ammortizzato di multipop(k) : ai = ti + Φ(Di+1) - Φ(Di) = k + ( -k) = 0
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200437
Heap di Fibonacci
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200438
Heap di FibonacciHeap binomiale rilassato: si ottiene da un heap
binomiale rilassando la proprietà di unicità dei Bi ed utilizzando un atteggimento più “pigro” durante l’operazione insert (perché ristrutturare subito la foresta quando potremmo farlo dopo?)
Heap di Fibonacci: si ottiene da un heap binomiale rilassato rilassando la proprietà di struttura dei Bi che non sono più necessariamente alberi binomiali
Analisi sofisticata: i tempi di esecuzione sono ammortizzati su sequenze di operazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200439
Conclusioni: tabella riassuntiva
L’analisi di DHeap e HeapBinomiale è nel caso peggiore, mentre quella per HeapBinomialeRilassato e HeapFibonacci è ammortizzata
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Il problema Union-findMantenere una collezione di insiemi disgiunti di elementi distinti (interi in 1 … n) durante una sequenza delle seguenti operazioni:• union(A,B) = unisce gli insiemi A e B in un
unico insieme, di nome A, e distrugge i vecchi insiemi A e B
• find(x) = restituisce il nome dell’insieme contenente l’elemento x
• makeSet(x) = crea il nuovo insieme x
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Esempio
n = 6
L’elemento in grassetto dà il nome all’insieme
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Approcci elementari
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Algoritmi di tipo QuickFind
• Usano alberi di altezza uno per rappresentare gli insiemi disgiunti:– Radice = nome dell’insieme– Foglie = elementi
• find e makeSet richiedono solo tempo O(1), ma union è molto inefficiente: O(n) nel caso peggiore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Esempio
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Realizzazione (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Realizzazione (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Algoritmi di tipo QuickUnion
• Usano alberi di altezza anche maggiore di uno per rappresentare gli insiemi disgiunti:– Radice = elemento rappresentativo dell’insieme – Nodi e Foglie = altri elementi
• union e makeSet richiedono solo tempo O(1), ma find è molto inefficiente: O(n) nel caso peggiore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Esempio
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Realizzazione (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Realizzazione (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Altezza lineare
Sequenza di union che costruisce un albero di altezza lineare
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Euristiche di bilanciamento nell’operazione union
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Bilanciamento in algoritmi QuickFind
Nell’unione degli insiemi A e B, modifichiamo il padre dei nodi nell’insieme di cardinalità minore
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Realizzazione (1/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Realizzazione (2/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Realizzazione (3/3)
Tam = tempo per operazione ammortizzato su una intera sequenza
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Conseguenza del bilanciamento
Ogni volta che una foglia di un albero QuickFind bilanciato acquista un nuovo padre a causa di un’operazione union, dopo la union tale foglia farà parte di un insieme che è grande almeno il doppio dell’insieme di cui faceva parte precedentemente
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Analisi ammortizzata (1/2)
Se eseguiamo m find, n makeSet (e quindi al più n-1 union), il tempo richiesto dall’intera sequenza di operazioni è O(m + n log n)
1. Facile vedere che find e makeSet richiedono tempo O(n+m)
2. Per analizzare union, quando creiamo un nodo gli assegnamo log n crediti: in totale, O(n log n) crediti
Idea della dimostrazione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Analisi ammortizzata (2/2)
3. Quando eseguiamo una union, paghiamo il tempo speso su ogni nodo il cui padre cambia con uno dei crediti assegnati al nodo
4. Un nodo può cambiare al più log n padri, poiché ogni volta che cambia padre la cardinalità dell’insieme cui appartiene raddoppia
5. I crediti assegnati al nodo sono quindi sufficienti per pagare tutti i “cambiamenti di padre”
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Bilanciamento in algoritmi QuickUnion Union by rank: nell’unione degli insiemi A e B,
rendiamo la radice dell’albero più basso figlia della radice dell’albero più alto
rank(x) = altezza dell’albero di cui x è radice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Realizzazione (1/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Realizzazione (2/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Realizzazione (3/3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Conseguenza del bilanciamento
Un albero QuickUnion bilanciato in altezza con radice x ha almeno 2rank(x) nodi
– Se rank(A) > rank(B) durante una union:
Dimostrazione: induzione sul numero di operazioni
– Se rank(A) < rank(B): simmetrico– Se rank(A) = rank(B):
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Analisi (nel caso peggiore)
Per la proprietà precedente, l’altezza di un albero QuickUnion bilanciato è limitata superiormente da log2 n, con n = numero di makeSet
L’operazione find richiede nel caso peggiore tempo O(log n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
Bilanciamento in algoritmi QuickUnion
Union by size: nell’unione degli insiemi A e B, rendiamo la radice dell’albero con meno nodi figlia della radice dell’albero con più nodi
size(x) = numero nodi nell’albero di cui x è radice
Stesse prestazioni di union by rank
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
Riepilogo sul bilanciamento
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
Euristiche di compressione nell’operazione find
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200431
Path compression, splitting e halving
Siano u0, u1, …, ut-1 i nodi incontrati nel cammino esaminato da find (x), con x = u0
• Path compression: rendi il nodo ui figlio della radice ut-1, per ogni i ≤ t-3
• Path splitting: rendi il nodo ui figlio del nonno ui+2, per ogni i ≤ t-3
• Path halving: rendi il nodo u2i figlio del nonno u2i+2, per ogni i ≤ (t-1)/2-1
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200432
Esempialbero prima di find(x)
Path compression
Path halving
Path splitting
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200433
Union-find con bilanciamento e compressione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200434
Combinazioni delle euristiche
• Combinando le euristiche di bilanciamento e compressione si ha un totale di sei algoritmi:
( union by rank o union by size ) x ( path splitting, path compression, o path halving )
• Tutti gli algoritmi hanno le stesse prestazioni, asintoticamente superiori a quanto visto finora
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200435
Terminologia
La funzione log * cresce molto lentamente
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200436
Analisi
Combinando le euristiche di bilanciamento e compressione, una qualunque sequenza di n operazioni makeSet, m operazioni find ed al più (n-1) operazioni union può essere implementata in tempo totale
O( (n+m) log*n)
( Non è la migliore analisi possibile )
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200437
Conclusioni• Strutture dati efficienti per il problema union-
find• Partendo da strutture dati semplici con
prestazioni non soddisfacenti, le abbiamo migliorate tramite l’uso di opportune euristiche di bilanciamento ed euristiche di compressione di cammini
• Nonostante le euristiche siano estremamente semplici, l’analisi si è rivelata molto sofisticata
Fabrizio GrandoniAlgoritmi e strutture dati
Capitolo 10Tecniche algoritmiche
Algoritmi e Strutture Dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
1. Divide et impera2. Programmazione dinamica3. Greedy
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Tecnica top-down:
3. Dividi il problema in due o più sottoproblemi4. Risolvi (ricorsivamente) i sottoproblemi5. Ricombina soluzioni dei sottoproblemi per
ottenere la soluzione del problema originario
Divide et impera
Esempi: ricerca binaria, mergesort, quicksort, …
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Moltiplicare (o sommare) due numeri non è sempre eseguibile in tempo costante:– se i numeri occupano più di una parola di memoria,
anche le operazioni elementari potrebbero richiedere tempo superiore a O(1)
Moltiplicare due numeri a n cifre, con l’algoritmo classico (scuola elementare), richiede O(n2). Possiamo fare di meglio?
Moltiplicazione di interi di lunghezza arbitraria
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Rappresentazione decimale di interi a n cifre
• Dividiamo X e Y a metà:– X1 (Y1) = n/2 cifre più significative di X (Y) – X0 (Y0) = n/2 cifre meno significative di X (Y)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Divisione del problema
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
• Moltiplicare un numero per 10k = shift a sinistra delle cifre del numero di k posizioni
• Somma di due numeri di k cifre: tempo O(k)
• La moltiplicazione di due numeri a n cifre si riduce quindi a:– quattro moltiplicazioni di numeri a n/2 cifre– un numero costante di operazioni implementabili in
tempo O(k)
Osservazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
La soluzione è Θ(n2) dal Teorema Master
Cosa abbiamo guadagnato?
Equazione di ricorrenza
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Ridurre il numero di moltiplicazioni
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
La soluzione è Θ(n ) = Θ(n1.59) dal Teorema Master
Analisi
Eseguiamo tre moltiplicazioni e un numero costante di somme e shift
log23
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Programmazione Dinamica
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Per evitare di risolvere più volte lo stesso sottoproblema, memorizziamo la soluzione dei vari sottoproblemi:
Programmazione Dinamica
algoritmo fibonacci3(intero n) → intero sia Fib un array di n interi Fib[1] ← Fib[2] ← 1 for i = 3 to n do Fib[i] ← Fib[i-1] + Fib[i-2] return Fib[n]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Tecnica bottom-up:
3. Identifica sottoproblemi del problema originario, procedendo logicamente dai problemi più piccoli verso quelli più grandi
4. Utilizza una tabella per memorizzare soluzioni dei sottoproblemi incontrati: quando incontri lo stesso sottoproblema, leggi la soluzione nella tabella
5. Si usa quando i sottoproblemi non sono indipendenti, (lo stesso sottoproblema può apparire più volte)
Programmazione dinamica
Esempio: numeri di Fibonacci
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Siano X e Y due stringhe di lunghezza m ed n:
Distanza tra stringhe
Vogliamo calcolare la “distanza” tra X e Y, ovvero il minimo numero di operazioni elementari che consentono di trasformare X in Y
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Trasformare RISOTTO in PRESTO:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
• Indichiamo con Xi il prefisso di X fino all’i-esimo carattere, per 0 ≤ i ≤ m (X0 è la stringa vuota):
Approccio
• Risolveremo il problema di calcolare δ(X,Y) calcolando δ(Xi,Yj) per ogni i, j tali che 0 ≤ i ≤ m e 0 ≤ j ≤ n
• Manterremo le informazioni in una tabella D di dimensione m × n
• Indichiamo con δ(X,Y) la distanza tra X e Y
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Inizializzazione della tabella
Alcuni sottoproblemi sono banali:
δ(X0,Yj) = j partendo dalla stringa vuota X0, basta inserire uno ad uno i primi j caratteri di Yj
δ(Xi,Y0) = i partendo da Xi, basta rimuovere uno ad uno gli i caratteri di Xi per ottenere Y0
Queste soluzioni sono memorizzate rispettivamente nella prima riga e nella prima colonna della tabella D
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Avanzamento nella tabella (1/3)
• Se xi = yj, il minimo costo per trasformare Xi in Yj è uguale al minimo costo per trasformare Xi-1 in Yi-1
• Se xi ≠ yj, distinguiamo in base all’ultima operazione usata per trasformare Xi in Yj in una sequenza ottima di operazioni
D [ i , j ] = D [ i-1 , j-1 ]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Avanzamento nella tabella (2/3)il minimo costo per trasformare Xi in Yj è uguale al minimo costo per trasformare Xi in Yj-1 più 1 per inserire il carattere yj
il minimo costo per trasformare Xi in Yj è uguale al minimo costo per trasformare Xi-1 in Yj più 1 per la cancellazione del carattere xi
D [ i , j ] = 1 + D [ i , j-1 ]
D [ i , j ] = 1 + D [ i-1 , j ]
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Avanzamento nella tabella (3/3)il minimo costo per trasformare Xi in Yj è uguale al minimo costo per trasformare Xi-1 in Yj-1 più 1 per sostituire il carattere xi per yj
D [ i , j ] = 1 + D [ i-1 , j-1 ]
In conclusione:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Pseudocodice
Tempo di esecuzione ed occupazione di memoria: O(m n)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Esempio
La tabella D costruita dall’algoritmo.
In grassetto sono indicate due sequenze di operazioni che permettono di ottenere la distanza tra le stringhe
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Tecnica golosa (o greedy)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
1. Insieme di candidati (e.g., città)2. Insieme dei candidati già esaminati3. Funzione ammissibile(): verifica se un insieme di
candidati rappresenta una soluzione, anche non ottima (un insieme di città è un cammino da Napoli a Torino?)
Problemi di ottimizzazione (1/2)
Usata in problemi di ottimizzazione (e.g., trovare cammino più corto per andare da Napoli a Torino)
Ad ogni passo, algoritmo effettua la scelta “localmente” più promettente
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
1. Funzione ottimo(): verifica se un insieme di candidati rappresenta una soluzione ottima (un insieme di città è il più breve cammino da Napoli a Torino?)
2. Funzione seleziona(): indica quale dei candidati non ancora esaminati è al momento il più promettente
3. Funzione obiettivo da minimizzare o massimizzare (e.g., lunghezza del cammino da Napoli a Torino)
Problemi di ottimizzazione (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Tecnica golosa
Perché goloso? Sceglie sempre il candidato più promettente!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Un server (e.g., una CPU, o un impiegato dell’ufficio postale) deve “servire” n clientiIl servizio richiesto dall’i-esimo cliente richiede ti secondiChiamiamo T(i) il tempo di attesa del cliente i Vogliamo minimizzare il tempo di attesa medio, i.e.:
Un problema di sequenziamento
e quindi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
Esempio
Sei possibili ordinamenti:
Qual è il migliore?
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
• Il seguente algoritmo genera l’ordine di servizio in maniera incrementale secondo una strategia greedy.
• Supponiamo di aver deciso di sequenziare i clienti i1, i2, … im. Se decidiamo di servire il cliente j, il tempo totale di servizio diventa:
Un algoritmo goloso
• Quindi al generico passo l’algoritmo serve la richiesta più corta tra quelle rimanenti
• Tempo di esecuzione: O(n log n), per ordinare le richieste
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
Tecniche algoritmiche:– Divide et impera: altre applicazioni nella ricerca
binaria, mergesort, quicksort, moltiplicazione di matrici
– Programmazione dinamica: altre applicazioni nel calcolo dei numeri di Fibonacci, associatività del prodotto tra matrici, cammini minimi tra tutte le coppie di nodi (algoritmo di Floyd e Warshall)
– Tecnica greedy: altre applicazioni nel distributore automatico di resto, nel calcolo del minimo albero ricoprente (algoritmi di Prim, Kruskal, Boruvka) e dei cammini minimi (algoritmo di Dijkstra)
Riepilogo
Fabrizio GrandoniAlgoritmi e strutture dati
Capitolo 11Grafi e visite di grafi
Algoritmi e Strutture Dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Definizione
Un grafo G = (V,E) consiste in:- un insieme V di vertici (o nodi)- un insieme E di coppie di vertici, detti archi: ogni arco connette due vertici
Esempio 1: V = persone che vivono in Italia, E = coppie di persone che si sono strette la mano
Esempio 2: V = persone che vivono in Italia, E = (x,y) tale che x ha inviato una mail a y
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Terminologia (1/2)
Esempio 1: relazione simmetrica grafo non orientato
Esempio 2: relazione non simmetrica grafo orientato
L ed I sono adiacenti(L,I) è incidente a LI ha grado 4: δ(I) = 4
n = numero di verticim = numero di archi
∑ δ(v) = 2mv∈V
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Terminologia (2/2)
< L , I , E, C, B, A > è un cammino nel grafo di lunghezza 5
Non è il più corto cammino tra L ed A
La lunghezza del più corto cammino tra due vertici si dice distanza: L ed A hanno distanza 4
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Strutture dati per rappresentare grafi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Grafi non orientati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Grafi orientati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Prestazioni della lista di archi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Prestazioni delle liste di adiacenza
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Prestazioni della matrice di adiacenza
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Visite di grafi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Scopo e tipi di visita
Una visita (o attraversamento) di un grafo G permette di esaminare i nodi e gli archi di G in modo sistematicoProblema di base in molte applicazioniEsistono varie tipologie di visite con diverse proprietà. In particolare: – visita in ampiezza (BFS = Breadth First Search) – visita in profondità (DFS = Depth First Search)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Algoritmo di visita generica
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Osservazioni
Un vertice viene marcato quando viene incontrato per la prima volta: marcatura implementata tramite un vettore di bit di marcaturaVisita genera un albero di copertura T del grafoInsieme di vertici F ⊆ T mantiene la frangia di T:– v ∈ (T-F) : v è chiuso, tutti gli archi incidenti su v sono
stati esaminati– v ∈ F : v è aperto, esistono archi incidenti su v non
ancora esaminati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Costo della visita
Tempo di esecuzione dipende da struttura dati usata per rappresentare il grafo:– Lista di archi: O(m n)– Liste di adiacenza: O(m + n)– Matrice di adiacenza: O(n2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Casi particolari di visite
• Se frangia F implementata come coda si ha visita in ampiezza (BFS)
• Se frangia F implementata come pila si ha visita in profondità (DFS)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Visita in ampiezza
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Visita in ampiezza
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Esempio: grafo non orientato (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Esempio: grafo non orientato (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Esempio: grafo orientato
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Proprietà
• Per ogni nodo v, il livello di v nell’albero BFS è pari alla distanza di v dalla sorgente s
• Per ogni arco (u,v) di un grafo non orientato, gli estremi u e v appartengono allo stesso livello o a livelli consecutivi dell’albero BFS
• Se il grafo è orientato, possono esistere archi (u,v) che attraversano all’indietro più di un livello
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Visita in profondità
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Visita in profondità
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Esempio: grafo non orientato (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Esempio: grafo non orientato (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Esempio: grafo orientato (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
Esempio: grafo orientato (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200429
Proprietà
• Sia (u,v) un arco di un grafo non orientato. Allora: – (u,v) è un arco dell’albero DFS, oppure– i nodi u e v sono l’uno discendente/antenato dell’altro
• Sia (u,v) un arco di un grafo orientato. Allora: – (u,v) è un arco dell’albero DFS, oppure– i nodi u e v sono l’uno discendente/antenato
dell’altro, oppure– (u,v) è un arco trasversale a sinistra, ovvero il vertice
v è in un sottoalbero visitato precedentemente ad u
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200430
Riepilogo• Nozione di grafo e terminologia• Diverse strutture dati per rappresentare grafi nella
memoria di un calcolatore• L’utilizzo di una particolare rappresentazione può
avere un impatto notevole sui tempi di esecuzione di un algoritmo su grafi (ad esempio, nella visita di un grafo)
• Algoritmo di visita generica e due casi particolari: visita in ampiezza e visita in profondità
Fabrizio GrandoniAlgoritmi e strutture dati
Capitolo 12Minimo albero ricoprente
Algoritmi e Strutture Dati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Definizioni
Sia G = (V, E) un grafo connesso non orientato. Un albero ricoprente di G è un sottografo T ⊆ G tale che:– T è un albero;– T contiene tutti i vertici di G.
Sia w(x,y) il costo (o peso) di un arco (x,y) ∈ E. Il costo di un albero è la somma dei costi dei suoi archi.Un minimo albero ricoprente di G è un albero ricoprente di costo minimo.
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Esempi
Il minimo albero ricoprente non è necessariamente unico
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Proprietà di minimi alberi ricoprenti
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Tagli e cicli
Dato un grafo non orientato G = (V,E), un taglio in G è una partizione dei vertici V in due insiemi: X e V-X. Un arco e = (u,v) attraversa il taglio (X,X) se u ∈ X e v ∈ X
Un ciclo è un cammino in cui il primo e l’ultimo vertice coincidono
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Un approccio “goloso”• Costruiremo un minimo albero ricoprente un
arco alla volta, effettuando scelte localmente “golose”. Ad esempio:– includere nella soluzione archi di costo piccolo– escludere dalla soluzione archi di costo elevato
• Formalizzeremo il processo come un processo di colorazione:– archi blu: inclusi nella soluzione– archi rossi: esclusi dalla soluzione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Regola del taglio (Regola blu)
Scegli un taglio che non contiene archi blu. Tra tutti gli archi non colorati del taglio, scegline uno di costo minimo e coloralo blu.
• Ogni albero ricoprente deve infatti contenere almeno un arco del taglio• E’ naturale includere quello di costo minimo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Regola del ciclo (Regola rossa)
Scegli un ciclo che non contiene archi rossi. Tra tutti gli archi non colorati del ciclo, scegline uno di costo massimo e coloralo rosso.
• Ogni albero ricoprente deve infatti escludere almeno un arco del ciclo• E’ naturale escludere quello di costo massimo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
L’ approccio “goloso”
• L’approccio goloso applica una delle due regole ad ogni passo, finché tutti gli archi sono colorati
• Si può dimostrare che esiste sempre un minimo albero ricoprente che contiene tutti gli archi blu e non contiene nessun arco rosso.
• Si può inoltre dimostrare che il metodo goloso colora tutti gli archi.
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Tempi di esecuzione
A seconda della scelta della regola da applicare e del taglio/ciclo usato ad ogni passo, si ottengono dal metodo goloso diversi algoritmi con diversi tempi di esecuzione
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Algoritmo di Kruskal
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Strategia• Mantieni foresta di alberi blu, all’inizio tutti
disgiunti• Per ogni arco, in ordine non decrescente di costo,
applica il passo seguente : “se l’arco ha entrambi gli estremi nello stesso albero blu, applica regola del ciclo e coloralo rosso, altrimenti applica regola del taglio e coloralo blu”
• I vertici nello stesso albero blu sono mantenuti tramite una struttura dati union/find
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Pseudocodice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Esempio (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Esempio (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Analisi
Il tempo di esecuzione dell’algoritmo di Kruskal è O(m log n) nel caso peggiore
(Utilizzando un algoritmo di ordinamento ottimo e la struttura dati union-find)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Algoritmo di Prim
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Strategia• Mantiene un unico albero blu T, che all’inizio consiste
di un vertice arbitrario• Applica per (n-1) volte il seguente passo:
scegli un arco di costo minimo incidente su T e coloralo blu (regola del taglio)
• Definiamo arco azzurro un arco (u,v) tale che u∈T, v∉T, e (u,v) ha il costo minimo tra tutti gli archi che connettono v ad un vertice in T: l’algoritmo mantiene archi azzurri in una coda con priorità da cui viene estratto il minimo ad ogni passo
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Pseudocodice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Esempio (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Esempio (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Analisi
Il tempo di esecuzione dell’algoritmo di Prim è O(m + n log n) nel caso peggiore
(Realizzando la coda con priorità tramite heap di Fibonacci)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Algoritmo di Boruvka°
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Strategia
• Mantiene una foresta di alberi blu, all’inizio tutti disgiunti
• Ad ogni passo, applica la regola seguente: per ogni albero blu T nella foresta, scegli un arco di costo minimo incidente su T e coloralo blu (regola del taglio)
• Per non rischiare di introdurre cicli, assumiamo che i costi degli archi siano tutti distinti
• Non è necessario usare strutture dati sofisticate
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Esempio
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Analisi
Il tempo di esecuzione dell’algoritmo di Boruvka è O(m log n) nel caso peggiore
(Senza usare strutture dati sofisticate)
°
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Riepilogo
• Paradigma generale per il calcolo di minimi alberi ricoprenti
• Applicazione della tecnica golosa• Tre algoritmi specifici ottenuti dal paradigma
generale: Prim, Kruskal e Boruvka• L’uso di strutture dati sofisticate ci ha permesso
di implementare tali algoritmi in modo efficiente
°
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20042
Definizioni
Sia G = (V,E) un grafo orientato pesato sugli archi. Il costo di un cammino π = <v0,v1,v2,… ,vk> è dato da:
Un cammino minimo tra una coppia di vertici x e y è un cammino di costo minore o uguale a quello di ogni altro cammino tra gli stessi vertici.
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20043
Proprietà dei cammini minimi• Sottostruttura ottima: ogni sottocammino di un
cammino minimo è anch’esso minimo
• Grafi con cicli negativi: se due vertici x e y appartengono a un ciclo di costo negativo, non esiste nessun cammino minimo finito tra di essi
• Se G non contiene cicli negativi, tra ogni coppia di vertici connessi in G esiste sempre un cammino minimo semplice, in cui cioè tutti i vertici sono distinti
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20044
Distanza fra vertici• La distanza dxy tra due vertici x e y è il costo di
un cammino minimo da x a y (o +∞ se i due vertici non sono connessi)
• Disuguaglianza triangolare: per ogni x, y e z
• Condizione di Bellman: per ogni arco (u,v) e per ogni vertice s
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20045
Alberi di cammini minimi
• Un arco (u,v) appartiene a un cammino minimo a partire da un vertice s se e solo se u è raggiungibile da s e dsu+ w(u,v) = dsv
• I cammini minimi da un vertice s a tutti gli altri vertici del grafo possono essere rappresentati tramite un albero radicato in s, detto albero dei cammini minimi
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20046
Calcolare cammini minimi da distanze
Problema: Le distanze non sono note (è proprio quello che vogliamo trovare!)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20047
Tecnica del rilassamento
Partiamo da stime per eccesso delle distanze Dxy ≥ dxy e aggiorniamole decrementandole progressivamente fino a renderle esatte.
Aggiorniamo le stime basandoci sul seguente passo di rilassamento:
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20048
Algoritmo generico per il calcolo delle distanze
Rilassamento
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 20049
Algoritmo di Bellman e Ford (per cammini minimi a sorgente singola)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200410
Ordine di rilassamento Sia π = < s,v1,v2,… ,vk > un cammino minimo. Se fossimo in grado di eseguire i passi di rilassamento nell’ordine seguente:
in k passi avremmo la soluzione. Purtroppo non conosciamo l’ordine giusto, essendo π ignoto !
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200411
Approccio di Bellman e Ford
• Esegui n passate• In ciascuna passata rilassa tutti gli archi • Dopo la j-esima passata, i primi j rilassamenti corretti sono stati certamente eseguiti
• Esegue però molti rilassamenti inutili!
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200412
Pseudocodice
Tempo di esecuzione: O(n m)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200413
Algoritmo per grafi diretti aciclici(per cammini minimi a sorgente singola)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200414
Ordinamento topologico
Funzione σ: V → 1, … n tale che σ(u) < σ(v) se esiste un cammino da u a v in GEsiste se e solo se G è aciclico
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200415
Calcolo di un ordinamento topologico
Tempo di esecuzione: O(n+m)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200416
Cammini minimi in grafi aciclici
Tempo di esecuzione: O(n+m)
Eseguire i rilassamenti in ordine topologico
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200417
Algoritmo di Dijkstra(per cammini minimi a sorgente singola
in grafi con costi non negativi)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200418
Estendere l’albero dei cammini minimi Sia T un albero dei cammini minimi radicato in s che non
include tutti i vertici raggiungibili da s, sia (u,v) t.c. u∈T e v∉T , e t.c. (u,v) minimizza la quantità dsu+ w(u,v) : allora (u,v) appartiene a un cammino minimo da s a v
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200419
Algoritmo di Dijkstra
Archi incidenti in T mantenuti in coda con priorità (un solo arco per ogni nodo v ∉ T):se (u,v) è già in coda quando analizzi (z,v) e risulta Dsz+ w(z,v) < Dsu+ w(u,v) , rimpiazza (u,v) con (z,v)
Scegli arco (u,v) con u ∈ T e v ∉ T che minimizza quantità Dsu+ w(u,v), effettua rilassamento Dsv ← Dsu+ w(u,v), ed aggiungi (u,v) a T
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200420
Pseudocodice
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200421
Esempio (1/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200422
Esempio (2/2)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200423
Tempo di esecuzione
Al più: n deleteMin, n insert e m decreaseKey
O(m log n) utilizzando heapO(m + n log n) utilizzando heap di Fibonacci
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200424
Algoritmo di Floyd e Warshall(per cammini minimi tra tutte le coppie)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200425
Approccio
• Elegante applicazione della tecnica di programmazione dinamica
• Un cammino minimo k-vincolato da x a y è un cammino di costo minimo tra tutti i cammini da x a y che usano solo i vertici v1, v2, … vk
• Idea di Floyd e Warshall: calcolare cammini minimi k-vincolati
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200426
Relazioni tra distanze vincolate
• Sia dxy il costo di un cammino minimo k-vincolato da x a y. Risulta:
k
• dxy= w(x,y) se (x,y) ∈ E, +∞ altrimenti0
• dxy = dxyn
• L’algoritmo calcola dxy dal basso verso l’alto, incrementando k da 1 a n
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200427
Pseudocodice
Tempo di esecuzione: O(n3)
Fabrizio GrandoniAlgoritmi e strutture dati
Demetrescu, Finocchi, Italiano McGraw-Hill © 200428
Riepilogo
• Algoritmi classici per il calcolo di distanze (e quindi di cammini minimi), basati sulla tecnica del rilassamento:– Bellman e Ford: cammini minimi a sorgente singola, grafi
diretti senza cicli negativi, tempo O(nm)– Grafi diretti aciclici: cammini minimi a sorgente singola in
tempo O(n+m)– Dijkstra: cammini minimi a sorgente singola, grafi diretti
senza pesi negativi, tempo O(m + n log n)– Floyd e Warshall: cammini minimi tra tutte le coppie in
tempo O(n3)