Documente Academic
Documente Profesional
Documente Cultură
Eficienta Algoritmilor PDF
Eficienta Algoritmilor PDF
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.
1.
( , )
(
2.
3.
4.
5.
6.
>
[ ]
+1
] )
1.
( , )
2.
3.
4.
5.
6.
7.
8.
9.
[ ]
=(
( = [
(
10.
+ )/2
])
< [
])
= 0)
=
+1
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,
ar fi comparat cu [
nu se afl n ir.
cu [
]. ntr-un
. Dac
nu se afl
oarecare,
+1.
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
, 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
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 :
= 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
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
( ) =
( )
( ) ( )
( )
( ) i
( ), pentru un
astfel nct ea
mulime, vom scrie " ( ) = ( ( ))" pentru a indica faptul c ( ) este un membru al ( ( )).
mari ca
legat de ( ).
( ) i
mai
Definiia lui ( ( )) presupune ca fiecare membru al lui ( ( )) s fie asimptotic nenegativ, adic
( ) s fie nenegativ cnd
( ).
>
, valoarea lui ( )
pentru orice
. mprim prin
Astfel alegnd
= i
1 alegnd
7 i alegnd
= 7, putem verifica c
astfel ca:
).
, rezult:
3 = (
3 = (
. De asemenea,
).
Evident, se pot alege alte constante, important este c am gsit una din opiuni.
(
). S
este
. Dar atunci,
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
constante cu
( )=
= ,
= 2
pentru orice
).
+ , unde
| |
,(
| |
, ,
sunt
) .
funcie polinomial n care termenul cu cel mai mare grad are coeficient pozitiv avem ( ) = (
unde
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 ( )
( )
pentru a desemna limita superioar a unei funcii. Figura 2b) prezint acest
>
= (
+ | | i
> 0 este n (
> 0 se afl n (
+ se afl n
) este
).
), afirmaie ce se
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.
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
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 ( ) ( )
Teorema 1
Pentru orice dou funcii ( ) i ( ), ( ) = ( ( )) dac i numai dac ( ) = ( ( ))
i ( ) = ( ( )).
).
, ,
cu
+ = (
) pentru orice
+ = (
) i c
+ =
Din moment ce descrie o limit inferioar, o vom folosi pentru a descrie cel mai bun caz al
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
cu valori n
dac ( ) = ( ).
) (
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
+ 8) = (max(
,3
+ 8)) = (
8
=
max
+
2
3
2
= (
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
( | )=
un predicat.
( ) ( ) ( )
i orice
avem ( ) ( ).
Fie
Proprietatea 1
2 un ntreg oarecare, :
( )=
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
=1
1
2 ( 2) +
2)
este neted.
(1) =
<
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 )
De multe ori, timpul de execuie al unui algoritm se exprim sub forma unor inegaliti de forma
( )
( )
( 2 + 2) +
>
( )
( )
( 2 + 2) +
>
i pentru funcii
, :
( ) ( 2 + 2) + ( )
( ) ( 2 + 2) + ( )
Definim funcia
( )=
( 2 + 2) +
Am vzut c
constantele
pentru orice
( ) ( 2 + 2) + ( )
=1
1
astfel ca
. Deducem atunci c
( ) ( )
( ) = ( log )
10
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 [ ].
( ) = ( 1) + ( 2) + + 1 =
2 parcurgeri n for-ul j,
( 1)
2
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
ori, cnd
( )= .
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
( ) se numete
, probabilitatea ca
s se gseasc pe poziia
este 1/ . Dac
se afl pe
( )=
( + 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 se afle pe poziia
+ (1 ) =
12
( + 1)
+ (1 ) =
2
Dac
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
necesar iniializrii buclei. O singur execuie a buclei exterioare are loc n cel mult
uniti, unde este o alt constant. Algoritmul dureaz cel mult
( + + ( ))
+ +
+ + ( )
Simplificnd, obinem
( 2)
+( )
). 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.
Timpul pentru acest algoritm, prezentat tot n primul curs, este dependent de ordonarea
prealabil a elementelor de sortat. Folosim comparaia [ ] >
(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
fixat condiia
Probabilitatea ca i comparaia se poate executa de exact dou ori, este tot de 1/ . Probabilitatea ca i
1
1
1
2
+1 1
= 1 + 2 + ( 2) + ( 1) =
Unde prin
adic:
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
2 . n general
Atunci,
Rezult c 2
unde
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
log
2 log
unde
=2
=2
log
2 log
= 2
log
log
= log( /2)
2 log
Dar
= log
= 2
2
2
implic faptul c
1 log
= ( 1)2
+ 1 log i
(2
+2
1 log . n concluzie
log
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.
make-heap este liniar, rezult c algoritmul heapsort are un ordin de timp ( log ). Acest lucru este
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
( , , )
1.
2.
3.
1 discuri.
>0
( 1, , 6 )
4.
5.
( 1,6 , )
(64,1,2)
Considerm instruciunea scrie ca barometru. Timpul necesar algoritmului este dat de urmtoarea
recuren:
( )=
1
2 ( 1) + 1
=1
>1
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
( ) = 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 :
S presupunem c nu tim c ( ) =
Avem ( ) =
=0
>0
( 1) +
(
Deci ( ) (
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 ) +( + )
1:
+
1+ 2 =
Cu soluia
+ =
Rezult c ( ) =
Rezult c ( ) =
+ pentru orice .
(0) =
0+
17
= 0 avem
= 0.
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
++
=0
sunt constante.
+ +
=0
,,
condiiile iniiale. Vom exemplifica prin recurena care definete irul Fibonacci:
Iar
= 0,
iar
1 = 0
=
+
=
=0
+
=0
=1
18
=0
=1
)
sunt determinate de
Obinem
( )
,,
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
unde
++
( )
n acest caz
Pentru
=3
=3
+ 1 avem
6
5
=3
+6
=0
++
( )
=0
Iar
=2
+1
=1
=2
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
i deci,
4 +
Rezult c ( ) (
2 . nlocuim pe
) unde
=4
+2
( 4)( 2) = 0
cu log rezult:
( )=
20