Notazioni Asintotiche ed Analisi di Algoritmi

Ricominciamo da quanto fatto
Riflettiamo su quanto fatto
Problemi incontrati
Algoritmi
Max Subarray
Stable Matching
n2 possibilità
n! possibilità
~n operazioni
~n2
operazioni
Problemi incontrati
Algoritmo Brute Force
Algoritmi
Max Subarray
Stable Matching
n2 possibilità
n! possibilità
Algoritmo Brute Force
~n operazioni
~n2 operazioni
Migliore Algoritmo visto
Migliore Algoritmo visto
Es. di Ordine di crescita. Di quanto aumenta il running time se la taglia
~nlog(n) operazioni
dell’input raddoppia?
・~n2
~n2 operazioni
Stime ragionevoli
del comportamento
dei programmi.
Dal confronto dei running
time dei programmi
corrispondenti
dice che il running time aumenta di un fattore 4
- n1 = 10 --> n2 = 20
Q. In che senso queste funzioni stimano
abbastanza bene il comportamento reale?
Q. Perché ci accontentiamo di tali stime?
・~n
dice che il running time aumenta di un fattore 2
・~n!
dice che il running time aumenta di un fattore > nn
- n1 = 10 --> n2 = 20
Forniscono l’ordine di crescita asintotica del running time
2
(n1)2 = 100, (n2)2 = 400 = 4x(n1)2
- n1 = 10 --> n2 = 20
(n2) = 2x(n1)
n1! = 10x9x...x2x1 n2! = 20x19x...x11x10!
Un criterio di efficienza
Un criterio di efficienza
Dicotomia tipica tra esponenziale e polinomiale.
Proprietà di crescita desiderabile. Se la taglia dell’input raddoppia, il running
3
time dovrebbe peggiorare di un fattore costante C (indipendente dalla taglia
Esiste un algoritmo naturale che prova tutte le possibili soluzioni (brute
dell’input)
force)
・in molti casi esistono 2n possibilità (o di più) per un input di taglia n.
・un tale algoritmo è, in pratica, inaccettabile
・l’ordine di crescita del running time è 2n
Def. Un algoritmo è polinomiale (tempo polinomiale) se
vale la proprietà di crescita di cui sopra.
- se l’input raddoppia il running time cresce del quadrato
Esistono costanti c > 0 e d > 0 tali che
su ogni input di taglia n, il running time è quello di
scegliamo c = 2d
al più c nd passi computazionali elementari
Proprietà di crescita desiderabile. Se la taglia dell’input raddoppia, il running
time dovrebbe peggiorare di un fattore costante C (indipendente dalla taglia
dell’input)
4
5
Running time polinomiale
Notazioni Asintotiche: O (o-grande), Ω (omega), e Θ (teta)
Diremo che un algoritmo è efficiente se il running time è polinomiale.
Prossimo passo. valutare e confrontare l’ordine di crescita asintotico di
funzioni elementari.
Esistono costanti c > 0 e d > 0 tali che
Uso finale. stima della velocità di crescita di funzioni che esprimono le
su ogni input di taglia n, il running time è quello di
risorse consumate da un algoritmo rispetto alla taglia dell’input
al più c nd passi computazionali elementari
Perché analisi asintotica.
・Perché di solito usiamo gli algoritmi per risolvere istanze di taglia
Perché proprio questa definizione?. Tale scelta funziona in pratica!
grande
・In pratica, gli algoritmi polinomiali sviluppati fino ad ora hanno costanti
・Perché le istanze piccole potrebbero essere una sorta di eccezione
ed esponenti piccoli.
・
rispetto al comportamento tipico di un algoritmo
Superare la barriera esponenziale dell’algoritmo esaustivo (brute force)
Vogliamo poter ragionare come segue:
Algo A cresce come f(n)
rivela elementi strutturali del problema (fa capire di più).
Algo B cresce come g(n)
f(n) cresce meno velocemente di g(n)
Q. Quale running time considerereste più efficiente
20 n100
oppure
n1 + 0.02 ln n
?
quindi A è più efficiente di B
6
Perché un tale approccio dovrebbe funzionare?
7
Notazione O-grande (Big-Oh notation)
Usata per limitare superiormente il tasso di crescita
Def. Date due funzioni (asintoticamente non negative) f(n) e g(n)
c · g (n)
f(n) è O( g (n)) [scritto anche f(n) = O( g (n)) ]
f(n)
se esistono constanti c > 0 e n0 ≥ 0
tali che f(n) ≤ c · g(n) per ogni n ≥ n0.
n0
Ex. f(n) = 32n2 + 17n + 1.
scegliendo c = 50, n
・f(n) è O(n2).
・f(n) è anche O(n3).
・f(n) non è O(n) né O(n log n).
0
=1
・log n è O(n)
・(log nk)m è O(na) per ogni k, m e a > 0
・nk è O(an) per ogni k e a
・an è O(n!) per ogni a
8
n
[es. (log n10)7 è O(n0.0001) ]
[es. n1000 è O(0.0001n) ]
9
1
Asymptotic Growths
1a
a d nd +
Dim. d
a d nd + a d
2
d
1n
d
1
 |ad |nd + |ad
 (|ad | + |ad
1 |n
1|
Logaritmi e polinomi
= cn
d
d 1
+ · · · + |a1 | + |a0 |) n
1 |n
1|
d 1
+ · · · + |a1 |n + |a0 |
+ · · · + |a1 | + |a0 |) nd
10
Da cui otteniamo
✓mk ↵ ◆k
↵
↵
mk
mk
mk⇥ log2 n↵ = ↵ log2 n k 
log2 nm di
=m
log
n=
⇥ dn k
k 2m
Limiti asintotici
alcune
funzioni
log
n

