Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/wikka.php on line 315 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/libs/Wakka.class.php on line 176 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/libs/Wakka.class.php on line 463 Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/demetres/public_html/didattica/ae/wikka.php on line 120 Deprecated: Function ereg() is deprecated in /home/demetres/public_html/didattica/ae/libs/Wakka.class.php on line 648 Ingegneria degli Algoritmi: Diario delle lezioni 2008-2009

Ingegneria degli Algoritmi

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2014-2015

HomePage | Avvisi | Diario lezioni | Programma | Materiale didattico | Esami | Forum | Login
Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/safehtml.php on line 308 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 159 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 161 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 162 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 163 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 165 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 166 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 167 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 243 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 250 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 259 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 266 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 273 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 280 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 467 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 469 Deprecated: Assigning the return value of new by reference is deprecated in /home/demetres/public_html/didattica/ae/3rdparty/core/safehtml/classes/HTMLSax.php on line 471

Diario delle lezioni 2008-2009


Settimana 1

Mercoledi 24 Settembre
Inquadramento del corso. Il linguaggio C. Fasi della compilazione di un programma C: preprocessore, compilatore, linker. Librerie e direttiva #include. Spazio logico degli indirizzi e layout di memoria di un programma C: segmento codice, dati, stack e heap. Byte come unità fondamentale di memoria indirizzabile. Nozione di oggetto C come regione di memoria il cui contenuto può rappresentare valori. Tipi come interpretazione del contenuto di oggetti. Tipi primitivi: void, char, short, int, long, long long, float, double, long double. Tipi interi con e senza segno. Richiamo su rappresentazioni little endian e big endian. Operatore sizeof per determinare la dimensione in byte di oggetti di un certo tipo. Tipi derivati: funzioni, struct, union, puntatori, array (panoramica introduttiva) [T1].

Introduzione alle funzioni di output: fprintf e printf. Stringhe di formato e specificatori %d, %u, %f, %s. Specificatori di dimensione campo, allineamento e precisione. Esempio di interpretazione di un oggetto di tipo int da parte della funzione printf come intero con segno (%d) o senza segno (%u). Introduzione alle macro C: sostituzione dei parametri e tranelli nella definizione e uso di macro [T1].

Giovedi 25 Settembre
Nozione di valore come interpretazione del contenuto di un oggetto. Espressioni in C: espressioni LValue per denotare oggetti ed espressioni RValue per denotare valori. Conversione di LValue a RValue. Assegnazioni di oggetti mediante l'operatore =. Puntatori come tipi derivati. Generazione di valori di tipo puntatore mediante cast di valori interi e modifica di un oggetto ad un indirizzo arbitrario in memoria. Rischi dell'accesso diretto alla memoria. Operatori * ("all'indirizzo") e & ("indirizzo di"). Funzioni con parametri formali di tipo puntatore: esempio di funzione che raddoppia il contenuto di un oggetto [T1].

Settimana 2

Mercoledi 1 Ottobre
Allocazione e dellocazione dinamica di blocchi: funzioni di libreria malloc e free. Partizionamento dello spazio heap e frammentazione esterna. Aritmetica dei puntatori: operazione somma. Uso di v[i] come espressione equivalente a *(v+i). Esempio: verifica dei duplicati in un array in Java e in C. Puntatori generici void* e conversioni fra puntatori. Creazione e distruzione di matrici allocate dinamicamente. Stringhe C e letterali stringa [T1].

Giovedi 2 Ottobre
Aritmetica dei puntatori: differenza tra puntatori. Array allocati staticamente in C. Allocazione nel segmento dati come variabile globale e allocazione in stack come variabile locale. Rischi di stack overflow usando variabili locali di tipo array in contesti ricorsivi. Nome di variabile array come LValue non modificabile (eccezione alla regola per cui i nomi di variabili sono LValue modificabili). Conversione automatica di una variabile array a un RValue di tipo puntatore. Equivalenza dei parametri formali di tipo array a parametri formati di tipo puntatore. Matrici allocate staticamente e differenza di rappresentazione rispetto alle matrici allocate dinamicamente.

Settimana 3

Mercoledi 8 Ottobre
Tipi base e tipi derivati. Tipi funzione. Espressioni che denotano tipi in C: regole sintattiche e restrizioni semantiche [P2]. Puntatori a funzione ed esempi di uso. Polimorfismo sulle operazioni in C mediante puntatori a funzione e analogie con il polimorfismo in Java. Parola chiave typedef e alias di tipi. Esempi al calcolatore: ispezionare gli indirizzi dei record attivazione di funzioni ricorsive (esempio funzione che calcola il fattoriale di un numero); pericoli nell'usare puntatori direttamente a record di attivazione.

