Contenuti del corso
Questo corso si compone di due parti che saranno portate avanti parallelamanete.
La prima, di circa 60 ore, si occuperà della descrizione e progettazione di algoritmi efficienti; la seconda, di circa 30 ore, si occuperà di programmazione.
Descrizione e progettazione di algoritmi efficienti
Introduzione
Concetti di algoritmo, di struttura dati, di efficienza; di complessita' computazionale;
modello RAM; misura di costo uniforme e logaritmico.
Notazione asintotica
Definizione e significato degli insiemi O, Ω e Θ
Il problema della ricerca
Ricerca sequenziale in un vettore disordinato;
complessita' nel caso migliore, peggiore e medio
Ricerca dicotomica o binaria in un vettore ordinato (vers. iterativa)
complessita' nel caso migliore, peggiore e medio
Introduzione alla ricorsione
funzioni ricorsive
versione iterativa e ricorsiva di algoritmi: esempi
occupazione in memoria: l'esempio del calcolo dei numeri di Fibonacci
calcolo della complessita' delle funzioni ricorsive tramite equazioni di ricorrenza
metodo di sostituzione
metodo iterativo
metodo dell'albero
teorema principale (senza dimostrazione)
Il problema dell'ordinamento:
algoritmi naif: filosofia, codice e complessita'
limitazione inferiore sulla complessita' degli ordinamenti per confronti; dimostrazione
funzione di fusione e merge sort; cenno alla tecnica del divide et impera
quick sort e sua complessita' nel caso peggiore, migliore e medio
heap e heap sort
ordinamento in tempo lineare: counting sort
Strutture dati fondamentali
insiemi dinamici ed operazioni su di essi
vettore non ordinato e ordinato
lista semplice e doppiamente puntata
pila e coda, funzioni di inserimento ed estrazione, coda circolare
coda con priorità
albero
definizione come grafo connesso aciclico
teorema di caratterizzazione degli alberi
alberi radicati, alberi binari, alberi binari completi
relazioni tra numero di nodi interni, numero di foglie ed altezza in un albero binario completo
rappresentazione in memoria di un albero binario
rappresentazione posizionale
rappresentazione con puntatori
vettore dei padri
visita in pre-, post- ed in-ordine e calcolo della complessita' tramite equazione di ricorrenza
Dizionari
indirizzamento diretto
tabelle hash
scansione lineare
scansione quadratica
hashing doppio e relative prestazioni (senza dimostrazione)
alberi binari di ricerca
definizione
algoritmo di ricerca e sua complessita'
algoritmo di inserimento e sua complessita'
algoritmi di ricerca del massimo, minimo, successore e predecessore e loro complessita'
algoritmo di cancellazione e sua complessita'
la problematica del bilanciamento (alberi red-black)
rotazioni e cambi di colore
complessità del bilanciamento
Grafi
rappresentazione in memoria
liste di adiacenza
matrice di adiacenza
matrice di incidenza
lista di archi
confronto della complessita' spaziale e temporale in alcune operazioni elementari
visita in ampiezza (BFS)
definizione di albero ricoprente
proprietà degli archi non dell'albero
proprieta' della distanza dalla radice
visita in profondita' (DFS)
proprietà degli archi non dell'albero
proprieta' del numero di archi in funzione della lunghezza del cammino più lungo
similitudini e differenze tra le due visite
loro complessita' al variare della struttura dati usata
Algoritmo di Dijkstra per il calcolo dei cammini minimi
funzionamento
pseudocodice
complessità
dimostrazione della correttezza
Programmazione
Per i contenuti di questa parte si vedano le informazioni fornite dal prof. Franceschini su questo sito.