Algoritmi e Strutture Dati Capitolo 1 Un’introduzione informale agli algoritmi Fabrizio Grandoni Algoritmi e strutture dati Cos’è un algoritmo? Procedimento chiaro e non ambiguo per risolvere correttamente un problema in tempo finito • Esempio: algoritmo preparaCaffè 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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. 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Perché studiare algoritmi? • 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 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Progetto ed analisi di algoritmi Vedremo come progettare ed analizzare (teoreticamente) algoritmi che: • producano risultati corretti • siano efficienti in termini di tempo di esecuzione ed occupazione di memoria 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Perché analizzare algoritmi? • 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 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Visita guidata al progetto e analisi di algoritmi tramite esempio “giocattolo”: Calcolo dei numeri di Fibonacci (problema semplice ma con molte soluzioni) 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni L’isola dei conigli Leonardo da Pisa (noto anche come Fibonacci) si interessò di molte cose, tra cui il seguente problema (dinamica delle popolazioni): 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? 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Come modellare il problema? • 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 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Modello e ipotesi sui conigli • 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 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tasso di riproduzione dei conigli 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) 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni L’albero dei conigli La riproduzione dei conigli può essere descritta da: 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Regola di espansione • 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 • Abbiamo quindi relazione di ricorrenza: Fn = Fn-1 + Fn-2 se n ≥ 3 1 se n = 1,2 • Problema algoritmico: come calcoliamo Fn ? 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Un possibile approccio • Possiamo usare direttamente una soluzione alla relazione di Fibonacci: dove: 0.618 è la sezione aurea di un segmento 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo fibonacci1 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Correttezza? ˆ • Qual è l’accuratezza di Φ e Φ necessaria per ottenere un risultato corretto? • Ad esempio, se usiamo solo 3 cifre decimali: 17 n fibonacci1(n) arrotondamento Fn 3 16 18 1.99992 986.698 2583.1 2 987 2583 2 987 2584 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo fibonacci2 Poiché fibonacci1 non dà risultati corretti, come approccio alternativo potremmo utilizzare direttamente la definizione (ricorsiva) : algoritmo fibonacci2(intero n) → intero if (n ≤ 2) then return 1 else return fibonacci2(n-1) + fibonacci2(n-2) Opera solo con numeri interi 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Domande tipiche di questo corso • 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) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tempo di esecuzione algoritmo fibonacci2(intero n) → intero if (n ≤ 2) then return 1 else return fibonacci2(n-1) + fibonacci2(n-2) Se n ≤ 2, una sola linea di codice Se n = 3, 4 linee di codice: • 2 per la chiamata fibonacci2(3) • 1 per la chiamata fibonacci2(2) • 1 per la chiamata fibonacci2(1) 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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! 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Alberi della ricorsione • Utile per risolvere relazioni di ricorrenza • Nodi corrispondenti a chiamate ricorsive • Figli di un nodo corrispondenti alle sottochiamate 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Alberi della ricorsione Per calcolare F(5) : 4 nodi interni, 2 linee di codice ciascuno 5 foglie, 1 linea di codice ciascuna Totale = 4 * 2 + 5 * 1 = 13 linee di codice 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Numero di linee di codice per F(n) • Etichettiamo nodi dell’albero con numero di linee di codice eseguite nella chiamata corrispondente: – ogni nodo interno conta 2 – ogni foglia conta 1 • Per calcolare T(n) basta contare nell’albero della ricorsione: – numero di foglie – numero di nodi interni 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Calcolare numero di foglie • Esercizio: dimostrate per induzione che: • Numero di foglie dell’albero della ricorsione di fibonacci2(n) è pari a F(n) 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Calcolare numero di nodi interni • Dimostreremo per induzione che • Numero di nodi interni di un albero in cui ogni nodo ha zero oppure due figli è pari al numero di foglie - 1 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Dimostrazione P (k) : se albero ha k foglie ha (k-1) nodi interni Induzione sul numero di foglie: • 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 + 1 Numero di nodi interni: (k -1) + 1 = k 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Calcolare T(n) • 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 • In totale numero di linee di codice eseguite è F(n) + 2 ( F(n) – 1 ) = 3 F(n) - 2 29 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Possiamo fare di meglio? fibonacci2 è un algoritmo molto lento: T(n) ≈ F(n) ≈ Φn Perché è lento? Continua a ricalcolare più volte la soluzione dello stesso sottoproblema! 30 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Programmazione Dinamica Per evitare di risolvere più volte lo stesso sottoproblema, memorizziamo la soluzione dei vari sottoproblemi: 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] 31 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tempo richiesto da fibonacci3 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] 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 ] 32 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni fibonacci3 vs. fibonacci2 • 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: 33 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Occupazione di memoria • 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! 34 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo fibonacci4 • 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(intero n) → intero a←b←1 for i = 3 to n do c ← a+b a←b b←c return b 35 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Notazione asintotica (1 / 4) • 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! 36 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Notazione asintotica (2 / 4) • 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 37 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Notazione asintotica (3 / 4) • Diremo che f(n) = O ( g(n) ) se f(n) ≤ c g(n) per qualche costante c, ed n abbastanza grande f(n) = Ο( g(n) ) cg(n) f(n) n0 38 n Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Notazione asintotica (4 / 4) • Ad esempio, possiamo rimpiazzare: – T(n)=3Fn con T(n)=O(Fn) – T(n)=2n e T(n)=4n con T(n)=O(n) n T(n)= F con O(2 ) – n • 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) ! 39 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Potenze ricorsive • Possiamo calcolare Fn in tempo inferiore a O (n)? • E’ semplice dimostrare (per induzione) la seguente proprietà di matrici: 1 1 1 0 n = Fn+1 Fn Fn Fn-1 • Useremo questa proprietà per progettare un algoritmo più efficiente di fibonacci4 40 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo fibonacci5 • Tempo di esecuzione è ancora O(n) • Cosa abbiamo guadagnato? 41 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Calcolo di potenze • 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 42 38=(81)2 =6561 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo fibonacci6 43 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tempo di esecuzione • 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: T(n) = O(1) + T(n/2) • Come risolverla? 44 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Metodo dell’iterazione T(n) ≤ c + T(n/2) ≤ c + c + T(n/4) = 2c + T(n/22) 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! 45 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Riepilogo 46 Tempo di esecuzione Occupazione di memoria fibonacci2 O(2n) O(n) fibonacci3 O(n) O(n) fibonacci4 O(n) O(1) fibonacci5 O(n) O(1) fibonacci6 O(log n) O(log n) Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Cosa abbiamo imparato? 1. Progettare algoritmi efficienti cruciale 2. Come misurare tempo/spazio? – metrica indipendente da piattaforme e tecnologie 3. 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 – 47 e.g., relazioni di ricorrenza, induzione, etc… Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi Algoritmi e strutture dati Fabrizio Grandoni Notazione asintotica • 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 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Notazione asintotica O f (n) = O( g(n) ) se ∃ c > 0 e n0 ≥ 0 tali che f(n) ≤ c g(n) per ogni n ≥ n0 f(n) = Ο( g(n) ) cg(n) f(n) n0 3 n Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Notazione asintotica Ω f (n) = Ω( g(n) ) se ∃ c > 0 e n0 ≥ 0 tali che f(n) ≥ c g(n) per ogni n ≥ n0 f(n) = Ω( g(n) ) f(n) c g(n) n0 4 n Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Notazione asintotica Θ 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 f(n) = Θ( g(n) ) c2 g(n) f(n) c1 g(n) n0 5 n Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Notazione asintotica: esempi Consideriamo g(n) = 3n2 + 10 2 g(n) = O(n ): 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) 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Metodi di analisi 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Ricerca sequenziale Ricerca di elemento x in lista L non ordinata 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” 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Caso peggiore, migliore e medio • 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 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Caso peggiore • 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 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Caso migliore 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… 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Caso medio • 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 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Caso medio 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” 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Ricerca sequenziale Ricerca di elemento x in lista L non ordinata Tbest(n) = 1 (x è in prima posizione) Tworst(n) = n (x∉L oppure è in ultima posizione) Tavg(n) = ??? 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Caso medio di ricerca sequenziale 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 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Ricerca sequenziale Tbest(n) = 1 Tworst(n) = n x è in prima posizione 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 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Ricerca Binaria Ricerca di un elemento x in un array L ordinato Confronta x con elemento centrale di L e prosegue a sinistra o a destra in base ad esito del confronto 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Analisi ricerca binaria Tbest(n) = 1 l’elemento centrale è uguale a x Tworst(n) = ??? Tavg(n) = ??? 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi di algoritmi ricorsivi 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio L’algoritmo di ricerca binaria può essere riscritto ricorsivamente come: Come analizzarlo? 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Relazioni di ricorrenza Tempo di esecuzione può essere descritto tramite relazioni di ricorrenza: T(n) = c + T( n-1 / 2 ) se n > 1 1 se n = 1 simile a fibonacci6 Vari metodi per risolvere relazioni di ricorrenza: iterazione, sostituzione, teorema Master... 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 1. Metodo dell’iterazione Idea: “srotolare” ricorsione, ottenendo sommatoria dipendente solo da dimensione n del problema iniziale 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) 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi ricerca binaria Tbest(n) = 1 l’elemento centrale è Tworst(n) = O( log n ) uguale a x x∉L oppure viene trovato all’ultimo confronto Tavg(n) = log n -1+1/n 23 assumendo che le istanze siano equidistribuite Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 2. Metodo della sostituzione Idea: “intuire” soluzione, e usare induzione per verificare che la soluzione della relazione di ricorrenza sia effettivamente quella intuita Esempio: T(n) = n + T(n/2), con T(1)=1 “Intuiamo” soluzione T(n) ≤c n per opportuna costante c Passo 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 sec/2+1 ≤ c ovvero per ogni c ≥ 2 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 3. Teorema Master Permette 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: T(n) = 25 a T(n/b) + f (n) 1 se n > 1 se n = 1 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Teorema Master Relazione di ricorrenza: T(n) = a T(n/b) + f (n) 1 se n > 1 se n = 1 ammette soluzione: 1. T(n) = Θ(n logba ) se f (n) = O(nlogba - ε ) per ε > 0 2. T(n) = Θ(n logba logba log n) se f (n) = Θ(n ) logba + ε 3. T(n) = Θ(f(n)) se f (n) = Ω(n ) per ε > 0 e a f (n/b) ≤ cf (n) per c < 1 e n sufficientemente grande 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Teorema Master T(n) = a T(n/b) + f (n) 1 Confronta le due funzioni n 1. T(n) = Θ(n logba ) logba se n > 1 se n = 1 e f (n) : se “vince” n logba logba 2. T(n) = Θ( f (n) log n ) se f (n) = Θ(n 3. T(n) = Θ( f (n) ) se “vince” f (n) ) N.B. nei casi 1. e 3. T(n) = Θ( f (n) + n logba ) 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempi 1) T(n) = n + 2 T(n/2) a = 2, b = 2, f(n) = n = Θ(n log22 ) (Caso 2 del Teorema Master) T(n) = Θ(n log n) 2) T(n) = c + 3 T(n/9) a = 3, b = 9, f(n) = c = Ο(n log93 - ε ) (Caso 1 del Teorema Master) 28 T(n) = Θ(√n) Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempi 3) T(n) = n + 3 T(n/9) a = 3, b = 9, f(n) = n = Ω(n log93 + ε) 3(n/9) ≤ c n per c = 1/3 (Caso 3 del Teorema Master) T(n) = Θ(n) 4) T(n) = n log2 n + 2 T(n/2) Il Teorema Master non può essere applicato! log22 f (n) = n log n = Ω ( n )=Ω(n) log22 + ε ε f (n) = n log2 n non è Ω ( n )=Ω(n ) 2 29 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Dimostrazione Teorema Master T(n) = a T(n/b) + f (n) 1 se n > 1 se n = 1 1. T(n) = Θ(n logba ) se f (n) = O(nlogba - ε ) per ε > 0 30 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 nb ai f (n/bi) 31 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati T(n) = Σ i=0,…, log i i a f (n/b ) nb f (n) = O(n logba - ε ) ai f (n/bi) = O( ai (n/bi ) logba - ε ) = i log a log a ε ε b b =O(n (ab /b ) )= log a - ε ε i =O(n T(n) 32 b (b ) ) i i logba - ε ε log a ε ε (b ) ) = O ( n = Σ O(n b Σ (b ) ) = … = O ( n logba - ε ( n ε) ) = O ( n logba ) Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo • 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 33 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 3 Strutture dati elementari Algoritmi e strutture dati Fabrizio Grandoni 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 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Il tipo di dato Dizionario 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Il tipo di dato Pila 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Il tipo di dato Coda 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempi di strutture collegate Lista semplice Lista doppiamente collegata Lista circolare doppiamente collegata 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Alberi Organizzazione gerarchica dei dati Dati contenuti nei nodi, relazioni gerarchiche definite dagli archi che li collegano 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Rappresentazioni collegate di alberi Rappresentazione con puntatori ai figli (nodi con numero limitato di figli) Rappresentazione con liste di puntatori ai figli (nodi con numero arbitrario di figli) 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Rappresentazioni collegate di alberi Rappresentazione di tipo primo figliofratello successivo (nodi con numero arbitrario di figli) 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo di visita generica visitaGenerica 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 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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. 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di visita in profondità Versione iterativa (per alberi binari): 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di visita in profondità Versione ricorsiva (per alberi binari): 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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. 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di visita in ampiezza Versione iterativa (per alberi binari): 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo • 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) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 4 Ordinamento Algoritmi e strutture dati Fabrizio Grandoni Ordinamento Dato un insieme S di n oggetti presi da un dominio totalmente ordinato, ordinare S • Esempi: ordinare alfabeticamente lista di nomi, o insieme di numeri, o insieme di compiti d’esame in base a cognome studente • Subroutine di molti problemi • E’ possibile effettuare ricerche in array ordinati in tempo O(log n) 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e tempi tipici • Numerosi algoritmi • Tre tempi tipici: O(n2), O(n log n), O(n) 3 n 10 100 n log2 n ~ 33 ~ 665 n2 100 104 1000 106 109 ~ 104 ~ 2 · 107 ~ 3 · 1010 106 1012 1018 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi di ordinamento 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati SelectionSort 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) 5 7 2 4 5 3 1 1 2 3 4 5 7 1 2 4 5 3 7 1 2 3 4 5 7 1 2 4 5 3 7 1 2 3 4 5 7 1 2 3 5 4 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati SelectionSort: analisi k - esima estrazione di minimo costa tempo O(n-k) In totale, il tempo di esecuzione è: n-1 ∑ k=1 n-1 O(n-k) = O (∑ ) i = O(n2) i=1 [ cambiamento di variabile (i = n – k) e serie aritmetica ] 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati InsertionSort Approccio incrementale. Estende ordinamento da k a (k+1) elementi, posizionando elemento (k+1)-esimo nella posizione corretta rispetto ai primi k elementi 7 7 2 4 5 3 1 2 4 5 7 3 1 2 7 4 5 3 1 2 3 4 5 7 1 2 4 7 5 3 1 1 2 3 4 5 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 è : n-1 O (∑ ) k = O(n2) k=1 [ serie aritmetica ] 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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) 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio di esecuzione (1) 7 2 4 5 3 1 2 7 4 7 5 7 3 7 1 7 (2) 2 4 5 3 1 7 2 4 4 5 3 5 1 5 (3) 2 4 3 1 5 7 2 4 3 4 1 4 (4) 2 3 1 4 5 7 2 3 1 3 (5) 2 1 3 4 5 7 1 2 1 2 3 4 5 7 2 4 3 1 5 7 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati O( n2 ) è quanto di peggio si possa fare: tutti i confronti possibili! Possiamo fare di meglio ? 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 1. QuickSort 2. MergeSort 3. HeapSort 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati QuickSort • 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 ricorsivamente 3 Impera: restituisci la concatenazione delle due sottosequenze ordinate 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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) 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Partizione in loco: un esempio 15 45 12 93 3 67 43 85 29 24 92 63 3 21 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 24 29 85 92 63 67 93 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi nel caso peggiore • 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) 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 5 5 6 7 1 2 3 4 2 5 4 3 1 5 7 6 1 2 3 4 5 5 6 7 2 5 4 3 1 1 2 4 3 5 1 2 3 4 5 1 1 1 17 dopo partition 6 6 6 Esempio di esecuzione output 7 6 6 7 6 7 4 3 5 3 4 5 3 4 5 3 3 3 input L’albero delle chiamate ricorsive può essere sbilanciato 5 5 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 è: n-1 C(n)= ∑ a=0 n-1 2 C(a) 1 n-1+C(a)+C(n-a-1) = n-1+ ∑ n n a=0 dove a e (n-a-1) sono le dimensioni dei sottoproblemi risolti ricorsivamente 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi nel caso medio n-1 La relazione di ricorrenza C(n)= n-1+ ∑ 2 C(a) n ha soluzione C(n) ≤ 2 n log n a=0 Dimostrazione per sostituzione Assumiamo per ipotesi induttiva che C(i) ≤ 2 i log i n-1 C(n)≤ n-1+∑ 2 2 i log i ≤n-1+ 4 n n i=0 n ∫2 x log x dx Integrando per parti si dimostra che C(n) ≤ 2 n log n 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati MergeSort Usiamo la tecnica del divide et impera: 1 Divide: dividi l’array a metà 2 Risolvi il sottoproblema ricorsivamente 3 Impera: fondi le due sottosequenze ordinate Rispetto a QuickSort, divide semplice ed impera complicato 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Fusione (Merge) • 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 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Mergesort: esempio di esecuzione 22 7 2 4 5 3 1 5 6 input 1 2 3 4 5 5 6 7 output 7 2 4 5 3 1 5 6 2 4 5 7 1 3 5 6 7 2 4 5 3 1 5 6 2 7 4 5 1 3 5 6 Input ed output delle chiamate ricorsive 7 2 4 5 3 1 5 6 7 2 4 5 3 1 5 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tempo di esecuzione • 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) 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni HeapSort • 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 livello 2) elementi di S memorizzati nei nodi dell’albero 3) chiave(padre(v)) ≥ chiave(v) per ogni nodo v 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Struttura dati heap Rappresentazione ad albero e con vettore posizionale 37 22 13 31 15 7 25 12 3 sin(i) = 2i des(i) = 2i+1 14 9 vettore posizionale 37 22 31 13 15 25 14 0 25 1 2 3 4 5 6 7 7 8 9 3 12 9 10 11 12 13 14 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Heap con struttura rafforzata Le foglie nell’ultimo livello sono compattate a sinistra 37 22 31 13 7 15 12 3 25 Il vettore posizionale ha esattamente dimensione n 14 9 vettore posizionale 0 26 37 22 31 13 15 25 14 7 3 12 1 8 9 2 3 4 5 6 7 9 10 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati La procedura fixHeap Se tutti i nodi di H tranne v soddisfano la proprietà di ordinamento a heap, possiamo ripristinarla come segue: 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) Tempo di esecuzione: O(log n) 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Estrazione del massimo • 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 Tempo di esecuzione: O(log n) 29 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Costruzione dell’heap Algoritmo ricorsivo basato su divide et impera heapify(heap H) if (H è vuoto) then return else heapify(sottoalbero sinistro di H) heapify(sottoalbero destro di H) fixHeap(radice di H,H) Tempo di esecuzione: T(n) = 2 T(n/2) + O(log n) T(n) = O(n) 30 dal Teorema Master Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati HeapSort • Costruisci un heap tramite heapify • Estrai ripetutamente il massimo per (n-1) volte O(n) O(n log n) – ad ogni estrazione memorizza il massimo nella posizione dell’array che si è appena liberata ordina “in loco” in tempo O(n log n) 31 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio di esecuzione 37 31 13 22 15 25 25 13 22 15 22 13 15 37 31 22 13 15 25 31 25 22 13 15 37 25 15 22 13 31 37 (1) (2) (3) 22 15 32 25 31 15 13 13 13 22 15 13 25 31 37 15 13 22 25 31 37 13 15 22 25 31 37 (4) (5) (6) Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Possiamo fare meglio di O(n log n)? 33 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Lower bound • 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…) 34 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Lower bound • 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! 35 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Modello basato su confronti • 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 36 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Come dimostrare lower bound • 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! 37 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Alberi di decisione • Strumenti per rappresentare algoritmi di ordinamento • Descrivono sequenza di confronti che un algoritmo esegue su istanze di lunghezza n 38 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Alberi di decisione = algoritmi basati su confronti! • 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 39 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Proprietà alberi di decisione • 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) 40 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Lower bound • 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 41 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Il lower bound Ω (n log n) • 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) 42 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Ordinamenti lineari (per dati con proprietà particolari) 43 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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é? 44 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati IntegerSort: fase 1 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 X 5 1 6 8 6 Y 0 0 0 0 1 0 0 1 2 3 4 5 6 7 X 5 1 6 8 6 Y 1 1 0 2 0 3 0 4 1 5 1 6 0 7 5 1 6 8 6 0 1 0 0 0 1 0 0 8 1 2 3 4 5 6 5 1 6 8 6 1 1 0 2 0 3 0 4 1 5 2 6 1 8 5 1 6 8 6 0 1 0 0 0 1 1 0 0 7 8 1 2 3 4 5 6 7 8 0 7 1 8 (a) Calcolo di Y 45 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati IntegerSort: fase 2 Scandisci Y da sinistra verso destra. Se Y[x] = k, scrivi in X il valore x per k volte X 1 1 Y 1 0 0 0 1 2 0 1 0 0 0 0 1 2 0 1 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 X 1 5 6 6 1 5 6 6 Y 0 1 0 2 0 3 0 4 0 1 0 3 0 4 0 5 2 6 0 7 1 8 0 2 0 5 0 6 0 7 1 8 1 5 0 1 0 2 0 3 0 4 1 5 1 5 6 6 8 0 1 0 2 0 3 0 4 0 5 2 6 0 7 1 8 0 6 0 7 1 8 (b) Ricostruzione di X 46 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati IntegerSort: analisi • O(k) per inizializzare contatori a 0 • O(n) per calcolare valori dei contatori • O(n + k) per ricostruire sequenza ordinata O(n + k) Tempo lineare se k = O(n) 47 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 48 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Stabilità • 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] 49 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati RadixSort • 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 Per b=10 50 2397 4368 5924 5924 2397 4368 5924 4368 2397 4368 2397 5924 2397 4368 5924 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Correttezza • 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 Dopo la t-esima passata di BucketSort, i numeri sono correttamente ordinati rispetto alle t cifre meno significative 51 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tempo di esecuzione • O(logb k) passate di bucketsort • Ciascuna passata richiede tempo O(n + b) O( (n + b) logb k) log k Se b = Θ(n), si ha O(n logn k) = O n log n Tempo lineare se k = O(nc), c costante 52 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Riepilogo • 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 53 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmi e Strutture Dati Capitolo 5 Selezione e statistiche di ordine Algoritmi e strutture dati Fabrizio Grandoni 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 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Selezione: approcci naïf • 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) O(n) se k = O(n/log n) … ma non risolve problema del mediano in tempo lineare! 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Calcolo randomizzato del mediano (con numero atteso di confronti lineare ) 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Usare QuickSort? 1. Divide: scegli pivot x e partiziona in elementi ≤ x ed elementi > x 2. Risolvi due sottoproblemi (QuickSort) 3. Impera: concatena sottosequenze ordinate 4. Restituisci k-esimo elemento nella sequenza Numero atteso di confronti O(n log n) Possiamo fare di meglio? 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Usare QuickSort? 1. Divide: scegli pivot x e partiziona in elementi ≤ x ed elementi > x 2. Risolvi UN SOTTOPROBLEMA (QuickSort) 3. Impera: concatena sottosequenze 4. Restituisci k-esimo elemento nella sequenza Numero atteso di confronti: ancora O(n log n) Possiamo fare di meglio? 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni QuickSelect 1. Divide: scegli pivot x e partiziona in elementi ≤ x ed elementi > x 2. Risolvi un solo sottoproblema (RICORSIVAMENTE) 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni QuickSelect 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi nel caso peggiore • 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) 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni QuickSelect Randomizzato • Come per QuickSort, possiamo evitare caso peggiore scegliendo pivot a caso • Ad ogni passo eliminiamo almeno |A2| + min{ |A1|, |A3| } elementi 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Analisi di QuickSelect 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 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Intuizione • Maggior numero di confronti in QuickSelect si ha per k = n/2 , ovvero nel caso del mediano A1 <x A1 <x A3 >x k k 12 n/2 k A1 <x n/2 (a) A3 >x (b) A3 >x (c) Per k < n/2 ci sono maggiori possibilità di ricorrere sul più piccolo dei due insiemi A1 e A3 n/2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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: n-1 C(n) = n-1+ ∑ 2 C(i) n i=n/2 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi di QuickSelect Randomizzato C(n) ≤ A n Dimostriamo per sostituzione che n-1 C(n) = n-1+ ∑ 2 C(i) ≤ n-1+ n i=n/2 n-1 ∑ i=n/2 n-1 2 ≤ n-1+ 2 A ∑ i ≤ n-1+ n A n 2 Ai n (∑ i=n/2 ≤ n-1+ 2 A n ( n2 - n2 - n 2 8 4 1 + 3A n 4 3A C(n) ≤ A n se 1+ 4 ≤ ( i=1 n/2-1 i -∑ i ) i=1 1 + 3A 4 ) n -1- A 2 ) ( 14 ) ( = n-1 ) ≤A ovvero A ≥ 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Numero atteso di confronti Relazione di ricorrenza del QuickSelect ha soluzione C(n) ≤ 4 n Il numero atteso di confronti di QuickSelect è lineare 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo usato in pratica Per convergere rapidamente, scegli il pivot il più vicino possibile al k-esimo (dal lato giusto) Come? Scegli un campione opportuno (m elementi) Scegli il pivot come il j-esimo degli m elementi: j = k m +- δ n 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Calcolo deterministico del mediano (con un numero lineare di confronti nel caso peggiore) 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo deterministico “Derandomizzare” l’algoritmo randomizzato Segui l’idea dell’algoritmo usato in pratica Scegli un campione deterministico (non casuale) Scegli il pivot come il mediano del campione 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo deterministico: dettagli 1. Scegli n/5 quintuple 2. Per ogni quintupla calcola il mediano 3. Il campione è definito dai mediani delle quintuple 4. Calcola (ricorsivamente) il pivot come mediano dei mediani 5. Prosegui ricorsivamente (come per l’algoritmo randomizzato) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Select Calcolo deterministico del pivot tramite una chiamata ricorsiva (riga 6) 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Mediano dei mediani • Pivot M è mediano dei mediani mi dei n/5 gruppi di 5 elementi • 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) • La riga 6 è una chiamata ricorsiva su n/5 elementi • La partizione (righe 7-10) richiede n-1 confronti 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo deterministico: analisi 1. Scegli n/5 quintuple 2. Per ogni quintupla calcola mediano 3. Campione definito da mediani delle quintuple 4. Calcola (ricorsivamente) il pivot come mediano dei mediani 5. Partiziona intorno al pivot 6. Prosegui ricorsivamente (come per l’algoritmo randomizzato) 23 (7/5) n T( n/5 ) n-1 T( (7/10) n ) Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 24 per c ≥ 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo • 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 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 6 Alberi di ricerca Algoritmi e strutture dati Fabrizio Grandoni Dizionari • Gli alberi di ricerca sono usati per realizzare in modo efficiente il tipo di dato dizionario 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Alberi binari di ricerca (BST = binary search tree) 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempi Albero binario di ricerca 5 Albero binario NON di ricerca Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Ricerca del massimo 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Ricerca del predecessore 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni delete(elem e) Sia u il nodo contenente l’elemento e da cancellare: 1) u è una foglia: rimuovila 2) u ha un solo figlio: 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni delete(elem e) 3) u ha due figli: sostituiscilo con il predecessore (v) e rimuovi fisicamente il predecessore (che ha un solo figlio) 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Costo delle operazioni • Tutte le operazioni hanno costo O(h) dove h è l’altezza dell’albero • O(n) nel caso peggiore (alberi molto sbilanciati e profondi) 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Alberi AVL (Adel’son-Vel’skii e Landis) 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Definizioni Fattore di bilanciamento di un nodo v = | altezza sottoalbero sinistro di v altezza sottoalbero destro di v | Un albero si dice bilanciato in altezza se ogni nodo v ha fattore di bilanciamento ≤ 1 Alberi AVL = alberi binari di ricerca bilanciati in altezza 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Altezza di alberi AVL Si può dimostrare che un albero AVL con n nodi ha altezza O(log n) Idea della dimostrazione: tra tutti gli AVL di altezza h, consideriamo quelli con minimo numero di nodi nh (alberi di Fibonacci) Si ha: nh= 1 + nh-1 + nh-2 = Fh+3-1 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Rotazione di base • Mantiene la proprietà di ricerca • Richiede tempo O(1) 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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) 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Rotazione SS • Applicare una rotazione semplice verso destra su v • L’altezza dell’albero coinvolto nella rotazione passa da h+3 a h+2 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni insert(elem e, chiave k) 1. Crea un nuovo nodo u con elem=e e chiave=k 2. Inserisci u come in un BST 3. 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 • 21 N.B.: una sola rotazione è sempre sufficiente, poiché l’altezza dell’albero coinvolto diminuisce di 1 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni delete(elem e) 1. Cancella il nodo come in un BST 2. 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 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Cancellazione con rotazioni a cascata 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Classe AlberoAVL 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Costo delle operazioni • Tutte le operazioni hanno costo O(log n) poché l’altezza dell’albero è O(log n) e ciascuna rotazione richiede solo tempo costante 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo • 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) 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 7 Tavole hash Fabrizio Grandoni Algoritmi e strutture dati Implementazioni Dizionario Tempo richiesto dall’operazione più costosa: 2 - Liste O(n) - Alberi di ricerca non bilanciati O(n) - Alberi di ricerca bilanciati O(log n) - Tavole hash O(1) Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tavole ad accesso diretto Sono dizionari basati sulla proprietà di accesso diretto alle celle di un array 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 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Implementazione 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Fattore di carico Misuriamo il grado di riempimento di una tavola usando il fattore di carico n α= m 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! 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Pregi e difetti Pregi: – Tutte le operazioni richiedono tempo O(1) Difetti: – 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! 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Tavole hash Per ovviare agli inconvenienti delle tavole ad accesso diretto ne consideriamo un’estensione: le 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)] 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Collisioni Le 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! 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Funzioni hash perfette Un modo per evitare il fenomeno delle collisioni è usare funzioni hash perfette. Una funzione hash si dice perfetta se è iniettiva, cioè per ogni u,v ∈ U: u ≠ v ⇒ h(u) ≠ h(v) Deve essere |U| ≤ m 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Implementazione 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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)… 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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! 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Uniformità semplice Sia 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: 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Risoluzione delle collisioni Nel caso in cui non si possano evitare le collisioni, dobbiamo trovare un modo per risolverle. Due metodi classici sono i seguenti: 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 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Liste di collisione Esempio di tabella hash basata su liste di collisione contenente le lettere della parola: PRECIPITEVOLIS SIMEVOLMENTE 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Implementazione 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Indirizzamento aperto Supponiamo 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) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Implementazione 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Metodi di scansione: scansione lineare Scansione lineare: c(k,i) = ( h(k) + i ) mod m per 0 ≤ i < m 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio Inserimenti in tavola hash basata su indirizzamento aperto con scansione lineare delle lettere della parola: PRECIPITEVOLIS SIMEVOLMENTE 4,8 celle scandite in media per inserimento 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Metodi di scansione: hashing doppio La scansione lineare provoca effetti di agglomerazione, cioè lunghi gruppi di celle consecutive occupate che rallentano la scansione L’hashing doppio riduce il problema: c(k,i) = h1(k) + i·h2(k) mod m per 0 ≤ i < m, h1 e h2 funzioni hash 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio Inserimenti in tavola hash basata su indirizzamento aperto con hashing doppio delle lettere della parola: PRECIPITEVOLIS SIMEVOLMENTE 3,1 celle scandite in media per inserimento 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi del costo di scansione Tempo 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) 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Cancellazione elementi con indir. aperto 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo • 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 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 8 Code con priorità Algoritmi e strutture dati Fabrizio Grandoni Tipo di dato CodaPriorità (1/2) 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Tipo di dato CodaPriorità (2/2) 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tre implementazioni d-heap: generalizzazione degli heap binari visti per l’ordinamento heap binomiali heap di Fibonacci 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati d-heap 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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)) 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio Heap d-ario con 18 nodi e d = 3 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Procedure ausiliarie Utili per ripristinare la proprietà di ordinamento a heap su un nodo v che non la soddisfi T(n) = O(log n) d T(n) = O(d logd n) 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati findMin T(n) = O(1) 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati insert(elem e, chiave k) T(n) = O(logd n) ( muoviAlto ) 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati delete(elem e) e deleteMin T(n) = O(d logd n) ( muoviBasso ) Può essere usata anche per implementare cancellazione del minimo 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati decreaseKey(elem e, chiave d) T(n) = O(logd n) ( muoviAlto ) 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati increaseKey(elem e, chiave d) T(n) = O(d logd n) ( muoviBasso ) 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Heap binomiali 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Alberi binomiali Albero binomiale Bh (definito ricorsivamente) : 2. B0 consiste di un unico nodo 3. Per i ≥ 0, Bi+1 ottenuto fondendo due alberi binomiali Bi con radice di uno figlia della radice dell’altro 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Proprietà strutturali 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 foresta 4. 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)) 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Proprietà In un heap binomiale con n nodi, vi sono al più log2 n alberi binomiali, ciascuno con grado ed altezza O(log n) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Procedura ausiliaria Utile per ripristinare la proprietà di unicità in un heap binomiale T(n) è proporzionale al numero di alberi binomiali in input 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (1/3) 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (2/3) 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi Ammortizzata 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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: • 25 Analisi ammortizzata Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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: • • • 26 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 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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) • • • 27 Media sulla sequenza: O(σ t) / σ = O(t) Nota: una singola operazione potrebbe richiedere più di O(t) nel caso peggiore! Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 • 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 29 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Esempio 1 Analisi nel caso peggiore: • push(x): O(1) • multipop(k): O( min { k, |P| } ) = O(n) dove |P| è la dimensione della pila Quanto tempo richiederà una sequenza di σ operazioni? O(σ n) ? No! 30 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 31 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 EUR Allocare EUR in modo da pagare per tutti i passi Metodo del potenziale: • Analogia con analisi potenziale (Fisica) 32 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Metodo del Banchiere per Esempio 1 Quando esegui push(x) “sborsa” 2 EUR: • 1 EUR per pagare lavoro richiesto da push(x) • 1 EUR conservato nell’elemento x Quando 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) EUR 2. Tutti gli EUR “sborsati” sufficienti a pagare per lavoro richiesto dalle operazioni 33 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Metodo del Potenziale Definisci 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 ∆ Φ ) 34 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Metodo del Potenziale Tipicamente potenziale Φ soddisfa le: Φ(D0) = 0 e Φ(Di) ≥ 0 per ogni i Definiamo tempo ammortizzato ai dell’operazione iesima: 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 35 ≥ Σ i ti Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Metodo del Potenziale per Esempio 1 Definiamo potenziale Φ della pila P: Nota che: Φ(P) = |P| Φ(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 36 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Heap di Fibonacci 37 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Heap di Fibonacci Heap 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 38 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Conclusioni: tabella riassuntiva L’analisi di DHeap e HeapBinomiale è nel caso peggiore, mentre quella per HeapBinomialeRilassato e HeapFibonacci è ammortizzata 39 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 9 Union-find Algoritmi e strutture dati Fabrizio Grandoni Il problema Union-find Mantenere 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} 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio n=6 L’elemento in grassetto dà il nome all’insieme 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Approcci elementari 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (1/2) 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (2/2) 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (1/2) 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (2/2) 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Altezza lineare Sequenza di union che costruisce un albero di altezza lineare 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Euristiche di bilanciamento nell’operazione union 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Bilanciamento in algoritmi QuickFind Nell’unione degli insiemi A e B, modifichiamo il padre dei nodi nell’insieme di cardinalità minore 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (1/3) 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (2/3) 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (3/3) Tam = tempo per operazione ammortizzato su una intera sequenza 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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) Idea della dimostrazione 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 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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” 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (1/3) 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (2/3) 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Realizzazione (3/3) 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Conseguenza del bilanciamento Un albero QuickUnion bilanciato in altezza con radice x ha almeno 2rank(x) nodi Dimostrazione: induzione sul numero di operazioni – Se rank(A) > rank(B) durante una union: – Se rank(A) < rank(B): simmetrico – Se rank(A) = rank(B): 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo sul bilanciamento 29 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Euristiche di compressione nell’operazione find 30 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 31 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati albero prima di find(x) Esempi Path compression Path halving Path splitting 32 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Union-find con bilanciamento e compressione 33 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 34 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Terminologia La funzione log * cresce molto lentamente 35 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 ) 36 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Conclusioni • Strutture dati efficienti per il problema unionfind • 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 37 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 10 Tecniche algoritmiche Fabrizio Grandoni Algoritmi e strutture dati 1. Divide et impera 2. Programmazione dinamica 3. Greedy 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Divide et impera Tecnica top-down: 3. Dividi il problema in due o più sottoproblemi 4. Risolvi (ricorsivamente) i sottoproblemi 5. Ricombina soluzioni dei sottoproblemi per ottenere la soluzione del problema originario Esempi: ricerca binaria, mergesort, quicksort, … 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Moltiplicazione di interi di lunghezza arbitraria 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? 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Divisione del problema 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Osservazioni • 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) 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Equazione di ricorrenza La soluzione è Θ(n2) dal Teorema Master Cosa abbiamo guadagnato? 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Ridurre il numero di moltiplicazioni 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi Eseguiamo tre moltiplicazioni e un numero costante di somme e shift La soluzione è Θ(n Master 10 log23 ) = Θ(n1.59) dal Teorema Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Programmazione Dinamica 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Programmazione Dinamica Per evitare di risolvere più volte lo stesso sottoproblema, memorizziamo la soluzione dei vari sottoproblemi: 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] 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Programmazione dinamica 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) Esempio: numeri di Fibonacci 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Distanza tra stringhe Siano X e Y due stringhe di lunghezza m ed n: Vogliamo calcolare la “distanza” tra X e Y, ovvero il minimo numero di operazioni elementari che consentono di trasformare X in Y 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Trasformare RISOTTO in PRESTO: 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Approccio • Indichiamo con δ(X,Y) la distanza tra X e Y • Indichiamo con Xi il prefisso di X fino all’i-esimo carattere, per 0 ≤ i ≤ m (X0 è la stringa vuota): • 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 • 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 D [ i , j ] = D [ i-1 , j-1 ] • Se xi ≠ yj, distinguiamo in base all’ultima operazione usata per trasformare Xi in Yj in una sequenza ottima di operazioni 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 D [ i , j ] = 1 + D [ i , j-1 ] 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-1 , j ] 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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: 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Pseudocodice Tempo di esecuzione ed occupazione di memoria: O(m n) 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio La tabella D costruita dall’algoritmo. In grassetto sono indicate due sequenze di operazioni che permettono di ottenere la distanza tra le stringhe 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tecnica golosa (o greedy) 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 1. Insieme di candidati (e.g., città) 2. Insieme dei candidati già esaminati 3. Funzione ammissibile(): verifica se un insieme di candidati rappresenta una soluzione, anche non ottima (un insieme di città è un cammino da Napoli a Torino?) 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Problemi di ottimizzazione (2/2) 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) 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Tecnica golosa Perché goloso? Sceglie sempre il candidato più promettente! 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Un problema di sequenziamento Un server (e.g., una CPU, o un impiegato dell’ufficio postale) deve “servire” n clienti Il servizio richiesto dall’i-esimo cliente richiede ti secondi Chiamiamo T(i) il tempo di attesa del cliente i Vogliamo minimizzare il tempo di attesa medio, i.e.: e quindi 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio Sei possibili ordinamenti: Qual è il migliore? 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Un algoritmo goloso • 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: • • 29 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 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Riepilogo 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) 30 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 11 Grafi e visite di grafi Fabrizio Grandoni Algoritmi e strutture dati 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} 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Terminologia (1/2) Esempio 1: relazione simmetrica grafo non orientato Esempio 2: relazione non simmetrica grafo orientato n = numero di vertici m = numero di archi L ed I sono adiacenti (L,I) è incidente a L ∑ δ(v) = 2m v∈V I ha grado 4: δ(I) = 4 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Strutture dati per rappresentare grafi 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Grafi non orientati 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Grafi orientati 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Prestazioni della lista di archi 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Prestazioni delle liste di adiacenza 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Prestazioni della matrice di adiacenza 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Visite di grafi 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 sistematico Problema di base in molte applicazioni Esistono varie tipologie di visite con diverse proprietà. In particolare: – visita in ampiezza (BFS = Breadth First Search) – visita in profondità (DFS = Depth First Search) 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo di visita generica 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Osservazioni Un vertice viene marcato quando viene incontrato per la prima volta: marcatura implementata tramite un vettore di bit di marcatura Visita genera un albero di copertura T del grafo Insieme 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 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Visita in ampiezza 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Visita in ampiezza 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo non orientato (1/2) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo non orientato (2/2) 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo orientato 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Visita in profondità 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Visita in profondità 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo non orientato (1/2) 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo non orientato (2/2) 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo orientato (1/2) 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio: grafo orientato (2/2) 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 29 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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à 30 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 12 Minimo albero ricoprente Fabrizio Grandoni Algoritmi e strutture dati 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. 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempi Il minimo albero ricoprente non è necessariamente unico 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Proprietà di minimi alberi ricoprenti 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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∈Xev∈X Un ciclo è un cammino in cui il primo e l’ultimo vertice coincidono 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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. 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di Kruskal 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Pseudocodice 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio (1/2) 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio (2/2) 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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) 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di Prim 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Pseudocodice 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio (1/2) 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio (2/2) 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati ° Algoritmo di Boruvka 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Analisi Il tempo di esecuzione dell’algoritmo di ° Boruvka è O(m log n) nel caso peggiore (Senza usare strutture dati sofisticate) 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 13 Cammini minimi Algoritmi e strutture dati Fabrizio Grandoni 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. 2 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 3 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 4 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 5 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Calcolare cammini minimi da distanze Problema: Le distanze non sono note (è proprio quello che vogliamo trovare!) 6 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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: 7 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo generico per il calcolo delle distanze Rilassamento 8 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di Bellman e Ford (per cammini minimi a sorgente singola) 9 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 ! 10 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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! 11 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Pseudocodice Tempo di esecuzione: O(n m) 12 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo per grafi diretti aciclici (per cammini minimi a sorgente singola) 13 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Ordinamento topologico Funzione σ: V → {1, … n} tale che σ(u) < σ(v) se esiste un cammino da u a v in G Esiste se e solo se G è aciclico 14 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Calcolo di un ordinamento topologico Tempo di esecuzione: O(n+m) 15 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Cammini minimi in grafi aciclici Eseguire i rilassamenti in ordine topologico Tempo di esecuzione: O(n+m) 16 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Algoritmo di Dijkstra (per cammini minimi a sorgente singola in grafi con costi non negativi) 17 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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 18 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo di Dijkstra 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 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) 19 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Pseudocodice 20 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio (1/2) 21 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Esempio (2/2) 22 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Tempo di esecuzione Al più: n deleteMin, n insert e m decreaseKey O(m log n) utilizzando heap O(m + n log n) utilizzando heap di Fibonacci 23 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni Algoritmo di Floyd e Warshall (per cammini minimi tra tutte le coppie) 24 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati 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 25 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Relazioni tra distanze vincolate k il costo di un cammino minimo • Sia dxy k-vincolato da x a y. Risulta: 0 = w(x,y) se (x,y) ∈ E, +∞ altrimenti • dxy n = d • dxy xy • L’algoritmo calcola dxy dal basso verso l’alto, incrementando k da 1 a n 26 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Fabrizio Grandoni Algoritmi e strutture dati Pseudocodice Tempo di esecuzione: O(n3) 27 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004 Algoritmi e strutture dati Fabrizio Grandoni 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) 28 Demetrescu, Finocchi, Italiano McGraw-Hill © 2004