Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 2 Una tecnica algoritmica può essere vista come un meta-algoritmo che permette di risolvere unampia classe di problemi, i quali, per loro natura, si prestano ad essere risolti appunto in modo analogo In particolare, abbiamo già visto dettagliatamente la tecnica divide et impera Oggi vedremo la Programmazione Dinamica e il Metodo Goloso, che troveranno ampia applicazione nei problemi su grafi Sommario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 3 Tecnica top-down: 1.Dividi listanza del problema in due o più sottoistanze 2.Risolvi ricorsivamente il problema sulle sottoistanze 3.Ricombina la soluzione dei sottoproblemi allo scopo di ottenere la soluzione globale Richiamo: la tecnica divide et impera Esempi: mergesort, quicksort
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 4 Tecnica bottom-up: 1.Identifica dei sottoproblemi del problema originario, procedendo logicamente dai problemi più piccoli verso quelli più grandi 2.Utilizza una tabella per memorizzare le soluzioni dei sottoproblemi incontrati: quando si incontra lo stesso sottoproblema, sarà sufficiente esaminare la tabella 3.Si usa quando i sottoproblemi non sono indipendenti, e lo stesso sottoproblema può apparire più volte Programmazione dinamica
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 5 Un esempio banale: 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]
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 6 Siano X e Y due stringhe di lunghezza m ed n: Distanza tra stringhe Vogliamo calcolare la distanza tra X e Y, ovvero il minimo numero delle seguenti operazioni elementari da eseguire su X che permetta di trasformare X in Y
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 7 Esempio Parto dalla stringa X=RISOTTO, e voglio trasformarla in Y=PRESTO La soluzione banale consiste nel fare 7 cancellazioni e 6 inserimenti, cioè 13 operazioni Unaltra soluzione semplice: sostituisco uno dopo laltro i caratteri di RISOTTO, ove necessario, e cancello i caratteri in eccesso; nel nostro esempio, saranno 5 sostituzione e 1 cancellazione (cioè, 6 operazioni). Posso fare meglio? Vediamo una sequenza di operazioni controintuitiva: Abbiamo fatto solo 4 operazioni! Posso fare meglio??
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 8 Definiamo X i il prefisso di X fino alli-esimo carattere, per 0 i m (X 0 denota la stringa vuota): Approccio Risolveremo il problema di calcolare (X,Y) calcolando (X i,Y j ) per ogni i, j tali che 0 i m e 0 j n Manterremo le informazioni in una tabella D di dimensione (m+1) (n+1) Denotiamo con (X,Y) la distanza tra X e Y
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 9 Inizializzazione della tabella Alcuni sottoproblemi sono molto semplici: (X 0,Y j )=j per trasformare la stringa vuota X 0 nella stringa Y j, basta inserire uno ad uno gli j caratteri di Y j (X i,Y 0 )=i per trasformare la stringa X i nella stringa vuota Y 0, basta rimuovere uno ad uno gli i caratteri di X i Queste soluzioni sono memorizzate rispettivamente nella prima riga e nella prima colonna della tabella D
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 10 Esempio La tabella D inizializzata dallalgoritmo
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 11 Avanzamento nella tabella (1/3) Se x i =y j, il minimo costo per trasformare X i in Y j è uguale al minimo costo per trasformare X i-1 in Y j-1 (infatti, non dovrò fare alcuna operazione su x i, visto che esso coincide con y j ) Se x i y j, allora per trasformare X i in Y j devo fare una qualche operazione sulli-esima posizione di X i ; distinguiamo quindi in base allultima operazione che dovremmo usare per trasformare X i in Y j in una sequenza ottima di operazioni D [ i, j ] = D [ i-1, j-1 ]
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 12 Avanzamento nella tabella (2/3) (in realtà questa operazione viene fatta sulla posizione (i+1)-esima di X i ) il minimo costo per trasformare X i in Y j è uguale al minimo costo per trasformare X i in Y j-1 più 1 per inserire il carattere y j il minimo costo per trasformare X i in Y j è uguale al minimo costo per trasformare X i-1 in Y j più 1 per la cancellazione del carattere x i D [ i, j ] = 1 + D [ i, j-1 ] D [ i, j ] = 1 + D [ i-1, j ]
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 13 Avanzamento nella tabella (3/3) il minimo costo per trasformare X i in Y j è uguale al minimo costo per trasformare X i-1 in Y j-1 più 1 per sostituire il carattere x i con y j D [ i, j ] = 1 + D [ i-1, j-1 ] In conclusione:
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 14 Pseudocodice Tempo di esecuzione ed occupazione di memoria: Θ(m n) NOTA: Se tengo traccia della casella della tabella che utilizzo per decidere il valore di D[i,j], ho un metodo costruttivo per ricostruire la sequenza di operazioni di editing ottima.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 15 Esempio La tabella D costruita dallalgoritmo. In grassetto è indicata la sequenza di operazioni che permette di ottenere la distanza tra le stringhe (verificate che coincide con quella data prima!) inserimento mantenimento sostituzionecancellazione
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 16 La tecnica golosa (o greedy) La tecnica golosa (greedy) si applica principalmente a problemi di ottimizzazione in cui, dato un certo numero di elementi come input, bisogna scegliere un sottoinsieme di essi che ottimizzi una funzione obbiettivo rispettando un certo numero di vincoli. Richiede che lalgoritmo esegua il processo di costruzione della soluzione in fasi successive, in cui ad ogni fase viene aggiunto un elemento alla soluzione.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 17 Tecnica golosa (2) Un algoritmo greedy ordina dapprima gli oggetti in base ad un criterio di appetibilità (da cui il termine goloso), e poi ripete le seguenti operazioni: 1.Ad ogni fase i, la soluzione viene accresciuta selezionando l i-esima componente, la quale, tra tutte quelle ammissibili, risulta la migliore in questo momento rispetto al criterio di appetibilità 2.Una volta fatta la scelta per la i-esima componente, si aggiornano (eventualmente) le appetibilità, e si passa a considerare le scelte successive, senza più tornare sulla decisione presa. Questa strategia euristica non garantisce sempre la determinazione di una soluzione ottima
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 18 Paradigma di tecnica golosa
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 19 Un server (e.g., una CPU, o un impiegato dellufficio postale) deve servire n clienti, stabilendo un ordine sapendo che il servizio richiesto dal cliente i richiede t i secondi Chiamiamo T(i) il tempo di attesa del cliente i (pari al suo tempo di processamento sommato ai tempi di processamento dei clienti che lo hanno preceduto) e sia il tempo di attesa totale di tutti i clienti Vogliamo stabilire un ordine che minimizzi il tempo di attesa medio: Un problema di sequenziamento Devo minimizzare il tempo di attesa totale!
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 20 Esempio Dei sei possibili ordinamenti, il migliore è evidenziato in arancione
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 21 Il seguente algoritmo genera lordine di servizio in maniera incrementale secondo una strategia greedy: –Il primo cliente ad essere servito è quello con tempo di processamento minimo. –Al generico passo lalgoritmo serve la richiesta più corta tra quelle rimanenti. Un algoritmo goloso ottimo La sequenza generata è ottima: infatti, è facile osservare che il tempo di attesa totale può essere riscritto come segue: T=n·t 1 +(n-1)·t 2 +…+1·t n e quindi è minimo quando t 1 t 2 … t n Tempo di esecuzione: Θ(n log n) (ordinamento ottimo)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 22 Gli algoritmi greedy non sempre funzionano! Esempio: Input: lista di interi che rappresentano il valore di monete disponibili e un intero che rappresenta un resto. Output: una collezione di cardinalità minima di monete la cui somma sia uguale al resto. Appetibilità: Taglio della moneta Ma supponendo di dover formare un resto di 9, avendo a disposizione monete da 1, 4 e 6… lalgoritmo darebbe mentre la soluzione ottima è ! Un algoritmo goloso non ottimo
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 23 –Programmazione dinamica: cammini minimi tra tutte le coppie di nodi (algoritmo di Floyd e Warshall) –Tecnica greedy: minimo albero ricoprente (algoritmi di Prim, Kruskal, Boruvka) e cammini minimi a sorgente singola (algoritmo di Dijkstra) Applicazioni future su grafi