Sei sulla pagina 1di 6

Complessit asintotica, note didattiche

3 marzo 2017

1 Ordini di grandezza asintotica


In questa nota tutte le funzioni considerate sono da N in R e sono asintoticamente non negative, ossia non
negative da un certo punto in poi. Appartengono certamente a questo insieme le funzioni T (n) che limitano
la complessit in tempo degli algoritmi.
Definizione 1. Si definiscono i seguenti insiemi di funzioni da N in R asintoticamente non negative, detti
ordini di grandezza asintotica delle funzioni:

1. f (n) 2 O(g(n)) , 9c > 0, n0 8n > n0 . f (n) cg(n)


2. f (n) 2 (g(n)) , 9c > 0, n0 8n > n0 . cg(n) f (n)
3. f (n) 2 (g(n)) , 9c1 , c2 > 0, n0 8n > n0 . c1 g(n) f (n) c2 g(n)

Scopo della definizione attribuire le funzioni tempo T (n) agli insiemi O(g(n)), (g(n)) e (g(n)) onde
caratterizzarne la velocit di crescita mediante funzioni g(n) in genere pi semplici da descrivere.
Tra i tre diversi modi di definire gli ordini di grandezza sussiste la seguente relazione:
Proposizione 1.
(f (n)) = O(f (n)) \ (f (n)).
Dimostrazione. Linclusione da sinistra a destra immediata; per provare quella da destra a sinistra si
osservi che se g(n) 2 O(f (n)) \ (f (n)) allora esistono c1 , c2 > 0 tali che g(n) c2 f (n) da un certo n0 in
poi e c1 f (n) g(n) da un certo n1 in poi; dunque c1 f (n) g(n) c2 f (n) da max{n0 , n1 } in poi.
La notazione f (n) 2 O(g(n)) spesso sostituita da f (n) = O(g(n)), ed analogamente per e . Queste
notazioni si leggono come equazioni unidirezionali, ossia non sono simmetriche, perch tra sinistra e destra vi
perdita dinformazione. Tuttavia la notazione equazionale consente di esprimere pi brevemente propriet
algebriche delle funzioni e dei relativi ordini di grandezza.

1.1 Propriet
Elenchiamo qui di seguito alcune propriet utili degli ordini di grandezza:
Proposizione 2.
1. Riflessivit: cf (n) = O(f (n)), dove c > 0 costante, anche per ,
2. Transitivit: g(n) = O(f (n)) ^ f (n) = O(h(n)) ) g(n) = O(h(n)), anche per ,
3. Simmetria: g(n) = (f (n)) , f (n) = (g(n))
4. Trasposizione: g(n) = O(f (n)) , f (n) = (g(n))
5. Somma: f (n) + g(n) = O(max{f (n), g(n)}), anche per ,
6. Prodotto: g(n) = O(f (n)) ^ h(n) = O(q(n)) ) g(n)h(n) = O(f (n)q(n)), anche per , .

1
Dimostrazione. Le dimostrazioni sono tutte dirette e simili tra loro. Per esempio dimostriamo:

g(n) = (f (n)) , f (n) = (g(n))

stabilendo la sola implicazione da sinistra a destra, essendo quella da destra a sinistra del tutto analoga.
Dallipotesi g(n) = (f (n)) segue che per certe costanti c1 , c2 > 0 si ha quasi ovunque (abbreviato q.o.):

c1 f (n) g(n) c2 f (n).

Ora
1 1
c1 f (n) g(n) ) f (n) g(n), g(n) c2 f (n) ) g(n) f (n) q.o.
c1 c2
dove si osservi che, essendo c1 , c2 positive, 1/c1 e 1/c2 sono tali. Ne segue che f (n) = (g(n)).
Esempio 1. Le propriet nella Proposizione 2 sono sucienti per stabilire facilmente lappartenenza di
polinomi ad opportuni ordini di grandezza. Si vuole provare che:

f (n) = 4n2 + 4n 1 = O(n2 ).

Infatti usando (1) abbiamo che:

4n2 = O(n2 ), 4n = O(n), 1 = O(1).

Quindi, usando la (5) due volte:

f (n) = O(n2 ) + O(n) + O(1) = O(max{n2 , n, 1}) = O(n2 ).

Dal momento che le (1) e (5) valgono anche per e se ne conclude che f (n) = (n2 ) e f (n) = (n2 ).

La Proposizione 2 suggerisce la definizione delle seguenti relazioni:


Definizione 2.
1. f 4 g , f (n) = O(g(n)) , g(n) = (f (n))

