intro.pps - Dipartimento di Informatica e Sistemistica

Informazioni generali
 Fabrizio d'Amore
o Tel.: 06 49918333
o Email:
[email protected]
o
URL:
www.dis.uniroma1.it/~damore
 Ricevimento:
o martedì, ore 14-16, Dip.
Informatica e
Sistemistica, via Salaria
113, II piano, 00198
Roma
23 aprile 2002
 Testo adottato
o A. Drozdek. Algoritmi e
strutture dati in Java.
Apogeo, 2001, Milano
 Testo consigliato per
integrazioni ed
approfondimenti
o
T. Cormen, C. Leiserson,
L. Rivest, R. Stein.
Introduction to
algorithms. 2a ed. The
MIT Press, 2001,
Cambridge
Algoritmi e strutture dati
1
Informazioni generali/2
 Sito web del corso





(http://www.dis.uniroma1.it/~damore/asd/, in fase di
attivazione)
Java tutorial (http://java.sun.com/docs/books/tutorial/),
parte di una più ampia documentazione disponibile al sito
che Sun dedica a Java (http://java.sun.com/)
API Java
(http://java.sun.com/j2se/1.4/docs/api/index.html,
scaricabile a partire da
http://java.sun.com/j2se/1.4/download.html/)
J. Bishop: Java gently – Corso introduttivo. Addison Wesley
P. Niemeyer e altri. Learning Java. O'REILLY
D. Flanagan. Java in a nutshell. O'REILLY
Algoritmi e strutture dati
2
Obiettivi
 A cosa serve la progettazione di algoritmi e
strutture dati
 Come si misura l’efficienza delle strutture dati e
degli algoritmi
 Come scegliere gli algoritmi e le strutture dati
adatti a risolvere in modo efficiente un problema
 Implementazione di algoritmi e strutture dati in
Java
23 aprile 2002
Algoritmi e strutture dati
3
Argomenti del corso
 Introduzione: efficienza e sua misura
 Riepilogo sulle principali strutture dati di base:
liste, code, pile, alberi
 Code di priorità
 Dizionari
 Aspetti avanzati degli algoritmi di ordinamento
 Grafi: rappresentazione e algoritmi di visita
 Algoritmo di Dijkstra per il calcolo del percorso
minimo
 Programmazione dinamica: introduzione ed esempi
23 aprile 2002
Algoritmi e strutture dati
4
Algoritmi e strutture dati Definizioni
 Struttura dati: organizzazione sistematica dei dati e del
loro accesso
 Algoritmo: procedura suddivisa in passi che, eseguiti in
sequenza, consentono di eseguire un compito in tempo finito
 Esempio: Max. di un vettore di n elementi
Algorithm arrayMax(A, n)
currentMax=A[0];
for (i=0; i<n; i++) // inziare da i = 1?
if (A[i]>currentMax)
currentMax=A[i];
return currentMax;
23 aprile 2002
Algoritmi e strutture dati
5
Nel mondo reale.......
 Gli algoritmi intervengono (in modo più o meno
nascosto) in molti aspetti
 Vari esempi
o Internet
o DBMS
o Motori di ricerca…..
o Analisi della struttura del Web
23 aprile 2002
Algoritmi e strutture dati
6
Esempio: Routing in Internet
Protocollo di Routing
5
Obiettivo: determinare
“buon” cammino sorg.-dest
Astrazione usando grafi:
 I nodi rappresentano
router
 Gli archi descrivono i
link fisici
o
Costi sugli archi (link) :
ritardo, costo in €,
livello di congestione
23 aprile 2002
2
A
B
2
1
D
3
C
3
1
5
F
1
E
2
 Cammino “buono”:
o Di solito significa
cammino a costo minimo
o Possibili def. alternative
Algoritmi e strutture dati
7
Esempio: Accesso a basi di dati
Interrogazione
Obiettivo: rispondere
rapidamente
Interrogazione
...
Data base
23 aprile 2002
Data Record
Algoritmi e strutture dati
8
Qualità di algoritmi e strutture dati
 Efficienza
o Tempo di esecuzione
o Spazio (quantità di memoria)
I due aspetti sono interdipendenti
23 aprile 2002
Algoritmi e strutture dati
9
Misura dell’efficienza obiettivi
 Indipendenza dall’implementazione
 Generale (valida per ogni input, di
qualsiasi dimensione)
 Misura indipendente dalla piattaforma
Hw/Sw
 Dipende dalla piattaforma Hw/Sw
In generale: può essere poco rappresentativo
23 aprile 2002
Algoritmi e strutture dati
11
Modello di costo RAM
Random Access Machine
Macchina che esegue le istruzioni in sequenza.
Insieme di operazioni primitive a costo unitario:
 Assegnazione
 Operazioni aritmetiche
 Confronto
 Lettura/Scrittura
23 aprile 2002
Algoritmi e strutture dati
12
Modello di costo/2
Costo di operazioni complesse:
 Ciclo: somma costo test di fino ciclo e costo corpo del
ciclo
 if…then…else: costo test più costo blocco istruzioni
che segue then o else (a seconda del caso)
 Attivazione di un metodo: somma dei costi di tutte le
istruzioni presenti nel metodo
Costo: somma di tutti i costi
23 aprile 2002
Algoritmi e strutture dati
13
Esempio/1
 Nel primo caso (vett. di 3
elementi) si ha costo 1
(ass.)+1 (ass. nel for) + 6
(test e incr. nel for) + 1
(test finale for) + 3 (test
if) + 1 (istruz. return) = 13
 Nel secondo caso si ha 1
(ass.) + 1 (ass. nel for) + 10
(test e incr. nel for) + 1
(test finale for) + 5 (test
if) + 1 (istr. ass. nell’if) + 1
(istruz. return) = 20
Algorithm arrayMax(A, n)
currentMax=A[0];
for (i=0; i<n; i++)
if (A[i]>currentMax)
currentMax=A[i];
return currentMax;
1
8
7
6
1
3
4
4
n=3
23 aprile 2002
n=5
Algoritmi e strutture dati
14
Esempio/2
Perché tale modello è accettabile?
 Il costo di istruzione è sempre valutato a meno di un
fattore costante (eventualmente grande) perché
o Il numero di operazioni elementari che
implementato ogni istruzione è finito
o Ogni variabile occupa una quantità finita di
memoria e quindi i tempi di accesso a due variabili
diverse sono comunque legati da una costante
Vantaggi: prescinde dalla piattaforma Hw/Sw e dal
linguaggio di programmazione
Svantaggi: l’indicazione che si ottiene è qualitativa
23 aprile 2002
Algoritmi e strutture dati
15
Esempio/3
Problema: i risultati dipendono dal particolare input, anche per lo
stesso valore di n
 Si vuole una misura che dipenda dalla dimensione dell’input (n
nel nostro esempio) ma non dal particolare input considerato
 Possibile alternative:
o Analisi del caso peggiore (worst case): si considera il costo
di esecuzione nel caso peggiore (l'analisi del caso migliore è
in generale poco interessante)
o Analisi del caso medio: si considera il costo medio
dell’algoritmo rispetto ad una distribuzione dell’input
(richiede la conoscenza della distribuzione)
 In ogni caso occorre definire la dimensione dell’input
Nel seguito si considera l’analisi nel caso peggiore
23 aprile 2002
Algoritmi e strutture dati
16
Dimensione dell’input
 Per ogni problema va indicata la dimensione dell’input perché è
rispetto ad essa che si calcola il costo degli algoritmi
 Dipende dall’input, es.:
o Nr. componenti per il problema di ordinare un vettore di
interi
o Nr. di nodi e numero di archi per problemi su grafi
 La scelta deve essere ragionevole. Nei casi dubbi una misura
ragionevole è il numero di bit necessari a rappresentare l’input
 Esempio: se si considera il problema di determinare la
scomposizione in fattori primi di un numero intero allora la
dimensione dell’input è il numero di bit necessario a
rappresentare un intero.
D.: numero di bit necessario a rappresentare un intero < N ?
23 aprile 2002
Algoritmi e strutture dati
17
Analisi nel caso peggiore
(esempio)
 Nel caso peggiore gli
elementi sono ordinati in
maniera crescente
 In questa ipotesi l’istruzione
currentMax=A[i];
è eseguita n-1 volte.
 Il costo complessivo
dell’algoritmo è allora
(ragionando come nei casi
precedenti) 1+1+2n+1+n+(n1)+1=4n+3
Algorithm arrayMax(A, n)
currentMax=A[0];
for (i=0; i<n; i++)
if (A[i]>currentMax)
currentMax=A[i];
return currentMax;
1
4
6
7
8
23 aprile 2002
Algoritmi e strutture dati
18
Analisi asintotica
 Se si considerano tutte le costanti l’analisi può




divenire eccessivamente complessa
In realtà interessa conoscere come varia il costo al
variare della dimensione dell’input, a meno di costanti
o Motivo: il costo è comunque calcolato a meno di
costanti, per le ipotesi fatte circa il modello
Un’analisi di questo tipo è detta asintotica
L’analisi asintotica trascura i fattori costanti
L’analisi asintotica è influenzata dall’operazione
dominante di un algoritmo
23 aprile 2002
Algoritmi e strutture dati
19
Analisi asintotica/2
 f(n), g(n) funzioni dagli interi ai reali
 f(n)=O(g(n)) se esistono c > 0 reale e una costante intera n0  1
tali che f (n )  cg (n ) per ogni n  n0
 f (n )  ( g (n )) se esistono c > 0 reale e una costante intera n0  1
tali che f (n )  cg (n ) per ogni n  n0
 f(n)  Θ(g(n)) se f(n)=O(g(n)) e
f (n )  ( g (n ))
f (n )
 f(n)=o(g(n)) se lim
0
n  g (n )

f (n )   ( g (n ) se g(n)=o(f(n))
23 aprile 2002
Algoritmi e strutture dati
20
Esempi
 In base a tali definizioni, l’algoritmo arrayMax ha costo
(n)
 f(n)= 3n2+10 n = O(n2)
Per c=4 e n0>=10, 3n2+10 n <= 4 n2

1 2
f (n)  n  3n  (n 2 )
2
Per c1= 1/14, c2= 1/2, n0>=7,
1 2
c1n  n  3n  c2 n 2
2
D.: Cosa significa O(1)?
2
Algoritmi e strutture dati
21
Analisi asintotica/3
 Operazione dominante di un algoritmo:
Un’ operazione di un algoritmo avente costo f(n) si dice dominante
se, per ogni n, essa viene eseguita, nel caso peggiore di input di
dimensione n, un numero di volte d(n) che soddisfa:
f(n) < a d(n) + b,
per opportune costanti a e b.
 Es.: istruzione if (A[i]>currentMax) nell’algoritmo arrayMax(A, n)
23 aprile 2002
Algoritmi e strutture dati
22
Analisi asintotica/4
Limiti dell’approccio "analisi asintotica del caso
peggiore":
 Le costanti nascoste possono essere molto
grandi: un algoritmo con costo 1050n è lineare
ma potrebbe essere poco pratico
 Comportamento nel caso di istanze “piccole”
(es. 3n contro n2)
 Il caso peggiore potrebbe verificarsi
raramente
23 aprile 2002
Algoritmi e strutture dati
23
Analisi di Insertion Sort
Algorithm insertionSort(A, n)
for (i=0; i<n; i++) {
tmp=A[i];
for (j=i; j>0 && tmp<A[j-1]; j--)
A[j]=A[j-1];
A[j] = tmp;
}
return A;
Ordina in modo non-decrescente
Inserisce l’elemento A[i] nella
posizione corretta nel vettore
ordinato A[0,…,i-1]
Operazione dominante: una
qualunque fra quelle eseguite nel
for più interno
D.: se la ricerca della posizione di
A[i] in A[0,…,i-1] avvenisse con la
ricerca binaria?
Ex:
54321
i=0
i=1
i=2
i=3
i=4
54321
45321
34521
23451
12345
0 confronti
1 confronto
2 confronti
3 confronti
4 confronti
n(n  1)
f ( n)  i 
O(n 2 )
i 0
2
n 1
Ex:
12345
f(n)= n
Algoritmi e strutture dati
24
Esempi
class esercizio {
public void Ex1(int n) {
int a, i;
for (i=0; i<n;i++)
a=i;
}
public void Ex2(int n) {
int a, i;
for (i=0; i<n*n;i++)
a=i;
}
public void Ex3(int n) {
int a, i, j;
for (i=0; i<n;i++)
for (j=0; j<=i;j++)
a=i;
}
}
Valutare la complessità
dei tre metodi
Complessità di Ex3:
1+2+....+n=O(n2)
Algoritmi e strutture dati
25
Calcolo delle somme dei prefissi
 Dato un vettore di interi X[0....n-1], determinare le
componenti del vettore A[0...n-1] in modo tale che
A[i]=X[0]+....+X[i-1]. Due algoritmi:
Algorithm prefix1(X, n)
for (i=0; i<n; i++) {
A[i]=0;
for (j=0; j<=i; j++)
A[i]=A[i]+X[j];
}
return A;
o
O(n2)
23 aprile 2002
Algorithm prefix2(X, n)
A[0]=X[0];
for (i=1; i<n; i++)
A[i]=A[i-1]+X[i];
return A;
o
O(n)
Algoritmi e strutture dati
26
Progetto di algoritmi:
metodologia "Divide et Impera"
 Il problema è risolto attraverso la sua
scomposizione in problemi di taglia
inferiore
 Divide: Problema suddiviso in un numero di
sottoproblemi di taglia inferiore
Impera: Sottoproblemi risolti
ricorsivamente o direttamente se di
dimensione piccola a sufficienza
Combina: Le soluzioni dei sottoproblemi
sono combinate per ottenere la soluzione al
problema originale
23 aprile 2002
Algoritmi e strutture dati
27
Merge Sort
 Divide: divide gli n elementi da ordinare in due
sottosequenze da n/2 elementi. Costo: O(n)
Impera: ordina ricorsivamente usando il merge
sort le due sottosequenze. Costo: 2f(n/2)
Combina: fonde le due sottosequenze ordinate.
Costo: O(n)
 La ricorsione termina quando si hanno solo due
elementi da ordinare. Costo:O(1)
23 aprile 2002
Algoritmi e strutture dati
28
Merge Sort
void mergesort(int[] A, int first, int last) {
if (first < last) {
int mid = (first + last) / 2;
mergesort(A, first, mid);
mergesort(A, mid+1, last);
merge(A, first, last);
}
}
Costo dell’algoritmo Merge Sort:
void merge(int[] data, int first, int last) {
int mid = (first + last) / 2;
int i1 = 0, i2 = first, i3 = mid + 1;
int[] temp = new int[last – first + 1];
while (i2 <= mid && i3 <= last)
if (data[i2] < data[i3])
temp[i1++] = data[i2++];
else temp[i1++] = data[i3++];
while (i2 <= mid)
temp[i1++] = data[i2++];
while (i3 <= last)
temp[i1++] = data[i3++];
for (i1 = 0, i2 = first;
i2 <= last; data[i2++] = temp[i1++]);
}
c
f (n )   1
f ( n / 2)  f ( n / 2)  c2n
23 aprile 2002
n 1
n 2
Algoritmi e strutture dati
29
Equazioni di ricorrenza
 Tempo di esecuzione di algoritmi ricorsivi
descritti con equazioni di ricorrenza. Ex:
MergeSort:
c
f (n )   1
f ( n / 2)  f ( n / 2)  c2n
n 1
n 2
 Semplificazioni
o Argomenti non interi
o Condizioni al contorno:  (1) per n piccolo
 (1)
f (n )  
2f (n / 2)  c2n
23 aprile 2002
n 1
n 2
Algoritmi e strutture dati
30
Soluzione di equazioni di ricorrenza
 Metodo per sostituzione. Si tenta una
soluzione e si verifica se soddisfa
l’equazione di ricorsione.
f (n )  cn log n , c  c , c
 Ex: Merge Sort:
2
f (n )
1
2
 2c (n / 2) log2 (n / 2)  c2n
 cn log2 (n / 2)  c2n
 cn log2 n  cn  c2n
 cn log2 n
Algoritmi e strutture dati
31
Esercizi
 Mostrare che la soluzione di
f(n)=f(n/2)+1 è O(log n)
 Mostrare che la soluzione di
f(n)=2f((n/2)+17)+n è O(n log n)
23 aprile 2002
Algoritmi e strutture dati
32