Comments
Description
Transcript
Cenno agli Algoritmi
Cenno agli Algoritmi Stefano Bilotta Corso di Informatica (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 1 / 40 L’approccio ad un problema Quando si pensa di poter affrontare e risolvere un problema per mezzo dell’Informatica, si procede alla sua analisi cercando di trovare un metodo di soluzione o più in generale un modello matematico. Il processo che porta alla soluzione del problema è un’attività di natura logico-linguistica che può essere effettuata a prescindere dalla struttura fisica dell’elaboratore. Tale metodo di soluzione deve tuttavia essere ben formulato, senza ambiguità o ridondanze, meglio se con strumenti matematici, e deve portare alla soluzione in un tempo finito. Un metodo di risoluzione come quello descritto si dice un algoritmo. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 2 / 40 L’approccio ad un problema In generale, l’approccio ad un problema, nel tentativo di trovare un metodo di risoluzione, prevede in prima istanza una suddivisione del problema stesso in sottoproblemi più elementari. Trovando soluzioni per tali sottoproblemi si giunge all’algoritmo che risolve il problema di partenza. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 3 / 40 La definizione di algoritmo Il termine Algoritmo deriva dal nome del matematico persiano Muhammad ibn Musa ’l-Khwarizmi che durante il IX secolo si dedicò allo studio algebrico di equazioni. Formalmente, per algoritmo si intende una successione finita di passi o istruzioni che definiscono le operazioni da eseguire su dei dati (istanza del problema): in generale un algoritmo è definito per risolvere ogni istanza di un problema di un certo tipo. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 4 / 40 Proprietà dell’algoritmo Un algoritmo deve necessariamente avere le seguenti proprietà: Finitezza: ogni istruzione va eseguita in un tempo finito e deve essere eseguita un numero finito di volte; Generalità: un algoritmo deve fornire soluzione per tutti i problemi di una classe; Non ambiguità: i passi devono essere univoci, evitare paradossi, contraddizioni e ambiguità. Inoltre un algoritmo deve essere corretto ed efficiente, ossia arrivare alla soluzione giusta e nel modo più veloce possibile, usando la minore quantità di memoria possibile. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 5 / 40 L’importanza dell’algoritmo La ricerca e lo studio degli algoritmi è il vero nucleo dell’opera degli informatici. La sostanza di un programma sta nel lavoro a monte che ha portato alla formulazione dell’algoritmo sottostante. Si noti che un algoritmo è indipendente dal particolare elaboratore su cui verrà realizzato il programma corrispondente. Se un giorno si dovesse risolvere lo stesso problema su una macchina nuova usando un nuovo linguaggio, l’algoritmo resterebbe comunque valido e non sarebbe necessario eseguire di nuovo l’analisi del problema. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 6 / 40 Un esempio di algoritmo Consideriamo un semplice algoritmo per la somma dei primi n naturali. 0. 1. 2. 3. 4. 5. 6. 7. (Stefano Bilotta) Inizio; Leggi n; Poni i = 0 e s = 0; Se i > n : 3.1. Stampa s (il risultato); 3.2. Vai al passo 7; Aggiungi i ad s (s := s + i); Incrementa i di 1 (i := i + 1); Torna al passo 3; Fine. Cenno agli Algoritmi Corso di Informatica 7 / 40 Osservazioni sull’esempio L’argoritmo dell’esempio precedente ha la proprietà di finitezza. Diversamente, è facile notare che se il passo 3.2 oppure il passo 5 fossero omessi l’algoritmo non terminerebbe. Ha la proprietà di generalità, infatti l’algoritmo funziona per ogni n generico (a meno che N non sia cosı̀ grande da non essere contenuto in memoria). Inoltre risulta non ambiguo. Diversamente, se il passo 2 fosse omesso non sarebbero definiti i ed s ai passi successivi. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 8 / 40 Un altro esempio di algoritmo Consideriamo un semplice algoritmo per trovare il Massimo Comune Divisore (MCD) tra due numeri. Prima di iniziare si ricordi il procedimento di Eulero, il quale afferma che: MCD(a, b) = MCD(b, r ) se r 6= 0, MDC (a, b) = b se r = 0, dove a, b sono numeri naturali con a > b e r = a mod b (ovvero r è il resto della divisione di a con b). Esempi: MCD(105, 90) = MCD(90, 15) = 15; MCD(27, 10) = MCD(10, 7) = MCD(7, 3) = MCD(3, 1) = 1. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 9 / 40 L’algoritmo per MCD Consideriamo un semplice algoritmo per trovare il Massimo Comune Divisore (MCD) tra due numeri a, b. 0. Inizio; 1. Acquisisci i valori di a e b; 2. Se a < b : 2.1. Scambia b con a; 3. Calcola r (r := a mod b); 4. Se r = 0 : 4.1. Salta al passo 7; 5. Sostituisci a con b e b con r ; 6. Torna al passo 3; 7. Scrivi b (ovvero il risulato); 8. Fine. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 10 / 40 Osservazioni sull’algoritmo L’algoritmo dell’esempio precedente ha la proprietà di finitezza. L’unico problema si potrebbe verificare al passo 6, in cui si dice di tornare al passo 3. Si noti che r assumerà sicuramente valore 0. Ha la proprità di generalità. Si può osservare come l’algoritmo risulti valido anche per a = b. Inoltre risulta non ambiguo. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 11 / 40 Le istruzioni dell’algoritmo Le istruzioni di un algoritmo sono semplici e basilari. Si possono distinguere in: lettura e scrittura (acquisizione e stampa); operative (operazione aritmetiche o di assegnamento); di controllo; di salto. Inoltre, dagli esempi precedenti emerge che lo stesso concetto può essere espresso in più modi (leggi/acquisisci, stampa/scrivi, vai a/salta a, ...) Nasce dunque l’esigenza di uno pseudolinguaggio il più possibile uniforme per la scrittura degli algoritmi. Tale pseudolinguaggio risulta indipendente da uno specifico linguaggio di programmazione. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 12 / 40 Diagramma di flusso I diagrammi di flusso (flow chart) detti anche diagrammi a blocchi rappresentano un linguaggio di modellazione grafica per la stesura degli algoritmi. In particolare, in tali diagrammi le varie istruzioni dell’algoritmo sono rappresentate mediante simboli grafici, detti blocchi elementari, opportunamente collegati. Blocco di inizio Blocco di controllo Inizio x>0 Blocco di fine V F Fine Blocco di elaborazione Blocco di input/output Leggi/ scrivi x x:=x+1 (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 13 / 40 Proprietà In un diagramma a blocchi sono presenti: Un blocco di inizio e uno di fine; Un numero finito di blocchi di elaborazione (o azione) e di input/output; Un numero finito di blocchi di controllo. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 14 / 40 Proprietà Inoltre valgono le seguenti proprietà: Ogni blocco di elaborazione (o azione) o di input/output ha una freccia in ingresso e una in uscita; Ogni blocco di controllo ha una freccia in ingresso e due in uscita; Ogni freccia entra in un blocco e si raccorda con un’altra freccia (escluso la freccia in uscita del blocco di inizio e quella in entrata del blocco di fine); Ogni blocco è raggiungibile dal blocco di inizio; Il blocco di fine è raggiungibile da ogni altro blocco. Il blocco di controllo contiene una condizione solitamente un’espressione che può essere vera o falsa (Ogni blocco di controllo ha una freccia in ingresso e due in uscita). (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 15 / 40 Esempio Diagramma di flusso per l’algoritmo che somma i primi n naturali. Inizio Leggi n i:=0, s:=0 i>n V Scrivi s Fine F s:=s+i i:=i+1 (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 16 / 40 Esempio Diagramma di flusso per l’algoritmo che trova MCD(a, b). x:=a a:=b b:=x V Inizio Leggi a,b b>a r:=a mod b r=0 V Scrivi b Fine F F a:=b b:=r (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 17 / 40 Alcuni costrutti fondamentali Nello pseudolinguaggio si usano spesso dei costrutti fondamentali. Il costrutto if Si usa nella forma: if B then C1 else C2 dove B è un’espressione che può assumere valore di verità oppure valore di falsità (B si dice espressione booleana), C1 e C2 sono invece comandi. Se B è vera allora si esegue C1, altrimenti C2 Il costrutto if si può trovare anche senza else: if B then C1. In questo caso se B è falsa non si esegue C1 ma si passa al comando successivo all’if. Il costrutto if è detto comando condizionale (o di selezione). (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 18 / 40 Alcuni costrutti fondamentali Il costrutto for si usa nella forma: for I from inizio to fine by passo do C I è l’indice o contatore o variabile di controllo, inizio e fine sono espressioni di tipo intero, passo è una costante. Il ciclo for si può sinteticamente esprimere come segue: 1. inizializzare I con il valore di inizio (I:=inizio); 2. se I > fine, il ciclo termina; altrimenti: 2.1 eseguire il comando C; 2.2 incrementare I del valore di passo (I:=I+passo); 2.3 tornare al punto 2. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 19 / 40 Alcuni costrutti fondamentali Il costrutto while si usa nella forma: while B do C dove B è un’espressione booleana e C è un comando. Il ciclo while si può sinteticamente esprimere come segue: 1. valutare l’espressione booleana B; 2. se B è vera eseguire il comando C e tornare al passo 1, altrimenti il ciclo termina. I cicli for e while si dicono comandi iterativi. Il ciclo for è un’iterazione determinata poiché conoscendo il valore di inizio, fine e passo (che sono praticamente numeri) è possibile sapere quante volte sarà eseguito il comando C. Ciò non è possibile nel ciclo while, che sono iterazioni indeterminate. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 20 / 40 Algoritmi di base Alcuni problemi basilari si ritrovano molto spesso, eventualmente come sottoproblemi di situazioni più complesse. Specificatamente, in Informatica si considerano due problemi, l’ordinamento e la ricerca dei dati, come fondamentali, e si dicono di base gli algoritmi che li risolvono. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 21 / 40 Ordinamento: Selection sort Si consideri un elenco disordinato: 13 23 19 11 5. Cercare il minimo fra gli elementi e lo si scambia con il primo elemento dell’elenco. Dopodiché si cerca il minimo fra gli elementi rimanenti e si scambia col secondo elemento e si prosegue in questo senso... Si ha: 5 23 (Stefano Bilotta) 19 11 13 5 11 19 23 13 5 11 13 23 19 5 11 13 19 23 5 11 13 19 Cenno agli Algoritmi 23 Corso di Informatica 22 / 40 Ordinamento: Bubble sort Si consideri un elenco disordinato: 13 23 19 11 5. Scandire l’elenco, confrontare un elemento con il successivo e proseguire verso destra. Se il primo elemento è minore del secondo allora si lasciano le cose invariate, altrimenti si scambiano le posizioni dei due elementi. Schematizzando: (Stefano Bilotta) 13 19 11 5 23 13 11 5 19 23 11 5 13 19 23 5 11 13 19 23 5 11 13 19 23 Cenno agli Algoritmi Corso di Informatica 23 / 40 Cenni sulla complessità La complessità di un algoritmo è la misura della sua efficienza. Se l’algoritmo deve gestire n dati, la complessità si misura in funzione di n e determina in media il numero di operazioni che devono essere effettuate per raggiungere il risultato. Gli algoritmi di ordinamento visti in precedenza hanno complessità quadratica. Si noti che, raddoppiando n il numero di operazioni diviene quattro volte più grande. Dalla complessità dipende dunque il tempo di eleborazione dell’algoritmo. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 24 / 40 Strutture dati Un elenco di dati, dal punto di vista informatico, rappresenta una sequenza di posizioni contigue nella memoria centrale dell’elaboratore e ogni dato corrisponde ad un certo numero di Byte. Un elenco costituito da elementi in posizioni contigue, di lunghezza fissata in numero di Byte, si dice in gergo vettore o array ed è la più semplice struttura dati. V1 (Stefano Bilotta) V2 V3 Vn-1 Vn Cenno agli Algoritmi Corso di Informatica 25 / 40 Strutture dati Un altro esempio di struttura dati è costituito dalle liste. Un lista come un vettore è una sequenza di dati, ognuno di lunghezza fissata, ma che risiedono in posizioni non contigue della memoria. Ogni elemento della lista è dunque costituito da due parti: il dato e il collegamento (puntatore) all’elemento successivo. L’ultimo elemento della lista è il puntatore vuoto. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 26 / 40 Strutture dati Il vantaggio della lista rispetto al vettore sta nel fatto che gli elementi possono essere sparsi nella memoria, garantendo una grande flessibilità alla struttura, contro la rigidità del vettore. Tra le capacità delle liste vanno considerate le seguenti: Crescita indefinita, Possibilità di poter inserire velocemente e facilmente un elemento in prima posizione Tuttavia, nella lista non è possibile sapere dove si trova un certo elemento. La liste va scorsa e gli elementi contati con gran perdita di tempo. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 27 / 40 Strutture dati Mediante la filosofia delle liste si ottengono delle altre utilissime strutture dati: la pila e la coda. La pila è una lista lineare (un insieme ordinato di oggetti) a lunghezza variabile in cui inserimenti ed estrazioni avvengono dalla stessa parte, detta testa della pila. Si realizza il principio LIFO: Last In First Out. La coda è una lista lineare a lunghezza variabile in cui l’inserimento viene effettuato ad un estremo (fondo) e l’estrazione all’altro estremo (testa). Si realizza il principio FIFO: First IN First Out. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 28 / 40 Alberi binari Una delle strutture più interessanti è quella degli alberi binari. Un albero binario è costituito dalla radice (ovvero il nodo iniziale), e da questa si dipartono al più due rami ognuno dei quali raggiunge un nodo (destra e sinistra), dal quale partono altri due rami e cosı̀ di seguito. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 29 / 40 Alberi binari di ricerca Gli alberi binari hanno svariati usi, in Informatica i più famosi sono gli alberi binari di ricerca. Il loro nome deriva dal fatto che sono utilizzati per la ricerca veloce delle informazioni, ma sono di fondamentale importanza soprattutto per la memorizzazione dei dati. Inoltre, i dati memorizzati risultano implicitamente ordinati. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 30 / 40 Alberi binari di ricerca Avendo a disposizione un elenco di dati, si inserisce il primo dell’elenco in radice, il secondo elemento si confronta con la radice: se è maggiore della radice si inserisce nel nodo figlio di destra, altrimenti nel nodo figlio di sinistra. Questa operazione si ripete fino ad esaurire tutti gli elementi. Dunque, durante l’inserimento dei dati, spostiamo l’inserimento verso sinistra se l’elemento è minore del nodo padre, lo spostiamo verso destra se è maggiore (implicando l’ordinamento). (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 31 / 40 Alberi binari di ricerca Dato l’elenco: 13 23 19 11 5, si ha: 13 11 5 23 19 L’ordinamento è dunque ottenuto dal seguente procedimento: 1. Ordinare gli elementi del sottoalbero di sinistra, 2. Inserire radice, 3. Ordinare gli elementi del sottoalbero di destra. Si ottiene: 5 (Stefano Bilotta) 11 13 19 23 Cenno agli Algoritmi Corso di Informatica 32 / 40 Vari tipi di problemi I moderni elaboratori elettronici si sono acquistati la fama di macchine velocissime, che riescono ad affrontare e risolvere tutti i problemi che la realtà ci propone in termini algoritmici. Questo è ben lontano dal vero. 1. Vi sono problemi dei quali conosciamo benissimo le soluzioni possibili, ma che l’elaboratore affronta solo con estrema difficoltà. 2. Esistono problemi che non sono risolubili in termini algoritmici, quindi non sono risolubili né con gli elaboratori di oggi né con quelli che saranno costruiti in futuro. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 33 / 40 Problemi risolubili Un problema si dice risolubile quando esiste un metodo, ovvero un algoritmo, che trova la soluzione (se esiste soluzione) oppure che stabilisce che non vi è soluzione (se non esiste soluzione). Un problema che sia sempre risolubile in questo senso si dice tecnicamente decidibile, e la parola sta ad indicare il fatto che, in ogni caso, sappiamo decidere se il problema ha soluzione (e, quindi, quale essa sia) o non ha soluzione. Fra i problemi decidibili vi sono quelli che l’elaboratore tratta con troppa difficoltà, anche se gli viene fornita soluzione algoritmica (problemi intrattabili). (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 34 / 40 Il commesso viaggiatore Uno tra i più famosi problemi intrattabili è quello del commesso viaggiatore: Nella città X vive un commesso viaggiatore che all’inizio di ogni mese è abituato a mettere a punto il piano delle proprie visite nel periodo in questione. Egli sa quali città visitare per il suo lavoro, sa le spese che deve affrontare per i suoi spostamenti, e desidera trovare il percorso ottimale, cioè il percorso che, partendo da X, lo riporta a X dopo aver visitato tutte le città, ma con la minor spesa (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 35 / 40 Il commesso viaggiatore 2 città da visitare: i percorsi possibili sono XABX e XBAX. Soluzione banale, che consiste nel calcolare il costo dei due percorsi e scegliere quello che costa meno. 3 città da visitare: i percorsi possibili sono XABCX, XACBX, XBACX, XBCAX, XCABX, XCBAX. Tali percorsi corrispondono alle possibili permutazioni di A, B, C cioè al loro possibile ordinamento. La questione comincia a diventare complicata... (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 36 / 40 Il commesso viaggiatore In generale, le permutazioni di n elementi sono n! = n ∗ (n − 1) ∗ (n − 2) ∗ . . . ∗ 2 ∗ 1 (il fattoriale di n). Il fattoriale è una quantità che cresce molto rapidamente. Ad esempio: 10! = 3628800 e addirittura 20! è dell’ordine di 1018 . Se il commesso viaggiatore volesse visitare 20 città, il suo elaboratore dovrebbe trattare circa 1018 permutazioni. Supponendo che il calcolatore ne tratti una ogni milionesimo di secondo, impiegherebbe circa 1012 secondi, ovvero circa 35 mila anni. Si potrebbe pensare di trovare algoritmi che non devono passare in rassegna tutte le permutazioni possibili. Ad oggi, dopo svariati studi, nulla si è potuto fare in questa direzione. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 37 / 40 Problemi intrattabili Formalmente, il numero di permutazioni cresce in modo più che esponenziale (Stirling 1780). Un problema si dice intrattabile se la sua complessità è almeno esponenziale. Si dice invece trattabile se la sua complessità è al più polinomiale. Quando un algoritmo di risoluzione di un problema ha complessità esponenziale, l’aumento di poche unità nella dimensione del problema comporta una crescita enorme nel numero di operazioni da effettuare e quindi ad una impennata nel tempo di elaborazione. Un altro esempio di problema intrattabile è la scomposizione di un numero in fattori primi, tale difficoltà viene appunto sfruttata per la sicurezza dei dati. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 38 / 40 Congetture Ad oggi, esistono anche problemi di cui non conosciamo algoritmi di risoluzione. Due fra i più famosi: 1. Si può osservare che esistono coppie di numeri primi gemelli, cioè che differiscono di 2 unità (11 e 13, 29 e 31). E’ stata fatta l’ipotesi che i primi gemelli siano infiniti, ma nessuno è mai riuscito a dimostrare. 2. Congettura di Goldbach: ogni numero pari maggiore di 2 si può ottenere come somma di due numeri primi (30 = 19 + 11, 32 = 19 + 13). Ancora nessuno è riuscito a trovare una dimostrazione. (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 39 / 40 Problemi indecidibili Esistono addirittura problemi, correttamente formulabili, dei quali non possiamo stabilire se esiste oppure se non esiste una data soluzione algoritmica, dunque problemi che risultano irrisolubili algoritmicamente. Tali problemi si dicono in genere indecidibili. Problema della fermata: Dato un algoritmo A e un dato D, entrambi arbitrari, stabilire se la computazione A(D) termina in un numero finito di passi o se la sua esecuzione continua all’infinito. E’ stato dimostrato che il Problema della fermata è indecidibile, ovvero non è possibile stabilire se esiste o meno un algoritmo generale che possa risolvere il problema per tutti i possibili input (Turing, 1937). (Stefano Bilotta) Cenno agli Algoritmi Corso di Informatica 40 / 40