2. f g , f (n) = (g(n)).
Per le prorpiet (1)-(3) degli ordini di grandezza, f g una relazione dequivalenza. Per le prorpiet
(1)-(2), f 4 g un pre-ordine. Non in generale antisimmetrico, ma se identifichiamo le funzioni a meno
della relazione , allora 4 un ordine parziale (detto in modo pi rigoroso, lestensione di 4 alle classi di
equivalenza di un ordine parziale).
Si noti che f 4 g equivale allinclusione insiemistica dei rispettivi ordini di grandezza:

f 4 g , O(f (n)) O(g(n)) , (g(n)) (f (n)).

1.2 Ordini di grandezza e limiti


Definizione 3. Si definisca linsieme di funzioni o(g(n)):

f (n)
f (n) 2 o(g(n)) , lim =0
n!1 g(n)

Lappartenenza allinsieme o(g(n)) definisce la relazione:

f g , f (n) 2 o(g(n)).

Come per gli altri ordini di grandezza, usiamo la notazione f (n) = o(g(n)); quando f (n) = o(g(n)) ovvero
f g, si dice che f un infinitesimo di g. Evidentemente solo transitiva, e non riflessiva.

2
Proposizione 3.
f (n) = o(g(n)) ) f (n) = O(g(n)) ^ g(n) 6= O(f (n)).
f (n)
Dimostrazione. Se limn!1 g(n) = 0 allora per ogni " > 0 esiste n0 tale che per ogni n > n0 :

f (n)
0 <" ossia 0 f (n) < "g(n).
g(n)

Ne segue immediatamente f (n) = O(g(n)) essendo " un reale positivo (arbitrario).


Per provare che g(n) 6= O(f (n)) assumiamo per assurdo che g(n) = O(f (n)). Allora per qualche c > 0 si ha
g(n) cf (n) da un certo n0 in poi; ma dividento per cg(n) da ambo le parti si ha:

1 f (n)
g(n) cf (n) ) 0 < q.o.
c g(n)
f (n)
Preso allora " = 1/c, lultima diseguaglianza contraddice lipotesi che limn!1 g(n) = 0.
In generale limplicazione inversa non vale, non essendo suciente lipotesi f (n) = O(g(n)) ^ g(n) 6=
O(f (n)) a garantire che il limite limn!1 fg(n)
(n)
esista. Tuttavia sotto questa ipotesi si possono dimostrare i
seguenti asserti:
f (n)
Proposizione 4. Se limn!1 g(n) = a, dove a 1, allora:

1. 0 a < 1 ) f (n) = O(g(n))

2. 0 < a 1 ) f (n) = (g(n))


3. 0 < a < 1 ) f (n) = (g(n))
La dimostrazione della Proposizione 4 analoga a quella della Proposizione 3, ed lasciata come esercizio.

Esempio 2. Lo studio del limite del rapporto f (n)/g(n) quando n ! 1 utile per mostrare sia lapparte-
nenza che la non la non appartenenza di una funzione ad un ordine O-grande. Siano

f (n) = n log2 n + 3n, g(n) = n2 .

Derivando numeratore e denominatore abbiamo:


(n log2 n + 3n)0 n0 (log2 n) + n(log2 n)0 + 3n0 log2 n + log2 e + 3
= =
(n2 )0 2n 2n

Derivando ancora numeratore e denominatore abbiamo:


(log2 n + log2 e + 3)0 1/n log2 e (log2 e)/2
0
= =
(2n) 2 n

Applicando quindi la regola di de lHpital si ottiene che:

f (n) (log2 e)/2


lim = lim = 0.
n!1 g(n) n!1 n

Da questo discende che f (n) = n log2 n + 3n 2 o(n2 ) O(n2 ). Poich daltra parte

n log2 n + 3n n
lim = lim (log2 n + 3) = 1 ovvero lim =0
n!1 n n!1 n!1 n log2 n + 3n

per la Proposizione (3) concludiamo n log2 n + 3n 62 O(n).

3
1.3 Fattoriale
Proposizione 5. Quasi ovunque 2n n! nn .

Dimostrazione. Dimostriamo dapprima che se n 4 allora 2n n! per induzione su n. Se m = 4 allora

2n = 24 = 16 < 4! = n!

Se n > 4 ossia n 1 4 allora per ipotesi induttiva 2n 1


(n 1)! e dunque, visto che n > 4 > 2:

2n = 2n 1
2 < (n 1)! n = n!.

Dimostriamo poi che se n 1 allora n! nn per induzione su n. Se n = 1 allora

1! = 1 = 11

Se n > 1 onde n 1 1 e quindi per ipotesi induttiva (n 1)! (n 1)n 1


, si ha

n! = (n 1)! n (n 1)n 1
n < nn 1
n = nn .