n = cn
↵ ⇥kdelementari
↵
↵
2
↵
Da cui otteniamo
k
mk
✓
◆k
ponendo c = ↵ ⇥ d
mk
↵
Logaritmi: la base non conta,
solo
logk2 nmcambia

⇥ d la ncostante.
= cn↵
↵
Nota che la base del logaritmo non cambia nulla tranne la costante in quanto
k
ponendo c = mk
↵ ⇥d
logb n
loga n =
logb a
0
↵
↵
mk ↵
mk
mk
log2 nm = m log2 n =
⇥ log2 n =
log2 n k 
⇥ dn k
↵
k
↵
↵
↵
↵
mk ↵
mk
mk
m
logotteniamo
⇥ log2 n =
log2 n k 
⇥ dn k
2 n = m log2 n =
Da cui
k ) ◆k↵
↵ c = (mkd/α)
k✓
↵
da cui otteniamo (ponendo
mk
logk2 nm 
⇥ d n↵ = cn↵
Da cui otteniamo
✓ ↵ ◆k
mk
k m
log
⇥ d n↵ = cn↵
k2 n 
ponendo c = mk
↵
↵ ⇥d
ponendo c =
mk
↵
⇥d
k
11
Dominio. Il dominio delle funzioni è quello dei numeri naturali { 0, 1, 2, … }.
・a volte restringeremo ad un sottinsieme dei naturali
・altre volte estenderemo ai reali
Sappiamo che esistono n0 n
e c tali che
k
k
Funzioni non-negative. Quando si usa la notazione O-grande, assumiamo
n0 per
. Quindi
anche
n n nn00 sisihaha
ogni n vale
n0 . Quindi
valeche
ancheper
che ogni
per ogni
che le funzioni siano (asintoticamente) nonnegative.
otteniamo che
n
n
⌘log⇣ alognna n ⌘loga n
n an =
nn
a nn loga n = n loga
a
nk . k
= n
aloglog
log
an
loga n
loga n
a
= a
1
・Se scriviamo f (n) = O(n3) = g(n).
・Allora (!?!), f (n) = g(n).
Proviamoeche
per ogni a Per
> 1 ogni
e k > 0a si>ha
= O(a
) 0, nk è O(a n).
Esponenziali
polinomi.
1 enkogni
k n>
⇣
an = a
d 1
Errori da evitare. Sia f (n) = 5n3 e g (n) = 3n2 .
Proviamo che per
a > 1 e ed
k >esponenziali
0 si ha n1k = O(an )
3 ogni
polinomi
Sappiamo che esistono n0 e c tali che
quindi per ogni n > n0
+ · · · + |a1 |n + |a0 |
1
f(n) = O( g (n)) invece di f(n) ∈ O( g (n)).
polinomi ed esponenziali
per ogni n
d 1
Uso del segno uguale. O( g (n)) è un insieme
di funzioni, ma spesso si scrive
1
1
n
loga n
d 1
Abusi di notazione
quindi, in termini di crescita asintotica, quanto dimostriamo per logb(n) vale
Dim. Sia n0 il minimo n tale log
chea n
1 |n
Dim
Proviamola.
k
logk2 nm = (log2 nm ) = O(n↵ )
Meno evidente potrebbe essere la seguente relazione, valida per ogni m, k, ↵ >
Proviamola.
0,
k
logk2 nm = (log2 nm ) = O(n↵ )
↵
↵
mk
↵
mk
mk
Proviamola.
log2 nm = m log2 n =
⇥ log2 n =
log2 n k 
⇥ dn k
↵
k
↵
↵
3
|ad |nd + |ad
1. Per induzione su n
Dim. Per
Possiamo
dimostrare
n = 1 abbiamo
log2 n per
= 0 induzione
 1 = n. che per ogni n > 0, vale log n ≤ cn
PrimaAssumendolo
mostriamo che
logper
cn per
ogni nn =1.i Per
2 n 
vero
+ 1 induzione su n
PerPern=1
lognnn=
= 00i,
<ponendo
11 =
n = 1abbiamo
abbiamo log
= nn.
2
Assumendolo
ninduttiva
 i, ponendo
= i +log
1 (n-1) ≤ c (n-1), otteniamo
Assumendo
pervero
ipotesi
che n
valga
logper
2 n = log2 (i + 1)  1 + log2 i  1 + i = n.
log n = log (n-1+1) ≤ 1 + log (n-1) ≤ 1 + c(n-1) ≤ c n
log2 n = log2 (i + 1)  1 + log2 i  1 + i = n.
Meno evidente potrebbe essere la seguente relazione, valida per ogni m, k, ↵ >
0,
k
k mla seguente
mrelazione,
Meno evidente potrebbelog
essere
valida
ogni m, k, ↵ >
n =k,(log
O(n↵(log
) nmper
Logaritmi
e polinomi. Per2 ogni
m, 2αn >)0,=vale
)k is O(n α).
0,
k
Proviamola.
logk2 nm = (log2 nm ) = O(n↵ )
d
Meno evidente potrebbe
valida
ogni m, k, ↵ >
log2 nessere
= logla2 (iseguente
+ 1)  1relazione,
+ log2 i 
1 + iper
= n.
anche per loga(n)

siaPrima
inLogaritmi
base
2
2
polinomi
mostriamo
chee log
2 n  cn per ogni n
+ · · · + |a1 |n + |a0 |
Prima mostriamo che log2 n  cn per ogni n 1. Per induzione su n
2 n =Logaritmi
Per
1 abbiamo log ne=polinomi
0  1 = n.
quindi n0 = 1 e c = |ad| +2... + |a0| soddisfano la definizione
Assumendolo vero per n  i, ponendo n = i + 1
Prima mostriamo che log2 n  cn per ogni n 1. Per induzione su n
Per n = log
1 abbiamo
log n = 0  1 = n.
2 n = log2 (i2+ 1)  1 + log2 i  1 + i = n.
Assumendolo vero per n  i, ponendo n = i + 1
0,
+ · · · + a1 n + a0
d
d
+ · · · + a1 n +=a0 cn |ad |nd + |ad
 (|ad | + |ad
d 1
= cnd
2 Logaritmi
polinomi
Logaritmi
e polinomi. eAbbiamo
log n = O(n)--- assumiamo che il logaritmo
= a0 + a1 n + … + ad nd con ad > 0. Allora, f(n) è O(nd).
d 1
Polinomi
+ · · · + a1 n + a0
1n
1n
d ·1· · + |a1 | + |a0 |) nd
|add 11|n
|+
ad n + ad 1 n
+ · · · + a1 n + a0   |ad(|a
|ndd |++|a
+ · · · + |a1 |n + |a0 |
cn| d+ |a | + · · · + |a | + |a |) nd
Limiti asintotici di alcune funzioni
elementari
 = (|a
October 16, 2014
Limiti asintotici di alcune funzioni elementari
October 16, 2014
1Polinomi.
Polinomi
Sia f(n)
Polinomi
a d nd + a d
=n
IMPORTANTE. OK ad abusi di notazione; attenzione agli eccessi erronei!
n .
12
13
Ieri abbiamo introdotto la notazione O-grande (Big-Oh notation)
Notazione Ω (Big-Omega notation)
Usata per limitare superiormente il tasso di crescita
Per Limiti inferiori. f(n) è Ω( g (n)) se esistono costanti c > 0 e n0 ≥ 0
tali che f(n) ≥ c · g (n) per ogni n ≥ n0.
Def. Date due funzioni (asintoticamente non negative) f(n) e g(n)
c · g (n)
f(n) è O( g (n)) [scritto anche f(n) = O( g (n)) ]
Ea. f(n) = 32n2 + 17n + 1.
・f(n) è sia Ω(n2) che Ω(n).
・f(n) non è Ω(n3) né Ω(n3 log n).
f(n)
se esistono constanti c > 0 e n0 ≥ 0
tali che f(n) ≤ c · g(n) per ogni n ≥ n0.
n0
Ex. f(n) = 32n2 + 17n + 1.
f(n)
c · g (n)
per c = 32, n0 = 1
n
n0
scegliendo c = 50, n = 1
・f(n) è O(n2).
・f(n) è anche O(n3).
・f(n) non è O(n) né O(n log n).
・c è O(1) (ogni costante è “equivalente” ad 1)
・log n è O(n)
[es. (log n10)7 è O(n0.0001) ]
・(log nk)m è O(na) per ogni k, m e a > 0
k
n
[es. n1000 è O(0.0001n) ]
・n è O(a ) per ogni k e a
n
・a è O(n!) per ogni a
n
Uso. La notazione O servirà per esprimere limiti superiori alle risorse usate
0
da un algoritmo. La notazione Ω servirà per esprimere limiti inferiori alle
risorse usate da un algoritmo.
Affermazioni da evitare. Ogni algoritmo di ordinamento basato su confronti
richiede almeno O(n log n) confronti nel caso peggiore.
14
Ω() e O() sono duali
15
Notazione
Dualità.
Θ (Theta-notation)
Limiti inferiori e superiori. f(n) è Θ( g (n)) se esistono costanti c1 > 0, c2 > 0, n0 ≥ 0
・f(n) è Ω( g (n)) se e solo se g(n) è O(f(n))
tali che c1 · g (n) ≤ f(n) ≤ c2 · g (n) for all n ≥ n0.
c2 · g (n)
f(n)
basta notare che f(n) = Ω( g (n)) se e solo se esistono costanti c, n0 > 0
Es. f(n) = 32n2 + 17n + 1.
con c = 32, c
・f(n) is Θ(n2).
3).
f(n)
non
è
Θ(n)
né
Θ(n
・
tali che f(n) ≥ c g(n)
1
quindi se e solo se, per c’ = 1/ c, vale g(n) ≤ c’ f(n)
cioè g(n) = O( f (n))
c1 · g(n)
2
= 50, n0 = 1
n0
・c = O(1)
・loglog n = O(log n)
・log n = O(n)
・(log nk)m = O(na) per ogni k, m e a > 0
・nk = O(an) per ogni k e a
・an = O(n!) per ogni a
・c = Ω(1)
・log n = Ω(log n)
・n = Ω(log n)
・na = Ω(log nk)m per ogni k, m e a > 0
・an = Ω(nk) per ogni k e a
・n! = Ω(an) per ogni a
n
Uso. L’algoritmo maxsubarray3 esegue Θ(n log n) operazioni su un array di n
elementi.
Nota. f(n) è Θ( g (n)) se e solo se valgono entrambe
・f(n) è O( g (n))
・f(n) è Ω( g (n))
16
17
Regole Utili (le mostriamo per O, ma valgono anche per Ω e
Θ)
Regole Utili (le mostriamo per O, ma valgono anche per Ω e
Le costanti non contano.
Θ)
Somma e transitività per O
・Se f (n) = O(g(n)) allora a f(n) = O(g(n)), per ogni costante a > 0
・Es. log n = O(n) allora anche 10 log n = O(n)
・Se f(n) = O(g(n)), d(n) = O(e(n)), e g(n) = O(e(n)) allora f(n) + d(n) = O(e(n))
・Es. log n = O(√n), 3n2 = O(n2) allora anche log n + 3n2 = O(n2)
Somme.
・Se e(n) = O(g(n)), f (n) = O(h(n)), allora e(n) + f(n) = O(g(n) + h(n))
・Es. log n = O(√n), 3n2 = O(n2) allora anche log n + 3n2 = O(√n + n2)
Somma e transitività per Ω
・Se f(n) = Ω(g(n)),
d(n) = Ω(e(n)), e g(n) = O(e(n)) allora
- f(n)+d(n) = Ω(g(n)) e anche
f(n)+d(n) = Ω(e(n))
Prodotti.
・Se e(n) = O(g(n)), f (n) = O(h(n)), allora e(n) f(n)
・Es. log n = O(√n), 3n2 = O(n2) allora anche
・Es. √n = Ω(log n), n log n = Ω(n)
= O(g(n) h(n))
3n2log n = O(n2√n)
allora
- √n + n log n = Ω(n)
- √n + n log n = Ω(log n)
Transitività.
・Se f(n) = O(g(n)), g(n) = O(h(n)), allora f(n) = O(h(n))
・Es. log n = O(√n), √n = O(n/log n) allora anche log n = O(n/log n)
18
Altri metodi utili per verificare ordini crescita
Proposizione. Se nlim
19
Notazione O-grande per funzioni a più variabili
f (n)
= c > 0 , allora f (n) è Θ(g(n)).
g(n)
Limiti superiori. T(m, n) è O( f (m, n)) se esistono costanti c > 0, m0 ≥ 0,
e n0 ≥ 0 tali che T(m, n) ≤ c · f (m, n) per ogni n ≥ n0 e m ≥ m0.
DIM. Per definizione di limite, esiste n0 tale che per ogni n ≥ n0
Es. T(m, n) = 32mn2 + 17mn + 32n3.
1
f (n)
c <
< 2c
2
g(n)
・T(m, n) è sia O(mn2 + n3) che O(mn3).
・T(m, n) non è O(n3) né O(mn2).
・Quindi, f (n) ≤ 2 c g(n) per ogni n ≥ n0, il ché implica f (n) è O(g(n)).
・Analogamente, f (n) ≥ ½ c g(n) per ogni n ≥ n0, quindi f (n) is Ω(g(n)).
Proposizione. Se
lim
n
Esempi di uso. Visita per ampiezza di un grafo (breadth-first search) cammino
minimo tra due vertici in un grafo diretto.
f (n)
= 0, allora f (n) è O(g(n)).
g(n)
20
21
Analisi di complessità di un algoritmo
Tempo di esecuzione: operazioni elementari
Ci concentriamo sulla risorsa TEMPO
Numero di operazioni elementari eseguite
・tempo di esecuzione in funzione della taglia dell’input
・operazioni aritmetiche, confronto tra elementi, seguire un puntatore, etc.
・assumiamo che ogni operazione elementare richieda tempo Θ(1)
Tempo di esecuzione
・numero di operazione elementari eseguite sull’istanza
・quale istanza?
Calcolo della complessità (di tempo)
・operazioni di assegnamento di variabili: costo Θ(1)
・istruzioni condizionali (if ... then ... else): costo pari al tempo del test (in
genere Θ(1)) più il costo dell’alternativa più costosa
Taglia dell’input
・
・istruzioni di iterazione (loop while, repeat, for) : costo pari alla somma su
come la misuriamo?
tutte le iterazioni del costo delle istruzioni eseguite nell’iterazione
Funzione della taglia dell’input
・useremo le notazioni asintotiche
Funzioni ricorsive
・analisi delle ricorrenze (lo vedremo quando servirà)
- esempio: maxsubarray2 (albero di ricorsione)
22
23
Tempo di esecuzione: Quale istanza usiamo
Tempo di esecuzione: analisi alternativa - caso medio
Il running time di un algoritmo può dipendere dalla forma dell’input
Worst case. Limiti al running time per ogni input di taglia n.
・es. ordinare una lista già ordinata
・cercare un elemento scorrendo una lista
Es. Trovare il massimo di n elementi richiede al massimo n confronti.
- l’elemento è il primo
Caso Medio. Expected running time per un input random di taglia n.
- l’elemento non è presente
Problemi. quale distribuzione di probabilità va considerata?
Worst case. Limiti sul running time che valgono per ogni input di taglia n.
・In genere coincide con l’efficienza verificata in pratica.
・Punto di vista pessimistico! perchè dovremmo ignorare il caso pessimo?
Eccezioni. Esistono alcuni algoritmi esponenziali usati in pratica perché le
istanze che determinano il caso pessimo (esponenzialità) sembrano essere
rare.
simplex algorithm
24
25
Taglia dell’input
Riassumendo
Numero di elementi che lo costituiscono
L’algoritmo A ha complessità (di tempo) T(n) = O(n2) significa:
・l’input è un array o una lista: il numero di elementi
・l’input è un grafo: il numero di vertici e il numero di archi
・moltiplicazione di matrici: le dimensioni delle matrici
・A non richiede al più tempo cn2
per dare l’output,
- per un opportuna costante c
- per ogni input di taglia n sufficientemente grande
Il numero di bit che servono per rappresentare l’input
L’algoritmo A ha complessità (di tempo) T(n) = Ω(n2) significa:
・moltiplicazione tra due numeri
・A richiede tempo almeno cn2
prima di fornire l’output
- per un opportuna costante c e
- per almeno un input di taglia n sufficientemente grande
Relazione tra le due misure
・Assumendo che
- ogni elemento dell’input entri in una parola di memoria
Sottintendiamo il caso peggiore in entrambe le affermazioni
・Il limite superiore si estende a tutti i casi
・il limite inferiore garantisce tutti i casi
・non significa che ogni caso necessita almeno del tempo dato come limite
- ogni istruzione macchina richieda tempo costante
・in generale esiste una relazione tra le due misure che è data dalla taglia
della parola di memoria che si utilizza
inferiore
26
27
Esempi ed esercizi
Esempi ed esercizi
Utilizzando la notazione Θ si stimi la complessità dei seguenti stralci di
Utilizzando la notazione Θ si stimi la complessità dei seguenti stralci di
codice:
codice:
1.
for i = 1 to 2n
4.
if x è pari then
i = n
while i ≥ 1 do
x = x-1
else
x = x+1, i = i/2
x = x+2
2.
5.
j = n
while j ≥ 1 do
for i = 1 to 3n
for i = 1 to j
for j = 9 to n
x = x + i - 1
x = x + 1
3.
j = j/2
for i = 1 to n
for j = 1 to i
for k = j to i
x = x + 1
28
29
a
n
n
a n= n
a0log
= n log
.
= anche
a a che per
per ogni
. aQuindi vale
ogni
n a n0 n
si ha
per ogni
n0 . Quindi
vale anche
ogni n nn0 si ha
⇣ n che
⌘logper
4 calcolare
progressioni
geometriche
Per un qualche
↵ 6=n 1 Vogliamo
n
an
n
loga n
a
=
a
nk .
=
aloga n loga n = n loga n
4 progressioni
⇣ n ⌘logageometriche
n
n
n
↵ 6= 1 Vogliamo
n Per un
n
k
nX
Alcune autili
matematiche
=relazioni
a logaqualche
= n loga n nk .
= aloga n logacalcolare
j
Per un qualche ↵ 6= 1 Vogliamo
calcolare
↵
4 progressioni geometrichek
Esempi ed esercizi
Utilizzando la notazione Θ si stimi la complessità dei seguenti stralci di
4
Otteniamo
codice:
6.
(↵
i = n
while i ≥ 1 do
for j = 1 to n
progressioni geometriche
↵j
per
calcolare
qualche
↵ 6= 1Otteniamo
Vogliamo
kPer un ・
k
kvogliamocalcolare
X
X
X
Otteniamo
j=0 k
kj
k
1)
↵j =
↵j+1
↵
X
X
X
j+1
k
k (↵
k ↵j
k
X
X
X
1)
=
↵
↵j
j=0
j=0 XOtteniamo
j=0
j
j+1
j j
(↵ 1)
↵ = j=0 ↵
↵↵
j=0
j=0
n+1
0
1
k j=0 ↵ X
k ↵
= ↵1 +j=0
↵2 + ·X
·k· + j=0
↵n + ↵
↵n n
X
1
2
j=0
j=0
=
j
j+1
↵
k
X
+ ↵ +j · · · + ↵ + ↵n+1
↵0
↵1
↵n
=
n
n 2
0 ↵ n+1 1 0 2 1
↵++↵↵
·n+1
· · +1↵n↵+
↵↵ ↵
= ↵1 +(↵↵2 1)
+ ·=· ·↵+↵1↵+
+ · · ·↵+
↵n 0
2↵ ↵ +
j=0
j=0
j=0
=
↵
+
↵
+ ·n+1
· · + ↵n0 + ↵n+1
↵1 + ↵2 + · · · + ↵n
1
2
n
1
2↵
Otteniamo
n+1
0 = n+1
↵
+
↵
+
·
·
·
+
↵
+
↵
↵
↵
+
↵
+n · · · + ↵n
1
2
n
n+1
0
1
= ↵
↵ = ↵ = 1.
↵=+ ↵↵n+1
+ ··· +
↵
↵
↵
↵0↵ =+↵↵n+1 1.
n+1
0
↵
= ↵↵2n+1
k
k= ↵ = X
k1 +
↵
+ · · · 1.
+ ↵n + ↵n+1 ↵0
↵1 + ↵2 + · · · + ↵n
X
X
j+1
j
Da cui(↵
si ottiene
1)
↵j = kDa ↵cui
si=ottiene
↵n+1↵ ↵0 = ↵n+1k 1.
Da cui si ottiene
n+1
X
n+1
X
↵ j=0X
k 1
1
j=0
j=0 j
↵n+1 ↵
1j = ↵
=
quindi Da cui ↵
j
・
si
ottiene
↵
=
1
2
n k n+1
0
1 1 n
↵
1
↵
= j=0
↵ + ↵ + · · · + ↵ + ↵ ↵ 1 n+1
↵
↵
↵
x = x + 1
i = i/2
7.
X
j=0
k
↵j
X
Sommatorie
potenze
(progressioni)
Per un
qualchesuccessive
↵ 6= 1 Vogliamo
calcolare
j
↵
j=0
i = 2
while i < n do
j=0
i = i * i
x = x + 1
30
Per ↵ < 1 abbiamo
Esempi ed esercizi
Esempi ed esercizi
X
j=0↵
↵j =
1
2
↵1 +
· · · + ↵nj=0+ ↵n+1↵ ↵1 0
↵1 + ↵2 + · · · + ↵n
Per
↵↵
< 1+abbiamo
Per ↵ < 1 abbiamo
Per ↵ =
< 1 abbiamo
n+1
=kPer↵↵n+1
↵0 X
=
1.kn+1
< 1 abbiamo
k ↵
n+1
1 ↵n+1
X
1 X
↵ j
1
↵
j
j
↵ ==⇥(1)
= ⇥(1)
↵
=
Per α < 1,↵otteniamo
quindi
k
=
=X
⇥(1)
・
n+1
1 ↵
1j j=0↵1 ↵
1
↵
j=0
Da cui -si ottiene
↵
=
=
⇥(1)
j=0
il numeratore
è < 1k
X j=0 ↵n+1 1 1 ↵
n+1
poichè
0
<
1
↵
1 euna
1↵n+1
↵j è=
poichè
0
<è
<una
1 e costante.
1 ↵ è una costante.
↵costante
n+1 il denominatore
poichè 0 < 1 ↵
< 1 poichè
e 1 0↵<è 1una↵n+1
costante.
1 costante.
< 1 e 1 ↵↵è una
j=0
k
X
31
↵n+1
= ⇥(1)
1 ↵algoritmo
Valutare la complessità del seguente
j=0
Valutare la complessità del seguente algoritmo
poichè 0 < 1
Algoritmo (A[1,...n]
for i = 1 to n
↵n+1 < 1 e 1
↵j =
1
↵ è una costante.
Moltiplica (y, z)
2
x = 0
B[i] = A[i]
2
2
while z >2 0 do
for i = 1 to n
if z è dispari then x = x+y
j = n
y = 2*y
while j > i do
z = z/2 // troncato all’intero
B[i] = B[i] + A{i]
return x
j = j - 1
for i = 1 to n
t = t + B[i]
2
32
33
Altri esempi - O(n3)
Altri esempi
Insiemi disgiunti. Dati n insiemi S1, …, Sn ognuno un sottinsieme di
Insieme Independente di taglia k. Dato un grafo, esistono k nodi tali che
1, 2, …, n, esiste una coppia di insiemi disgiunti?
nessuna coppia tra essi è unita da un arco?
Soluzione. Per ogni coppia di insiemi, verifica se sono disgiunti.
Soluzione. Enumera tutti i sottinsiemi di k nodi.
k is a constant
foreach subset S of k nodes {
check whether S in an independent set
foreach set Si {
if (S is an independent set)
foreach other set Sj {
report S is an independent set
foreach element p of Si {
}
determine whether p also belongs to Sj
}
}
・Verificare se S, (|S| = k) è indipendente richiede tempo O(k2). (perché?)
・numero sottinsiemi di taglia k = nk = n(n k(k1)(n 1)(k2) ·2)· · ·(n· · 1k + 1)
・O(k2 nk / k!) = O(nk).
if (no element of Si belongs to Sj)
report that Si and Sj are disjoint
}
}
nk
k!
polinomiale per k=17,
ma sicuramente poco pratico
34
Tempo Esponenziale
Insieme Independente. Dato un grafo, qual è la massima cardinalità di un
insieme indipendente?
Soluzione. Enumera tutti i sottinsiemi e verifica se sono indipendenti.
S* ← φ
foreach subset S of nodes {
check whether S in an independent set
if (S is largest independent set seen so far)
update S* ← S
}
}
Tempo O(n2 2n) : Il numero di sottinsiemi di un insieme di n elementi è 2n
36
35