Sunteți pe pagina 1din 20

Eficienta algoritmilor

n cursul de introducere am menionat c, orict de rapid ar deveni un calculator, sau orict de mult s-ar
ieftini memoria, eficiena va fi un factor decisiv n alegerea unui algoritm. Iat mai jos un exemplu
pentru aceast afirmaie.

Cutare secvential si cutare binar


Problema cutrii sun astfel: se d un ir de elemente sortate, i se cere cutarea unei valori n
ir, respectiv returnarea poziiei acelei valori din ir, n cazul n care aceasta se afl n acel ir.
Prima abordare i cea mai simpl ar fi s parcurgem tot irul astfel:

1.

( , )
(

2.
3.
4.
5.
6.

>

[ ]

+1

] )

n momentul n care gsim valoarea cutat, se prsete bulca repetitiv, i se returneaz


locaia gsit, altfel n caz c valoare nu este gsit, returnm o poziie eronat i anume -1.
Un alt algoritm de cutare este cel descris mai jos i funcioneaz astfel: se mparte irul n dou
i se compar valoarea de cutat cu cea din mijlocul irului. Dac nu este gsit, pasul de mai sus se va
repeta n irul din stnga, dac valoarea din ir este mai mare dect cheia de cutat, respectiv n dreapta
n caz contrar. Procedura este repetat pn cnd fie valoarea este gsit, fie nu se mai poate mpri
subirul mai departe, caz n care concluzionm c valoarea nu este n ir.

1.

( , )

2.

3.
4.
5.
6.
7.
8.
9.

[ ]

=(

( = [
(

10.

+ )/2
])

< [

])

= 0)
=

+1

Pentru a compara cele dou sortri, s presupunem pentru nceput c

conine 32 de elemente i

nu este n ir. Primul algoritm va compara toate cele 32 de elemente pentru a determina c
n ir. n general, cutarea secvenial va efectua
Apoi s consider, algoritmul
program optimizat,

comparaii, pentru a determina c

, ce efectueaz dou comparaii ale lui

ar fi comparat cu [

nu se afl n ir.
cu [

]. ntr-un

] i rezultatul pstrat, aa c putem presupune c doar o

singur comparaie se va face la fiecare execuie a lui

. Dac

ar fi mai mare dect toate

elementele din ir s-ar executa 5+1 comparaii. De remarcat c 6 = log 32 + 1. Pentru un

numrul de comparaii va fi log

nu se afl

oarecare,

+1.

Comparaiile se vor face ca n figura de mai jos:

Figura 1. Cutarea binar ntr-un ir de 32 de elemente, atunci cnd valoarea este mai mare dect orice numr din
ir.

Tabelul de mai jos prezint numrul de comparaii efectuate n cutarea secvenial i cea binar pentru
diverse valori ale lui , numrul de elemente din ir.

Numrul de comparaii n

Numrul de comparaii

cutarea secvenial

n cutarea binar

128

128

1024

1024

11

1048576

1048576

21

4294967296

4294967296

33

Mrimea irului

Din tabelul de mai sus, este evident c alegerea unui algoritm eficient, este de dorit i nseamn o
mbuntire a timpului i nu numai. Alte exemple pot fi date, n continuare vom ncerca s deprindem
modul de a analiza eficiena unui algoritm.

Analiza algoritmilor
Pentru a determina eficiena unui algoritm, acesta trebuie analizat. Comparaia de mai sus este
una informal, aa c pentru a putea afirma ceva despre un algoritm trebuie s efectum ceva mai muli
pai.
Complexitatea algoritmilor

Atunci cnd analizm eficiena unui algoritm, nu determinm numrul de cicluri CPU necesare,
i nu suntem interesai de frecvena memoriei sau alte date legate de arhitectura a calculatorului
specific pe care va rula algoritmului. Am vzut c algoritmul de cutare binar este mult mai eficient
dect cel secvenial prin numrul de comparaii, mult mai mare n cazul celui de-al doilea, pentru un ir
cu

elemente. Aceasta este o tehnic de a analiza algoritmi. n general, timpul de rulare crete dac i

