Documente Academic
Documente Profesional
Documente Cultură
Sinteze 1 PDF
Sinteze 1 PDF
ALGORITMI SI COMPLEXITATE
Definiţie: Un algoritm este o procedură (o mulţime finită de reguli bine definite) care
îndeplineşte un obiectiv precis. Algoritmul pleacă de la o stare iniţială şi se termină într-o
stare finală.
Un exemplu simplu de algoritm este reţeta de bucătărie. Majoritatea algoritmilor sunt mai
c o m p l e c ş i : a u p a ş i c a re s e r e p e t ă , n e c e s i t ă d e c i zi i . M a i m u l t , a l g o r i t m i i p o t f i c o m p u ş i
pentru a crea alţi algoritmi.
I n i ţ i a l c o n c e p t u l d e a l g o r i t m a r e p r e ze n t a t o p r o c e d u r ă p e n t r u r e zo l va r e a u n e i p r o b l e m e
matematice (ex. găsirea divizorului comun a două numere, înmulţirea a două numere).
Î n f o r m a s a a c t u a l ă , c o n c e p t u l a f o s t f o r m a l i za t d e c ă t r e A l a n T u r i n g ş i A l o n zo C h u r c h î n
lucrările lor "Maşini Turing" şi respectiv "Lambda Calcul".
Algoritmii sunt esenţiali în procesarea informaţiei în calculator deoarece un program de
calculator este practic, un algoritm. Din acest punct de vedere, algoritmul poate fi
considerat ca "o secvenţă de operaţii care pot fi executate de către un sistem Turing
c o m p l e t " . E xi s t ă d e f i n i ţ i i a l e n o ţ i u n i i d e a l g o r i t m i c a r e î i l e a g ă d e " Ma ş i n a T u r i n g " ( $ 1 . 2 ) .
Definiţie: Un algoritm este un proces de calcul definit de către o maşină Turing (Gurevich,
2000).
D e o a r e c e p r o c e s e a ză i n f o r m a ţ i e , a l g o r i t m u l c i t e ş t e d a t e d e l a u n di s p o zi t i v ş i p o a t e
î n r e g i s t r a ( s a l v a ) d a t e n e c e s a r e a l t o r p r o c e s ă r i . D a t e l e s a l va t e s u n t p r i vi t e c a o p a r t e a
stării interne a algoritmului. În practică astfel de stări sunt înregistrate în "structuri de
date". Un algoritm necesită şi date interne pentru operaţii specifice. Acestea se numesc
"tipuri de date abstracte".
E x e m p l u : U n a l g o r i t m c a r e v e r i f i c ă d a c ă e xi s t ă m a i m u l t d e u n ze r o î n t r - o s e c ve n ţ ă i n f i n i t ă
de cifre binare aleatoare trebuie să se execute la infinit.
Exemplul 1: Un algoritm care găseşte cel mai mare număr dintr-o listă de numere.
Limbaj natural:
1. Adm item că prim ul element este cel m ai m are.
2. Examinează fiecare din elementele rămase în listă şi dacă este mai mare decât "cel mai
mare", at unci notează acest fapt (not ează-l ca fiind "cel mai mare").
3. Ultimul element notat este "cel mai mare".
Pseudocod :
Intrare: O listă L de elemente nevidă
Ieşire: Cel mai mare element din lista L
cel_mai_mare ← L0
for element în L >1 do
if (element > cel_mai_mare) then
cel_mai_mare ← element
end_if
return cel_mai_mare
Exemplul 2: Algoritmul lui Euclid pentru aflarea celui mai mare divizor comun a două
numere naturale.
Limbaj natural:
Fiind date două numere naturale a şi b, testează dacă b este zero. Dacă da, a este cel mai mare
divizor comun. Dacă nu, repetă procesul utilizând pe b şi ce rămâne după împărţirea lui a la b.
Pseudocod:
function cmmdc(a, b)
end_if
sau
function cmmdc(a, b)
while a ≠ b do
end_while
În multe cazuri se doreşte a se recunoaşte, pentru un algoritm dat, câte resurse particulare
s u n t n e c e s a r e ( t i m p d e e xe c u ţ i e , m e m o r i e d e s t o c a r e ) . E s t e vo r b a d e s p r e " a n a l i za
algoritmilor". Aceasta depinde de "clasificarea algoritmilor".
Cl as if ic ar e f u nc ţ i e d e i m plem en tar e :
• r e c u r s i v i ( s e i n v o c ă p e e i î n ş i ş i ) ⁄ i t e r a t i v i ( a u c o n s t r u c ţ i i r e p e t i t i ve ) ;
• l o g i c i ( c o n t r o l e a ză d e d u c ţ i i l o g i c e ) ;
• s e r i a l i ( u n s i n g u r p r o c e s o r ş i o s i n g u r ă i n s t r u c ţ i u n e e xe c u t a t ă l a u n m o m e n t d a t ) ⁄
p a r a l e l i ( m a i m u l t e p r o c e s o a r e c a r e e xe c u t a i n s t r u c ţ i u n i î n a c e l a ş i t i m p ) ;
• d e t e r m i n i s t i c i ( o d e c i z i e e x a c t ă l a f i e c a r e p a s ) / n e d e t e r m i n i s t i c i ( r e zo l v ă p r o b l e m a
plecând de la presupuneri);
Cl as if ic ar e f u nc ţ i e d e dom en i u l d e s tu d i u – a l gor i tm ii s u nt :
de c ă ut ar e, d e s o r tar e , n um er ic i , a l g or itm i d e gr af ur i, de g eom etr i e
c om put aţ i o na l ă, de î n v ăţ ar e au t om ată , d e c r i pt o gr af ie , etc .
C l a s i f i c a r e f u n c ţ i e d e c o m p l e xi t a t e
U n i i a l g o r i t m i s e î n c h e i e î n t r - u n t i m p l i n e a r , a l ţ i i î n t i m p e xp o n e n ţ i a l , i a r a l ţ i i n u s e
î n c h e i e . D i n a c e s t p u n c t d e v e d e r e a l g o r i t m i i s u n t c l a s i f i c a ţ i î n c l a s e d e e c h i va l e n ţ ă b a za t e
p e c o m p l e xi t a t e .
In continuare noi vom fi interesaţi de acest ultim tip de clasificare.
P e n t r u a f o r m a l i z a c o n c e p t e l e l e g a t e d e ″ C o m p l e x i t a t e a A l g o r i t m i l o r ″ e s t e n e vo i e d e u n
model computaţional. Un astfel de model este ″Maşina Turing″.
D e f i n i ţ i a 3 . U n l i m b a j L p e s t e Σ e s t e o s u b m u l ţ i m e a l u i Σ∗ . C o m p l e m e n t u l l u i L e s t e
L c = Σ∗ L . C u v i n t e l e î n Σ ∗ p o t f i p u s e î n o r d i n e l e x i c o g r a f i c ă . A s t f e l :
− p e n t r u ∀ n ∈ N c u v i n t e l e d e l u n g i m e n p r e c e d ă c u v i n t e l e d e l u n g i m e (n + 1) ;
− pentru orice lungime, ordinea este alfabetică.
M a ş i n a Tu r i n g c o n s t ă d i n u r m ă t o a r e l e :
a . k ≥ 1 b e n z i i n f i n i t e î n d o u ă d i r e c ţ i i . B e n zi l e s u n t c o n s t i t u i t e d i n t r - u n n u m ă r i n f i n i t d e
celule în ambele direcţii. Fiecare bandă are o celulă distinctă, ″celula de start″ sau ″celula
0″. În fiecare celulă a fiecărei benzi, se poate scrie un simbol al unui alfabet Σ . Se poate
admite şi ″celula goală″, care conţine ″simbolul nul″ al alfabetului.
b. Fiecare bandă are un cap de citire/scriere şi fiecare pas al acestuia se face pe bandă.
Deplasarea poate fi Le ft, Righ t, S tay.
c. O unitate centrală care este un automat finit. Stările acestuia sunt din mulţimea Q .
E xi s t ă o s t a r e d i s t i n c t ă ″ S T A R T ″ ş i u n a ″ S T O P ″ . U n e l e m a ş i n i Tu r i n g i a u î n c o n s i d e r a ţ i e o
s u b m u l ţ i m e F a l u i Q c a f ii n d m u l ţ i m e a d e s t ă r i f i na l e . L a f i e c a r e p a s , a u to m a t u l s e a f l ă
î n t r - o s t a r e qi , a v â n d c a i n t r ă r i k s i m b o l u r i ( d e p e c e l e k b e n zi ) p e c a r e c a p e t e l e d e c i t i r e
l e c i t e s c ( s i m b o l u r i l e c u r e n t e ) . I e ş i r e a e s t e r e p r e ze n t a t ă d e a l t e k si m b o l u r i p e c a r e
c a p e t e l e l e s c r i u p e b e nz i l e c o r e s p u n ză t o a r e ( s i m b o l u r i l e n o i ) s i o n o u a s t a r e qj . Fiecare
c a p ă t e xc u t ă a p o i o d e p l a s a r e s â n g a , d r e a p t a s a u s t ă p e l o c .
q' : s t a r e a n o u ă .
E n u m e r a m c â t e v a e l e m e n t e c a r e c a r a c t e r i ze a ză o m ş i n ă Tu r i n g .
I n t r a r e a m a ş i n i i Tu r i n g : c e l e k c u v i n t e d e p e c e l e k b e n zi , s c r i s e i n i ţ i a l î n c e p a n d c u
c e l u l e l e ″ ze r o ″ .
Ieşirea maşinii Tu r i n g : c e l e k c u v i n t e s c r i s e p e b e n zi î n m o m e n t u l c â n d m a ş i n a Tu r i n g s e
opeşte. În mod frecvent, suntem interesaţi doare de unul singur.
Starea globală a m a ş i n i i Tu r i n g o n o t ă m c u S = { s t a r e a c u r e n t ă a a u t o m a t u l u i , c o n ţ i n u t u l
curent al celor k benzi, poziţiile curente ale celor k capete}.
Notăm cu S0 starea globală iniţială.
C a l c u l u l d e t e r m i n i s t a l m a ş i n i i Tu r i n g T p e n t r u i n t r a r e a x ( u n d e x = (x1 , ... , xk ) , i a r x1, ... , xk
s u n t c u v i n t e ) î l n o t ă m c u T (x ) ş i e s t e s e c ve n ţ a d e s t ă r i g l o b a l e c a r e î n c e p e c u s t a r e a
i n i ţ i a l ă S0 , i a r f i e c a r e s t a r e g l o b a l ă u r m e a z ă a l t e i a î n ş i r .
R e zu l t ă c ă m a ş i n a Tu r i n g d e t e r m i n i s t ă e s t e c a r a c t e r i za t ă d e f a p t u l c ă a r e c e l m u l t o
intrare pentru orice combinaţie de simboluri şi stări.
D a c ă x e s t e u n c u v â n t d e i n t r a r e , a t u n c i s p u n e m c ă p r o c e s u l d e c a l c u l a l m a ş i n i i Tu r i n g ,
p e n t r u x , s e o p r e ş t e d a c ă T (x ) e s t e f i n i t ă ş i u l t i m a s t a r e e s t e f i n a l ă .
C u v â t u l x e s t e a c c e p t a t d e m a ş i n a Tu r i n g T d a c ă T (x ) e s t e f i n i t ă ş i d a c ă u l t i m a s t a r e
este o stare de acceptare. Vom considera două stări finale mai importante:
• qA : s t a r e a d e a c c e p t a r e ;
• qR : s t a r e a d e r e j e c t a r e .
{ }
P e n t r u m a ş i n a Tu r i n g T n o t ă m c u L (T ) = x ∈ Σ∗ / T (x ) se incheie cu q A , l i m b a j u l a c c ep t a t d e
maşina T .
M a ş i n a Tu r i n g n e d e t e r m i n i s t ă e s t e c a r a c t e r i za t ă d e f a p t u l c ă p e n t r u o r i c e s t a r e q ş i s i m b o l
s , oricare dintre stările din Q poate fi stare următoare. Unei stări globale S îi poate urma
orice stare globală P .
P r e z e n t ă m c â t e v a e x e m p l e d e m a ş i n i Tu r i n g . V o m d e s c r i e i n s t r u c ţ i u n i l e astfel:
(stare_curenta, simbol_curent) → (stare_noua, simbol_nou, increment).
E x e p l u l 1 . M a ş i n ă Tu r i n g c a r e n u a r e l a i n t r a r e n i c i u n c u v â n t i a r l a i e ş i r e t i p ă r e ş t e
cuvântul “HELLO”.
q0 □ qH H + 1
qH □ qE E + 1
qE □ q L1 L + 1
q L1 □ q L2 L + 1
q L2 □ qO O 0
qO 0 qA O 0
q0
↓
1. □ □ □ □ □ □ □
↑
s0 qH
2. H
↑
sH
qE
3. H E □
↑
sE
q L1
4. H E L □
s L1
q L2
5. H E L L O
qO
6. H E L L O
s0
qA
7. H E L L O
sA
E x e m p l u l 2 . M a ş i n a Tu r i n g c a r e d e t e r m i n ă c u vi n t e l e p o l i n d r o m a l e a l f a b e t u l u i { 0, 1 } .
Stare curentă Simbol curent Stare nouă Simbol nou Increment
s0 0 q0 □ + 1
q0 0 q0 0 + 1
q0 1 q0 1 + 1
q0 □ q R0 □ − 1
s0 1 q1 □ + 1
q1 0 q1 0 + 1
q1 1 q1 1 + 1
q1 □ q R1 □ − 1
q R0 0 qREV □ − 1
q R1 1 qREV □ − 1
q R0 1 qR □ 0
q R1 0 qR □ 0
qREV 0 qREV 0 − 1
qREV 1 qREV 1 − 1
qREV □ s0 □ + 1
s0 □ qA □ 0
P1: s0 , 0 1 1 0
↑
P2: q0 , □ 1 1 0
↑
P3: q0 , □ 1 1 0
↑
P4: q0 , □ 1 1 0
↑
P5: q0 , □ 1 1 0 □
↑
P6: q R0 , □ 1 1 □ □
↑
P7: q REV , □ 1 1 □ □
↑
P8: q REV , □ 1 1 □ □
↑
P9: q REV , □ 1 1 □ □
P10: s0 , □ 1 1 □ □
↑
P11: Q1 , □ □ 1 □ □
↑
P12: Q1 , □ □ 1 □ □
↑
P13: q R1 , □ □ 1 □ □
↑
P14: q REV , □ □ □ □ □
↑
P15: s0 , □ □ □ □ □
↑
P16: qA
Accept
P1: s0 , 0 1 1 1
P2: q0 , □ 1 1 1
↑
P3: q0 , □ 1 1 1
↑
P4: q0 , □ 1 1 1
↑
P5: q0 , □ 1 1 1 □
↑
P6: q R0 , □ 1 1 1 □
↑
P7: qR , □ 1 1 □ □
Reject ↑
In continuare dăm enunţul a două teoreme.
T e o r e m a 2 . P e n t r u o r i c e m a ş i n ă T u r i n g S c u k b e n zi , e x i s t ă o m a ş i n ă T u r i n g T cu o
∗
b a n d ă c a r e î n l o c u i e ş t e p e S î n u r m ă t o r u l s e n s : p e n t r u o r i c e c u v â n t x ∈ Σ , m a ş i n a S se
opreşte într-un număr finit de paşi la intrarea x dacă şi numai dacă T se opreşte la
intrarea x şi, la oprire, acelaşi lucru este scris pe ultima bandă a lui S şi pe banda lui T .
Mai mult, dacă S face N paşi, atunci: T face O N 2 paşi. ( )
O m a ş i n ă Tu r i n g c a r e e s t e c a p a b i l ă s ă s i m u l e ze o r i c e a l t ă m a ş i n ă Tu r i n g , s e n u m e ş t e
″ Ma ş i n ă T u r i n g U n i v e r s a l ă ″ .
C a l c u l a t o a r e l e m o d e r n e , c u p r o g r a m e î n r e g i s t r a t e s u n t ″ i n s t a n ţ e ″ a l e u n e i m a ş i n i Tu r i n g
mai sofisticate numită ″Maşină Program cu acces aleator″ (Random Acces Stored Program
Machine − RASP).
R A S P î n r e g i s t r e a z ă p r o g r a m u l î n m e m o r i e . P r o g r a m u l e s t e o s e c ve n ţ ă f i n i t ă d e s t ă r i a l e
maşinii (numite şi instrucţiuni). RASP are un umăr infinit de registrii − celule de memorie
care pot conţine orice întreg.
RASP este caracterizată de ″adresarea indirectă″ − conţinutul unui registru poate ″arăta″
spre adresa oricărui alt registru.
E xi s t ă d o u ă t i p u r i d e m ă s u r ă a c o m p l e xi t ă ţ i i a l g o r i t m i l o r .
D e f i n i ţ i e . A n a l i za c o m p l e x i t ă ţ i i d e t e r m i n ă t i m p u l î n c a r e o p e r a ţ i i l e d e b a ză a l e u n u i
algoritm sunt executate petru fiecare set de date de intrare.
S u n t m a i m u l t e c a z u r i î n c a r e s e d e t e r m i n ă c o m p l e xi t a t e a u n u i a l g o r i t m :
1 . C a z u l d e f a v o r a b i l , W (n ) : î n c â t t i m p o p e r a ţ i i l e d e b a ză s u n t e x e c u t a t e î n c a zu l
defavorabil.
2 . C a z u l c e l m a i b u n , B (n ) : î n c â t t i m p o p e r a ţ i i l e d e b a z ă s u n t e xe c u t a t e î n c a zu l c e l
mai bun.
3 . F i e c a r e c a z , T (n ) : î n c â t t i m p o p e r a ţ i i l e d e b a ză s u n t e xe c u t a t e p e n t r u f i e c a r e
caz.
4 . C a z u l m e d i u , A (n ) : î n c â t t i m p o p e r a ţ i i l e d e b a ză s u n t e xe c u t a t e î n m e d i e .
Î n c o n t i n u a r e d ă m c â t e v a e xe m p l e d e c a l c u l a c o m p l e xi t ă ţ i i .
E x e m p l u l 1 . C ă u t a r e a s e c v e n ţ i a l ă î n t r - u n t a b l o u s = [1,..., n] :
begin
locaţie ← 1
w h i l e ( l o c a ţ i e ≤ n ) a n d ( s [ l o c a ţ i e ] ≠ x) d o
locaţie ← locaţie + 1
end_while
if (locaţie > n) then
locaţie ← 0 / ∗ element negăsit ∗/
end_if
end
S ă a n a l i ză m c o m p l e xi t a t e a î n c e l e p a t r u c a zu r i .
1. W (n ) = n + 1 ⇔ e l e m e n t u l x n u e s t e î n t a b l o u .
2. B (n ) = 1 ⇔ x s e a f l ă î n p r i m u l e l e m e n t .
3. T (n ) n u s e c a l c u l e a ză d e o a r e c e o p e r a ţ i i l e d e b a ză n u s u n t e xe c u t a t e d e a c e l a ş i
număr de ori pentru toate instanţele de dimensiune n .
4 . P e n t r u A (n ) :
C a z u l 1 . x e s t e î n t a b l o u . To a t e c o m p o n e n t e l e t a b l o u l u i a u va l o r i d i f e r i t e . R e z u l t ă c ă
1
x p o a t e f i g ă s i t î n f ie c a r e d i n t r e e l e c u a c e e a ş i p r o b a b i l i t a t e , . Rezultă că
n
n (n + 1)
n n
n +1 n +1
∑k ⋅ n = n ∑k = n ⋅
1 1 1
A (n ) = = . e s t e , p r a c t i c , va l o a r e a m e d i e a ş t e p t a t ă a
2 2 2
k =1 k =1
comparaţiilor.
C a z u l 2 . x s e a f l ă s a u nu î n t a b l o u . F i e p p r o b a b i l i t a t e a c a e l s ă s e a f l e î n t a b l o u .
p
Probabilitatea ca el să se afle în unul din elemente este , iar probabilitatea ca el să nu
n
f i e î n t a b l o u e s t e (1 − p ) .
Dacă x se află pe poziţia k , vom avea k treceri prin buclă, iar dacă x nu aparţine
n n
∑ ∑ k + n (1 − p ) =
p p
A (n ) = k⋅ + n (1 − p ) =
n n
tabloului, vom avea n treceri. Atunci k =1 k =1
n +1 p p⋅n
p⋅ + n − np = + + n − np =
2 2 2
p p⋅n p p
= +n− = + n 1 − .
2 2 2 2
P e n t r u p = 1 r e z u l t ă A (n ) =
n +1
ş i p e n t r u p = 0,5 r e zu l t ă A (n ) = 3 n + 1 .
2
E x e m p l u l 2 . S o r t a r e a u n u i t a b l o u s = [1,..., n] p r i n m e t o d a i n t e r s c h i m b ă r i i .
begin
for i =1 to n −1 d o
for j = i +1 t o n d o
if (s [ j ] < s [i ]) t h e n
s[i ] ↔ s[ j ]
end_if
end
N o t ă m c u T (n ) . n u m ă r u l d e p a ş i e xe c u t a ţ i d e a l g o r i t m .
O p e r a ţ i i l e d e b a ză s u n t : c o m p a r a ţ i a s [i ] c u s [ j ] ş i s c h i m b a r e a s [i ] c u s [ j ] .
B u c l a e x t e r i o a r ă s e e x e c u t ă d e n −1 o r i .
L a p r i m u l p a s a l b u c l e i e x t e r i o a r e s e vo r e x e c u t a n − 1 p a ş i î n b u c l a i n t e r i o a r ă .
L a a l d o i l e a p a s a l b u c l e i e xt e r i o a r e v o r f i n − 2 p aş i î n b u c l a i n t e r i o a r ă . A p o i n − 3 , n − 4
paşi, etc.
n (n − 1)
D e c i T (n ) = (n − 1) + (n − 2 ) + .... + 2 + 1 = , i a r c o m p l e xi t a t e a e s t e O (n 2 ) .
2
U r m ă t o a r e l e d e f i n i ţ i i r e p r e z i n t ă c a z u r i d e m ă r g i n i r e a c o m p l e xi t ă ţ i i .
D e f i n i ţ i a 1 . P e n t r u o f u n c ţ i e f (n ) n o t ă m c u O ( f (n )) m u l ţ i m e a funcţiilor g (n ) , cu
p r o p r i e t a t e a c ă ∃ c ∈ R ş i n0 ∈ N , a s t f e l î n c â t g (n ) ≤ c ⋅ f (n ) , ∀ n ≥ n0 .
E xe m p l u . f (n ) = n 2 ş i g (n ) = n 2 + 10 n .
n 2 + 10 n ≤ c ⋅ n 2 ; (1 − c ) n 2 + 10 n ≤ 0 ; n [(1 − c ) n + 10 ] ≤ 0 ; n [(1 − c ) n + 10 ] ≥ 0
10
P e n t r u u n n0 > , prima inegalitate este adevărată.
c −1
D e f i n i ţ i a 2 . P e n t r u o f u n c ţ i e f (n ) n o t ă m c u Ω ( f (n )) m u l ţ i m e a funcţiilor g (n ) , cu
p r o p r i e t a t e a c ă ∃ c ∈ R ş i n0 ∈ N + , a s t f e l î n c â t g (n ) ≥ c ⋅ f (n ) , ∀ n ≥ ne .
( )
E xe m p l u l 1 . n3 ∈ Ω n 2 p e n t r u c ă n3 ≥ 1 ⋅ n p e n t r u ∀ n ≥ 1 .
n (n + 1)
E xe m p l u l 2 .
2
( )
∈ Ω n2 . A s t f e l ,
n (n + 1) n n +1 n n n2
≥ ⋅ ≥ ⋅ = pentru n ≥ 2 .
2 2 2 2 2 4
1
Deci pentru c = ş i n0 = 2 a v e m î n d e p l i n i t ă c o n d i ţ i a i m p u s ă î n d e f i n i ţ i e .
4
D e f i n i ţ i a 3 . P e n t r u o f u n c ţ i e f (n ) n o t ă m c u Φ ( f (n )) = O ( f (n )) ∩ Ω ( f (n )) m u l ţ i m e a f u n c ţ i i l o r
g (n ) , c u p r o p r i e t a t e a c ă ∃ c1 , c2 ş i n0 ∈ N a s t f e l î n c â t c1 ⋅ f (n ) ≤ g (n ) ≤ c2 ⋅ f (n ) , ∀ n ≥ n0 .
E xe m p l e d e c l a s e d e c o m p l e xi t a t e :
( )
O n 2 : 3 log (n ) + 8, 4 n 2 , 5 n + 7 , 6 n 2 + 9 , 2 n log (n ) , 5 n 2 + 2 n
Ω (n ) :
2
4 n 2 , 4 n3 + 3 n 2 , 6 n 2 + 9 , 6 n 6 + n 4 , 5 n 2 + 2 n , 2n + 4 n
Φ (n ) :
2
4 n2 , 6 n2 + 9 , 5 n2 + 2 n
P r e z e n t ă m î n c o n t i n u a r e u n a l g o r i t m d e c a u t a r e c a r e a r e o c o m p l e xi t a t e m a i b u n ă d e c â t
alogoritmul de cautare secvenţială.
C ă u t a r e a b i n a r ă î n t a b l o u l s [ 1, ... , n ] .
begin
min ← 1; max ← n; locaţie ← 0;
while (min ≤ max) and (locaţie = 0) do
m i j l o c ← ( m i n + m a x) d i v 2 ;
if (x = s [mijloc]) then locaţie ← mijloc
else if (x < s [mijloc]) then max ← mijloc−1
else min ← mijloc + 1
end_if
end_if
end_while
end
A n a l i z a c o m p l e xi t ă ţ i i .
C o n s i d e r ă m c a z u l d e f a v o r a b i l W (n ) . P r e s u p u n e m c ă n e s t e p u t e r e a l u i 2 , m a i p r e c i s
n = 2k . P r i m a i n s t r u c ţ i u n e d i n b u c l ă î n j u m ă t ă ţ e ş t e d i m e n s i u n e a t a b l o u l u i d e c ă u t a r e .
Aceasta se întâmplă de fiecare dată când se trece prin buclă.
P e n t r u c a z u l c â n d x e s t e m a i m i c s a u m a i m a r e d e c â t t o a t e e l e m e n t e l e d i n l i s t ă vo m a r ă t a
c ă W (n ) = log (n ) + 1 .
Din înjumătăţirea secvenţei de căutare deducem:
n
W (n ) = W + 1
2
W (1) = 1
W (2 ) = W (1) + 1 = 2
W (4 ) = W (2 ) + 1 = 3
W (8) = W (4 ) + 1 = 3 + 1 = 4
W (16 ) = W (8) + 1 = 4 + 1 = 5
S ă d e m o n s t r ă m p r i n i n d u c ţ i e c ă W (n ) = log (n ) + 1 .
P e n t r u n = 1 : W (1) = 1 = log (1) + 1
P r e s u p u n e m W (n ) = log (n ) + 1
W (2 n ) = W (n ) + 1 = log (n ) + 1 + 1 = log (n ) + log (2 ) + 1 =
log (2 n ) + 1
O (log (n )) apare când o problemă mai mare este rezolvată prin transformarea ei într-o
problemă de dimesiune mai mică (tip logaritmic);
O (n ) apare când fiecare element al problemei necesită un mic effort (timp) de
procesare (tip linear);
O (n lg (n )) a p a r e c â n d o p r o b l e m ă e s t e ″ s p a r t ă ″ î n m a i m ul t e s u b p r o b l e m e r e zo l va b i l e
independent, iar apoi sunt combinate soluţiile (tip linearitmic);
( )
O n2 a p a r e c â n d a l g o r i t m u l p r o c e s e a ză t o a t e p e r e c h i l e d e e l e m e n t e a l e u n e i
mulţimi (tip quadratic);
O (2 )
n t i p e xp o n e n ţ i a l .
P r i m e l e t r e i c u r b e d i n s t â n g a g r a f i c u l u i d e m a i s u s r e p r e zi n t ă î n o r d i n e ( d e l a s t â n g a l a
( ) ( )
d r e a p t a ) c o m p l e x i t ă ţ i l e O 2n , O n 2 ş i O (n lg (n )) .
I a t ă c â t e v a c a z u r i p r a c t i c e d e s t a b i l i r e a c o m p l e xi t ă ţ i i .
C a z u l d e r e z o l v a r e a l u n e i s i n g u r e i n s t r u c ţ i u n i c e s e e xe c u t ă o s i n g u r ă d a t ă :
O (1)
Cazul de rezolvare:
for i =1 to n do
s;
u n d e s e s t e O (1) . R e z u l t ă c o m p l e xi t a t e a n ⋅ O (1) = O (n ) .
Cazul de rezolvare:
for i =1 to n do
for j =1 to n do
s;
u n d e s e s t e O (1) . R e z u l t ă c o m p l e xi t a t e a n ⋅ O (n ) = O n 2 . ( )
Cazul de rezolvare:
h =1
w h i l e (h ≤ n ) d o
s;
h ← 2∗h
end_while
a i c i v a r i a b i l a h i a v a l o r i l e 1 , 2 , 4 , 8 … , p â n ă c â n d d e p ă ş e ş t e p e n . R e zu l t ă c ă s u n t 1+ log 2 n
t r e c e r i . A v e m c o m p l e x i t a t e a O (log 2 n ) .
Cazul de rezolvare:
for i =1 to n − 1 do
for j = i to n do
s;
Bucla interioară se execută de i ori unde i = 1,2,…,n. Numărul de e xe c u ţ i i este
( )
n
n(n + 1)
∑i =
i =1
2
, dec i c om p lex i ta t ea e s te O n 2 .
C a z u l d e r e zo l v a r e :
h = n; j =1
while j < h do
for i = 1 to n do
s;
h ← h/2
end_while
B u c l a i n t e r i o a r ă a r e c o m p l e xi t a t e a O (n ) i a r b u c l a e xt e r i o a r ă e x e c u t ă log2n i t e r a ţ i i .
C o m p l e xi t a t e a e s t e d e c i O (n log 2 n ) .
E xe m p l u :
− orice părinte are un strămoş;
− părinţii oricărui strămoş sunt de asemenea strămoşi ai persoanei considerate.
Cazul funcţiilor:
O f u n c ţ i e e s t e d e f i n i t ă r e c u r s i v d a c ă p o r n i n d d e l a a n u m i t e va l o r i a l e e i , s e p o t c a l c u l a
alte valori prin autoapelarea funcţiei. Altfel spus, o funcţie recursivă este parţial definită în
termeni de ea însăşi.
D e f i n i ţ i a u n e i f u n c ţ i i r e c u r s i v e t r e b u i e s ă s a t i s f a c ă c o n d i ţ i a d e c o n s i s t e n ţ ă : va l o a r e a
f u n c ţ i e i r e c u r s i v e t r e b u i e s ă f i e d i r e c t c a l c u l a bi l ă s a u c a l c u l a b i l ă c u aj u t o r u l u n o r va l o r i
direct calculabile.
În definirea unei funcţii recursive trebuie să apară cel puţin o condiţie de oprire din
recursivitate.
E xp r e s i a u n e i f i n c ţ i i r e c u r s i v e e s t e d a t ă d e o r e l a ţ i e d e r e c u r e n ţ ă . F i e o s e c ve n ţ ă { t n } n ≥ 1
şi k ∈ N . Dacă avem:
t n + k = a1 ⋅ t n + k − 1 + a2 ⋅ tn + k − 2 + .... + ak tk
a t u n c i s e c v e n ţ a e s t e o s e c v e n ţ ă r e c u r s i vă d e o r d i n k , i a r r e l a ţ i a p r e c e d e n t ă e s t e o r e l a ţ i e
recursivă de ordin k .
2. Funcţia factorial
fact : N → N
1, daca n = 0
fact (n ) =
n ∗ fact (n − 1), daca n ≥1
function fact (n )
if (n = 0) then return 1
else return n ∗ fact (n − 1) ;
end_if
end_func.
E xe m p l u d e c a l c u l e f e c t i v p e n t r u f u n c ţ i a f a c t o r i a l :
factorial (3)
factorial (2)
factorial (1)
factorial (0) return (0)
r e t u r n 2 ∗1 = 2
r e t u r n 1 ∗1 = 1
return 3∗ 2 = 6
3. F u n c ţ i a p u t e r e xn
Pentru un întreg x>0 s ă s e c a l c u l e ze xn , u n d e n ≥ 0 . Vom considera funcţia
putere (x, n ) : N × N → N . E v i d e n t putere (x, 0) = 1 . A t u n c i , e xp r e s i a r e c u r e n t ă a f u n c ţ i e i e s t e :
1, dacă n = 0
putere (x, n ) =
x ∗ putere ( x , n − 1), dacă n ≥1
C o r e c t i t u d i n e a d e f i n i ţ i e i r e z u l t ă d i n x 0 = 1 ( p a s u l d e ve r i f i c a r e ) ş i xn +1 = x ⋅ xn ( p a s u l d e
inducţie).
A f i r m ă m c ă f u n c ţ i a ( 1 ) a r e c o m p l e xi t a t e a O (n ) .
N o t ă m c u T (n ) t i m p u l d e e xe c u ţ i e a f u n c ţ i e i p u t e r e .
T (n ) = T (n − 1) + O (1) , u n d e O (1) e s t e t i m p u l n e c e s a r p e n t r u a r e t u r n a va l o a r e a x.
T (n ) = T (n − 1) + O (1) = T (n − 2 ) + 2 ∗ O (1) + ....
T (n ) = T (0 ) + n ∗ O (1) .
R e z u l t ă c o m p l e xi t a t e a O (n ) .
E xp r i m â n d a l t f e l f u n c ţ i a p u t e r e , v o m o b ţ i n e u n a l g o r i t m c u o c o m p l e xi t a t e m a i b u n ă .
O b s e r vă m c ă x 4 s e p o a t e c a l c u l a m a i u ş o r d a c ă a m c a l c u l a t x 2 , d e o a r e c e x 4 = x 2 . L a ( ) 2
( ) 2
f e l , x 6 = x3 . N o t ă m n / 2 = n div 2
Considerăm x n div 2 = putere ( x, n div 2) şi notăm cu sqr ridicarea la puterea doi. Atunci
x , n −1
dacă n impar
sqr ( putere (x, n div 2 )) =
n
x , dacă n par
Atunci:
x * sqr ( putere (x, n div 2 )), dacă n impar
xn = ,
sqr ( putere (x, n div 2 )), dacă n par
iar algoritmul complet este:
1, dacă n = 0
putere (x, n ) = x ∗ sqr ( putere (x, n div 2)), dacă n impar
sqr ( putere (x, n div 2)), dacă n par
N o t ă m c u T (n ) t i m p u l d e e xe c u ţ i e p e n t r u a c e a s t ă f o r m u l ă . F i e n = 2m . Atunci:
1, pentru n = 1
T (n ) = n
T 2 + 1, pentru n > 1
( ) ( ) ( ) ( )
T (n ) = T 2 m = T 2 m − 1 + 1 = T 2 m − 2 + 2 = .... = T 2 0 + m = T (1) + m = m + 1 = log 2 n + 1 R e z u l t ă c o m p l e xi t a t e a
O (log 2 n ) .
4. A l t e e x e m p l e d e f u n c ţ i i r e c u r s i ve :
a) F i b o n a c c i : fib : N → N
1, n = 1, n = 2
fib (n ) =
fib (n − 1) + (n − 2 ), n > 2
b) Ackerman:
n + 1, m=0
ack (m, n ) = ack (m − 1, 1), n=0
ack (m − 1, ack (m, n − 1)), rest
c) Manna − Punelli
x − 1, x ≥ 12
mana (n ) =
f ( f (x + 2 )), x ∈ [0 , 12 )
a) Recursia liniară
g ( x ), dacă p ( x ) = true
f (x ) =
ϕ ( f (h ( x )), i ( x )), altfel
E xe m p l u : fact (n )
b) Recursia neliniară de tip cascadă
g ( x ), dacă p ( x ) = true
f (x ) =
ϕ ( f (h ( x )), f (i ( x ))), altfel
1, n = 1 sau n = 2
E xe m p l u : fib (n ) =
fib (n − 1) + fib (n − 2 ), altfel n > 2
E xe m p l u : tn − 5 tn − 1 + 6 tn − 1 = 0 , t0 = 0 , t1 = 1 .
A t u n c i tn = r n , tn = nr n , tn = n 2 r n , ..... , tn = n m − 1 r n s u n t t o a t e s o l u ţ i i a l e e c u a ţ i i r e c u r e n t e .
Fiecare dintre aceşti termeni trebuie introdus în soluţia generală (prin adunare).
E xe m p l u : S ă s e r e z o l v e : t n − 7 tn −1+ 15 t n − 2 + 9 tn − 3 = 0 , t0 = 0 , t1 = 1 , t 2 = 2 .