Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 1/36 Introduzione al Corso di Algoritmi Di cosa parliamo oggi: Una discussione generale su cosa studieremo, perchè lo studeriemo, come lo studieremo,... Un esempio illustrativo di cosa studeriemo Informazione pratiche sul corso: - Modalità di esame (e come superarlo brillantemente) - Materiale didattico (libri di testo, materiale di supporto, esercizi di esame...) - Altro...
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 2/36 Corso di Algoritmi Obiettivi (ufficiali) del corso: Apprendere metodologie per il progetto ed analisi di algoritmi Di fatto, acquisiremo strumenti concettuali per la risoluzione di problemi. (Quali problemi? Di qualunque tipo...) Cosa studieremo? - Tecniche generali per lo sviluppo di algoritmi efficienti atti a risolvere problemi computazionali di interesse pratico - Strumenti per la valutazione degli algoritmi
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 3/36 Perchè studiare algoritmi? Tecniche algoritmiche permettono di risovere problemi importantissimi in Informatica (e ben oltre...) Trasmissione dati in Internet (come si gestisce in pratica il flusso di dati nei vari router della rete?) Ricerca nel WEB (come fà 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?)
E non lo dico solo io: Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 4/36
Anche il Corriere della Sera del 15/1/2012! Universita di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 5/36
...e se non siete ancora convinti dell utilità degli algoritmi, questo dovrebbe... Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 6/36
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 7/36 Iniziamo con un pó di storia... Il termine Algoritmo deriva dal matematico Persiano al-khwârizmî (c. 780-850), autore del testo Al-jabr w al-muqabâla (da cui anche il termine Algebra)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 8/36 Un altro pó di storia... Algoritmi di tipo numerico furono studiati da matematici babilonesi ed indiani piú di di 3000 anni fá. Algoritmi in uso fino a tempi recenti furono studiati dai matematici greci 500 anni a.c. Esempio: Algoritmo di Euclide per il Massimo Comun Divisore Esempio: Algoritmi geometrici (calcolo di tangenti, sezioni di angoli,...)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 9/36 Ma cos é un Algoritmo? Algoritmo: procedura computazionale che prende certi valori in input e produce i valori richiesti in output Algoritmo: strumento per risolvere un Problema Computazionale Il Problema computazionale (in forma generale o astratta) é definito da una relazione input/output Un algoritmo é quindi una procedure computazionale per ottenere la desiderata relazione input/output
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 10/36 Esempi di Problemi Computazionali Problema dell Ordinamento: Input: sequenza di numeri a 1,...,a n Output: una permutazione a 1,...,a n dell input tale che a 1... a n Algoritmo di Ordinamento: procedura che prende in input a 1,...,a n e produce in output a 1... a n
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 11/36 Esempi di Problemi Computazionali Problema della ricerca di un elemento: Input: Tabella A[1...n] ed elemento x Output: intero i, se x = A[i] per qualche indice i, un messaggio Non c é", altrimenti. Algoritmo di Ricerca: procedura che prende in input A[1...n] ed elemento x, e produce in output "i" se x = A[i], Non c è" altrimenti.
Dovrete avere la capacità di passare da tale problema concreto alla sua versione astratta (cioè l ordinamento) e quindi risolverlo con le tecniche che apprenderete in questo corso. Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 12/36 Nella vita reale raramente avrete a che fare con problemi astratti... Ciò che accadrà sarà che il vostro capo vi chiederà (ordinerà): Mi scriva un programma che elenchi i nostri fornitori in base ai loro tempi di consegna!
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 13/36 Abbiamo detto che studieremo Algoritmi Efficienti Cosa intendiamo per Algoritmi Efficienti? Algoritmi Efficienti = Algoritmi che usano "poche" risorse Risorse = Tempo e Spazio richiesto dall algoritmo per produrre l output Problema 1: Come misurare le risorse usate da un algoritmo? (Analisi degli algoritmi) Problema 2: Come progettare algoritmi che usano "poche" risorse? (Tecniche generali per il progetto di algoritmi) Lo vedremo...
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 14/36 Motivazioni Perché occuparci di algoritmi efficienti? Perchè algoritmi efficienti conducono a programmi efficienti Perchè programmi efficienti si vendono meglio... Perchè programmi efficienti fanno un miglior uso dell hardware Perchè programmatori che scrivono programmi efficienti sono piú richiesti...
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 15/36 Obiettivi Cosa otterrete da questo corso? Metodi e conoscenze per formulare modelli astratti da problemi pratici (Problemi Concreti Problemi Computazionali) Metodi e conoscenze per la progettazione di algoritmi efficienti per la risoluzione di problemi computazionali Metodi e conoscenze per analizzare l efficienza di algoritmi Un catalogo" di algoritmi efficienti, pronti per l uso, per la risoluzione dei piú comuni problemi computazionali
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 16/36 Esempio: Profitto Massimo in anni contigui Profitti della Ditta ACME-Corporation Anno 1 2 3 4 5 6 7 8 9 Profitto in M$ -3 2 1-4 5 2-1 3-1 Esempi: Tra gli anni 1 e 9 la Ditta ACME ha guadagnato 3+2+1 4+5+2 1+3 1 = 4 M$, tra gli anni 2 e 6 ha guadagnato 2+1 4+5+2 = 6 M$, tra gli anni 5 e 8 ACME ha guadagnato 5+2 1+3 = 9 M $ Il Problema del Profitto Massimo in anni contigui è quello di trovare l intervallo temporale in cui la Ditta ACME ha guadagnato di più (nel nostro esempio l intervallo (5, 8)).
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 17/36 Astrazione del Problema Input: un array di reali A[1...N], il profitto totale negli anni dall i-esimo allo j-esimo è V(i,j) = j x=i A[x]. Il Problema del Profitto Massimo in anni contigui (PMAC) è quello di trovare indici i j tali che Output: V(i,j) tale che i,j, vale che V(i,j ) V(i,j) i,j, vale che V(i,j ) V(i,j)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 18/36 Prima Soluzione: Forza Bruta Idea: Calcolare il valore V(i,j) per ogni coppia i j, e ritornare il valore massimo VMAX=A[1] for i = 1 to N do for j = i to N do % qui ci calcoliamo V = V(i,j) V = 0 for x = i to j do V = V +A[x] if V > VMAX then VMAX = V return VMAX Complessità dell algoritmo: Θ(N 3 ) (ci sono 3 for innestati, ciascheduno spazia su al piú N valori)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 19/36 Seconda Soluzione: Approccio Incrementale Idea: Non è necessario calcolare separatamente" ciascun V(i,j),ma possiamo usare il fatto che V(i,j) = j x=i A[x] = j 1 x=i VMAX=A[1] for i = 1 to N do V = 0 for j = i to N do % qui ci calcoliamo V(i,j) V = V +A[j] if V > VMAX then VMAX = V return VMAX A[x]+A[j] = V(i,j 1)+A[j]. Complessità dell algoritmo: Θ(N 2 ) (ci sono 2 for innestati, ciascheduno spazia su al piú N valori)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 20/36 Terza Soluzione: Divide-et-Impera Idea: Poni M = (N +1)/2. Il PMAC dell array A[1,...,N] deve necessariamente essere uno dei seguenti: S 1 : il PMAC dell array A[1,...,M], S 1 M M+1 oppure S 2 : il PMAC dell array A[M +1,...,N], M M+1 oppure é a "cavallo" di A[M], ovvero e A = A 1 A 2 A 1 A 2 M M+1 S 2
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 21/36 Esempio 1-5 4 2-7 3 6-1 2-4 7-10 2 6 1-3 In questo caso S 1 = [3,6] con valore 3+6 = 9, e S 2 = [2,6,1] con valore 2+6+1 = 9. 1-5 4 2-7 3 6-1 2-4 7-10 2 6 1-3 Ma abbiamo anche A 1 = [3,6,1], A 2 = [2, 4,7], con A = A 1 A 2 = [3,6,1,2, 4,7], di valore totale 3+6+1+2 4+7 = 13.
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 22/36 Dobbiamo quindi trovare S 1, S 2 e A... S 1 lo si trova determinando il PMAC di A[1...M], ovvero chiamando l algoritmo ricorsivamente sulla parte sinistra A[1...M] dell array A[1...N] S 2 lo si trova determinando il PMAC di A[M +1...N], ovvero chiamando l algoritmo ricorsivamente sulla parte destra A[M +1...N] dell array A[1...N] Come trovare A lo vediamo in un secondo... Il PMAC dell intero array A[1...N] sará quindi quel sottovettore che tra S 1, S 2, ed A, ha valore massimo.
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 23/36 Come trovare A: la fase di Conquer A 1 A 2 M M+1 i j A 1 é della forma A[i...M]: ci sono solo M N tali sequenze, tante quanti sono i corrispondenti valori di i,1 i M. Pertanto la sequenza contigua A 1 di valore massimo puó essere trovata usando al piú O(M) = O(N) operazioni. Analogamente, A 2 é della forma A[M +1...j]: ci sono solo N M N tali sequenze, tante quanti sono i corrispondenti valori di j,m j N. Pertanto la sequenza contigua A 2 di valore massimo puó essere trovata in O(N M) = O(N) operazioni. A = A 1 A 2 puó essere trovato in O(N) operazioni!
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 24/36 L Algoritmo Completo Divide-et-Impera Input: A[i...j], con i j PMAC(A,i,j) 1. if i = j return A[i] else 2. trova PMAC(A,i, (i+j)/2 ) 3. trova PMAC(A, (i+j)/2 +1,j) 4. trova PMAC che contiene sia A[ (i+j)/2 )] che A[ (i+j)/2 +1] 5. return il MASSIMO delle tre sequenze trovate Detto T(N) il numero di operazioni di PMAC(A,1,N), abbiamo: 1. richiede tempo O(1), 2. e 3. richiedono tempo T(N/2), 4. richiede tempo O(N), 5. richiede tempo O(1). T(N) = 2T(N/2)+O(N) T(N) = O(N logn)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 25/36 Analisi dell Algoritmo Divide-et-Impera Per semplificare l analisi, assumiamo che N = 2 h. I passi 4. e 5. dell algoritmo richiedono O(N) operazioni, ovvero richiedono un numero di operazioni cn, per qualche costante c. Quindi [ ] T(N) 2T(N/2)+cN 2 = 2 2 T(N/2 2 )+2cN 2 2 [ 2T(N/2 2 )+c N 2 +cn 2T(N/2 3 )+c N 2 2 ]+2cN = 2 3 T(N/2 3 )+3cN... 2 h T(N/2 h )+hcn Ponendo h = logn, si ha 2 h = 2 logn = N, e quindi T(N) NT(1)+(logN)cN = O(N logn)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 26/36 Abbiamo visto: Riassumendo... un algoritmo basato sulla generazione di tutte le possibili soluzioni, di complessitá O(N 3 ) un algoritmo basato sul riuso di dati precedentemente calcolati di complessitá O(N 2 ) un algoritmo basato su Divide-et-Impera di complessitá O(N logn)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 27/36 Ne é valsa la pena? Confrontiamo gli algoritmi su di un computer che esegue un milione di operazioni al secondo. Algoritmo 1 2 3 Tempo esecuzione N 3 N 2 N logn Tempo per risolvere un problema di taglia 10 2 1s 1/100s 0.00066438561s 10 3 16.67m 1s 0.00996578428s 10 4 277,78h 100s 0.13287712379s 10 5 31,69y 16,67m 1.66096404744s 10 6 31688,09y 277,78h 19.9315685693s
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 28/36 Morale della lezione Ne é valsa la pena Abbiamo visto che è possibile progettare algoritmi seguendo tecniche "generali" (forza bruta, divide-et impera,...) Abbiamo visto che è possibile analizzare e valutare algoritmi in base al numero di operazioni che essi compiono per produrre l output, in funzione della "taglia" dell input, e che questa analisi riflette il comportamento degli algoritmi in pratica
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 29/36 Circa PMAC: si può far meglio di O(N logn)? Si Esiste un algoritmo che risolve il Problema del Profitto Massimo in anni contigui in O(N) operazioni Però per oggi basta, trovatelo voi...
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 30/36 Informazioni sul corso Libro di testo: Jon Kleinberg ed Eva Tardos, Algorithm Design, Addison Wesley, 2005 Alla pagina WEB http://www.di.unisa.it/professori/uv/algo/algo.html apparirá tutto il materiale relativo al corso (copie delle slides usate, esercizi, date delle prove d esame, comunicazioni varie, etc.)
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 31/36 Informazioni pratiche sul corso In generale, le copie delle slide usate al corso compariranno in anticipo rispetto alla relativa lezione. É fortemente consigliato che le stampiate e le studiate (o almeno le leggiate...) prima della lezione.
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 32/36 Come superare l esame con buon voto? Seguire il corso Studiare lezione per lezione Studiare le slide anche prima della lezione Studiare anche dal libro di testo
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 33/36 Ma soprattutto... Fare tanti esercizi!
e dove li trovo gli esercizi, direte voi... Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 34/36
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 35/36 Promessa: Prometto che gli esercizi d esame li conoscerete in anticipo! ovvero, gli esercizi d esame saranno presi dalla lista di esercizi che saranno via via disponibili alla pagina http://www.dia.unisa.it/ uv/algo/algo.html
Università di Salerno Corso di Algoritmi Prof. Ugo Vaccaro Anno Accademico 2014/15 p. 36/36 Orario Lezioni e Ricevimento Lezioni: Lunedí ore 9:00 11:00, Aula F8, Mercoledí, ore 9:00 11:00, Aula F8 Controllare spesso la pagina WEB www.dia.unisa.it/professori/uv/algo/avvisi.html per eventuali cambiamenti all ultimo minuto di orari. Ricevimento: Lunedí e Mercoledí dopo la lezione