Sunteți pe pagina 1din 17

1.

ALGORITMI SI COMPLEXITATE

1.1. ALGORI TMI

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".

Un algoritm trebuie să se termine sau nu ?


U n i i a u t o r i r e s t r i c ţ i o n e a ză d e f i n i ţ i a a l g o r i t m u l u i l a o p r o c e d u r ă c a r e s e t e r m i n ă . A l ţ i i
c o n s i d e r ă c ă a l g o r i t m i i s u n t p r o c e d u r i c a r e p o t s ă s e e xe c u t e l a i n f i n i t , o a s t f e l d e
p r o c e d u r ă n u m i n d u - s e " m e t o d ă d e c a l c u l " . Î n a c e s t e c a zu r i s e c o n s i d e r ă c ă a l g o r i t m u l
trebuie să “genereze obiecte”.

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.

1.1.1. Exprimarea algorit milor

Algoritmii pot fi exprimaţi prin mai multe moduri:


− limbaj natural;
− pseudocod;
− scheme logice;
− limbaje de programare.
E xp r i m a r e a p r i n l i m b a j n a t u r a l t i n d e s ă f i e c o m p l i c a t ă ş i , u n e o r i , a m b i g u ă .
P s e u d o c o d u l ş i s c h e m e le l o g i c e s u n t m o d a l i t ă ţ i s t r u c t u r a t e d e e xp r i m a r e a a l g o r i t m i l o r şi
sunt independente de limbajul de programare.
Î n f i n a l , l i m b a j u l d e p r o g r a m a r e e s t e p r e f e r a t d e o a r e c e r e p r e z i n t ă e xp r i m a r e a
a l g o r i t m u l u i î n t r - o f o r m ă c e p o a t e f i e xe c u t a t ă d e c ă t r e c a l c u l a t o r .

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)

if b=0 then return a

else return cmmdc(b, a mod b)

end_if

sau
function cmmdc(a, b)

while a ≠ b do

if a > b then a←a−b


else b←b−a
end_if

end_while

Vom demonstra corectitudinea acestui algoritm.


Fie a, b ∈ N , a > b ⇒ a = qb + r . S ă a r ă t ă m c ă o r i c e d i v i zo r a l l u i a ş i b e s t e d i vi zo r ş i
p e n t r u r . A v e m r = a − qb . D a c ă d e s t e u n d i vi zo r a l l u i a ş i b , f i e a = sd , b = td . R e zu l t ă
r = sd − qtd = (s − qt ) d . D e c i d e s t e d i v i z o r a l l u i r . C u m o r i c e d i v i zo r a l l u i a ş i b e s t e d i vi zo r
ş i p e n t r u r a t u n c i ş i c e l m a i m m a r e d i vi zo r s e r e f e r ă ş i l a r . E s t e s u f i c i e n t s ă c o n t i n u ă m
p r o c e s u l c u n u m e r e l e b ş i r . C u m r e s t e m a i m ic c a b î n va l o a r e a b s o l u t ă , vo m g ă s i r = 0
într-un număr finit de paşi.

1.1.2. Clasificarea algorit milor

Î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 uc ţ ie de " des i g n " ( m et od ă) , ex . :


• îm p ar t e ş i s tă p ân e ş te ( îm pa r t e pr ob l em a în un a s a u m ai m ult e i ns ta nţ e m ai
m ic i) ;
• pr ogr a m ar e di n a mic ă ( c a ut ă s tr uc t ur i o pt i m ale - o s o l uţ i e o pt im a lă a pr ob l em ei
po a te f i c o ns tr u i tă p l e c ân d d e l a s o l uţ i i le op tim a le a l e s u b pr o b l em e lor ) ;
• m et o da ″ G r ee dy ″ ( c au t ă to t s tr uc t ur i o p tim a le c u d eos e b ir e a c ă s o luţ ii l e l a
s ub pr o bl em e n u tr e b u ie s ă f i e c u n os c ut e la f iec ar e pas ; a l e g er e a ″G r ee dy ″ s e
r ef er ă l a ″c e ar a t ă″ m a i b in e l a u n m om ent da t) .

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″.

1.2. M ASIN A TURING

Definiţia 1. Un alfabet Σ este o mulţime nevidă şi finită de elemente, numite simboluri:


Σ = {σ 1, σ 2 , ... , σ n } .

