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 Tecnica top-down: 1 Dividi l’istanza 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 Divide et impera Esempi: mergesort, quicksort
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 3 Programmazione dinamica
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 Esempio: algoritmo Fibonacci3
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 5 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 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 RISOTTO, e voglio trasformarla in PRESTO La soluzione banale consiste nel fare 7 cancellazioni e 6 inserimenti, cioè 13 operazioni Un’altra soluzione semplice: sostituisco uno dopo l’altro 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 “strana” sequenza di operazioni: 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 all’i-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 partendo dalla stringa vuota X 0, basta inserire uno ad uno gli j caratteri di Y j (X i,Y 0 )=i partendo da X i, basta rimuovere uno ad uno gli i caratteri per ottenere Y 0 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 dall’algoritmo
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 Se x i y j, distinguiamo in base all’ultima operazione usata 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) 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 per 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 dall’algoritmo. In grassetto è indicata la sequenza di operazioni che permette di ottenere la distanza tra le stringhe (verificate che coincide con quella data prima!)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 16 Tecnica golosa (o greedy)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 17 Tecnica golosa La tecnica golosa (greedy) si applica principalmente a problemi di ottimizzazione. Richiede che l’algoritmo esegua il processo di costruzione della soluzione in stadi successivi e si basa sui seguenti principi: 1.Ad ogni stadio i, la soluzione viene accresciuta selezionando l’ i-esima componente, la quale, tra tutte quelle ammissibili, risulta la migliore rispetto a un determinato criterio 2.Una volta fatta la scelta per la i-esima componente, si passa a considerare le successive, senza più tornare sulla decisione presa.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 18 Tecnica golosa (2) Un algoritmo greedy ordina dapprima gli oggetti in base ad un criterio di appetibilità (da cui il termine goloso) Permette di ottenere una soluzione ottima mediante una sequenza di decisioni; ad ogni passo viene presa la decisione che al momento appare migliore. 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 19 Paradigma di tecnica golosa
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 20 Un server (e.g., una CPU, o un impiegato dell’ufficio postale) deve servire n clienti Il servizio richiesto dall’i-esimo cliente 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 precedenti), e sia il tempo di attesa totale Vogliamo minimizzare il tempo di attesa medio, i.e.: 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 21 Esempio Dei sei possibili ordinamenti, il migliore è evidenziato in giallo
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 22 Il seguente algoritmo genera l’ordine di servizio in maniera incrementale secondo una strategia greedy: –Il primo cliente ad essere servito è quello con tempo di processamento minimo. –Al generico passo l’algoritmo 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 23 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… l’algoritmo 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 24 –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