numrul de elemente de la intrare crete. De aceea analizm eficiena unui algoritm determinnd
numrul de operaii elementare necesare ndeplinirii sarcinii, unde acest numr este o funcie de
mrimea intrrii.
Pentru muli algoritmi este uor s gsim o msur a mrimii de intrare. De exemplu, s lum n
considerare algoritmii de mai sus. , este numrul de elemente din ir, i este o msur simpl a mrimii
de intrare. Vom denumi

, mrimea intrrii. n cazul nmulirii a dou matrice,

, numrul de

rnduri i coloane reprezint mrimea intrrii. n unii algoritmi avem nevoie de dou mrimi de intrare,
3

de exemplu dac intrarea este un graf, vom avea ca msur de intrare numrul de muchii i noduri.
Uneori, trebuie s avem grij ce anume denumim mrime de intrare. De exemplu, n algoritmul lui
Fibonacci, se poate considera

mrimea de intrare, unde

este ordinul termenului Fibonacci. Totui

este intrarea, nicidecum mrimea intrrii. Pentru acest algoritm, dac dorim s respectm rigurozitatea,
o msur a mrimii de intrare este numrul de bii pentru a codifica ordinul termenului, care este
log

+ 1. De exemplu :

De aceea mrimea pentru

= 13 este 4.

Dup ce determinm mrimea de intrare, vom calcula complexitatea algoritmului prin calculul
numrului de operaii de baz, sau elementare, necesare efecturii algoritmului.
Uneori, vom considera, pentru uurina calcului, o operaie de baz simpl cum este adunarea i
alteori o operaie de baz mai complex, compus din operaii simple. De exemplu, ntr-un algoritm ce
sorteaz prin compararea cheilor, vom considera instruciunea de comparaie o operaie de baz i
asignarea o alt operaie de baz. Astfel putem separa, i calcula cu o acuratee mai mare eficiena
acelui algoritm. Alteori, cnd dorim o estimare a eficienei algoritmului, putem cupla cele dou operaii
ntr-una singur i denumi acea operaie de baz.
n multe cazuri o operaie de baz este efectuat n acelai mod de un numr de n ori. n aceste
cazuri, ( ) este definit ca numrul de ori de cte ori algoritmul efectueaz o operaie de baz, pentru o

instan de mrime de intrare . ( ) este denumit complexitate de timp valabil n orice caz, iar

determinarea lui ( ) se numete analiza complexitii de timp valabil n orice caz.

Pentru a putea nelege mai uor analiza algoritmilor este indicat s facem o incursiune n matematic,
mai exact n analiza creterii funciilor.

Creterea functiilor
Ordinul de timp, descris n primul curs, ofer o caracterizare simpl a eficienei algoritmului i
permite compararea unui algoritm cu altul. Atunci cnd mrimea intrrii este suficient de mare, pentru
ca ordinul de timp s fie relevant, studiem eficiena asimptotic a algoritmilor. De obicei, un algoritm
care este asimptotic mai eficient, este alegerea potrivit, excepie fcnd cazurile n care mrimea de
intrare este foarte mic.

Notatia asimptotic

Notaiile folosite pentru descrierea timpului de rulare, sunt definite ca funcii a cror domenii
sunt mulimi de numere naturale

= {0,1,2, }. Notaia asimptotic poate fi extins pe un domeniu de

numere reale, dac acest lucru este necesar.


Notatia

n primul curs, am gsit c ( ) = (

). S definim semnificaia notaiei. Pentru o funcie dat ( ),

vom nota ( ( )) cu setul de funcii care:

( ) =

( )

( ) ( )

( )

O funcie ( ) aparine mulimii ( ( )) dac exist constante pozitive

poate fii delimitat de funciile

( ) i

( ), pentru un

astfel nct ea

suficient de mare. Dei ( ( )) este o

mulime, vom scrie " ( ) = ( ( ))" pentru a indica faptul c ( ) este un membru al ( ( )).

n figura 2 sunt reprezentate funciile ( ) i ( ) unde ( ) = ( ( )). Pentru toate valorile

mari ca

, valorile lui ( ) se gsesc ntre

legat de ( ).

( ) i

mai

( ). Vom spune c ( ) este asimptotic strns

Definiia lui ( ( )) presupune ca fiecare membru al lui ( ( )) s fie asimptotic nenegativ, adic
( ) s fie nenegativ cnd

este suficient de mare.

Figura 2. Exemple grafice ale notaiilor , , . n fiecare parte, valoarea lui


Notaia care strnge funcia ntre dou constante. a) notaia

este valoarea minim posibil. a)

ce mrginete superior funcia cu un factor

constant. c) notaia ce mrginete inferior funcia printr-un factor constant. Pentru un


va fi deasupra lui

( ).

>

, valoarea lui ( )

Pentru a exemplifica notaia asimptotic ( ( )), s demonstrm c

Pentru a realiza acest lucru. Trebuie s determinm constantele pozitive

pentru orice

. mprim prin

Astfel alegnd

= i

1 alegnd

7 i alegnd

= 7, putem verifica c

astfel ca:

).

, rezult:

Inegalitatea din dreapta, poate fi realizat pentru

inegalitatea din dreapta poate fi ndeplinit, alegnd

3 = (

3 = (

. De asemenea,

).

Evident, se pot alege alte constante, important este c am gsit una din opiuni.
(

). S

orict de mare, deoarece

este

Putem folosi de asemenea, definiia formal pentru a verifica dac 6

presupunem, pentru a crea o contradicie, c exist

. Dar atunci,

ceea ce nu este posibil pentru un

astfel nct 6

pentru orice

constant. Intuitiv, termenii de grad mai mic ai funciei asimptotic pozitiv pot fi ignorai deoarece ei
devin nesemnificativi pentru un

foarte mare. De aceea, setnd

coeficientul celui mai mare termen, i

la o valoare puin mai mic dect

la o valoare puin mai mare dect coeficientul celui mai mare

termen permite ca inegalitatea din definiia notaiei s fie satisfcut.


Un alt exemplu, pornind de la funcia de grad doi,

constante cu

( )=

> 0, eliminnd termenii de grad inferior obinem ( ) = (

Urmrind paii de mai sus, alegem constantele


Se poate verifica, c 0

= ,

= 2

pentru orice

).

+ , unde
| |

,(

| |

, ,

sunt

) .

. n general pentru orice

funcie polinomial n care termenul cu cel mai mare grad are coeficient pozitiv avem ( ) = (

unde

este gradul polinomului.

Notatia

Pentru a defini o limit asimptotic superioar a unei funcii folosim notaia . Pentru o funcie
dat, ( ), notm cu ( ( )) un set de funcii astfel:
( ) =

( )

0 ( )

( )

Vom folosi notaia


lucru. Pentru orice

pentru a desemna limita superioar a unei funcii. Figura 2b) prezint acest

, valoarea funciei ( ) este mai mic sau cel mult egal cu ( ).

>

Pentru a indica faptul c o funcie ( ) este membr a ( ( )) vom scrie ( ) = ( ( )). De

notat c ( ( )) ( ( )). Demonstraia c orice funcie de grad 2 cu

valabil i n cazul notaiei , ceea ce nseamn c orice funcie de grad 2 cu


Ce este mai important, este c orice funcie linear
verific simplu dac
). Notaia

= (

+ | | i

> 0 este n (

> 0 se afl n (

+ se afl n

) este

).

), afirmaie ce se

= 1. Aceast afirmaie poate pare ciudat, dac lum cazul

este folosit , mai ales pentru a descrie limitele asimptotic superioare, n sensul n

care i realizeaz, pe de o parte acelai lucru. Totui, nu specificm ct de aproape de funcia original
( ) se gsete funcia ce o delimiteaz.

Folosind notaia ( ), descriem deseori timpul de rulare al algoritmului. De exemplu o structur

repetitiv n alt structur repetitiv ( denumit i imbricat n alt structur repetitiv), va avea
n cel mai ru caz. Costul buclei interioare variaz de la (1) (constant) la .
Din moment ce notaia

astfel (
(

descrie limita superioar, o vom folosi pentru a descrie cel mai ru caz,

) este o descriere corect a celui mai nefavorabil caz pentru algoritmul de mai sus. Faptul c

) este limita superioar, nu implic faptul c algoritmul este cuprins de limitele date de (

). De

exemplu, pentru algoritmul de inserie cnd irul este deja sortat obinem un ( ) suficient pentru a

delimita timpul necesar rulrii algoritmului.


Notatia

Aceast notaie ofer un mod de a exprima limita asimptotic inferioar a unei funcii. Pentru o funcie
dat ( ), vom nota cu ( ( )), setul de funcii:

