This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Modalità d’esame• L’esame consiste in una prova scritta e una prova orale:
gli scritti/orali di teoria e laboratorio possono essere svolti disgiuntamente purché all’interno della stessa sessione
• Prove parziali (riservate agli studenti del secondo anno): il superamento delle prove parziali dà diritto a svolgere l’orale solo sulla seconda parte del programma
• Sei appelli (+1 a Novembre per i fuori corso)– 2 appelli a gennaio/febbraio– 2 appelli a giugno/luglio– 2 appelli a settembre
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Il termine Algoritmo deriva da Algorismus, traslitterazione latina del nome di un matematico persiano del IX secolo, Muhammad al-Khwarizmi, che ne descrisse il concetto applicato alle procedure per eseguire alcuni calcoli matematici
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Procedimento effettivo che consente di risolvere un problema (ovvero di ottenere una risposta ad un determinato quesito) eseguendo, in un determinato ordine, un insieme finito di passi semplici (azioni), scelti tra un insieme (solitamente) finito di possibili azioni.
Definizione (necessariamente informale) di algoritmo
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
• Concetto di algoritmo è inscindibile da quello di dato
• Da un punto di vista computazionale, un algoritmo è una procedura che prende dei dati in input e, dopo averli elaborati, restituisce dei dati in output
I dati devo essere organizzati e strutturati in modo tale che la procedura che li elabora sia “efficiente”
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
• Un algoritmo è l’essenza computazionale di un programma, nel senso che fornisce il procedimento per giungere alla soluzione di un dato problema di calcolo
• Algoritmo ≠ Programma– Un algoritmo è una procedura risolutiva depurata da dettagli
riguardanti il linguaggio di programmazione, ambiente di sviluppo, sistema operativo
– Un programma è la codifica (in un linguaggio di programmazione) di un algoritmo
Algoritmi e programmi
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Algoritmo (ad altissimo livello): Inizializza il valore del massimo al valore del primo elemento. Poi, guarda uno dopo l’altro tutti gli elementi, e ad ogni passo confronta l’elemento in esame con il massimo corrente, e se maggiore, aggiorna il massimo corrente
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
int InC(int a[], int n){ int i, max; max = a[0]; for (i = 1; i < n; i++) if (a[i] > max) { max = a[i]; } return max;}
public static int InJava (int[] a){int max=a[0];for (int i = 1; i < a.length; i++) if (a[i] > max) max = a[i];return max;
function InPascal(var A: array[1…Nmax] of integer): integer; var k, max: integer;begin max:=A[1]; for k:= 2 to n do begin if A[k]>max then max:=A[k]; end; InPascal:=max;end;
Alcune codifiche classiche…
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Leonardo da Pisa (anche noto come Fibonacci) si interessò di molte cose, tra cui il seguente problema di dinamica delle popolazioni:
L’isola dei conigli
Quanto velocemente si espanderebbe una popolazione di conigli sotto appropriate condizioni?
In particolare, partendo da una coppia di conigli in un’isola deserta, e data una certa regola di riproduzione, quante coppie si avrebbero nell’anno n?
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Per n ≥3, in ogni chiamata si eseguono due linee di codice, oltre a quelle eseguite nelle chiamate ricorsive
T(n) = 2 + T(n-1) + T(n-2) n ≥ 3
In generale, il tempo di esecuzione di un algoritmo ricorsivo è pari al tempo speso all’interno della chiamata più il tempo speso nelle chiamate ricorsive
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
• Utile per risolvere la relazione di ricorrenza T(n)• Ogni nodo corrisponde ad una chiamata ricorsiva• I figli di un nodo corrispondono alle sottochiamate
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
• Etichettando i nodi dell’albero con il numero di linee di codice eseguite nella chiamata corrispondente:– I nodi interni hanno etichetta 2– Le foglie hanno etichetta 1
Calcolare T(n)
• Per calcolare T(n):– Contiamo il numero di foglie– Contiamo il numero di nodi interni
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
Lemma 1:Il numero di foglie dell’albero della ricorsione di fibonacci2(n) è pari a Fn
dim (da fare a casa, per induzione su n)
Lemma 2:Il numero di nodi interni di un albero in cui ogni nodo interno ha esattamente due figli è pari al numero di foglie -1dim (da fare a casa, per induzione sul numero di nodi interni dell’albero)
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
• Perché l’algoritmo fibonacci2 è lento? Perché continua a ricalcolare ripetutamente la soluzione dello stesso sottoproblema. Perché non memorizzare allora in un array le soluzioni dei sottoproblemi?
Algoritmo fibonacci3
algoritmo fibonacci3(intero n) intero sia Fib un array di n interi Fib[1] Fib[2] 1 for i = 3 to n do Fib[i] Fib[i-1] + Fib[i-2] return Fib[n]
Correttezza? Corretto per definizione!
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati
• Linee 1, 2, e 5 eseguite una sola volta• Linea 3 eseguita n – 1 volte (una sola volta per n=1,2)• Linea 4 eseguita n – 2 volte (non eseguita per n=1,2)• T(n): numero di linee di codice mandate in
esecuzione da fibonacci3
Calcolo del tempo di esecuzione
T(n) = n – 1 + n – 2 + 3 = 2n n > 1
T(1) = 4
T(45) = 90Per n=45, circa 38 milioni di volte più veloce
dell’algoritmo fibonacci2!
T(100) = 200
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati