Dati e Algorithmi 1 (9 CFU - 72 ore)
Ing. dell'INFORMAZIONE
A.A. 2019/2020

DIARIO delle LEZIONI
Diario delle lezioni A.A. 18/19

Nozioni di base

  • 8 ottobre. Obiettivi formativi e organizzazione del corso. Concetti fondamentali: problema computazionale, algoritmo, modello RAM.
  • 9 ottobre. Concetti fondamentali: taglia dell'istanza, struttura dati, pseudocodice. Esercizio: formalizzazione del problema del massimo segmento di 1 in una stringa binaria. Analisi di Algoritmi: complessità e correttezza; definizione della funzione complessità.
  • 10 ottobre. Analisi di complessità: Ordini di grandezza O-grande, Omega-grande, Theta-grande, o-piccolo; proprietà degli ordini di grandezza; strumenti matematici (parte bassa e alta, modulo, sommatorie notevoli); procedimento per provare limiti superiori e inferiori alla complessità
  • 15 ottobre. Analisi di complessità: esempi (PrefixAverages quadratico e lineare); esercizio simile a R-4.29 del testo; complessità polinomiale vs complessità esponenziale (esempio: RSA); caveat relativi all'analisi asintotica al caso pessimo.
  • 16 ottobre. Tecniche di dimostrazione: esempio, controesempio, per assurdo. Induzione: tecnica genrale, esempi (serie di Gauss, e n-esimo numero di Fibonacci F(n), induzione fallace per provare che F(n)=0). Analisi di correttezza: approccio generale; definizione di invariante; utilizzo di un invariante per provare la correttezza di un ciclo; esempi (arrayMax e arrayFind).
  • 17 ottobre. Esercizio: invariante per l'algoritmo che determina il più lungo segmento di 1 consecutivi in una sequenza binaria. Algoritmi ricorsivi: definizione; esempi (LinearSum e ReverseArray); albero della ricorsione; analisi di complessità tramite l'albero della ricorsione; analisi di correttezza; esempi.
  • 22 ottobre. Algoritmi ricorsivi: analisi di correttezza; RecurFib; PowerFib. Esercizi: complessità di InsertionSort; algoritmo ricorsivo per la ricerca binaria; algoritmo per la ricerca di una colonna di 0 in una matrice di interi (algoritmo, complessità e invariante).

Materiale di riferimento:

  1. Lucidi (finali con errata): Nozioni di Base
  2. Esercizi svolti sulle nozioni di base
  3. Testo [GTG14]: Paragrafi 1.8.2, 2.1.2, e Capitoli 4 e 5.
    Esercizi consigliati dal libro di testo: R-4.2; R-4.7; R-4.10; R-4.12; R-4.14; R-4.16; R-4.21; R-4.31; R-5.6; C-4.35; C-4.43; C-4.45; C-4.46; C-5.10; C-5.18; C-5.20.

Text Processing

  • 23 ottobre. Definizione del Pattern Matching come problema computazionale. Notazioni. Algoritmo findBrute: pseudocodice, esempi e analisi. Esercizi: C-12.14 del testo; modifica di findBrute quando il primo carattere del pattern è diverso dagli altri. Algoritmo findKMP: idee principali; definizione di failure function.
  • 24 ottobre. Algoritmo findKMP: pseudocodice; complessità ; esempi; correttezza. Algoritmo computeFailKMP: idee principali; pseudocodice.
  • 29 ottobre. Algoritmo computeFailKMP: correttezza. Esercizi: ricerca del più lungo prefisso di un pattern in un testo; ricerca di tutte le occorrenze di un pattern in un testo; ricerca di una sottostringa circolare in un testo.
Materiale di riferimento:
  1. Lucidi (finali con errata): Text Processing
  2. Esercizi svolti sul text processing
  3. Testo [GTG14]: Ch. 12 (Par. 12.1, 12.2.1, 12.2.3).
    Esercizi consigliati dal libro di testo: R-12.1; C-12.14; C-12.15; C-12.17; C-12.19; C-12.22; C-12.30