Giovedi 9 Ottobre
Lezione annullata.

Settimana 4

Mercoledi 15 Ottobre
Strutture in C: dichiarazione e accesso agli attributi mediante l'operatore punto. Tag delle strutture come spazio di nomi separato dallo spazio dei nomi di variabili, tipi e funzioni. Uso di typedef per creare alias di tipi struct. Copia byte a byte nelle assegnazioni di struct. Array come attributi di struct e loro passaggio come parametri a funzioni. Allocazione dinamica di oggetti struct e operatore -> per accedere ai loro attributi. Rappresentazione di tipi di dato complessi in C mediante struct: costruttore, distruttore, operazioni sugli oggetti. Memory leak dovuti a mancata deallocazione di oggetti. Esempio del tipo di dato Persona in Java e in C. Allineamento e padding nelle struct: layout di memoria e aspetti architetturali. Programmi C suddivisi su più file e uso di header file. Inclusioni di header di sistema con #include <...> e inclusioni di header utente con #include "...". Compilazione separata di moduli C e linking: errori di simboli non definiti ed errori di simboli duplicati. Problema dell'inclusione multipla di header e soluzione basata su direttive di preprocessore #ifndef ... #define ... #endif.

Giovedi 16 Ottobre
Aspetti di ingegnerizzazione nella rappresentazione di strutture dati elementari. Limiti dei modelli di costo teorici. Influenza delle cache nelle prestazioni dei programmi e importanza della località nel pattern di accesso alla memoria. Esempio della scansione per righe e per colonne di una matrice. Esempio della ricerca di un elemento in una collezione: confronto prestazionale scansione lineare array e struttura collegata.

Settimana 5

Mercoledi 22 Ottobre
Richiami sui tipi di dato astratti e sulle strutture dati come loro realizzazione. Vantaggi e svantaggi nell'uso di array e strutture collegate per implementare strutture dati. Tipo di dato astratto array dinamico: dominio, costruttore, operazioni set, get, expand e shrink. Realizzazione del tipo di dato array dinamico mediante array in C. Operazioni expand e shrink mediante la tecnica del raddoppiamento/dimezzamento e analisi sperimentale delle prestazioni di una sequenza di expand (tempo medio per operazione). Limiti del modello di costo asintotico tradizionale per stimare il costo di una sequenza di operazioni e modello di costo ammortizzato. Metodo dei crediti. Esempio di analisi ammortizzata dell'operazione expand dell'array dinamico [T2].

Giovedi 23 Ottobre
Analisi sperimentale delle prestazioni di una sequenza di expand in funzione del tasso di crescita dell'array e misura del tempo di esecuzione per operazione nel caso peggiore [D3]. Array dinamico per applicazioni real-time con tutte le operazioni O(1) nel caso peggiore [Appunti].

Settimana 6

Mercoledi 29 Ottobre
Risoluzione esercizio: analisi ammortizzata del costo di incremento di un contatore binario. Il tipo di dato Dizionario: operazioni insert, delete e search [T2]. Realizzazione in C con chiavi ed elementi generici mediante array non ordinato e mediante array ordinato. Uso della funzione standard C di ricerca binaria bsearch. Uso di puntatori a funzione per definire comparatori. Costi asintotici per operazione [Appunti].

Giovedi 30 Ottobre
Aspetti di ingegnerizzazione nella realizzazione di strutture dati. Riferimenti diretti agli elementi interni di una struttura dati per l'aggiornamento e la cancellazione di elementi. Esempio del dizionario realizzato mediante array. Aspetti di robustezza: verifica che un riferimento interno non sia usato su una struttura dati diversa da quella per cui è stato creato [Appunti].

Settimana 7

Mercoledi 5 Novembre
Tabelle ad accesso diretto e tabelle hash: richiami su funzioni hash perfette e proprietà di uniformità. Paradosso del compleanno: calcolo della probabilità di conflitto in una tabella hash utilizzando funzioni hash uniformi [T2]. Esempi.

Giovedi 6 Novembre
Realizzazione in C di un dizionario basato su liste di collisione con chiavi ed elementi generici: costruttore, operazioni insert e search. Esempio di funzione hash generica e definizione di una funzione hash per chiavi di tipo double. File C: header Hash.h, modulo Hash.c, programma di prova main.c.

Settimana 8

