Nozione di Algoritmo - Università degli Studi di Milano
by user
Comments
Transcript
Nozione di Algoritmo - Università degli Studi di Milano
Lezione 1 - Nozione di Algoritmo Corso — Programmazione Fondamenti di programmazione— Algoritmi Marco Anisetti e-mail: [email protected] web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano — Dipartimento di informatica Algoritmo e MdT • MdT introdotta come modello di calcolo per formalizzare il concetto di calcolo allo scopo di stabilire l'esistenza di metodi algoritmici per il riconoscimento dei teoremi nell'ambito dell'Aritmetica. • MdT è legata al concetto di automa, come esecutore di una serie di passi (sempre uguali per ogni automa) dipendenti dall'input • L'automa è legato al linguaggio che riconosce o che utilizza • Il linguaggio è fondamentale per comprendere come descrivere i passi da far eseguire ad una macchina in modo che siano comprensibili alla macchina stessa Architettura di Von Neumann: conseguenze • Una macchina è in grado di risolvere più problemi a patto di elencarne i passi da seguire per farlo. • Lo sviluppo di strumenti formali per l'elaborazione dell'informazione • Nascita di una disciplina che, dato un problema applicativo, mira ad individuare un procedimento di calcolo che ne consente la soluzione (algoritmo) • Si separa l'individuazione degli insiemi di passi (algoritmi) che risolvono problemi dati (attivita' umana) dall'esecuzione di tali passi (algoritmi) (attivita' svolta da un calcolatore) Algoritmo: definizione storica Termine dovuto al famoso scrittore al-Khwarizmi: nato nel 780 circa a Baghdad Originariamente chiamato algorism, un algoritmo è sequenza finita di istruzioni che specificano come certe operazioni elementari debbano susseguirsi nel tempo per risolvere una data classe di problemi. • Operazioni elementari: operazioni note all'esecutore • Istruzioni: richieste di azioni rivolte all'esecutore e che da questo devono essere capite ed eseguite • Classe di problemi: una formulazione del problema indipendente dagli specifici dati su cui opera Algoritmi: Proprietà • Oltre alle proprietà di eseguibilità e non ambiguità di un algoritmo, altre proprietà fondamentali degli algoritmi sono Definito: ogni passo dell'algoritmo è precisamente definito (rigoroso e non ambiguo) [dati e risultati definiti] Correttezza: l'esecuzione dell'algoritmo porta realmente alla soluzione del problema dato Efficienza: quanto ``costa'' l'esecuzione di un algoritmo in termini di risorse consumate Finitezza: normalmente si richiede che l'algoritmo termini in un tempo finito, e cioè che la sequenza di istruzioni che caratterizzano l'algoritmo sia una sequenza finita Algoritmi: caratteristiche • Istruzioni insieme ordinato e finito di operazioni da eseguire • Ogni istruzione è univoca cioè non lascia dubbi o ambiguità sul da farsi • Esiste un esecutore in grado di eseguire le istruzioni • Le procedure risolvono una classe di problemi • Non esiste un modo unico per risolvere un problema • Un algoritmo e' corretto se per ogni istanza di input si arresta con l'output corretto Algoritmo esempio • Ricetta da cucina • E' una sequenza di passi finiti ed in ordine per giungere alla preparazione del piatto • I passi non sono ambigui (per quanto possa non essere ambiguo il linguaggio naturale) • Tutte le istruzioni sono eseguibili dall'esecutore della ricetta • Risolve una classe di problemi: la ricetta generalizza certe istruzioni: le quantità, ad esempio, subordinate al numero di persone rappresentando solo i rapporti fra quantità (una parte, 1/2 parte etc) Algoritmo - programma - esecutore • Un programma è l'espressione di un algoritmo in un linguaggio che l'esecutore è in grado di comprendere direttamente. Un programma è un'espressione concreta dell'algoritmo che ne è l'astrazione • A seconda dell'esecutore, lo stesso algoritmo può essere espresso in linguaggi differenti • La scrittura del programma è la fase successiva all'individuazione dell'algoritmo per risolvere un determinato problema Calcolatore - programma programmazione • Calcolatore Un automa il cui comportamento segue delle regole ben precise: è in grado di ``comprendere'' un repertorio ristretto di istruzioni elementari e di eseguirle con una enorme rapidità ed elevata precisione • Programma Sequenza di istruzioni elementari che un calcolatore è in grado di comprendere ed eseguire • Programmazione Attività che consiste nell'organizzare istruzioni elementari, direttamente comprensibili dall'esecutore, in strutture complesse (programmi) al fine di svolgere determinati compiti Problema - algoritmo - programma Problema - algoritmo - programma Problema - algoritmo - programma Lezione 2 - Problema - Algoritmo – Esecutore Corso — Programmazione Fondamenti di programmazione— Algoritmi Marco Anisetti e-mail: [email protected] web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano — Dipartimento di informatica Problema - algoritmo - programma Formulazione di un problema • Definizione dei dati e dei risultati che si vogliono ottenere (a partire dai dati) • Processo di formulazione di un problema: 1. Individuazione dei dati in ingresso 2. Individuazione dei risultati desiderati 3. Individuazione dell'algoritmo di risoluzione Analisi dei requisiti Problema ed istanza(1) • Specificando quali sono i dati di ingresso si definisce una istanza di Problema Problema P: dato un naturale n calcolare la somma dei primi n naturali Istanza di P: risolvere P per n = 12 (ovvero calcolare la somma dei primi 12 naturali) • Un problema può essere visto come l'insieme di tutte le sue possibili istanze Problema ed istanza(2) [*] Prof. Andrea G. B. Tettamanzi Problema ed Istanza (3) [*] Prof. Andrea G. B. Tettamanzi Problema ed Istanza (4) [*] Prof. Andrea G. B. Tettamanzi Problema - algoritmo - esecutore Figura : Relazione problema, algoritmo ed esecutore Problema dei secchi • Sono presenti due secchi con capacità volumetrica rispettivamente di 3 e 4 litri. • Determinare le operazioni necessarie per far si che il primo secchio (da 3 litri) sia riempito con 2 litri. • Possiamo agire sui due secchi attraverso le seguenti operazioni: Riempire completamente un secchio Svuotarlo completamente Travasare una certa quantita' di liquido da un secchio all'altro Problema dei secchi:soluzione • Si riempie il secchio da 3 litri • Si travasa il contenuto nel secchio da 4 litri • Si riempie nuovamente il secchio da 3 • Si rabbocca il secchio da 4 ottenendo due litri nel secchio da 3 come richiesto Problema del Massimo Comune Divisore • Il problema di calcolare il Massimo Comune Divisore MCD fra due numeri x e y (x > y) • Dati: due numeri • Risultati: il Massimo Comune Divisore Algoritmo per l'MCD (Euclide) 1. Calcola il resto della divisione di x per y 2. Se il resto è diverso da zero, allora ricomincia dal punto 1 utilizzando come x il valore attuale di y, e come y il valore del resto altrimenti prosegui con il passo successivo 3. Il massimo comune divisore è uguale al valore attuale di y • L'intelligenza necessaria per trovare la soluzione del problema è tutta codificata nell'algoritmo • Chiunque sappia comprendere ed eseguire le operazioni che costituiscono l'algoritmo di Euclide, può calcolare l'MCD Algoritmo: Controesempio • Non tutto ciò che sembra un una procedura passo passo è un algoritmo • Esempio: Dire se un numero è primo 1. N ← {0,1} 2. per ogni coppia di interi i > 1 e j > 1, N ← N ∪ {i · j} 3. n è primo se e solo se n ∈ /N Ricordiamo che un numero naturale si dice primo se è divisibile solo per 1 e per sè stesso e che per definizione 0 e 1 non sono primi Algoritmi: input e output • Con una terminologia più da programmatori, considerando un algoritmo di risoluzione del problema, dati e risultati della formulazione di un problema diventano Input: un algoritmo può avere zero o più input, i quali sono quantità che vengono date in pasto all'algoritmo prima che inizi, oppure dinamicamente mentre è in esecuzione. Questi input sono presi da uno specifico insieme di oggetti Output: un algoritmo può avere uno o più output, si tratta di quantità che hanno una relazione specifica con gli input Problemi: esempi(1) • Risoluzione equazione di secondo grado Input: tre numeri (i coefficienti) Output: le due radici se reali, stampa di un messaggio opportuno altrimenti • Trovare il massimo fra tre numeri Input: tre numeri Output: il valore massimo Problemi: esempi(2) • Ricerca del numero di un utente in un elenco telefonico Input: un insieme ordinato di coppie (nome, num. tel.) e un nome x Output: il numero telefonico corrispondente all'utente di nome x, se presente nell'insieme; nulla altrimenti • Ricerca del cammino più breve tra due punti su una rete stradale Input: una rete stradale (rappresentata come un insieme di piazze, strade che uniscono due piazze, tempi di percorrenza di ciascuna strada) e due piazze x e y Output: la sequenza di strade che portano da x a y con tempo di percorrenza minimo Problemi: esempi(3) • Il problema Knapsack (zaino): ``sia dato uno zaino che possa sopportare un determinato peso. Siano dati inoltre N oggetti, ognuno dei quali caratterizzato da un peso p e un valore v. Scegliere quali di questi oggetti mettere nello zaino per ottenere il maggiore valore senza eccedere il peso sostenibile dallo zaino stesso.'' Input: Valore oggetti: V = v1 , · · · ,vn Pesi oggetti: P = p1 , · · · ,pn Capacità massima zaino: c(peso) • Output: Gli oggetti scelti (≤ n con peso complessivo ≤ c) Problemi: esempi(4) • Il problema del commesso viaggiatore: ``Un commesso viaggiatore deve percorrere il miglior tragitto attraverso le n citta' nelle quali deve effettuare le consegne'' • ``Esiste un percorso che le collega tutte (passando un sola volta per ciascuna citta') con una lunghezza minore di b ?'' Input: la mappa con l'indicazione delle n citta' da raggiungere e una lunghezza b Output: SI/NO Tipologie di problemi(1) • Problemi di decisione: Output: SI/NO (es. : esiste un percorso con una lunghezza?) • Problemi di ricerca: Output: una soluzione (es. : trovare un percorso di lunghezza minore di k) • Problemi di enumerazione: Output: un conteggio delle soluzioni (es. : Quanti sono i percorsi di lunghezza minore di k) • Problemi di ottimizzazione: Output: una soluzione ottima rispetto ad un obiettivo (es. : trovare un percorso di lunghezza minima) Tipologie di problemi(2) • La formulazione dei due problemi ``zaino'' e ``commesso'' differisce per il fatto che: • Il problema zaino e' formulato come un problema di ottimizzazione: ``Scegliere tra n valigie quelle ... in modo da trasportare il maggior peso.'' • Il problema commesso, come un problema di decisione: ``Esiste un percorso che ...'' Problemi: Nota • Non tutti i problemi sono di natura computazionale cioe' non per tutti i problemi e' possibile definire una procedura computazionale (un algoritmo) che consenta, a partire dai dati di ingresso, di ottenere i risultati Il problema dell'arresto* • Non esistono modalita' di descrizione di soluzioni (algoritmi) alternative che consentano di trasformare un problema non computazionale in un problema computazionale • La scienza degli algoritmi deve limitarsi a considerare problemi computazionali * indecidibilità (Turing 1936) Problema algoritmo • Relazione tra problema ed istanza e tra algoritmo ed esecutore • Analisi del problema • Individuazione della tipologia di problema • Valutazione di un algoritmo per la soluzione della tipologia del problema • Problemi non computazionali Lezione 3 - Problema - soluzione Corso — Programmazione Fondamenti di programmazione— Algoritmi Marco Anisetti e-mail: [email protected] web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano — Dipartimento di informatica Problema - Soluzione Problema - Soluzione • Matematica ed informatica si pongono lo stesso obiettivo: rivolvere dei problemi • L'informatica è anche definita come l'arte della risoluzione dei problemi • Abbiamo visto problemi espressi in vario modo e classificati come tipologie • Gli esempi visti si chiamano anche situazioni problematiche • Dalla situazione problematica si passa al problema attraverso la formalizzazione In matematica significa individuare dati incognite e condizioni In informatica non è molto diverso, abbiamo visto come individuare input e output Problema del barcarolo • Rivisitiamo il problema del barcarolo Scopo: trasportare tutti i personaggi sull'altra sponda Punto di partenza: tutti i personaggi sono su una sponda BPCL - (rappresentazione) Punto di arrivo: tutti i personaggi sull'altra sponda BPCL Vincoli: Barcarolo presente in alcune combinazioni quindi esistono delle situazioni non ammesse PL-- BC BC - PL PC - BL BL- PC Obiettivo: trovare le azioni da compiere per arrivare al punto di partenza rispettando i vincoli Operazioni: trasformazioni di stato Soluzione: applico tutte le trasformazioni e elimino quelle che portano ad uno stato non ammesso e ottengo il diagramma già visto Metodo dello spazio degli stati • Si individua lo spazio degli stati • Si individuano le transizioni • Dallo stato iniziale applicate tutte le transizioni si individua lo stato prossimo • Si escludono gli stati invalidi o quelli già ottenuti • Si continua fino ad raggiungere lo stato finale Problema dei secchi • Problema già affrontato • Consideriamo un secchio da 9 e uno da 4 • Raccogliere 6 litri di acqua in secchio • Quale è lo spazio degli stati: coppie ordinate (a,b) relative al contenuto d'acqua dei secchi • Stato iniziale: (0,0), stato finale (6,x) • Operazioni: riempire i contenitori R(x) svuota il contenitore S(x), travasa fino al colmo C(x,y) travasa completamente T(x,y) • Provate a generare l'albero delle possibilità a partire da queste operazioni Problema dei secchi: soluzione • Soluzione 9,0 5,4 C(x,y) 5,0 S(y) 1,4 C(x,y) 1,0 S(y) 0,1 T(x,y) 9,1 R(x) 6,4 C(x,y) Problema dei cannibali e dei missionari • 3 missionari e 3 cannibali fanno un viaggio insieme e devono attraversare un fiume sfruttando una zattera che può ospitare al massimo 2 persone alla volta. Prima di affrontare la traghettata, i missionari prospettano un pericolo: se su una qualsiasi delle due rive del fiume i cannibali finiscono per essere più numerosi dei missionari, questi ultimi potrebbero essere assaliti e mangiati dai primi. Come far traghettare tutti e sei gli uomini con i missionari sani e salvi? Uno dei due missionario o cannibale governa il traghetto, non esiste un trasportatore Problema dei cannibali e dei missionari • Formalizzo il problema usando dei simboli per gli elementi in gioco • M missionario, C cannibale, B barca, - fiume • Stato iniziale: BMMMCCC- stato finale: - BMMMCC • Operatori di trasformazione: Tm transita missionario Tc transita cannibale, Tmm transitano due missionari, tcc transitano due cannibali ... • Stati non accettati: non possono esserci sui lati più c di m Problema dei cannibali e dei missionari: Soluzione • MMMCCCB- Tcc MMMC - CCB Tc • MMMCCB - C Tcc MMM - CCCB Tc • MMMCB - CC Tmm MC - CCMMB Tmc • MMCCB - MC Tmm CC - CMMM Tc • ..... Algoritmo e flusso • I passaggi tra le sequenze di stati che vanno dallo stato iniziale al finale rappresentano il flusso dell'algoritmo risolutore per l'istanza del problema da affrontare • Si tratta di una sequenza di operatori che modificano lo stato • Se torno in uno stato già incontrato sto percorrendo una strada già attraversata (non approssimo la soluzione meglio che al passo precedente) Gli stati già incontrati vengono scartati e con loro la strada che vi ha condotti in quello stato • Algoritmo descritto come la sequenza di operazioni da compiere • L'operazione di generalizzazione dall'istanza all'algoritmo porta generalmente alla creazione di un flusso non strettamente sequenziale Algoritmo e controllo di flusso • Alcune operazioni sono soggette a particolari condizioni per essere eseguite (per gestire più istanze) • Altre essendo ripetitive (stesso operatore ma stati via via differenti) vanno eseguite più volte • Nella descrizione dell'algoritmo esistono quindi dei modi per controllare il flusso delle operazioni da eseguire • In genere si utilizzano parole del linguaggio che modificano il flusso generando un salto • Nell'algoritmo di Euclide si vedono chiaramente la valutazione della condizione di terminazione (se) e il salto (salta a) che genera la ripetizione • Se considero una istanza specifica del problema dell'MCD tra due numeri posso serializzare la sequenza di istruzioni avendo un flusso sequenziale Controllo del flusso • La sequenza di istruzioni da compiere E' enumerata in sequenza Ha un flusso governato da delle istruzioni di controllo di flusso • Istruzioni che agiscono cambiando lo stato • Istruzioni che verificano lo stato (se allora altrimenti) • Istruzioni che rompono la sequenzialità stretta e vanno a far riprendere l'esecuzione da un determinato punto (goto). Esplorazione dell'albero delle soluzioni • Backtracking trovare soluzioni a problemi in cui devono essere soddisfatti dei vincoli. • Enumera tutte le possibili soluzioni e scarta quelle che non soddisfano i vincoli. • Una tecnica classica consiste nell'esplorazione di strutture ad albero e tenere traccia di tutti i nodi e i rami visitati in precedenza • Esempio scacchi: enumero tutte le possibili mosse con una certa profondità e poi scelgo con Backtracking • Esaminando tutte le alternative è un procedimento molto lungo (si parla di complessità dell'algoritmo) Lezione 4 - Decidibilità Trattabilità Corso — Programmazione Fondamenti di programmazione— Algoritmi Marco Anisetti e-mail: [email protected] web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano — Dipartimento di informatica Problema - algoritmo - programma Decidibilità(1) • Consideriamo problemi di decisione • Analizzare i limiti della risoluzione dei problemi mediante algoritmi • Decidibilità: Concetto legato alla decidibilità del linguaggio che esprime il problema e solitamente alla Macchina di Turing (MdT) che lo esegue • Più nello specifico un algoritmo produrrà una rappresentazione univoca dell'input mediante una stringa • Diremo che un problema di decisione è: Decidibile se il linguaggio associato è decidibile Semidecidibile se il linguaggio associato è Turing riconoscibile Indecidibile se il linguaggio associato non è decidibile. Esprimiamo un problema computazionale come un problema di riconoscimento di linguaggi Decidibilità(2) • MdT M con tre possibili risultati computazione (accettazione, rifiuto, loop): Il linguaggio accettato da M è Turing riconoscibile Problema semidecidibile • MdT M con due possibili risultati computazione (accettazione, rifiuto): Il linguaggio accettato da M è decidibile. Problema decidibile Problemi indecidibili: motivazioni • Sapere che esistono problemi non risolvibili con un computer • I problemi indecidibili non sono esoterici Il problema generale della verifica del software non e' risolvibile mediante computer Costruire un perfetto sistema di debugging per determinare se un programma si arresta. Equivalenza di programmi: Dati due programmi essi forniscono lo stesso output? Individuazione dei virus: Questo programma e' un virus? Problemi Indecidibili(1) Problema: appartenenza di una stringa ad un linguaggio • Il numero di linguaggi diversi su un alfabeto non è numerabile • I programmi (stringhe finite su un alfabeto) sono numerabili Li posso ordinare per lunghezza • Quindi esistono infinitamente più linguaggi che programmi • Come dire che esistono più problemi che algoritmi • Quindi devono esistere problemi indecidibili (Godel 1931) Problemi Indecidibili(2) • Consideriamo un classico quesito di Bertrand Russell: • In un paese vive un solo barbiere, un uomo ben sbarbato, che rade tutti e soli gli uomini del villaggio che non si radono da soli • Il barbiere si rade da solo? • Autoreferenza: può determinare indecidibilità Problema dell'arresto • Supponiamo per assurdo che sia possibile scrivere un programma T che accetti in ingresso la coppia < P,x >, formata da un qualsiasi programma P e dal suo ingresso x, e restituisca in uscita > , se P(x) termina in un tempo finito, e ⊥ altrimenti. Consideriamo il programma P ∗ che realizza il seguente algoritmo, per ogni ingresso x: 1. Esegui T sull'ingresso < P ∗ ,x >; 2. Se T restituisce ⊥, termina; 3. Vai al Passo 1. Problema dell'arresto: dimostrazione • Dimostriamo l'assurdo supponendo di eseguire T sull'ingresso < P ∗ ,x >. 1. T termina con valore di uscita ⊥; ma allora P ∗ termina al Passo 2 e quindi il risultato restituito da T è scorretto; 2. T termina con valore di uscita >; ma allora P ∗ non terminerebbe mai al Passo 2 e continuerebbe a ciclare all'infinito: anche in questo caso il risultato restituito da T è scorretto; 3. T non termina: anche in questo caso, ciò significherebbe che T non funziona come abbiamo supposto. Esempi • Problemi indecidibili: Decidere se un generico programma è corretto (calcola la funzione desiderata) Decidere se, dato un generico programma ed una istruzione, l'istruzione sarà eseguita Ciò non significa che non si possa stabilire se un determinato programma sia corretto o esegua una particolare istruzione Riducibilità • E' importante riconoscere che un problema P è indecidibile. Supponendo che esista una MdT che decide P e provarne la contraddizione Dimostrare che un problema indecidibile noto non sia più difficile del problema P in questione Dal punto di vista del linguaggio Un linguaggio A è riducibile a un linguaggio B (A<mB) se esiste una funzione calcolabile f : Σ∗ → Σ∗ | ∀w,w ∈ A, f (w) ∈ B La funzione f è chiamata la riduzione di A a B. Una funzione f : Σ∗ → Σ∗ è calcolabile se esiste una MdT M tale che su ogni input w, M si arresta con f (w), e solo con f (w), sul suo nastro. Trattabilità ed intrattabilità(1) • Non tutti i problemi sono computazionali • Considerare la trattabilità di un problema significa misurare l'efficienza del migliore algoritmo risolutore. • Un problema è detto trattabile se esiste per la sua risoluzione un algoritmo efficiente Problemi facili (trattabili) → algoritmo efficiente Problemi difficili (intrattabili) → non esiste un algoritmo efficiente Trattabilità ed intrattabilità(2) • Un es. di problema intrattabile: la Torre di Hanoi Torre di Hanoi • Tre paletti e un certo numero di dischi di grandezza decrescente • Il gioco inizia con tutti i dischi incolonnati su un paletto in ordine decrescente, in modo da formare un cono. • Lo scopo del gioco e' portare tutti dischi sull'ultimo paletto, potendo spostare solo un disco alla volta e potendo mettere un disco solo su un altro disco piu' grande, mai su uno piu' piccolo. • il numero minimo di mosse necessarie per completare il gioco è 2n − 1, dove n è il numero di dischi. • Di conseguenza, secondo la leggenda, i monaci di Hanoi dovrebbero effettuare almeno 18.446.744.073.709.551.615 mosse prima che il mondo finisca (una mossa al secondo 585 miliardi di anni), essendo n =64 Lezione 5 - Complessità in tempo e spazio Corso — Programmazione Fondamenti di programmazione— Algoritmi Marco Anisetti e-mail: [email protected] web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano — Dipartimento di informatica Complessità in tempo e spazio • Computabilità • Definizione di un algoritmo corretto per risolvere il problema • Valutazioni di massima su trattabilità ed intrattabilità • Valutazioni dettagliate sull'efficienza Complessità dell' algoritmo Tempo Spazio Computabilità e complessità (1) • Calcolabilità: studia la frontiera tra problemi solubili e problemi insolubili. Si limita ad aspetti qualitativi della risolubilità dei problemi. • Complessità: analizza problemi solubili. Scopo: quantificare le risorse in tempo e/o spazio necessarie a risolvere un problema dato, in funzione della sua dimensione • Teoria della computabilità: utilizza modelli di calcolo come ad esempio automi a stati, MdT ecc., per dimostrare l'esistenza o meno di algoritmi per una data classe di problemi • Teoria della complessità: ha lo scopo di determinare le risorse richieste dall'esecuzione di un algoritmo per risolvere un dato problema. Un algoritmo formalmente deve essere finito, ma molto spesso deve essere finito in un numero ragionevole di passi. Complessità in tempo e spazio • Risorse necessarie alla sua esecuzione In termini di tempo di esecuzione e spazio per i dati • Indicatore della difficoltà del problema • Analisi degli algoritmi: studio della loro complessità • Complessità ed efficienza sono ovviamente strettamente legati Efficienza di un algoritmo • L'efficienza di un algoritmo è legata all'utilizzo di risorse di calcolo Tempo richiesto per trovare la soluzione (tempo di esecuzione) Spazio in termini di quantità di memoria richiesta • Ci soffermeremo prevalentemente su valutazioni temporali Tempo di esecuzione • Considero un dato ingresso • Valutare quanto tempo richiede ciascuna delle operazioni elementari • Valutare quante volte viene eseguita ciascuna delle operazioni elementari • Profilazione dell'algoritmo Misurazione del tempo impiegato da un algoritmo di solito in una specifica implementazione in un linguaggio, quindi escludendo tempi di caricamento e di generazione dell'output Esempio Euclide: profilazione Esecuzione di MCD(96,60) • A seconda della copia n,m in input il tempo varia • A seconda dei tempi t il tempo totale varia Efficienza di un algoritmo: modello • Per valutare l'efficienza di un algoritmo occorre fare diverse assunzioni • Prima cosa serve un modello di calcolo astratto • Nella pratica il tempo utilizzato dipende da molti fattori: Linguaggio di programmazione utilizzato, bravura del programmatore, codice generato dal compilatore, processore, cache, sistema operativo ecc. • Vogliamo effettuare un'analisi che prescinda da tutti i fattori citati ovvero vogliamo trovare un modello di calcolo astratto Con il quale possiamo definire una computazione algoritmica Con il quale possiamo esprimere quantitativamente l'efficienza Modelli di computazione • Per analizzare un algoritmo serve un modello astratto della tecnologia utilizzata per realizzarlo Descrive le risorse utilizzate Descrive il loro costo • Considerando alcune operazioni elementari a costo unitario per cui il reale tempo di calcolo possa essere considerato proporzionale al numero di operazioni eseguite • Deve essere sufficientemente realistico • Deve astrarre da dettagli di processori specifici Modello di Macchina ad accesso casuale (RAM)(1) • Il modello computazionale più comunemente usato • Modella fedelmente la stragrande maggioranza dei processori • Istruzioni eseguite in sequenza • Ogni istruzione richiede un suo tempo costante per l'esecuzione Esistono altri modelli come le macchine basate su rete neurale, macchine quantistiche o macchine chimiche astratte Modello di Macchina ad accesso casuale (RAM)(2) • Costituita da 4 componenti: Memoria Programma File di input File di output • La memoria è costituita da una sequenza di locazioni 0,1, . . . capace di salvare un unico valore intero alla volta • L'indirizzo è il numero della locazione di memoria • L'intero riferito da un indirizzo di una locazione di memoria è il contenuto della locazione stessa • Il programma è dato da una sequenza di istruzioni (assegnamenti, input/output, cicli di controllo) Modello di Macchina ad accesso casuale (RAM) (3) • Assegnamento Mem[l] := Mem[j] + Mem[k]. Mette nella locazione l la somma dei valori nella locazione j e k • Il file di input è una sequenza di valori consumati uno alla volta da una istruzione di ``read'' • Il file di output è una sequenza di valori prodotti uno alla volta da una istruzione di ``write'' • Il flusso di controllo del programma va normalmente da una istruzione alla successiva ad eccezione di istruzioni di ``goto i'' o goto condizionati tipo if Mem[j] ≥ 0 then goto i Modello di Macchina ad accesso casuale (RAM): esempio (4) 1: Mem[0]:=0 2: read(Mem[1]) 3: if Mem[1]≥ 0 then goto 5 4: goto 7 5 Mem[3]:=Mem[0]-Mem[1] 6: if Mem[3]≥ 0 then goto 16 7: write(Mem[1]) 8: read(Mem[2]) 9: Mem[3]:= Mem[2]-Mem[1] 10: if Mem[3]≥ 0 then goto 12 11: goto 14 12: Mem[3]:=Mem[1]-Mem[2] 13: if Mem[3]≥ 0 then goto 8 14: Mem[1]:=Mem[2] +Mem[0] 15: goto 3 16: halt Profilazione e modello di calcolo • Concetti utilizzati quando occorre valutare il costo di esecuzione in maniera precisa • Spesso usato per valutare il costo di algoritmi la cui implementazione gira su sistemi embedded Importante anche lo spazio e la dipendenza spazio - tempo di esecuzione • Il modello può cambiare a seconda del sistema reale su cui l'implementazione dell'algoritmo girerà • Dal punto di vista teorico senza considerazioni pratiche implementative si tende ad astrarre dai costi dettagliati Ordini di grandezza degli algoritmi in relazione all'input Lezione 6 - Analisi di un algoritmo caso medio, caso peggiore Corso — Programmazione Fondamenti di programmazione— Algoritmi Marco Anisetti e-mail: [email protected] web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano — Dipartimento di informatica Efficienza di un algoritmo: input • Il tempo di esecuzione di un algoritmo dipende sempre da quanto è grande l'input (dimensione dell'istanza) • La dimensione dell'istanza è proporzionale al numero di elementi che la costituiscono • Anche con un modello di calcolo semplificato (tempo uguale al numero di operazioni eseguite) risulta difficile il calcolo esatto delle operazioni L'analisi viene generalmente effettuata considerando il caso peggiore Misurazione delle risorse • Tempo Numero totale di operazioni elementari eseguite Machine independent Tempo uguale per tutte le operazioni • Spazio Quantità massima di informazione da mantenere (includendo dati iniziale e risultati) • Tempo e spazio sono correlati spazio impiegato ≤ k × tempo impiegato Profilazione generalizzata(1) • Generalizzare l'esempio sulla profilazione di MCD in relazione alla dimensione dell'input • Considero il numero di iterazioni che debbo compiere Nel caso MCD(96,60) ho 4 iterazioni • Alcuni casi speciali generalizzando il tempo T (n,m) per MCD(n,m) T (n,1) = 1 T (n,kn) = 1 T (n,m) = 1 + T (m,n mod m) T (n,m) = 1 + T (m,n) se m > n Profilazione generalizzata(2) • Volendo si può costruire una tabella e valutare i costi al crescere di n e m • Equivale a valutare più istanze del problema che l'algoritmo risolve • Occorre valutare il risultato al crescere degli input visto che il tempo di esecuzione dipende dal valore degli input Profilazione generalizzata(3) • In particolare dipende principalmente dal valore di m dato che n mod m viene eseguito da subito E' evidente la persistenza di alcuni casi particolari dove il costo è sempre uno anche al crescere di n ed m • Casi fortunati altri molto sfortunati • Non tutte le esecuzioni di un determinato algoritmo richiedono lo stesso tempo Profilazione generalizzata del caso peggiore • Tempo Potremmo pensare che più il modulo è basso più siamo vicini alla fine (ma con modulo alto non siamo lontani dalla fine pensiamo a m mod m-1) Caso peggiore è quando n mod m ∼ = m 2 Tempo nel caso peggiore: 1 + log2 (m) • Spazio Considerando il modello RAM, ho solo 3 celle usate per n, m, r Analisi di un algoritmo • Quantità di risorse è funzione dei dati di ingresso • Dimensione dei dati di ingresso: n Caso migliore: il più breve tempo di esecuzione su tutti gli ingressi di dimensione n Caso medio: la media dei tempi di esecuzione su tutti gli ingressi di dimensione n Caso peggiore: il più lungo tempo di esecuzione su tutti gli ingressi di dimensione n Analisi del caso peggiore • Limite superiore alle risorse che l'esecuzione dell'algoritmo potrà mai richiedere. • Il caso peggiore si verifica abbastanza spesso (es., ricerca di un dato inesistente). • Spesso il caso medio è analogo al caso peggiore. Algoritmo e dimensione dell'istanza • Crescita del tempo di calcolo al crescere della dimensione dell'istanza • La bontà di un algoritmo viene valutata rispetto al suo comportamento asintotico ovvero quando la dimensione dell'istanza tende all'infinito • Buon comportamento asintotico: al crescere della dimensione non cresce troppo il tempo • Cattivo comportamento asintotico: algoritmo applicabile nella pratica solo a istanze di dimensione limitata Ordine di grandezza • Ciò che importa veramente non è la quantità precisa di risorse, ma come questa cresce al crescere della dimensione dell'ingresso • O(logn) < O(n) < O(n2 ) < O(n3 ) < · · · < O(2n)