Ripasso di Java

  • 30 ottobre: Java: programma stand-alone; information hiding; Abstract Data Type (ADT); interfacce; programmazione generica. ADT elementari: Lista (index-based e position-based); Pila; Coda; Java Collection Framework. Esempio: implementazione di InsertionSort con List e ArrayList di Java.
Materiale di riferimento:
  1. Lucidi (finali con errata): Ripasso Java
  2. Codice: Esempi di codice Java (cartella zippata)

Alberi

  • 31 ottobre: Alberi: applicazioni; definizioni; terminologia; metodi dell'interfaccia Tree; dimostrazione Proposizione 8.3 del testo (esercizio R-8.2); Calcolo della profondità di un nodo (algoritmi ricorsivo e iterativo); calcolo dell'altezza di un nodo e di un albero.
  • 5 novembre: Alberi: visite in preorder e postorder (pseudocodici, analisi ed esempi). Algoritmi AllDepths e DiskSum. Esercizi: esercizio simile a R-8.19, e C-8.50.
  • 6 novembre: Alberi: fine esercizio C-8.50 e esercizio C-8.27. Alberi binari: definizione; interfaccia. Alberi binari propri: definizione; proprietà (Proposition 8.7 del testo, limitata alla parte sugli alberi binari propri, Proposition 8.8, e Esercizi R-8.7 e R-8.8); visita inorder; Parse Tree di un'espressione.
  • 7 novembre: Algoritmo evaluateExpression; algoritmo di ricostruzione della espressione a partire dal Parse Tree di una espressione. Esercizi sugli alberi binari: calcolo della heightsum; conteggio dei nodi strong; algoritmo preorderNext; dimostrazione che in un albero con n nodi e m foglie in cui ogni nodo interno ha almeno 2 figli vale che m >= n-m+1.
Materiale di riferimento:
  1. Lucidi (finali con errata): Alberi Generali
  2. Lucidi (finali con errata): Alberi Binari
  3. Esercizi svolti sugli alberi (update: 06/12/2019)
  4. Testo [GTG14]: Ch. 8 (Par. 8.1, 8.2, 8.3.1, 8.4.1, 8.4.3-8.4.5).
    Esercizi consigliati dal libro di testo: R-8.3; R-8.4: R-8.6; R-8.19; C-8.24; C-8.25; C-8.27; C-8.39; C-8.41; C-8.50; C-8.52.

Priority Queue

  • 12 novembre: Priority Queue: definizione; Interfacce Entry(K,V) e PriorityQueue(K,V); applicazioni reali; implementazione tramite liste (ordinate e non). Albero binario completo: definizione e relazione tra altezza e numero di nodi. Heap: definizione; proprietà realizzazione tramite array (level numbering).
  • 13 novembre: Heap: proprietà del level numbering. Implementazione dei metodi della Priority Queue tramite heap su array: pseudocodice e analisi. Esercizio: rimozione di una entry generica da uno heap P.
  • 14 novembre: Ripasso per il compitino: Esempio di Compitino 1 (Prima Parte 1 e 2, Seconda Parte 2); Esempio di Compitino 2 (Prima Parte 3, Seconda Parte 2); Esempio di Compitino 3 (Seconda Parte 1 e 2).
  • 18 novembre: I Compitino.
  • 26 novembre: Correzione del Compitino. Esercizi: rimozione di una entry generica da uno heap P; selezione delle Top-tau entry da una sequenza.
  • 27 novembre: Esercizi: stampa delle entry con chiave <=k di uno heap in tempo lineare nel numero di entry stampate. Costruzione di uno heap a partire da un vettore P di n entry: approccio top-down (idea, pseudocodice e complessità); approccio bottom-up (idea, pseudocodice e complessità); confronto tra approccio top-down e approccio bottom-up. Visione compitini.
  • 28 novembre: PriorityQueueSort: SelectionSort, InsertionSort, HeapSort come casi particolari. Defimnizione di algoritmo in-place. Implementazione in-place di HeapSort. Caso di studio: simulazione discreta a eventi (ufficio pubblico).
  • 3 dicembre: Esercizio sulla identificaizone della m-esima chiave più piccola.