La seguente proposizione utile nella limitazione inferiore alla complessit degli algoritmi per lordina-
mento di una sequenza basati su confronti.
Proposizione 6. log2 n! 2 (n log n).
Dimostrazione. Dalla Proposizione 5 sappiamo che n! nn quasi ovunque (in realt da 1 in poi). Poich
log2 monotona ne segue immediatamente

log2 n! log2 nn = n log2 n 2 O(n log n).

Sfruttando la definizione di n! e le propriet del logaritmo si ha che:

log2 n! = log2 (1 2 3 . . . n) = log2 1 + log2 2 + log2 3 + . . . + log2 n (1)

Daltronde
log2 1 + . . . + log2 dn/2e + . . . + log2 n log2 dn/2e + . . . + log2 n
log2 dn/2e + . . . + log2 dn/2e
| {z }
dn/2e
= dn/2e(log2 dn/2e)
n/2 log2 n/2
Da questo e dalla (1) otteniamo che
n n n 1 1
log2 n! log2 = (log2 n 1) = n log2 n n 2 (n log n).
2 2 2 2 2
Dalla Proposizione 1 si conclude che

log2 n! 2 O(n log n) \ (n log n) = (n log n).

4
2 Complessit temporale degli algoritmi
Nello studio della complessit temporale di un algoritmo A possiamo procedere in due modi. Il primo
consiste nel costruire la funzione tempo TA (n) utilizzando una tabella dei costi e delle volte, per poi cercare
una funzione f (n) pi semplice tale che TA (n) = O(f (n)) o meglio TA (n) = (f (n)). Il secondo, illustrato
qui, lascia implicita TA e ne deduce lordine di grandezza limitando porzioni dello pseudo-codice.
Se nellalgoritmo abbiamo istruzioni della forma:

istruzione di costo O(f (n))


istruzione di costo O(g(n))

allora la sequenza avr costo O(f (n)) + O(g(n)) = O(max{f (n), g(n)}).
Se nellalgoritmo abbiamo una selezione:

if test di costo O(f (n) then


istruzione di costo O(g(n))
else
istruzione di costo O(h(n))
end if

allora il test verr eseguito comunque prima delle alternative, mentre nel caso peggiore il costo delle
alternative sar limitato da O(max{g(n), h(n)}); in conclusione la selezione avr costo:

O(f (n)) + O(max{g(n), h(n)}) = O(max{f (n), g(n), h(n)}).

Infine se nellalgoritmo abbiamo uniterazione della forma:

for i 1 to m do
istruzione di costo O(f (n))
end for

allora literazione ha costo m O(f (n)) = O(mf (n)).


Lo stesso criterio applicabile ad un ciclo controllato da un while quando si sappia limitare il numero
delle iterazioni, cosa non sempre facile come nel caso di un ciclo controllato da un for.
Esempio 3. Consideriamo il seguente algoritmo, che calcola lindice del valore minimo in un array B di m
interi:
Ind-Min(B) . length(B) = m
1: k 1
2: for i 2 to length(B) do
3: if B[k] > B[i] then
4: k i
5: end if
6: end for
7: return k

Le linee 1, 4 e 7 hanno costo costante c1 , c2 , c3 , quindi applicando la propriet di Riflessivit abbiamo


ci = O(1) per i = 1, 2, 3. Il test alla linea 3 ha pure costo costante, dunque O(1), onde lif delle linee 3-4
ha costo O(1) + O(1) = O(1).
Il corpo del for viene eseguito m 1 volte, quindi il for delle linee 2-6 ha costo (m 1)O(1) = O(m 1) =
O(max{m, 1}) = O(m). In conclusione abbiamo:

TIndM in (m) = O(1) + O(m) + O(1) = O(max{m, 1}) = O(m).

5
Consideriamo ora una versione del Select-Sort che usa Ind-Min per la selezione del minimo nella
porzione da ordinare:
Select-Sort(A) . length(A) = n
1:for i 1 to length(A) 1 do
2: k Ind-Min(A[i..length(A)])
3: scambia A[i] con A[k]
4:end for
5:return A
Le linee 3 e 5 hanno costo costante e quindi O(1). La linea 2 ha costo:

TIndM in (length(A[i..n]))) = O(n i + 1) = O(max{n, i, 1}) = O(n)

perch i length(A) 1 < n. Quindi il corpo del for, linee 2-3, ha costo O(n) + O(1) = O(n). Infine le
iterazioni del for delle linee 1-4 sono n 1, ragion per cui abbiamo:

TSelSort (n) = (n 1) O(n) + O(1) = O(n2 ) + O(1) = O(max{n2 , 1}) = O(n2 ).

Poich della Poposizione (2) abbiamo utilizzato propriet valide anche per , possiamo concludere che

TSelSort (n) = (n2 ).

Potrebbero piacerti anche