D e f i n i ţ i a 2 . U n c u v â n t p e s t e Σ e s t e u n t - u p l u x = σ i1σ i2 .... σ ik s a u m a i s i m p l u σ i1σ i2 .... σ ik .

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 .

Obs: Pe o bandă, simbolul curent şi cel nou nu sunt neapărat diferite.


R e z u m â n d , o m a ş i n ă Tu r i n g d e t e r m i n i s t i c ă c u k b e n zi ( k ≥ 1 ) e s t e q u i n t - u p l u l 〈Q, Σ, I , q0 , F 〉 ,
unde:
Q : mulţimea finită de stări;
Σ : mulţime finită − alfabetul (unde ∈Σ este simbolul nul);
I : o m u l ţ i m e f i n i t ă d e e l e m e n t e 〈 q, s, s′, m, q′〉 , u n d e q, q′ ∈ Q∗ , s, s ' ∈ Σ k , {
m ∈ Left , Right , Stay }k
mişcările pe cele k benzi.
q0 e s t e s t a r e a i n i ţ i a l ă . V o m m a i c o n s i d e r a ş i F ⊂ Q o m u l ţ i m e d e s t ă r i f i n a l e .
Q u i n t - u p l u l 〈 q, s, s′, m, q′〉 e s t e u n p a s ( o i n s t r u c ţ i u n e ) a l ( a ) m a ş i n i i Tu r i n g u n d e :
q : starea curentă;
s = ( s1, s2 ,...sk ) : c e l e k s i m b o l u r i c u r e n t e l u a t e î n c o n s i d e r a ţ i e p e c e l e k b e n zi ;

s′ = ( s1' , s2' ,..., sk' ) : c e l e k s i m b o l u r i c a r e t r e b u i e s c r i s e ;


m = (m1, m2 ,..., mk ) : m i ş c ă r i l e p e c e l e k b e n z i .

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”.

Stare Simbol Stare nouă Simbol nou Increment


curentă curent

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

Mulţimea stărilor este {


Q = q 0 , s0 , qR , q A , qREV , qR1 , qR0 , }.
I n u r m ă t o a r e l e e x e m p l e d e c a l c u l p e n t r u a c e a s t ă m a ş i n ă , c u v â n t u l s = 0 1 1 0 va f i a c c e p t a t
iar cuvântul s = 0111 va fi rejectat.

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.

Teorema 1. Pentru orice k ≥ 1 şi orice alfabet Σ , există o maşină Turing cu (k + 1) b e n zi .

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.

1.3. M ĂSUR ARE A COMPLEXI TĂŢII

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 .

Măsura statică este bazată pe structura algoritmului.


Măsura dinamică este bazată pe calitatea algoritmului, intrările lui, comportamentul
calculatorului în timpul execuţiei algoritmului.
De interes este măsura diamică.
Î n g e n e r a l , o m ă s u r ă a c o m p l e xi t ă ţ i i Φ e s t e i n d e p e n d e n t ă d e m o d e l u l c o m p u t a ţ i o n a l d a c ă ,
î n r a p o r t c u o m u l ţ i m e {Pi } d e a l g o r i t m i , a r e p r o p r i e t ă ţ i l e :
1 . ∀ i d o m e n i u l l u i Φ i e s t e a c e l a ş i c u a l l u i Pi , i a r c o d o m e n i u l e s t e i n c l u s î n N , u n d e
Φ i e s t e m ă s u r a l u i Pi ;
2 . E x i s t ă u n p r e d i c a t M , a s t f e l î n c â t : M (i, x, m ) ↔ Φ i (x ) = m , ∀ i, x , m .
V o m d a o m ă s u r ă a c om p l e xi t ă ţ i i d i n p u n c t d e ve d e r e a l t i m p u l u i d e e xe c u ţ i e a l u n u i
a l g o r i t m . V o m f o l o s i c a m o d e l c o m p u t a ţ i o n a l m a ş i n a Tu r i n g .
Î n g e n e r a l , c â n d v o r b i m d e s p r e t i m p u l d e e xe c u ţ i e a l u n u i a l g o r i t m , n e g â n d i m l a n u m ă r u l
d e p a ş i e xe c u t a ţ i d e p r o c e s u l c o m p u t a ţ i o n a l ( c a l c u l u l d e t e r m i n i s t ) a s o c i a t a l g o r i t m u l u i .
Când procesul de calcul nu se opreşte, considerăm timpul ca fiind nedefinit.

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

Î n c a z u l c â n d n ≠ 2 k a v e m î n g e n e r a l c o m p l e xi t a t e a log (n) + 1 + 1 = O (log (n)) .


A l g o r i t m u l d e s o r t a r e b i n a r ă e s t e u n e xe m p l u d e p r o b l e m ă D i v i d e - e t - I m p e r a ( $ E r r o r !
Reference source not found.).

1.3.1. Tipuri de pr obleme şi complexitatea lor

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 ) .