Mercoledi 12 Novembre
Tipo di dato coda con priorità: operazioni insert, remove, findMin, removeMin, decreaseKey, increaseKey, merge. Struttura dati d-Heap e sue proprietà (ordinamento a heap, altezza, minimo nella radice). Realizzazione di una coda con priorità mediante d-Heap. Alberi binomiali: definizione e proprietà (altezza, numero nodi, grado della radice). Heap binomiali e loro proprietà (collezione di alberi binomiali, unicità, ordinamento a heap). Realizzazione di una coda con priorità mediate struttura dati heap binomiale: operazioni decreaseKey, increaseKey, insert. Operazione ristruttura per ristabilire il vincolo di unicità [T2].

Giovedi 13 Novembre
Operazione removeMin. Realizzazione in C di una coda con priorità basata su heap binomiale: rappresentazione struttura dati e implementazione operazioni insert e findMin. File C: header HeapB.h, modulo HeapB.c, programma di prova main.c.

Settimana 9

Mercoledi 19 Novembre
Liste XOR [P5]. Liste unrolled [P6] e analisi dello spazio richiesto: operazioni di fusione e divisione di nodi. Heap binomiali rilassati e analisi ammortizzata del costo delle operazioni. Heap di Fibonacci: operazione decreaseKey e operazione staccaInCascata [T2]. Esempio di applicazione degli heap di Fibonacci nell'algoritmo di Dijkstra per il calcolo dei cammini minimi.

Giovedi 20 Novembre
Analisi ammortizzata dell'operazione decreaseKey degli heap di Fibonacci. Esponenzialità del numero di nodi degli alberi di un heap di Fibonacci rispetto al loro grado: formula chiusa per i numeri di Fibonacci, sezione aurea come base di una funzione esponenziale che descrive il minimo numero di nodi di un albero di un heap di Fibonacci [T2].

Settimana 10

Mercoledi 26 Novembre
Modello di macchina con sistema di memoria gerarchica a due livelli (RAM e disco) [T2]. Costo di un programma come numero di trasferimenti di blocchi effettuati fra i due livelli (I/O). Primitive di scansione lineare (SCAN) e ordinamento (SORT). Analisi del numero di I/O dell'algoritmo MergeSort classico e algoritmo MergeSort a k vie (k-way MergeSort) [D4]. Lower bound sul numero di I/O per il problema dell'ordinamento (prima parte) [D4, D5].

Giovedi 27 Novembre
Lower bound sul numero di I/O per il problema dell'ordinamento (passaggi finali della dimostrazione). Versione iterativa del k-way MergeSort [D4]. Aspetti implementativi nella realizzazione dell'operazione di fusione a più vie di sottosequenze ordinate in memoria esterna. Valutazione sperimentale dei tempi di accesso sequenziale [D6] e casuale a file di grandi dimensioni [D7].

Settimana 11

Mercoledi 3 Dicembre
Implementazione in C della versione iterativa del k-way MergeSort [D4]: strutture dati e funzioni [LFileSort.h, LFileSort.c, main.c].

Giovedi 4 Dicembre
Profiling di programmi in ambiente Linux/UNIX: uso del tool gprof [P7]. Esempio: profiling dell'implementazione LFileSort.h/LFileSort.c/main.c del k-way MergeSort. Code con priorità in memoria esterna: Sequence Heaps: operazioni insert e deleteMin [A1]. Analisi ammortizzata del numero di I/O in caso di sole insert, cammino canonico [Appunti].

Settimana 12

Mercoledi 10 Dicembre
Sequence Heaps: analisi ammortizzata del numero di I/O in caso di operazioni miste insert/deleteMin, analisi impatto retrocessione elementi durante le insert [Appunti]. Allocatori come strutture dati per la gestione dinamica della memoria. Operazioni malloc e free. Heap e suo partizionamento in blocchi liberi, blocchi in uso e informazioni di controllo. Primitive brk() e sbrk() per il ridimensionamento dell'heap. Design goal, strategie, politiche, meccanismi. Meccanismi di basso livello: header e boundary tag [A2].

Giovedi 11 Dicembre
Meccanismi di basso livello: link integrati nei blocchi. Panoramica sui meccanismi di allocazione: sequential fits (best fit, first fit, next fit, worst fit) e segregated free lists (simple segregated storage e segregated fits) [A2].

Settimana 13

Mercoledi 17 Dicembre
Buddy system binari [T4, Volume 1, Paragrafo 2.5]. Cenni a buddy system di Fibonacci, pesati, e doppi. Cenni a indexed fits e bitmapped fits [A2]. Introduzione al package malloclab.

Giovedi 18 Dicembre
Riepilogo degli argomenti del corso e collegamenti tra i diversi argomenti trattati. Modalità di esame. Strutturazione delle relazioni di documentazione delle tesine.


Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by Wikka Wakka Wiki 1.1.6.3
Page was generated in 0.0577 seconds