Algoritmi e Strutture Dati con Laboratorio (Modulo I) Luciano Gualà guala@mat.uniroma2.it http://www.mat.uniroma2.it/~guala/
Informazioni utili Orario lezioni Orario ricevimento Lunedì: 12,00 – 14,00 mercoledì: 9,00 – 11,00 Orario ricevimento mercoledì: 11,15 – 12,45 Ufficio: dip. di matematica, piano 0, corridoio B0, stanza 206 Copyright © 2004 - The McGraw - Hill Companies, srl
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) Marzo – Giugno Copyright © 2004 - The McGraw - Hill Companies, srl
Prerequisiti del corso Cosa è necessario sapere… programmazione di base strutture dati elementari concetto di ricorsione dimostrazione per induzione e calcolo infinitesimale Copyright © 2004 - The McGraw - Hill Companies, srl
Libro di testo C. Demetrescu, I. Finocchi, G. Italiano Algoritmi e Strutture dati (sec. ed.) McGraw-Hill Slide e materiale didattico http://www.mat.uniroma2.it/~guala/ Copyright © 2004 - The McGraw - Hill Companies, srl
…altri testi utili… P. Crescenzi, G. Gambosi, R. Grossi, G. Rossi Strutture di dati e algoritmi Pearson T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein Introduzione agli algortimi e strutture dati McGraw-Hill A. Bertossi, A. Montresor Algoritmi e strutture di dati Città Studi J. Kleinberg, E. Tardos Algorithm Design Addison Wesley Copyright © 2004 - The McGraw - Hill Companies, srl
Qualche consiglio: Lavorare sui problemi assegnati in gruppo Scrivere/formalizzare la soluzione individualmente Copyright © 2004 - The McGraw - Hill Companies, srl
Modalità d’esame L’esame consiste in una prova scritta e una prova orale Quattro appelli 2 giugno/luglio 1 settembre 1 gennaio/febbraio Prova parziale a febbraio Per sostenere l’esame è obbligatorio prenotarsi online (una settimana prima) su delphi.uniroma2.it Copyright © 2004 - The McGraw - Hill Companies, srl
public static int InJava (int[] a){ int max=a[0]; 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 if A[k]>max then max:=A[k]; end; InPascal:=max; Copyright © 2004 - The McGraw - Hill Companies, srl
…un possibile pseudo-codice… Input: Sequenza di n numeri: <a1,a2,…, an> Output: valore massimo della sequenza max=a1 per ogni i=2,…, n se (ai > max) allora aggiorna max= ai restituisci max Copyright © 2004 - The McGraw - Hill Companies, srl
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 Copyright © 2004 - The McGraw - Hill Companies, srl
Definizione informale di algoritmo Insieme di istruzioni, definite passo per passo, in modo da poter essere eseguite meccanicamente e tali da produrre un determinato risultato Copyright © 2004 - The McGraw - Hill Companies, srl
etimologia Il termine Algoritmo deriva da Algorismus, traslitterazione latina del nome di un matematico persiano del IX secolo, Muhammad al-Khwarizmi, che descrisse delle procedure per i calcoli matematici Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmo vs Problema Sequenza di passi ben definita che risolve un problema computazionale La definizione del problema specifica in termini generali la relazione di input/output desiderata Copyright © 2004 - The McGraw - Hill Companies, srl
Problema: ricerca del minimo fra n numeri Input: una sequenza di n numeri A=<a1,a2,…,an> Output: un numero ai tale che ai aj j=1,…,n (stabilisce una relazione tra input e outut) Algoritmo (descrive procedura computazionale per realizzare tale relazione) Minimo (A) min= a1 for j=2 to n do if (aj < min) then min=aj return min Copyright © 2004 - The McGraw - Hill Companies, srl
Strutture dati Concetto di algoritmo è inscindibile da quello di dato Un algoritmo è una procedura che prende dei dati (input) e, dopo averli elaborati, li restituisce (output) I dati devo essere organizzati e strutturati in modo tale che la procedura che li elabora sia “efficiente” Copyright © 2004 - The McGraw - Hill Companies, srl
un esempio MCCXIV * XXI = 1214 * 21 = 1214 2428 25494 ?????? !!!!!!! 1214 * 21 = 1214 2428 25494 ?????? !!!!!!! Copyright © 2004 - The McGraw - Hill Companies, srl
Cosa impareremo? …ad analizzare e progettare “buoni” algoritmi …che intendiamo per “buoni”? Producano correttamente il risultato desiderato (correttezza) Siano efficienti in termini di tempo di esecuzione ed occupazione di memoria (efficienza) Copyright © 2004 - The McGraw - Hill Companies, srl
Analisi di algoritmi Studio teorico del comportamento, delle proprietà e dell’uso delle risorse di un algoritmo. Correttezza: dimostrare formalmente che un algoritmo è corretto non è sempre facile Un algoritmo può essere complesso e/o non intuitivo (ai fini dell’efficienza) Complessità: Stimare la quantità di risorse (tempo e memoria) necessarie all’algoritmo Misurata in complessità asintotica Non sempre è facile campire quale è la complessità di un algoritmo (es: algoritmi ricorsivi) Copyright © 2004 - The McGraw - Hill Companies, srl
Cosa è (più) importante oltre l’efficienza? Allora perché tanta enfasi sull’efficienza? Veloce è bello A volte: o veloce o non funzionale Legato alla User-friendliness Efficienza può essere usata per “pagare” altre caratteristiche Correttezza Semplicità Mantenibilità Stabilità Modularità Sicurezza User-friendliness … Copyright © 2004 - The McGraw - Hill Companies, srl
Altri motivi per studiare gli algoritmi "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 Copyright © 2004 - The McGraw - Hill Companies, srl
Altri motivi per studiare gli algoritmi “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 ua 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. Copyright © 2004 - The McGraw - Hill Companies, srl
Altri motivi per studiare gli algoritmi “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 Copyright © 2004 - The McGraw - Hill Companies, srl
Altri motivi per studiare gli algoritmi Potenzia le capacità di: Critical Thinking: un modo di decidere se un certo enunciato è sempre vero, vero a volte, parzialmente vero, o falso Problem Solving: insieme dei processi atti ad analizzare, affrontare e risolvere positivamente problemi Copyright © 2004 - The McGraw - Hill Companies, srl
Un’altra cosa che impareremo a fare (un po’): …analizzare problemi (computazionali) …cosa intendiamo con analizzare un problema? Copyright © 2004 - The McGraw - Hill Companies, srl
Formalizzazione di un problema Trovare un modello formale/matematico che descrive in modo non ambiguo il problema e renda esplicita la relazione fra input ed output Qualche volta piuttosto difficile Perché formalizzare? aiuta a comprendere meglio il problema una formalizzazione può suggerire un approccio risolutivo (possibilmente efficiente) per il problema Copyright © 2004 - The McGraw - Hill Companies, srl
Ragionare sulla complessità di un problema Ho progettato un algoritmo per un dato problema che usa una certa quantità di risorse di tempo e spazio Posso fare meglio? Quanto posso sperare di abbassare la mia complessità? Copyright © 2004 - The McGraw - Hill Companies, srl
Formalizzazione: un esempio Vogliamo progettare un algoritmo che aiuti la segretaria di dipartimento ad assegnare i corsi ai docenti (lei quando lo fa a mano impiega troppo tempo). C’è un insieme di docenti, a ognuno dei quali deve essere assegnato un solo corso (magari!). Un docente sa insegnare solo alcuni corsi. Copyright © 2004 - The McGraw - Hill Companies, srl
Una possibile formalizzazione: matching su grafi bipartiti docenti d1 d2 d3 d4 d5 Grafo bipartito nodi: docenti + corsi archi: (di,cj) se di sa insegnare cj c1 c2 c3 c4 c5 corsi Trovare insieme di archi che “coprono” tutti i corsi tale che due archi non incidono su uno stesso nodo Copyright © 2004 - The McGraw - Hill Companies, srl
Formalizzazione: un altro esempio Vogliamo progettare un algoritmo per un correttore ortografico di testi che, data una parola, controlla se essa è scritta bene e in caso di errore suggerisce una possibile correzione Copyright © 2004 - The McGraw - Hill Companies, srl
Una possibile formalizzazione Manteniamo un insieme D di parole dove D è il nostro dizionario (di parole corrette) Una parola x è corretta se x D Definiamo un concetto di distanza tra parole Se x non è in D, cerco una parola y in D che minimizza la distanza da x Osservazioni: Distanza fra due parole x e y deve essere piccola quando x e y sono “simili” Distanza fra due parole deve poter essere calcolata (efficientemente) Copyright © 2004 - The McGraw - Hill Companies, srl
Trovare il cammino più breve Copyright © 2004 - The McGraw - Hill Companies, srl
Una possibile formalizzazione: cammino minimo su un grafo pesato sorgente 2 10 3 9 s 18 6 Grafo pesato nodi: incroci archi: strade e distanze 2 6 6 30 4 19 11 5 15 8 6 20 16 t 7 44 destinazione Trovare un cammino (diretto) da s a t che minimizza la somma dei pesi degli archi Copyright © 2004 - The McGraw - Hill Companies, srl
Formalizzazione: un altro esempio Due robot telecomandabili R1 e R2 sono posizionati sui nodi s1 e s2 di un grafo G Vogliamo spostare R1 e R2 in t1 e t2, rispettivamente Possiamo spostarli uno alla volta seguendo gli archi di G Vincolo: i due robot non devono mai essere a distanza (minimo numero di archi che li separa) ≤ r (per evitare interferenze di segnale) Goal: trovare una sequenza minima di mosse valida r=1 s1 s2 t1 Copyright © 2004 - The McGraw - Hill Companies, srl
Formalizzazione: un altro esempio Idea: costruire un grafo delle “configurazioni” su cui cercare la sequenza di mosse Costruiamo un nuovo grafo H Nodi di H: coppie {i,j} di nodi di G tali che i e j sono a distanza > r Archi di G: c’è un arco fra {i,j} e {k,j} se c’è un arco in G fra i e k Trova un cammino minimo in H da {s1,s2} a {t1,t2} Copyright © 2004 - The McGraw - Hill Companies, srl
Un problema da $ 1,000,000 Trovare un algoritmo efficiente per il seguente problema: Dato un grafo G (non diretto e non pesato) e due nodi s e t, trovare il cammino (semplice) più lungo fra s e t s s t t Copyright © 2004 - The McGraw - Hill Companies, srl
Buon inizio anno Copyright © 2004 - The McGraw - Hill Companies, srl