Algoritmi e Strutture Dati Laurea in Informatica

Algoritmi e Strutture Dati
Laurea in Informatica
Calendario: 1 Marzo – 10 Giugno
Aula: LuM250
Orario: Mer, Gio 15.30-17.30
Ven 13.30-15.30
Numero crediti = 9 (~ 72 ore)
~ 52 ore di teoria, ~20 ore di esercizi
Docente: Paolo Baldan
Modalità d’Esame
a.  Prova intermedia
per l’assegnazione di un bonus fino a 2 punti
(che si somma al voto dell’esame finale)
b.  Prova scritta
(5 appelli - indispensabile iscriversi nella lista
di esame che verrà attivata su UNIWEB)
c.  Registrazione, con possibile orale (su base
volontaria). Indispensabile per conseguire la
lode.
Materiale didattico
Testo: Introduzione agli Algoritmi e Strutture Dati
(3° ed). T.H.Cormen, C.E.Leiserson, R.L.Rivest,
C.Stein. McGraw-Hill.
Trad. di: Introduction to Algorithms and Data
Structures (3° ed). T.H.Cormen, C.E.Leiserson,
R.L.Rivest, C.Stein. MIT Press.
Pagina del corso con altro materiale (note,
link, ecc.:
www.math.unipd.it/~baldan/Algoritmi
Programma
Le prime 5 parti del testo (con qualche omissione):
I.  Fondamenti: notazione per gli algoritmi e primi
esempi di algoritmi e di analisi degli algoritmi
II.  Ordinamento e statistiche d’ordine
III.  Strutture dati fondamentali
IV.  Tecniche avanzate di progettazione ed analisi
degli algoritmi
V.  Strutture dati avanzate
INTRODUZIONE
I problemi computazionali, gli algoritmi che li
risolvono e le tecniche per sviluppare tali
algoritmi
Esempio1: problema dell’ordinamento
Input: a1,a2,...,an
Output: a'1,a'2,...,a'n permutazione (riarrangiamento)
di a1,a2,...,an tale che a'1 ≤ a'2 ≤ ... ≤ a'n
TECNICA
INCREMENTALE
InsertionSort
Soluzione1: Algoritmo Insertion-Sort.
A
A
A
1
n
1j
n
1
j
n
1
i j
n
j
n
j
n
j
n
key
A
key
A
key
A
i1
A
A
1
1
1
i
n j
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<T> 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;
}
}
5
5
#
2
2
2
2
2
2
2
2
2
2
2
#
5
5
5
5
5
5
#
4
4
4
4
8
8
8
8
#
#
8
8
5
5
5
5
5
A
4 7
4 7
4 7
4 7
4 7
4 7
4 7
# 7
8 7
8 7
8 #
# 8
7 8
key
1
1
1
1
1
1
1
1
1
1
1
1
1
3
3
3
3
3
3
3
3
3
3
3
3
3
6
6
6
6
6
6
6
6
6
6
6
6
6
2
8
4
7
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
2
2
#
1
1
1
1
1
1
1
4
4
2
2
2
2
2
2
2
2
5
5
4
4
4
#
3
3
3
3
A
7 8
7 8
5 7
5 7
5 7
4 5
4 5
4 5
4 5
4 5
key
1
#
8
8
8
7
7
7
#
6
3
3
3
3
#
8
8
8
7
7
6
6
6
6
6
6
6
#
8
8
1
3
6
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
Analisi di Insertion-Sort: correttezza
Insertion-Sort(A)
n = A.length
for j = 2 to n
A
1
key = A[j]
i=j-1
while i > 0 and A[i] > key
A
j
n
1
i
j
n
1
i
j
n
j
n
A[i+1] = A[i]
i=i–1
A
i 1
A[i+1] = key
j
n
A
A
1
Correttezza InsertionSort
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]
0 ≤ tj
i=i–1
A[i+1] = key
<j
//
//
//
//
//
//
//
//
//
c0
c1
c2 n
c3 (n − 1)
c4 (n − 1)
n
c5 ∑ j = 2 (t j + 1)
n
c6 ∑ j = 2 t j
n
c7 ∑ j = 2 t j
c8 (n − 1)
T IS (n) = c0 + c1 + c2 n + (c3 + c4 + c8 )(n − 1)
n
n
+ c5 ∑ j =2 (t j + 1) + (c6 + c7 )∑ j =2 t j
caso migliore:
tj = 0
0 ≤ tj < j
IS
min
T (n) = c0 + c1 + c2 n + (c3 + c4 + c8 )(n − 1)
n
n
+ c5 ∑ j = 21 + (c6 + c7 )∑ j =2 0
IS
Tmin
(n) = (c2 + c3 + c4 + c5 + c8 )n + (c0 + c1 − c3 − c4 − c5 − c8 )
= bn + a
caso peggiore:
t j = j −1
0 ≤ tj < j
IS
Tmax
(n) = c0 + c1 + c2 n + (c3 + c4 + c8 )(n − 1)
n
n
+ c5 ∑ j =2 j + (c6 + c7 )∑ j =2 ( j − 1)
IS
max
T
1
(n) = (c5 + c6 + c7 )n 2
2
1
1
1
+ (c2 + c3 + c4 + c5 − c6 − c7 + c8 )n
2
2
2
+ (c0 + c1 − c3 − c4 − c8 )
= c ' n 2 + b' n + a '
caso medio: t j =
IS
med
T
T
0 ≤ tj < j
(n) = c0 + c1 + c2 n + (c3 + c4 + c8 )(n − 1)
+ c5 ∑
IS
med
j −1
2
n
j +1
j =2 2
n
+ (c6 + c7 )∑ j =2 j2−1
1
(n) = (c5 + c6 + c7 )n 2
4
3
1
1
+ (c2 + c3 + c4 + c5 − c6 − c7 + c8 )n
4
4
4
+ (c1 − c3 − c4 − c5 − c8 )
2
= c" n + b" n + a"