620 likes | 822 Views
Algoritmi e Strutture Dati. Luciano Gualà guala@mat.uniroma2.it www.mat.uniroma2.it/~guala. Informazioni utili. Orario lezioni Lunedì : 11,00 – 13,00 mercoledì : 9,00 – 11,00 Orario ricevimento mercoledì : 11,15 – 12,45 (o su appuntamento )
E N D
Algoritmi e StruttureDati LucianoGualà guala@mat.uniroma2.it www.mat.uniroma2.it/~guala
Informazioniutili • Orariolezioni • Lunedì: 11,00 – 13,00 • mercoledì: 9,00 – 11,00 • Orarioricevimento • mercoledì: 11,15 – 12,45 (o suappuntamento) • Ufficio: dip. dimatematica, piano 0, corridoio B0, stanza 206
Struttura del corso • Corso strutturato in due moduli • Modulo I (vecchio Elementi di Algoritmi e Strutture Dati) • 6 CFU • Ottobre – Gennaio • Modulo II (vecchio Algoritmi e Strutture dati con Laboratorio) • 6 CFU • Marzo – Giugno
Prerequisiti del corso Cosa è necessariosapere… • programmazionedi base • strutturedatielementari • concettodiricorsione • dimostrazione per induzione e calcoloinfinitesimale Propedeuticità • programmazione • analisimatematica • matematicadiscreta
Slide e materialedidattico Libriditesto http://www.mat.uniroma2.it/~guala/ C. Demetrescu, I. Finocchi, G. Italiano Algoritmi e Strutture dati (sec. ed.) McGraw-Hill S. Dasgupta, C. Papadimitriou, U. Vazirani Algorithms , McGraw-Hill P. Crescenzi, G. Gambosi, R. Grossi, G. Rossi Strutturedidati e algoritmi Pearson T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein Introduzioneaglialgortimi e strutturedati McGraw-Hill J. Kleinberg, E. Tardos Algorithm Design Addison Wesley A. Bertossi, A. Montresor Algoritmi e strutturedidati CittàStudi
Modalitàd’esame • L’esameconsiste in unaprovascrittae unaprovaorale • Quattro appelli • 2 giugno/luglio • 1 settembre • 1 gennaio/febbraio • Provaparziale a febbraio • Per sostenerel’esame è obbligatorioprenotarsi online (unasettimana prima) su delphi.uniroma2.it
Qualcheconsiglio: • Lavorare sui problemi assegnati in gruppo • Scrivere/formalizzare la soluzione individualmente
Algoritmo Procedimentochedescriveunasequenzadipassibendefinitifinalizzato a risolvere un datoproblema (computazionale).
etimologia Il termineAlgoritmoderivadaAlgorismus, traslitterazionelatina del nomedi un matematicopersiano del IX secolo, Muhammad al-Khwarizmi, chedescrissedelle procedure per icalcolimatematici
Algoritmi e programmi • Un algoritmo può essere visto come l’essenza computazionale di un programma, nel senso che fornisce il procedimento per giungere alla soluzione di un dato problema di calcolo • Algoritmo diverso da programma • programma è la codifica (in un linguaggio di programmazione) di un algoritmo • un algoritmo può essere visto come un programma distillato da dettagli riguardanti il linguaggio di programmazione, ambiente di sviluppo, sistema operativo • Algoritmo è un concetto autonomo da quello di programma
Cosastudieremo? …ad analizzare e progettare “buoni” algoritmi …cheintendiamo per “buoni”? • Corretti:producono correttamente il risultato desiderato • Efficienti: usano poche risorse di calcolo, come tempo e memoria. algoritmi veloci!
Cosa è (più) importanteoltrel’efficienza? • Alloraperchétantaenfasisull’efficienza? • Veloce è bello • A volte: o veloce o non funzionale • Legato alla User-friendliness • Efficienzapuòessereusata per “pagare” altrecaratteristiche • Correttezza • Semplicità • Mantenibilità • Stabilità • Modularità • Sicurezza • User-friendliness • …
Altrimotivi per studiareglialgoritmi “L’algoritmica è l’anima dell’informatica." David Harel Le idee algoritmiche non solo trovano soluzioni a problemi ben posti, quanto costituiscono il linguaggio che porta ad esprimere chiaramente il problema soggiacente
Altri motivi per studiare gli algoritmi importanzateorica “Se è vero che un problema non si capisce a fondo finché non lo si deve insegnare a qualcuno altro, a maggior ragione nulla è compreso in modo più approfondito di ciò che si deve insegnare ad una macchina, ovvero di ciò che va espresso tramite un algoritmo." Donald Knuth • In ogni algoritmo è possibile individuare due componenti fondamentali: • l’identificazione della appropriata tecnica di progetto algoritmico (basato sulla struttura del problema); • la chiara individuazione del nucleo matematico del problema stesso.
Altri motivi per studiare gli algoritmi importanzapratica "There is a saying: If you want to be a good programmer, you just program every day for two years, you will be an excellent programmer. If you want to be a world-class programmer, you can program every day for ten years. Or you can program every day for two years and take an algorithms class." Charles E. Leiserson
Altrimotivi per studiareglialgoritmi Potenzia le capacitàdi: • Critical Thinking: • un mododidecidere se un certoenunciato è semprevero, vero a volte, parzialmentevero, o falso • Problem Solving: • insieme dei processi atti ad analizzare, affrontare e risolvere positivamente problemi
complessitàcomputazionale alcuniconcettidi cui non è sempre facile parlare algoritmo efficienza istanza modellodicalcolo problema dimensionedell’istanza casopeggiore correttezza
un puzzle puòaiutare; ecconeunofamoso nmonetetutteidentiched’aspetto unadellemonete è falsa e pesa leggermentepiùdellealtre ho a disposizione solo una bilancia a due piatti obiettivo: individuare la monetafalsa (facendopochepesate)
tornandoaiconcettifondamentali problema: individuareunamonetafalsafra n monete istanza: n specifichemonete; quellafalsa è unadiqueste; puòessere la “prima”, la “seconda”, ecc. dimensionedell’istanza: ilvaloren bilancia a due piatti. specificaquellochesipuò fare modellodicalcolo: algoritmo: strategiadipesatura. La descrizionedeveessere “comprensibile” e “compatta”. Devedescrivere la sequenzadioperazionisulmodellodicalcoloeseguite per unagenericaistanza correttezzadell’algoritmo: la strategiadipesaturadevefunzionare (individuare la monetafalsa) per unagenericaistanza, ovveroindipendentementedaquantemonetesono, e se la monetafalsa è la “prima”, la “seconda”, ecc.
tornandoaiconcettifondamentali complessitàtemporale (dell’algoritmo): # dipesatecheesegue prima diindividuare la monetafalsa. Dipendedalladimensionedell’istanza e dall’istanzastessa. complessitàtemporalenelcasopeggiore: # massimodipesatecheeseguesuunaistanzadiunacertadimensione. E’ unadelimitazionesuperiore a quanto mi “costa” risolvereunagenericaistanza. Espressa come funzionedelladimensionedell’istanza. l’algoritmodeve fare pochepesate, deveesserecioèveloce. Ma velocerispetto a che? quandosipuò dire che un algoritmo è veloce? efficienza (dell’algoritmo):
Alg1uso la prima moneta e la confronto con le altre n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre trovata! n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre n=7 3 2 6 4 5 7 1
Alg1uso la prima moneta e la confronto con le altre trovata! n=7 3 2 6 4 5 7 1
due parole sui costrutti: sequenziamento, condizionale, ciclo • Alg1 (X={x1, x2, …, xn}) • for i=2 to n do • if peso(x1) > peso(xi) then return x1 • if peso(x1) < peso(xi) then return xi Corretto? # pesate? sì! dipende! nelcasopeggiore? n-1 efficiente? …boh?! posso fare meglio? Oss: l’ultimapesata non serve n-2 pesate …mah!
Alg2peso le monete a coppie n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie trovata! n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie n=7 3 2 6 4 5 7 1
Alg2peso le monete a coppie trovata! n=7 3 2 6 4 5 7 1
Alg2 (X={x1, x2, …, xn}) • k= n/2 • for i=1 to k do • if peso(x2i-1) > peso(x2i) then return x2i-1 • if peso(x2i-1) < peso(x2i) then return x2i • //ancora non ho trovato la monetafalsa; n è dispari //e mancaunamonetareturn xn Corretto? # pesate? sì! dipende! nelcasopeggiore? n/2 efficiente? …boh?! peròmeglio diAlg1 posso fare meglio?
Alg3peso le monetedividendoleogni volte in due gruppi n=7 3 2 6 4 5 7 1
Alg3peso le monetedividendoleogni volte in due gruppi n=7 3 2 6 4 5 7 1
Alg3peso le monetedividendoleogni volte in due gruppi trovata! n=7 3 2 6 4 5 7 1
Alg3peso le monetedividendoleogni volte in due gruppi n=10 3 2 6 9 4 5 7 8 10 1
Alg3peso le monetedividendoleogni volte in due gruppi n=10 3 2 6 9 4 5 7 8 10 1
Alg3peso le monetedividendoleogni volte in due gruppi n=10 3 2 6 9 4 5 7 8 10 1
Alg3peso le monetedividendoleogni volte in due gruppi trovata! n=10 3 2 6 9 4 5 7 8 10 1
Alg3(X) • if (|X|=1) then return unicamoneta in X • dividi X in due gruppi X1 e X2di (uguale) dimensione k = |X|/2 e se |X| è dispariunaulterioremoneta y • if peso(X1) = peso(X2) then return y • if peso(X1) > peso(X2) then return Alg3(X1) else return Alg3(X2) Corretto? sì! # pesatenelcasopeggiore? log2 n (daargomentare) efficiente? …boh?! peròmeglio diAlg2
Alg3: analisidellacomplessità P(n): # pesatecheAlg3eseguenelcasopeggioresuun’istanza didimensionen P(n)= P( n/2 ) + 1 P(1)=0 Oss.: P(x) è unafunzione non decrescente in x Oss.: vale (1/2)n/2 (1/2) n/2 n/4 P(n) = P(n/2) + 1 = P((1/2)n/2) + 2 P(n/4) + 2 P(n/8) + 3 quandon/2i = 1? P(n/2i ) + i per i= log2n P(1) + log2n = log2n
Unadomanda: quanto è piùveloceAlg3rispettoaglialtri? assunzione:ognipesatarichiede un minuto TABELLA posso fare megliodi Alg3?
Alg4possodividere in tregruppiinvecedi due n=7 3 2 6 4 5 7 1
Alg4possodividere in tregruppiinvecedi due n=7 3 2 6 4 5 7 1