( ) =

( )

0 ( ) ( )

Figura 2c) prezint aceast mulime de funcii.

Teorema 1
Pentru orice dou funcii ( ) i ( ), ( ) = ( ( )) dac i numai dac ( ) = ( ( ))

i ( ) = ( ( )).

Ca un exemplu pentru aceast teorem, s considerm c


constante
(

).

, ,

cu

> 0. Aceasta implic faptul c

+ = (

) pentru orice

+ = (
) i c

+ =

Din moment ce descrie o limit inferioar, o vom folosi pentru a descrie cel mai bun caz al

unui algoritm. S lum spre exemplu, sortarea prin inserie.

Timpul de rulare pentru algoritmul acesta, se afl ntre ( ) i

) din moment ce se afl

ntre o funcie liniar i una ptratic. Mai mult, aceste legturi sunt asimptotic precise, adic timpul de
rulare nu este n (

) din moment ce n cel mai bun caz algoritmul nu ruleaz dect n timp .

Notaia asimptotic definete o relaie de ordine parial ntre funcii, adic ntre eficiena relativ a
diferiilor algoritmi care rezolv o anumit problem: pentru oricare dou funcii ,

relaia binar :

funciilor definite pe

dac

definim

( ) ( ). Relaia este o relaie de ordine parial n mulimea

cu valori n

n mulimea ( ) putem nlocui pe

. Definim i o relaie de echivalen

dac ( ) = ( ).

cu orice alt funcie echivalent cu . De exemplu log

implic (log ) = (ln ). Ca regul avem ierarhia:

(1) (log ) ( ) ( log ) (

) (

ln

) (2 )

Pentru o problem dat, dorim s obineam un algoritm corespunztor unui ordin ct mai la stnga.
Pentru a simplifica calculele vom reduce din funcia polinomial, pstrnd termenul cu gradul cel mai
mare. De exemplu:
+3

