PROBLEMI, ALGORITMI e COMPLESSITÀ Problema computazionale: • Descrizione dell’input, • Compito da svolgere. Esempio: SOMMA: INPUT: 2 numeri x e y, COMPITO: stampare x+y. Ad ogni problema computazionale possiamo associare una misura della sua complessità. Complessità di un problema: quantità di risorse necessaria e sufficiente per risolverlo. Le principali risorse in informatica sono il tempo di calcolo e lo spazio di memoria. Ci concentriamo sul tempo di calcolo. 1 PROBLEMI, ALGORITMI e COMPLESSITÀ Tre problemi: 1.ORDINAMENTO: INPUT: n numeri, COMPITO: disporli in ordine crescente. 2.COMMESSO VIAGGIATORE: INPUT: distanze tra ogni coppia di n città, COMPITO: determinare il percorso più corto che passa per tutte le città una ed una sola volta e torna al punto di partenza. 3.TERMINAZIONE: INPUT: un programma e i suoi dati, COMPITO: dire se il programma eseguito sui dati termina in tempo finito. 2 PROBLEMI, ALGORITMI e COMPLESSITÀ La complessità computazionale in tempo è data dal numero di operazioni che il miglior algoritmo esegue per risolvere il problema. Un algoritmo è un procedimento risolutivo per un problema computazionale. Sequenza di ordini non ambigui descritti usando un qualche formalismo (es: linguaggio di programmazione). Esempio: MAX INPUT: n numeri: a[1],…,a[n] COMPITO: stampa il massimo tra tutti gli a[i]. Algoritmo per calcolare il massimo tra n numeri. Passo 1. Passo 2. Passo 3. Passo 4. Passo 5. i=1 max=0 se a[i]>max allora max=a[i] i=i+1 se i>n vai al passo 6 altrimenti vai al passo 3 Passo 6. stampa max 3 PROBLEMI, ALGORITMI e COMPLESSITÀ ORDINAMENTO: esiste un algoritmo che ordina n numeri eseguendo circa n log(n) operazioni. Meglio non si può fare. Quindi n log(n) è la complessità del problema di ordinamento. Esercizio: descrivere un algoritmo che ordina n numeri in tempo proporzionale a n 2 COMMESSO VIAGGIATORE: non si conoscono algoritmi con costo meno che esponenziale. Sostanzialmente occorre esaminare tutte le soluzioni e scegliere la più corta. Numero di soluzioni n −1 (n − 1)! = ∏ i = 1 ⋅ 2 ⋅ 3 ⋅ L ⋅ (n − 2) ⋅ (n − 1) i =1 TERMINAZIONE: non esistono algoritmi per risloverlo. Indecidibile !!! 4 PROBLEMI, ALGORITMI e COMPLESSITÀ Logaritmi, polinomi, esponenziali Logaritmo. log2n = potenza a cui elevare 2 per ottenere n. Il logaritmo in base b di un numero misura approssimativamente il numero di cifre necessarie per scrivere il numero in base b. Polinomi. 18n6 + 4n2 + 3n + 2 Esponenziali. 2n, n!, nn Alcuni valori….. n=10 n=20 1 1 log2n 3 3 n2 4 7 2n 7 19 n! numero di cifre... n=30 1 3 10 33 n=40 1 4 13 48 n=50 1 4 16 65 n=100 1 5 31 158 Numero di cifre decimali per rappresentare 50! 5 PROBLEMI, ALGORITMI e COMPLESSITÀ Ricorsione: Le torri di Hanoi Descrizione del problema: Spostare gli n anelli dal palo di sinistra a quello di destra spostando un anello alla volta e senza mai spostare un anello più grande su di un anello più piccolo. 6 PROBLEMI, ALGORITMI e COMPLESSITÀ Prima osservazione: Sono capace di spostare un anello da un palo all’altro se sugli altri due pali ci sono anelli più grandi. 7 PROBLEMI, ALGORITMI e COMPLESSITÀ Seconda osservazione: Se sono capace di spostare n-1 anelli da un palo all’altro sono capace di spostarne n 8 PROBLEMI, ALGORITMI e COMPLESSITÀ Algoritmo per spostare n anelli. Sposta(n,sinistra,destra)= Sposta(n-1,sinistra,centro) Sposta(1,sinistra,destra) Sposta(n-1,centro,destra) fine. Perché funziona ??? 9 PROBLEMI, ALGORITMI e COMPLESSITÀ Quanti spostamenti dobbiamo eseguire per muovere n anelli da sinistra a destra ? S(1) = 1 S(n) = S(n-1) + S(1) + S(n-1) Quindi S(n) = 2 S(n-1) + 1 = 2 (2 S(n-2) + 1) +1 = 4 S(n-2) + 2 + 1 = 4 (2 S(n-3) + 1) + 2 + 1 = 8 S(n-3) + 4 + 2 + 1 = 1 + 2 + 4 + 8 +16 + … + 2(n-1) = 2n - 1 In Totale 2n – 1 spostamenti. 20 anelli = 524287 spostamenti…. 10 PROBLEMI, ALGORITMI e COMPLESSITÀ Soluzione all’esercizio dell’ordinamento INSERTION SORT: I numeri sono rappresentati da un mazzo di carte posto su un tavolo. Peschiamo dal mazzo una carta alla volta e la inseriamo nel posto giusto tra le carte che già abbiamo in mano. INPUT: 45 17 39 21 47 89 33 12 10 26 17 17 17 17 17 17 12 10 10 45 39 21 21 21 21 17 12 12 39 45 39 39 39 33 21 17 17 21 21 45 45 45 39 33 21 21 47 47 47 47 47 45 39 33 26 89 89 89 89 89 47 45 39 33 33 33 33 33 33 89 47 45 39 12 12 12 12 12 12 89 47 45 10 10 10 10 10 10 10 89 47 26 26 26 26 26 26 26 26 89 OUTPUT: 10 12 17 21 26 33 39 45 47 89 11 PROBLEMI, ALGORITMI e COMPLESSITÀ Caso peggiore: 15 14 13 12 11 10 14 15 14 13 12 11 13 13 15 14 13 12 12 12 12 15 14 13 11 11 11 11 15 14 10 10 10 10 10 15 circa n2/2 spostamenti 12