Corso di Informatica (Programmazione) Lezione 3 (22 ottobre 2008) Problemi e algoritmi 1 Il problema Un problema P viene definito dai suoi DATI IN INGRESSO e dalla sua SOLUZIONE Esempio P: somma di due interi DATI IN INGRESSO: due interi a e b SOLUZIONE: somma s=a+b 2 Il problema Istanza di un problema P realizzazione di particolari dati in ingresso Esempio la coppia (2,3) è un’istanza del problema P dell’esempio precedente a cui corrisponde la soluzione 5 (2,3) 5 3 Il problema Si definisca: IP insieme delle istanze di P SP insieme delle soluzioni di P 4 Il problema Esempio per P=“somma di due interi” (2,3) (100,50) SP (4,1) IP 5 150 5 Il problema Dato un problema P, esiste una relazione rP che lega gli elementi in IP (istanze) agli elementi in SP (soluzioni) rP: IP -> SP e che rappresenta quindi il problema P. Nel caso di P=“somma di due interi” si ha che rP è la funzione univoca: s=rP(a,b)=a+b 6 Tipi di problemi Decisione SP={1,0} o SP={SI’, NO} Esempio P: problema del commesso viaggiatore INPUT: N città con le relative distanze e un valore prefissato b OUTPUT: esiste un percorso che passa una sola volta per tutte le città e che ha una lunghezza totale minore di b? 7 Tipi di problemi Ricerca Esempio P: problema del commesso viaggiatore (problema di ricerca) INPUT: N città con le relative distanze e un valore prefissato b OUTPUT: trovare tutti i percorsi che passano una sola volta per tutte le città e che hanno una lunghezza totale minore di b 8 Tipi di problemi Enumerazione Esempio P: problema del commesso viaggiatore (problema di enumarazione) INPUT: N città con le relative distanze e un valore prefissato b OUTPUT: contare tutti i percorsi che passano una sola volta per tutte le città e che hanno una lunghezza totale minore di b 9 Tipi di problemi Ottimizzazione Esempio P: problema del commesso viaggiatore (problema di ottimizzazione) INPUT: N città con le relative Questo è un problema di minimo. distanze Da notare che le soluzioni per una OUTPUT: trovare il percorso data istanza possono essere più che passa una sola volta per tutte di una (esistono le città e che ha minima lunghezza cioè più percorsi totale che hanno una lunghezza totale minima) 10 L’algoritmo Cos’è un algoritmo? In Informatica è un metodo per risolvere un problema e può essere implementato, ovvero può essere tradotto in un programma attraverso un linguaggio di programmazione Un algoritmo esiste indipendentemente dalla macchina che lo esegue! 11 L’algoritmo Cos’è un algoritmo? E’ una procedura, costituita da una sequenza finita di operazioni elementari, che trasforma un set di dati iniziali (INPUT) in un set di dati finali (OUTPUT) 12 L’algoritmo Esempio di problema da risolvere tramite un algoritmo P: somma di 5 numeri interi DATI IN INGRESSO: un set B={b1, b2, b3, b4, b5} di 5 interi SOLUZIONE: somma p=b1+b2+b3+b4+b5 13 L’algoritmo Esempio Algoritmo A: B={b1, b2, b3, b4, b5} 1: 2: 3: 4: 5: 6: 7: p=0 p=p+b1 p=p+b2 p=p+b3 p=p+b4 p=p+b5 stampo p p 14 L’algoritmo Un algoritmo in genere viene rappresentato in pseudocodice, cioè in un linguaggio, simile ad un linguaggio di programmazione (codice), che però non è direttamente compilabile o interpretabile su un calcolatore. Spesso lo pseudocodice è definito da una sintassi Pascal-like o C-like 15 L’algoritmo L’algoritmo precedente può essere riscritto in pseudocodice Pascal-like: Procedura Somma_interi(b1, b2, b3, b4, b5) begin p:=0 p:=p+b1 p:=p+b2 p:=p+b3 p:=p+b4 p:=p+b5 stampa p end 16 L’algoritmo Un algoritmo è composto da istruzioni Istruzione descrizione di una certa operazione (l’algoritmo precedente è composto da 7 istruzioni) L’esecuzione di una certa istruzione è il passo 17 L’algoritmo Esempio Procedura Raddoppia_Pari(a) begin SE a è pari{ 1: b:=a*2 2: stampa b } La procedura è composta altrimenti{ da 3 istruzioni e compie 3: stampa a 2 passi se a in input } è pari, mentre end ne compie uno solo se a in input è dispari 18 L’algoritmo Un algoritmo deve: essere composto da un numero finito di istruzioni e terminare in un numero finito di passi, ovvero deve essere finito essere realizzabile gestire tutte le situazioni che si possono verificare durante la sua esecuzione, ovvero deve essere completo 19 L’algoritmo Un algoritmo deve: essere riproducibile, ovvero gli stessi dati in input devono dare in esecuzioni successive gli stessi dati in output essere corretto essere efficiente Vedere il seguito… 20 Correttezza di un algoritmo Dato un algoritmo A, si definisca: IA insieme degli input di A OA insieme degli output di A 21 Correttezza di un algoritmo Dato un algoritmo A, esiste una relazione rA che lega gli elementi in IA (input) agli elementi in OA (output) rA: IA -> OA e che rappresenta quindi l’algoritmo A. Nel caso di A=“somma di 5 interi” si ha che rA è la funzione univoca: p=rA(b1,b2,b3,b4,b5)=b1+b2+b3+b4+b5 22 Correttezza di un algoritmo Un algoritmo A rappresentato da una relazione rA: IA->OA si definisce corretto per un problema P, rappresentato da una relazione rP: IP->SP, se e solo se rA “coincide” con rP. Cioè se ad ogni input i in IA corrisponde un output o che è anche la soluzione di P per l’ingresso fornito da i. Attenzione al “coincide” che non è in senso stretto! Per i problemi di ottimizzazione ad esempio basta che l’algoritmo trovi anche solo una delle possibili soluzioni ottime (di minimo o di massimo) 23 Efficienza di un algoritmo L’efficienza di un algoritmo è misurata in termini del tempo di computazione e dello spazio di memoria che userebbe se venisse implementato ed eseguito su di una macchina di riferimento ipotetica. Un algoritmo è tanto più efficiente quanto meno tempo e spazio spreca. La misura di efficienza (in tempo e spazio) viene in genere espressa in funzione della dimensione n dell’input 24 Efficienza di un algoritmo Esempio di tempo T di computazione funzione della dimensione n dell’input Procedura Somma_interi(b1, b2, b3, b4, b5) begin La dimensione n dell’input è il numero di p:=0 interi b1, b2, b3, b4, b5 (n=5) che è costante per ogni input possibile. p:=p+b1 Immaginando di implementare ed eseguire p:=p+b2 la procedura su una macchina di riferimento p:=p+b3 (modello) che esegue ogni istruzione in un tempo unitario, si ha che il tempo di p:=p+b4 computazione T per ogni input è: p:=p+b5 T=n+2 le n=5 istruzioni di assegnamento p:=p+bi, l’istruzione p:=0 e l’istruzione stampa p “stampo p”. Di conseguenza si ha che T è end costante per ogni input. n=5 costante sull’intero insieme IA 25 Efficienza di un algoritmo Esempio di tempo T di computazione funzione della dimensione n dell’input Procedura Stampa(a) begin Per a volte stampa “ciao” e vai a capo end La dimensione n dell’input è l’intero a (n=a) che non è costante per ogni input. Immaginando di implementare ed eseguire la procedura su una macchina di riferimento (modello) che esegue ogni istruzione in un tempo unitario, si ha che il tempo di computazione T per un input a è: T=n=a viene eseguita a volte l’istruzione di stampa. Di conseguenza si ha che T è funzione lineare di a. E’ evidente che non ci sono due input che hanno la stessa dimensione n=a non costante sull’insieme IA 26 Efficienza di un algoritmo Esempio di dimensione n dell’input Procedura Commesso_viaggiatore(insieme_di_città) begin … end La dimensione n dell’input è il numero N delle città n=N. Il tempo di computazione dell’algoritmo sarà funzione di N. In questo caso due input diversi possono anche avere la stessa dimensione. Ad esempio i1={Roma, Napoli Pisa} e i2={Milano, Genova, Venezia} che hanno n=N=3 n=N non costante sull’insieme IA 27 Efficienza di un algoritmo Indicando con TA(x) il tempo che l’algoritmo A impiega a processare l’input x appartenente a IA, si definisce complessità in tempo nel caso peggiore la grandezza: TAP(n)=max{TA(x) tale che |x|=n} cioè per ogni valore di n, TAP(n) è il massimo tra i tempi di computazione degli input x che hanno dimensione n |x|=n 28 Efficienza di un algoritmo Indicando con TA(x) il tempo che l’algoritmo A impiega a processare l’input x appartenente a IA, si definisce complessità in tempo nel caso medio la grandezza: TAM n T x x n A In cioè per ogni valore di n, TAM(n) è la media dei tempi di computazione degli input x che hanno dimensione n |x|=n e |In| numero degli input di dimensione n 29 Efficienza di un algoritmo In genere, dato un algoritmo A si vuole vedere cosa succede alle sue funzioni TAP(n) e a TAM(n) al tendere di n all’infinito. Si vuole cioè indagare il comportamento asintotico di A. Analogo discorso può essere fatto per misurare lo spazio di memoria che l’algoritmo usa su un’ipotetica macchina modello. 30 Efficienza di un algoritmo Gli algoritmi efficienti sono quelli per cui la funzione TA(n) (TAP o TAM) è un polinomio di grado k>=0: TA(n)=a0+a1n1+a2n2+…+aknk Per k=0 tempo costante Per k=1 tempo lineare All’aumentare di k l’algoritmo A diventa sempre più oneroso dal punto di vista computazionale 31 Efficienza di un algoritmo Tempi di calcolo su input di varie dimensioni (prima riga) per sei algoritmi che hanno una complessità pari a n (lineare), nlog2n (logaritmica), n2 (polinomiale), n3 (polinomiale), 2n (esponenziale), 3n (esponenziale) Si supponga che la macchina di riferimento esegua un’operazione elementare (istruzione) in 1 microsecondo (10-6 secondi). Notazioni: ms (microsecondi), ms (millisecondi), s (secondi), mn (minuti), h (ore), g (giorni), a (anni), c (secoli) Da: A. Bertoni e M. Goldwurm, Progetto e Analisi di Algoritmi, Rapporto Interno n. 230-98, Dipartimento di Scienze dell’Informazione, Università degli Studi di Milano 32 Problematiche degli algoritmi SINTESI dato un problema P, progettare (disegnare) un algoritmo A che risolva P ANALISI dato un algoritmo A per un problema P, dimostrare che A risolve P (è corretto) e valutare le risorse (tempo e spazio) utilizzate da A 33