1.4. RECURSIVI TATE


În general, spunem că un obiect sau o metodă este recursiv (ă) dacă se poate defini în
f u n c ţ i e d e e l ( e a ) î n s u ş i ( î n s ă ş i ) . Ma i p r e c i s , u n a s t f e l d e o b i e c t s a u m e t o d ă , s e p o a t e
defini prin:
− câteva cazuri simple sau metode simple;
− reguli care transformă cazurile complexe în cazuri simple.

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 .

1.4.1. Exemple de funcţii recursi ve

1. Formulă recursivă pentru algoritmul lui Euclid


P e n t r u m, n ∈ N , m > n a v e m cmmdc (m, n ) = cmmdc (n, r1 ) , u n d e r1 e s t e r e s t u l î m p ă r ţ i r i i l u i m
la n. D e c i r1 = m − n ∗ m / n  .
A t u n c i cmmdc (m, n ) = cmmdc ( n, m − n ∗ m / n  ) .
Algoritm Euclid scris ca funcţie recursivă:
f u n c t i o n cmmdc (m, n )
if (n = 0) then return m
else
r e t u r n cmmdc ( n, m − n ∗ m / n  )
end_if
end_func
Apel: răspuns ← cmmdc (a, b )

Agoritmul Euclid scris ca procedură recursivă


p r o c e d u r e cmmdc ( i n : m , n ; o u t r e s u l t )
if (n = 0) then result ← m
 m  
else c m m d c  n, m − n ∗   ; result 
  n  
end_if
end_proc.
A p e l : cmmdc (a, b ; raspuns )

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 )

1.4.2. Tipuri de recursie


P e n t r u e x p r i m a r e , v o m f o l o s i f u n c ţ i i l e : f (x ) , g (x ) , h (x ) , i (x ) , ϕ (u, v ) .

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

c) Recursia neliniară de tip împachetat


 g ( x ), dacă p ( x ) = true
f (x ) = 
 f ( f (...... f (h ( x ))), ........), altfel
E xe m p l u : mana (n )

1.4.3. Ecuaţii recurent e


Î n m u l t e c a z u r i , a n a l i z a c o m p l e xi t ă ţ i i c o n d u c e l a e c u a ţ i i r e c u r e n t e ş i l a r e z o l v a r e a
acestora. Prezentăm două tehnici generale pentru rezolvarea ecuaţiilor recurente.

Teorema 1. Fie ecuaţia recurentă, omogenă şi liniară cu coeficienţi constanţi,


a0 t n + a1 ⋅ t n − 1 + .... + ak t n − k = 0 .
−1
Dacă ecuaţia sa caracteristică, a0 r k + a1 ⋅ r k + .... + ak r 0 = 0 , are k s o lu ţ i i distincte,
r1, r2 , ... , rk , atunci singurele soluţii ale ecuaţiei recurente sunt de forma
tn = c1 r1n + c2 r2n + .... + ck rkk = 0.

E xe m p l u : tn − 5 tn − 1 + 6 tn − 1 = 0 , t0 = 0 , t1 = 1 .

Ecuaţia caracteristică este r2 − 5 r + 6 = 0 . Rezul tă r1 = 3 , r2 = 2 . Soluţia generală este


tn = c1 3n + c2 2n ş i d i n c o n d i ţ i i l e i n i ţ i a l e a ve m tn = 3n − 2 n .

Teorema 2. Fie r rădăcina de multiplicitate m pentru ecuaţia caracteristică a unei ecuaţii


omogene, liniare şi recurente cu coeficienţi constanţi:
a0 t n + a1 ⋅ t n −1 + .... + ak t n − k = 0

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 .

Ecuaţia caracteristică este r 3 − 7 r 2 + 15 r − 9 = 0 . R e zu l t ă r1 = 1 , r2, 3 = 3 .

Soluţia generală este t n = c1 1n + c2 3n + c3 ⋅ n ⋅ 3n şi din condiţia iniţială, selectăm soluţia


n n −1
tn = − 1 + 3 − n 3 .

S-ar putea să vă placă și