Indice

Algoritmi e Strutture dei Dati: A.A. 2012-2013

Prof. Roberto Grossi

Avvisi

Motivazioni

“Fino a poco tempo fa, i matematici teorici consideravano un problema risolto se esisteva un metodo conosciuto, o algoritmo, per risolverlo; il procedimento di esecuzione dell'algoritmo era di importanza secondaria. Tuttavia, c'è una grande differenza tra il sapere che è possibile fare qualcosa e il farlo. Questo atteggiamento di indifferenza sta cambiando rapidamente, grazie ai progressi della tecnologia del computer. Adesso, è importantissimo trovare metodi di soluzione che siano pratici per il calcolo. La teoria della complessità studia i vari algoritmi e la loro relativa effficienza computazionale. Si tratta di una teoria giovane e in pieno sviluppo, che sta motivando nuove direzioni nella matematica e nello stesso tempo trova applicazioni concrete quali quello fondamentale della sicurezza e identificazione dei dati.”

– E. Bombieri, Medaglia Fields, in La matematica nella società di oggi, Bollettino UMI, Aprile 2001

Contenuti

Introduzione al modello di calcolo, all'analisi e alla complessità degli algoritmi. Algoritmi ricorsivi e relazioni di ricorrenza: divide et impera e programmazione dinamica. Strutture di dati combinatorie con applicazioni: algoritmi per array, liste, alberi, pile, code, code di priorità, dizionari, grafi. Problemi P, NP, NP-completi e approssimazione.

Obiettivi formativi

Definire formalmente le nozioni di algoritmo e di modello di calcolo caratterizzandone gli aspetti rilevanti. Organizzare e strutturare i dati da elaborare nel modo più opportuno al fine di agevolarne l'uso da parte degli algoritmi. Progettare algoritmi corretti (che risolvono cioè sempre e solo il problema a cui si è interessati) ed efficienti (cioè che lo risolvono il più velocemente possibile o usano il minor spazio di memoria possibile), attraverso l'esame di paradigmi diversi e problemi provenienti dal mondo reale. Studiare le limitazioni inerenti dei problemi da risolvere, in particolare di quelli la cui soluzione richiede l'esame di tutte le possibilità.

Prerequisiti e metodologia

Modalità d'esame

Testi e materiale didattico

Programma

Registro delle lezioni

Data Argomento Riferimenti e note
28.02.2013 Introduzione al corso, motivazioni, testi, modalità di esame. Esempio di problem solving: scheduling di lavori e ordinamento (per selezione), con analisi asintotica della complessità. [CGGR, par.1.2,1.2.1] [alvie]
01.03.2013 Introduzione al Python (seminario del dott. Ottaviano). [lab]
04.03.2013 Modello computazionale RAM. Complessità in tempo e spazio, dimensione di un problema computazionale, caso pessimo e caso medio, notazione asintotica. Complessità di alcuni costrutti programmativi. [CGGR, par.0.3,0.6,0.7.1]
07.03.2013 Esempio: problema del segmento di somma massima, con analisi di complessità e correttezza. Complessità di un algoritmo e di un problema, limiti superiori e inferiori. “Fooling argument” per limiti inferiori lineari. [CGGR, par. 0.7][alvie]
08.03.2013 Linguaggio C e Linux: passaggio di argomenti da linea di comando e generazione di array casuali di interi. Implementazione delle soluzioni per il problema del segmento di somma massima. [lab]
11.03.2013 Limiti alla computabilità: problema della fermata di Turing. Prima classificazione di problemi in base alla loro complessità computazionale: indecibili, decidibili, esponenziali, polinomiali. Esempio di problema esponenziale: Torri di Hanoi e limiti superiori e inferiori. Strutture di dati per rappresentare le istanze dei problemi: elementari e sequenze (array e liste). Memorizzazione di array e liste e impatto sul costo di accesso. Array di dimensione variabile. [CGGR, par. 0.1, 0.2, 0.4, 1.1] [alvie][alvie]
14.03.2013 Array di dimensione variabile: analisi ammortizzata del tempo e analisi dello spazio. Studio della complessità degli algoritmi di ordinamento per selezione e inserimento. Mergesort e relazione di ricorrenza. [CGGR, par. 1.1, 1.2, 3.1] [alvie] [alvie] [alvie]
18.03.2013 Codice della fusione del mergesort e sua relazione con intersezione e unione di liste (insiemi) ordinate. Formula chiusa per l'equazione di ricorrenza del mergesort (seguirà teorema generale). Limiti superiori e inferiori per il problema dell'ordinamento mediante confronti (seguirà heapsort). Pile e code: operazioni supportate e complessità. [CGGR, par. 2.1, 2.3, 3.1, teorema 2.4] [alvie] [alvie]
19.03.2013 Codice per l'implementazione della struttura di dati coda. [lab]
22.03.2013 Coda con priorità: heap e operazioni supportate. Heapsort: ordinamento per confronti ottimo in tempo e spazio [CGGR, 2.3, 2.4] [alvie] [alvie]
25.03.2013 Ricorsione e divide et impera. Mergesort, Quicksort, moltiplicazione di matrici. Relazioni di ricorrenza e teorema fondamentale di risoluzione. [CGGR, par. 3.1, 3.2, 3.4, 3.6] [alvie] [alvie]
04.04.2013 Divide et impera: Coppia di punti più vicina. Esercizio: estendere il limite inferiore dell'ordinamento alla ricerca in un array ordinato. Alberi binari, cardinali e ordinali (con loro rappresentazione binarizzata). Problemi decomponibili su alberi: divide et impera per alberi, con esempi. [CGGR, par. 3.3, 1.4, 3.8]
05.04.2013 Ricerca binaria ricorsiva: scrivere il codice ed estenderlo al caso di array ordinato con chiavi ripetute, per trovare l'occorrenza della chiave più a sinistra e quella più a destra. [CGGR, par. 3.3] [lab] [alvie]
08.04.2013 Soluzione dell'esercizio su nodi cardine. Visite di alberi e loro uso. Alberi binari di ricerca e relazione con ricerca binaria. Operazioni di ricerca, inserimento e cancellazione in un albero binario di ricerca. [CGGR par. 3.8, 4.4.1] [alvie] [alvie] [alvie]
11.04.2013 [CGGR par. ] [alvie]