Materiale di riferimento:
  1. Lucidi (finali con errata): Priority Queue
  2. Esercizi svolti su Priority Queue e Heap
  3. Testo [GTG14]: Ch. 9 (Par. 9.1-9.4).
    Esercizi consigliati dal libro di testo: R-9.1; R-9.9: R-9.10; R-9.12; R-9.13; R-9.15; R-9.16; R-9.17; R-9.18; R-9.19; R-9.23; C-9.30; C-9.32; C-9.34; C-9.36; C-9.37; C-9.38; C-9.39.

Mappa

  • 3 dicembre: Mappa: definizione e applicazioni; interfaccia Map; implementazione tramite lista position-based o array di taglia |U|, con la complessità dei metodi get, put e remove. Esempio: word count. Tabelle Hash: ingredienti principali; nozione di uniform hashing.
  • 4 dicembre: Tabelle Hash: scelta dell'hash code; scelta della compression function; risoluzione collisioni tramite separate chaining; implementazione dei metodi della mappa (get(k), put(k,x) e remove(k)) e loro complessità al caso pessimo e al caso medio in funzione del load factor; rehashing.
  • 5 dicembre: Alberi Binari di Ricerca (ABR): motivazione; definizione; proprietà della vista in-order; metodo TreeSearch(k,v); implementazione dei metodi della mappa (get(k), put(k,x) e remove(k)) e loro analisi.
  • 10 dicembre: Riepilogo implementazione dei metodi della mappa con un Albero Binario di Ricerca. Esercizi: versione iterativa di TreeSearch; conteggio del numero di entry con chiave <=k, con e senza variabile size.
  • 11 dicembre: Multi-Way Search Tree: definizione ed esempi; Proposizione 11.2 (ed esercizio C-11.46) del testo; metodo MWTreeSearch(k,v). (2,4)-Tree: definizione; altezza (Proposizione 11.3 del testo); metodi get(k) e put(k,x) (con Split(u))
  • 12 dicembre: (2,4)-Tree: esempi di put; metodo remove(k) (con Delete(e,u,alfa)); esempi di remove. MultiMappa: differenze tra MultiMappa e Mappa; specifica dei metodi get(k), put(k,x) e remove(k,v); implementazione tramite Mappa+Liste.
  • 17 dicembre: Esercizi nei lucidi: 57 (primo esercizio), 100, 101, 104 (cenni), 105, 107 (secondo esercizio).
Materiale di riferimento:
  1. Lucidi (finali con errata): Mappa
  2. Esercizi svolti sulle Mappe (update: 16/01/2020)
  3. Testo [GTG14]: Ch. 10 (Par. 1, 2 (tranne open addressing), 5.3), Ch 11 (Par. 11.1, 11.4)
    Esercizi consigliati dal libro di testo: R-10.4; R-10.5; C-10.42, R-11.1; R-11.2; R-11.5; R-11.13; R-11.15; R-11.17; R-11.18a; R-11.20a; R-11.20d; C-11.31; C-11.44; C-11.46.