+ (3

+8

Deoarece notaia se aplic pentru un

+ 8) = (max(

,3

+ 8)) = (

suficient de mare, relaia de mai sus este adevrat. Chiar dac

ceilali coeficieni ar fi fost negativi relaia este adevrat:


3

chiar dac pentru 0

8
=

max

+
2

3
2

6 polinomul este negativ.

= (

Notatia asimptotic conditionat

Mai muli algoritmi sunt mai uor de analizat dac vom considera iniial cazuri a cror mrime satisface
anumite condiii, de exemplu s fie puteri ale lui 2. n astfel de situaii, folosim notaia asimptotic
condiionat. Fie

( | )=

o funcie arbitrar i fie

Notaia ( ) este echivalent cu ( | ) unde

un predicat.

( ) ( ) ( )

i orice

este eventual nedescresctoare, dac exist un

avem ( ) ( ).

O funcie eventual nedescresctoare este b-neted dac (

este b-neted pentru un anumit

Fie

astfel nct pentru orice

) ( ( )). Orice funcie care

2 este de asemenea b-neted pentru orice

Proprietatea 1

2 un ntreg oarecare, :
( )=

nedescresctoare, astfel nct

este predicatul a crui valoare este mereu true. Similar

pentru notaiile ( | ) i ( | ).
O funcie

o funcie neted i :

2.

o funcie eventual

=1
1

unde , sunt constante arbitrare reale pozitive. Este dificil s analizm aceast ecuaie. Considerm

doar cazurile cnd

este o putere a lui 2, atunci ecuaia devine:


( )=

=1
1

2 ( 2) +

Prin tehnicile prezentate mai jos vom ajunge la relaia


( ) ( log

2)

Pentru a arta c (n log n) trebuie s verificm dac t este eventual nedescresctoare i

este neted.

Prin inducie vom demonstra c 1


Fie

(1) =

> 1. Presupunem c pentru orice

<

( ) ( + 1). Pentru nceput notm

2( + ) = (2)

avem ( ) (

+ 1). n particular,

( 2) (( + 1)2)

( 2) (( + 1)2)
9

log

Atunci, ( ) = ( 2) + ( 2) +

(( + 1)2) + (( + 1)2) + ( + 1) = ( + 1)

Trebuie, de asemenea, s artm c log este neted. Funcia este eventual nedescresctoare i
2 log 2 = 2 (log 2 + log ) = (2 log 2 ) + 2 log
= ( log )

( + log ) = (max( , log ))

De multe ori, timpul de execuie al unui algoritm se exprim sub forma unor inegaliti de forma

( )

( )
( 2 + 2) +

>

( )

( )
( 2 + 2) +

>

Pentru anumite constante ,

Putem scrie cele dou inegaliti astfel:

i pentru funcii

, :

( ) ( 2 + 2) + ( )
( ) ( 2 + 2) + ( )

Aceste dou expresii pot fi scrise i concentrat

Definim funcia
( )=

( 2 + 2) +

Am vzut c
constantele

pentru orice

( ) ( 2 + 2) + ( )
=1
1

( log ). Ne ntoarcem la funcia . prin inducie se demonstreaz c exist

astfel ca

. Deducem atunci c

( ) ( )
( ) = ( log )

10

Tehnici de analiz a algoritmilor


Nu exist formul general pentru analiza eficienei unui algoritm. Aceasta este mai curnd o
chestiune de raionament, intuiie i experien. Pe baza exemplelor de mai jos vom arata cum se poate
efectua diverse analize.
Analiza algoritmului de nsumare a elementelor din ir

Operaie de baz : adugarea unui element din ir la sum.


Mrime de intrare: , numrul de elemente din ir.
Indiferent de valorile numerelor din ir, vor fi

parcurgeri prin bucla for. De aceea ( ) =

Analiza algoritmului de sortare prin interschimbare

Algoritmul sorteaz, comparnd cheile, i schimb dac este cazul ntre dou elemente,
meninnd ordinea n ir. Vom parcurge irul n dou for-uri imbricate dup i i j.
Operaie de baz: compar [ ] cu [ ].

Mrime de intrare: , numrul de elemente de sortat.


Pentru un
sunt

dat, vor avea

1 parcurgeri ale for-ului pe variabila i. La primul pas din for-ul pe i,

1 parcurgeri pe for-ul ce are contorul j. n al doilea pas exist

.a.m.d. Numrul de parcurgeri ale for-ului i este:

( ) = ( 1) + ( 2) + + 1 =

2 parcurgeri n for-ul j,

( 1)
2

Analiza algoritmului de nmultirea a dou matrice

n cazul acesta, exist trei for-uri imbricate, iar cel mai interior, efectueaz o multiplicare i o adunare.
Operaia de baz: multiplicarea din cel mai interior for.
Mrimea de intrare: n numrul de coloane i rnduri.
Vor fi ntotdeauna

pai efectuai n fiecare for (cel de variabil i, cel de variabil j i cel de variabil k).
( )=

11

Analiza algoritmului de cutare secvenial cazul cel mai ru, cazul mediu

Dup cum am vzut, operaia de baz nu este aceeai pentru toate instanele de mrime

ale

unui algoritm. S considerm numrul maxim de operaii de baz pe care un algoritm le va face pentru a
ndeplini sarcina. Acesta se noteaz cu
exist, evident c

( ) i se numete complexitate a celui mai ru caz. Dac ( )

( ) = ( ). Cazul cutrii secveniale este unul elocvent, pentru c ( ) nu exist.

Operaie de baz : comparaia unui element din ir cu .


Mrimea de intrare : , numrul de elemente din ir.
Operaia de baz este executat n cel mai ru caz de
De aceea

ori, cnd

nu se afl printre elementele din ir.

( )= .

Dei cel mai ru caz ne informeaz despre timpul maxim absolut consumat, n unele cazuri
suntem interesai de timpul mediu necesar unui algoritm. Pentru un algoritm, fie ( ) numrul de ori de

cte ori algoritmul execut, n medie, operaia de baz, pentru o intrare

complexitate medie. La fel ca n cazul celui mai ru caz, dac ( ) exist, ( ) = ( ).

( ) se numete

n cele ce urmeaz vom analiza cazul mediu n cutarea secvenial.


Operaie de baz: comparaia unui element din ir cu .

Mrimea de intrare: , numrul de elemente din ir.


Prima dat, vom analiza cazul n care
pentru un , cu 1

se afl n , toate elementele din sunt distincte. Astfel,

, probabilitatea ca

poziia , avem nevoie de

s se gseasc pe poziia

este 1/ . Dac

se afl pe

operaii pentru a-l localiza pe . Atunci timpul mediu este:

( )=

( + 1)
=
2

+1
2

Aa cum era de ateptat, n acest caz, aproximativ jumtate din ir este parcurs.
Vom analiza n cele ce urmeaz cazul n care

s-ar putea s nu fie n ir.

Atribuim o probabilitate , evenimentului c

se afl n ir. Dac

se afl n ir, atunci el se va

afla pe una din poziiile de la 1 la . Probabilitatea ca

s se afle pe poziia

este , iar probabilitatea ca

s nu se afle n ir este 1 . Astfel timpul mediu este:


( )=

+ (1 ) =

12

( + 1)
+ (1 ) =
2

Dac

= 1 atunci ( ) = ( + 1)2 i obineam cazul anterior, n care suntem siguri c se afl

printre elementele lui ( ).

Sortarea prin selectie

Considerm algoritmul de sortare prin selecie prezentat n primul curs. Timpul pentru o singur
execuie a buclei interioare poate fi mrginit superior de o constant a. n total, pentru un i dat, bucla
interioar necesit un timp de cel mult

+ ( ) uniti, unde

este constanta ce reprezint timpul

necesar iniializrii buclei. O singur execuie a buclei exterioare are loc n cel mult
uniti, unde este o alt constant. Algoritmul dureaz cel mult

uniti de timp, unde

( + + ( ))

+ +

este o alt constant.

+ + ( )

Simplificnd, obinem
( 2)

+( )

De unde deducem c algoritmul necesit un ordin de timp

). Nu este necesar s

considerm cazul mediu deoarece timpul este independent de o ordonare n prealabil a elementelor.

De obicei, detalii ca iniializarea buclei, nu se vor considera explicit. Pentru cele mai multe
situaii, este suficient s alegem ca barometru o anumit instruciune din algoritm i s numrm de
cte ori se execut aceast instruciune.

Sortarea prin insertie

Timpul pentru acest algoritm, prezentat tot n primul curs, este dependent de ordonarea
prealabil a elementelor de sortat. Folosim comparaia [ ] >

este fixat i fie

= [ ]. Cel mai nefavorabil caz apare cnd

Numrul total de comparaii pentru cazul cel mai nefavorabil este:


( 1) =

(1)
(
2
13

ca barometru. S presupunem c
< [ ] pentru fiecare i ntre 2 i i1.
)

Vom estima timpul mediu necesar pentru un caz oarecare. Presupunem c elementele tabloului
sunt distincte i c orice permutare a lor are aceeai probabilitate de apariie.
Dac 1

[ ] s fie al

, probabilitatea ca

[1] [ ] este 1/ . Pentru un

[ ] < [ 1] este fals cu probabilitatea 1/ .

fixat condiia

Probabilitatea ca s se execute comparaia

-lea i cel mai mare dintre elementele

< [ ] o singur dat nainte de ieirea din bucl este 1/ .

Probabilitatea ca i comparaia se poate executa de exact dou ori, este tot de 1/ . Probabilitatea ca i

comparaia s se execute de exact


[1]

1 ori este 2/ deoarece se ntmpl cnd

< [2]. Pentru un numr fixat, numrul mediu de comparaii este:

< [1] i cnd

1
1
1
2
+1 1
= 1 + 2 + ( 2) + ( 1) =

Pentru a sorta cele

elemente vom avea nevoie de


+3

Unde prin

adic:

(log ) am notat al -lea element al seriei armonice.

n cazul mediu, algoritmul efectueaz de dou ori mai puine comparaii dect pentru cazul cel
mai ru. totui numrul comparaiilor este n ambele situaii n (

).

Heapsort

Vom analiza prima dat algoritmul make-heap din cursul anterior. Definim ca barometru
instruciunile din bucla repeat din algoritmul de sift-down. Fie m numrul maxim de repetri al acestei
bucle, cauzat de apelul lui
execut instruciunea

( , ) unde

la a -a repetare a buclei. Pentru t=1

celei de-a ( 1)-a repetri a buclei avem

2 . n general

Atunci,

Rezult c 2

unde

este fixat. Notm cu

iar de aici rezult relaia

1 + log

valoarea lui

= . Dac 1 <
2

dup ce se
, la sfritul

pentru 1 <

2
.

Numrul total de executri ale buclei repeat la formarea unui heap este mrginit superior de
1 + log

= /2

Pentru a simplifica aceast expresie, s observm c pentru orice


14

log

2 log

unde

=2

=2

Descompunem expresia de mai sus n seciuni ale puterilor lui 2 i notm

log

Aceast inegalitate pornete de la egalitatea:


2 log

2 log

= 2

log

log

= log( /2)

2 log

Egalitatea de mai sus poate fi demonstrat la rndul ei prim formula:


2 log

Mai rmne s demonstrm c

Dar

= log

= 2

2
2

implic faptul c

1 log

= ( 1)2

+ 1 log i

(2

+2

1 log . n concluzie

log

Deducem astfel c make-heap necesit un timp de

( ). Pe de alt parte, deoarece orice

algoritm pentru formarea unui heap trebuie s utilizeze fiecare element cel puin odat rezult c
( ). Cu alte cuvinte, (n). Se poate compara acest algoritm cu timpul de rulare al slow-make-

heap.

Pentru cel mai nefavorabil caz,

( [1. . 1], 1) necesit un timp n (log ). innd cont c

make-heap este liniar, rezult c algoritmul heapsort are un ordin de timp ( log ). Acest lucru este

valabil att pentru cazul nefavorabil ct i pentru cazul mediu.


Turnurile din Hanoi

Aceast problem a fost descris n primul curs.


Observm c pentru a muta cele mai mici
3, ,

discuri de pe tija pe tija (unde 1 3, 1

1), transferm cele mai mici n-1 discuri de pe tija pe tija 6 , apoi transferm discul
15

de pe tija pe tija , apoi retransferm cele n-1 discuri de pe tija 6 pe tija . Astfel reducem

problema mutrii a

discuri la problema mutrii a

Urmtoarea procedur descrie acest algoritm.

( , , )

1.
2.
3.

1 discuri.

>0

( 1, , 6 )

4.

5.

( 1,6 , )

Apelul iniial este

(64,1,2)

Considerm instruciunea scrie ca barometru. Timpul necesar algoritmului este dat de urmtoarea
recuren:
( )=

1
2 ( 1) + 1

=1
>1

Rezult c ( ) = 2 1. Vom demonstra acest lucru n cele ce urmeaz.

Analiza algoritmilor recursivi


Cel mai important ctig al recursivitii este faptul c ea este natural, i compact, fr s
ascund esena algoritmului prin detaliile din implementare. Pe de alt parte, apelurile recursive trebuie
folosite cu discernmnt, deoarece solicit resursele calculatorului. Iat cteva tehnici de analizare a
algoritmilor recursivi.

Metoda iteratiei

Se execut primii pai, se intuiete forma general, iar apoi se demonstreaz prin inducie
matematic c forma este corect. S considerm de exemplu recurena problemei turnurilor din Hanoi.
Pentru un anumit

> 1 obinem succesiv

( ) = 2 ( 1) + 2 = 2 ( 2) + 2 + 2 = = 2
16

(1) +

Rezult ( ) = 2 1

Inductia constructiv

Inducia matematic este folosit de obicei ca tehnic de demonstrare a unei aseriuni deja
enunate. Vom vedea n aceast seciune c inducia matematic poate fi utilizat cu succes i n
descoperirea enunului aseriunii. Aplicnd aceast tehnic, putem simultan s demonstrm o aseriune
doar parial specificat i s descoperim specificaiile care lipsesc i datorit crora aseriunea este
corect. Vom vedea c aceast tehnic este util pentru rezolvarea unor recurene ce apar n contextul
analizei algoritmilor.
Fie funcia :

, definit prin recurena


( )=

S presupunem c nu tim c ( ) =
Avem ( ) =

=0
>0

( 1) +
(

i s cutm aceast formul.

). Aceasta ne sugereaz ipoteza induciei conform creia ( ) =

Deci ( ) (

. Aceast ipotez este parial, adic

, , , nu sunt cunoscute deocamdat. Tehnica induciei

constructive const n a demonstra prin inducie matematic aceast ipotez incomplet i a determina
n acelai timp valorile constantelor necunoscute. Presupunem ipoteza de mai sus valabil pentru
( ) = ( 1) + ( 1) + +

+ (1 +

2 ) +( + )

Dac dorim s artm ca formula este valabil pentru , trebuie s artm c ( ) =

+ . Prin identificarea coeficienilor puterilor lui n obinem ecuaiile

1:
+

1+ 2 =

Cu soluia

+ =

= 1/2 iar putnd fi orice numr.

Rezult c ( ) =

+ + . Rmne s artm c relaia este valabil i pentru primul pas, 0.

Rezult c ( ) =

+ pentru orice .

(0) =

0+

0 + = . Dar cum ( ) = 0 pentru

17

= 0 avem

= 0.

Recurente liniare omogene

Exist i tehnici ce pot fi folosite aproape automat pentru a rezolva anumite clase de recurene.
Vom ncepe prin a considera ecuaii recurente liniare omogene, adic de forma

unde

++

sunt valorile cutate iar coeficienii

=0

sunt constante.

Conform intuiiei vom cuta soluii de forma


=

ncercm aceast soluie i obinem


+

+ +

Soluia trivial nu ne intereseaz. Presupunnd c avem


=

=0

rdcini ale ecuaiei rezult:

Orice combinaie este soluie a recurenei, unde constantele

,,

condiiile iniiale. Vom exemplifica prin recurena care definete irul Fibonacci:

Iar

Ecuaia caracteristic este:

Rdcinile acestei ecuaii sunt

Impunnd condiiile iniiale obinem


+
de unde determinm

= 1. Putem s rescriem aceast recurena ca

= 0,

iar

1 = 0

. Soluia general are forma:

=
+
=

=0

+
=0

=1

18

=0

=1
)

sunt determinate de

Obinem

( )

Se poate vedea c algoritmul lui Fibonacci are un ordin exponenial.


Ce facem dac rdcinile ecuaiei caracteristice nu sunt distincte? Se poate arta c dac r este
o rdcin de multiplicitate m, a ecuaiei caracteristice atunci

,,

Soluia general pentru o astfel de recuren este o combinaie liniar a acestpr termeni i a
termenilor provenii din celelalte rdcini ale ecuaiei caracteristice.
Recurente liniare neomogene

Considerm urmtoarea formul general pentru recurene:

unde

++

este o constant, iar ( ) este un polinom in

( )

de grad . Ideea este c prin manipulri

convenabile, putem reduce un astfel de caz la o form omogen.


Un exemplu pentru o astfel de recuren poate fi :

n acest caz

Pentru

=3

=3

= 3, ( ) = 1. nmulim recurena cu 3 rezult


3

+ 1 avem

Dac scdem cele dou ecuaii obinem

6
5

=3

+6

=0

Am obinut o ecuaie de recuren omogen, pe care o putem rezolva ca pe precedenta. Ecuaia


caracteristic este:
5 +6 = 0

adic ( 2)( 3) = 0. Se observ c factorul ( 2) corespunde prii stngi a recurenei iniiale

iar ( 3) a aprut ca rezultat al manipulrilor efectuate, pentru a elimina partea dreapta.

Generaliznd, s lum ecuaia caracteristic:


+

++

( )

=0

Vom rezolva acum recurena corespunztoare problemei turnurilor din Hanoi:


19

Iar

= 0. Rescriem recurena astfel:

care este de forma de mai sus cu


soluiile 1,2. Soluia general este
= 0. Pentru a doua calculm
Rezult astfel c ordinul lui
Schimbarea variabilei

=2

+1

=1

= 1, ( ) = 1. Ecuaia caracteristic este ( 2)( 1) = 0 cu

=2

2 . Avem nevoie de dou condiii iniiale. Una este

1 +

+ 1. Rezult

= 2 1

este (2 ).

Uneori, printr-o schimbare de variabil, putem rezolva recurene mult mai complicate.
Iat un exemplu n acest sens:
( )=4

n care nlocuim pe

>1

cu 2 , notm cu

= (2 ) = ( ). Obinem

Ecuaia caracteristic a acestei recurene este:

i deci,

4 +

Rezult c ( ) (

2 . nlocuim pe
) unde

=4

+2

( 4)( 2) = 0

cu log rezult:
( )=

este o putere a lui 2.

20

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