A.A. 2014/2015
Lezioni 1-2: lunedì 2 marzo 2015
Presentazione del corso
Introduzione
- Concetti di algoritmo, di struttura dati, di efficienza; di costo computazionale; di problem solving e di problema computazionale.
- modello RAM; misura di costo uniforme e logaritmico.
- Pseudocodice
Esercitazioni 1-2: venerdì 6 marzo 2015
Introduzione al Linguaggio C.
Cenni alla struttura di un programma C. Funzione main().
Primo programma in C: Helloworld.
Semplici funzioni: somma e predecessore avendo un esecutore in grado solo di sommare 1.
Lezioni 3-4: lunedì 9 marzo 2015
Notazione asintotica (1)
- Definizione e significato degli insiemi O, Ω e Θ.
- Esempi.
- Algebra della notazione asintotica.
- Valutazione del costo computazionale di un algoritmo.
Esercizi assegnati:
- Dimostrare le regole relative all'algebra della notazione asintotica che non sono state dimostrate a lezione
Lezioni 5-6: mercoledì 11 Marzo 2015
Notazione asintotica (2)
- Esempi di problemi che si possono risolvere in modo più o meno efficiente
- somma dei primi n interi
- valutazione di un polinomio in un punto
Il problema della ricerca
- ricerca sequenziale e suo costo computazionale nel caso migliore, peggiore e medio
- ricerca dicotomica e suo costo computazionale nel caso migiore e peggiore
Esercizi assegnati:
- Calcolare l'andamento asintotico di alcune funzioni
- Calcolare il caso migliore e peggiore del costo computazionale degli algoritmi di Selection Sort, Insertion Sort e Bubble Sort (pseudocodice sulle dispense)
Esercitazioni 3-4: venerdì 13 marzo 2015
Ancora semplici funzioni in linguaggio C: divisione intera.
Cenni all'uso di asserzioni logiche: precondizioni, postcondizioni e invarianti nella progettazione di un programma iterativo.
Funzioni: stato locale e globale. Stack di attivazione delle funzioni.
Passaggio di parametri: passaggi per valore e per indirizzo.
Esempio: funzione scambia.
Cenni alla definizione per induzione di funzioni (somma) e relativa funzione ricorsiva in C.
Lezioni 7-8: lunedì 16 Marzo 2015
Ricorsione
- funzioni matematiche ricorsive;
- algoritmi ricorsivi: aspetti principali;
- calcolo del fattoriale: pseudocodice ricorsivo;
- ricerca sequenziale: pseudocodice ricorsivo;
- ricerca binaria: pseudocodice ricorsivo;
Soluzioni delle equazioni di ricorrenza (1)
- metodo di sostituzione; esempi
- metodo iterativo; esempi
Esercizi assegnati:
- Progettare degli algoritmi ricorsivi ed esprimerli tramite pseudocodice che risolvano i seguenti problemi:
- dato in input un vettore, visualizzare i suoi valori al contrario (dall'ultimo al primo)
- calcolare la somma di n numeri reali inseriti da tastiera (uno per ogni chiamata ricorsiva)
Lezioni 9-10: mercoledì 18 Marzo 2015
Soluzioni delle equazioni di ricorrenza (2)
- metodo dell'albero; esempi
- metodo del teorema principale (senza dimostrazione); esempi
Esercizi svolti in classe:
- Calcolare la soluzione delle seguenti equazioni di ricorrenza col metodo iterativo, tenendo conto che per tutte il caso base è T(1)=&Theta(1):
- T(n)=2T(n/2)+Θ(n)
- T(n)=3T(n/2)+Θ(n)
- T(n)=2T(n/3)+Θ(n)
Esercizi assegnati:
- Calcolare la soluzione delle seguenti equazioni di ricorrenza con quanti più metodi è possibile, tenendo conto che per tutte il caso base è T(1)=&Theta(1):
- T(n)=3T(n/2)+Θ(n)
- T(n)=3T(n/4)+Θ(n)
- T(n)=2T(n/2)+Θ(n^2)
- T(n)=T(n/3)+T(2/3n)+Θ(n)
- T(n)=4T(n/2)+Θ(n)
- T(n)=2T(n/2)+Θ(n^3)
- T(n)=16T(n/4)+Θ(n^2)
- T(n)=T(n-1)+Θ(n)
- T(n)=3T(n/2)+Θ(n log n)
Esercitazioni 5-6: venerdì 20 marzo 2015
Esempio di funzione ricorsiva: calcolo dei numeri di Fibonacci.
Inefficienza della funzione ricorsiva che calcola i numeri di Fibonacci: albero delle chiamate ricorsive.
Programma iterativo che calcola i numeri di Fibonacci.
Programma ricorsivo efficiente. Cenni alla trasformazione sistematica di programmi iterativi in ricorsivi.
Problemi con soluzione inerentemente ricorsiva: il problema della torre di Hanoi.
Esercizi: predecessore con ricorsione, moltiplicazione egiziana.
Lezioni 11-12: lunedì 23 Marzo 2015
Soluzioni delle equazioni di ricorrenza (3)
Esercizio svolto in classe:
- calcolare la soluzione della seguente equazione di ricorrenza con tutti e quattro i metodi, tenendo conto che per tutte il caso base è T(1)=&Theta(1):
Il problema dell'ordinamento (1)
- Algoritmi semplici: insertion sort e selection sort, pseudocodici e complessità nel caso migliore e peggiore.
Lezioni 13-14: mercoledì 25 Marzo 2015
Il problema dell'ordinamento (2)
- Algoritmi semplici: bubble sort, pseudocodice e complessità nel caso migliore e peggiore.
- Teorema sulla limitazione inferiore per la complessità di un algoritmo per confronti.
- Algoritmi efficienti: merge sort, pseudocodice e complessità
Esercizi assegnati:
- Scrivere lo pseudocodice iterativo e ricorsivo, e per entrambe le versioni calcolare il costo computazionale, di algoritmi che risolvono i seguenti problemi:
- dati in input due interi, n e k, calcolare n^k
- calcolare la somma degli elementi di un vettore dato in input
- verificare se un dato vettore di caratteri è palindromo
- trovare il minimo di un vettore dato in input
- Nell'algoritmo dell'insertion sort, la ricerca della posizione in cui inserire l'elemento corrente può essere effettuata tramite una ricerca binaria. Calcolare il costo computazionale dell'algoritmo così modificato.
- Scrivere in pseudocodice una funzione che, dato un vettore A ed un indice j, calcoli il valore minimo nel sottovettore A[j..n]. Riscrivere lo pseudocodice del selection sort che utilizzi ripetutamente questa funzione.
- Dato un vettore di n elementi, verificare se contiene occorrenze ripetute dello stesso elemento (prima versione).
Esercitazioni 7-8: venerdì 27 marzo 2015
Introduzione ai vettori in linguaggio C.
Vettori e puntatori.
Esempio: stampa di un vettore con indici, aritmetica dei puntatori e ricorsiva.
Vettori statici e dinamici. Introduzione all'allocazione dinamica.
Esercizio: calcolo del baricentro di un vettore.
Lezioni 15-16: lunedì 30 Marzo 2015
Il problema dell'ordinamento (3)
- Algoritmi efficienti: quicksort, pseudocodice e complessità nei casi migliore, peggiore e medio (con dimostrazione)
Esercizi assegnati:
- Scrivere la funzione di fusione ricorsiva
- Determinare l'albero delle decisioni della funzione di fusione, quando i vettori da fondere sono a1 a2 e b1 b2 (con l'implicita ipotesi che a1<a2 e b1<b2)
- Risolvere l'equazione di ricorrenza del Merge sort con tutti i metodi studiati
- Dato un vettore di n elementi, verificare se contiene occorrenze ripetute dello stesso elemento (di nuovo: ma questa volta il costo computazionale dovrebbe essere un O(n log n))
- Sia dato un vettore di lunghezza n contenente solo valori 0 e 2. Si progetti un algoritmo con costo computazionale lineare che modifichi il vettore in modo che tutte le occorrenze di 0 si trovino più a sinistra di tutte le occorrenze di 2.
- Si considerino i valori 0 1 2 3 4 5 6 7. Si determini una permutazione di questi valori che generi il caso peggiore per l'algortimo Quick sort.
- Calcolare il costo computazionale del Quick sort nel caso in cui il vettore contenga tutti elementi uguali ed in cui sia già ordinato da destra a sinistra.
Lezioni 17-18: mercoledì 1 Aprile 2015
Il problema dell'ordinamento (4)
- Algoritmi efficienti: heapsort (struttura dati heap, heapify, buildheap, e heapsort: pseudocodice e costo computazionale)
Esercizi assegnati:
- Scrivere lo pseudocodice di Heapsort nel caso in cui, come struttura dati, si usi un heap minimo (cioè tale che A[i]>=A[parent(i)]), che mantiene il minimo nella radice.
- Scrivere lo pseudocodice di una funzione che, dato un heap, ritorni l'elemento con chiave minima. Valutare il costo computazionale.
- Scrivere lo pseudocodice di una funzione che, dato un heap di n elementi al quale e' stata aggiunta nella posizione (n + 1) una nuova foglia con valore arbitrario, ripristini la proprieta' di heap nel nuovo albero di dimensione (n + 1). Valutare il costo computazionale.
2-7 Aprile 2015: Vacanze di Pasqua
Lezioni 19-20: mercoledì 8 Aprile 2015
Il problema dell'ordinamento (5)
- Algoritmi di ordinamento lineari: counting sort, bucket sort (pseudocodice e costo computazionale)
Esercizi svolti in classe:
- Esempio 6.1 delle dispense.
Esercizi assegnati
- Scrivere lo pseudocodice di una funzione che, dato un heap massimo di n elementi, ripristini la proprieta' di heap dopo che il valore di uno e uno solo dei nodi dello heap sia stato arbitrariamente modificato. Valutare il costo computazionale.
Esercitazioni 9-10: venerdì 10 aprile 2015
Esercizi sui Vettori.
Crivello di Eratostene.
Calcolo dei Coefficienti Binomiali.
Uso di vettori per memorizzare i valori già calcolati dalla funzione ricorsiva.
Lezioni 21-22: lunedì 13 Aprile 2015
Strutture dati fondamentali (1)
- insiemi dinamici ed operazioni su di essi
- implementazione di un insieme dinamico su un vettore non ordinato
- implementazione di un insieme dinamico su un vettore ordinato
- la struttura dati lista
- operazioni elementari su liste: scorrimento, ricerca, inserimento in testa, eliminazione
- la struttura dati lista doppiamente puntata
- eliminazione di un elemento dalla lista doppiamente puntata
- la lista circolare
- la struttura dati coda
- le operazioni enqueue e dequeue
Lezioni 23-24: mercoledì 15 Aprile 2015
Svolgimento in classe di esercizi preparatori al primo esonero
Esercitazioni 11-12: venerdì 17 aprile 2015
Esercizi in preparazione all'esonero.
Correzione esonero 2014: scomposizione in fattori primi.
Correzione esonero 2013: verificare se un array è contenuto in un altro.
20-24 Aprile 2015: Settimana di interruzione della didattica e Primo esonero
Esercitazioni 13-14: lunedì 27 aprile 2015
Introduzione alle matrici.
Programmazione top-down: gioco del forza4.
Lezioni 25-26: mercoledì 29 Aprile 2015
Strutture dati fondamentali (2)
- la struttura dati coda con priorità
- le operazioni enqueue e dequeue
- la struttura dati pila
- le operazioni push e pop
- funzionamento della pila di sistema (system stack) per la gestione delle chiamate di funzione
Esercizi svolti in classe:
- Simulare il comportamento di una coda mediante l'uso di più pile
- Discussione sull'esercizio n. 3 del primo esonero
Lezioni 27-28: lunedì 4 Maggio 2015
Strutture dati fondamentali (3)
- alberi (1)
- definizione tramite la nozione di grafo
- caratterizzazione degli alberi
- alberi binari completi: relazione tra altezza e numero di nodi
- memorizzazione degli alberi:
- tramite record e puntatori
- posizionale
- tramite vettore dei padri
Esercizi assegnati:
- dato un albero tramite vettore dei padri, restituirlo in output tramite notazione posizionale. Calcolare il costo computazionale
- dato un albero tramite notazione posizionale, restituirlo in output tramite vettore dei padri. Calcolare il costo computazionale
Lezioni 29-30: mercoledì 6 Maggio 2015
Strutture dati fondamentali (4)
- alberi (2)
- visite di alberi: in-ordine, pre-ordine e post-ordine
- pseudocodice ricorsivo
- costo computazionale tramite equazione di ricorrenza
Esercizi svolti in classe:
- Calcolare il numero di nodi di un albero binario
- Verificare se una data chiave k è presente in un albero binario
- Calcolare l'altezza di un albero binario
- Contare i nodi di un albero binario che si trovano a livello k (il livello della radice è zero)
- Realizzare una visita in pre-ordine senza ricorsione, mediante l'uso di una pila
- Realizzare una visita per livelli mediante l'uso di una coda
Esercitazioni 15-16: venerdì 8 maggio 2015
Ancora sulle matrici: allocazione statica e dinamica delle matrici.
Rappresentazione in memoria di una matrice.
Esercizi: verifica che una matrice di interi è un quadrato magico.
Lezioni 31-32: lunedì 11 maggio 2015
Dizionari (1)
- definizione di dizionario e problematiche associate
- tabelle ad indirizzamento diretto
- tabelle hash
- il problema delle collisioni
- soluzione al problema delle collisioni tramite liste di trabocco
- soluzione al problema delle collisioni tramite indirizzamento aperto
- scansione lineare
- scansione quadratica
- hashing doppio
Lezioni 33-34: mercoledì 13 maggio 2015
Dizionari (2)
- alberi binari di ricerca
- definizione
- algoritmo di ricerca e sua complessita'
- algoritmi di ricerca del massimo, minimo, successore e predecessore e loro complessita'
- algoritmo di inserimento e sua complessita'
- algoritmo di cancellazione e sua complessita'
Esercitazioni 17-18: venerdì 15 maggio 2015
Strutture.
Liste o sequenze: definizione induttiva.
Rappresentazione in C di liste.
Primi programmi sulle liste: inserimento in testa, in coda.
Funzione reverse e reverse efficiente ricorsiva.
Funzione append.
Versioni che creano nuove liste e funzioni che modificano la lista di input.
Lezioni 35-36: lunedì 18 maggio 2015
Dizionari (3)
- alberi Red-Black
- definizione
- dimostrazione dell'altezza logaritmica
- cenni ai meccanismi di ribilanciamento: cambi di colore e rotazioni
Grafi (1)
- definizione di grafo, grafo diretto, grafo pesato
- definizine di passeggiata, cammino, cammino semplice
- definizine di circuito e ciclo
- relazione di raggiungibilità e sue caratteristiche
- definizione di componente connessa
- definizione di sottografo, sottografo indotto, sottografo ricoprente
Lezioni 37-38: mercoledì 20 maggio 2015
Grafi (2)
- rappresentazioni in memoria
- liste di adiacenza
- matrice di adiacenza
- matrice di incidenza
- lista di archi
- confronto della complessita' spaziale e temporale per alcune operazioni elementari
- aspetti generali delle visite
- differenza concettuale fra visita in ampiezza e visita in profondità
- implementazioni possibili: iterativa (tramite coda o pila) e ricorsiva (solo per visita in profondità)
- definizione di albero di visita
- archi dell'albero e archi non dell'albero
- visita in ampiezza (BFS)
- pseudocodice della visita in ampiezza
- esempio di funzionamento della visita in ampiezza
Esercizi assegnati:
- Per ciascuno dei modi visti a lezione per memorizzare un grafo, scrivere le funzioni necessarie a crearne uno identico memorizzato in tutti gli altri modi
- Modificare la visita in ampiezza in modo da calcolare e memorizzare, per ciascun nodo, la distanza dalla sorgente
- Modificare la visita in ampiezza in modo da verificare se il grafo contiene cicli oppure no
- Modificare la visita in ampiezza in modo da verificare se il grafo è connesso oppure no
Esercitazioni 19-20: venerdì 22 maggio 2015
Specifica di funzioni su liste tramite equazioni ricorsive.
Liste ordinate. Funzione merge su liste. Versione in-place e versione che genera una nuova lista.
Funzione reverse in-place.
Lezioni 39-40: lunedì 25 maggio 2015
Grafi (3)
- visita in ampiezza (BFS)
- costo computazionale della visita in ampiezza
- proprietà degli archi non dell'albero
- proprieta' della distanza dalla radice
- visita in profondità (DFS)
- pseudocodice della visita in profondità
- costo computazionale della visita in profondità
- proprietà degli archi non dell'albero
- relazione fra lunghezza dei cammini e numero di archi del grafo
- Algoritmo di Dijkstra (1)
- la rete Internet è modellata come un grafo pesato sul quale individuare i cammini di costo minimo
- cenni sul funzionamento store-and-forward dei router
- fenomeni che possono modificare i cammini minimi: caduta di linee o di router, congestione
Lezioni 41-42: mercoledì 27 maggio 2015
Grafi (4)
- Algoritmo di Dijkstra
- pseudocodice dell'algoritmo
- esempio dettagliato di funzionamento su un grafo pesato
- costo computazionale dell'algoritmo in funzione dell'implementazione della coda con priorità
- dimostrazione per induzione della correttezza dell'algoritmo
Esercitazioni 21-22: venerdì 29 maggio 2015
Definizione induttiva di alberi.
Rappresentazione in C di alberi binari.
Specifica di funzioni su alberi tramite equazioni ricorsive.
Prime funzioni su alberi: costruttori, distruttori, conteggio dei nodi, altezza.
Il problema del bilanciamento: versione naif e versione efficiente con un'unica scansione dell'albero.
Lezioni 43-44: mercoledì 3 giugno 2015
Esercizi svolti in classe:
- Dato un albero binario, trovare il nodo che presenta la massima differenza fra i numeri di nodi del proprio sottoalbero sinistro e del proprio sottoalbero destro. Se vi sono più nodi con la massima differenza, restituirne uno fra quelli più vicini alla radice
- Dato un vettore di n elementi considerato come un albero binario gestito mediante la notazione posizionale, riempirlo con i primi n valori dell'albero di Kalkin-Wilf (contati nell'albero per livelli e, in ciascun livello, da sinistra a destra)
- Dati due alberi binari di ricerca, fonderli in un unico albero binario di ricerca
- Dato un vettore contenente interi positivi e negativi, scrivere una funzione che sistemi tutti i valori negativi a sinistra di tutti i valori positivi
Esercitazioni 23-24: venerdì 5 giugno 2015
Esercitazione in vista dell'esame.
Compiti precedenti: somma successivi e somma precedenti in una lista.
Trucchi: usare i parametri per memorizzare valori in corso di computazione: stampa indentata di un albero.
Altri esercizi sugli alberi: relazione di uguaglianza e di sottoalbero.
--
GiancarloBongiovanni - 05 Apr 2016
This topic: Infogen
> WebHome >
DiarioDelleLezioni >
LezioniDegliAnniAccademiciPrecedenti > AnnoAccademico2014-2015
Topic revision: r3 - 2018-02-17 - GiancarloBongiovanni