Algoritmi Un tema centrale dell’informatica è lo studio degli algoritmi. Ora nostro obiettivo sarà quello di esplorare a sufficienza questa materia fondamentale per poter capire e apprezzare appieno l’informatica. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 1 ALGORITMI e PROGRAMMI Programmazione: Lavoro che si fa per costruire sequenze di istruzioni (operazioni) adatte a svolgere un dato calcolo INPUT: x,y,z INPUT: dati iniziali AZIONI OUTPUT: esempio: risultato Somma x ed y Somma z al risultato OUTPUT: x+y+z Algoritmo: Sequenza di azioni per svolgere il calcolo Programma: Algoritmo espresso in notazione formale (linguaggio di programmazione) Creazione programma: Fase 1 = algoritmo Fase 2 = implementazione in dato linguaggio (C) Vedremo: Elementi di base per semplici algoritmi e programmi ALGORITMI Tecniche algoritmiche permettono di risolvere problemi di: • Trasmissione dati in Internet • come si gestisce in pratica il flusso di dati nella rete? • Ricerca nel WEB • come fa Google a trovare le informazioni nel WEB? • Bioinformatica • come il DNA determina le nostre caratteristiche? • Processi economici • come si gestiscono le aste on-line su Ebay? • come si effettua la compravendita di azioni su Internet? • Organizzazione di risorse e servizi • come si schedulano i voli delle aerolinee? • come si assegnano le frequenze nelle celle delle reti cellulari? Il termine Algoritmo deriva dal matematico Arabo al-Khwarizmı (c. 780-850), autore del testo Al-jabrw’al-muqabâla (da cui anche il termine Algebra) Algoritmi di tipo numerico furono studiati da matematici babilonesi ed indiani più di di 3000 anni fa. Algoritmi in uso fino a tempi recenti furono studiati dai matematici greci nel 500 a.C. Esempio: Algoritmo di Euclide per il Massimo Comun Divisore Esempio: Algoritmi geometrici (calcolo di tangenti, sezioni di angoli, ...) Algoritmo: procedura computazionale che • prende certi valori in input (ingresso) e • produce i valori richiesti in output (uscita) Un esempio si prepara ad un’uscita galante... Va in profumeria, ma vuole risparmiare … Come identificare il profumo più economico? 0. Prendi la prima bottiglia, 1. Vai alla prossima bottiglia nello scaffale 2. Confronta il prezzo sulla bottiglia nello scaffale con quello in mano 3. Se e’ minore scambia la bottiglia in mano con quella sullo scaffale 4. Se ci sono bottiglie non controllare, allora ripeti da 1. 5. Se le bottiglie sono finite, la bottiglia più economica è quella in mano Algoritmo: procedura computazionale che • prende certi valori in input (ingresso) e • produce i valori richiesti in output (uscita) _______________ Problema: determina il profumo più economico Input: profumi con relativi costi Output: profumo di costo minimo Algoritmo: 0. 1. 2. 3. 4. 5. Prendi la prima bottiglia, Vai alla prossima bottiglia nello scaffale Confronta il prezzo sulla bottiglia nello scaffale con quello in mano Se è minore scambia la bottiglia in mano con quella sullo scaffale Se ci sono bottiglie non controllare, allora ripeti da 1. Se le bottiglie sono finite, la bottiglia più economica è quella in mano Procedura computazionale per ottenere la relazione costi/costo minimo Riassumendo Un’algoritmo è una serie di operazion non ambigue ed efficientemente computabili, che una volta eseguite producono un risultato in un tempo finito Se possiamo specificare un algoritmo allora possiamo automatizzare la soluzione Un esempio Come identificare il profumo più economico? 0. Prendi la prima bottiglia, 1. Vai alla prossima bottiglia nello scaffale 2. Confronta il prezzo sulla bottiglia nello scaffale con quello in mano 3. Se è minore scambia la bottiglia in mano con quella sullo scaffale 4. Se ci sono bottiglie non controllare, allora ripeti da 1. 5. Se le bottiglie sono finite, la bottiglia più economica è quella in mano • E’ un algoritmo? • La soluzione è corretta? • Quanto tempo prende? Algoritmo Un algoritmo è una sequenza finita di passi elementari che descrive come risolvere in un tempo finito un problema Altri esempi di algoritmi: • Istruzioni di montaggio • Preparazione del caffè • Prelievo bancomat • Preparazione di un ricetta • Calcolo del massimo comun divisore tra due interi Algoritmo Dati iniziali ALGORITMO Dati finali (soluzione) Algoritmo: sequenza di azioni elementari che consenta di trasformare i dati iniziali nei risultati finali attraverso un numero finito di passi, elementari e non ambigui. Note: • Insieme di dati iniziali ben definito • Sequenza di passi può essere eseguita da un opportuno esecutore (es. calcolatore). Algoritmo Dati iniziali ALGORITMO Dati finali (soluzione) Proprietà fondamentali di un Algoritmo • Correttezza; produce sempre una soluzione • Efficienza: L’algoritmo perviene alla soluzione del problema usando la minor quantità possibile di risorse fisiche, quali tempo di esecuzione, memoria, …. Algoritmo Dati iniziali ALGORITMO Dati finali (soluzione) Ricapitolando, un algoritmo deve essere: • applicabile a qualsiasi insieme di dati di ingresso appartenenti al dominio di definizione dell’algoritmo • costituito da operazioni appartenenti ad un determinato • insieme di operazioni fondamentali • costituito da regole non ambigue, cioè interpretabili in modo univoco qualunque sia l’esecutore (persona o “macchina”) che le legge Un esempio Come identificare il profumo più economico? 0. Prendi la prima bottiglia, 1. Vai alla prossima bottiglia nello scaffale 2. Confronta il prezzo sulla bottiglia nello scaffale con quello in mano 3. Se è minore scambia la bottiglia in mano con quella sullo scaffale 4. Se ci sono bottiglie non controllare, allora ripeti da 1. 5. Se le bottiglie sono finite, la bottiglia più economica è quella in mano • Dati ingresso? • Operazioni? • Esecutore? Algoritmo Esempio: prendere l’automobile 1. Aprire l’auto 2. Aprire la portiera 3. Sedersi al posto di guida 4. Schiacciare la frizione 5. Avviare il motore 6. Inserire la prima marcia 7. Rilasciare “delicatamente” la frizione per partire I passi sono eseguiti in sequenza l'ordine delle istruzioni è essenziale per la correttezza Esempio: Biblioteca I libri sono disposti sugli scaffali •La posizione di ogni libro è fissa ed è individuata da due coordinate: -Scaffale(i.e. numero dello scaffale) -Posizione nello scaffale •La biblioteca è dotata di uno schedario (ordinato per autore/i e titolo). Ogni scheda contiene, nell’ordine: -cognome e nome dell’autore -titolo del libro -data di pubblicazione -numero dello scaffale in cui si trova -posizione attribuita al libro nello scaffale. Esempio: Biblioteca Esempio di scheda Autore/i:Sciuto, DonatellaBuonanno, GiacomoMari, Luca Titolo:Introduzione ai Sistemi Informatici, III Edizione, 2005 Scaffale:22 Posizione:11 Esempio: Biblioteca Formulazione dell’algoritmo 1.Decidi il libro da richiedere 2.Preleva il libro richiesto Raffinamenti successivi : se un passo non è direttamente comprensibile ed eseguibile dall’esecutore (operazione semplice), occorre dettagliarlo a sua volta mediante un ulteriore algoritmo. Esempio: Biblioteca Un algoritmo per il prelievo 1.Decidi il libro da richiedere 2.Cerca la scheda del libro richiesto 3.Segnati numero scaffale e posizione 4.Cerca lo scaffale indicato 5.Accedi alla posizione indicata e preleva il libro 6.Scrivi i tuoi dati sulla "scheda prestito" Esempio: Biblioteca Il sotto-algoritmo di ricerca 1.Prendi la prima scheda. 2.Esamina se titolo e autore/i sono quelli cercati. In caso positivo la ricerca termina con successo, altrimenti passa alla scheda successiva e ripeti. 3.Se esaurisci le schede il libro cercato non esiste. Esempio: Biblioteca Un algoritmo per il prelievo 1.Decidi il libro da richiedere 2.Cerca la scheda del libro richiesto come segue: 2.1. Prendi la prima scheda. 2.2. Esamina se titolo e autore/i sono quelli cercati. In caso positivo la ricerca termina con successo, altrimenti passa alla scheda successiva e ripeti. 2.3. Se esaurisci le schede il libro cercato non esiste. 3.Segnati numero scaffale e posizione 4.Cerca lo scaffale indicato 5.Accedi alla posizione indicata e preleva il libro 6.Scrivi i tuoi dati sulla "scheda prestito" ES. Come piegare un foglio quadrato per ottenere un uccello. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 23 Primitive per l’origami. Sono richieste delle primitive ben definite • Un insieme di primitive costituisce un linguaggio di programmazione. • Ogni primitiva è costituita da due parti: – Sintassi – Semantica Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 24 Pseudocodice Primitivo • Istruzione di assegnamento • Selezione condizionale • Esecuzione ripetuta • Procedura nome espressione if condizione then attività while condizione do azione procedure nome Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 25 ISTRUZIONI Assegnamento: x E, Calcola il valore dell’espressione E e lo assegna alla variabile x Esempio: xx+y calcola il valore di x+y e lo assegna ad x se x vale 5 e y vale 3, x=x+y da ad x valore 8 ISTRUZIONI Assegnamento: x E, Calcola il valore dell’espressione E e lo assegna alla variabile x Esempio: xx+y calcola il valore di x+y e lo assegna ad x se x vale 5 e y vale 3, x x+y da ad x valore 8 Istruzioni Strutturate: 1) Composizione di Istruzioni: I 1; I 2; Im; Esegui I1, quando e’ terminata esegui I2, quando e’ terminata … esegui Im. X1; y 2; x x+y; (x vale 3) y x*y (y vale 6) ISTRUZIONI Strutturate 2) Istruzioni Condizionali: If (C) then I; Es. if (x<=y) then z 0: Poni z=0 se x<=y; altrimenti lascia il valore di z inalterato ISTRUZIONI Strutturate 2) Istruzioni Condizionali: If (C) then I; C condizione, I azione Es. if (x<=y) then z 0: Poni z=0 se x<=y; altrimenti lascia il valore di z inalterato If (C) then I’ else I’’; C condizione, I’ ed I’’ azioni Es. Poni z=0 se x<=y; poni z=x-y se x>y if (x<=y) then z 0 else z x-y Pseudocodice Primitivo • Istruzione di assegnamento nome espressione • Selezione condizionale if condizione then attività • Esecuzione ripetuta while condizione do azione • Procedura procedure nome Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 30 while ( Condizione ) Azione; ES. Calcolo 1+2+… +n, risultato in y X1; y0; while (x<=n) {yy+x; x x+1} x 1 2 3 … n y 0 1 1+2=3 1+2+3=6 … 1+2+…+n repeat I while (C); X 1; Y 0; repeat {y y+x; x x+1 while (x<=n) y 0 1 1+2=3 1+2+3=6 … 1+2+…+n x 1 2 (>1) 3 (>2) 4 (>3) … n+1 (>n) repeat I while (C); X 1; Y 0; repeat {y y+x; x x+1 while (x<=n) n=0? y 0 1 1+2=3 1+2+3=6 … 1+2+…+n x 1 2 (>1) 3 (>2) 4 (>3) … n+1 (>n) repeat I while (C); X 0; Y 0; repeat {y y+x; x x+1 while (x<=n) n=0? y 0 0 0+1=1 0+1+2=3 … 0+1+2+…+n x 0 0 (>0) 1 (>1) 2 (>2) … n+1 (>n) Pseudocodice Primitivo • Istruzione di assegnamento • Selezione condizionale • Esecuzione ripetuta • Procedura nome espressione if condizione then attività while condizione do azione procedure nome Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 35 Algoritmo di ricerca sequenziale in pseudocodice Data una lista (Lista) ordinata vogliamo sapere se un elemento (ValoreCercato) è nella lista Lista ordinata: elementi ordinati in ordine decrescente da sinistra a destra Es: (1,2,6,11,12,15,21,34,56,88,97,123) è una lista ordinata di interi Es. (albero, erba, pianta, vaso) è una lista ordinata di nomi in ordine albabetico. (ricorda es. Ricerca scheda libro nello schedario della biblioteca) Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 36 Algoritmo di ricerca sequenziale in pseudocodice Data una lista (Lista) ordinata vogliamo sapere se un elemento (ValoreCercato) è nella lista (ricorda es. scheda libro) Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 37 Algoritmo di ricerca sequenziale in pseudocodice Data una lista (Lista) ordinata vogliamo sapere se un elemento (ValoreCercato) è nella lista Es.. • Cerchiamo 34 nella Lista (1,2,6,11,12,15,21,34,56,88,97,123) • Cerchiamo 38 nella Lista (1,2,6,11,12,15,21,34,56,88,97,123) Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 38 Algoritmo di ricerca sequenziale in pseudocodice Data una lista (Lista) ordinata vogliamo sapere se un elemento (ValoreCercato) è nella lista (ricorda es. scheda libro) ALGORITMO ITERATIVO: ripete stessa serie istruzioni Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 39 Iterazione ripetere piu’ volte una sequenza di operazioni Componenti del controllo iterativo. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 40 Iterazione ripetere piu’ volte una sequenza di operazioni Ordinamento alfabetico della lista: Fred, Alex, Diana, Byron e Carol. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 41 Algoritmo di ordinamento per inserimento espresso in pseudocodice. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 42 • Scrivere un algoritmo in pseudocodice per calcolare il massimo di una sequenza di valori. Più precisamente, scrivere una procedura max(Lista) che restituisce il massimo valore in Lista, dove si assume che Lista non sia vuota e che i suoi elementi siano numeri interi positivi. • Scrivere un algoritmo che calcoli il prodotto dei primi n numeri naturali. • Sia Lista una lista contenente n numeri interi. Scrivere un algoritmo che calcoli la somma degli elementi di Lista. Ricorda: while (condizione) azione ES. Calcolo 1+2+… +n, risultato in y X1; y0; while (x<=n) {yy+x; x x+1} 43 Sia A una lista contenente n numeri interi positivi (ed A[i] l’elemento i-mo della lista). Si consideri il seguente algoritmo somma = 0; i = 1; A[n+1] = 10; while (A[i] < 10) i := i + 1; if (i <= n ) somma = somma +A[i] Qual’è il valore di somma al termine del ciclo? Ricorda: while (condizione) azione ES. Calcolo 1+2+… +n, risultato in y X1; y0; while (x<=n) {yy+x; x x+1} 44 Chiamate a procedure • L’esecuzione di una procedura conduce all’esecuzione di un’altra procedura ES. ProceduraA(n) if (n>100) then restituisci 0 else esegui PorceduraB(n) ProceduraB(n) c=0; while (n<100) do {n=2*n; c=c+1;} restituisci c; 45 Strutture ricorsive • L’esecuzione di una procedura conduce all’esecuzione della stessa procedura su diverso input 46 Strutture ricorsive Es. Calcolo di n! =1*2*3*… *n – Base. 1!=1 – In generale n!= (n-1)! * n = (n-2)! *(n-1)* (n) = (n-3)! * (n-2) *(n-1)* (n) … =1*2* … (n-2) *(n-1)* (n) fact(n) { if (n<=1) then restituisci 1 /*Base*/ else restituisci n*fact(n-1); 47 RICORSIONE • L’esecuzione di una procedura conduce all’esecuzione della stessa procedura su diverso input • Vengono avviate attivazioni multiple della procedura • Di queste tutte attendono il completamento dell’ultima (caso base) che è quella che viene effettivamente eseguita. fact(n) { if (n<=1) then restituisci 1 /*Caso Base - termina*/ else restituisci n*fact(n-1) } RICERCA BINARIA Applicazione della nostra strategia per la ricerca della voce John in una lista ordinata. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 49 Prima bozza della tecnica di ricerca binaria: Cerchiamo il valore ‘’ElementoCercato’’ nella lista ordinata ‘’Lista’’ Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 50 Algoritmo binario di ricerca in pseudocodice Cerchiamo il valore ‘’ElementoCercato’’ nella lista ordinata ‘’Lista’’ Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 51 Cerchiamo Bill nella lista Alice Bill Carol David Evelyn Fred George Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 52 Cerchiamo David nella lista Alice Carol Evelyn Fred George Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 53 Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 54 Tempo di computazione (Running Time) di programmi ANALISI: analizza il r.t. di un dato programma Si raggruppano input per dimensione (es. ordinamento: dimensione= numero elementi da ordinare, sisteme di n equazioni in n incognite: dimensione=n) Running time: funzione T(n), con n=dimensione input, che rappresenta il numero di “istruzioni semplici” usate dall’algoritmo Tempo effettivo dipende da vari paramentri: velocità del processore usato, compilatore,…. Tempo di computazione (Running Time) di programmi Worst case (caso peggiore): su diversi input di stessa dimensione n si possono avere r.t. differenti T(n)= max tempo su qualsiasi input di dimensione n Es. ricerca iterativa di un elemento in una lista (dimensione=n = elementi nella lista) caso peggiore elemento non presente Tempo di computazione (Running Time) di programmi Confronto di r.t. Dato un problema consideriamo 2 algoritmi A e B con r.t. T’(n) e T’’(n) T’(n)=100n T’’(n)=2n2 T’’(n) T’(n) n n<50, T’’(n) < T’(n) n>50, T’’(n) > T’(n) n=100, T’’(n) = 2 T’(n) n=1000, T’’(n) = 20 T’(n) Tempo di computazione (Running Time) di programmi T’(n)=100n T’’(n)=2n2 Unità di tempo= 1ms (millisec) 1000 operazioni/sec sec (1000ms) | max n per A | (100n=1000*sec) 1 10 100 1000 | | | | 10 100 1000 10000 | max n per B | | | | | | | | | | ( 2n2=1000*sec) 22 70 223 707 | Tempo di computazione (Running Time) di programmi T’(n)=100n T’’(n)=2n2 Unità di tempo= 1ms (millisec) 1000 operazioni/sec sec (1000ms) | max n per A | (100n=1000*sec) 1 10 100 1000 | | | | 10 100 1000 10000 | max n per B | | | | | | | | | | ( 2n2=1000*sec) 22 70 223 707 | Se calcolatori diventano 100 volte più veloci (unità di tempo =1/100 di ms 100.000 operazioni/sec) In 10 sec A passa da n=100 ad n=10000 (*100) B passa da n=70 ad n=707 (*10) Notazione Q-grande e r.t. approssimato Dato un programma ed un input, r.t. dipende ancora da 1. Calcolatore usato (velocità di esecuzione istruzioni) 2. Compilatore (numero istruzioni macchina/istruzione C) Quindi non ha senso parlare di tempo in sec per analizzare un algoritmo. Notazione Q-grande e r.t. approssimato Dato un programma ed un input r.t. dipende ancora da 1. Calcolatore usato (velocità di esecuzione istruzioni) 2. Compilatore (numero istruzioni macchina/istruzione C) Quindi non ha senso parlare di tempo in sec per analizzare un algoritmo. Per nascondere effetti di 1. e 2. si usa la notazione Θ-grande (big-Theta) che ignora le costanti Es. 4m-1=Q(m) (ignorando la costante moltiplicativa 4 e quella additiva 1) Efficienza degli Algoritmi • Misurata attraverso il numero di istruzioni eseguite • Big theta notation: Utilizzata per rappresentare classi di efficienza – Esempio: Insertion sort è Θ(n2) • Analisi del caso migliore (Best), del caso peggiore (worst) e del caso medio (average) Applicazione dell’ordinamento per inserimento in una situazione di caso pessimo. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 62 Algoritmo di ordinamento per inserimento: analisi del caso pessimo. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 63 Algoritmo di ricerca binaria: analisi del caso pessimo. Brookshear – Informatica XI ed – Capitolo 5 l 00/00/00 64 65 Esercizi RICORSIONE • Scrivere un algoritmo in pseudocodice per calcolare il massimo di una sequenza di valori. Più precisamente, scrivere una procedura max(Lista) che restituisce il massimo valore in Lista, dove si assume che Lista non sia vuota e che i suoi elementi siano numeri interi positivi. • Scrivere un algoritmo che calcoli il prodotto dei primi n numeri naturali. • Sia L una lista contenente n numeri interi. Scrivere un algoritmo che calcoli la somma degli elementi di L. • Qual è il risultato di emmecidi(18,24), dove emmecidi è la seguente procedura? • • • • • • procedure emmecidi(X,Y) if (X = Y) then return X else if (X > Y) then return emmecidi(X-Y, Y) else return emmecidi(X, Y-X) 66