Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Algoritmi e Strutture Dati
Capitolo 2
Modelli di calcolo e
metodologie di analisi
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Riepilogo algoritmi Fibonacci*
Numero di linee di
codice
Occupazione di
memoria
fibonacci1
Θ(1)
Θ(1)
fibonacci2
Θ(n)
Θ(n)
fibonacci3
Θ(n)
Θ(n)
fibonacci4
Θ(n)
Θ(1)
fibonacci5
Θ(n)
Θ(1)
fibonacci6
Θ(log n)
Θ(log n)
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Modello di calcolo
• Per valutare la complessità di un algoritmo, bisogna
prima di tutto stabilire un modello di calcolo di
riferimento su cui esso viene eseguito
• Macchina a registri (RAM: random access machine)
– un programma finito
– un nastro di ingresso e uno di uscita
– una memoria strutturata come un array (di dimensione infinita)
• ogni cella può contenere un qualunque valore intero/reale
– un registro detto accumulatore (contiene operandi istruzione
corrente)
– un registro detto contatore delle istruzioni (contiene indirizzo
istruzione successiva)
• la RAM è un’astrazione dell’architettura di von Neumann
3
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Macchina a registri
4
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Criterio di costo uniforme
• Nel modello a costi uniformi, ogni
istruzione ha un costo unitario
• Complessità temporale misurata come
numero di istruzioni eseguite
– istruzione ingresso/uscita (lettura o stampa)
– operazione aritmetico/logica
– accesso/modifica del contenuto della memoria
• Complessità spaziale misurata come
numero massimo di celle di memoria della
RAM occupate durante l’esecuzione
5
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Dimensione dell’input
• Misureremo le risorse di calcolo usate da un algoritmo
(tempo di esecuzione / occupazione di memoria ) in
funzione della dimensione dell’istanza in input
• Esistono due modalità di caratterizzazione della
dimensione dell’input:
– Quantità di memoria effettiva utilizzata per codificare l’input
(ad esempio, numero di bit necessari per rappresentare un
valore in input)
– Parametro caratterizzante la dimensione dell’input (ad esempio,
numero di elementi di una sequenza da ordinare)
6
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Domanda di approfondimento
• Qual è la complessità temporale degli algoritmi Fibonacci6,
Fibonacci4 e Fibonacci2 in funzione della
rappresentazione dell’input?
• Abbiamo appena affermato che la complessità temporale viene
misurata in funzione della dimensione dell’input; nel caso dei tre
algoritmi in questione, l’input è un numero n, che può essere
rappresentato usando k=log n bit. Quindi:
– Fibonacci6 costa T(n)=Θ(log n)=Θ(k), ed è quindi polinomiale (più
precisamente, lineare) nella dimensione dell’input;
– Fibonacci4 costa T(n)=Θ(n)=Θ(2k), ed è quindi esponenziale nella
dimensione dell’input;
k
– Fibonacci2 costa T(n)=Θ(n)=Θ(2 ), ed è quindi superesponenziale
nella dimensione dell’input.
7
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione asintotica
8
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione asintotica e operazioni dominanti
• Complessità temporale e spaziale saranno espresse in
notazione asintotica rispetto alla dimensione dell’input
• La notazione asintotica è un’astrazione utile per descrivere
l’ordine di grandezza di una funzione ignorando i dettagli
non influenti, come costanti moltiplicative e termini di
ordine inferiore
• Ai fini dell’analisi asintotica, sarà sufficiente considerare
le cosiddette operazioni dominanti, ovvero quelle che nel
caso peggiore vengono eseguite più spesso
• Queste si trovano annidate nei cicli più interni dello
pseudocodice che descrive l’algoritmo
9
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione asintotica O
f(n) = O(g(n)) se due costanti c>0 e n0≥0 tali
che f(n) ≤ c g(n) per ogni n ≥ n0
f(n) = ( g(n) )
cg(n)
f(n)
n0
10
n
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Un caso notevole: i polinomi
Sia f(n) = ad nd + ad-1 nd-1 + … + a0 un polinomio di grado
d (con ad>0); dimostriamo che f(n)=O(nd)
Infatti: f(n)/nd = ad + ad-1 n-1 + … + a0 n-d
n0: n n0
ad - |ad-1|n-1 - … - |a0| n-d > 0
Se scegliamo c = ad + |ad-1| + … + |a0|
c nd = ad nd + |ad-1| nd+…+ |a0| nd ad nd + |ad-1| nd-1+…+
|a0| ad nd + ad-1 nd-1 + … + a0
n n0 f(n) c nd
11
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Esempi
• Sia f(n) = 2n2 + 3n; vogliamo dimostrare che f(n)=O(n2).
f(n)/n2 = (2n2 + 3n)/n2 = 2 + 3/n
ma 2 + 3/n > 0 per n ≥ 1 (quindi n0=1);
Scegliendo c = a2 + |a1| + |a0| = 2+3=5
avremo che 2n2 + 3n ≤ 5n2 per n ≥ n0=1.
• f(n) = O(n3)
(c=1, n0=3)
• f(n) = O(2n)
(c=4, n0=3)
• Invece, f(n) O(n)
12
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Legame con il concetto di limite
fn
0
gn
fn O gn
fn O gn
limn
limn
fn O gn
13
limn
fn
0
gn
fn
(se esiste)
gn
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione asintotica W
f(n) = W(g(n)) se due costanti c>0 e n0≥0 tali
che f(n) ≥ c g(n) per ogni n ≥ n0
f(n) = W(g(n))
f(n)
c g(n)
n0
14
n
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Un caso notevole: i polinomi
Sia f(n) = ad nd + ad-1 nd-1 + … + a0 un polinomio di grado d (con
ad>0); dimostriamo che f(n)=Ω(nd)
Infatti: f(n)/nd = ad + ad-1 n-1 + … + a0 n-d
n0: n n0
ad - |ad-1|n-1 - … - |a0| n-d > 0
Se scegliamo c = ad - |ad-1| n0-1 - … - |a0 | n0-d
c nd = ad nd -|ad-1| nd n0-1 -…- |a0| nd n0-d
e poiché per n n0 si ha nd n0-k nd-k
c nd ad nd - |ad-1| nd-1-…- |a0| ad nd + ad-1 nd-1 + … + a0
n n0 c nd f(n)
15
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Esempi
• Sia f(n) = 2n2 - 5n; vogliamo dimostrare che f(n)= W(n2).
f(n)/n2 = (2n2 - 5n)/n2 = 2 - 5/n
ma 2 - 5/n > 0 per n ≥ 3 (quindi n0=3);
Scegliendo c = a2 - |a1|/n0 - |a0|/n02 = 2-3/3=1
avremo che 2n2 - 3n ≥ 1n2 per n ≥ n0=3.
• f(n) = W(n)
(c=1, n0=2)
• f(n) = W(log n)
(c=1, n0=2)
• Invece, f(n) W(n3)
16
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Legame con il concetto di limite
fn
gn
fn Wgn
limn
fn Wgn
17
fn Wgn
limn
limn
fn
gn
fn
(se esiste)
gn
0
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione asintotica Q
f(n) = Q(g(n)) se tre costanti c1,c2>0 e n0≥0 tali
che c1 g(n) ≤ f(n) ≤ c2 g(n) per ogni n ≥ n0
f(n) = Q(g(n))
c2 g(n)
f(n)
c1 g(n)
n0
18
n
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Relazioni tra O, Ω e Θ
fn Qg(n)
fn Ogn
fn Og(n)
fn Θgn
fn Qg(n)
fn Wgn
fn Wg(n)
fn Qgn
fn Qg(n)
19
fn Ωgn e fn Ogn
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione o
Data una funzione g(n): N R, si denota con o(g(n)) l’insieme delle
funzioni f(n): N R:
o(g(n)) = {f(n) : c > 0, n0 tale che
n n0 0 f(n) c g(n) }
Notare:
ogn
fn ogn
20
Ogn
limn
fn
0
gn
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Notazione ω
Data una funzione g(n): N R, si denota con ω(g(n)) l’insieme delle
funzioni f(n): N R:
ω(g(n)) = {f(n) : c > 0, n0 tale che
n n0 0 c g(n) f(n) }
Notare:
gn
fn gn
21
Wgn
limn
fn
gn
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Riassumendo …
fn Θgn
fn Ogn
fn Wgn
fn
c2
gn
asintotica mente
0
fn
c2
gn
asintotica mente
fn
0 c1
gn
fn ogn
fn gn
22
0 c1
asintotica mente
limn
fn
0
gn
limn
fn
gn
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Analogie
23
O
W
Q
o
>
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Graficamente
24
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Proprietà della notazione asintotica
Transitività
fn Qgn
e
gn Qhn
fn Qhn
fn Ogn
e
gn Ohn
fn Ohn
fn Wgn
e
gn Whn
fn Whn
fn ogn
e
gn ohn
fn ohn
fn gn
e
gn hn
fn hn
Riflessività
fn Qfn
fn Οfn
fn Wfn
Simmetria
fn Qgn
Simmetria trasposta
gn Qfn
fn Ogn
gn Wfn
fn ogn
gn fn
25
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Polinomi
P(n) = ad nd + ad-1 nd-1 + … + a0
ad > 0
Relazioni asintotiche notevoli
Esponenziali
an
f(n) = an
limn d
a >1
n
P(n) = O(nd), P(n) = W(nd) P(n) = Q(nd)
P(n) = O(nk), k≥d, P(n) ≠ O(nk), k<d
P(n) = W(nk), k≤d, P(n) ≠ W(nk), k>d
an = (nd)
an = W(nd)
Logaritmi
f(n) = logb(n) b>1
limn
logb n c
nd
0, c, d 1
logb(n) = o(nd)
logb(n) = O(nd)
Fattoriali
f(n) = n! = n*(n-1)*……*2*1
26
n! = o(nn)
n! = (an)
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Metodi di analisi
27
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Caso peggiore, migliore e medio
• Come detto, misureremo le risorse di calcolo usate
da un algoritmo in funzione della dimensione delle
istanze
• Ma istanze diverse, a parità di dimensione,
potrebbero richiedere risorse diverse! Ad esempio,
se devo cercare un elemento x in un insieme di n
elementi in input, il numero di confronti che farò
dipenderà dalla posizione che x occupa nella
sequenza.
• Distinguiamo quindi ulteriormente tra analisi nel
caso peggiore, migliore e medio
28
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Caso peggiore
• Sia tempo(I) il tempo di esecuzione di un
algoritmo sull’istanza I
Tworst(n) = max istanze I di dimensione n {tempo(I)}
• Intuitivamente, Tworst(n) è il tempo di esecuzione
sulle istanze di ingresso che comportano più
lavoro per l’algoritmo
• Definizione analoga può essere data per lo
spazio
29
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Caso migliore
• Sia tempo(I) il tempo di esecuzione di un
algoritmo sull’istanza I
Tbest(n) = min istanze I di dimensione n {tempo(I)}
• Intuitivamente, Tbest(n) è il tempo di
esecuzione sulle istanze di ingresso che
comportano meno lavoro per l’algoritmo
30
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Caso medio
• Sia P(I) la probabilità di occorrenza dell’istanza I
Tavg(n) = ∑ istanze I di dimensione n {P(I) tempo(I) }
• Intuitivamente, Tavg(n) è il tempo di
esecuzione nel caso medio, ovvero sulle
istanze di ingresso “tipiche” per il problema
• Richiede di conoscere una distribuzione di
probabilità sulle istanze
31
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Complessità temporale e spaziale di un
algoritmo
• Denoteremo con T(n) il tempo di esecuzione
dell’algoritmo su una generica istanza di ingresso
di dimensione n. Varrà quindi:
T(n) ≤ Tworst(n)
T(n) ≥ Tbest(n)
• Analogamente, per l’occupazione di memoria:
S(n) ≤ Sworst(n)
S(n) ≥ Sbest(n)
32
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Delimitazioni
inferiori e superiori
33
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Delimitazioni superiori (upper bound)
Definizione (complessità di un algoritmo)
Un algoritmo A ha costo di esecuzione O(g(n)) su istanze di
dimensione n e rispetto ad una certa risorsa di calcolo (spazio
o tempo), se la quantità f(n) di risorsa sufficiente per eseguire
A su qualunque istanza di dimensione n (e quindi in particolare
anche nel caso peggiore) verifica la relazione
f(n)=O(g(n)).
Definizione
Un problema P ha una delimitazione superiore alla
complessità O(g(n)) rispetto ad una certa risorsa di calcolo
(spazio o tempo) se esiste un algoritmo che risolve P il cui
costo di esecuzione rispetto a quella risorsa è O(g(n)).
34
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Delimitazioni inferiori (lower bound)
Definizione
Un algoritmo A ha costo di esecuzione W(g(n)) su istanze di
dimensione n e rispetto ad una certa risorsa di calcolo (spazio o tempo),
se la quantità f(n) di risorsa necessaria per eseguire A nel caso peggiore
(e quindi non è detto che debba essere necessaria per ogni istanza di
dimensione n: istanze facili potrebbero richiedere meno risorse!)
verifica la relazione
fworst(n)= W(g(n)).
Definizione (complessità intrinseca di un problema)
Un problema P ha una delimitazione inferiore alla complessità
W(g(n)) rispetto ad una certa risorsa di calcolo (spazio o tempo) se
ogni algoritmo che risolve P ha costo di esecuzione W(g(n)) rispetto a
quella risorsa.
35
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Ottimalità di un algoritmo
Definizione
Dato un problema P con complessità intrinseca W(g(n))
rispetto ad una certa risorsa di calcolo (spazio o tempo), un
algoritmo che risolve P è ottimo se ha costo di esecuzione
O(g(n)) rispetto a quella risorsa.
36
Copyright © 2004 - The McGraw - Hill Companies, srl
Algoritmi e strutture dati
Camil Demetrescu, Irene Finocchi, Giuseppe F. Italiano
Esercizio di approfondimento
Sia dato un mazzo di n carte scelte in un
universo U di 2n carte, e si supponga di
dover verificare se una certa carta xU
appartenga o meno al mazzo. Progettare un
algoritmo per risolvere tale problema, e
analizzarne il costo (in termine di numero di
confronti) nel caso migliore, peggiore e
medio.
37
Copyright © 2004 - The McGraw - Hill Companies, srl