Grafi

  • 17 dicembre: Definizione di grafo; terminologia; esempi applicativi.
  • 18 dicembre: Concetti fondamentali (cammino, ciclo, grafo connesso, subgraph, spanning subgraph, alberi (radicati, liberi e loro equivalenza), spanning tree/forest); proprietà dei grafi (Proposizioni 14.8, 14.10, 14.11 ed esercizio C-14.34 del testo); rappresentazione di grafi (strutture di base L_E e L_V, liste di adiacenza, matrice di adiacenza); nozione di visita.
  • 19 dicembre: Algoritmo DFS: pseudocodice; esempio; analisi; visita di tutto il grafo; applicazioni (connettività, spanning tree, s-t reachability, ciclicità).
  • 7 gennaio: Esercizio: aggiunta di K-1 archi per rendere connesso un grafo con K componenti connesse. Algoritmo BFS (pseudocodice e analisi); Proposizione 14.16 del testo; complessità di BFS; applicazioni (cammino minimo).
  • 8 gennaio: Applicazioni della BFS: calcolo di un ciclo. Esercizi: numero di coppie di vertici connesse da cammini; esistenza di un vertice da cui sono raggiungibili almeno n/2 altri vertici, determinazione se un grafo è bipartito, massima separazione tra due vertici (ad es. profili nel grafo di Facebook). Esempi di domande teoriche.
Materiale di riferimento:
  1. Lucidi (finali con errata): Grafi
  2. Esercizi svolti sui Grafi
  3. Testo [GTG14]: Ch. 14 (Par. 1, 2, 3)
    Esercizi consigliati dal libro di testo: R-14.1; R-14.2; R-14.14; C-14.34; C-14.37; C-14.46; C-14.47; C-14.49; C-14.52; C-14.56

Ordinamento

  • 9 gennaio: Introduzione al problema dell'ordinamento. Definizione di algoritmo basato su confronti. MergeSort (algoritmo, analisi di Merge, analisi di MergeSort tramite l'albero della ricorsione). QuickSort: strategia generale; pseudocodice in-place (QuickSortInPlace); correttezza di Partition.
  • 13 gennaio: QuickSortInPlace: analisi di complessità tramite albero della ricorsione. Algoritmi probabilistici (randomized): distinzione tra la nozione di algoritmo probabilistico e quella di algoritmo deterministico; numero di operazioni eseguite su una data istanza visto come variabile aleatoria. Randomized QuickSort: differenze rispetto a QuickSortInPlace; complessità probabilistica (alta probabilità e media). InsertionSort: algoritmo in place; analisi in funzione della taglia dell'input.
  • 15 gennaio: InsertionSort: algoritmo in place; analisi in funzione della taglia dell'input e del numero di inversioni. Lower bound sulla complessità di un algoritmo quasliasi algoritmo di ordinamento basato su confronti (senza prova). Esercizi: merge di K sequenze ordinate; conteggio dei duplicati in due sequenze ordinate (elementi distinti in ciascuna). BucketSort: algortimo e analisi di complessità. Nozione di ordinamento stabile.
  • 16 gennaio: RadixSort: algoritmo; analisi di complessità ; analisi di correttezza. Esempio di applicazione di RadixSort: ordinamento di n chiavi in [0,n^2-1] e generalizzazione all'ordinamento di n chiavi in [0,M-1]. Caso di studio: ordinamento dei cittadini italiani per codice fiscale. Esercizi: conteggio delle chiavi frequenti (Esempio di II Compitino (3)); sorting separato di k sequenze di entry con chiavi in [0,N-1]; conteggio delle inversioni in una sequenza (adattamento di MergeSort).
Materiale di riferimento:
  1. Lucidi (finali con errata): Ordinamento
  2. Esercizi svolti sull'Ordinamento
  3. Testo [GTG14]: Par. 9.4.1 e Ch. 13 (Par. 1, 2, 3) Esercizi consigliati dal libro di testo: R-13.1; R-13.2; R-13.3; R-13.6; R-13.8; R-13.9; C-13.29; C-13.32; C-13.33; C-13.34; C-13.35; C-13.36; C-13.37; C-13.38; C-13.39; C-13.40; C-13.42; C-13.43; C-13.45; C-13.46; C-13.48;

Ultimo aggiornamento: 17 gennaio 2020 Vai alla pagina iniziale