Algoritmi e Strutture Dati 8 crediti Calendario: 1 Ott. – 6 Dic. Aula: LuM250 Orario: Lun, Mar, Mer, Gio Giorni di lezione disponibili 40 ~48 ore di teoria, ~18 ore di esercizi e 4 ore per le prove parziali I sessione esami: Dic 9-20 Gen 7-11
a.5 scritti (+ 2 compitini: uno a metà del corso ed uno a fine corso o assieme al primo appello). Indispensabile iscriversi nella lista di esame che verrà attivata su UNIWEB. b.Colloquio e registrazione: principalmente discussione dello scritto con qualche domanda di teoria. c.Si è ammessi al colloquio con almeno 17/30 come voto dello scritto.
Testo: Introduzione agli Algoritmi e Strutture Dati (terza edizione). T.H.Cormen, C.E.Leiserson, R.L.Rivest, C.Stein. McGraw-Hill. Altro materiale didattico verrà messo nel sito: oppure la versione inglese: Introduction to Algorithms and Data Structures (terza edizione). T.H.Cormen, C.E.Leiserson, R.L.Rivest, C.Stein. MIT Press.
Programma Le prime 5 parti del testo (con poche omissioni): I.Fondamenti: notazione per gli algoritmi e primi esempi di algoritmi e di analisi degli algoritmi II.Ordinamento e statistiche dordine III.Strutture dati fondamentali IV.Tecniche avanzate di progettazione ed analisi degli algoritmi V.Strutture dati avanzate
I problemi computazionali, gli algoritmi che li risolvono e le tecniche per sviluppare tali algoritmi INTRODUZIONE Esempio1: problema dellordinamento Input: a 1,a 2,...,a n Output: a' 1,a' 2,...,a' n permutazione (riarrangiamento) di a 1,a 2,...,a n tale che a' 1 a' 2... a' n
TECNICA INCREMENTALE
Soluzione1: Algoritmo Insertion-Sort. InsertionSort 1 n A 1 n A 1 n j A key 1 n j A i 1 n j A j 1 n A j 1 n j A i 1 n j A i
Insertion-Sort(A) n = A.length for j = 2 to n key = A[j] // inseriamo A[j] nella sequenza // ordinata A[1..j-1] i = j - 1 while i > 0 and A[i] > key A[i+1] = A[i] i = i – 1 A[i+1] = key
Insertion-Sort(A) n = A.length for j = 2 to n key = A[j] // inseriamo A[j] nella // sequenza ordinata // A[1..j-1] i = j – 1 while i > 0 and A[i] > key A[i+1] = A[i] i = i – 1 A[i+1] = key void Insertion-Sort(vector A) { int i, j, n = A.size(); T key; for (j = 1; j < n; j++) { key = A[j]; // inseriamo A[j] nella // sequenza ordinata // A[0..j-1] i = j – 1; while (i >= 0 && A[i] > key) { A[i+1] = A[i]; i--; } A[i+1] = key; } }
Insertion-Sort(A) n = A.length for j = 2 to n // inserisce A[j] nella // sequenza ordinata // A[1..j-1] key = A[j] i = j – 1 while i > 0 and A[i] > key A[i+1] = A[i] i = i – 1 A[i+1] = key A key 5 # # # # # # #
Insertion-Sort(A) n = A.lenght for j = 2 to n // inserisce A[j] nella // sequenza ordinata // A[1..j-1] key = A[j] i = j – 1 while i > 0 and A[i] > key A[i+1] = A[i] i = i – 1 A[i+1] = key A key # # # # # #
Insertion-Sort(A) n = A.length for j = 2 to n key = A[j] i = j - 1 while i > 0 and A[i] > key A[i+1] = A[i] i = i – 1 A[i+1] = key Analisi di Insertion-Sort: correttezza Correttezza InsertionSort 1n j A i 1 n j A 1n j A i 1n j A i1 n j A
Analisi di Insertion-Sort: complessità Insertion-Sort(A)// n = A.length // for j = 2 to n // key = A[j] // i = j -1 // while i > 0 and A[i] > key// A[i+1] = A[i] // i = i – 1// A[i+1] = key//
caso migliore:
caso peggiore:
caso medio:
TECNICA DIVIDE ET IMPERA
Soluzione2: Algoritmo Merge-Sort