Au confruntat cu originalul:
Carmen Bucur, Clara Ionescu, Simona Motogna, Drago Petracu
Filolog: cerc. princ. Ileana Cmpean
Copyright c Ediia n limba romn Computer Libris Agora
ISBN 973-97534-7-7
Cuprins
Prefa xi
1. Introducere 1
1.1. Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Analiza algoritmilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3. Proiectarea algoritmilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.4. Rezumat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
I. Fundamente matematice 18
2. Creterea funciilor 20
2.1. Notaia asimptotic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.2. Notaii standard i funcii comune . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3. Sume 37
3.1. Formule de nsumare i proprieti . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2. Delimitarea sumelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4. Recurene 46
4.1. Metoda substituiei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2. Metoda iteraiei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.3. Metoda master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4. Demonstraia teoremei master . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5. Mulimi etc. 66
5.1. Mulimi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.2. Relaii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3. Funcii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4. Grafuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5. Arbori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
iv Cuprins
6. Numrare i probabilitate 86
6.1. Numrare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
6.2. Probabilitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.3. Variabile aleatoare discrete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.4. Distribuia geometric i distribuia binomial . . . . . . . . . . . . . . . . . . . 100
6.5. Cozile distribuiei binomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
6.6. Analiz probabilistic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
36.NP-completitudine 785
36.1. Timpul polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
36.2. Verificri n timp polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
36.3. NP-completitudine i reductibilitate . . . . . . . . . . . . . . . . . . . . . . . . . 796
36.4. Demonstraii ale NP-completitudinii . . . . . . . . . . . . . . . . . . . . . . . . . 804
36.5. Probleme NP-complete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
Bibliografie 845
Index 853
Prefaa ediiei n limba romn
Stimai cititori,
Ani de zile am visat apariia acestei cri. tiu c muli profesori, elevi i studeni au cutat
lucrarea semnat de Thomas H. Cormen, Charles E. Leiserson i Ronald L. Rivest n original
sau diverse traduceri ale ei. Unii, mai norocoi, au reuit poate s mprumute cartea din diverse
locuri, pentru scurte perioade de timp. Dar aceast carte conine un volum foarte mare de
cunotine i nu este suficient s o rsfoieti ntr-un sfrit de sptmn, ci este nevoie de luni,
poate ani, pentru a putea asimila toate informaiile cuprinse ntr-o lucrare ca aceasta.
Primul contact cu MIT Press l-am stabilit n toamna anului 1998. Mulumim doamnei
Cristina Sanmartin (MIT Press) c ne-a ncurajat i a intermediat semnarea contractului
pentru traducere i editare n limba romn. Acum suntem deja n 2000. A durat traducerea,
tehnoredactarea i tiprirea. Pentru apariia n limba romn a crii, adresez mulumiri
profesorilor de la Universitatea Babe-Bolyai i de la Universitatea Bucureti, studenilor i
prietenilor care au sacrificat multe ore din timpul lor liber, pentru ca dumneavoastr s putei
ine aceast carte n mn.
Domnul confereniar dr. Horia F. Pop, de la Universitatea Babe-Bolyai, Facultatea de
Matematic i Informatic, a coordonat traducerea, a stabilit mpreun cu traductorii modul
de traducere a termenilor de specialitate noi, ncepnd cu index-ul, pentru a asigura o traducere
coerent, omogen i pe ct posibil unitar. De asemenea, a pregtit i coordonat utilizarea de
ctre traductori a sistemului LATEX.
Am lucrat cu cadre didactice universitare de specialitate deoarece o asemenea carte nu se
traduce doar cu lingviti, este nevoie de specialiti din domeniu care neleg foarte bine coninutul
tiinific i sunt de acord s reformuleze anumite pri pentru a exprima ceea ce de fapt autorul
a dorit s comunice. Mulumim domnilor (n ordine alfabetic) lector dr. Paul Blaga, profesor
dr. Florian Mircea Boian, drd. Liana Bozga, profesor dr. Zoltn Ksa, lector drd. Ioan Lazar,
lector drd. Simona Motogna, asistent drd. Virginia Niculescu, profesor dr. Bazil Prv, lector dr.
Radu Trmbia, de la Universitatea Babe-Bolyai din Cluj, domnului profesor Liviu Negrescu
de la Universitatea Tehnic din Cluj, domnului profesor dr. Horia Georgescu de la Academia de
Studii Economice, doamnei profesor dr. Luminia State de la Universitatea din Piteti, doamnei
lector drd. Cristina Vertan, de la Universitatea Bucureti i nu n ultimul rnd studenilor Adrian
Monea i Mihai Scoraru, de la Universitatea Tehnic din Cluj.
Cum aceasta este prima carte editat de Computer Libris Agora n LATEX, tehnoredactarea
a constituit i ea un efort. n special pregtirea desenelor a ridicat multe probleme, graficianul
x
nostru Dan Creu lucrnd nenumrate ore la realizarea acestora. Asistena tehnic n domeniul
pregtirii pentru tipar a fost acordat de Mihai Uricaru.
ntr-o carte de asemenea dimensiuni i complexitate cu siguran se strecoar i unele greeli.
Am dori ca acestea s fie eliminate din viitoarele ediii ale lucrrii. Din acest motiv, v rugm
s ne transmitei observaiile i sugestiile dumneavoastr pe adresa de e-mail:
clara@cs.ubbcluj.ro
sau pe adresa editurii:
Editura Computer Libris Agora
Str. Universitii nr. 8
3400 Cluj Napoca
Tel.: 064-192422
Urmnd exemplul american, lista cu greelile gsite va fi disponibil pe Internet. Cei care
doresc s intre n posesia ultimei erate pot trimite un mesaj la adresa algoritmi@agora.ro
coninnd expresia erata algoritmi n cmpul Subject i vor primi automat ultima versiune n
format electronic. Alternativ, putei vizita pagina
http://www.libris.agora.ro/algoritmi/erata.html.
Autorii, aa cum am aflat de la MIT Press, lucreaz la o versiune nou a crii, revizuit i
mbogit. V promitem c, imediat ce aceast versiune va fi disponibil pentru traducere, o
vom publica i n limba romn.
Pentru profesori
Aceast carte a fost conceput pentru a fi att multilateral ct i complet. O vei gsi util
pentru diverse cursuri, de la un curs elementar de structuri de date pn la un curs academic
de algoritmi. Deoarece am adunat considerabil mai mult material dect poate ncpea ntr-un
curs obinuit de un semestru, cartea poate fi privit ca un depozit din care se poate alege
materialul cel mai adecvat cursului care urmeaz s fie prezentat.
Vi se va prea uor s v organizai cursul doar pe baza capitolelor care v sunt necesare.
Am conceput capitolele relativ de sine stttoare, astfel nct s nu depindei n mod neateptat
sau inutil de informaii din alte capitole. Fiecare capitol prezint la nceput noiunile mai simple
i apoi, cele mai dificile, partiionarea pe seciuni mrginind n mod natural punctele de oprire.
Pentru un curs elementar se pot folosi doar primele seciuni dintr-un capitol; pentru un curs
avansat se poate parcurge ntreg capitolul.
Am inclus peste 900 de exerciii i peste 120 de probleme. Fiecare seciune se ncheie cu
exerciii, iar fiecare capitol cu probleme. Exerciiile sunt, n general, ntrebri scurte care testeaz
stpnirea noiunilor de baz prezentate. Unele dintre ele sunt simple verificri, n timp ce altele
sunt potrivite ca teme de cas. Problemele reprezint studii de caz mult mai elaborate, care de
multe ori introduc noiuni noi; n general, constau din mai multe ntrebri care conduc studentul
prin paii necesari pentru a ajunge la o soluie.
Am notat cu (*) seciunile i exerciiile care se adreseaz mai degrab studenilor avansai
dect celor nceptori. O seciune marcat cu (*) nu este n mod necesar mai dificil dect
xii Prefa
una obinuit, dar poate necesita nelegerea unor noiuni matematice mai complexe. n mod
asemntor, exerciiile marcate cu (*) pot necesita cunotine mai avansate sau creativitate mai
mult dect medie.
Pentru studeni
Sperm ca textul acestei cri s ofere o introducere plcut n domeniul algoritmilor. Am
intenionat s prezentm fiecare algoritm ntr-o manier accesibil i interesant. Pentru a fi un
ajutor cnd ntlnii algoritmi neobinuii sau dificili, am descris fiecare algoritm pas cu pas.
De asemenea, am oferit explicaii detaliate a noiunilor matematice necesare nelegerii analizei
algoritmilor. Dac deja dispunei de cunotine relative la un anumit subiect, atunci vei gsi
capitolele organizate astfel nct putei frunzri seciunile introductive i s v concentrai asupra
noiunilor mai complexe.
Fiind o carte vast, e posibil ca ceea ce vi se pred s acopere doar o parte a acestui material.
Oricum, ne-am strduit s construim aceast carte util i ca suport de curs, i ca o referin
teoretic i pratic n cariera voastr viitoare.
Care sunt cerinele pentru a nelege aceast carte?
Pentru profesioniti
Aria larg de subiecte prezentate n aceast carte o recomand ca un excelent manual de
algoritmi. Deoarece fiecare capitol este conceput relativ independent, v putei concentra doar
asupra subiectelor care v intereseaz.
Majoritatea algoritmilor luai n discuie au o mare aplicabilitate practic. Din acest motiv,
lum n studiu i aspecte legate de implementare i alte probleme inginereti. n general, am
propus alternative practice puinilor algoritmi care prezint interes primordial teoretic.
Dac dorii s implementai oricare dintre algoritmi, vei constata c transcrierea algortimilor
din pseudocod n limbajul de programare preferat este o sarcin relativ uoar. Limbajul
pseudocod este astfel proiectat nct s prezinte fiecare algoritm ntr-un stil clar i concis.
n consecin, nu lum n considerare tratarea erorilor sau alte aspecte tehnice care necesit
presupuneri specifice relative unor medii de programare. Am urmrit s prezentm fiecare
algoritm simplu i direct, fr a ne opri asupra detaliilor relative la limbaje de programare.
Erori
O carte de asemenea dimensiune este n mod cert supus erorilor i omisiunilor. Dac
descoperii o eroare sau avei unele sugestii constructive, am aprecia s ni le mprtii. Sunt
binevenite, n mod special, sugestii pentru noi exerciii i probleme, dar v rugm s includei i
soluiile. Le putei trimite prin pot, pe adresa:
xiii
Introduction to Algorithms
MIT Laboratory for Computer Science
545 Technology Square
Cambridge, Massachusetts 02139
Sau, putei folosi pota electronic pentru a semnala erori, pentru a cere o erat sau pentru a
face sugestii constructive. Pentru a primi instruciunile de rigoare, trimitei un mesaj pe adresa
algorithms@theory.lcs.mit.edu cu Subject: help n antetul mesajului. Regretm c nu
putem rspunde personal la toate mesajele.
Mulumiri
Mai muli prieteni i colegi au contribuit la calitatea acestei cri. Le mulumim tuturor
pentru ajutorul dat i pentru observaiile constructive pe care ni le-au adresat.
Laboratorul de Informatic al Universitii MIT a reprezentat un cadru de lucru ideal. n
mod deosebit, colegii notri de la laboratorul Grupului de Teoria Calculatoarelor ne-au ajutat
i acceptat cererile noastre continue de parcurgere critic a capitolelor. Dorim s mulumim
n mod special urmtorilor colegi: Baruch Awerbuch, Shafi Goldwasser, Leo Guibas, Tom
Leighton, Albert Meyer, David Shmoys i Eva Tardos. Mulumiri lui William Ang, Sally Bemus,
Ray Hirschfeld i Mark Reinhold pentru ntreinerea calculatoarelor (DEC Microvax, Apple
Macintosh i Sun Sparcstation) i pentru recompilarea TEX ori de cte ori am depit limita
timpului de compilare. Menionm ajutorul oferit lui Charles Leiserson de Machines Corporation,
pentru a putea lucra la aceast carte chiar i n perioada absenei sale de la MIT.
Muli dintre colegii notri au folosit manuscrise ale acestei cri pentru cursuri predate la alte
coli, sugernd numeroase corecii i revizuiri. Dorim s mulumim n mod deosebit urmtorilor:
Richard Beigel (Yale), Andrew Goldberg (Stanford), Joan Lucas (Rutgers), Mark Overmars
(Utrecht), Alan Sherman (Tufts i Maryland) i Diane Souvaine (Rutgers).
De asemenea, muli asisteni ai cursurilor noastre au avut contribuii majore la dezvoltarea
acestei cri. Mulumim n mod special urmtorilor: Alan Baratz, Bonnie Berger, Aditi Dhagat,
Burt Kaliski, Arthur Lent, Andrew Moulton, Marios Papaefthymiou, Cindy Phillips, Mark
Reinhold, Phil Rogaway, Flavio Rose, Arie Rudich, Alan Sherman, Cliff Stein, Susmita Sur,
Gregory Troxel i Margaret Tuttle.
Asistena tehnic necesar a fost asigurat de mai multe persoane. Denise Sergent a petrecut
multe ore n bibliotecile universitii MIT pentru a cuta referine bibliografice. Maria Sensale,
bibliotecara slii noastre de lectur, a fost tot timpul deosebit de sritoare. Accesul la biblioteca
personal a lui Albert Meyer ne-a economisit mult timp n pregtirea referinelor bibliografice.
Shlomo Kipnis, Bill Niehaus i David Wilson au demonstrat vechi exerciii, au propus unele noi i
au schiat notie relative la rezolvarea lor. Marios Papaefthymiou i Gregory Troxel au contribuit
la realizarea indexului. De-a lungul anilor, secretarele nostre: Inna Radzihovsky, Denise Sergent,
Gayle Sherman i n mod deosebit Be Hubbard au fost un sprijin continuu n acest proiect,
pentru care le aducem mulumiri.
Multe erori din primele manuscrise au fost detectate de studeni. Mulumim n mod special
urmtorilor: Bobby Blumofe, Bonnie Eisenberg, Raymond Johnson, John Keen, Richard Lethin,
Mark Lillibridge, John Pezaris, Steve Ponzio i Margaret Tuttle pentru parcurgerile i corecturile
efectuate.
De asemenea, colegii notri au adus critici asupra anumitor capitole, ne-au oferit indicaii
asupra unor algoritmi specifici, motiv pentru care le suntem ndatorai. Mulumim n mod
xiv Prefa
deosebit urmtorilor: Bill Aiello, Alok Aggarwal, Eric Bach, Vaek Chvtal, Richard Cole, Johan
Hastad, Alex Ishii, David Johnson, Joe Killian, Dina Kravets, Bruce Maggs, Jim Orlin, James
Park, Thane Plambeck, Hershel Safer, Jeff Shallit, Cliff Stein, Gil Strang, Bob Tarjan i Paul
Wang. Civa colegi ne-au oferit probleme propuse; le mulumim urmtorilor: Andrew Goldberg,
Danny Sleator i Umesh Vazirani.
Aceast carte a fost redactat cu LATEX, un pachet de macrouri TEX. Figurile au fost desenate
pe Apple Macintosh folosind MacDraw II; mulumim lui Joanna Terry de la Claris Corporation
i lui Michael Mahoney de la Advanced Computer Graphics pentru sprijinul lor. Indexul a
fost compilat folosind Windex, un program C scris de autori. Bibliografia a fost pregtit
folosind BibTEX. Cartea a fost tiprit la American Mathematical Society cu ajutorul unei
maini Autologic; mulumim lui Ralph Youngen de la AMS pentru ajutorul dat. Coperta crii
a fost conceput de Jeannet Leendertse. Design-ul crii a fost creat de Rebecca Daw, iar Amy
Hendrickson l-a implementat n LATEX.
Colaborarea cu MIT Press i McGraw-Hill a fost deosebit de plcut. Mulumim n mod
special urmtorilor: Frank Satlow, Terry Ehling, Larry Cohen i Lorrie Lejeune de la MIT Press
i David Shapiro de la McGraw-Hill pentru ncurajri, sprijin i rbdare. Suntem deosebit de
recunosctori lui Larry Cohen pentru editarea excepional.
n fine, mulumim soiilor noastre Nicole Cormen, Linda Lue Leiserson i Gail Rivest
i copiilor notri Ricky, William i Debby Leiserson i Alex i Christopher Rivest pentru
dragostea i sprijinul lor pe ntreaga durat a scrierii acestei cri. (Alex Rivest ne-a ajutat n
mod special cu Paradoxul zilei de natere a marianului). Dragostea, rbdarea i ncurajarea
din partea familiilor noastre au fcut acest proiect posibil. Le dedicm din suflet aceast carte lor.
1.1. Algoritmi
Fr a fi foarte exaci, spunem c un algoritm este orice procedur de calcul bine definit
care primete o anumit valoare sau o mulime de valori ca date de intrare i produce o
anumit valoare sau mulime de valori ca date de ieire. Astfel, un algoritm este un ir de pai
care transform datele de intrare n date de ieire.
Putem, de asemenea, s privim un algoritm ca pe un instrument de rezolvare a problemelor
de calcul bine definite. Enunul problemei specific, n termeni generali, relaia dorit
intrare/ieire. Algoritmul descrie o anumit procedur de calcul pentru a se ajunge la aceast
legtur intrare/ieire.
Vom ncepe studiul algoritmilor cu problema sortrii unui ir de numere n ordine nedescres-
ctoare. Aceast problem apare frecvent n practic i furnizeaz o baz foarte util pentru
introducerea multor metode standard pentru proiectarea i analiza algoritmilor. Iat cum vom
defini formal problema sortrii :
Date de intrare: Un ir de n numere ha1 , a2 , . . . , an i.
Date de ieire: O permutare (reordonare) a irului iniial, ha01 , a02 , . . . , a0n i astfel nct a01
a02 a0n .
Fiind dat un ir de intrare, ca, de exemplu, h31, 41, 59, 26, 41, 58i, un algoritm de sortare
returneaz, la ieire, irul h26, 31, 41, 41, 58, 59i. Un ir de intrare ca cel de mai sus se numete
o instan a problemei de sortare. n general, prin instan a unei probleme se va nelege
mulimea tuturor datelor de intrare (care satisface restriciile impuse n definirea problemei)
necesare pentru a determina o soluie a problemei.
Sortarea este o operaie fundamental n informatic (multe programe o folosesc ca pas
intermediar) i, ca urmare, a fost dezvoltat un numr mare de algoritmi de sortare. Care algoritm
este cel mai bun pentru o aplicaie dat depinde de numrul de obiecte care trebuie sortate, de
2 Capitolul 1 Introducere
Figura 1.1 Modul de sortare a unei mini de cri, utiliznd sortarea prin inserie.
gradul n care aceste obiecte sunt deja sortate ntr-un anumit fel i de tipul de mediu electronic
care urmeaz s fie folosit: memorie principal, discuri sau benzi magnetice.
Un algoritm este corect dac, pentru orice instan a sa, se termin furniznd ieirea corect.
Vom spune c un algoritm corect rezolv problema de calcul dat. Un algoritm incorect s-ar
putea s nu se termine deloc n cazul unor anumite instane de intrare, sau s-ar putea termina
producnd un alt rspuns dect cel dorit. Contrar a ceea ce s-ar putea crede, algoritmii incoreci
pot fi uneori utili dac rata lor de eroare poate fi controlat. Vom vedea un exemplu n capitolul
33, cnd vom studia algoritmi pentru gsirea numerelor prime foarte mari. Totui, n general ne
vom ocupa doar de algoritmi coreci.
Concret, un algoritm poate fi specificat printr-un program pentru calculator sau chiar ca un
echipament hardware. Singura condiie este aceea ca specificaiile s produc o descriere precis
a procedurii de calcul care urmeaz a fi parcurs.
n aceast carte vom descrie algoritmii sub forma unor programe scrise ntr-un pseudocod
care seamn foarte mult cu limbajele C, Pascal sau Algol. Dac suntei ct de ct familiarizai
cu oricare dintre acestea, nu vei avea probleme n a citi algoritmii notri. Ceea ce difereniaz
codul real de pseudocod este faptul c vom folosi metoda cea mai clar i mai concis pentru a
descrie un algoritm dat. O alt diferen dintre pseudocod i codul real este aceea c pseudocodul
nu se ocup de detalii de utilizare. Problemele abstractizrii datelor, a modularitii sau a tratrii
erorilor sunt deseori ignorate, pentru a transmite ct mai concis esena algoritmului.
Pseudocodul pentru sortarea prin inserie este prezentat ca o procedur numit Sorteaz-
Prin-Inserie, care are ca parametru un vector A[1..n] coninnd un ir de lungime n care
urmeaz a fi sortat. (Pe parcursul codului, numrul de elemente ale lui A este notat prin
lungime[A].) Numerele de intrare sunt sortate pe loc, n cadrul aceluiai vector A; cel mult
un numr constant dintre acestea sunt memorate n zone de memorie suplimentare. Cnd
Sorteaz-Prin-Inserie se termin, vectorul iniial A va conine elementele irului de ieire
sortat.
Sorteaz-Prin-Inserie(A)
1: pentru j 2, lungime[A] execut
2: cheie A[j]
3: Insereaz A[j] n irul sortat A[1..j 1]
4: ij1
5: ct timp i > 0 i A[i] > cheie execut
6: A[i + 1] A[i]
7: ii1
8: A[i + 1] cheie
Figura 1.2 ilustreaz modul de funcionare a acestui algoritm pentru A = h5, 2, 4, 6, 1, 3i.
Indicele j corespunde crii care urmeaz a fi inserat n mna stng. Elementele A[1..j
1] corespund mulimii de cri din mn, deja sortate, iar elementele A[j + 1..n] corespund
pachetului de cri aflate nc pe mas. Indicele se deplaseaz de la stnga la dreapta n interiorul
vectorului. La fiecare iteraie, elementul A[j] este ales din vector (linia 2). Apoi, plecnd de la
poziia j 1, elementele sunt, succesiv, deplasate o poziie spre dreapta pn cnd este gsit
poziia corect pentru A[j] (liniile 47), moment n care acesta este inserat (linia 8).
1. Indentarea indic o structur de bloc. De exemplu, corpul ciclului pentru, care ncepe n
linia 1, const din liniile 28 iar corpul ciclului ct timp, care ncepe n linia 5, conine
liniile 67, dar nu i linia 8. Stilul nostru de indentare se aplic i structurilor de tipul
dac-atunci-altfel. Folosirea indentrii n locul unor indicatori de bloc de tipul begin i
end, reduce cu mult riscul de confuzie, mbuntind claritatea prezentrii.1
n general recomandabil, deoarece nivelurile de indentare se determin greoi n cazul unor coduri care se continu
pe mai multe pagini.
4 Capitolul 1 Introducere
5. Variabilele (de exemplu i, j, cheie) sunt locale pentru o procedur dat. Nu vom utiliza
variabile globale fr a preciza acest lucru n mod explicit.
6. Elementele unui vector sunt accesate specificnd numele vectorului urmat de indice n
paranteze drepte. De exemplu, A[i] indic elementul de rang i al vectorului A. Notaia ..
este folosit pentru a indica un domeniu de valori n cadrul unui vector. Astfel, A[1..j]
indic un subvector al lui A constnd din elementele A[1], A[2], . . . , A[j].
7. Datele compuse sunt, n mod uzual, organizate n obiecte care conin atribute sau cm-
puri . Un anumit cmp este accesat folosind numele cmpului urmat de numele obiectului
su n paranteze drepte. De exemplu, tratm un vector ca pe un obiect cu atributul lungime
indicnd numrul de elemente ale acestuia. Pentru a specifica numrul de elemente ale unui
vector A, se va scrie lungime[A]. Dei vom folosi parantezele drepte att pentru indexarea
elementelor unui vector, ct i pentru atributele obiectelor, va fi clar din context care este
interpretarea corect.
O variabil reprezentnd un vector sau un obiect este tratat ca un pointer spre datele
care reprezint vectorul sau obiectul. Pentru toate cmpurile f ale unui obiect x, atribuirea
y x are ca efect f [y] = f [x]. Mai mult, dac acum avem f [x] 3, atunci nu numai
f [x] = 3, dar, n acelai timp, avem si f [y] = 3. Cu alte cuvinte, x i y indic spre (sau
sunt) acelai obiect dup atribuirea y x. Uneori, un pointer nu se va referi la nici un
obiect. n acest caz special pointerul va primi valoarea nil.
8. Parametrii sunt transmii unei proceduri prin valoare: procedura apelat primete pro-
pria sa copie a parametrilor i, dac atribuie o valoare unui parametru, schimbarea nu este
vzut de procedura apelant. Cnd obiectele sunt transmise procedurii, este copiat doar
pointerul spre datele reprezentnd obiectul, nu i cmpurile acestuia. De exemplu, dac x
este un parametru al unei proceduri apelate, atribuirea x y n cadrul procedurii apelate
nu este vizibil din procedura apelant. Atribuirea f [x] 3 este, totui, vizibil.
1.2. Analiza algoritmilor 5
Exerciii
1.1-1 Folosind ca model figura 1.2, ilustrai modul de operare al procedurii Sorteaz-Prin-
Inserie asupra vectorului A = h31, 41, 59, 26, 41, 58i.
1.1-4 S considerm problema adunrii a doi ntregi binari pe n bii memorai n doi vectori
n-dimensionali A i B. Suma celor doi ntregi trebuie s fie memorat n form binar ntr-un
vector C avnd n + 1 elemente. Gsii un enun formal al problemei i scriei un algoritm pentru
adunarea celor doi ntregi.
proceduri care cer mai mult dect doar un timp constant. De exemplu, n continuare, n aceast carte am putea
spune, ntr-o linie de pseudocod, sorteaz punctele conform coordonatei x, care, aa cum vom vedea, cere mai
mult dect un timp constant. De asemenea, se poate observa c o instruciune care apeleaz o subrutin are
nevoie de un timp constant, dei subrutina, o dat apelat, are nevoie de mai mult timp de execuie. Din acest
motiv, separm procesul de a apela o subrutin trecerea parametrilor ctre aceasta etc. de procesul de a
executa subrutina.
1.2. Analiza algoritmilor 7
fiecrei instruciuni executate: o instruciune care consum timpul ci pentru execuie i este
executat de n ori, va contribui cu ci n la timpul total de execuie.3 Pentru a calcula T (n),
timpul de execuie pentru Sorteaz-Prin-Inserie, vom aduna produsele mrimilor indicate
n coloanele cost i timp, obinnd
n
X n
X n
X
T (n) = c1 n + c2 (n 1) + c4 (n 1) + c5 tj + c6 (tj 1) + c7 (tj 1)
j=2 j=2 j=2
+ c8 (n 1).
Chiar pentru date de intrare de aceeai mrime, timpul de execuie al unui algoritm dat poate
s depind de coninutul datelor de intrare. De exemplu, pentru Sorteaz-Prin-Inserie, cazul
cel mai favorabil apare cnd vectorul de intrare este deja sortat. Pentru fiecare j = 2, 3 . . . , n,
vom gsi c A[i] cheie n linia 5, cnd i are valoarea iniial j 1. Rezult tj = 1 pentru
j = 2, 3, . . . , n i timpul de execuie n cazul cel mai favorabil este
T (n) = c1 n + c2 (n 1) + c4 (n 1) + c5 (n 1) + c8 (n 1)
= (c1 + c2 + c4 + c5 + c8 )n (c2 + c4 + c5 + c8 ).
Acest timp de execuie poate fi exprimat sub forma an + b pentru anumite constante a i b care
depind doar de timpii de execuie ci , fiind astfel o funcie liniar de n.
Dac vectorul este sortat n ordine invers adic, n ordine descresctoare obinem cazul
cel mai defavorabil. n aceast situaie trebuie s comparm fiecare element A[j] cu fiecare
element din subvectorul A[1..j 1], i, astfel, tj = j pentru j = 2, 3, . . . , n. Observnd c
n
X n(n + 1)
j= 1
j=2
2
i
n
X n(n 1)
(j 1) =
j=2
2
3 Un fenomen de acest tip nu mai are loc atunci cnd se refer la alte resurse, cum ar fi, de exemplu, memoria.
O instruciune care se refer la m cuvinte din memorie i este executat de n ori, nu consum n general mn
cuvinte de memorie.
8 Capitolul 1 Introducere
(vom reveni asupra acestor sume n capitolul 3), gsim c n cazul cel mai defavorabil timpul de
execuie pentru Sorteaz-Prin-Inserie este
n(n + 1) n(n 1)
T (n) = c1 n + c2 (n 1) + c4 (n 1) + c5 1 + c6
2 2
n(n 1)
+ c7 + c8 (n 1)
2
c c6 c7 c5 c6 c7
5
= + + n2 + c1 + c2 + c4 + + c8 n
2 2 2 2 2 2
(c2 + c4 + c5 + c8 ) .
Rezult c timpul de execuie n cazul cel mai defavorabil poate fi exprimat sub forma
an2 + bn + c, unde constantele a, b i c depind, din nou, de costurile ci ale instruciunilor, fiind
astfel o funcie ptratic de n.
De obicei, la fel ca la sortarea prin inserie, timpul de execuie al unui algoritm dat este
fix pentru anumite date de intrare. Totui, n ultimele capitole, vom ntlni civa algoritmi
aleatori a cror comportare poate varia chiar pentru aceleai date de intrare.
Timpul de execuie al unui algoritm n cazul cel mai defavorabil este o margine superioar
a timpului de execuie pentru orice date de intrare de dimensiune fix. Cunoscnd acest
timp, avem o garanie c algoritmul nu va avea, niciodat, un timp de execuie mai mare.
Nu va fi nevoie s facem presupuneri sau investigaii suplimentare asupra timpului de
execuie i s sperm c acesta nu va fi, niciodat, mult mai mare.
Pentru anumii algoritmi, cazul cel mai defavorabil apare destul de frecvent. De exemplu,
n cutarea unei anumite informaii ntr-o baz de date, cazul cel mai defavorabil al
algoritmului de cutare va apare deseori cnd informaia cutat nu este de fapt prezent
n baza de date. n anumite aplicaii, cutarea unor informaii absente poate fi frecvent.
Cazul mediu este, adesea, aproape la fel de defavorabil ca i cazul cel mai defavorabil. S
presupunem c alegem la ntmplare n numere i aplicm sortarea prin inserie. Ct timp
va fi necesar pentru a determina locul n care putem insera A[j] n subvectorul A[1..j 1]?
n medie, jumtate din elementele subvectorului A[1..j 1] sunt mai mici dect A[j], i
cealalt jumtate sunt mai mari. Prin urmare, n medie, trebuie verificate jumtate din
elementele subvectorului A[1..j 1], deci tj = j/2. Dac inem seama de aceast observaie,
timpul de execuie mediu va aprea tot ca o funcie ptratic de n, la fel ca n cazul cel
mai defavorabil.
1.2. Analiza algoritmilor 9
Ordinul de cretere
Pentru a uura analiza procedurii Sorteaz-Prin-Inserie, am utilizat mai multe presu-
puneri simplificatoare. n primul rnd, am ignorat costul real al fiecrei instruciuni, folosind
constantele ci pentru a reprezenta aceste costuri. Apoi, am observat c, prin aceste constante,
obinem mai multe detalii dect avem nevoie n mod real: timpul de execuie n cazul cel mai
defavorabil este de forma an2 +bn+c pentru anumite constante a, b i c care depind de costurile ci
ale instruciunilor. Astfel, am ignorat nu numai costurile reale ale instruciunilor, dar i costurile
abstracte ci .
Vom face acum nc o abstractizare simplificatoare. Ceea ce ne intereseaz de fapt, este rata
de cretere sau ordinul de cretere a timpului de execuie. Considerm, prin urmare, doar
termenul dominant al formulei (adic an2 ) deoarece ceilali termeni sunt relativ nesemnificativi
pentru valori mari ale lui n. Ignorm, de asemenea, i factorul constant c, deoarece, pentru
numere foarte mari, factorii constani sunt mai puin semnificativi dect rata de cretere n
determinarea eficienei computaionale a unor algoritmi. Astfel, vom spune, de exemplu, c
sortarea prin inserie are un timp de execuie n cazul cel mai defavorabil de (n2 ) (pronunat
teta de n ptrat). Vom folosi notaia de tip n acest capitol cu caracter informal; va fi definit
cu precizie n capitolul 2.
n mod uzual, vom considera un algoritm ca fiind mai eficient dect altul dac timpul su
de execuie n cazul cel mai defavorabil are un ordin de cretere mai mic. Aceast evaluare ar
putea fi incorect pentru date de intrare de dimensiune mic, dar n cazul unor date de intrare
de dimensiuni foarte mari, un algoritm de tipul (n2 ), de exemplu, va fi executat n cazul cel
mai defavorabil mult mai repede dect unul de tipul (n3 ).
Exerciii
1.2-1 S considerm sortarea a n numere memorate ntr-un vector A, pentru nceput gsind
cel mai mic element al lui A i punndu-l ca prim element ntr-un alt vector B. Apoi, gsim al
doilea element mai mic din A i l punem pe poziia a doua a lui B. Continuai n acelai mod
pentru toate elementele lui A. Scriei un pseudocod pentru acest algoritm, care este cunoscut
sub numele de sortarea prin selecie. Gsii timpii de execuie n cazul cel mai favorabil,
respectiv cel mai defavorabil, pentru sortarea prin selecie, utiliznd notaia .
1.2-2 S considerm, din nou, cutarea liniar (vezi exerciiul 1.1-3). Ct de multe elemente ale
irului de intrare trebuie verificate, n medie, presupunnd c elementul cutat se afl printre
termenii irului dat? Ce putei spune despre cazul cel mai defavorabil? Care sunt timpul mediu
de execuie i timpul de execuie n cazul cel mai defavorabil pentru cutarea liniar, exprimai
n notaia ? Justificai rspunsurile.
1.2-3 S considerm problema evalurii unui polinomPntr-un punct. Fiind dai n coeficieni
n1
a0 , a1 , . . . , an1 i un numr real x, dorim s calculm i=0 ai xi . Descriei un algoritm simplu
10 Capitolul 1 Introducere
n timp (n2 ) pentru aceast operaie. Descriei i un algoritm n timp (n) care folosete
urmtoarea metod de rescriere a unui polinom, numit schema lui Horner:
n1
X
ai xi = ( (an1 x + an2 )x + + a1 )x + a0
i=0
1.2-5 Cum poate fi modificat aproape orice algoritm pentru a avea un timp de execuie bun n
cel mai favorabil caz?
Figura 1.3 Modul de operare al sortrii prin interclasare asupra vectorului A = h5, 2, 4, 6, 1, 3, 2, 6i.
Lungimile irurilor sortate, n curs de interclasare, cresc pe msur ce algoritmul avanseaz de jos n sus.
S observm c recursivitatea se oprete cnd irul de sortat are lungimea 1, caz n care nu mai
avem nimic de fcut, deoarece orice ir de lungime 1 este deja sortat.
Operaia principal a algoritmului de sortare prin interclasare este interclasarea a dou iruri
sortate, n pasul denumit mai sus Combin. Pentru aceasta vom utiliza o procedur auxiliar,
Interclaseaz(A, p, q, r), unde A este un vector i p, q i r sunt indici ai vectorului, astfel
nct p q < r. Procedura presupune c subvectorii A[p..q] i A[q + 1..r] sunt sortai. Ea i
interclaseaz pentru a forma un subvector sortat care nlocuiete subvectorul curent A[p..r].
Dei vom lsa pseudocodul pentru aceast procedur ca exerciiu (vezi exerciiul 1.3-2), este
uor de imaginat o procedur de tip Interclaseaz al crei timp de execuie este de ordinul
(n), n care n = r p + 1 este numrul elementelor interclasate. Revenind la exemplul nostru
cu crile de joc, s presupunem c avem dou pachete de cri de joc aezate pe mas cu faa
n sus. Fiecare din cele dou pachete este sortat, cartea cu valoarea cea mai mic fiind deasupra.
Dorim s amestecm cele dou pachete ntr-un singur pachet sortat, care s rmn aezat pe
mas cu faa n jos. Pasul principal este acela de a selecta cartea cu valoarea cea mai mic dintre
cele dou aflate deasupra pachetelor (fapt care va face ca o nou carte s fie deasupra pachetului
respectiv) i de a o pune cu faa n jos pe locul n care se va forma pachetul sortat final. Repetm
acest procedeu pn cnd unul din pachete este epuizat. n aceast faz, este suficient s lum
pachetul rmas i s-l punem peste pachetul deja sortat ntorcnd toate crile cu faa n jos.
Din punctul de vedere al timpului de execuie, fiecare pas de baz dureaz un timp constant,
deoarece comparm de fiecare dat doar dou cri. Deoarece avem de fcut cel mult n astfel de
operaii elementare, timpul de execuie pentru procedura Interclaseaz este (n).
Sorteaz-Prin-Interclasare(A, p, r)
1: dac p < r atunci
2: q b(p + r)/2c
3: Sorteaz-Prin-Interclasare(A, p, q)
4: Sorteaz-Prin-Interclasare(A, q + 1, r)
5: Interclaseaz(A, p, q, r)
n capitolul 4 vom vedea cum se pot rezolva recurene uzuale pentru probleme de aceast
form.
numr ntreg mai mic sau egal dect x. Aceste notaii sunt definite n capitolul 2.
1.3. Proiectarea algoritmilor 13
problemei originale este o putere a lui 2. Fiecare pas de mprire genereaz deci dou subiruri
avnd dimensiunea exact n/2. n capitolul 4 vom vedea c aceast presupunere nu afecteaz
ordinul de cretere a soluiei recurenei.
Pentru a determina recurena pentru T (n), timpul de execuie al sortrii prin interclasare a
n numere n cazul cel mai defavorabil, vom raiona n felul urmtor. Sortarea prin interclasare a
unui singur element are nevoie de un timp constant. Cnd avem n > 1 elemente, vom descompune
timpul de execuie dup cum urmeaz:
Divide: La acest pas, se calculeaz doar mijlocul subvectorului, calcul care are nevoie de un
timp constant de execuie. Astfel, D(n) = (1).
Stpnete: Rezolvm recursiv dou subprobleme, fiecare de dimensiune n/2, care contribuie
cu 2T (n/2) la timpul de execuie.
Combin: Am observat deja c procedura Interclaseaz pentru un subvector cu n elemente
consum (n) timp de execuie, deci C(n) = (n).
Cnd adunm funciile D(n) i C(n) pentru analiza sortrii prin interclasare, adunm o funcie
cu timpul de execuie (n) cu o funcie cu timpul de execuie (1). Aceast sum este funcie
liniar n raport cu n, adic are timpul de execuie (n). Adugnd aceasta la termenul 2T (n/2)
de la pasul Stpnete, obinem timpul de execuie T (n) n cazul cel mai defavorabil pentru
sortarea prin interclasare:
(1) dac n = 1,
T (n) =
2T (n/2) + (n) dac n > 1.
n capitolul 4, vom arta c T (n) este (n lg n), unde lg n reprezint log2 n. Pentru numere
suficient de mari, sortarea prin interclasare, avnd timpul de execuie (n lg n), este mai per-
formant dect sortarea prin inserie, al crei timp de execuie n cazul cel mai defavorabil este
(n2 ).
Exerciii
1.3-1 Utiliznd ca model figura 1.3, ilustrai modul de operare al sortrii prin interclasare pentru
vectorul A = h3, 41, 52, 26, 38, 57, 9, 49i.
1.3-3 Utilizai inducia matematic pentru a arta c, dac n este o putere a lui 2, soluia
recurenei
2 dac n = 2,
T (n) =
2T (n/2) + n dac n = 2k , k > 1.
este T (n) = n lg n.
1.3-4 Sortarea prin inserie poate fi descris ca procedur recursiv n felul urmtor: pentru a
sorta A[1..n], sortm A[1..n 1] i apoi inserm A[n] n vectorul sortat A[1..n 1]. Scriei o
recuren pentru timpul de execuie a acestei versiuni a sortrii prin inserie.
14 Capitolul 1 Introducere
1.3-5 Relund problema cutrii (vezi exerciiul 1.1-3), observai c, dac irul A este sortat,
se poate ncepe prin a compara v cu valoarea aflat la mijlocul vectorului i se poate elimina
din discuie una din jumti. Cutarea binar este un algoritm care repet acest procedeu,
njumtind de fiecare dat partea irului n care se face cutarea. Scriei un pseudocod fie
iterativ, fie recursiv, pentru cutarea binar. Argumentai c timpul de execuie n cazul cel mai
defavorabil este (lg n).
1.4. Rezumat
Un algoritm bun este ca un cuit ascuit face exact ceea ce se ateapt s fac, cu un
minimum de efort. A folosi un algoritm nepotrivit pentru a rezolva o problem este ca i cum
s-ar ncerca s se taie o friptur cu o urubelni: n final, s-ar obine, eventual, un produs
digerabil, dar cu un efort considerabil mai mare dect cel necesar, iar rezultatul ar fi, probabil,
mai puin plcut din punct de vedere estetic.
Algoritmii care sunt proiectai s rezolve o aceeai problem pot s difere foarte mult n
eficien. Aceste diferene pot fi cu mult mai semnificative dect diferena dintre un calculator
personal i un supercalculator. De exemplu, s ne imaginm un supercalculator care ruleaz
sortarea prin inserie i un calculator personal care ruleaz sortarea prin interclasare. Fiecare
trebuie s sorteze un vector de un milion de numere. S presupunem c supercalculatorul poate
executa 100 milioane de operaii pe secund, n timp ce calculatorul personal execut doar
un milion de operaii pe secund. Pentru a face ca diferena s fie i mai dramatic, vom
presupune c supercalculatorul utilizeaz pentru sortarea prin inserie un program executabil
realizat n cod main, optimizat de ctre cel mai bun programator, rezultatul fiind c sunt
necesare 2n2 instruciuni la supercalculator pentru a realiza sortarea a n numere. Sortarea prin
interclasare, pe de alt parte, se ruleaz cu un program realizat pentru calculatorul personal,
de ctre un programator de nivel mediu, folosind un limbaj de nivel nalt cu un compilator
ineficient, codului rezultat fiindu-i necesare 50n lg n instruciuni. Pentru a sorta un milion de
numere, supercalculatorul are nevoie de
2 (106 )2 instruciuni
= 20.000 secunde 5, 56 ore,
108 instruciuni/secund
n timp ce pentru calculatorul personal sunt necesare
Prin utilizarea unui algoritm al crui timp de execuie are un ordin mai mic de cretere, chiar i
un calculator personal obine rezultatul cerut de 20 de ori mai repede dect supercalculatorul!
Acest exemplu arat c algoritmii, la fel ca i echipamentele hardware sunt o tehnologie.
Performana total a unui sistem de calcul depinde tot att de mult de alegerea algoritmilor
eficieni, ct depinde de alegerea unui hardware rapid. Aa cum are loc o dezvoltare tehnologic
rapid n ceea ce privete alte tehnologii legate de calculatoare, tot astfel se dezvolt i algoritmii.
Exerciii
1.4-1 S presupunem c trebuie s comparm implementrile sortrii prin inserie i sortrii
prin interclasare pe acelai calculator. Pentru date de intrare de dimensiune n, sortarea prin
inserie se execut n 8n2 pai, n timp ce sortarea prin interclasare se execut n 64n lg n pai.
Pentru ce valori ale lui n sortarea prin inserie este mai rapid dect sortarea prin interclasare?
Cum s-ar putea rescrie pseudocodul pentru sortarea prin interclasare cu scopul de a o face chiar
mai rapid pentru date de intrare de dimensiuni mici?
1.4-2 Care este cea mai mic valoare a lui n pentru care un algoritm cu timpul de execuie de
100n2 este mai rapid dect un algoritm cu timpul timpul de execuie de 2n ?
Probleme
1-1 Comparaia timpilor de execuie
Pentru fiecare funcie f (n) i timp t din urmtorul tabel, determinai cea mai mare valoare a lui
n pentru o problem care poate fi rezolvat n timpul t, presupunnd c algoritmul de rezolvare
a problemei are nevoie de f (n) microsecunde.
1 1 1 1 1 1 1
secund minut or zi lun an secol
lg n
n
n
n lg n
n2
n3
2n
n!
a. Artai c cei n/k subvectori, fiecare de lungime k, pot fi sortai prin inserie cu timp de
execuie (nk) n cazul cel mai defavorabil.
b. Artai c aceti subvectori pot fi sortai prin interclasare cu timp de execuie (n lg(n/k))
n cazul cel mai defavorabil.
c. Fiind dat faptul c algoritmul modificat are timp de execuie (nk + n lg(n/k)) n cazul
cel mai defavorabil, care este cea mai mare valoare asimptotic a lui k (cu notaia ) n
funcie de n, pentru care algoritmul modificat are acelai timp de execuie ca i sortarea
standard prin interclasare?
1-3 Inversiuni
Fie un vector A[1..n] de n numere distincte. Dac i < j i A[i] > A[j], atunci perechea (i, j) se
numete inversiune a lui A.
b. Ce vector avnd elemente din mulimea {1, 2, . . . , n} are cele mai multe inversiuni? Ct de
multe?
c. Care este relaia dintre timpul de execuie al sortrii prin inserie i numrul de inversiuni
din vectorul de intrare? Justificai rspunsul.
Note bibliografice
Exist multe texte excelente n legtur cu subiectul general al algoritmilor, inclusiv cele
scrise de Aho, Hopcroft i Ullman [4, 5], Baase [14], Brassard i Bratley [33], Horowitz i Sahni
[105], Knuth [121, 122, 123], Manber [142], Mehlhorn [144, 145, 146], Purdom i Brown [164],
Reingold, Nievergelt i Deo [167], Sedgewick [175] i Wilf [201]. Unele aspecte mai practice ale
proiectrii algoritmilor sunt discutate de Bentley [24, 25] i Gonnet [90].
n 1968, Knuth a publicat primul din cele trei volume cu titlul general Arta Programrii
Calculatoarelor [121, 122, 123]. Primul volum a abordat studiul modern al algoritmilor cu
focalizare pe analiza timpului de execuie, iar aceast serie a rmas o referin semnificativ
pentru multe din problematicile prezentate aici. Conform lui Knuth, cuvntul algoritm este
derivat din numele al-Khowrizm, un matematician persan din secolul IX.
Note bibliografice 17
-notaia
n capitolul 1 am artat c timpul de execuie pentru sortarea prin inserie n cazul cel mai
defavorabil este T (n) = (n2 ). S definim acum exact aceast notaie. Pentru o funcie dat
2.1. Notaia asimptotic 21
Figura 2.1 Exemple grafice pentru notaiile , O i . n fiecare parte, valoarea indicat a lui n0
este cea mai mic valoare posibil; orice valoare mai mare va funciona, de asemenea. (a) -notaia
mrginete o funcie pn la factori constani. Scriem f (n) = (g(n)) dac exist constantele pozitive
n0 , c1 i c2 astfel nct la dreapta lui n0 , valoarea lui f (n) se afl ntotdeauna ntre c1 g(n) i c2 g(n)
inclusiv. (b) O-notaia d o margine superioar pentru o funcie pn la un factor constant. Scriem
f (n) = O(g(n)) dac exist constantele pozitive n0 i c astfel nct la dreapta lui n0 , valoarea lui f (n)
este ntotdeauna mai mic sau egal cu cg(n). (c) -notaia d o margine inferioar pentru o funcie
pn la un factor constant. Scriem f (n) = (g(n)) dac exist constantele pozitive n0 i c astfel nct
la dreapta lui n0 , valoarea lui f (n) este ntotdeauna mai mare sau egal cu cg(n).
de rang maxim i dnd lui c2 o valoare ceva mai mare, s-ar putea ca inegalitile din definiia -
notaiei s fie satisfcute. Coeficientul termenului de rang maxim poate fi de asemenea ignorat,
deoarece acesta poate schimba c1 i c2 doar cu un factor constant.
Pentru a exemplifica, s considerm o funcie ptratic oarecare f (n) = an2 + bn + c, n
care a, b i c sunt constante iar a > 0. Eliminarea termenilor de rang inferior lui 2 i neglijarea
constantelor conduce la f (n) = (n2 ). Pentru a artapacelai lucru n mod formal, alegem
constantele c1 = a/4, c2 = 7a/4 i n0 = 2 max{|b|/a, |c|/a}. Cititorul poate arta c 0
c1 n2 an2 + bn + c c2 n2 pentru orice n n0 . n general, pentru orice polinom p(n) =
Pd i d
i=0 ai x , unde ai sunt constante i ad > 0, avem p(n) = (n ). (vezi problema 2-1)
Deoarece orice constant este un polinom de gradul 0, putem expima orice funcie constant
ca (n0 ) sau (1). Aceast ultim notaie este un mic abuz deoarece nu este clar care variabil
tinde la infinit.1 Vom folosi des notaia (1) nelegnd prin aceasta fie o constant, fie o funcie
constant.
O-notaia
-notaia delimiteaz o funcie asimptotic inferior i superior. Cnd avem numai o margine
asimptotic superioar, utilizm O-notaia. Fiind dat o funcie g(n), vom nota cu O(g(n)),
1 Adevrata problem este aceea c notaia noastr obinuit pentru funcii nu face distincie ntre funcii i
valorile lor. n -calcul, parametrii unei funcii sunt clar specificai: funcia n2 poate fi scris ca n n2 sau chiar
r r2 . Adoptarea unei notaii mai riguroase, pe de alt parte, ar complica manipulrile algebrice, aa c preferm
s tolerm abuzul.
2.1. Notaia asimptotic 23
mulimea
Vom utiliza O-notaia pentru a indica o margine superioar a unei funcii pn la un factor
constant. Figura 2.1(b) d imaginea intuitiv aflat n spatele O-notaiei. Pentru toate valorile
lui n aflate la dreapta lui n0 , valorile corespunztoare ale lui f (n) sunt egale sau mai mici dect
cele ale lui g(n).
Pentru a indica faptul c o funcie f (n) este un membru al lui O(g(n)), vom scrie f (n) =
O(g(n)). S notm faptul c f (n) = (g(n)) implic f (n) = O(g(n)) deoarece -notaia este o
noiune mai puternic dect O-notaia. n limbajul teoriei mulimilor, avem (g(n)) O(g(n)).
Astfel, demonstraia faptului c orice funcie ptratic an2 + bn + c, unde a > 0, n (n2 ), arat
de asemenea c orice funcie ptratic este n O(n2 ). Ceea ce poate prea i mai surprinztor
este c orice funcie liniar an + b este n O(n2 ), ceea ce se verific uor, lund c = a + |b| i
n0 = 1.
Unor cititori, care s-au mai ntlnit cu notaii de tipul O, ar putea s li se par ciudat c
scriem n = O(n2 ). n literatur, O-notaia este folosit uneori informal pentru a descrie margini
asimptotice strnse, adic ceea ce am definit utiliznd -notaia. n aceast carte, totui, atunci
cnd scriem f (n) = O(g(n)), afirmm, n esen, c un anumit multiplu constant al lui g(n)
este o margine asimptotic superioar a lui f (n), fr s spunem nimic despre ct de strns
este aceast margine superioar. Distincia dintre marginile asimptotice superioare i marginile
asimptotice strnse a devenit standard n literatura consacrat algoritmilor.
Folosind O-notaia, se poate adeseori descrie timpul de execuie al unui algoritm inspectnd
structura global a algoritmului. De exemplu, structura de ciclu dublu a algoritmului de sortare
prin inserie din capitolul 1 asigur imediat o margine superioar de tipul O(n2 ) pentru timpul
de execuie n cazul cel mai defavorabil: costul ciclului interior este mrginit superior de O(1)
(constant), indicii i, j sunt, ambii, cel mult n iar ciclul interior este executat cel mult o dat
pentru fiecare dintre cele n2 perechi de valori pentru i i j.
Deoarece O-notaia descrie o margine superioar, atunci cnd o folosim pentru delimitarea
timpului de execuie n cazul cel mai defavorabil, prin implicaie, delimitm, de asemenea, timpul
de execuie al algoritmului pentru date de intrare arbitrare. Astfel, delimitarea O(n2 ) pentru
timpul de execuie n cazul cel mai defavorabil al sortrii prin inserie se aplic, n egal msur,
timpului su de execuie pentru orice date de intrare. Delimitarea (n2 ) a timpului de execuie
n cazul cel mai defavorabil al sortrii prin inserie, totui, nu implic o delimitare (n2 ) asupra
timpului de execuie al sortrii prin inserie pentru orice date de intrare. De exemplu, am vzut
n capitolul 1 c dac datele de intrare sunt deja sortate, sortarea prin inserie se execut n
timpul (n).
Tehnic, este o inexactitate s se spun c timpul de execuie la sortarea prin inserie este
O(n2 ) deoarece pentru un n dat timpul real de execuie depinde de forma datelor de intrare
de dimensiune n. Prin urmare, timpul de execuie nu este de fapt tocmai o funcie de n. Ceea
ce nelegem atunci cnd spunem timpul de execuie este O(n2 ) este c timpul de execuie n
cazul cel mai defavorabil (care este o funcie de n) este O(n2 ), sau, echivalent, oricare ar fi datele
de intrare de dimensiune n, pentru fiecare valoare a lui n, timpul de execuie pentru acest set
de date de intrare este O(n2 ).
24 Capitolul 2 Creterea funciilor
-notaia
La fel cum O-notaia furnizeaz o delimitare asimptotic superioar pentru o funcie, -
notaia furnizeaz o delimitare asimptotic inferioar. Pentru o funcie dat g(n), vom
nota cu (g(n)), mulimea
Imaginea intuitiv n spatele -notaiei este artat n figura 2.1(c). Pentru toate valorile n aflate
la dreapta lui n0 , f (n) este mai mare sau egal cu cg(n).
Din definiiile notaiilor asimptotice pe care le-am ntlnit pn acum, este uor de demonstrat
urmtoarea teorem important (vezi exerciiul 2.1-5).
Teorema 2.1 Pentru orice dou funcii f (n) i g(n), avem f (n) = (g(n)) dac i numai dac
f (n) = O(g(n)) i f (n) = (g(n)).
obine margini asimptotice superioare sau inferioare pornind de la margini asimptotice strnse,
aa cum am fcut n exemplul precedent, o utilizm de obicei pentru a demonstra delimitri
asimptotice strnse plecnd de la delimitri asimptotice superioare i inferioare. Mrginirea
asimptotic tare va fi demonstrat utiliznd mrginirea asimptotic, superioar i inferioar.
Deoarece -notaia descrie o margine inferioar, atunci cnd o utilizm pentru a evalua
timpul de execuie al unui algoritm n cazul cel mai favorabil, n mod implicit, evalum i timpul
de execuie al algoritmului pentru date de intrare arbitrare. De exemplu, timpul de execuie n
cazul cel mai favorabil al sortrii prin inserie este (n), de unde rezult c timpul de execuie
al sortrii prin inserie este (n).
Timpul de execuie al sortrii prin inserie se afl prin urmare ntre O(n) i (n2 ) deoarece
este situat ntotdeauna ntre o funcie liniar i o funcie ptratic de n. Mai mult, aceste
aproximri sunt asimptotic cele mai strnse: de exemplu, timpul de execuie al sortrii prin
inserie nu este (n2 ) deoarece acesta este (n) n cazul datelor de intrare deja sortate. Nu este
contradictoriu s spunem totui c acest timp de execuie este (n2 ) n cazul cel mai defavorabil
deoarece exist cel puin un tip de date de intrare care impun algoritmului un timp de execuie
(n2 ). Atunci cnd spunem c timpul de execuie al unui algoritm este (g(n)), nelegem c
nu conteaz ce set particular de date de intrare de dimensiune n este ales pentru fiecare valoare
a lui n, timpul de execuie pe acel set de date de intrare este cel puin o constant nmulit cu
g(n), pentru n suficient de mare.
exist o singur funcie anonim (o funcie de i). Aceast expresie nu este echivalent cu O(1) +
O(2) + + O(n), care oricum nu are o interpretare clar.
n anumite cazuri apar notaii asimptotice n membrul stng al unei ecuaii, cum ar fi
2n2 + (n) = (n2 ).
Vom interpreta astfel de ecuaii utiliznd urmtoarea regul: Oricum ar fi alese funciile anonime
din partea stng a semnului egal, exist o modalitate de alegere a funciilor anonime din partea
dreapt a semnului egal pentru a realiza egalitatea descris de ecuaie. Astfel, sensul exemplului
nostru este acela c pentru orice funcie f (n) (n), exist o anumit funcie g(n) (n2 )
astfel nct 2n2 + f (n) = g(n) pentru orice n. Cu alte cuvinte, membrul drept al ecuaiei ofer
un nivel de detaliu mai sczut dect membrul stng.
Un numr de astfel de relaii pot fi nlnuite ca n
2n2 + 3n + 1 = 2n2 + (n) = (n2 )
Putem interpreta fiecare ecuaie separat dup regula de mai sus. Prima ecuaie spune c exist o
funcie f (n) (n) astfel nct 2n2 + 3n + 1 = 2n2 + f (n) pentru orice n. A doua ecuaie spune
c pentru orice funcie g(n) (n) (aa cum este f (n)), exist o anumit funcie h(n) (n2 )
astfel nct 2n2 + g(n) = h(n) pentru orice n. S observm c aceast interpretare implic
2n2 + 3n + 1 = (n2 ), fapt care coincide cu informaia intuitiv pe care o transmite lanul celor
dou ecuaii de mai sus.
o-notaia
Delimitarea asimptotic superioar dat de O-notaia definit anterior poate sau nu s fie o
delimitare asimptotic strns. Astfel, relaia 2n2 = O(n2 ), este o delimitare asimptotic strns
pe cnd 2n = O(n2 ) nu este. Vom utiliza n cele ce urmeaz o-notaia pentru a desemna o
delimitare superioar care nu este asimptotic strns. Formal, vom defini o(g(n)) (o mic de g
de n) ca fiind mulimea
o(g(n)) = {f (n) : pentru orice constant pozitiv c > 0 exist o constant
n0 > 0 astfel nct 0 f (n) < cg(n) pentru orice n n0 }.
26 Capitolul 2 Creterea funciilor
-notaia
Prin analogie, -notaia este fa de -notaie ceea ce este o-notaia fa de O-notaie.
Utilizm -notaia pentru a desemna o delimitare asimptotic inferioar care nu este asimptotic
strns. O cale de a o defini este
f (n) (g(n)) dac i numai dac g(n) o(f (n)).
Formal, totui, definim (g(n)) ("omega mic de g de n") ca fiind mulimea
(g(n)) = {f (n) : pentru orice constant pozitiv c > 0 exist o constant
n0 > 0 astfel nct 0 cg(n) < f (n) pentru orice n n0 }.
De exemplu, n2 /2 = (n), dar n2 /2 6= (n). Relaia f (n) = (g(n)) implic
f (n)
lim = ,
n g(n)
dac limita exist. Cu alte cuvinte, f (n) devine orict de mare relativ la g(n) atunci cnd n
tinde la infinit.
Compararea funciilor
Multe dintre proprietile relaiilor dintre numerele reale se aplic i la compararea asimpto-
tic a funciilor. Pentru cele ce urmeaz vom presupune c f (n) i g(n) sunt asimptotic pozitive.
Tranzitivitatea:
f (n) = (g(n)) i g(n) = (h(n)) implic f (n) = (h(n)),
f (n) = O(g(n)) i g(n) = O(h(n)) implic f (n) = O(h(n)),
f (n) = (g(n)) i g(n) = (h(n)) implic f (n) = (h(n)),
f (n) = o(g(n)) i g(n) = o(h(n)) implic f (n) = o(h(n)),
f (n) = (g(n)) i g(n) = (h(n)) implic f (n) = (h(n)).
Reflexivitatea:
f (n) = (f (n)),
f (n) = O(f (n)),
f (n) = (f (n)).
2.1. Notaia asimptotic 27
Simetria:
f (n) = (g(n)) dac i numai dac g(n) = (f (n)).
Antisimetria:
f (n) = O(g(n)) dac i numai dac g(n) = (f (n)),
f (n) = o(g(n)) dac i numai dac g(n) = (f (n)).
Deoarece aceste proprieti sunt valide pentru notaii asimptotice, se poate trasa o analogie
ntre compararea asimptotic a dou funcii f i g i compararea asimptotic a dou numere
reale a i b:
f (n) = O(g(n)) a b,
f (n) = (g(n)) a b,
f (n) = (g(n)) a = b,
f (n) = o(g(n)) a < b,
f (n) = (g(n)) a > b.
Exerciii
2.1-1 Fie f (n) i g(n) funcii asimptotic nenegative. Utiliznd definiia de baz a -notaiei,
demonstrai c max(f (n), g(n)) = (f (n) + g(n)).
2.1-3 Explicai de ce afirmaia Timpul de execuie al algoritmului A este cel puin O(n2 ) este
lipsit de coninut.
2.1-6 Demonstrai c timpul de execuie al unui algoritm este (g(n)) dac i numai dac
timpul su de execuie n cazul cel mai defavorabil este O(g(n)) i timpul su de execuie n
cazul cel mai favorabil este (g(n)).
2.1-8 Putem extinde notaia noastr la cazul a doi parametri n i m care tind la infinit n mod
independent, cu viteze diferite. Peentru o funcie dat g(n, m) notm cu O(g(n, m)) mulimea
de funcii
Monotonie
O funcie f (n) este monoton cresctoare dac m n implic f (m) f (n). Analog, ea
este monoton descresctoare dac m n implic f (m) f (n). O funcie f (n) este strict
cresctoare dac m < n implic f (m) < f (n) i strict descresctoare dac m < n implic
f (m) > f (n).
dn/2e + bn/2c = n,
Polinoame
Fiind dat un ntreg pozitiv d, un polinom n n de gradul d este o funcie p(n) de forma
d
X
p(n) = ai ni ,
i=0
Exponeniale
Pentru orice a 6= 0, m i n reale avem urmtoarele identiti:
a0 = 1,
a1 = a,
a1 = 1/a,
m n
(a ) = amn ,
(am )n = (an )m ,
am an = am+n .
Pentru orice n i a 1, funcia an este monoton cresctoare n n. Cnd ne va conveni, vom
presupune c 00 = 1.
Ratele de cretere ale polinoamelor i exponenialelor pot fi legate prin urmtorul fapt. Pentru
orice constante a i b astfel nct a > 1,
nb
lim = 0, (2.5)
n an
unde ! desemneaz funcia factorial definit mai trziu n aceast seciune. Pentru orice x real
avem inegalitatea
ex 1 + x, (2.7)
30 Capitolul 2 Creterea funciilor
unde egalitatea are loc numai pentru x = 0. Cnd |x| 1, avem aproximaia
1 + x ex 1 + x + x2 . (2.8)
Cnd x 0, aproximaia lui ex prin 1 + x este destul de bun:
ex = 1 + x + (x2 ).
(n aceast ecuaie, notaia asimptotic este utilizat pentru a descrie comportamentul la limit
pentru x 0 mai degrab dect pentru x .) Avem, pentru orice x,
x n
lim 1 + = ex .
n n
Logaritmi
Vom utiliza urmtoarele notaii:
lg n = log2 n (logaritm binar),
ln n = loge n (logaritm natural),
lgk n = (lg n)k (exponenierea),
lg lg n = lg(lg n) (compunerea).
O convenie de notaie important pe care o vom adopta este aceea c funciile logaritmice se
vor aplica numai urmtorului termen dintr-o formul, astfel c lg n + k va nsemna (lg n) + k i
nu lg(n + k). Pentru n > 0 i b > 1, funcia logb n este strict cresctoare.
Pentru orice numere reale a > 0, b > 0, c > 0 i n,
a = blogb a ,
logc (ab) = logc a + logc b,
logb an = n logb a,
logc a
logb a = ,
logc b
logb (1/a) = logb a,
1
logb a = ,
loga b
alogb n = nlogb a . (2.9)
Deoarece schimbarea bazei unui logaritm de la o constant la o alt constant schimb
valoarea logaritmului doar printr-un factor constant, vom utiliza adesea notaia lg n cnd
factorii constani nu vor fi importani, aa cum este cazul cu O-notaia. Informaticienilor li
se pare c 2 este baza cea mai natural pentru logaritmi, deoarece att de muli algoritmi i
structuri de date presupun descompunerea unei probleme n dou pri.
Exist o dezvoltare n serie simpl pentru ln(1 + x) cnd |x| < 1:
x2 x3 x4 x5
ln(1 + x) = x + +
2 3 4 5
Avem, de asemenea, urmtoarele inegaliti pentru x > 1:
x
ln(1 + x) x, (2.10)
1+x
2.2. Notaii standard i funcii comune 31
lgb n lgb n
lim = lim = 0.
n (2a )lg n n na
lgb n = o(na )
pentru orice constant a > 0. Astfel, orice funcie polinomial pozitiv crete mai repede dect
orice funcie polilogaritmic.
Factoriali
Notaia n! (se citete n factorial) este definit pentru numere ntregi n 0 prin
1 dac n = 0,
n! =
n (n 1)! dac n > 0.
Astfel, n! = 1 2 3 n.
O margine superioar slab a funciei factorial este n! nn , deoarece fiecare dintre cei n
factori ai produsului factorial este cel mult n. Aproximaia lui Stirling,
n n
1
n! = 2n 1+ , (2.11)
e n
unde e este baza logaritmilor naturali, ne d o margine superioar mai strns, dar i o margine
inferioar. Utiliznd aproximaia lui Stirling, putem demonstra c
n! = o(nn ),
n! = (2n ),
lg(n!) = (n lg n).
Calculai diferena ntre funcia lg(i) n (funcia logaritm aplicat succesiv de i ori, ncepnd cu
argumentul n) i lgi n (logaritmul lui n ridicat la puterea i). Funcia logaritm iterat este definit
prin
n o
lg n = min i 0 : lg(i) n 1 .
lg 2 = 1,
lg 4 = 2,
lg 16 = 3,
lg 65536 = 4,
lg (265536 ) = 5.
Deoarece numrul atomilor din universul observabil este estimat la aproximativ 1080 , care este
mult mai mic dect 265536 , rareori ntlnim o valoare a lui n astfel nct lg n > 5.
Numere Fibonacci
Numerele Fibonacci sunt definite prin urmtoarea recuren:
Astfel, fiecare numr Fibonacci este suma celor dou numere Fibonacci anterioare, rezultnd
secvena
i bi
Fi = , (2.15)
5
ceea b bi
ce se poate demonstra prin inducie (exerciiul 2.2-7). Deoarece |i|< 1, avem | |/ 5 <
1/ 5 < 1/2, astfel c cel de-al i-lea numr Fibonacci este egal cu / 5 rotunjit la cel mai
apropiat ntreg. Astfel, numerele Fibonacci cresc exponenial.
Exerciii
2.2-1 Artai c dac f (n) i g(n) sunt funcii monoton cresctoare, atunci la fel sunt i funciile
f (n) + g(n) i f (g(n)), iar dac f (n) i g(n) sunt n plus nenegative, atunci i f (n) g(n) este
monoton cresctoare.
Probleme 33
2.2-2 Utilizai definiia O-notaiei pentru a arta c T (n) = nO(1) dac i numai dac exist o
constant k > 0 astfel nct T (n) = O(nk ).
2.2-5 ? Este funcia dlg ne! polinomial mrginit? Este funcia dlg lg ne! polinomial mrginit?
2.2-6 ? Care este asimptotic mai mare: lg(lg n) sau lg (lg n)?
2.2-7 Demonstrai
prin inducie c cel de-al i-lea numr Fibonacci verific egalitatea Fi =
(i bi )/ 5, unde este raportul de aur iar b este conjugatul su.
2.2-8 Demonstrai c pentru i 0 cel de-al (i + 2)-lea numr Fibonacci verific Fi+2 i .
Probleme
2-1 Comportamentul asimptotic al polinoamelor
Fie
d
X
p(n) = ai pi ,
i=0
a. Ordonai urmtoarele funcii dup ordinea de cretere; mai precis, gsii un aranjament de
funcii g1 , g2 , . . . g30 care s verifice g1 = (g2 ), g2 = (g3 ), . . . , g29 = (g30 ). Partiionai
lista n clase de echivalen astfel nct f (n) i g(n) s fie n aceeai clas de echivalen
dac i numai dac f (n) = (g(n)).
lg(lg
3 nn) 2lg n ( 2)lg n n2 n! (lg n)!
n
b. Dai un exemplu de o singur funcie nenegativ f (n) astfel nct pentru toate funciile
gi (n) de la punctul (a), f (n) s nu fie nici O(gi (n)) nici (gi (n)).
Unii autori l definesc i pe O ntr-un mod uor diferit; s utilizm O0 pentru definiia alternativ.
Spunem c f (n) = O0 (g(n)) dac i numai dac |f (n)| = O(g(n)).
c. Ce se ntmpl cu fiecare dintre direciile lui dac i numai dac din teorema 2.1 cu
aceast nou definiie?
(se citete o moale) ca nsemnnd O cu factorii logaritmici ignorai:
Unii autori definesc O
O(g(n)) = {f (n) : exist constantele pozitive, c, k i n0 astfel nct
0 f (n) cg(n) lgk (n) pentru orice n n0 }.
i
d. Definii ntr-un mod analog. Demonstrai proprietatea analog corespunztoare
teoremei 2.1.
care nu trebuie s fie bine-definit n toate cazurile. Cu alte cuvinte, cantitatea fc (n) este numrul
de aplicaii iterate ale funciei f necesare pentru a reduce argumentul la c sau la mai puin.
Pentru fiecare dintre urmtoarele funcii f (n) i constantele c, dai o evaluare ct se poate
de strns a lui fc (n).
f (n) c fc (n)
a. lg n 1
b. n1 0
c. n/2 1
d. n/2
2
e. n 2
f. n 1
g. n1/3 2
h. n/ lg n 2
Note bibliografice
Knuth [121] investigheaz originea O-notaiei i afirm c ea apare pentru prima dat ntr-
un text de teoria numerelor al lui P. Bachmann din 1982. o-notaia a fost inventat de ctre E.
Landau n 1909 pentru discuia distribuiei numerelor prime. Notaiile i au fost introduse
de ctre Knuth [124] pentru a corecta practica din literatur, popular dar derutant din punct
de vedere tehnic, de a utiliza O-notaia att pentru margini superioare ct i pentru margini
36 Capitolul 2 Creterea funciilor
inferioare. Mult lume continu s utilizeze O-notaia acolo unde -notaia este mai precis din
punct de vedere tehnic. O alt discuie pe tema istoriei i dezvoltrii notaiilor asimptotice poate
fi gsit n Knuth [121, 124] i Brassard i Bratley [33].
Nu toi autorii definesc notaiile asimptotice n acelai mod, dei diferitele definiii concord
n cele mai comune situaii. Unele dintre definiiile alternative se aplic i la funcii care nu sunt
asimptotic nenegative, dac valorile lor absolute sunt mrginite n mod corespunztor.
Alte proprieti ale funciilor matematice elementare pot fi gsite n orice carte de referin
de matematic, cum ar fi Abramowitz i Stegun [1] sau Beyer [27], sau ntr-o carte de analiz,
cum ar fi Apostol [12] sau Thomas i Finney [192]. Knuth [121] conine o mulime de materiale
despre matematica discret, utilizat n informatic.
3 Sume
Cnd un algoritm conine o structur de control iterativ cum ar fi un ciclu ct timp sau
pentru, timpul su de execuie poate fi exprimat ca suma timpilor necesari la fiecare execuie a
corpului ciclului. De exemplu, am vzut n seciunea 1.2 c a j-a iteraie a sortrii prin inserie a
necesitat un timp proporional cu j n cazul cel mai defavorabil. Adunnd timpii necesari pentru
fiecare iteraie, am obinut o sum (sau serie)
n
X
j.
j=2
Evaluarea sumei a dat o margine (n2 ) pentru timpul de execuie al algoritmului n cazul cel
mai defavorabil. Acest exemplu indic importana general a nelegerii manipulrii i delimitrii
sumelor. (Dup cum vom vedea n capitolul 4, sumele apar i cnd utilizm anumite metode
pentru rezolvarea recurenelor.)
Seciunea 3.1 prezint mai multe formule de baz n care intervin sume. Seciunea 3.2 ofer
tehnici utile pentru delimitarea sumelor. Formulele din seciunea 3.1 sunt date fr demonstraie,
dei demonstraiile pentru unele dintre ele sunt prezentate n seciunea 3.2, pentru a ilustra
metodele acelei seciuni. Majoritatea celorlalte demonstraii pot fi gsite n orice manual de
analiz.
Liniaritate
Pentru orice numr real c i orice iruri finite a1 , a2 , . . . , an i b1 , b2 , . . . , bn
n
X n
X n
X
(cak + bk ) = c ak + bk .
k=1 k=1 k=1
n aceast ecuaie, -notaia din membrul stng se aplic variabilei k, dar n membrul drept ea
se aplic lui n. Astfel de manipulri pot fi aplicate i seriilor infinite convergente.
Serii aritmetice
Suma
n
X
k = 1 + 2 + . . . + n,
k=1
care a aprut cnd am analizat sortarea prin inserie, este o serie aritmetic i are valoarea
n
X 1
k = n(n + 1) (3.1)
2
k=1
= (n2 ) (3.2)
Serii geometrice
Pentru orice x 6= 1 real, suma
n
X
xk = 1 + x + x2 + . . . + xn
k=0
Cnd suma este infinit i |x| < 1 avem seria geometric infinit descresctoare
X 1
xk = . (3.4)
1x
k=0
3.1. Formule de nsumare i proprieti 39
Serii armonice
Pentru ntregi pozitivi n, al n-lea numr armonic este
X1 n
1 1 1 1
Hn = 1+ + + + ... + = = ln n + O(1). (3.5)
2 3 4 n k
k=1
X x
kxk = (3.6)
(1 x)2
k=0
Serii telescopante
Pentru orice ir a0 , a1 , . . . , an
n
X
(ak ak1 ) = an a0 (3.7)
k=1
deoarece fiecare dintre termenii a1 , a2 , . . . , an1 este adunat exact o dat i sczut exact o dat.
Spunem c suma telescopeaz. Analog,
n1
X
(ak ak+1 ) = a0 an .
k=0
n1
X 1
.
k(k + 1)
k=1
1 1 1
= ,
k(k + 1) k k+1
obinem
n1
X 1 X 1
n1
1
1
= =1 .
k(k + 1) k k+1 n
k=1 k=1
40 Capitolul 3 Sume
Produse
Produsul finit a1 a2 an poate fi scris
n
Y
ak .
k=1
Dac n = 0, valoarea produsului este definit ca fiind 1. Putem converti o formul cu un produs
ntr-o formul cu o sum, utiliznd identitatea
n ! n
Y X
lg ak = lg ak .
k=1 k=1
Exerciii
Pn
3.1-1 Gsii o formul simpl pentru k=1 (2k 1).
Pn
3.1-2 ? Artai c k=1 1/(2k 1) = ln ( n) + O(1) manipulnd seria armonic.
P
3.1-3 ? Artai c k=0 (k 1)/2k = 0.
P
3.1-4 ? Evaluai suma k=1 (2k + 1)x2k .
Pn
Pn Utilizai proprietatea de liniaritate a nsumrii pentru a demonstra c k=1 O(fk (n)) =
3.1-5
O ( k=1 fk (n)).
P P
3.1-6 Demonstrai c k=1 (f (k)) = ( k=1 f (k)).
Qn
3.1-7 Evaluai produsul k=1 2 4k .
Qn
3.1-8 ? Evaluai produsul k=2 (1 1/k 2 ).
Inducia matematic
Cea mai simpl cale de a evaluaPo serie este utilizarea induciei matematice. De exemplu,
n
s demonstrm c seria aritmetic k=1 k are valoarea 12 n(n + 1). Putem verifica uor pentru
n = 1, aa c facem ipoteza de inducie c formula este adevrat pentru orice n i demonstrm
c are loc pentru n + 1. Avem
n+1
X n
X 1 1
k= k + (n + 1) = n(n + 1) + (n + 1) = (n + 1)(n + 2).
2 2
k=1 k=1
3.2. Delimitarea sumelor 41
Nu trebuie s ghicim valoarea exact a unei sume pentru a utiliza inducia matematic.
Inducia poate fi P
utilizat i pentru a demonstra o delimitare. De exemplu,
Pn s demonstrm c
n
seria geometric k=0 3k este O(3n ). Mai precis, s demonstrm c k=0 3k c 3n pentru o
P0
anumit constant c. Pentru condiia iniial n = 0 avem k=0 3k = 1 c 1, ct timp c 1.
Presupunnd c delimitarea are loc pentru n, s demonstrm c are loc pentru n + 1. Avem
n+1
X n
X
k k n+1 n n+1 1 1
3 = 3 +3 c3 +3 = + c 3n+1 c 3n+1
3 c
k=0 k=0
Pn
ct timp (1/3 + 1/c) 1 sau, echivalent, c 3/2. Astfel, k=0 3k = O(3n ), ceea ce am dorit s
artm.
Trebuie s fim prudeni cnd utilizm notaii asimptotice pentru a demonstra
Pn delimitri prin
inducie. Considerm urmtoarea demonstraie vicioas a faptului c k=1 k = O(n). Desigur,
P1
k=1 k = O(1). Acceptnd delimitarea pentru n, o demonstrm acum pentru n + 1:
n+1
X n
X
k = k + (n + 1)
k=1 k=1
= O(n) + (n + 1) = greit!
= O(n + 1).
Delimitarea termenilor
Uneori, o limit superioar bun a unei serii se poate obine delimitnd fiecare termen al
seriei, i este, de multe ori, suficient s utilizm cel mai mare termen pentru a-i delimita pe
ceilali. De exemplu, o limit superioar rapid a seriei aritmetice (3.1) este
n
X n
X
k n = n2 .
k=1 k=1
Pn
n general, pentru o serie k=1 ak , dac punem amax = max1kn ak , atunci
n
X
ak namax .
k=1
Tehnica delimitrii fiecrui termen dintr-o serie prin cel mai mare termen este o metod
Pn slab
cnd seria poate fi, n fapt, delimitat printr-o serie geometric. Fiind dat seria k=0 ak , s
presupunem c ak+1 /ak r pentru orice k 0, unde r < 1 este o constant. Suma poate fi
delimitat printr-o serie geometric descresctoare infinit, deoarece ak a0 rk , i astfel,
n
X
X
X 1
ak a0 r k = a0 r k = a0 .
1r
k=0 k=0 k=0
42 Capitolul 3 Sume
P k
Putem aplica aceast metod pentru a delimita suma k=1 (k/3 ). Primul termen este 1/3,
iar raportul termenilor consecutivi este
(k + 1)/3k+1 1 k+1 2
= ,
k/3k 3 k 3
pentru toi k 1. Astfel, fiecare termen este mrginit superior de (1/3)(2/3)k , astfel nct
X X k
k 1 2 1 1
k
= = 1.
3 3 3 3 1 2/3
k=1 k=1
O greeal banal n aplicarea acestei metode este s artm c raportul termenilor conse-
cutivi este mai mic dect 1 i apoi s presupunem c suma este mrginit de o serie geometric.
Un exemplu este seria armonic infinit, care diverge, deoarece
X n
X
1 1
= lim = lim (lg n) = .
k n k n
k=1 k=1
Raportul termenilor k + 1 i k n aceast serie este k/(k + 1) < 1, dar seria nu e mrginit
de o serie geometric descresctoare. Pentru a delimita o serie printr-o serie geometric, trebuie
s artm c raportul este mrginit de o constant subunitar; adic trebuie s existe un r < 1,
care este constant, astfel nct raportul tuturor perechilor de termeni consecutivi nu depete
niciodat r. n seria armonic nu exist nici un astfel de r, deoarece raportul devine arbitrar de
apropiat de 1.
Partiionarea sumelor
Delimitri pentru o sumare dificil se pot obine exprimnd seria ca o sum de dou sau mai
multe serii, partiionnd domeniul indicelui i apoi delimitnd fiecare dintre seriile rezultate.
De
Pn exemplu, s presupunem c ncercm s gsim o limit inferioar pentru seria aritmetic
2
k=1 k, despre care s-a artat deja c are limita superioar n . Am putea ncerca s minorm
fiecare termen al sumei prin cel mai mic termen, dar deoarece acest termen este 1, gsim o limit
inferioar de n pentru sum foarte departe de limita noastr superioar, n2 .
Putem obine o limit inferioar mai bun, partiionnd nti suma. S presupunem, pentru
comoditate, c n este par. Avem
n n/2 n n/2 n
X X X X X
k= k+ k 0+ (n/2) (n/2)2 = (n2 )
k=1 k=1 k=n/2+1 k=1 k=n/2+1
Pn
care este o limit asimptotic strns, deoarece k=1 k = O(n2 ).
Pentru o sum care apare din analiza unui algoritm, putem partiiona adesea suma i ignora
un numr constant de Pntermeni iniiali. n general, aceast tehnic se aplic atunci cnd fiecare
termen ak din suma k=0 ak este independent de n. Atunci pentru orice k0 > 0 constant putem
scrie
n
X kX
0 1 n
X n
X
ak = ak + ak = (1) + ak ,
k=0 k=0 k=k0 k=k0
3.2. Delimitarea sumelor 43
deoarece termenii iniiali ai sumei suntPtoi constani i numrul lor este constant. Apoi, putem
n
utiliza alte metode pentru a delimita k=k0 ak . De exemplu, pentru a gsi o limit superioar
asimptotic pentru
X k2
,
2k
k=0
Justificarea pentru aceast aproximare este artat n figura 3.1. Suma este reprezentat prin
aria dreptunghiurilor din figur, iar integrala este regiunea haurat de sub curb. Cnd f (k)
este o funcie monoton descresctoare, putem utiliza o metod similar pentru a obine marginile
Z n+1 n
X Z n
f (x)dx f (k) f (x)dx (3.10)
m k=m m1
Aproximaia integral (3.10) d o estimare strns pentru al n-lea numr armonic. Pentru o
limit inferioar, obinem
Xn Z n+1
1 dx
= ln(n + 1). (3.11)
k 1 x
k=1
44 Capitolul 3 Sume
Pn
Figura 3.1 Aproximarea lui k=m f (k) prin integrale. Aria fiecrui dreptunghi este indicat n
interiorul dreptunghiului, iar aria tuturor dreptunghiurilor reprezint valoarea sumei. Integrala este
Rn
reprezentat prin aria haurat de sub curb. Comparnd ariile n (a), obinem m1 f (x)dx
Pn Pn
k=m f (k), i apoi, deplasnd dreptunghiurile cu o unitate la dreapta, obinem
R n+1 k=m f (k)
m
f (x)dx din (b).
care d limita
n
X 1
ln n + 1 (3.12)
k
k=1
Exerciii
Pn
3.2-1 Artai c k=1 1/k 2 este mrginit superior de o constant.
Probleme 45
3.2-3 Artai c al n-lea numr armonic este (lg n), partiionnd suma.
Pn
3.2-4 Aproximai k=1 k 3 printr-o integral.
Pn
3.2-5 De ce nu am utilizat aproximaia integral (3.10) direct pentru k=1 1/k pentru a obine
o margine superioar pentru al n-lea numr armonic?
Probleme
3-1 Delimitarea sumelor
Dai delimitri asimptotice strnse pentru urmtoarele sume. Presupunei c r 0 i s 0 sunt
constante.
n
X
a. kr .
k=1
n
X
b. lgs k.
k=1
n
X
c. k r lgs k.
k=1
Note bibliografice
Knuth [121] este o referin excelent pentru materialul prezentat n acest capitol. Proprieti
de baz ale seriilor pot fi gsite n orice carte bun de analiz, cum ar fi Apostol [12] sau Thomas
i Finney [192].
4 Recurene
Dup cum s-a observat n capitolul 1, cnd un algoritm conine o apelare recursiv la el
nsui, timpul su de execuie poate fi descris adesea printr-o recuren. O recuren este o
ecuaie sau o inegalitate care descrie o funcie exprimnd valoarea sa pentru argumente mai
mici. De exemplu, am vzut n capitolul 1 c timpul de execuie n cazul cel mai defavorabil
T (n) al procedurii Sorteaz-Prin-Interclasare poate fi descris prin recurena
(1) dac n = 1,
T (n) = (4.1)
2T (n/2) + (n) dac n > 1,
a crei soluie s-a afirmat c este T (n) = (n lg n).
Acest capitol ofer trei metode pentru rezolvarea recurenelor adic pentru obinerea unor
delimitri asimptotice sau O ale soluiei. n metoda substituiei, intuim o margine i
apoi utilizm inducia matematic pentru a demonstra c presupunerea noastr a fost corect.
Metoda iteraiei convertete recurena ntr-o sum i apoi se bazeaz pe tehnicile de delimitare
a sumelor pentru a rezolva recurena. Metoda master furnizeaz delimitri pentru recurene
de forma
T (n) = aT (n/b) + f (n),
unde a 1, b > 1, iar f (n) este o funcie dat; ea cere memorarea a trei cazuri, dar dup ce
facei asta, determinarea marginilor asimptotice pentru multe recurene simple este uoar.
Amnunte tehnice
n practic, neglijm anumite detalii tehnice cnd formulm i rezolvm recurene. Un bun
exemplu de detaliu care adesea este omis este presupunerea c funciile au argumente ntregi.
n mod normal, timpul de execuie T (n) al unui algoritm este definit numai cnd n este un
ntreg, deoarece pentru majoritatea algoritmilor, dimensiunea datelor de intrare este ntotdeauna
un ntreg. De exemplu, recurena care descrie timpul de execuie n cazul cel mai favorabil al
procedurii Sorteaz-Prin-Interclasare este, de fapt,
(1) dac n = 1,
T (n) = (4.2)
T (dn/2e) + T (bn/2c) + (n) dac n > 1.
Condiiile la limit reprezint o alt clas de detalii pe care, de obicei, le ignorm. Deoarece
timpul de execuie al unui algoritm pentru date de intrare de dimensiune constant este o
constant, recurenele care apar din timpii de execuie ai algoritmilor au, n general, T (n) = (1)
pentru n suficient de mic. n consecin, pentru comoditate, vom omite, n general, afirmaiile
despre condiiile la limit ale recurenelor i presupunem c T (n) este constant pentru n mic.
De exemplu, n mod normal formulm recurena (4.1) ca
T (n) = 2T (n/2) + (n), (4.3)
fr s dm n mod explicit valori mici pentru n. Motivul este c, dei schimbarea valorii lui
T (1) schimb soluia recurenei, soluia nu se modific, n mod obinuit, mai mult dect printr-un
factor constant, astfel c ordinul de cretere este neschimbat.
4.1. Metoda substituiei 47
Cnd formulm i rezolvm recurene, omitem, adesea prile ntregi inferioare i superioare
i condiiile la limit. Mergem nainte fr aceste detalii i apoi stabilim dac ele conteaz sau
nu. De obicei nu conteaz, dar este important s tim dac ele conteaz sau nu. Experiena ajut,
ajut i unele teoreme care afirm c aceste detalii nu afecteaz marginile asimptotice ale multor
recurene ntlnite n analiza algoritmilor (vezi teorema 4.1 i problema 4-5). n acest capitol,
totui, vom aborda cteva dintre aceste detalii pentru a arta unele dintre punctele sensibile ale
metodelor de rezolvare a recurenelor.
care este similar cu recurenele (4.2) i (4.3). Intuim c soluia este T (n) = O(n lg n). Metoda
noastr const n a demonstra c T (n) cn lg n pentru o alegere corespunztoare a constantei
c > 0. ncepem prin a presupune c aceast delimitare este valabil pentru bn/2c, adic
T (bn/2c) cbn/2c lg(bn/2c). Substituind n recuren, se obine
care pare adevrat datorit adugrii lui 17 n argumentul lui T n membrul drept. Intuitiv,
totui, acest termen suplimentar nu poate afecta n mod substanial soluia recurenei. Cnd n
este mare, diferena dintre T (bn/2c) i T (bn/2c + 17) nu e att de mare: ambele l taie pe n
aproximativ n dou. n consecin, intuim c T (n) = O(n lg n), relaie a crei corectitudine se
poate verifica utiliznd metoda substituiei (vezi exerciiul 4.1-5).
Alt cale de a face o intuire bun este s demonstrm limite superioare i inferioare largi ale
recurenei i apoi s reducem incertitudinea. De exemplu, putem ncepe cu o limit inferioar
T (n) = (n) pentru recurena (4.4), deoarece avem termenul n n recuren i putem demonstra
o limit superioar iniial T (n) = O(n2 ). Apoi, putem cobor gradual limita superioar i ridica
limita inferioar pn cnd ajungem la soluia corect, asimptotic strns, T (n) = (n lg n).
Subtiliti
Exist ocazii cnd putei intui corect o delimitare asimptotic a soluiei unei recurene, dar,
cumva, matematica nu pare s funcioneze n inducie. De regul, problema este c ipoteza de
inducie nu este suficient de tare pentru a demonstra delimitarea detaliat. Cnd ajungei ntr-
un astfel de impas, revizuirea aproximrii prin scoaterea unui termen de ordin mai mic permite,
adesea, matematicii s funcioneze.
S considerm recurena
care nu implic T (n) cn pentru orice alegere a lui c. Este tentant s ncercm o soluie mai
mare, s zicem T (n) = O(n2 ), care poate fi fcut s funcioneze dar, n fapt, aproximarea
noastr c soluia este T (n) = O(n) este corect. Pentru a demonstra aceasta, totui, trebuie s
facem o ipotez de inducie mai tare.
La prima vedere, aproximarea noastr e aproape corect: avem n plus doar constanta 1, un
termen de ordin inferior. Totui, inducia matematic nu funcioneaz dect dac demonstrm
forma exact a ipotezei de inducie. Depim aceast dificultate scznd un termen de ordin
inferior din aproximarea noastr precedent. Noua noastr intuire este T (n) cn b, unde
b 0 este constant. Avem acum
ct timp b 1. Ca i mai nainte, constanta c trebuie s fie aleas suficient de mare, pentru a
ndeplini condiiile la limit.
Majoritatea oamenilor gsesc ideea scderii unui termen de ordin inferior contraintuitiv. La
urma urmei, dac matematica nu funcioneaz, n-ar trebui s mrim soluia intuit? Cheia n
ntelegerea acestui pas este s ne amintim c utilizm inducia matematic: putem demonstra o
proprietate mai puternic pentru o valoare dat acceptnd o proprietate adevrat pentru valori
mai mici.
Evitarea capcanelor
Este uor s greim n utilizarea notaiei asimptotice. De exemplu, n recurena (4.4) putem
demonstra n mod greit c T (n) = O(n) presupunnd c T (n) cn i apoi argumentnd c
T (n) 2(cbn/2c) + n cn + n
= O(n), = greit!!
Schimbarea variabilelor
Uneori, o mic manipulare algebric poate s transforme o recuren necunoscut ntr-una
similar cunoscut. De exemplu, s considerm recurena
T (n) = 2T (b nc) + lg n,
care pare dificil. Putem simplifica aceast recuren, totui, printr-o schimbare de variabile.
Pentru comoditate, nu ne vom face griji n ceea ce privete rotunjirea valorilor, astfel nct ele
s fie ntregi, cum e cazul cu n. Redenumind m = lg n, obinem
T (2m ) = 2T (2m/2 ) + m.
S(m) = 2S(m/2) + m,
care e foarte asemntoare cu recurena (4.4) i are aceeai soluie: S(m) = O(m lg n). Revenind
de la S(m) la T (n), obinem T (n) = T (2m ) = S(m) = O(m lg m) = O(lg n lg lg n).
Exerciii
4.1-1 Artai c soluia lui T (n) = T (dn/2e) + 1 este O(lg n).
4.1-2 Artai c soluia lui T (n) = 2T (bn/2c) + n este (n lg n). Concluzionai c soluia este
(n lg n).
4.1-3 Artai c fcnd o ipotez de inducie diferit, putem depi dificultatea cu condiia la
limit T (1) = 1 pentru recurena (4.4) fr a ajusta condiiile la limit pentru demonstraia
inductiv.
50 Capitolul 4 Recurene
4.1-4 Artai c (n lg n) este soluia recurenei exacte (4.2) pentru procedura Sorteaz-
Prin-Interclasare.
4.1-5 Artai c soluia lui T (n) = 2T (bn/2c + 17) + n este O(n lg n).
4.1-6 Rezolvai recurena T (n) = 2T ( n) + 1 fcnd o schimbare de variabile, indiferent dac
valorile sunt ntregi sau nu.
Aici, am utilizat identitatea (2.9) pentru a concluziona c 3log4 n = nlog4 3 i am utilizat faptul
c log4 3 < 1 pentru a deduce c (nlog4 3 ) = o(n).
Metoda iteraiei duce de obicei la multe noiuni de algebr, iar asigurarea corectitudinii
calculelor poate fi o problem. Cheia este s ne focalizm asupra a doi parametri: numrul de
recurene necesare pentru a ajunge la condiia la limit i suma termenilor care apar la fiecare
nivel al procesului de iteraie. Uneori, n procesul de iterare a unei recurene, putei intui soluia
fr a face toate calculele. Atunci iterarea poate fi abandonat n favoarea metodei substituiei,
care de regul necesit mai puine noiuni de algebr.
Cnd o recuren conine funciile parte ntreag inferioar i superioar, calculele pot deveni
deosebit de complicate. Adesea este util s presupunem c recurena este definit numai pe
puterile exacte ale unui numr. n exemplul nostru, dac am fi presupus c n = 4k pentru un
4.2. Metoda iteraiei 51
anumit ntreg k, funcia parte ntreag inferioar ar fi putut fi omis, n mod convenabil. Din
nefericire, demonstrarea delimitrii T (n) = O(n) numai pentru puterile exacte ale lui 4 este,
din punct de vedere tehnic, un abuz al notaiei O. Definiiile notaiei asimptotice pretind ca
delimitrile s fie demonstrate pentru toi ntregii suficient de mari, nu doar pentru acei care
sunt puteri ale lui 4. Vom vedea n seciunea 4.3 c pentru un mare numr de recurene aceast
dificultate tehnic poate fi depit. Problema 4-5 ofer, de asemenea, condiii n care o analiz
pentru puterile exacte ale unui ntreg poate fi extins la toi ntregii.
Arbori de recuren
Un arbore de recuren este un mod convenabil de a vizualiza ceea ce se ntmpl cnd o
recuren este iterat i poate s ajute la organizarea aparatului algebric necesar pentru a rezolva
recurena. Este n mod special util cnd recurena descrie un algoritm divide i stpnete. Figura
4.1 arat deducerea arborelui de recuren pentru
T (n) = 2T (n/2) + n2 .
Pentru comoditate, presupunem c n este o putere exact a lui 2. Partea (a) a figurii arat
T (n), care n partea (b) a fost dezvoltat ntr-un arbore echivalent care reprezint recurena.
Termenul n2 este rdcina (costul la nivelul cel mai de sus al recurenei), iar cei doi subarbori
ai rdcinii sunt cele dou recurene mai mici T (n/2). Partea (c) arat acest proces dus cu un
pas mai departe, dezvoltnd T (n/2). Costul pentru fiecare dintre cele dou subnoduri de la al
doilea nivel al recurenei este (n/2)2 . Continum dezvoltarea fiecrui nod din arbore, sprgndu-l
n prile componente, aa cum sunt determinate de recuren, pn ajungem la o condiie la
limit. Partea (d) arat arborele obinut.
Evalum acum recurena adunnd valorile de la fiecare nivel al arborelui. Nivelul cel mai
nalt are valoarea total n2 , nivelul al doilea are valoarea (n/2)2 + (n/2)2 = n2 /2, al treilea nivel
are valoarea (n/4)2 + (n/4)2 + (n/4)2 + (n/4)2 = n2 /4 i aa mai departe. Deoarece valorile
descresc geometric, totalul este cu cel mult un factor constant mai mare dect termenul cel mai
mare (primul) i deci soluia este (n2 ).
Cu un alt exemplu, mai complicat, figura 4.2 arat arborele de recuren pentru
(Pentru simplitate, omitem iari funciile parte ntreag inferioar i superioar). Cnd
adugm valorile de la nivelurile arborelui de recuren, obinem o valoare a lui n pentru fiecare
nivel. Cel mai lung drum de la rdcin la o frunz este n (2/3)n (2/3)2 n . . .
1. Deoarece (2/3)k n = 1 cnd k = log3/2 n, nlimea arborelui este log3/2 n. Astfel, soluia
recurenei este cel mult n log3/2 n = O(n lg n).
Exerciii
4.2-1 Determinai o limit superioar asimptotic bun pentru recurena T (n) = 3T (bn/2c)+n
prin iteraie.
Figura 4.1 Construirea arborelui de recuren pentru T (n) = 2T (n/2) + n2 . Partea (a) l prezint pe
T (n) care n (b)-(d) este expandat treptat n trei arbori de recuren. Arborele expandat complet din
partea (d) are nlimea lg n (are lg n + 1 niveluri).
4.2-4 Utilizai iteraia pentru a rezolva recurena T (n) = T (n a) + T (a) + n, unde a 1 este
o constant.
4.2-5 Utilizai un arbore de recuren pentru a rezolva recurena T (n) = T (n)+T ((1)n)+n,
unde este o constant din domeniul 0 < < 1.
4.3. Metoda master 53
unde a 1 i b > 1 sunt constante, iar f (n) este o funcie asimptotic pozitiv. Metoda master
pretinde memorarea a trei cazuri, dar apoi soluia multor recurene se poate determina destul
de uor, de multe ori fr creion i hrtie.
Recurena (4.5) descrie timpul de execuie al unui algoritm care mparte o problem de di-
mensiune n n a subprobleme, fiecare de dimensiune n/b, unde a i b sunt constante pozitive.
Cele a subprobleme sunt rezolvate recursiv, fiecare n timp T (n/b). Costul divizrii problemei i
al combinrii rezultatelor subproblemelor este descris de funcia f (n). (Adic, utiliznd notaia
din seciunea 1.3.2, f (n) = D(n) + C(n).) De exemplu, n recurena din procedura Sorteaz-
Prin-Interclasare a = 2, b = 2 i f (n) = (n).
Din punctul de vedere al corectitudinii tehnice, recurena nu este, de fapt, bine definit,
deoarece n/b ar putea s nu fie un ntreg. nlocuirea fiecruia dintre cei a termeni T (n/b) fie cu
T (bn/bc) fie cu T (dn/be) nu afecteaz, totui, comportamentul asimptotic al recurenei. (Vom
demonstra aceasta n seciunea urmtoare.) n mod normal ne va conveni, de aceea, s omitem
funciile parte ntreag inferioar i superioar cnd scriem recurene divide i stpnete de
aceast form.
Teorema master
Metoda master depinde de urmtoarea teorem.
54 Capitolul 4 Recurene
Teorema 4.1 (Teorema master) Fie a 1 i b > 1 constante, fie f (n) o funcie i fie T (n)
definit pe ntregii nenegativi prin recurena
T (n) = aT (n/b) + f (n)
unde interpretm n/b fie ca bn/bc, fie ca dn/be. Atunci T (n) poate fi delimitat asimptotic dup
cum urmeaz.
1. Dac f (n) = O(nlogb a ) pentru o anumit constant > 0, atunci T (n) = (nlogb a ).
2. Dac f (n) = (nlogb a ), atunci T (n) = (nlogb a lg n).
3. Dac f (n) = (nlogb a+ ) pentru o anumit constant > 0, i dac af (n/b) cf (n)
pentru o anumit constant c < 1 i toi n suficient de mari, atunci T (n) = (f (n)).
n care a = 1, b = 3/2, f (n) = 1 i nlogb a = nlog3/2 1 = n0 = 1. Cazul 2 este cel care se aplic,
deoarece f (n) = (nlogb a ) = (1) i astfel soluia recurenei este T (n) = (lg n).
Pentru recurena
T (n) = 3T (n/4) + n lg n,
T (n) = 2T (n/2) + n lg n,
Exerciii
4.3-1 Utilizai metoda master pentru a da o delimitare asimptotic strns pentru urmtoarele
recurene.
a. T (n) = 4T (n/2) + n.
b. T (n) = 4T (n/2) + n2 .
c. T (n) = 4T (n/2) + n3 .
4.3-2 Timpul de execuie al unui algoritm A este descris prin recurena T (n) = 7T (n/2) + n2 .
Un algoritm concurent A0 are timpul de execuie de T 0 = aT 0 (n/4) + n2 . Care este cea mai mare
valoare ntreag a lui a astfel nct A0 este asimptotic mai rapid dect A?
4.3-3 Utilizai metoda master pentru a arta c soluia recurenei T (n) = T (n/2) + (1) a
cutrii binare (vezi exerciiul 1.3-5) este T (n) = (lg n).
4.3-4 ? Considerm condiia de regularitate af (n/b) cf (n) pentru o anumit constant c < 1,
care face parte din cazul 3 al teoremei master. Dai un exemplu de o funcie simpl f (n) care
satisface toate condiiile din cazul 3 al teoremei master, cu excepia condiiei de regularitate.
Demonstraia const din dou pri. Prima parte analizeaz recurena master (4.5) n
ipoteza simplificatoare c T (n) este definit numai pe puterile exacte ale lui b > 1, adic pentru
n = 1, b, b2 , . . . Aceast parte furnizeaz toat intuiia necesar pentru a nelege de ce teorema
master este adevrat. A doua parte arat de ce analiza se poate extinde la toi ntregii pozitivi
n i este, n esen, tehnic matematic aplicat la problema tratrii prilor ntregi inferioare
i superioare.
n aceast seciune, uneori vom abuza uor de notaia noastr asimptotic, utiliznd-o pentru
a descrie funcii care sunt definite numai pe puteri exacte ale lui b. Reamintim c definiiile
notaiilor asimptotice pretind ca delimitrile s fie demonstrate pentru toate numerele suficient
de mari, nu numai pentru cele care sunt puteri ale lui b. Deoarece am putea introduce noi notaii
asimptotice care s se aplice mulimii {bi : i = 0, 1, . . .} n locul ntregilor nenegativi, acest abuz
este minor.
Oricum, trebuie s fim ntotdeauna pui n gard cnd utilizm notaii asimptotice pe un
domeniu limitat, ca s nu tragem concluzii improprii. De exemplu, demonstrarea faptului c
T (n) = O(n) cnd n este o putere exact a lui 2 nu garanteaz c T (n) = O(n). Funcia T (n)
poate fi definit ca
n dac n = 1, 2, 4, 8, . . . ,
T (n) =
n2 n rest,
caz n care cea mai bun margine superioar ce poate fi demonstrat este T (n) = O(n2 ). Din
cauza acestui gen de consecine drastice, niciodat nu vom utiliza notaia asimptotic pe un
domeniu limitat fr s atragem atenia asupra acestui lucru.
n ipoteza c n este o putere exact a lui b > 1, unde n nu trebuie s fie un ntreg. Analiza e
mprit n trei leme. Prima reduce problema rezolvrii recurenei master la problema evalurii
unei expresii care conine o sum. A doua determin margini ale acestei sume. A treia lem le
pune mpreun pe primele dou pentru a demonstra o versiune a teoremei master pentru cazul
n care n este o putere exact a lui b.
Lema 4.2 Fie a 1 i b > 1 constante i fie f (n) o funcie nenegativ definit pe puterile
exacte ale lui b. Definim T (n) pe puterile exacte ale lui b prin recurena
(1) dac n = 1,
T (n) =
aT (n/b) + f (n) dac n = bi ,
utiliznd condiia la limit T (1) = (1). Termenii rmai pot fi exprimai sub forma sumei
logb n1
X
aj f (n/bj );
j=0
astfel,
logb n1
X
logb a
T (n) = (n )+ aj f (n/bj ),
j=0
Arborele de recuren
nainte de a continua, vom ncerca s intuim puin demonstraia utiliznd un arbore de
recuren. Figura 4.3 arat arborele corespunztor iterrii recurenei din lema 4.2. Rdcina
arborelui are costul f (n) i are a fii, fiecare cu costul f (n/b). (Este convenabil s ne gndim la
a ca fiind un ntreg, n special cnd vizualizm arborele de recuren, dar din punct de vedere
matematic nu este necesar acest lucru.) Fiecare dintre fii are a fii cu costul f (n/b2 ) i astfel exist
a2 noduri situate la distana 2 de rdcin. n general, exist aj noduri care sunt la distana
j de rdcin i fiecare are costul f (n/bj ). Costul fiecrei frunze este T (1) = (1) i fiecare
frunz este la distana logb n de rdcin, deoarece n/blogb n = 1. Exist nlogb n = nlogb a frunze
n arbore.
Putem obine ecuaia (4.6) nsumnd costurile fiecrui nivel al arborelui, dup cum se arat
n figur. Costul pentru un nivel j de noduri interne este aj f (n/bj ) i astfel totalul pe toate
nivelurile de noduri interne este
logb n1
X
aj f (n/bj ).
j=0
n algoritmul divide i stpnete prezentat, aceast sum reprezint costurile divizrii pro-
blemelor n subprobleme i apoi al recombinrii subproblemelor. Costul tuturor frunzelor, care
este costul rezolvrii tuturor celor nlogb a subprobleme de dimensiune 1, este (nlogb a ).
n limbajul arborelui de recuren, cele trei cazuri ale teoremei master corespund cazurilor n
care costul total al arborelui este (1) dominat de costul frunzelor, (2) egal distribuit pe nivelurile
arborelui sau (3) dominat de costul rdcinii.
Suma din ecuaia (4.6) descrie costul pailor de divizare i combinare din algoritmul divide i
stpnete prezentat. Urmtoarea lem furnizeaz delimitri asimptotice asupra creterii sumei.
58 Capitolul 4 Recurene
Figura 4.3 Arborele de recuren generat de T (n) = aT (n/b) + f (n). Acesta este un arbore complet a-
ar cu nlogb a frunze, avnd nlimea logb n. Costul fiecrui nivel este notat n dreapta, iar suma acestora
este dat de ecuaia (4.6)
Lema 4.3 Fie a 1 i b > 1 constante i fie f (n) o funcie nenegativ definit pe puterile
exacte ale lui b. O funcie definit pe puterile exacte ale lui b prin
logb n1
X
g(n) = aj f (n/bj ) (4.7)
j=0
poate fi delimitat asimptotic pentru puterile exacte ale lui b dup cum urmeaz.
3. Dac af (n/b) cf (n) pentru o anumit constant c < 1 i toi n b, atunci g(n) =
(f (n)).
Demonstraie. Pentru cazul 1, avem f (n) = O(nlogb a ), de unde f (n/bj ) = O((n/bj )logb a ).
nlocuind n ecuaia (4.7) rezult
logb n1
X n logb a
g(n) = O aj . (4.8)
j=0
bj
4.4. Demonstraia teoremei master 59
Delimitm suma din interiorul lui ca i n cazul 1, dar de data aceasta nu obinem o serie
geometric. n schimb, descoperim c fiecare termen al sumei este acelai
logb n1
X n logb a logb n1
X a j logb n1
X
aj = nlogb a = nlogb a 1 = nlogb a logb n.
j=0
bj j=0
blogb a j=0
deoarece c este o constant. Astfel, putem concluziona c g(n) = (f (n)) pentru puterile exacte
ale lui b. Cazul 3 este demonstrat, ceea ce completeaz demonstraia lemei.
Putem demonstra acum o versiune a teoremei master pentru cazul n care n este o putere
exact a lui b.
60 Capitolul 4 Recurene
Lema 4.4 Fie a 1 i b > 1 constante i fie f (n) o funcie nenegativ, definit pe puterile
exacte ale lui b. Definim T (n) pe puterile exacte ale lui b prin recurena
(1) dac n = 1,
T (n) =
aT (n/b) + f (n) dac n = bi ,
unde i este un ntreg pozitiv. Atunci T (n) poate fi delimitat asimptotic pentru puterile exacte
ale lui b dup cum urmeaz
1. Dac f (n) = O(nlogb a ) pentru o anumit constant > 0, atunci T (n) = (nlogb a ).
3. Dac f (n) = (nlogb a+ ) pentru o anumit constant > 0 i dac af (n/b) cf (n) pentru
o anumit constant c < 1 i toate valorile lui n suficient de mari, atunci T (n) = (f (n)).
Demonstraie. Utilizm delimitrile din lema 4.3 pentru a evalua suma (4.6) din lema 4.2.
Pentru cazul 1, avem
Pentru cazul 3, condiia af (n/b) cf (n) implic f (n) = (nlogb a+ ) (vezi exerciiul 4.4-3).
n consecin,
este o operaie de rutin, deoarece delimitarea dn/be nb poate fi utilizat n primul caz pentru a
obine rezultatul dorit, iar delimitarea bn/bc n/b poate fi utilizat n al doilea caz. Delimitarea
inferioar a recurenei (4.11) necesit n mare parte acelai procedeu ca i delimitarea superioar
a recurenei (4.10), astfel c vom prezenta numai ultima delimitare.
4.4. Demonstraia teoremei master 61
Vrem s iterm recurena (4.10) aa cum s-a fcut n lema 4.2. Pe msur ce iterm recurena,
obinem un ir de invocri recursive cu argumentele
n, dn/be,
ddn/be/be,
dddn/be/be/be,
..
.
S notm al i-lea element din ir cu ni , unde
n dac i = 0,
ni = (4.12)
dni1 /be dac i > 0.
Primul nostru scop este s determinm numrul k de iteraii astfel nct nk s fie o constant.
Utiliznd inegalitatea dxe x + 1, obinem
n0 n,
n1 nb + 1,
n2 bn2 + 1b + 1,
n3 bn3 + b12 + 1b + 1,
..
.
n general,
i1
n X 1 n b
ni + i+ ,
bi j=0 bj b b1
care este foarte asemntoare cu ecuaia (4.6) cu excepia faptului c n este un ntreg arbitrar
i nu e restrns la o putere exact a lui b.
Putem evalua acum suma
blogb nc1
X
g(n) = aj f (nj ) (4.14)
j=0
din (4.13) ntr-o manier similar cu demonstraiei lemei 4.3. ncepnd cu cazul 3, dac
af (dn/be) cf (n) pentru n > b + b/(b 1), unde c < 1 este o constant, atunci rezult c
aj f (nj ) cj f (n). De aceea, suma din ecuaia (4.14) poate fi evaluat exact ca n lema 4.3. Pentru
cazul 2, avem f (n) = (nlogb a ). Dac putem arta c f (nj ) = O(nlogb a /aj ) = O((n/bj )logb a ),
atunci demonstraia este valabil i n acest caz. Observm c j blogb nc implic bj /n 1.
62 Capitolul 4 Recurene
Delimitarea f (n) = O(nlogb a ) implic existena unei constante c > 0 astfel nct pentru nj
suficient de mare,
logb a log a j logb a
n b n b b b
f (nj ) c j + =c 1+
b b1 aj n b1
log a logb a log a
n b b n b
= c j
1 + O ,
a b1 aj
deoarece c(1 + b/(b 1))logb a este o constant. Astfel, cazul 2 este demonstrat. Demonstraia
cazului 1 este aproape identic. Cheia este s demonstrm delimitarea f (nj ) = O(nlogb a ), care
este similar cu demonstraia corespunztoare din cazul 2, dei calculele sunt mai complicate.
Am demonstrat delimitrile superioare din teorema master pentru toi ntregii n. Demon-
straia delimitrilor inferioare este similar.
Exerciii
4.4-1 ? Dai o expresie simpl i exact pentru ni n ecuaia (4.12) pentru cazul n care b este
un ntreg pozitiv n loc de un numr real arbitrar.
4.4-2 ? Artai c dac f (n) = (nlogb a lgk n), unde k 0, atunci recurena master are soluia
T (n) = (nlogb a lgk+1 n). Pentru simplitate, limitai-v analiza la cazul puterilor exacte ale lui
b.
4.4-3 Artai c ipotezele cazului 3 din teorema master sunt abundente, n sensul c cerina de
regularitate af (n/b) cf (n) pentru o anumit constant c < 1 implic existena unei constante
> 0 astfel nct f (n) = (nlogb a+ ).
Probleme
4-1 Exemple de recurene
Dai margini asimptotice superioare i inferioare pentru fiecare dintre urmtoarele recurene.
Presupunei c T (n) este constant pentru n 2. Facei marginile ct de strnse se poate i
justificai a rspunsurile.
a. T (n) = 2T (n/2) + n3 .
b. T (n) = T (9n/10) + n.
d. T (n) = 7T (n/3) + n2 .
e. T (n) = 7T (n/2) + n2 .
f. T (n) = 2T (n/4) + n.
g. T (n) = T (n 1) + n.
Probleme 63
h. T (n) = T ( n) + 1.
f. T (n) = nT ( n) + n.
unde
1+ 5 1 5
= = 1.61803 . . . i b = = 0.61803 . . . .
2 2
c. Artai c
X
1
F(z) = (i bi )z i .
i=0
5
d. Demonstrai c Fi = i / 5 pentru i > 0, rotunjit la cel mai apropiat ntreg. (Indicaie:
b < 1.)
||
e. Demonstrai c Fi+2 i pentru i 0.
Note bibliografice 65
a. Demonstrai c dac mai mult de de n/2 cip-uri sunt defecte, profesorul nu poate neaprat
s determine care cip-uri sunt bune, utiliznd orice strategie bazat pe acest tip de testare
pe perechi. Presupunei c cip-urile defecte pot conspira pentru a-l pcli pe profesor.
b. S considerm problema gsirii unui singur cip bun dintre n cip-uri, presupunnd c mai
mult de n/2 cip-uri sunt bune. Artai c bn/2c teste pe perechi sunt suficiente pentru a
reduce dimensiunea problemei la jumtate.
c. Artai c cip-urile bune pot fi identificate cu (n) teste pe perechi, presupunnd c mai
mult de n/2 cip-uri sunt bune. Dai i rezolvai recurena care descrie numrul de teste.
Note bibliografice
Recurenele au fost studiate nc din 1202 de ctre L. Fibonacci, dup care sunt denumite
numerele lui Fibonacci. A. De Moivre a introdus metoda funciilor generatoare (vezi problema
4-6) pentru rezolvarea recurenelor. Metoda master este adaptat din Bentley, Haken i Saxe
[26], care prezint metoda extins justificat prin exerciiul 4.4-2. Knuth [121] i Liu [140] arat
cum se rezolv recurenele liniare utiliznd metoda funciilor generatoare. Purdom i Brown [164]
conine o discuie extins asupra rezolvrii recurenelor.
1 VLSI nseamn very-large-scale-integration (integrare la scar foarte mare), care este tehnologia chip-urilor
n capitolele anterioare am studiat unele noiuni matematice. n acest capitol vom recapitula
i vom completa notaiile, definiiile i proprietile elementare ale mulimilor, relaiilor, func-
iilor, grafurilor i arborilor. Cititorii familiarizai cu aceste noiuni trebuie, doar, s rsfoiasc
paginile acestui capitol.
5.1. Mulimi
O mulime este o colecie de obiecte distincte numite membri sau elemente. Dac un
obiect x este element al mulimii S, scriem x S i citim x este un element al lui S sau, mai
scurt, x aparine lui S. Dac x nu este un element al lui S, scriem x / S. Putem descrie o
mulime enumerndu-i elementele n mod explicit ca o list ntre acolade. De exemplu, putem
defini o mulime S care conine numerele 1, 2 i 3 scriind S = {1, 2, 3}. Deoarece 2 este un element
al mulimii S, vom scrie 2 S, dar vom scrie 4 / S deoarece 4 nu este un element al lui S. O
mulime nu poate conine acelai obiect de mai multe ori i elementele sale nu sunt ordonate.
Dou mulimi A i B sunt egale dac ele conin aceleai elemente. Notaia folosit pentru a arta
c dou mulimi sunt egale este A = B. De exemplu, avem {1, 2, 3, 1} = {1, 2, 3} = {3, 2, 1}.
Folosim notaii speciale pentru cteva mulimi mai des ntlnite.
Notm cu mulimea vid, adic mulimea care nu conine nici un element.
Notm cu Z mulimea numerelor ntregi, adic mulimea {. . . , 2, 1, 0, 1, 2, . . .}.
Notm cu R mulimea numerelor reale.
Notm cu N mulimea numerelor naturale, adic mulimea {0, 1, 2, . . .}.1
Dac toate elementele unei mulimi A sunt coninute ntr-o mulime B, adic dac x A
implic x B, atunci scriem A B i spunem c A este o submulime a lui B. O mulime A
este o submulime strict a lui B, notat A B, dac A B dar A 6= B. (Unii autori folosesc
simbolul pentru a nota relaia obinuit de incluziune i nu relaia de incluziune strict.)
Pentru orice mulime A, avem A A. Pentru dou mulimi A i B, avem A = B dac, i numai
dac, A B i B A. Pentru oricare trei mulimi A, B i C, dac A B i B C, atunci
A C. Pentru orice mulime A avem A.
Uneori definim mulimi pornind de la alte mulimi deja definite. Dndu-se o mulime A,
putem defini o mulime B A impunnd o restricie care s disting elementele din B de
celelalte elemente din A. De exemplu putem defini mulimea numerelor ntregi pare prin
x:xZ
i x/2 este un numr ntreg}. Cele dou puncte din notaia anterioar nseamn astfel nct.
(Unii autori folosesc o bar vertical n locul acestor dou puncte.)
1 Unii autori susin c 0 nu face parte din mulimea numerelor naturale. Totui tendina modern este de a
Dndu-se dou mulimi A i B putem defini noi mulimi aplicnd unii operatori cu mul-
imi:
Intersecia mulimilor A i B este mulimea
A B = {x : x A i x B}.
A B = {x : x A sau x B}.
A B = {x : x A i x
/ B}.
Figura 5.1 O diagram Venn ilustrnd prima regul a lui DeMorgan (5.2). Fiecare dintre mulimile
A, B i C este reprezentat ca un cerc n plan.
Prima dintre regulile lui DeMorgan este ilustrat n figura 5.1, folosind o diagram Venn,
o imagine grafic n care mulimile sunt reprezentate ca regiuni n plan.
Deseori toate mulimile considerate sunt submulimi ale unei mulimi mai mari U numit
univers. De exemplu, dac lum n considerare diferite mulimi formate numai din ntregi, mul-
imea Z este un univers potrivit. Dndu-se un univers U , definim complementul unei mulimi
A ca fiind A = U A. Pentru orice mulime A U , urmtoarele propoziii sunt adevrate:
A = A,
AA = ,
AA = U.
Dndu-se dou mulimi A, B U , regulile lui DeMorgan pot fi rescrise cu ajutorul complemen-
telor mulimilor A i B fa de U astfel:
A B = A B,
A B = A B.
Cu alte cuvinte, S formeaz o partiie a lui S dac fiecare element al mulimii S apare n exact
o mulime Si S.
Numrul de elemente ale unei mulimi poart denumirea de cardinal (sau dimensiune)
al mulimii i este notat cu |S|. Dou mulimi au acelai cardinal dac poate fi stabilit o
coresponden biunivoc ntre cele dou mulimi. Cardinalul mulimii vide este || = 0. n
cazul n care cardinalul unei mulimi este un numr natural, spunem c mulimea este finit;
altfel, ea este infinit. O mulime infinit care poate fi pus n coresponden biunivoc cu
mulimea numerelor naturale N este numit mulime numrabil infinit; n caz contrar
5.1. Mulimi 69
|A B| |A| + |B|.
A B = {(a, b) : a A i b B}.
De exemplu {a, b} {a, b, c} = {(a, a), (a, b), (a, c), (b, a), (b, b), (b, c)}. Cnd A i B sunt mulimi
finite, cardinalul produsului lor cartezian este:
A1 A2 An = {(a1 , a2 , . . . , an ) : ai Ai , i = 1, 2, . . . , n},
dac toate mulimile sunt finite. Notm produsul cartezian dintre o mulime A i ea nsi prin
A2 = A A.
Similar, avem:
An = A A A.
Cardinalul acestei ultime mulimi este |An | = |A|n dac A este finit. Un n-tuplu poate fi privit
ca un ir finit de lungime n (vezi seciunea 5.3).
70 Capitolul 5 Mulimi etc.
Exerciii
5.1-1 Desenai diagramele Venn care ilustreaz prima regul de distributivitate (5.1).
5.1-2 Demonstrai regulile generalizate ale lui DeMorgan pentru orice colecie finit de mulimi:
A1 A2 An = A1 A2 An ,
A1 A2 An = A1 A2 An .
5.1-3 ? Demonstrai generalizarea ecuaiei (5.3), care este denumit principiul includerii i
al excluderii:
|A1 A2 An | =
|A1 | + |A2 | + + |An |
|A1 A2 | |A1 A3 | (toate perechile)
+|A1 A2 A3 | + (toate tripletele)
..
.
+(1)n1 |A1 A2 An |.
5.1-5 Artai c, pentru orice mulime finit S, mulimea prilor sale 2S are 2|S| elemente
(adic exist 2|S| submulimi distincte ale lui S).
5.1-6 Dai o definiie inductiv pentru un n-tuplu extinznd definiia perechii ordonate din
teoria mulimilor.
5.2. Relaii
O relaie binar R ntre dou mulimi A i B este o submulime a produsului cartezian
AB. Dac (a, b) R, folosim uneori notaia a R b. Cnd spunem c R este o relaie binar peste
o mulime A, nelegem c R este o submulime a produsului cartezian AA. De exemplu, relaia
mai mic dect peste mulimea numerelor naturale este mulimea {(a, b) : a, b N i a < b}. O
relaie n-ar ntre mulimile A1 , A2 , . . . , An este o submulime a lui A1 A2 An .
O relaie binar R A A este reflexiv dac
aRa
pentru orice a A. De exemplu, = i sunt relaii reflexive peste N n timp ce relaia <
nu este. Relaia R este simetric dac
a R b implic b R a
pentru orice a, b A. De exemplu, = este simetric, dar < i nu sunt. Relaia R este
tranzitiv dac
a R b i b R c implic a R c
5.2. Relaii 71
pot exista mai multe cutii maximale care nu pot fi introduse n interiorul nici unei alte cutii,
neexistnd totui nici o cutie maxim n interiorul creia s poat fi introduse toate celelalte
cutii.
O relaie parial de ordine R peste o mulime A este o relaie de ordine total sau re-
laie de ordine liniar dac pentru orice a, b A avem a R b sau b R a, adic orice pereche
de elemente din A poate fi pus n relaie de ctre R. De exemplu, relaia este o relaie de
ordine total peste mulimea numerelor naturale, dar relaia este descendent al lui nu este o
relaie de ordine total peste mulimea tuturor fiinelor umane deoarece exist perechi de indivizi
pentru care nici unul nu este descendentul celuilalt.
Exerciii
5.2-1 Demonstrai c relaia de incluziune peste toate submulimile lui Z este o relaie de
ordine parial, dar nu este o relaie de ordine total.
5.2-2 Artai c, pentru orice ntreg pozitiv n, relaia de echivalen modulo n este o relaie
de echivalen peste mulimea numerelor ntregi. (Spunem c a b (mod n) dac exist un
numr ntreg q astfel nct a b = qn.) n ce clase de echivalen partiioneaz aceast relaie
mulimea numerelor ntregi?
5.2-4 Fie S o mulime finit i R o relaie de echivalen peste S S. Artai c, dac R este
i antisimetric, atunci clasele de echivalen ale lui S fa de R sunt mulimi unitate.
5.2-5 Profesorul Narcissus susine c, dac o relaie este simetric i tranzitiv, ea este i re-
flexiv. El ofer urmtoarea demonstraie: prin simetrie a R b implic b R a, deci tranzitivitatea
implic a R a. Are profesorul dreptate?
5.3. Funcii
Dndu-se dou mulimi A i B, o funcie este o relaie binar peste A B astfel nct,
pentru orice a A, exist exact un b B, i (a, b) f . Mulimea A este numit domeniul lui
f , iar mulimea B este numit codomeniul lui f . Uneori, scriem f : A B i, dac (a, b) f ,
scriem b = f (a), deoarece b este unic determinat prin alegerea lui a.
Intuitiv, funcia f atribuie fiecrui element din A un element din B. Nici unui element din
A nu i se atribuie dou elemente diferite din B, dar acelai element din B poate fi atribuit mai
multor elemente diferite din A. De exemplu, relaia binar
f = {(a, b) : a N i b = a mod 2}
5.3. Funcii 73
este o funcie f : N {0, 1}, deoarece pentru fiecare numr natural a exist exact o valoare b
n {0, 1} astfel nct b = a mod 2. Pentru acest exemplu avem 0 = f (0), 1 = f (1), 0 = f (2) etc.
n schimb, relaia binar
g = {(a, b) : a N i a + b este par}
nu este o funcie deoarece att (1, 3) ct i (1, 5) se afl n g, deci dac alegem a = 1 nu putem
determina un singur b pentru care (a, b) g.
Dndu-se o funcie f : A B dac b = f (a), spunem c a este argumentul lui f , iar b
este valoarea lui f n punctul a. Putem defini o funcie enumernd valorile sale pentru fiecare
element din domeniu. De exemplu, putem defini f (n) = 2n pentru n N, ceea ce nseamn
f = {(n, 2n) : n N}. Dou funcii f i g sunt egale dac au acelai domeniu, acelai codomeniu
i, pentru orice a din domeniu, avem f (a) = g(a).
Un ir finit de lungime n este o funcie f al crei domeniu este mulimea {0, 1, . . . , n 1}.
Deseori, definim un ir finit prin enumerarea valorilor sale: hf (0), f (1), . . . , f (n 1)i. Un ir
infinit este o funcie al crei domeniu este mulimea numerelor naturale N. De exemplu, irul
lui Fibonacci, definit prin (2.13), este irul infinit h0, 1, 1, 2, 3, 5, 8, 13, 21, . . .i.
Cnd domeniul unei funcii f este un produs cartezian, omitem adesea perechea suplimentar
de paranteze n care este cuprins argumentul lui f . De exemplu, dac f : A1 A2 An B,
vom scrie b = f (a1 , a2 , . . . , an ) n loc de a scrie b = f ((a1 , a2 , . . . , an )). De asemenea, vom numi
fiecare ai un argument al lui f , cu toate c singurul argument veritabil al lui f este n-tuplul
(a1 , a2 , . . . , an ).
Dac f : A B este o funcie i b = f (a), uneori, spunem c b este imaginea lui a prin f .
Imaginea unei mulimi A0 A prin f este definit prin:
f (A0 ) = {b B : b = f (a) pentru a A0 }.
Domeniul de valori al unei funcii este imaginea domeniului su, adic f (A). De exemplu
imaginea funciei f : N N definit prin f (n) = 2n este f (N) = {m : m = 2n pentru n N}.
O funcie este o surjecie dac imaginea sa este egal cu codomeniul su. De exemplu, funcia
f (n) = bn/2c este o funcie surjectiv de la N la N deoarece fiecare element din N este valoare a
lui f pentru un anumit argument. n schimb, funcia f (n) = 2n nu este o funcie surjectiv de
la N la N deoarece pentru nici un argument funcia nu ia valoarea 3. Funcia f (n) = 2n este,
totui, o funcie surjectiv de la mulimea numerelor naturale la mulimea numerelor pare.
O funcie f : A B este o injecie dac, pentru argumente distincte, avem valori distincte
ale funciei, adic a 6= a0 implic f (a) 6= f (a0 ). De exemplu funcia f (n) = 2n este o funcie
injectiv de la N la N deoarece fiecare numr par b este imaginea prin f a cel mult un element
din domeniu, mai precis a lui b/2. Funcia f (n) = bn/2c nu este injectiv deoarece ia valoarea 1
pentru mai multe argumente: 2 i 3. O injecie se numete uneori funcie unu-la-unu.
O funcie f : A B este o bijecie dac este injectiv i surjectiv. De exemplu, funcia
f (n) = (1)n dn/2e este o bijecie de la N la Z:
0 0,
1 1,
2 1,
3 2,
4 2,
..
.
74 Capitolul 5 Mulimi etc.
Funcia este injectiv, deoarece nici un element din Z nu este imagine a mai multor elemente din
N, i surjectiv, deoarece fiecare element din Z este imagine a unui element din N. n concluzie,
funcia este bijectiv. O bijecie este uneori numit i coresponden unu-la-unu deoarece
mperecheaz elemente din domeniu i codomeniu. O bijecie de la o mulime A la ea nsi
este uneori numit o permutare.
Cnd o funcie f este bijectiv inversa ei f 1 este definit prin:
f 1 (b) = a dac i numai dac f (a) = b.
De exemplu, inversa funciei f (n) = (1)n dn/2e este
2m dac m 0,
f 1 (m) =
2m 1 dac m < 0.
Exerciii
5.3-1 Fie A i B dou mulimi finite i o funcie f : A B. Artai c:
a. dac f este injectiv atunci |A| |B|;
b. dac f este surjectiv atunci |A| |B|.
5.3-2 Verificai dac funcia f (x) = x + 1 este bijectiv n cazul n care domeniul i codomeniul
sunt N. Dar dac domeniul i codomeniul sunt Z?
5.3-3 Dai o definiie natural pentru inversa unei relaii binare, astfel nct dac o relaie
binar este, de fapt, o funcie bijectiv, atunci inversa relaiei este inversa funciei.
5.4. Grafuri
Aceast seciune prezint dou tipuri de grafuri: orientate i neorientate. Cititorul trebuie
avizat c anumite definiii din literatura de specialitate difer de cele prezentate aici, dar n cele
mai multe cazuri diferenele sunt minore. Seciunea 23.1 arat cum pot fi reprezentate grafurile
n memoria calculatorului.
Un graf orientat (sau digraf) G este o pereche (V, E), unde V este o mulime finit, iar E
este o relaie binar pe V . Mulimea V se numete mulimea vrfurilor lui G, iar elementele
ei se numesc vrfuri. Mulimea E se numete mulimea arcelor lui G, i elementele ei se nu-
mesc arce. Figura 5.2(a) este o reprezentare grafic a unui graf orientat cu mulimea de vrfuri
{1, 2, 3, 4, 5, 6}. n figur, vrfurile sunt reprezentate prin cercuri, iar arcele prin sgei. Observai
c sunt posibile autobuclele arce de la un vrf la el nsui.
ntr-un graf neorientat G = (V, E), mulimea muchiilor E este constituit din perechi
de vrfuri neordonate, i nu din perechi ordonate. Cu alte cuvinte, o muchie este o mulime
{u, v}, unde u, v V i u 6= v. Prin convenie, pentru o muchie vom folosi notaia (u, v) n locul
notaiei pentru mulimi {u, v}, iar (u, v) i (v, u) sunt considerate a fi aceeai muchie. ntr-un
graf neorientat, autobuclele sunt interzise i astfel fiecare muchie este format din exact dou
5.4. Grafuri 75
Figura 5.2 Grafuri orientate i neorientate. (a) Un graf orientat G = (V, E), unde V = {1, 2, 3, 4, 5, 6}
i E = {(1, 2), (2, 2), (2, 4), (2, 5), (4, 1), (4, 5), (5, 4), (6, 3)}. Arcul (2, 2) este o autobucl. (b) Un graf
neorientat G = (V, E), unde V = {1, 2, 3, 4, 5, 6} i E = {(1, 2), (1, 5), (2, 5), (3, 6)}. Vrful 4 este izolat.
(c) Subgraful grafului de la (a) indus de mulimea de vrfuri {1, 2, 3, 6}.
vrfuri distincte. Figura 5.2(b) este o reprezentare grafic a unui graf neorientat avnd mulimea
de vrfuri {1, 2, 3, 4, 5, 6}.
Multe definiii pentru grafuri orientate i neorientate sunt aceleai, dei anumii termeni pot
avea semnificaii diferite n cele dou contexte. Dac (u, v) este un arc ntr-un graf orientat
G = (V, E), spunem c (u, v) este incident din sau pleac din vrful u i este incident n
sau intr n vrful v. De exemplu, arcele care pleac din vrful 2, n figura 5.2(a), sunt (2, 2),
(2, 4) i (2, 5). Arcele care intr n vrful 2 sunt (1, 2) i (2, 2). Dac (u, v) este o muchie ntr-un
graf neorientat G = (V, E), spunem c (u, v) este incident vrfurilor u i v. n figura 5.2(b),
muchiile incidente vrfului 2 sunt (1, 2) i (2, 5).
Dac (u, v) este o muchie (arc) ntr-un graf G = (V, E), spunem c vrful v este adiacent
vrfului u. Atunci cnd graful este neorientat, relaia de adiacen este simetric. Cnd graful
este orientat, relaia de adiacen nu este neaprat simetric. Dac v este adiacent vrfului u
ntr-un graf orientat, uneori scriem u v. n prile (a) i (b) ale figurii 5.2, vrful 2 este
adiacent vrfului 1, deoarece muchia (arcul) (1, 2) aparine ambelor grafuri. Vrful 1 nu este
adiacent vrfului 2 n figura 5.2(a), deoarece muchia (2, 1) nu aparine grafului.
Gradul unui vrf al unui graf neorientat este numrul muchiilor incidente acestuia. De exem-
plu, vrful 2, din figura 5.2(b), are gradul 2. Un vrf al crui grad este 0, cum este, de exemplu,
vrful 4, din figura 5.2(b), se numete vrf izolat. ntr-un graf orientat, gradul exterior al
unui vrf este numrul arcelor ce pleac din el, iar gradul interior al unui vrf este numrul
arcelor ce intr n el. Gradul unui vrf al unui graf orientat este gradul su interior, plus gradul
su exterior. Vrful 2 din figura 5.2(a) are gradul interior 2, gradul exterior 3 i gradul 5.
Un drum de lungime k de la un vrf u la un vrf u0 ntr-un graf G = (V, E) este un ir
de vrfuri hv0 , v1 , v2 , ..., vk i astfel nct u = v0 , u0 = vk , i (vi1 , vi ) E pentru i = 1, 2, ..., k.
Lungimea unui drum este numrul de muchii (arce) din acel drum. Drumul conine vrfurile
v0 , v1 , v2 , ..., vk i muchiile (v0 , v1 ), (v1 , v2 ), ..., (vk1 , vk ). Dac exist un drum p de la u la u0 ,
p
spunem c u0 este accesibil din u prin p, relaie reprezentat uneori prin u ; u0 dac G este
orientat. Un drum este elementar dac toate vrfurile din el sunt distincte. n figura 5.2(a),
drumul h1, 2, 5, 4i este un drum elementar de lungime 3. Drumul h2, 5, 4, 5i nu este elementar.
Un subdrum al unui drum p = hv0 , v1 , ..., vk i este un subir continuu al vrfurilor sale. Cu
76 Capitolul 5 Mulimi etc.
alte cuvinte, pentru orice 0 i j k, subirul de vrfuri hvi , vi+1 , ..., vj i este un subdrum al
lui p.
ntr-un graf orientat, un drum hv0 , v1 , ..., vk i formeaz un ciclu dac v0 = vk i drumul
conine cel puin o muchie. Ciclul este elementar dac, pe lng cele de mai sus, v1 , v2 , ..., vk
sunt distincte. O autobucl este un ciclu de lungime 1. Dou drumuri hv0 , v1 , v2 , ..., vk1 , v0 i
i hv00 , v10 , v20 , ..., vk1
0
, v00 i formeaz acelai ciclu dac exist un numr ntreg j astfel nct vi0 =
v(i+j) mod k pentru i = 0, 1, ..., k 1. n figura 5.2(a), drumul h1, 2, 4, 1i formeaz acelai ciclu
ca drumurile h2, 4, 1, 2i i h4, 1, 2, 4i. Acest ciclu este elementar, dar ciclul h1, 2, 4, 5, 4, 1i nu este
elementar. Ciclul h2, 2i format de muchia (2, 2) este o autobucl. Un graf orientat fr autobucle
este elementar. ntr-un graf neorientat, un drum hv0 , v1 , ..., vk i formeaz un ciclu elementar
dac k > 3, v0 = vk i vrfurile v1 , v2 , ..., vk sunt distincte. De exemplu, n figura 5.2(b), drumul
h1, 2, 5, 1i este un ciclu. Un graf fr cicluri este aciclic.
Un graf neorientat este conex dac fiecare pereche de vrfuri este conectat printr-un drum.
Componentele conexe ale unui graf sunt clasele de echivalen ale vrfurilor sub relaia este
accesibil din. Graful din figura 5.2(b) are trei componente conexe: {1, 2, 5}, {3, 6}, i {4}. Fiecare
vrf din {1, 2, 5} este accesibil din fiecare vrf din {1, 2, 5}. Un graf neorientat este conex dac
are exact o component conex, sau, altfel spus, dac fiecare vrf este accesibil din fiecare vrf
diferit de el.
Un graf orientat este tare conex dac fiecare dou vrfuri sunt accesibile din cellalt. Com-
ponentele tare conexe ale unui graf sunt clasele de echivalen ale vrfurilor sub relaia
sunt reciproc accesibile. Un graf orientat este tare conex dac are doar o singur component
tare conex. Graful din figura 5.2(a) are trei componente tare conexe: {1, 2, 4, 5}, {3}, i {6}.
Toate perechile de vrfuri din {1, 2, 4, 5} sunt reciproc accesibile. Vrfurile {3, 6} nu formeaz o
component tare conex, deoarece vrful 6 nu este accesibil din vrful 3.
Dou grafuri G = (V, E) i G0 = (V 0 , E 0 ) sunt izomorfe dac exist o bijecie f : V V 0
astfel nct (u, v) E dac, i numai dac, (f (u), f (v)) E 0 . Cu alte cuvinte, putem reeticheta
vrfurile lui G pentru ca acestea s fie vrfuri din G0 , pstrnd muchiile corespunztoare din
G i G0 . Figura 5.3(a) prezint o pereche de grafuri izomorfe G i G0 cu mulimile de vrfuri
V = {1, 2, 3, 4, 5, 6} i V 0 = {u, v, w, x, y, z}. Funcia din V n V 0 , dat de f (1) = u, f (2) = v,
f (3) = w, f (4) = x, f (5) = y, f (6) = z, este funcia bijectiv cerut. Grafurile din figura 5.3(b)
nu sunt izomorfe. Dei ambele grafuri au 5 vrfuri i 7 muchii, graful din partea superioar are
un vrf cu gradul egal 4, n timp ce graful din partea inferioar a figurii nu posed un astfel de
vrf.
Spunem c un graf G0 = (V 0 , E 0 ) este un subgraf al grafului G = (V, E) dac V 0 V i
E E. Dat fiind o mulime V 0 V , subgraful lui G indus de V 0 este graful G0 = (V 0 , E 0 ),
0
unde
E 0 = {(u, v) E : u, v V 0 }.
Subgraful indus de mulimea de vrfuri {1, 2, 3, 6}, din figura 5.2(a), apare n figura 5.2(c) i are
mulimea de muchii {(1, 2), (2, 2), (6, 3)}.
Dat fiind un graf neorientat G = (V, E), versiunea orientat a lui G este graful orientat
G0 = (V, E 0 ), unde (u, v) E 0 dac, i numai dac, (u, v) E. Cu alte cuvinte, fiecare muchie
neorientat (u, v) din G este nlocuit n versiunea orientat prin dou arce orientate: (u, v)
i (v, u). Dat fiind un graf orientat G = (V, E), versiunea neorientat a lui G este graful
neorientat G0 = (V, E 0 ), unde (u, v) E 0 dac, i numai dac, u 6= v i (u, v) E. Deci versiunea
neorientat conine arcele lui G cu direciile eliminate i cu autobuclele eliminate. (Deoarece
5.4. Grafuri 77
Figura 5.3 (a) O pereche de grafuri izomorfe. Corespondena dintre vrfurile grafului de sus i cele
ale grafului de jos este realizat prin funcia dat de f (1) = u, f (2) = v, f (3) = w, f (4) = x, f (5) = y,
f (6) = z. (b) Dou grafuri care nu sunt izomorfe, deoarece graful de sus are un vrf de grad 4, iar graful
de jos nu.
(u, v) i (v, u) reprezint aceeai muchie ntr-un graf neorientat, versiunea neorientat a unui
graf orientat o conine o singur dat, chiar dac graful orientat conine att muchia (u, v) ct
i muchia (v, u).) ntr-un graf orientat G = (V, E), un vecin al unui vrf u este orice vrf care
este adiacent lui u n versiunea neorientat a lui G. Deci v este un vecin al lui u dac (u, v) E
sau (v, u) E. ntr-un graf neorientat, u i v sunt vecine dac sunt adiacente.
Mai multe tipuri de grafuri poart nume speciale. Un graf complet este un graf neorientat
n care oricare dou vrfuri sunt adiacente. Un graf bipartit este un graf neorientat G = (V, E)
n care mulimea V poate fi partiionat n dou mulimi V1 i V2 astfel nct (u, v) E implic
fie c u V1 i v V2 , fie c u V2 i v V1 . Cu alte cuvinte, toate muchiile merg de la
mulimea V1 la mulimea V2 sau invers. Un graf neorientat, aciclic este o pdure, iar un graf
neorientat, aciclic i conex este un arbore (liber) (vezi seciunea 5.5).
Exist dou variante de grafuri care pot fi ntlnite ocazional. Un multigraf seamn cu un
graf neorientat, ns poate avea att muchii multiple ntre vrfuri ct i autobucle. Un hipergraf
seamn, de asemenea, cu un graf neorientat, dar fiecare hipermuchie, n loc de a conecta
dou vrfuri, conecteaz o submulime arbitrar de vrfuri. Muli algoritmi scrii pentru grafuri
orientate i neorientate obinuite pot fi adaptai pentru a rula pe aceste structuri asemntoare
grafurilor.
Exerciii
5.4-1 Invitaii unei petreceri studeneti i strng minile cnd se salut unul pe cellalt, i
fiecare profesor i amintete de cte ori a salutat pe cineva. La sfritul petrecerii, decanul
facultii nsumeaz numrul strngerilor de mn fcute de fiecare profesor. Artai c rezultatul
este par demonstrnd lema strngerilor de mn: dac G = (V, E) este un graf neorientat,
78 Capitolul 5 Mulimi etc.
atunci
X
grad(v) = 2|E|.
vV
5.4-2 Artai c, dac un graf orientat sau neorientat conine un drum ntre dou vrfuri u i
v, atunci conine un drum elementar ntre u i v. Artai c dac un graf orientat conine un
ciclu, atunci conine i un ciclu elementar.
5.4-3 Artai c orice graf neorientat, conex G = (V, E) satisface relaia |E| |V | 1.
5.4-4 Verificai faptul c, ntr-un graf neorientat, relaia este accesibil din este o relaie de
echivalen pe vrfurile grafului. Care din cele trei proprieti ale unei relaii de echivalen sunt
n general adevrate pentru relaia este accesibil din pe vrfurile unui graf orientat?
5.4-5 Care este versiunea neorientat a grafului orientat din figura 5.2(a)? Care este versiunea
orientat a grafului neorientat din figura 5.2(b)?
5.4-6 ? Artai c un hipergraf poate fi reprezentat printr-un graf bipartit dac stabilim ca
incidena n hipergraf s corespund adiacenei n graful bipartit. (Indicaie: Presupunei c o
mulime de vrfuri din graful bipartit corespunde vrfurilor din hipergraf, iar cealalt mulime
de vrfuri a grafului bipartit corespunde hipermuchiilor.)
5.5. Arbori
La fel ca n cazul grafurilor, exist multe noiuni de arbori nrudite, dar uor diferite. Aceast
seciune prezint definiii i proprieti matematice pentru mai multe tipuri de arbori. Seciunile
11.4 i 23.1 descriu modurile de reprezentare a arborilor n memoria calculatorului.
Teorema 5.2 (Proprietile arborilor liberi) Fie G = (V, E) un graf neorientat. Urmtoa-
rele afirmaii sunt adevrate:
2. Oricare dou vrfuri din G sunt conectate printr-un drum elementar unic.
5.5. Arbori 79
Figura 5.4 (a) Un arbore liber. (b) O pdure. (c) Un graf ce conine un ciclu, motiv pentru care nu
este nici arbore, nici pdure.
Figura 5.5 Un pas n demonstraia teoremei 5.2. Dac (1) G este un arbore liber, atunci (2) oricare
dou vrfuri din G sunt conectate printr-un unic drum elementar. S presupunem, prin absurd, c vr-
furile u i v sunt conectate prin dou drumuri simple distincte p1 i p2 . Aceste drumuri se despart pentru
prima dat n vrful w, i se rentlnesc pentru prima oar n vrful z. Drumul p0 mpreun cu inversul
drumului p00 formeaz un ciclu, de unde rezult o contradicie.
3. G este conex, dar, dac eliminm o muchie oarecare din E, graful obinut nu mai este
conex.
6. G este aciclic, dar, dac adugm o muchie oarecare n E, graful obinut conine un ciclu.
Demonstraie. (1) (2): Deoarece un arbore este conex, oricare dou vrfuri din G sunt
conectate prin cel puin un drum elementar. Fie u i v dou vrfuri care sunt conectate prin
dou drumuri distincte p1 i p2 , dup cum este prezentat n figura 5.5. Fie w vrful unde drumurile
se despart pentru prima dat. Cu alte cuvinte, w este primul vrf, att din p1 ct i din p2 , al
crui succesor n p1 este x i al crui succesor din p2 este y, cu x 6= y. Fie z primul vrf unde
drumurile se rentlnesc, adic z este primul vrf de dup w din p1 care se afl de asemenea i
n p2 . Fie p0 subdrumul din p1 de la w la z i care trece prin x, i fie p00 drumul din p2 de la w
la z i care trece prin y. Drumurile p0 i p00 nu au nici un vrf comun cu excepia vrfurilor lor
terminale. Astfel, drumul obinut, alturnd lui p0 inversul lui p00 , este un ciclu. Aceasta este o
contradicie i deci, dac G este un arbore, nu poate exista dect cel mult un drum elementar
ntre dou vrfuri.
(2) (3): Dac oricare dou vrfuri din G sunt conectate printr-un drum elementar, atunci
G este conex. Fie (u, v) o muchie oarecare din E. Aceast muchie este un drum de la u la v, i,
deci, trebuie s fie drumul unic dintre u i v. Dac eliminm muchia (u, v) din G, nu mai exist
nici un drum ntre u i v i, astfel, eliminarea ei face ca G s nu mai fie conex.
80 Capitolul 5 Mulimi etc.
(3) (4): Din ipotez, graful G este conex, iar din exerciiul 5.4-3 avem |E| |V | 1. Vom
demonstra relaia |E| |V | 1 prin inducie. Un graf conex cu n = 1 sau n = 2 vrfuri are
n 1 muchii. S presupunem c G are n 3 vrfuri i c toate grafurile ce satisfac relaia (3)
i au mai puin de n vrfuri, satisfac, de asemenea, i relaia |E| |V | 1. Eliminnd o muchie
arbitrar din G, separm graful n k 2 componente conexe. (De fapt k este exact 2). Fiecare
component satisface (3), deoarece, altfel, G nu ar satisface relaia (3). Astfel, prin inducie,
dac adunm numrul muchiilor din fiecare component, obinem cel mult |V | k |V | 2.
Adunnd muchia eliminat, obinem |E| |V | 1.
(4) (5): S presupunem c G este conex i c |E| = |V | 1. Trebuie s artm c G este
aciclic. S presupunem c G posed un ciclu ce conine k vrfuri v1 , v2 , ..., vk . Fie Gk = (Vk , Ek )
subgraful lui G format din ciclul respectiv. Observai c |Vk | = |Ek | = k. Dac k < |V |, atunci,
trebuie s existe un vrf vk+1 V Vk care s fie adiacent unui vrf oarecare vi Vk , din moment
ce G este conex. Definim Gk+1 = (Vk+1 , Ek+1 ) ca fiind subgraful lui G avnd Vk+1 = Vk {vk+1 }
i Ek+1 = Ek {(vi , vk+1 )}. Observai c |Vk+1 | = |Ek+1 | = k+1. Dac k+1 < n putem continua,
definind Gk+2 n aceeai manier, i aa mai departe, pn cnd obinem Gn = (Vn , En ), unde
n = |V |, Vn = V , i |En | = |Vn | = |V |. Deoarece Gn este un subgraf al lui G, avem En E i
de aici |E| |V |, ceea ce contrazice presupunerea c |E| = |V | 1. Astfel, G este aciclic.
(5) (6): S presupunem c G este aciclic i c |E| = |V | 1. Fie k numrul componentelor
conexe ale lui G. Fiecare component conex este, prin definiie, un arbore liber i, deoarece (1)
implic (5), suma tuturor muchiilor din toate componentele conexe ale lui G este |V | k. Prin
urmare, trebuie s avem k = 1 i G este de fapt un arbore. Deoarece (1) implic (2), oricare dou
vrfuri din G sunt conectate printr-un unic drum elementar. Astfel, adugarea oricrei muchii
la G formeaz un ciclu.
(6) (1): S presupunem c G este aciclic, dar c, dac adugm o muchie arbitrar la E,
crem un ciclu. Trebuie s artm c G este conex. Fie u i v dou vrfuri arbitrare din G. Dac
u i v nu sunt deja adiacente, adugnd muchia (u, v), crem un ciclu n care toate muchiile, cu
excepia muchiei (u, v), aparin lui G. Astfel, exist un drum de la u la v i, deoarece u i v au
fost alese arbitrar, G este conex.
rezerva folosirea termenului de nod pentru a desemna un vrf al unui arbore cu rdcin.
5.5. Arbori 81
Figura 5.6 Arbori cu rdcin i arbori ordonai. (a) Un arbore cu rdcin avnd nlimea egal
cu 4. Arborele este desenat ntr-un mod standard: rdcina (nodul 7) se afl n partea de sus, copiii ei
(nodurile cu adncimea 1) sub ea, copiii lor (nodurile cu adncimea 2) sub acetia i aa mai departe.
Dac arborele este ordonat, ordinea relativ de la stnga la dreapta a copiilor unui nod este important,
altfel ea nu conteaz. (b) Un alt arbore cu rdcin. Ca arbore cu rdcin, este identic cu cel din (a),
dar privit ca un arbore ordonat el este diferit, din moment ce copiii nodului 3 apar ntr-o ordine diferit.
T fr nici un printe. Dac dou noduri au acelai printe, atunci ele sunt frai. Un nod fr
nici un copil se numete nod extern sau frunz. Un nod care nu este frunz se numete nod
intern.
Numrul copiilor unui nod x dintr-un arbore cu rdcina T se numete gradul lui x.3 Lun-
gimea drumului de la rdcina r la un nod x constituie adncimea lui x n T . Cea mai mare
adncime a unui nod constituie nlimea lui T .
Un arbore ordonat este un arbore cu rdcin n care copiii fiecrui nod sunt ordonai. Cu
alte cuvinte, dac un nod are k copii, atunci exist un prim copil, un al doilea copil,... i un
al k-lea copil. Cei doi arbori din figura 5.6 sunt diferii atunci cnd sunt privii ca fiind arbori
ordonai, dar sunt identici atunci cnd sunt considerai a fi doar arbori cu rdcin.
liber. Gradul unui vrf dintr-un arbore liber este, ca n orice graf orientat, numrul vrfurilor adiacente lui. Cu
toate acestea, ntr-un arbore cu rdcin, gradul este dat de numrul de copii printele unui nod nu conteaz
din perspectiva gradului.
82 Capitolul 5 Mulimi etc.
Figura 5.7 Arbori binari. (a) Un arbore binar desenat ntr-un mod standard. Copilul stng al unui
nod este desenat dedesubtul nodului i la stnga. Copilul drept este desenat dedesubt i la dreapta.
(b) Un arbore binar diferit de cel din (a). n (a), copilul stng al nodului 7 este 5, iar copilul drept
este absent. n (b), copilul stng al nodului 7 este absent, iar copilul drept este 5. Ca arbori ordonai,
aceti doi arbori sunt identici, dar, privii ca arbori binari, ei sunt diferii. (c) Arborele binar din (a)
reprezentat prin nodurile interne ale unui arbore binar complet: un arbore ordonat n care fiecare nod
intern are gradul 2. Frunzele din arbore sunt reprezentate prin ptrate.
stng al rdcinii ntregului arbore. n mod asemntor, rdcina unui subarbore drept nevid
este copilul drept al rdcinii ntregului arbore. Dac un subarbore este arborele vid nil, copilul
este absent sau lipsete. Figura 5.7(a) prezint un arbore binar.
Un arbore binar nu este un simplu arbore ordonat n care fiecare nod are un grad mai mic sau
egal cu 2. De exemplu, ntr-un arbore binar, dac un nod are doar un copil, poziia copilului
dac este copilul stng sau copilul drept conteaz. ntr-un arbore ordonat, un unic copil nu
poate fi clasificat ca fiind un copil drept sau un copil stng. Figura 5.7(b) prezint un arbore binar
care difer de arborele din figura 5.7(a) din cauza poziiei unui singur nod. Cu toate acestea,
dac sunt privii ca arbori ordonai, cei doi arbori sunt identici.
Informaia poziional dintr-un arbore binar poate fi reprezentat prin nodurile interne ale
unui arbore ordonat, dup cum se arat n figura 5.7(c). Ideea este s nlocuim fiecare copil
absent din arborele binar cu un nod ce nu are nici un copil. Aceste noduri de tip frunz sunt
reprezentate, n figur, prin ptrate. Arborele rezultat este un arbore binar complet: fiecare
nod este fie o frunz, fie are gradul exact 2. Nu exist noduri cu gradul egal cu 1. Prin urmare,
ordinea copiilor unui nod pstreaz informaia poziional.
Informaia poziional care deosebete arborii binari de arborii ordonai poate fi extins i la
arbori cu mai mult de doi copii corespunztori unui nod. ntr-un arbore poziional, copiii unui
nod sunt etichetai cu numere ntregi pozitive distincte. Al i-lea copil al unui nod este absent
dac nici un copil nu este etichetat cu numrul i. Un arbore k-ar este un arbore poziional n
care, pentru fiecare nod, toi copiii cu etichete mai mari dect k lipsesc. Astfel, un arbore binar
este un arbore k-ar cu k = 2.
Un arbore k-ar complet este un arbore k-ar n care toate frunzele au aceeai adncime i
toate nodurile interne au gradul k. Figura 5.8 prezint un arbore binar complet avnd nlimea
egal cu 3. Cte frunze are un arbore k-ar complet de nlime h? Rdcina are k copii de
adncime 1, fiecare dintre acetia avnd k copii de adncime 2 etc. Astfel, numrul frunzelor la
adncimea h este k h . Prin urmare, nlimea unui arbore k-ar complet care are n frunze este
5.5. Arbori 83
logk n. Numrul nodurilor interne ale unui arbore k-ar complet de nlime h este
h1
X kh 1
1 + k + k 2 + ... + k h1 = ki =
i=0
k1
din ecuaia (3.3). Astfel, un arbore binar complet are 2h 1 noduri interne.
Exerciii
5.5-1 Desenai toi arborii liberi formai din 3 vrfuri A, B, C. Desenai toi arborii cu rdcin
avnd nodurile A, B, C, cu A drept rdcin. Desenai toi arborii ordonai avnd nodurile A,
B, C, cu A drept rdcin. Desenai toi arborii binari avnd nodurile A, B, C, cu A drept
rdcin.
5.5-2 Artai c, pentru n 7, exist un arbore liber cu n noduri astfel nct alegerea fiecruia
din cele n noduri drept rdcin produce un arbore cu rdcin diferit.
5.5-3 Fie G = (V, E) un graf aciclic orientat n care exist un vrf v0 V astfel nct exist un
unic drum de la v0 la fiecare vrf v V . Demonstrai c versiunea neorientat a lui G formeaz
un arbore.
5.5-4 Artai prin inducie c numrul nodurilor cu gradul 2 din orice arbore binar este cu 1
mai mic dect numrul frunzelor.
5.5-5 Artai, prin inducie, c un arbore binar cu n noduri are nlimea cel puin egal cu
blg nc.
5.5-6 ? Lungimea drumului intern al unui arbore binar complet este suma adncimilor tutu-
ror nodurilor interne. n mod asemntor, lungimea drumului exterior este suma adncimilor
tuturor frunzelor. Se d un arbore binar complet cu n noduri interne, avnd lungimea drumului
interior i i lungimea drumului exterior e. Demonstrai c e = i + 2n.
5.5-7 ? AsociemPun cost w(x) = 2d fiecrei frunze x de adncime d dintr-un arbore binar T .
Demonstrai c x w(x) 1, unde x este orice frunz din T . (Aceast relaie este cunoscut
sub numele de inegalitatea Kraft.)
5.5-8 ? Artai c orice arbore binar cu L frunze conine un subarbore avnd ntre L/3 i 2L/3
frunze (inclusiv).
84 Capitolul 5 Mulimi etc.
Probleme
5-1 Colorarea grafurilor
O k-colorare a unui graf neorientat G = (V, E) este o funcie c : V {0, 1, ..., k 1} astfel nct
c(u) 6= c(v) pentru orice muchie (u, v) E. Cu alte cuvinte, numerele 0, 1, ..., k 1 reprezint k
culori, iar nodurile adiacente trebuie s aib culori diferite.
a. Demonstrai c orice arbore este 2-colorabil.
b. Artai c urmtoarele afirmaii sunt echivalente:
(a) G este bipartit.
(b) G este 2-colorabil.
(c) G nu are cicluri de lungime impar.
c. Fie d gradul maxim al oricrui vrf dintr-un graf G. Artai c G poate fi colorat cu d + 1
culori.
p
d. Artai c dac G are O(|V |) muchii, atunci G poate fi colorat cu O( |V |) culori.
c. Demonstrai c, prin eliminarea a cel mult O(lg n) muchii, putem partiiona vrfurile
oricrui arbore avnd n vrfuri n dou mulimi A i B astfel nct |A| = bn/2c i
|B| = dn/2e.
Note bibliografice
G. Boole a dus o munc de pionierat n dezvoltarea logicii simbolice i a introdus multe dintre
notaiile de baz pentru mulimi ntr-o carte publicat n 1854. Teoria modern a mulimilor
a fost elaborat de ctre G. Cantor n timpul perioadei 18741895. Cantor s-a concentrat, n
special, asupra mulimilor cu cardinalitate infinit. Termenul de funcie este atribuit lui G. W.
Leibnitz, care l-a folosit pentru a se referi la mai multe feluri de formule matematice. Definiia sa
limitat a fost generalizat de multe ori. Teoria grafurilor dateaz din anul 1736, cnd L. Euler
a demonstrat c este imposibil ca o persoan s traverseze fiecare din cele 7 poduri din oraul
Knigsberg exact o singur dat i s se ntoarc n locul de unde a plecat.
Un compendiu folositor, coninnd mai multe definiii i rezultate din teoria grafurilor, se
afl n cartea scris de Harary [94].
6 Numrare i probabilitate
6.1. Numrare
Teoria numrrii ncearc s rspund la ntrebarea ci, fr a numra efectiv. De exemplu,
am putea s ne ntrebm cte numere distincte de n bii exist, sau n cte moduri pot fi
ordonate n elemente distincte. n aceast seciune, vom trece n revist elementele teoriei nu-
mrrii. Deoarece anumite pri ale materialului necesit nelegerea noiunilor i rezultatelor
de baz referitoare la mulimi, cititorul este sftuit s nceap prin a revedea materialul din
seciunea 5.1.
iruri
Un ir peste o mulime finit S este o secven de elemente din S. De exemplu, exist 8
iruri binare de lungime 3:
Vom numi, uneori, k-ir un ir de lungime k. Un subir s0 al unui ir s este o secven ordo-
nat de elemente consecutive ale lui s. Un k-subir al unui ir este un subir de lungime k. De
exemplu, 010 este un 3 subir al lui 01101001 (3-subirul care ncepe din poziia 4), dar 111 nu
este un subir al lui 01101001.
Un k-ir peste o mulime S poate fi privit ca un element al produsului cartezian S k de k-tuple;
astfel exist |S|k iruri de lungime k. De exemplu, numrul de k-iruri binare este 2k . Intuitiv,
pentru a construi k-iruri peste o mulime de n elemente (n-mulime), avem n moduri de alegere
pentru primul element; pentru fiecare dintre aceste alegeri, avem n moduri de a alege al doilea
element; i aa mai departe de k ori. Aceast construcie ne conduce la concluzia c numrul de
k-iruri este produsul a k factori identici n n n = nk .
Permutri
O permutarea unei mulimi finite S este o secven ordonat a tuturor elementelor lui S, cu
fiecare element aprnd exact o singur dat. De exemplu, dac S = {a, b, c}, exist 6 permutri
ale lui S:
Exist n! permutri ale unei mulimi avnd n elemente, deoarece primul element al secvenei
poate fi ales n n moduri, al doilea n n 1 moduri, al treilea n n 2 moduri .a.m.d.
O k-permutare 1 a lui S este o secven de k elemente ale lui S n care nici un element
nu apare mai mult de o singur dat. (Astfel o permutare ordinar este o n-permutare a unei
n-mulimi.) Cele dousprezece 2-permutri ale mulimii {a, b, c, d} sunt
ab, ac, ad, ba, bc, bd, ca, cb, cd, da, db, dc.
Combinri
O k-combinare a unei n-mulimi S este, pur i simplu, o k-submulime a lui S. Exist ase
2-combinri ale unei 4-mulimi {a, b, c, d}:
(Aici am utilizat prescurtarea ab pentru a nota mulimea {a, b} .a.m.d.) Putem construi o
k-combinare a unei n-mulimi alegnd k elemente diferite (distincte) din n-mulime.
Numrul de k-combinri ale unei n-mulimi poate fi exprimat cu ajutorul numrului de k-
permutri ale unei n-mulimi. Pentru orice k-combinare, exist exact k! permutri ale elementelor
sale, fiecare fiind o k-permutare distinct a n-mulimii. Astfel, numrul de k-combinri ale unei
n-mulimi este numrul de k-permutri mprit cu k!; din ecuaia (6.1), aceast valoare este
n!
. (6.2)
k!(n k)!
Pentru k = 0, aceast formul ne spune c numrul de moduri n care putem alege 0 elemente
dintr-o n-mulime este 1 (nu 0), deoarece 0! = 1.
Coeficieni binomiali
Vom utiliza notaia nk (se citete combinri de n luate cte k) pentru a desemna numrul
de k-combinri ale unei n-mulimi. Din ecuaia (6.2) avem
n n!
= . (6.3)
k k!(n k)!
Aceast formul este simetric n k i n k:
n n
= . (6.4)
k nk
Aceste numere sunt cunoscute i sub numele de coeficieni binomiali deoarece apar n dez-
voltarea binomial (formula binomului lui Newton):
n
X
n n k nk
(x + y) = x y . (6.5)
k
k=0
Margini binomiale
Uneori, avem nevoie s delimitm mrimea unui coeficient binomial. Pentru 1 k n, avem
marginea inferioar
n n(n 1) (n k + 1) n n 1 nk+1 n k
= = . (6.7)
k k(k 1) 1 k k1 1 k
6.1. Numrare 89
Utiliznd inegalitatea k! (k/e)k , dedus din formula lui Stirling (2.12), obinem marginea
superioar
n n(n 1) (n k + 1) nk
= (6.8)
k k(k 1) 1 k!
en k
. (6.9)
k
Pentru orice 0 k n, putem utiliza inducia (vezi exerciiul 6.1-12) pentru a demonstra
delimitarea
n nn
k , (6.10)
k k (n k)nk
unde
Exerciii
6.1-1 Cte k-subiruri are un n-ir? (Considerm k-subirurile identice ce apar pe poziii diferite
ca fiind diferite.) Cte subiruri are n total un n-ir?
6.1-2 O funcie boolean avnd n intrri i m ieiri este o funcie de la {adevrat, fals}n
la {adevrat, fals}m . Cte funcii booleene avnd n intrri i o ieire exist? Cte funcii
booleene avnd n intrri i m ieiri exist?
6.1-3 n cte moduri se pot aeza n profesori n jurul unei mese circulare la o conferin?
Considerm c dou aezri sunt identice dac una poate fi rotit pentru a o obine pe cealalt.
6.1-4 n cte moduri pot fi alese trei numere distincte din mulimea {1, 2, . . . , 100} astfel ca
suma lor s fie par?
pentru 0 k < n.
6.1-7 Pentru a alege k obiecte din n, putei marca unul dintre obiecte i s vedei dac a fost
ales obiectul marcat. Utilizai aceast abordare pentru a demonstra c
n n1 n1
= + .
k k k1
6.1-8 Utiliznd rezultatul din exerciiul 6.1-7, construii o tabel a coeficienilor binomiali, nk
0 1 1
pentru n = 0, 1, . . . , 6 i 0 k n, cu 0 n vrf, 0 i 1 pe linia urmtoare i aa mai
departe. O astfel de tabel de coeficieni binomiali se numete triunghiul lui Pascal .
6.1-9 Demonstrai c
n
X
n+1
i= .
i=1
2
n
6.1-10 Artai c, pentru orice n 0 i 0 k n, maximul valorii lui k se realizeaz cnd
k = bn/2c sau k = dn/2e.
Dai att o demonstraie algebric ct i una bazat pe o metod de alegere a celor j +k elemente
din n. Dai un exemplu n care egalitatea s nu aib loc.
6.1-12 ? Utilizai inducia dup k n/2 pentru a demonstra inegalitatea (6.10) i utilizai
ecuaia (6.4) pentru a o extinde pentru orice k n.
6.1-14 ? Derivnd funcia entropie H(), artai c ea i atinge valoarea maxim n = 1/2.
Ct este H(1/2)?
6.2. Probabilitate 91
6.2. Probabilitate
Probabilitatea este un instrument esenial pentru proiectarea i analiza algoritmilor pur pro-
babiliti i a algoritmilor care se bazeaz pe generarea de numere aleatoare. n aceast seciune,
se trec n revist bazele teoriei probabilitilor.
Vom defini probabilitatea n termeni de spaiu de selecie S, care este o mulime ale crei
elemente se numesc evenimente elementare. Fiecare eveniment elementar poate fi privit ca
un rezultat posibil al unui experiment. Pentru experimentul aruncrii a dou monede distincte
i distinctibile, putem privi spaiul de selecie ca fiind mulimea tuturor 2-irurilor peste {s, b}:
Axiomele probabilitii
O distribuie de probabilitate (probabilitate) Pr{} pe spaiul de selecie S este o aplicaie
de la mulimea evenimentelor lui S la mulimea numerelor reale care satisface urmtoarele
axiome ale probabilitii :
2. Pr{S} = 1.
evenimente. Aceast situaie apare de obicei cnd spaiul de selecie este infinit nenumrabil. Cerina principal
este ca mulimea evenimentelor din spaiul de selecie s fie nchis la operaiile de complementare i la intersecia
unui numr finit sau numrabil de evenimente. Cele mai multe dintre distribuiile pe care le vom ntlni sunt
definite peste spaii de selecie finite sau numrabile i vom considera toate submulimile spaiului de selecie ca
fiind evenimente. O excepie notabil va fi distribuia de probabilitate uniform continu, pe care o vom prezenta
pe scurt.
92 Capitolul 6 Numrare i probabilitate
Anumite rezultate se pot deduce imediat din aceste axiome i din rezultatele de baz ale
teoriei mulimilor (vezi seciunea 5.1). Evenimentul nul are probabilitatea Pr{} = 0. Dac
A B, atunci Pr{A} Pr{B}. Utiliznd A pentru a nota evenimentul S A (complementul
sau evenimentul contrar lui A), avem Pr{A} = 1 Pr{A}. Pentru oricare dou evenimente
A i B,
n exemplul nostru cu aruncarea monedei presupunem c fiecare eveniment elementar are pro-
babilitatea 1/4. Probabilitatea de a obine cel puin o stem este
Altfel, deoarece probabilitatea de a obine mai puin de o stem este Pr{bb} = 1/4, probabili-
tatea de a obine cel puin o stem este 1 1/4 = 3/4.
deoarece evenimentele elementare, mai concret cele din A, sunt mutual exclusive. Dac S este
finit i fiecare eveniment elementar s S are probabilitatea
Pr{s} = 1/|S|,
relaie care este cunoscut sub numele de teorema lui Bayes. Numrtorul Pr{B} este o
constant de normalizare pe care o putem rescrie dup cum urmeaz. Deoarece B = (B A)
(B A) i B A i B A sunt mutual exclusive,
= Pr{A} Pr{B|A} + Pr{A}
Pr{B} = Pr{B A} + Pr{B A} Pr{B|A}.
(1/2) 1
Pr{A|B} = = 4/5.
(1/2) 1 + (1/2) (1/4)
Exerciii
6.2-1 Demonstrai inegalitatea lui Boole: pentru orice secven finit sau infinit numrabil
de evenimente A1 , A2 , . . .
Pr{A1 A2 . . .} Pr{A1 } + Pr{A2 } + . (6.22)
6.2-2 Profesorul Rosencrantz arunc o moned perfect. Profesorul Guildenstern arunc dou
monede perfecte. Care este probabilitatea ca profesorul Rosencrantz s obin mai multe steme
dect profesorul Guildenstern?
6.2-3 Un pachet de 10 cri, fiecare coninnd un numr distinct de la 1 la 10, este amestecat
bine. Se extrag trei cri din pachet, cte una la un moment dat. Care este probabilitatea ca cele
trei cri selectate s fie sortate (cresctor)?
6.2-4 ? Se d o moned fals, care, atunci cnd este aruncat, produce stema cu o probabilitate
p (necunoscut), unde 0 < p < 1. Artai cum poate fi simulat o aruncare de moned perfec-
t examinnd aruncri multiple. (Indicaie: aruncai moneda de dou ori i apoi fie returnai
rezultatul, fie repetai experimentul.) Demonstrai c rspunsul este corect.
6.2-5 ? Descriei o procedur are accept, la intrare, doi ntregi a i b, astfel nct 0 < a < b i,
utiliznd aruncri de monede perfecte producei, la ieire, stema cu probabilitatea a/b i banul
cu probabilitatea (ba)/b. Dai o margine a numrului mediu de aruncri de monede, care poate
fi un polinom n lg b.
6.2-6 Demonstrai c
Pr{A|B} + Pr{A|B} = 1.
96 Capitolul 6 Numrare i probabilitate
6.2-8 ? Artai cum se poate construi o mulime de n evenimente care s fie dou cte dou
independente, dar orice submulime de k > 2 dintre ele s nu fie mulime de evenimente mutual
independente.
6.2-10 ? Suntei concurent ntr-un joc-spectacol n care un premiu este ascuns n spatele uneia
dintre trei cortine. Vei ctiga premiul dac alegei cortina corect. Dup ce ai ales cortina,
dar nainte ca ea s fie ridicat, prezentatorul ridic una dintre celelalte cortine, artnd o scen
goal i v ntreab dac dorii s v schimbai opiunea curent pentru cortina rmas. Care
va fi ansa dumneavoastr dac v schimbai opiunea?
6.2-11 ? Un director al unei nchisori a ales aleator un prizonier din trei pentru a fi eliberat.
Ceilali doi vor fi executai. Gardianul tie care va fi liber, dar i este interzis s dea oricrui
prizonier informaii referitoare la starea acestuia. S numim cei trei prizonieri X, Y i Z.
Prizonierul X ntreab gardianul, n particular, care dintre Y i Z vor fi executai, argumentnd
c, dac cel puin unul dintre cei doi trebuie s moar, gardianul nu-i d nici o informaie despre
starea sa. Gardianul i spune lui X c Y va fi executat. Prizonierul X se simte mai fericit acum,
deoarece sau el sau Z va fi liber, ceea ce nseamn c probabilitatea ca el s fie liber este acum
1/2. Are dreptate, sau ansa sa este tot 1/3? Explicai.
Funcia
f (x) = Pr{X = x}
6.3. Variabile aleatoare discrete 97
este densitatea
P de probabilitate 5 a variabilei aleatoare X. Din axiomele probabilitii, Pr{X =
x} 0 i x Pr{X = x} = 1.
De exemplu, s considerm experimentul aruncrii unei perechi de zaruri obinuite, cu 6 fee.
Exist 36 de evenimente elementare posibile n spaiul de selecie. Presupunem c distribuia de
probabilitate este uniform, astfel c fiecare eveniment elementar s S are aceeai probabilitate:
Pr{s} = 1/36. Definim variabila aleatoare X ca fiind maximul celor dou valori de pe feele
zarurilor. Avem Pr{X = 3} = 5/36, deoarece X atribuie valoarea 3 la 5 din cele 36 de evenimente
elementare posibile i anume (1,3), (2,3), (3,3), (3,2) i (3,1).
Se obinuiete ca mai multe variabile aleatoare s fie definite pe acelai spaiu de selecie.
Dac X i Y sunt variabile aleatoare, funcia
f (x, y) = Pr{X = x i Y = y}
este funcia densitate de probabilitate asociat lui X i Y . Pentru o valoare fixat y,
X
Pr{Y = y} = Pr{X = x i Y = y}
x
care este bine definit dac suma este finit sau absolut convergent. Uneori media se noteaz
cu X , sau cnd variabila aleatoare este subneleas din context cu .
S considerm un joc n care se arunc dou monede perfecte. Ctigai 3$ pentru fiecare
stem i pierdei 2$ pentru fiecare ban. Valoarea medie a variabilei aleatoare X ce reprezint
ctigul dumneavoastr este
E[X] = 6 Pr{2s} + 1 Pr{1s,1b} 4 Pr{2b} = 6(1/4) + 1(1/2) 4(1/4) = 1.
5 termenul corect din punctul de vedere al teoriei probabilitailor este funcie de mas sau funcie de
frecven n.t.
98 Capitolul 6 Numrare i probabilitate
ori de cte ori E[X] i E[Y ] sunt definite. Aceast proprietate se extinde la sume finite i absolut
convergente de medii.
Dac X este o variabil aleatoare, orice funcie g(x) definete o nou variabil aleatoare g(X).
Dac valoarea medie a lui g(X) este definit, atunci
X
E[g(X)] = g(x) Pr{X = x}.
x
n consecin, mediile sunt liniare: pentru oricare dou variabile aleatoare X i Y i orice
constant a,
Cnd dou variabile aleatoare X i Y sunt independente i media fiecreia este definit, avem
XX XX
E[XY ] = xy Pr{X = x i Y = y} = xy Pr{X = x} Pr{Y = y} =
x y x y
! !
X X
= x Pr{X = x} y Pr{Y = y} = E[X]E[Y ].
x y
deoarece fiecare termen Pr{X i} este adunat de i ori i sczut de i1 ori (exceptnd Pr{X 0}
care este adunat de 0 ori i nu este sczut deloc).
Justificarea pentru egalitile E[E 2 [X]] = E 2 [X] i E[XE[X]] = E 2 [X] este aceea c E[X] nu este
o variabil aleatoare, ci pur i simplu un numr real, ceea ce nseamn c se aplic ecuaia (6.25)
(cu a = E[X]). Ecuaia (6.29) poate fi rescris pentru a obine o expresie a mediei ptratului
unei variabile aleatoare:
Var[aX] = a2 Var[X].
n general, dac n variabile aleatoare X1 , X2 , . . . , Xn sunt dou cte dou independente, atunci
" n # n
X X
V ar Xi = Var[Xi ]. (6.31)
i=1 i=1
Exerciii
6.3-1 Se arunc dou zaruri obinuite cu 6 fee. Care este media sumei celor dou valori artate
de zaruri? Care este media maximului celor dou valori artate?
6.3-2 Un tablou A[1..n] conine n numere distincte ordonate aleator, fiecare permutare a celor
n numere avnd aceeai probabilitate de apariie. Care este media indicelui elementului maxim
al tabloului? Care este media indicelui elementului minim al tabloului?
6.3-3 La un joc de carnaval se pun trei zaruri ntr-o ceac. Un juctor poate paria 1$ pe orice
numr de la 1 la 6. Ceaca este scuturat, zarurile sunt aruncate, iar plata se face n modul
urmtor. Dac numrul juctorului nu apare pe nici unul din zaruri, el i pierde dolarul. Altfel,
dac numrul su apare pe exact k din cele trei zaruri, k = 1, 2, 3, el i pstreaz dolarul i mai
ctig k dolari. Care este ctigul mediu cnd jocul se joac o singur dat?
6.3-4 ? Fie X i Y variabile aleatoare independente. Artai c f (X) i g(X) sunt independente
pentru orice alegere a funciilor f i g.
6.3-5 ? Fie X o variabil aleatoare nenegativ i presupunem c E[X] este bine definit. De-
monstrai inegalitatea lui Markov :
6.3-6 ? Fie S un spaiu de selecie i X i X 0 variabile aleatoare astfel nct X(s) X 0 (s)
pentru orice s S. Demonstrai c pentru orice constant real t,
Pr{X t} Pr{X 0 t}.
6.3-7 Ce este mai mare: media ptratului unei variabile aleatoare sau ptratul mediei?
6.3-8 Artai c, pentru orice variabil aleatoare X ce ia numai valorile 0 i 1, avem Var[X] =
E[X]E[1 X].
Distribuia geometric
Presupunem c avem o secven de probe bernoulliene, fiecare cu probabilitatea de succes
p i probabilitatea de eec q = 1 p. Cte ncercri apar nainte de a obine un succes? Fie
variabila aleatoare X numrul de ncercri necesare pentru a obine un succes. Atunci X ia
valori n domeniul {1, 2, . . .} i pentru k 1
Pr{X = k} = q k1 p, (6.33)
deoarece avem k 1 eecuri naintea unui succes. O distribuie de probabilitate ce satisface
ecuaia (6.33) se numete distribuie geometric. Figura 6.1 ilustreaz o astfel de distribuie.
Astfel, n medie, este nevoie de 1/p ncercri pentru a obine un succes, rezultat intuitiv.
Dispersia, care se poate calcula n acelai mod, este
Var[X] = q/p2 . (6.35)
De exemplu, s presupunem c aruncm, repetat, dou zaruri pn cnd obinem fie suma apte,
fie suma unsprezece. Din cele 36 de rezultate posibile, 6 ne dau suma apte i 2 suma unsprezece.
Astfel probabilitatea de succes este p = 8/36 = 2/9 i trebuie s aruncm zarurile, n medie, de
1/p = 9/2 = 4.5 ori pentru a obine suma apte sau unsprezece.
6.4. Distribuia geometric i distribuia binomial 101
Distribuia binomial
Cte succese apar n n probe bernouliene, unde un succes apare cu probabilitatea p i un
eec cu probabilitatea q = 1 p? Definim variabila aleatoare X ca fiind numrul de succese n n
probe. Atunci X ia valori n domeniul {0, 1, . . . , n} i pentru k = 0, . . . , n,
n k nk
Pr{X = k} = p q , (6.36)
k
deoarece sunt nk moduri de a alege care k probe din totalul celor n sunt succese i probabilitatea
de apariie a fiecreia dintre ele este pk q nk . O distribuie de probabilitate ce satisface ecuaia
(6.36) se numete distribuie binomial. Pentru comoditate, definim familia distribuiilor bi-
nomiale utiliznd notaia
n k
b(k; n, p) = p (1 p)nk . (6.37)
k
Figura 6.2 ilustreaz o distribuie binomial. Numele de binomial vine de la faptul c (6.37)
este al k-lea termen al dezvoltrii lui (p + q)n . n consecin, deoarece p + q = 1,
n
X
b(k; n, p) = 1, (6.38)
k=0
Figura 6.2 Distribuia binomial b(k; 15, 1/3) ce rezult din n = 15 probe bernoulliene, fiecare cu
probabilitatea de succes p = 1/3. Media distribuiei este np = 5.
Putem calcula media unei variabile aleatoare avnd o distribuie binomial din ecuaiile (6.14)
i (6.38). Fie X o variabil aleatoare ce urmeaz distribuia binomial b(k; n, p) i fie q = 1 p.
Din definiia mediei avem
Xn X n X n
n k nk n 1 k1 nk
E[X] = kb(k; n, p) = k p q = np p q =
k k1
k=0 k=1 k=1
X n 1
n1 n1
X
= np pk q (n1)k = np b(k; n 1, p) = np. (6.39)
k
k=0 k=0
Utiliznd liniaritatea mediei, putem obine acelai rezultat cu substanial mai puin algebr. Fie
Xi o variabil aleatoare ce descrie numrul de succese la a i-a prob. Atunci, E[Xi ] = p1+q0 = p
i, din liniaritatea mediei (6.26), numrul mediu de succese din n ncercri este
" n # n n
X X X
E[X] = E Xi = E[Xi ] = p = np.
i=1 i=1 i=1
Aceeai abordare poate fi folosit la calculul dispersiei. Utiliznd ecuaia (6.29), avem Var[Xi ] =
E[Xi2 ] E 2 [Xi ]. Deoarece Xi ia numai valorile 0 i 1, avem E[Xi2 ] = E[Xi ] = p i deci
Pentru a calcula dispersia lui X, vom exploata avantajul independenei celor n ncercri; astfel
din ecuaia (6.31)
" n # n n
X X X
Var[X] = Var Xi = Var[Xi ] = pq = npq. (6.41)
i=1 i=1 i=1
6.4. Distribuia geometric i distribuia binomial 103
Exerciii
6.4-1 Verificai a doua axiom a probabilitii pentru distribuia geometric.
6.4-2 De cte ori trebuie aruncate, n medie, 6 monede perfecte nainte de a obine 3 steme i
3 bani?
6.4-3 Artai c b(k; n, p) = b(n k; n, q), unde q = 1 p.
6.4-4 Artai c valoarea maxim a distribuiei binomiale b(k; n, p) este aproximativ 1/ 2npq,
unde q = 1 p.
6.4-5 ? Artai c probabilitatea de a nu avea nici un succes din n probe bernoulliene, fiecare
cu probabilitatea p = 1/n, este aproximativ 1/e. Artai c probabilitatea de a avea exact un
succes este, de asemenea, aproximativ 1/e.
6.4-6 ? Profesorul Rosencrantz arunc o moned perfect de n ori i la fel face i profesorul
Guildenstern.
2n n Artai c probabilitatea ca ei s obin acelai numr de steme este egal cu
n /4 . (Indicaie: pentru profesorul Rosencrantz considerm stema succes; pentru profesorul
Guildenstern considerm banul succes). Utilizai raionamentul pentru a verifica identitatea
X n 2
n 2n
= .
k n
k=0
104 Capitolul 6 Numrare i probabilitate
6.4-8 ? Considerm n probe bernoulliene, unde, pentru i = 1, 2, . . . , n, a i-a prob are proba-
bilitatea de succes pi i fie X variabila aleatoare ce desemneaz numrul total de succese. Fie
p pi pentru orice i = 1, 2, . . . , n. Demonstrai c, pentru 1 k n,
k1
X
Pr{X < k} b(i; n, p).
i=0
6.4-9 Fie X o variabil aleatoare ce reprezint numrul total de succese ntr-o mulime A de n
probe bernoulliene, unde a i-a prob are probabilitatea de succes pi , i fie X 0 variabila aleatoare
ce reprezint numrul total de succese dintr-o mulime A0 de n probe bernoulliene, unde a i-a
prob are o probabilitate de succes p0i pi . Demonstrai c, pentru 0 k n,
(Indicaie: Artai cum se pot obine probele bernoulliene din A0 printr-un experiment ce implic
probele din A i utilizai rezultatul exerciiului 6.3-6.)
Teorema 6.2 Considerm o secven de n probe bernoulliene, unde succesul apare cu proba-
bilitatea p. Fie X o variabil aleatoare ce desemneaz numrul total de succese. Atunci pentru
0 k n, probabilitatea s avem cel puin k succese este
X n
n k
Pr{X k} = b(i; n, p) p .
k
i=k
Avem
n
X nk
X X
nk
n
Pr{X k} = b(i; n, p) = b(k + i; n, p) = pk+i (1 p)n(k+i)
i=0 i=0
k + i
i=k
X nn k
nk nk
n k X nk i
k+i n(k+i)
p (1 p) = p p (1 p)(nk)i
i=0
k i k i=0
i
nk X
n k n k
= p b(i; n k, p) = p ,
k i=0
k
Pnk
cci i=0 b(i; n k, p) = 1, din ecuaia (6.38).
Corolarul urmtor reformuleaz teorema pentru coada stng a distribuiei binomiale. n
general, vom lsa n seama cititorului trecerea de la marginea unei cozi la alta.
Corolarul 6.3 Considerm o secven de n probe bernoulliene, unde succesul apare cu pro-
babilitatea p. Dac X este o variabil aleatoare ce reprezint numrul total de succese, atunci,
pentru 0 k n, probabilitatea s avem cel mult k succese este
k
X
n nk n
Pr{X k} = b(i; n, p) (1 p) = (1 p)nk .
i=0
nk k
Teorema 6.4 Considerm o secven de n probe bernoulliene, n care succesul apare cu proba-
bilitatea p i eecul cu probabilitatea q = 1p. Fie X o variabil aleatoare ce reprezint numrul
de succese. Atunci, pentru 0 < k < np, probabilitatea a mai puin de k succese este
k1
X kq
Pr{X < k} = b(i; n, p) < b(k; n, p).
i=0
np k
Pk1
Demonstraie. Vom majora seria i=0 b(i; n, p) cu o serie geometric utiliznd tehnica din
seciunea 3.2. Pentru i = 1, 2, . . . , k din ecuaia (6.42) avem
b(i 1; n, p) iq i q k q
= < .
b(i; n, p) (n i + 1)p ni p nk p
Dac lum
k q
x= < 1,
nk p
rezult c
Corolarul 6.5 Considerm o secven de n probe bernoulliene, n care succesul apare cu pro-
babilitatea p. Fie X o variabil aleatoare ce reprezint numrul total de succese. Atunci, pentru
np < k < n, probabilitatea de a avea mai mult de k succese este
n
X (n k)p
Pr{X > k} = b(i; n, p) < b(k; n, p).
k np
i=k+1
Teorema 6.6 Considerm o secven de n probe bernoulliene, unde, la a i-a prob, pentru
i = 1, 2, . . . , n, succesul apare cu probabilitatea pi , iar eecul cu probabilitatea qi = 1 pi . Fie
X o variabil aleatoare ce reprezint numrul total de succese i fie = E [X]. Atunci, pentru
r > ,
e r
Pr{X r} .
r
Demonstraie. Deoarece, pentru orice > 0, funcia ex este strict cresctoare n x, avem
Pr{X r} = Pr{e(X) er },
unde va fi determinat mai trziu. Utiliznd inegalitatea lui Markov (6.32) obinem
h i
Pr{X r} E e(X) er . (6.43)
Partea cea mai consistent a demonstraiei o constituie mrginirea lui E e(X) i substituirea
lui n inegalitea (6.43) cu o valoare potrivit. Mai nti evalum E e(X) . Pentru i =
6.5. Cozile distribuiei binomiale 107
1, 2, . . . , n, fie Xi o variabil aleatoare care are valoarea 1, dac a i-a prob bernoullian este un
succes i 0, dac este un eec. Astfel
n
X
X= Xi
i=1
i
n
X
X = (Xi pi ).
i=1
care rezult din (6.27) deoarece independena mutual a variabilelor aleatoare Xi implic
independena mutual a variabilelor aleatoare e(Xi pi ) (vezi exerciiul 6.3-4). Din definiia
mediei
h i
E e(Xi pi ) = e(1pi ) pi + e(0pi ) qi = pi eqi + qi epi
pi e + 1 exp(pi e ), (6.44)
x
unde exp(x) reprezint funcia exponenial: exp(x) = e . (Inegalitatea (6.44) rezult din
inegalitile > 0, qi 1, eqi e i epi 1, iar ultima linie rezult din inegalitatea
(2.7)). n consecin,
h i Yn
E e(X) exp(pi e ) = exp(e )
i=1
Pn
cci = i=1 pi . Deci, din inegalitatea (6.43), rezult c
Pr{X r} exp(e r). (6.45)
Alegnd = ln(r/) (vezi exerciiul 6.5-6), obinem
er e r
Pr{X r} exp eln(r/) r ln(r/) = exp(r r ln(r/)) = = .
(r/)r r
Cnd se aplic probelor bernoulliene, n care la fiecare ncercare avem aceeai probabilitate
de succes, teorema 6.6 ne d urmtorul corolar de mrginire a cozii drepte a unei distribuii
binomiale.
Corolarul 6.7 Considerm o secven de n probe bernoulliene, unde, la fiecare prob, succesul
apare cu probabilitatea p, iar eecul cu probabilitatea q = 1 p. Atunci, pentru r > np,
Xn npe r
Pr{X np r} = b(k; n, p) .
r
k=dnp+re
Exerciii
6.5-1 ? Ce este mai puin probabil: s nu obinem nici o stem cnd aruncm o moned perfect
de n ori sau s obinem mai puin de n steme cnd aruncm moneda de 4n ori?
6.5-2 ? Artai c
X
k1
n i k
a < (a + 1)n b(k; n, a/(a + 1)),
i=0
i na k(a + 1)
6.5-3 ? Demonstrai c, dac 0 < k < np, unde 0 < p < 1 i q = 1 p, atunci
nk
kq np k
k1
X nq
pi q ni < .
i=0
np k k nk
Intutiv, o dat ales bi , probabilitatea ca bj s fie ales acelai, este 1/n. Astfel, probabilitatea ca
i i j s aib aceeai zi de natere este egal cu probabilitatea ca una dintre zilele de natere s
cad ntr-o zi dat. De notat, totui, c aceast coinciden depinde de presupunerea c zilele
de natere sunt independente.
Putem analiza probabilitatea ca cel puin 2 din k oameni s aib aceeai zi de natere, ana-
liznd evenimentul complementar. Probabilitatea ca cel puin dou zile de natere s coincid
este 1 minus probabilitatea ca toate zilele de natere s fie diferite. Evenimentul ca toate cele k
persoane s aib zile de natere distincte este
k1
\
Bk = Ai ,
i=1
unde Ai este evenimentul ca ziua de natere a persoanei (i + 1) s fie diferit de ziua de natere
a persoanei j, pentru orice j i, adic,
Ai = {bi+1 6= bj : j = 1, 2, . . . , i}.
Deoarece putem scrie Bk = Ak1 Bk1 , din ecuaia (6.20) obinem recurena
Cnd k(k 1) 2n, numrul mediu de zile de natere este cel puin 1. Astfel, dac avem
cel puin 2n persoane n ncpere, ne putem atepta ca cel puin dou s aib aceeai zi de
natere. Pentru n = 365, dac k = 28, numrul mediu de persoane cu aceeai zi de natere este
(28 27)/(2 365) 1, 0536. Astfel, dac avem cel puin 28 de persoane, ne ateptm s gsim
cel puin o pereche avnd aceeai zi de natere. Pe Marte, unde un an este de 669 de zile, avem
nevoie de cel puin 38 de marieni.
Prima analiz a determinat numrul de persoane necesar pentru ca probabilitatea existenei
unei coincidene a zilelor de natere s fie mai mare dect 1/2, iar a dou analiz a determinat
6.6. Analiz probabilistic 111
numrul de persoane necesar pentru ca numrul mediu de coincidene de zile de natere s fie
cel puin 1. Dei numrulde oameni determinat n fiecare din cele dou situaii difer, ambele
sunt asimptotic la fel: ( n).
Ultima inegalitate rezult din marginea (3.5) referitoare la seria armonic. Deci sunt necesare
aproximativ b ln b aruncri nainte de a ne putea atepta ca fiecare cutie s conin o bil.
Vom demonstra, nti, c lungimea celei mai lungi secvene de steme este O(lg n). Fie Aik
evenimentul ca o secven de steme de lungime cel puin k s nceap de la a i-a aruncare sau,
mai precis, evenimentul ca cele k aruncri consecutive, i, i + 1, . . . , i + k 1 s ne dea numai
steme, unde 1 k n i 1 i n k + 1. Pentru un eveniment dat Aik , probabilitatea ca
toate cele k aruncri s aib ca rezultat stema, are o distribuie geometric cu p = q = 1/2:
deoarece, conform inegalitii lui Boole (6.22), probabilitatea unei reuniuni de evenimente este
cel mult suma probabilit ilor evenimentelor individuale. (De notat c inegalitatea lui Boole are
loc i pentru evenimente care nu sunt independente.)
Probabilitatea ca orice secven s aib lungimea cel puin 2dlg ne este cel mult 1/n; deci
probabilitatea ca cea mai lung secven s aib lungimea mai mic dect 2dlg ne este cel puin
1 1/n. Deoarece fiecare secven are lungimea cel mult n, lungimea medie a celei mai lungi
secvene este mrginit superior de
Astfel, probabilitatea ca cea mai lung secven s aib lungimea cel puin rdlg ne este cel mult
n/nr = 1/nr1 , sau echivalent, probabilitatea ca cea mai lung secven s aib lungimea mai
mic dect rdlg ne este cel puin 1 1/nr1 .
De exemplu, pentru n = 1000 de aruncri de moned, probabilitatea de a avea o secven de
cel puin 2dlg ne = 20 de steme este de cel mult 1/n = 1/1000. ansa de a avea o secven mai
lung de 3dlg ne = 30 de steme este de cel mult 1/n2 = 1/1000000.
Vom demonstra acum o margine inferioar complementar: lungimea celei mai lungi secvene
de steme n n aruncri este (lg n). Pentru a demonstra aceast margine vom cuta o secven
de lungime blg nc/2. Din ecuaia (6.47) avem
Pr{Ai,blg nc/2 } = 1/2blg nc/2 1/ n.
Probabilitatea
ca o secven de lungime cel puin blg nc/2 s nu nceap n poziia i este deci cel
mult 1 1/ n. Putem partiiona cele n aruncri ale monedei n cel puin b2n/blg ncc grupuri
Probleme 113
de blg nc/2 aruncri consecutive de monede. Deoarece aceste grupuri sunt formate din aruncri
mutual exclusive i independente, probabilitatea ca nici unul dintre aceste grupuri s nu fie o
secven de lungime blg nc/2 este
(1 1/ n)b2n/blg ncc (1 1/ n)2n/ lg n1 e(2n/ lg n1)/ n = O(e lg n ) = O(1/n).
Exerciii
6.6-1 Presupunem c mai multe bile sunt aruncate n b cutii. Fiecare aruncare este independent
i fiecare bil are aceeai probabilitate de a ajunge n oricare dintre cutii. Care este numrul mediu
de bile aruncate, nainte ca cel puin una din cutii s conin dou bile?
6.6-2 ? Pentru analiza paradoxului zilei de natere, este important ca zilele de natere s fie
independente n totalitate (mutual independente) sau este suficient s fie independente dou cte
dou? Justificai rspunsul.
6.6-3 ? Ci oameni trebuie invitai la o petrecere pentru a face verosimil existena a trei
dintre ei cu aceeai zi de natere?
6.6-4 ? Care este probabilitatea ca un k-ir peste o mulime de lungime n s fie o k-permutare?
Ce legtur este ntre aceast chestiune i paradoxul zilei de natere?
6.6-5 ? Presupunem c n bile sunt aruncate n n cutii, fiecare aruncare este independent i
fiecare bil are aceeai probabilitate de a nimeri n oricare dintre cutii. Care este numrul mediu
de cutii goale? Care este numrul mediu de cutii cu exact o bil?
6.6-6 ? mbuntii marginea inferioar a lungimii unei secvene artnd c, pentru n aruncri
ale unei monede perfecte, probabilitatea ca s nu apar nici o linie de mai mult de lg n 2 lg lg n
steme consecutive este mai mic dect 1/n.
Probleme
6-1 Bile i cutii
n aceast problem investigm efectul diverselor ipoteze asupra numrului de moduri de a plasa
n bile n b cutii distincte.
a. S presupunem c cele n bile sunt distincte i ordinea lor ntr-o cutie nu conteaz.
Argumentai c numrul de moduri n care se pot aeza bilele n cutii este bn .
114 Capitolul 6 Numrare i probabilitate
b. S presupunem c bilele sunt distincte i c bilele din fiecare cutie sunt ordonate.
Demonstrai c numrul de moduri n care se pot aeza bilele n cutii este (b+n1)!/(b1)!.
(Indicaie: Considerai numrul de moduri de aranjare a n bile distincte i b 1 beioare
nedistinctibile ntr-un rnd.)
c. Presupunem c bilele sunt identice i c ordinea lor n cutie nu conteaz. Artai c
numrul de moduri n care se pot aeza bilele n cutii este b+n1
n . (Indicaie: cte dintre
aranjamentele din partea (b) se repet dac bilele devin identice?)
d. Presupunem c bilele sunt identice i c nici o cutie nuconine
mai mult de o bil. Artai
c numrul de moduri n care se pot aeza bilele este nb .
e. Presupunem c bilele sunt identice i c nici o cutie
nu poate rmne goal. Artai c
numrul de moduri n care se pot aeza bilele este n1
b1 .
1: max
2: pentru i 1, n execut
3: . Compar A[i] cu max
4: dac A[i] > max atunci
5: max A[i]
Dorim s determinm numrul mediu de execuii ale atribuirii din linia 5. Presupunem c
numerele din A sunt o permutare aleatoare a n numere distincte.
a. Dac un numr x este ales aleator dintr-o mulime de i numere distincte, care este proba-
bilitatea ca x s fie cel mai mare din mulime?
b. Care este relaia dintre A[i] i A[j] cnd se execut linia 5 a programului, pentru 1 j i?
c. Pentru orice i din domeniul 1 i n, care este probabilitatea ca linia 5 s fie executat?
d. Fie s1 , s2 , . . . , sn n variabile aleatoare, unde si reprezint numrul de execuii (0 sau 1) ale
liniei 5 n timpul celei de-a i-a iteraii a ciclului pentru. Ce este E[si ]?
e. Fie s = s1 + s2 + + sn numrul total de execuii ale liniei 5 n timpul unei execuii a
programului. Artai c E[s] = (lg n).
Note bibliografice
Primele metode generale de rezolvare a problemelor de probabiliti au fost discutate n
celebra coresponden dintre B. Pascal i P. de Fermat, care a nceput n 1654 i ntr-o carte a
lui C. Huygens din 1657. Teoria riguroas a probabilitilor a nceput cu lucrarea lui J. Bernoulli
din 1713 i cu cea a lui A. de Moivre din 1730. Dezvoltri ulterioare ale teoriei au fost date de
P. S. de Laplace, S.-D. Poisson i C. F. Gauss.
Sumele de variabile aleatoare au fost studiate pentru prima dat de P. L. Chebyshev (Cebev)
i de A. A. Markov. Teoria probabilitilor a fost axiomatizat de A. N. Kolmogorov n 1933.
Marginile pentru cozile distribuiilor au fost date de Chernoff [40] i Hoeffding [99]. Lucrarea de
baz referitoare la structurile aleatoare combinatorice a fost dat de P. Erds.
Knuth [121] i Liu [140] sunt referine bune pentru combinatoric elementar i numrare.
Cri standard ca Billingsley [28], Chung [41], Drake [57], Feller [66] i Rozanov [171] dau o
introducere comprehensiv n teoria probabilitilor. Bollobs [30], Hofri [100] i Spencer [179]
conin o mare varietate de tehnici probabilistice avansate.
II Ordonare i statistici de ordine
Introducere
Aceast parte prezint mai muli algoritmi care rezolv urmatoarea problem de ordonare:
Intrare: Un ir de n numere ha1 , a2 , ..., an i.
Ieire: O permutare (reordonare) ha01 , a02 , ..., a0n i a irului dat astfel nct a01 a0n .
irul de intrare este, de obicei, un tablou cu n elemente, dei el poate fi reprezentat i n alt mod,
de exemplu sub forma unei liste nlnuite.
Structura datelor
n practic, numerele care trebuie ordonate sunt rareori valori izolate. De obicei, fiecare
numr face parte dintr-o colecie de date numit articol. Fiecare articol conine o cheie, care
este valoarea ce trebuie ordonat, iar restul articolului conine date adiionale, care sunt, de
obicei, mutate mpreun cu cheia. n practic, atunci cnd un algoritm de ordonare interschimb
cheile, el trebuie s interschimbe i datele adiionale. Dac fiecare articol include o cantitate
mare de date adiionale, de multe ori interschimbm un tablou de pointeri la articole, n loc s
interschimbm articolele nsei, cu scopul de a minimiza cantitatea de date care este manevrat.
Dintr-un anumit punct de vedere, tocmai aceste detalii de implementare disting un algoritm
de programul propriu-zis. Faptul c sortm numere individuale sau articole mari, ce conin
numere, este irelevant pentru metoda prin care o procedur de ordonare determin ordinea
elementelor. Astfel, atunci cnd ne concentrm asupra problemei sortrii, presupunem, de obicei,
c intrarea const numai din numere. Implementarea unui algoritm care sorteaz numere este
direct din punct de vedere conceptual, dei, ntr-o situaie practic dat, pot exista i alte
subtiliti care fac ca implementarea propriu-zis a algoritmului s fie o sarcin dificil.
Algoritmi de sortare
n capitolul 1 am prezentat doi algoritmi care ordoneaz n numere naturale. Sortarea prin
inserie necesit, n cazul cel mai defavorabil, un timp de ordinul (n2 ). Totui, datorit faptului
c buclele sale interioare sunt mici, el este un algoritm rapid de sortare pe loc pentru dimensiuni
mici ale datelor de intrare. (Reamintii-v faptul c un algoritm de sortare sorteaz pe loc dac
doar un numr constant de elemente ale tabloului de intrare sunt stocate n afara tabloului la un
moment dat.) Sortarea prin interclasare are un timp de execuie asimptotic mai bun, (n lg n),
dar procedura Merge nu sorteaz n loc.
n aceast parte, vom introduce doi algoritmi noi de sortare pentru numere reale arbitrare.
Heapsort, prezentat n capitolul 7, sorteaz pe loc n numere arbitrare ntr-un timp O(n lg n).
Acest algoritm folosete o structur de date important, numit heap, pentru a implementa o
coad de prioritate.
Sortarea rapid, prezentat n capitolul 8, sorteaz i ea pe loc n numere, dar timpul su de
execuie, pentru cazul cel mai defavorabil, este (n2 ). Timpul mediu de execuie este (n lg n)
i, de obicei, mai bun dect este, n practic, Heapsort. La fel ca sortarea prin inserie, quicksort
are un cod foarte compact, i, deci, factorul constantei ascunse din timpul su de execuie este
mic. Sortarea rapid este un algoritm pentru sortarea tablourilor de dimensiuni foarte mari.
118
Sortarea prin inserie, sortarea prin interclasare, heapsort i sortarea rapid sunt toi algoritmi
de sortare prin comparare: ei determin ordinea elementelor unui tablou de intrare comparndu-i
elementele. Capitolul 9 ncepe prin introducerea modelului arborelui de decizie pentru studiul
limitrilor de performan ale sortrilor prin comparare. Folosind acest model, vom demonstra
o limit inferioar de (n lg n) pentru timpul de execuie al celui mai defavorabil caz al oricrei
sortri prin comparare a n elemente, demonstrnd astfel c heapsort i sortarea prin interclasare
sunt sortri prin comparare, optime din punct de vedere asimptotic.
n capitolul 9, se arat, apoi, c putem nvinge aceast limit inferioar de (n lg n)
dac putem aduna informaii despre ordinea elementelor prin alte mijloace dect compararea
elementelor. De exemplu, algoritmul de sortare prin numrare presupune c numerele de
intrare fac parte din mulimea {1, 2, ..., k}. Folosind indexarea tablourilor ca instrument pentru
determinarea ordinii relative, sortarea prin numrare poate sorta n numere ntr-un timp de
ordinul O(k + n). Astfel, atunci cnd k = O(n), sortarea prin numrare se execut ntr-un timp
ce depinde, liniar, de numrul elementelor din tabloul de intrare. Un algoritm nrudit, radix
sort, poate fi folosit pentru a extinde domeniul ordonrii prin numrare. Dac avem de ordonat
n numere ntregi, fiecare numr avnd d cifre, cu fiecare cifr aparinnd mulimii {1, 2, ..., k},
sortarea pe baza cifrelor poate ordona numerele ntr-un timp de ordinul O(d(n + k)). Dac d
este constant i k este O(n), sortarea pe baza cifrelor se execut ntr-un timp liniar. Un al treilea
algoritm, sortarea pe grupe, necesit informaii despre distribuia probabilistic a numerelor
din tabloul de intrare. Algoritmul poate sorta n numere reale, distribuite uniform n intervalul
semideschis [0, 1), ntr-un timp mediu de ordinul O(n).
Statistici de ordine
Statistica de ordinul i a unei mulimi de n numere este al i-lea cel mai mic numr din
mulime. Desigur, o persoan poate determina statistica de ordinul i, sortnd intrarea i selectnd
elementul cu indicele i al ieirii. Fr nici o presupunere despre distribuia elementelor, aceast
metod ruleaz ntr-un timp de ordinul (n lg n), dup cum arat i limita inferioar determinat
n capitolul 9.
n capitolul 10, vom arta c putem determina al i-lea cel mai mic element n timpul O(n),
chiar i atunci cnd elementele sunt numere reale arbitrare. Vom prezenta un algoritm avnd
un pseudocod compact care se execut n timpul O(n2 ) n cazul cel mai defavorabil, dar ntr-un
timp liniar n cazul general. Vom da, de asemenea, i un algoritm mai complicat, care se execut
ntr-un timp O(n) n cazul cel mai defavorabil.
Fundamente
Dei cele mai multe lucruri prezentate n aceast parte nu se bazeaz pe elemente matematice
dificile, anumite seciuni cer o abordare sofisticat din punct de vedere matematic. n special,
analizele timpilor medii de execuie ai algoritmilor de sortare rapida, sortare pe grupe, precum i
ai algoritmului bazat pe statistici de ordine folosesc elemente de probabilistic, elemente ce sunt
prezentate n capitolul 6. Analiza timpului de execuie al statisticii de ordine pentru cazul cel
mai defavorabil necesit elemente matematice puin mai sofisticate dect celelalte analize pentru
timpii de execuie n cazurile cele mai defavorabile din aceast parte.
7 Heapsort
n acest capitol vom prezenta un nou algoritm de sortare. Asemntor sortrii prin inter-
clasare, dar diferit de sortarea prin inserare, timpul de execuie al agoritmului heapsort este
O(n lg n). Asemntor sortrii prin inserare i diferit de sortarea prin interclasare, prin heapsort
se ordoneaz elementele n spaiul alocat vectorului: la un moment dat doar un numr constant
de elemente ale vectorului sunt pstrate n afara spaiului alocat vectorului de intrare. Astfel,
algoritmul heapsort combin calitile celor doi algoritmi de sortare prezentai deja.
Heapsort introduce o tehnic nou de proiectare a algoritmilor bazat pe utilizarea unei
structuri de date, numit de regul heap1 . Structura de date heap este util nu doar pentru
algoritmul heapsort, ea poate fi la fel de util i n tratarea eficient a unei cozi de prioritate.
Cu structura de date heap ne vom mai ntlni n algoritmii din capitolele urmtoare.
Amintim c termenul heap a fost introdus i utilizat iniial n contextul algoritmului heapsort,
dar acesta se folosete i n legtur cu alocarea dinamic, respectiv n tratarea memoriei bazate
pe colectarea reziduurilor (garbage collected storage), de exemplu n limbajele de tip Lisp.
Structura de date heap nu se refer la heap-ul menionat n alocarea dinamic, i ori de cte ori,
n aceast carte vom vorbi despre heap, vom nelege structura definit n acest capitol.
7.1. Heap-uri
Structura de date heap (binar) este un vector care poate fi vizualizat sub forma unui
arbore binar aproape complet (vezi seciunea 5.5.3), conform figurii 7.1. Fiecare nod al arborelui
corespunde unui element al vectorului care conine valorile ataate nodurilor. Arborele este plin,
exceptnd eventual nivelul inferior, care este plin de la stnga la dreapta doar pn la un anumit
loc. Un vector A care reprezint un heap are dou atribute: lungime[A], reprezint numrul
elementelor din vector i dimensiune-heap[A] reprezint numrul elementelor heap-ului memorat
n vectorul A. Astfel, chiar dac A[1..lungime[A]] conine n fiecare element al su date valide,
este posibil ca elementele urmtoare elementului A[dimensiune-heap[A]], unde dimensiune-
heap[A] lungime[A], s nu aparin heap-ului. Rdcina arborelui este A[1]. Dat fiind un
indice i, corespunztor unui nod, se pot determina uor indicii printelui acestuia Printe(i),
al fiului Stnga(i) i al fiului Dreapta(i).
Printe(i)
returneaz bi/2c
Stnga(i)
returneaz 2i
Dreapta(i)
returneaz 2i + 1
1 unii autori romni, folosesc termenul ansamblu.
120 Capitolul 7 Heapsort
Figura 7.1 Un heap reprezentat sub forma unui arbore binar (a) i sub forma unui vector (b). Numerele
nscrise n cercurile reprezentnd nodurile arborelui sunt valorile ataate nodurilor, iar cele scrise lng
cercuri sunt indicii elementelor corespunztoare din vector.
n cele mai multe cazuri, procedura Stnga poate calcula valoarea 2i cu o singur instruc-
iune, translatnd reprezentarea binar a lui i la stnga cu o poziie binar. Similar, procedura
Dreapta poate determina rapid valoarea 2i + 1, translatnd reprezentarea binar a lui i la
stnga cu o poziie binar, iar bitul nou intrat pe poziia binar cea mai nesemnificativ va fi
1. n procedura Printe valoarea bi/2c se va calcula prin translatarea cu o poziie binar la
dreapta a reprezentrii binare a lui i. ntr-o implementare eficient a algoritmului heapsort, aceste
proceduri sunt adeseori codificate sub forma unor macro-uri sau a unor proceduri in-line.
Pentru orice nod i, diferit de rdcin, este adevrat urmtoarea proprietate de heap:
adic valoarea ataat nodului este mai mic sau egal cu valoarea asociat printelui su. Astfel
cel mai mare element din heap este pstrat n rdcin, iar valorile nodurilor oricrui subarbore
al unui nod sunt mai mici sau egale cu valoarea nodului respectiv.
Definim nlimea unui nod al arborelui ca fiind numrul muchiilor aparinnd celui mai
lung drum care leag nodul respectiv cu o frunz, iar nlimea arborelui ca fiind nlimea
rdcinii. Deoarece un heap avnd n elemente corespunde unui arbore binar complet, nlimea
acestuia este (lg n) (vezi exerciiul 7.1-2). Vom vedea c timpul de execuie al operaiilor de
baz, care se efectueaz pe un heap, este proporional cu nlimea arborelui i este O(lg n). n
cele ce urmeaz, vom prezenta cinci proceduri i modul lor de utilizare n algoritmul de sortare,
respectiv ntr-o structur de tip coad de prioritate.
Procedurile Extrage-Max i Insereaz se execut n timpul O(lg n), iar cu ajutorul lor
se poate utiliza un heap n realizarea unei cozi de prioritate.
7.2. Reconstituirea proprietii de heap 121
Exerciii
7.1-1 Care este cel mai mic, respectiv cel mai mare numr de elemente dintr-un heap avnd
nlimea h?
7.1-3 Artai c n orice subarbore al unui heap, rdcina subarborelui conine cea mai mare
valoare care apare n acel subarbore.
7.1-4 Unde se poate afla cel mai mic element al unui heap, presupunnd c toate elementele
sunt distincte?
7.1-6 Este secvena h23, 17, 14, 6, 13, 10, 1, 5, 7, 12i un heap?
Figura 7.2 ilustreaz efectul procedurii Reconstituie-Heap. La fiecare pas se determin cel
mai mare element dintre A[i], A[Stnga(i)] i A[Dreapta(i)], iar indicele su se pstreaz n
variabila maxim. Dac A[i] este cel mai mare, atunci subarborele avnd ca rdcin nodul i este
un heap i procedura se termin. n caz contrar, cel mai mare element este unul dintre cei doi
descendeni i A[i] este interschimbat cu A[maxim]. Astfel, nodul i i descendenii si satisfac
proprietatea de heap. Nodul maxim are acum valoarea iniial a lui A[i], deci este posibil ca
122 Capitolul 7 Heapsort
Figura 7.2 Efectul procedurii Reconstituie-Heap(A, 2), unde dimesiune-heap[A] = 10. (a)
Configuraia iniial a heap-ului, unde A[2] (pentru nodul i = 2), nu respect proprietatea de heap
deoarece nu este mai mare dect descendenii si. Proprietatea de heap este restabilit pentru nodul 2
n (b) prin interschimbarea lui A[2] cu A[4], ceea ce anuleaz proprietatea de heap pentru nodul 4. Apelul
recursiv al procedurii Reconstituie-Heap(A, 4) poziioneaz valoarea lui i pe 4. Dup interschimbarea
lui A[4] cu A[9], aa cum se vede n (c), nodul 4 ajunge la locul su i apelul recursiv Reconstituie-
Heap(A, 9) nu mai gsete elemente care nu ndeplinesc proprietatea de heap.
Soluia acestei recurene se obine pe baza celui de-al doilea caz al teoremei master (teorema
4.1): T (n) = O(lg n). Timpul de execuie al procedurii Reconstituie-Heap pentru un nod de
nlime h poate fi exprimat alternativ ca fiind egal cu O(h).
7.3. Construirea unui heap 123
Exerciii
7.2-1 Utiliznd ca model figura 7.2, ilustrai modul de funcionare al procedurii Reconstituie-
Heap(A, 3) pentru vectorul A = h27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0i.
7.2-2 Care este efectul apelului procedurii Reconstituie-Heap(A, i), dac elementul A[i] este
mai mare dect descendenii si?
Ultima nsumare poate fi evaluat prin nlocuirea x = 1/2 n formula (3.6). Obinem
X h 1/2
= = 2. (7.3)
2h (1 1/2)2
h=0
De aici rezult c se poate construi un heap dintr-un vector ntr-un timp liniar.
Exerciii
7.3-1 Utiliznd ca model figura 7.3, ilustrai modul de funcionare al procedurii Construiete-
Heap pentru vectorul A = h5, 3, 17, 10, 84, 19, 6, 22, 9i.
7.3-3 ? Artai c, ntr-un heap de nlime h avnd n elemente, numrul nodurilor este cel
mult dn/2h+1 e.
Exerciii
7.4-1 Utiliznd ca model figura 7.4, ilustrai modul de funcionare al procedurii Heapsort
pentru vectorul A = h5, 13, 2, 25, 7, 17, 20, 8, 4i.
7.4-2 Care este timpul de execuie al algoritmului heapsort n cazul unui vector A de dimensiune
n, ordonat cresctor? Dar n cazul unui vector ordonat descresctor?
Figura 7.4 Modul de funcionare a algoritmului Heapsort. (a) Structura de date heap, imediat dup
construirea sa de ctre procedura Construiete-Heap. (b)-(j) Heap-ul, imediat dup cte un apel al
procedurii Reconstituie-Heap (linia 5 n algoritm). Figura reprezint valoarea curent a variabilei i.
Din heap fac parte doar nodurile din cercurile nehaurate. (k) Vectorul A ordonat, obinut ca rezultat.
128 Capitolul 7 Heapsort
Timpul de execuie al procedurii Extrage-Max-Din-Heap este O(lg n), deoarece conine doar
civa pai, care se execut n timp constant nainte s se execute procedura Reconstituie-
Heap, care necesit un timp de O(lg n).
Procedura Insereaz-n-Heap insereaz un nod n heap-ul A. La prima expandare a heap-
ului se adaug o frunz arborelui. Apoi, la fel ca n structura repetitiv de inserare (liniile 57)
din Sortare-Prin-Inserare (din seciunea 1.1), se traverseaz un drum pornind de la aceast
frunz ctre rdcin, n scopul gsirii locului definitiv al noului element.
Insereaz-n-Heap(A, cheie)
1: dimesiune-heap[A] dimesiune-heap[A] + 1
2: i dimesiune-heap[A]
3: ct timp i > 1 i A[Printe(i)] < cheie execut
4: A[i] A[Printe(i)]
5: i Printe(i)
6: A[i] cheie
Exerciii
7.5-1 Utiliznd ca model figura 7.5, ilustrai operaia Insereaz-n-Heap(A, 10) pentru heap-
ul A = h15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1i.
7.5-2 Dat fiind heap-ul A = h15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1i, ilustrai operaia Extrage-Max-
Din-Heap.
7.5. Cozi de prioriti 129
Figura 7.5 Operaia Insereaz-n-Heap. (a) Heap-ul din figura 7.4(a) nainte de inserarea nodului
avnd cheia 15. (b) Se adaug arborelui o frunz nou. (c) Se scufund valorile de pe drumul dintre
frunz i rdcin pn la gsirea nodului corespunztor cheii 15. (d) Se insereaz cheia 15.
7.5-3 Artai cum se poate implementa o list de tip FIFO cu ajutorul unei cozi de prioriti.
Artai cum se poate implementa o stiv cu ajutorul unei cozi de prioriti. (Listele FIFO i
stivele vor fi definite n seciunea 11.1.)
7.5-5 Operaia terge-Din-Heap(A, i) terge elementul ataat nodului i din heap-ul A. Gsii
o implementare pentru operaia terge-Din-Heap care se execut pentru un heap avnd n
elemente ntr-un timp O(lg n).
7.5-6 Gsii un algoritm de timp O(n lg k) pentru a interclasa k liste ordonate, unde n este
numrul total de elemente din listele de intrare. (Indicaie: se utilizeaz un heap)
130 Capitolul 7 Heapsort
Probleme
7-1 Construirea unui heap prin inserare
Procedura Construiete-Heap, din seciunea 7.3, poate fi implementat folosind, n mod
repetat, procedura Inserare-n-Heap, n scopul inserrii elementelor n heap. Fie urmtoarea
implementare:
Construiete-Heap0 (A)
1: dimesiune-heap[A] 1
2: pentru i 2, lungime[A] execut
3: Insereaz-n-Heap(A, A[i])
Note bibliografice
Algoritmul heapsort a fost inventat de Williams [202], care a descris i modul de implementare
a unei cozi de prioriti printr-un heap. Procedura Construiete-Heap a fost propus de Floyd
[69].
8 Sortarea rapid
Sortarea rapid este un algoritm de sortare care, pentru un ir de n elemente, are un timp
de execuie (n2 ), n cazul cel mai defavorabil. n ciuda acestei comportri proaste, n cazul cel
mai defavorabil, algoritmul de sortare rapid este deseori cea mai bun soluie practic, deoarece
are o comportare medie remarcabil: timpul su mediu de execuie este (n lg n), i constanta
ascuns n formula (n lg n) este destul de mic. Algoritmul are avantajul c sorteaz pe loc
(n spaiul alocat irului de intrare) i lucreaz foarte bine chiar i ntr-un mediu de memorie
virtual.
n seciunea 8.1 sunt descrii algoritmul i un subalgoritm important, folosit de sortarea rapid
pentru partiionare. Deoarece comportarea algoritmului de sortare rapid este foarte complex,
vom ncepe studiul performanei lui cu o discuie intuitiv n seciunea 8.2, i lsm analiza
precis la sfritul capitolului. n seciunea 8.3 sunt prezentate dou variante ale algoritmului
de sortare rapid, care utilizeaz un generator de numere aleatoare. Aceti algoritmi aleatori
au multe proprieti interesante. Timpul lor mediu de execuie este bun i nu se cunosc date
de intrare particulare pentru care s aib comportarea cea mai proast. O variant aleatoare a
algoritmului de sortare rapid este studiat n seciunea 8.4 i se demonstreaz c timpul lui de
execuie, n cazul cel mai defavorabil, este O(n2 ), iar timpul mediu O(n lg n).
Divide: irul A[p..r] este mprit (rearanjat) n dou subiruri nevide A[p..q] i A[q + 1..r],
astfel nct fiecare element al subirului A[p..q] s fie mai mic sau egal cu orice element al
subirului A[q + 1..r]. Indicele q este calculat de procedura de partiionare.
Stpnete: Cele dou subiruri A[p..q] i A[q + 1..r] sunt sortate prin apeluri recursive ale
algoritmului de sortare rapid.
Combin: Deoarece cele dou subiruri sunt sortate pe loc, nu este nevoie de nici o combinare,
irul A[p..r] este ordonat.
Partiionarea irului
Cheia algoritmului este procedura Partiie, care rearanjeaz pe loc subirul A[p..r].
Partiie(A, p, r)
1: x A[p]
2: i p 1
3: j r + 1
4: ct timp adevrat execut
5: repet
6: j j1
7: pn cnd A[j] x
8: repet
9: ii+1
10: pn cnd A[i] x
11: dac i < j atunci
12: interschimb A[i] A[j]
13: altfel
14: returneaz j
n figura 8.1 este ilustrat modul de funcionare a procedurii Partiie. nti se selecteaz un
element x = A[p] din irul A[p..r], care va fi elementul pivot, n jurul cruia se face partiionarea
irului A[p..r]. Apoi, dou subiruri A[p..i] i A[j..r] cresc la nceputul i respectiv, sfritul irului
A[p..r], astfel nct fiecare element al irului A[p..i] s fie mai mic sau egal cu x, i orice element
al irului A[j..r], mai mare sau egal cu x. La nceput i = p 1 i j = r + 1, deci cele dou
subiruri sunt vide.
n interiorul ciclului ct timp, n liniile 57, indicele j se decrementeaz, iar i se incremen-
teaz pn cnd A[i] x A[j]. Presupunnd c inegalitile de mai sus sunt stricte, A[i] este
prea mare ca s aparin primului subir (cel de la nceput), iar A[j] prea mic ca s aparin
celui de al doilea subir (cel de la sfrit). Astfel, interschimbnd A[i] cu A[j] (linia 12), cele
dou pri cresc. (Interschimbarea se poate face i n cazul n care avem inegaliti stricte.)
Ciclul ct timp se repet pn cnd inegalitatea i j devine adevrat. n acest moment,
ntregul ir A[p..r] este partiionat n dou subiruri A[p..q] i A[q + 1..r], astfel nct p q < r
i nici un element din A[p..q] nu este mai mare dect orice element din A[q + 1..r]. Procedura
returneaz valoarea q = j.
De fapt, procedura de partiionare execut o operaie simpl: pune elementele mai mici dect
x n primul subir, iar pe cele mai mari dect x n subirul al doilea. Exist cteva particulariti
care determin o comportare interesant a procedurii Partiie. De exemplu, indicii i i j nu
depesc niciodat marginile vectorului A[p..r], dar acest lucru nu se vede imediat din textul
procedurii. Un alt exemplu: este important ca elementul A[p] s fie utilizat drept element pivot
x. n schimb, dac se folosete A[r] ca element pivot, i, ntmpltor, A[r] este cel mai mare
element al vectorului A[p..r], atunci Partiie returneaz procedurii Quicksort valoarea q =
r, i procedura intr ntr-un ciclu infinit. Problema 8-1 cere s se demonstreze corectitudinea
procedurii Partiie.
Timpul de execuie al procedurii Partiie, n cazul unui vector A[p..r], este (n), unde
n = r p + 1 (vezi exerciiul 8.1-3.).
8.2. Performana algoritmului de sortare rapid 133
Figura 8.1 Operaiile efectuate de procedura Partiie pe un exemplu. Elementele haurate n gri
deschis sunt deja plasate n poziiile lor corecte, iar cele haurate nchis nc nu. (a) irul de intrare,
cu valorile iniiale ale variabilelor i i j, care punctez n afara irului. Vom face partiionarea n jurul
elementului x = A[p] = 5. (b) Poziiile lui i i j n linia 11 a algoritmului, dup prima parcurgere a
ciclului ct timp. (c) Rezultatul schimbului de elemente descris n linia 12. (d) Valorile lui i i j n
linia 11 dup a doua parcurgere a ciclului ct timp. (e) Valorile lui i i j dup a treia i ultima iteraie
a ciclului ct timp. Procedura se termin deoarece i j i valoarea returnat este q = j. Elementele
irului pn la A[j], inclusiv, sunt mai mici sau egale cu x = 5, iar cele de dup A[j], sunt toate mai
mici sau egale cu x = 5.
Exerciii
8.1-1 Folosind figura 8.1 drept model, s se ilustreze operaiile procedurii Partiie n cazul
vectorului A = h13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21i.
8.1-2 Ce valoare a lui q returneaz procedura Partiie, dac toate elementele vectorului A[p..r]
sunt egale.
Figura 8.2 Arborele de recursivitate pentru Quicksort cnd procedura Partiie pune ntotdeauna
ntr-o parte a vectorului numai un singur element (cazul cel mai defavorabil). Timpul de execuie n
acest caz este (n2 ).
T (n) = T (n 1) + (n).
Pentru evaluarea formulei de mai sus, observm c T (1) = (1), apoi iterm formula:
n
n !
X X
T (n) = T (n 1) + (n) = (k) = k = (n2 ).
k=1 k=1
Pn
Ultima egalitate se obine din observaia c k=1 k este o progresie aritmetic (3.2). n figura
8.2 este ilustrat arborele de recursivitate pentru acest cel mai defavorabil caz al algoritmului de
sortare rapid. (Vezi seciunea 4.2 pentru alte detalii privind arborii recursivi.)
Dac partiionarea este total dezechilibrat la fiecare pas recursiv al algoritmului, atunci
timpul de execuie este (n2 ). Deci timpul de execuie, n cazul cel mai defavorabil, nu este
mai bun dect al algoritmului de sortare prin inserare. Mai mult, timpul de execuie este (n2 )
chiar i n cazul n care vectorul de intrare este ordonat caz n care algoritmul de sortare prin
inserare are timpul de execuie O(n).
Figura 8.3 Arborele de recuren pentru Quicksort cnd procedura Partiie produce ntotdeauna
pri egale (cazul cel mai favorabil). Timpul de execuie rezultat este (n lg n).
a crei soluie este T (n) = (n lg n) (dup cazul 2 al teoremei 4.1). Deci partiionarea cea mai
bun produce un algoritm de sortare mult mai rapid. n figura 8.3 se ilustreaz arborele de
recursivitate pentru acest cel mai favorabil caz.
Partiionarea echilibrat
Analiza din seciunea 8.4 va arta c timpul mediu de execuie a algoritmului de sortare
rapid este mult mai apropiat de timpul cel mai bun dect de timpul cel mai ru. Pentru a
nelege de ce este aa, ar trebui s studiem efectul partiionrii echilibrate asupra formulei
recursive care descrie timpul de execuie.
S presupunem c procedura de partiionare produce ntotdeauna o mprire n proporie de
9 la 1, care la prima vedere pare a fi o partiionare dezechilibrat. n acest caz, formula recursiv
pentru timpul de execuie al algoritmului de sortare rapid este:
T (n) = T (9n/10) + T (n/10) + n
unde, pentru simplificare, n loc de (n) s-a pus n. Arborele de recuren corespunztor se
gsete n figura 8.4. S observm c la fiecare nivel al arborelui costul este n pn cnd la
adncimea log10 n = (lg n) se atinge o condiie iniial. n continuare, la celelalte niveluri,
costul nu depete valoarea n. Apelul recursiv se termin la adncimea log10/9 n = (lg n).
Costul total al algoritmului de sortare rapid este deci (n lg n). Ca urmare, cu o partiionare
n proporie de 9 la 1 la fiecare nivel al partiionrii (care intuitiv pare a fi total dezechilibrat),
algoritmul de sortare rapid are un timp de execuie de (n lg n) asimptotic acelai ca n cazul
partiionrii n dou pri egale. De fapt, timpul de execuie va fi O(n lg n) i n cazul partiionrii
ntr-o proporie de 99 la 1. La orice partiionare ntr-o proporie constant, adncimea arborelui
de recursivitate este (lg n) i costul, la fiecare nivel, este O(n). Deci timpul de execuie este
(n lg n) la orice partiionare ntr-o proporie constant.
Figura 8.4 Arborele de recuren pentru Quicksort, cnd procedura Partiie produce ntotdeauna
pri n proporie de 9 la 1, rezultnd un timp de execuie de (n lg n).
toate permutrile elementelor de intrare sunt la fel de probabile. Vom discuta aceast presupunere
n seciunea urmtoare, aici vom exploata doar cteva variante.
n situaia n care algoritmul de sortare rapid lucreaz pe o intrare aleatoare, probabil c nu
va partiiona la fel la fiecare nivel, cum am presupus n discuiile anterioare. Este de ateptat ca
unele partiionri s fie echilibrate, altele nu. De exemplu, exerciiul 8.2-5 cere s se demonstreze
c procedura Partiie produce n 80% din cazuri o partiionare mai echilibrat dect proporia
de 9 la 1, i, numai n 20% din cazuri, una mai puin echilibrat.
n cazul mediu, procedura Partiie produce un amestec de partiionri bune i rele. ntr-
un arbore de recuren pentru cazul mediu al procedurii Partiie, partiionrile bune i rele
sunt distribuite aleator. S presupunem, totui, pentru simplificare, c partiionrile bune i rele
alterneaz pe niveluri, i c partiionrile bune corespund celui mai bun caz, iar cele rele celui
mai defavorabilcaz. n figura 8.5 sunt prezentate partiionrile la dou niveluri consecutive n
arborele de recursivitate. Costul partiionrii la rdcina arborelui este n, iar vectorii obinui
sunt de dimensiune n 1 i 1: cazul cel mai defavorabil. La nivelul urmtor, vectorul de n 1
elemente se mparte n doi vectori de (n 1)/2 elemente fiecare, potrivit cazului celui mai bun.
S presupunem c pentru un vector de dimensiune 1 (un element) costul este 1.
Combinarea unei partiionri rele i a uneia bune produce trei vectori de dimensiune 1,
(n 1)/2 i respectiv (n 1)/2, cu un cost total de 2n 1 = (n). Evident, aceast situaie nu
este mai rea dect cea prezentat n figura 8.5(b), adic cea cu un singur nivel, care produce un
vector de (n 1)/2 + 1 elemente i unul de (n 1)/2 elemente, cu un cost total de n = (n).
Totui, situaia din urm este aproape echilibrat, cu siguran mult mai bun dect proporia 9
la 1. Intuitiv, o partiionare defavorabil de un cost (n) poate fi absorbit de una bun tot de un
cost (n), i partiionarea rezultat este favorabil. Astfel timpul de execuie al algoritmului de
sortare rapid, cnd partiionrile bune i rele alterneaz, este acelai ca n cazul partiionrilor
bune: tot O(n lg n), doar constanta din notaia O este mai mare. O analiz riguroas a cazului
mediu se va face n seciunea 8.4.2.
8.3. Variantele aleatoare ale sortrii rapide 137
Figura 8.5 (a) Dou niveluri ale arborelui de recurent pentru algoritmul de sortare rapid. Parti-
ionarea la nivelul rdcinii consum n uniti de timp i produce o partiionare proast: doi vectori
de dimensiune 1 i n 1. Partiionarea unui subir de n 1 elemente necesit n 1 uniti de timp i
este o partiionare bun: produce dou subiruri de (n 1)/2 elemente fiecare. (b) Un singur nivel al
arborelui de recuren care este mai ru dect nivelurile combinate de la (a), totui foarte bine echilibrat.
Exerciii
8.2-1 Demonstrai c timpul de execuie al algoritmului Quicksort, n cazul unui vector A cu
toate elementele egale ntre ele, este (n lg n).
8.2-2 Demonstrai c, n cazul unui vector A avnd n elemente distincte, ordonate descresctor,
timpul de execuie al algoritmului Quicksort este (n2 ).
8.2-3 Bncile, de obicei, nregistreaz tranzaciile pe un cont dup data tranzaciilor, dar
multora dintre clieni le place s primeasc extrasele de cont, ordonate dup numrul cecurilor,
deoarece ei primesc cecurile grupate de la comerciani. Problema convertirii ordonrii dup data
tranzaciei n ordonare dup numrul de cec este problema sortrii unui vector aproape ordonat.
S se argumenteze de ce, n acest caz, algoritmul Sorteaz-Prin-Inserie este mai bun dect
algoritmul Quicksort.
8.2-5 ? Argumentai afirmaia c, pentru orice constant 0 < 1/2, probabilitatea ca pentru
o intrare aleatoare procedura Partiie s produc o partiionare mai echilibrat dect proporia
1 la , este aproximativ 1 2. Pentru ce valoare a lui partiionarea mai echilibrat are
anse egale cu cea mai puin echilibrat?
aa (vezi exerciiul 8.2-3). n aceast seciune, vom introduce noiunea de algoritm aleator i vom
prezenta dou variante aleatoare ale algoritmului de sortare rapid, care fac inutil presupunerea
c toate permutrile elementelor de intrare sunt la fel de probabile.
O alternativ, la a presupune o distribuie de date de intrare, este de a impune o astfel de
distribuie. De exemplu, s presupenem c, nainte s sorteze vectorul de intrare, algoritmul
de sortare rapid permut aleator elementele pentru a asigura astfel proprietatea c fiecare
permutare are aceeai probabilitate. (Exerciiul 8.3-4 cere scrierea unui algoritm care permut
aleator elementele unui vector de dimensiune n n O(n) uniti de timp.) Aceast modificare
nu mbuntete timpul de execuie a algoritmului n cazul cel mai defavorabil, dar asigur ca
timpul de execuie s nu depind de ordinea elementelor de intrare.
Un algoritm se numete aleator dac comportarea lui depinde nu numai de valorile de
intrare, ci i de valorile produse de un generator de numere aleatoare. Vom presupune
c dispunem de un generator de numere aleatoare numit Random. Un apel al procedurii
Random(a, b) produce un numr ntreg ntre a i b inclusiv. Fiecare numr ntreg din acest
interval [a, b] este la fel de probabil. De exemplu, Random(0,1) produce 0 i 1 cu aceeai proba-
bilitate 1/2. Fiecare ntreg generat de Random este independent de valorile generate anterior.
Ne-am putea imagina c Random este un zar cu (b a + 1) fee. (Majoritatea mediilor de
programare posed un generator de numere pseudoaleatoare, un algoritm determinist care
produce numere care par a fi aleatoare.)
Aceast variant a algoritmului de sortare rapid (ca de altfel muli ali algoritmi aleatori) are
interesanta proprietate c, practic, pentru nici o intrare nu are comportarea cea mai defavorabil.
Din contr, cazul cel mai defavorabil depinde de generatorul de numere aleatoare. Chiar dac
dorim, nu reuim s generm un vector de intrare prost, deoarece permutarea aleatoare face ca
ordinea datelor de intrare s fie irelevant. Algoritmul aleator poate avea o comportare proast
numai dac generatorul de numere aleatoare produce o intrare nefericit. n exerciiul 13.4-
4 se arat c pentru aproape toate permutrile elementelor de intrare, algoritmul de sortare
rapid are o comportare similar cu cazul mediu i aceast comportare este apropiat de cea
mai defavorabil doar pentru foarte puine permutri.
O strategie aleatoare este de obicei util cnd exist multe moduri n care un algoritm se poate
executa, dar este dificil s determinm un mod care s fie cu siguran bun. Dac multe din aceste
alternative sunt bune, alegerea pur i simplu a uneia, la ntmplare, poate reprezenta o strategie
bun. Deseori, n timpul execuiei sale, un algoritm trebuie s ia multe decizii. Dac beneficiile
unei decizii bune sunt mult mai mari dect costurile unor decizii rele, o selecie aleatoare de decizii
bune i rele poate determina un algoritm eficient. n seciunea 8.2 am artat c o combinaie de
partiionri bune i rele asigur un timp de execuie bun pentru algoritmul de sortare rapid, i
acest fapt sugereaz c i algoritmul aleator va avea o comportare bun.
Prin modificarea procedurii Partiie, se poate obine o variant nou a algoritmului de
sortare rapid care folosete aceast strategie de alegere aleatoare. La fiecare pas al sortrii
rapide, nainte de partiionarea vectorului, interschimbm elementul A[p] cu un element ales
aleator din vectorul A[p..r]. Aceast modificare asigur ca elementul pivot x = A[p] s fie,
cu aceeai probabilitate, orice element dintre cele r p + 1 elemente ale vectorului. Astfel,
partiionarea vectorului de intrare poate fi, n medie, rezonabil de echilibrat. Algoritmul aleator,
bazat pe permutarea elementelor de intrare, are i el o comportare medie bun, dar ceva mai
dificil de studiat dect aceast versiune.
Modificrile asupra procedurilor Partiie i Quicksort sunt minore. n noua procedur de
partiionare inserm pur i simplu interschimbarea celor dou elemente nainte de partiionare:
8.4. Analiza algoritmului de sortare rapid 139
Partiie-Aleatoare(A, p, r)
1: i Random(p, r)
2: interschimb A[p] A[i]
3: returneaz Partiie (A, p, r)
Exerciii
8.3-1 De ce, n loc s studiem comportarea cea mai defavorabil a unui algoritm aleator, studiem
comportarea medie?
8.3-2 De cte ori se apeleaz generatorul de numere aleatoare Random n timpul execuiei
procedurii Quicksort-Aleator n cazul cel mai defavorabil? Cum se schimb rspunsul n
cazul cel mai favorabil?
8.3-3 ? Descriei o implementare a algoritmului Random(a, b), care folosete numai aruncri
de monede perfecte. Care va fi timpul mediu de execuie a procedurii?
8.3-4 ? Scriei un algoritm aleator care ruleaz n (n) uniti de timp, are ca intrare un vector
A[1..n] i produce la ieire o permutare a elementelor de intrare.
rapid, n cazul cel mai defavorabil, pentru o intrare de dimensiunea n. Avem urmtoarea formul
de recuren
T (n) = max (T (q) + T (n q)) + (n), (8.1)
1qn1
unde parametrul q parcurge valorile ntre 1 i n 1, deoarece procedura Partiie produce dou
subiruri, avnd fiecare, cel puin un element. Presupunem c T (n) cn2 , pentru o constant c.
nlocuind n formula (8.1), obinem urmtoarele:
T (n) max (cq 2 + c(n q)2 ) + (n) = c max (q 2 + (n q)2 ) + (n).
1qn1 1qn1
Analiza partiionrii
La nceput, facem cteva observaii asupra procedurii Partiie. Cnd n linia 3 a procedurii
Partiie-Aleatoare este apelat procedura Partiie, elementul A[p] este deja interschimbat
cu un element ales aleator din vectorul A[p..r]. Pentru simplificare, s presupunem c toate
elementele de intrare sunt distincte. Dac elementele de intrare nu sunt distincte, timpul mediu
de execuie al algoritmului rmne tot O(n lg n), dar acest caz necesit o analiz ceva mai
complex.
Prima noastr observaie este c valoarea q, returnat de procedura Partiie, depinde numai
de rangul elmentului x = A[p] n vectorul A[p..r]. (Rangul unui element ntr-o mulime este
egal cu numrul elementelor care sunt mai mici sau egale cu el.) Dac notm cu n = r p + 1
numrul elementelor vectorului A[p..r], i interschimbm elementul x = A[p] cu un element ales
8.4. Analiza algoritmului de sortare rapid 141
Distribuia valorii q este aproape uniform, exceptnd cazul q = 1 care este de dou ori mai
probabil dect celelalte valori, cum am vzut anterior. Folosind valorile T (1) = (n) i T (n1) =
O(n2 ) (din analiza celui mai defavorabil caz), se poate scrie:
1 1
(T (1) + T (n 1)) = ((1) + O(n2 )) = O(n),
n n
i astfel termenul (n), n formula (8.2), poate absorbi expresia n1 (T (1) + T (n 1)). Astfel,
formula de recuren (8.2) poate fi scris sub forma:
n1
1X
T (n) = (T (q) + T (n q)) + (n). (8.3)
n q=1
Se poate observa c, pentru k = 1, 2, . . . , n 1, fiecare termen T (k) al sumei apare de dou
ori, o dat ca T (q), iar alt dat ca T (n q). Reducnd aceti termeni, formula final va fi:
n1
2X
T (n) = T (k) + (n). (8.4)
n
k=1
142 Capitolul 8 Sortarea rapid
formul care reprezint o estimare destul de precis, abstracie fcnd de o constant, dar nu
este suficient de puternic pentru a obine T (n) = O(n lg n) ca soluie a recurenei. Pentru a
obine soluia de mai sus, avem nevoie de o margine de forma 21 n2 lg n (n2 ).
Aceast margine se poate obine folosind metoda de mprire a sumei n dou, ca n seciunea
3.2. Vom obine:
n1 dn/2e1 n1
X X X
k lg k = k lg k + k lg k.
k=1 k=1 k=dn/2e
Termenul lg k din prima sum a membrului drept se poate majora prin lg(n/2) = lg n 1, iar
termenul lg k din cea de a doua sum prin lg n. Astfel se obine
n1 dn/2e1 n1 n1 dn/2e1
X X X X X
k lg k (lg n 1) k + lg n k = lg n k k
k=1 k=1 k=dn/2e k=1 k=1
Probleme 143
1 1 n n 1 1
n(n 1) lg n 1 n2 lg n n2
2 2 2 2 2 8
dac n 2. Deci am obinut chiar formula (8.5).
Exerciii
8.4-1 Demonstrai c timpul de execuie al algoritmului de sortare rapid, n cazul cel mai
favorabil este (n lg n).
8.4-4 n practic, timpul de execuie al algoritmului de sortare rapid se poate mbunti con-
siderabil, innd cont de execuia mai rapid a algoritmului de sortare prin inserie pentru date
de intrare aproape ordonate. Cnd algoritmul de sortare rapid este apelat pentru un subir
avnd mai puin de k elemente, impunem ca acesta s returneze vectorul fr a-l sorta. Dup
revenirea din apelul iniial, s se execute algoritmul de sortare prin inserie pentru ntregul vector
(care este aproape ordonat). Argumentai afirmaia c acest algoritm de sortare are un timp
mediu de execuie O(nk + n lg(n/k)). Cum trebuie aleas valoarea lui k, teoretic i practic?
8.4-6 ? Modificai procedura Partiie, alegnd aleator trei elemente din vectorul A, iar dintre
acestea elementul de mijloc ca valoare pivot. Aproximai probabilitatea ca, n cazul cel mai
defavorabil, s se obin o partiionare n proporie de la (1 ), unde 0 < < 1.
Probleme
8-1 Corectitudinea partiiei
Argumentai afirmaia c procedura Partiie din seciunea 8.1 este corect. Demonstrai ur-
mtoarele:
a. Indicii i i j nu se refer niciodat la elemente ale lui A din afara intervalului [p..r].
b. La terminarea procedurii Partiie, indicele j nu va fi niciodat egal cu r (astfel,
partiionarea nu este niciodat trivial).
c. La terminarea partiionrii fiecare element din A[p..j] este mai mic sau egal cu orice element
din A[j + 1..r].
144 Capitolul 8 Sortarea rapid
c. Modificai textul algoritmului Quicksort0 astfel nct adncimea stivei, n cazul cel mai
defavorabil, s fie (lg n). Pstrai valoarea O(n lg n) pentru timpul mediu de execuie a
algoritmului.
alese la ntmplare din vector. S considerm, pentru problema de fa, c toate elementele
vectorului de intrare A[1..n] sunt distincte i c n 3. S notm cu A0 [1..n] vectorul sortat
rezultat. Fie pi = Pr{x = A0 [i]} probabilitatea ca elementul pivot x, ales cu metoda mijlocul-
din-3, s fie al i-lea element n vectorul de ieire.
a. Dai o formul exact pentru pi n funcie de n i i, pentru i = 2, 3, . . . , n 1. (S observm
c p1 = pn = 0.)
b. Cu ct crete probabilitatea alegerii ca pivot a elementului x = A0 [b(n + 1)/2c], mijlocul
vectorului A[1..n] fa de implementarea original? Calculai limita acestei probabiliti
cnd n .
c. Dac numim partiionare bun acea partiionare care folosete ca pivot elementul x =
A0 [i], unde n/3 i 2n/3, atunci cu ct crete probabilitatea obinerii unei mpriri
bune fa de implementarea original? (Indicaie: Aproximai suma cu o integral.)
Note bibliografice
Algoritmul de sortare rapid a fost inventat de Hoare [98]. Sedgewick [174] ofer o prezentare
bun a detaliilor de implementare a acestui algoritm. Avantajele algoritmilor aleatori au fost
tratate de Rabin [165].
9 Sortare n timp liniar
n capitolele precedente au fost prezentai civa algoritmi de complexitate O(n lg n). Aceast
margine superioar este atins de algoritmii de sortare prin interclasare i heapsort n cazul cel
mai defavorabil; respectiv pentru quicksort corespunde n medie. Mai mult dect att, pentru
fiecare din aceti algoritmi putem efectiv obine cte o secven de n numere de intrare care
determin execuia algoritmului n timpul (n lg n).
Aceti algoritmi au o proprietate interesant: ordinea dorit este determinat n exclusivitate
pe baza comparaiilor ntre elementele de intrare. Astfel de algoritmi de sortare se numesc sortri
prin comparaii. Toi algoritmii de sortare prezentai pn acum sunt de acest tip.
n seciunea 9.1 vom demonstra c oricare sortare prin comparaii trebuie s fac, n cel mai
defavorabil caz, (n lg n) comparaii pentru a sorta o secven de n elemente. Astfel, algoritmul
de sortare prin interclasare i heapsort sunt asimptotic optimale i nu exist nici o sortare prin
comparaii care s fie mai rapid dect cu un factor constant.
Seciunile 9.2, 9.3 i 9.4 studiaz trei algoritmi de sortare sortare prin numrare, ordonare
pe baza cifrelor i ordonare pe grupe care se execut n timp liniar. Se subnelege c aceti
algoritmi folosesc, pentru a determina ordinea de sortare, alte operaii dect comparaiile. n
consecin, lor nu li se aplic marginea inferioar (n lg n).
Figura 9.1 Arborele de decizie corespunztor sortrii prin inserie care opereaz cu trei elemente. Sunt
posibile 3! = 6 permutri ntre elementele de intrare, deci arborele de decizie trebuie s aib cel puin 6
frunze.
ntr-un arbore de decizie fiecare nod intern este etichetat prin ai : aj pentru i i j din
intervalul 1 i, j n, unde n este numrul de elemente din secvena de intrare. Fiecare
frunz este etichetat cu o permutare h(1), (2), ..., (n)i. (Vezi seciunea 6.1 pentru noiuni
de baz asupra permutrilor.) Execuia algoritmului de sortare corespunde trasrii unui drum
de la rdcina arborelui de decizie la o frunz. La fiecare nod intern este fcut o comparaie
ai aj . Subarborele stng dicteaz comparaiile urmtoare pentru ai aj , iar subarborele
drept dicteaz comparaiile urmtoare pentru ai > aj . Cnd ajungem la o frunz, algoritmul
de sortare a stabilit ordonarea a(1) a(2) . . . a(n) . Pentru ca algoritmul de sortare s
ordoneze adecvat, fiecare dintre cele n! permutri de n elemente trebuie s apar n dreptul unei
frunze a arborelui de decizie.
Teorema 9.1 Orice arbore de decizie care sorteaz n elemente are nlimea (n lg n).
Corolarul 9.2 Metoda heapsort i metoda de sortare prin interclasare sunt metode de sortare
prin comparaii asimptotic optimale.
Demonstraie. n cazul metodelor de sortare heapsort i sortarea prin interclasare, marginile
superioare O(n lg n) asupra duratei timpilor de execuie corespund marginii inferioare (n lg n)
stabilite de teorema 9.1 pentru cazul cel mai defavorabil.
Exerciii
9.1-1 Care este cea mai mic adncime posibil a unei frunze ntr-un arbore de decizie pentru
un algoritm de sortare?
9.1-2 Obinei margini asimptotic P
strnse la lg(n!) fr a folosi aproximaia Stirling. n loc de
n
aceast aproximaie, evaluai suma k=1 lg k folosind tehnicile prezentate n cadrul seciunii 3.2.
9.1-3 Artai c nu exist nici o sortare prin comparaii avnd timpul de execuie liniar pentru
cel puin jumtate din cele n! intrri de lungime n. Ce se poate spune n cazul unei fraciuni 1/n
din datele de intrare de lungime n? Dar despre o fraciune 1/2n ?
9.1-4 Profesorul Solomon afirm c marginea inferioar (n lg n) pentru sortarea a n numere nu
se aplic n cazul mediului de care dispune, unde dup o singur comparaie ai : aj , programul se
ramific n trei direcii, dup cum ai < aj , ai = aj respectiv ai > aj . Demonstrai c profesorul
nu are dreptate demonstrnd c numrul comparaiilor tridirecionale cerut de sortarea celor n
elemente este tot (n lg n).
9.1-5 Demonstrai c, pentru a interclasa dou liste ordonate ce conin fiecare cte n elemente,
sunt necesare 2n 1 comparaii n cazul cel mai defavorabil.
9.1-6 Se consider o secven de n elemente care trebuie sortate. Datele de intrare sunt formate
din n/k subsecvene, fiecare coninnd k elemente. Toate elementele dintr-o subsecven dat
sunt mai mici dect elementele din subsecvena urmtoare i mai mari dect elementele din
subsecvena precedent. Astfel, pentru sortarea ntregii secvene de lungime n este suficient
sortarea celor k elemente din fiecare dintre cele n/k subsecvene. Gsii o margine inferioar
(n lg k) a numrului de comparaii necesar pentru rezolvarea acestei variante a problemei de
sortare. (Indicaie: combinarea simpl a marginilor inferioare pentru subecvenele individuale nu
este riguroas.)
Ideea de baz n sortarea prin numrare este de a determina numrul de elemente mai mici
dect x, pentru fiecare element x din datele de intrare. Acest informaie poate fi utilizat pentru
a poziiona elementul x direct pe poziia sa din tabloul de ieire. De exemplu, dac exist 17
elemente mai mici dect x, atunci x va fi pe poziia 18 n tabloul de ieire. Aceast schem trebuie
uor modificat n situaia n care exist mai multe elemente avnd aceeai valoare, ntruct nu
dorim s le aezm pe toate n aceeai poziie.
n algoritmul pentru sortarea prin numrare presupunem c datele de intrare formeaz un
tablou A[1..n], i deci lungime [A] = n. Sunt necesare alte dou tablouri suplimentare, tabloul
B [1..n], care cuprinde datele de ieire sortate, i tabloul C [1..k], pentru stocarea temporar n
timpul lucrului.
Sortare-Prin-Numrare(A, B, k)
1: pentru i 1, k execut
2: C [i] 0
3: pentru j 1, lungime [A] execut
4: C [A [j]] C [A [j]] + 1
5: . C[i] conine acum numrul elementelor egale cu i.
6: pentru i 2, k execut
7: C [i] C [i] + C [i 1]
8: . C[i] conine numrul elementelor mai mici sau egale cu i.
9: pentru j lungime [A] , 1, 1 execut
10: B [C [A [j]]] A [j]
11: C [A [j]] C [A [j]] 1
Algoritmul de sortare prin numrare este ilustrat n figura 9.2. Dup iniializarea din liniile
9.2. Sortarea prin numrare 151
12, n liniile 34 se contorizeaz fiecare element de intrare. Dac valoarea unui element de
intrare este i, se incrementeaz valoarea lui C [i]. Astfel, dup liniile 34, C [i] pstreaz un
numr de elemente de intrare egal cu i pentru fiecare numr ntreg i = 1, 2, . . . , k. n liniile 67
se determin, pentru fiecare i = 1, 2, . . . , k, numrul elementelor de intrare mai mici sau egale
dect i; aceasta se realizeaz prin pstrarea n C[k] a sumei primelor k elemente din tabloul
iniial.
n final, n liniile 911, fiecare element A[j] se plaseaz pe poziia sa corect determinat din
tabloul de ieire B, astfel nct acesta este ordonat. Dac toate cele n elemente sunt distincte,
la prima execuie a liniei 9, pentru fiecare A[j], valoarea C[A[j]] este poziia final corect a lui
A [j] n tabloul de ieire, ntruct exist C [A [j]] elemente mai mici sau egale cu A [j]. Deoarece
elementele ar putea s nu fie distincte, decrementm valoarea C[A[j]] de fiecare dat cnd plasm
o valoare A[j] n tabloul B; aceasta face ca urmtorul element de intrare cu o valoare egal cu
A [j], dac exist vreunul, s mearg n poziia imediat dinaintea lui A [j] n tabloul de ieire.
Ct timp necesit sortarea prin numrare? Bucla pentru din liniile 12 necesit timpul O(k),
bucla pentru din liniile 34 necesit timpul O(n), bucla pentru din liniile 67 necesit timpul
O(k), iar bucla pentru din liniile 911 necesit timpul O(n). Deci timpul total este O(k + n).
n practic se utilizeaz sortarea prin numrare cnd avem k = O(n), caz n care timpul necesar
este O(n).
Sortarea prin numrare are un timp mai bun dect marginea inferioar egal cu (n lg n)
demonstrat n seciunea 9.1, deoarece nu este o sortare prin comparaii. De fapt, n cod nu
apar comparaii ntre elementele de intrare. n schimb, sortarea prin numrare folosete valorile
elementului ca indice ntr-un tablou. Marginea inferioar (n lg n) nu se aplic atunci cnd ne
ndeprtm de modelul sortrii prin comparaii.
O proprietate important a sortrii prin numrare este stabilitatea: numerele cu aceeai
valoare apar n tabloul de ieire n aceeai ordine n care se gsesc n tabloul de intrare. Adic,
legturile dintre dou numere sunt distruse de regula conform creia oricare numr care apare
primul n vectorul de intrare, va aprea primul i n vectorul de ieire. Desigur, stabilitatea
este important numai cnd datele nvecinate sunt deplasate mpreun cu elementul n curs de
sortare. Vom vedea n seciunea urmtoare de ce stabilitatea este important.
Exerciii
9.2-1 Folosind figura 9.2 ca model, ilustrai modul de operare al algoritmului Sortare-Prin-
Numrare pe tabloul A = h7, 1, 3, 1, 2, 4, 5, 7, 2, 4, 3i.
9.2-2 Demonstrai c Sortare-Prin-Numrare este stabil.
9.2-3 Se presupune c bucla pentru din linia 9 a procedurii Sortare-Prin-Numrare este
rescris sub forma:
pentru j 1, lungime [A] execut
Artai c algoritmul modificat astfel funcioneaz corect. Algoritmul modificat este stabil?
9.2-4 Se presupune c ieirea algoritmului de sortare este un flux de date, de exemplu, o afiare
n mod grafic. Modificai algoritmul Sortare-Prin-Numrare pentru a obine rezultatul n
ordinea sortat fr a utiliza vectori suplimentari n afara lui A i C. (Indicaie: legai elementele
tabloului A avnd aceleai chei n liste. Unde exist un spaiu liber pentru pstrarea pointerilor
listei nlnuite?)
152 Capitolul 9 Sortare n timp liniar
9.2-5 Date fiind n numere ntregi din intervalul [1,k], preprocesai datele de intrare i apoi
rspundei ntr-un timp O(1) la orice interogare privind numrul total de valori ntregi dintre
cele n, care se situeaz n intervalul [a..b]. Algoritmul propus ar trebui s foloseasc un timp de
preprocesare O(n + k).
Figura 9.3 Modul de funcionare al algoritmului de ordonare pe baza cifrelor pe o list de apte nu-
mere a cte 3 cifre. Prima coloan este intrarea. Celelalte coloane prezint lista dup sortri succesive n
funcie de poziiile cifrelor n ordinea cresctoare a semnificaiei. Sgeile verticale indic poziia cifrei
dup care s-a sortat pentru a produce fiecare list din cea precedent.
stabil: prima dup zi, urmtoarea dup lun, i ultima dup an.
Pseudocodul pentru algoritmul de ordonare pe baza cifrelor este evident. Urmtoarea pro-
cedur presupune c ntr-un tablou A avnd n elemente, fiecare element are d cifre; cifra 1 este
cifra cu ordinul cel mai mic, iar cifra d este cifra cu ordinul cel mai mare.
Ordonare-Pe-Baza-Cifrelor(A, d)
1: pentru i 1, d execut
2: folosete o sortare stabil pentru a sorta tabloul A dup cifra i
Exerciii
9.3-1 Folosind figura 9.3 ca model, ilustrai modul de fucionare al algoritmului Ordonare-
Pe-Baza-Cifrelor pe urmtoarea list de cuvinte n limba englez: COW, DOG, SEA, RUG,
ROW, MOB, BOX, TAB, BAR, EAR, TAR, DIG, BIG, TEA, NOW, FOX.
154 Capitolul 9 Sortare n timp liniar
9.3-2 Care din urmtorii algoritmi de sortare sunt stabili: sortarea prin inserie, sortarea prin
interclasare, heapsort i sortarea rapid? Realizai o schem simpl care s fac stabil orice
algoritm de sortare. Ct timp i spaiu suplimentar necesit schema realizat?
9.3-3 Demonstrai prin inducie c algoritmul de ordonare pe baza cifrelor funcioneaz corect.
Unde avem nevoie n demonstraie de presupunerea c sortarea intermediar este stabil?
9.3-4 Artai cum se sorteaz n ntregi din intervalul [1, n2 ] n timp O(n).
9.3-5 ? Determinai numrul exact de treceri necesare pentru a sorta numere zecimale avnd
d cifre, n cel mai defavorabil caz, pentru primul algoritm din acest capitol pentru ordonarea
cartelelor. De cte teancuri de cartele ar avea nevoie un operator pentru a urmri aceast sortare?
Figura 9.4 Funcionarea algoritmului Ordonare-Pe-Grupe. (a) Tabloul de intrare A[1..10]. (b)
Tabloul B[0..9] al listelor (reprezentnd grupele) sortate dup linia a cincea a algoritmului. Grupa i
cuprinde valorile din intervalul [i/10, (i + 1)/10). Ieirea sortat const dintr-o concatenare n ordine a
listelor B [0], B [1] , ..., B [9].
presupunem, fr a pierde din generalitate, c i0 < j 0 . Cnd listele lui B sunt concatenate n
linia 6, elementele grupei B[i0 ] apar naintea elementelor lui B [j 0 ], i astfel A [i] precede A [j] n
secvena de ieire. Deci trebuie s artm c A [i] A [j]. Presupunnd contrariul, avem
i0 = bnA[i]c bnA[j]c = j 0 ,
ceea ce este o contradicie, ntruct i0 < j 0 . Aadar, ordonarea pe grupe funcioneaz corect.
Pentru a analiza timpul de execuie, s observm mai nti c toate liniile, cu excepia liniei
5, necesit, n cel mai defavorabil caz, timpul O(n). Timpul total pentru a examina n linia 5
toate grupele este O(n) i, astfel, singura parte interesant a analizei este timpul consumat de
sortrile prin inserie din linia 5.
Pentru a analiza costul sortrilor prin inserie, fie ni o variabil aleatoare desemnnd numrul
de elemente din grupa B[i]. ntruct sortarea prin inserie se execut n timp ptratic
(vezi
seciunea 1.2), timpul necesar sortrii elementelor n grupele B [i] este E O n2i = O E n2i .
n consecin, timpul mediu total necesar sortrii tuturor elementelor n toate grupele va fi
n1
n1 !
X X
2 2
O E ni = O E ni . (9.1)
i=0 i=0
Pentru a evalua aceast sum trebuie s determinm distribuia pentru fiecare variabil
aleatoare ni . Avem n elemente n n grupe. Probabilitatea ca un element dat s intre ntr-o grup
B [i] este 1/n, ntruct fiecare grup este responsabil pentru 1/n elemente din intervalul [0, 1).
Astfel, situaia este asemntoare cu exemplul aruncatului mingii din seciunea (6.6.2): avem n
mingi (elemente) i n cutii (reprezentnd grupele), i fiecare minge este aruncat independent, cu
probabilitatea p = 1/n de a intra ntr-o anume grup. Astfel, probabilitatea ca ni = k urmeaz o
distribuie binomial b(k; n, p) care are media E [ni ] = np = 1 i varianta V ar [ni ] = np(1 p) =
156 Capitolul 9 Sortare n timp liniar
9.4.1. Exerciii
9.4-1 Utiliznd ca model figura 9.4, ilustrai modul de funcionare al algoritmului Ordonare-
Pe-Grupe pe tabloul A = h.79, .13, .16, .64, .39, .20, .89, .53, .71, .42i.
9.4-2 Care este timpul de execuie n cazul cel mai defavorabil pentru algoritmul de ordonare
pe grupe? Ce modificare simpl a algoritmului pstreaz timpul mediu liniar de execuie i face
ca timpul de execuie n cazul cel mai defavorabil s fie O(n lg n)?
9.4-3 ? Se dau n puncte n cercul unitate, pi = (xi , yi ), astfel nct 0 < x2i + yi2 1 pentru
i = 1, 2, ..., n. Presupunei c punctele sunt uniform distribuite, adic probabilitatea de a gsi
un punct n orice regiune a cercului este proporional cu aria acelei regiuni. Scriei un algoritm
n timpul
p mediu (n) care s sorteze cele n puncte n funcie de distanele fa de origine
di = x2i + yi2 . (Indicaie: proiectai dimensiunile grupelor din Ordonarea-Pe-Grupe pentru
a reflecta distribuia uniform a punctelor n cercul unitate.)
9.4-4 ? O funcie de distribuie a probabilitii P (x) pentru variabila aleatoare X este
definit de P (x) = Pr{X x}. Considerai o list de n numere cu o funcie de distribuie de
probabilitate continu P care este calculabil n timpul O(1). Artai cum se sorteaz numerele
n timp mediu liniar.
Probleme
9-1 Marginile inferioare n cazul mediu la sortarea prin comparaii
n aceast problem demonstrm o margine inferioar (n lg n) a timpului mediu de execuie
pentru orice sortare prin comparaii determinist sau aleatoare efectuat pe n date de intrare.
ncepem prin examinarea unei sortri prin comparaii deterministe A avnd arborele de decizie
TA . Presupunem c fiecare permutare a intrrilor lui A apare cu o probabilitate constant.
a. S presupunem c fiecare frunz a lui TA este etichetat cu probabilitatea de a fi atins
n cazul unor date de intrare aleatoare. Demonstrai c exact n! frunze sunt etichetate cu
1/n! i c restul sunt etichetate cu 0.
b. Fie D(T ) lungimea drumului extern a arborelui T ; adic, D(T ) este suma adncimilor
tuturor frunzelor lui T . Fie T un arbore avnd k > 1 frunze, i fie LT i RT subarborii
stng i drept ai lui T . Artai c D(T ) = D(LT ) + D(RT ) + k.
c. Fie d(k) valoarea minim a lui D(T ) pe toi arborii de decizie T avnd k > 1 frunze.
Artai c d(k) = min1ik1 {d(i) + d(k i) + k}. (Indicaie: Considerai un arbore T
avnd k frunze care atinge minimul. Fie i numrul de frunze din LT i k i numrul de
frunze din RT .)
Probleme 157
f. Artai c, pentru orice sortare aleatoare prin comparaii B, exist o sortare determinist
prin comparaii A care nu face n medie mai multe comparaii dect B.
a. S presupunem c avem de sortat un tablou cu n articole i cheia fiecrui articol are valoarea
0 sau 1. Realizai un algoritm simplu, de timp liniar, care s sorteze pe loc cele n articole.
Pe lng memoria necesar reprezentrii tabloului, putei folosi un spaiu suplimentar de
memorie avnd dimensiune constant.
b. Poate sortarea realizat la punctul (a) s fie utilizat pentru o ordonare pe baza cifrelor
de timp O(bn) a n articole avnd chei de b-bii? Explicai cum sau de ce nu.
c. S presupunem c cele n nregistrri au chei n intervalul [1, k]. Artai cum se poate
modifica sortarea prin numrare astfel nct nregistrrile s poat fi sortate pe loc n
timpul O(n + k). Putei folosi un spaiu suplimentar de memorie de ordinul O(k), pe lng
tabloul de intrare. (Indicaie: Cum ai realiza acest lucru pentru k = 3?)
Note bibliografice
Modelul arborelui de decizie pentru studiul sortrilor prin comparaii a fost introdus de
ctre Ford i Johnson [72]. Tratatul cuprinztor al lui Knuth asupra sortrii [123] acoper multe
variaii pe problema sortrii, inclusiv marginea inferioar teoretic asupra complexitii sortrii
prezentate aici. Marginile inferioare pentru sortare folosind generalizrile modelului arborelui de
decizie au fost studiate exhaustiv de ctre Ben-Or [23].
Knuth i atribuie lui H.H. Seward inventarea sortrii prin numrare n 1954 i a ideii de
combinare a sortrii prin numrare cu ordonare pe baza cifrelor. Ordonarea pe baza cifrelor dup
cea mai puin semnificativ cifr pare s fie un algoritm popular, larg utilizat de ctre operatorii
mainilor mecanice de sortare a cartelelor. Conform lui Knuth, prima referin publicat a
metodei este un document din 1929 aparinnd lui L.J. Comrie, ce descrie echipamentul pentru
cartele perforate. Ordonarea pe grupe a fost utilizat ncepnd cu 1956, cnd ideea de baz a
fost propus de E.J. Isaac i R.C. Singleton.
10 Mediane i statistici de ordine
A i-a statistic de ordine a unei mulimi de n elemente este al i-lea cel mai mic element.
De exemplu, minimul unei mulimi de elemente este prima statistic de ordine (i = 1), iar
maximul este a n-a statistic de ordine (i = n). Intuitiv, o median este punctul de la
jumtatea drumului unei mulimi. Cnd n este impar, mediana este unic, i apare pe poziia
i = (n + 1)/2. Cnd n este par, exist dou mediane, care apar pe poziiile i = n/2 i i = n/2 + 1.
Astfel, indiferent de paritatea lui n, medianele apar pe poziiile i = b(n + 1/2)c (mediana
inferioar) i i = d(n + 1/2)e (mediana superioar). Pentru simplificare, vom folosi de acum
nainte termenul median cu sensul de median inferioar.
Acest capitol trateaz problema selectrii celei de-a i-a statistici de ordine dintr-o mulime
de n numere distincte. Presupunem c mulimea conine numere distincte, dei teoretic tot ce
facem se extinde la situaia n care o mulime conine valori nu neaprat distincte. Problema
seleciei poate fi enunat riguros dup cum urmeaz:
Problema seleciei poate fi rezolvat n timp O (n lg n), ntruct numerele se pot sorta
utiliznd heapsort sau sortarea prin interclasare i apoi, indexnd, pur i simplu al i-lea element
din tabloul de ieire. Exist totui i algoritmi mai rapizi.
n seciunea 10.1 se examineaz problema selectrii minimului i maximului unei mulimi
de elemente. Mai interesant este problema seleciei generale, detaliat n urmtoarele dou
seciuni. Seciunea 10.2 analizeaz un algoritm practic care atinge o margine O(n) n timp
mediu de execuie. Seciunea 10.3 conine un algoritm de interes mai mult teoretic care atinge
timpul de execuie O(n) n cel mai defavorabil caz.
Minim(A)
1: min A [1]
2: pentru i 2, lungime[A] execut
3: dac min > A[i] atunci
4: min A[i]
5: returneaz min
Este acesta cel mai bun algoritm? Da, ntruct putem obine o margine inferioar pentru
n1 comparaii n problema determinrii minimului. S ne gndim la un algoritm care determin
minimul n cazul unui campionat. Fiecare comparaie reprezint un meci al campionatului pe care
l ctig cel mai mic dintre dou elemente. Observaia cheie este c fiecare element, cu excepia
nvingtorului, trebuie s piard cel puin un meci. Deci, pentru a determina minimul, sunt
necesare n 1 comparaii, iar algoritmul Minim este optim n privina numrului de comparaii
realizate.
Un punct interesant al analizei este determinarea numrului mediu de execuii ale liniei 4.
Problema 6-2 v cere s demonstrai c aceast medie este (lg n).
Exerciii
10.1-1 Artai c al doilea cel mai mic dintre n elemente poate fi determinat, n cel mai
defavorabil caz, prin n + dlg ne 2 comparaii. (Indicaie: Gsii i cel mai mic element.)
10.1-2 ? Artai c, n cel mai defavorabil caz, sunt necesare d3n/2e 2 comparaii pentru a
determina maximul i minimul a n elemente. (Indicaie: Studiai cte numere pot fi potenial
maximul sau minimul, i cercetati cum afecteaz o comparaie aceste calcule.)
Dup execuia procedurii Partiie-Aleatoare din linia 3 a algoritmului, tabloul A [p..r] este
partiionat n dou subtablouri nevide A [p..q] i A [q + 1..r] astfel nct fiecare element al lui
A [p..q] este mai mic dect fiecare element al lui A [q + 1..r]. Linia 4 a algoritmului calculeaz
numrul k de elemente al subtabloului A [p..q]. Algoritmul determin n care dintre subtablourile
A [p..q] i A [q + 1..r] se situeaz al i-lea cel mai mic element. Dac i k, atunci elementul dorit
se situeaz n partea inferioar a partiiei, i este selectat recursiv din subtabloul accesat n linia
6. Dac i > k, elementul dorit se situeaz n partea superioar a partiiei. ntruct cunoatem
deja k valori mai mici dect al i-lea cel mai mic element al lui A[p..q] adic elementele lui
A[p..r] elementul cutat este al i k-lea cel mai mic element al lui A[q + 1..r], care este gsit
recursiv n linia 8.
Timpul de execuie, n cazul cel mai defavorabil, pentru Selecie-Aleatoare este (n2 ),
chiar i pentru gsirea minimului, pentru c am putea fi extrem de nenorocoi i s partiionm
n jurul celui mai mare element rmas. Algoritmul lucreaz bine n cazul mediu, dei, deoarece
este aleator, nu exist date de intrare particulare care s provoace comportamentul celui mai
defavorabil caz.
Putem obine o margine superioar T (n) pe timpul mediu necesar algoritmului Selecie-
Aleatoare pe un tablou de intrare de n elemente, dup cum urmeaz. Am vzut n seciunea
8.4 c algoritmul Partiie-Aleatoare produce o partiie a crei component inferioar are un
singur element cu probabilitatea 2/n i i elemente cu probabilitatea 1/n pentru i = 2, 3, ..., n 1.
Presupunnd c T (n) este monoton cresctor, n cazul cel mai defavorabil Selecie-Aleatoare
este ntotdeauna nenorocos n sensul c cel de-al i-lea element este localizat pe zona cea mai mare
a partiiei. Astfel, obinem recurena
n1
!
1 X
T (n) T (max (1, n 1)) + T (max (k, n k)) + O(n)
n
k=1
n1
X n1
1 2 X
T (n 1) + 2 T (k) + O(n) = T (k) + O(n).
n n
k=dn/2e k=dn/2e
10.3. Selecia n timp liniar n cazul cel mai defavorabil 161
Exerciii
10.2-1 Scriei versiunea iterativ a algoritmului Selecie-Aleatoare.
10.2-3 Amintim c dac exist elemente egale atunci procedura Partiie-Aleatoare parti-
ioneaz subtabloul A[p..r] n dou subtablouri nevide A[p..q] i A[q + 1..r], astfel nct fiecare
element din A[p..q] este mai mic sau egal dect fiecare element din A[q + 1..r]. Dac exist
elemente egale, mai funcioneaz corect procedura Selecie-Aleatoare?
Algoritmul Selecie determin al i-lea cel mai mic element al unui tablou de intrare de n
elemente, efectund urmtorii pai. (Dac n = 1, atunci Selecie returneaz singura dat de
intrare a ei, ca fiind a i-a cea mai mic valoare.)
1. Se mpart cele n elemente ale tabloului de intrare n bn/5c grupe de cte 5 elemente fiecare
i cel mult un grup s conin restul de n mod 5 elemente.
2. Se determin mediana fiecruia din cele dn/5e grupe cu sortarea prin inserie, ordonnd
elementele fiecrui grup (care are cel mult 5 elemente) apoi se aleg medianele din listele
sortate, corespunztoare grupelor. (Dac grupul are un numr par de elemente se va
considera cea mai mare dintre cele dou mediane.)
3. Se utilizeaz recursiv Selecie pentru a gsi mediana x din cele dn/5e mediane gsite la
pasul 2.
4. Se partiioneaz tabloul de intrare n jurul medianei medianelor x, utiliznd o versiune
modificat a algoritmului Partiie. Fie k numrul de elemente de pe latura inferioar a
partiiei, astfel nct s fie n k elemente pe latura superioar.
5. Se utilizeaz recursiv Selecie pentru a gsi al i-lea cel mai mic element de pe latura
inferioar dac i k, sau al (i k)-lea cel mai mic element de pe latura superioar dac
i > k.
Pentru a analiza timpul de execuie a lui Selecie, determinm mai nti o margine inferioar
a numrului de elemente care sunt mai mari dect elementul de partiionare x. Figura 10.1 ajut
la vizualizarea acestei contabilizri. Cel puin jumtate dintre medianele gsite la pasul 2 sunt
mai mari sau egale cu mediana medianelor, x. Astfel, cel puin jumtate din cele dn/5e grupe au
cte 3 elemente mai mari dect x, cu excepia singurului grup care are mai puin de 5 elemente
dac n nu este divizibil cu 5, i a singurului grup care l conine pe x. Eliminnd aceste dou
grupuri, rezult c numrul elementelor mai mari dect x este cel puin
l m
1 n 3n
3 2 6.
2 5 10
Similar, numrul elementelor mai mici dect x este cel puin 3n/10 6. Astfel, n cel mai
defavorabil caz, Selecie este apelat recursiv la pasul 5 pentru cel mult 7n/10 + 6 elemente.
Putem construi o recuren pentru timpul de execuie T (n), n cazul cel mai defavorabil, al
algoritmului Selecie. Paii 1, 2 i 4 necesit timpul O(n). (Pasul 2 const din O(n) apeluri
pentru sortarea prin inserie pe mulimi de mrimea O(1).) Pasul 3 necesit timpul T (dn/5e), iar
pasul 5 necesit cel mult T (7n/10 + 6), presupunnd c T este monoton cresctor. De reinut c
7n/10 + 6 < n pentru n > 20 i c orice date de intrare de 80 sau mai puine elemente necesit
timpul O(1). Obinem deci recurena
(1) dac n 80,
T (n)
T (dn/5e) + T (7n/10 + 6) + O(n) dac n > 80.
Demonstrm prin substituie c timpul de execuie este liniar. Presupunem c T (n) cn pentru
o anume constant c i toi n 80. Substituind aceast ipotez inductiv n partea dreapt a
recurenei obinem
T (n) c dn/5e + c(7n/10 + 6) + O(n) cn/5 + c + 7cn/10 + 6c + O(n)
9cn/10 + 7c + O(n) cn,
10.3. Selecia n timp liniar n cazul cel mai defavorabil 163
Figura 10.1 Analiza algoritmului Selecie. Cele n elemente sunt reprezentate prin mici cercuri, i
fiecare grup ocup o coloan. Medianele grupurilor sunt colorate n alb, iar mediana medianelor x este
etichetat. Sgeile sunt trasate de la elementele mai mari spre cele mai mici; se poate vedea c cele 3
elemente din dreapta lui x din fiecare grup de cte 5 sunt mai mari dect x, i c cele 3 elemente din
stnga lui x din fiecare grup de cte 5 elemente sunt mai mici dect x. Elementele mai mari dect x
sunt situate pe un fond mai nchis.
ntruct putem s alegem un c suficient de mare astfel nct c(n/10 7) s fie mai mare dect
funcia descris de termenul O(n) pentru orice n > 80. Timpul de execuie T (n) al algoritmului
Selecie, n cazul cel mai defavorabil, este deci liniar.
La fel ca i n cazul sortrii prin comparaii (vezi seciunea 9.1), Selecie i Selecie-
Aleatoare determin informaia despre ordinea relativ a elementelor numai prin compararea
lor. Astfel, timpul liniar nu este un rezultat al unor presupuneri despre datele de intrare, cum a
fost cazul algoritmilor de sortare din capitolul 9. Sortarea necesit timpul (n lg n) n modelul
bazat pe comparaii, chiar n cazul mediu (vezi problema 9-1), i astfel metoda sortrii i indexrii
prezentat n introducerea acestui capitol este asimptotic ineficient.
Exerciii
10.3-1 n algoritmul Selecie elementele de intrare sunt mprite n grupe de cte 5. Va mai
funciona algoritmul n timp liniar dac ele sunt mprite n grupe de cte 7? Argumentai c
Selecie nu se va executa n timp liniar dac grupele conin cte 3 elemente.
10.3-2 Analizai procedura Selecie i artai c numrul elementelor mai mari dect mediana
medianelor x i numrul elementelor mai mici dect x este cel puin dn/4e dac n 38.
10.3-3 Artai cum poate fi modificat algoritmul de sortare rapid astfel nct s se execute n
timpul O(n lg n) n cel mai defavorabil caz.
10.3-5 Fiind dat o procedur de tip cutie neagr, care n cazul cel mai defavorabil determin
mediana n timp liniar, proiectai un algoritm simplu, care s rezolve problema seleciei pentru
orice statistic de ordine n timp liniar.
164 Capitolul 10 Mediane i statistici de ordine
Figura 10.2 Vrem s determinm poziia conductei de petrol est-vest care mimimizeaz lungimea
total a racordurilor nord-sud.
10.3-6 k-cuantilele unei mulimi de n elemente sunt cele k 1 statistici de ordine care mpart
mulimea sortat n k mulimi de mrimi egale (cu cel puin un element). Realizai un algoritm
n timpul O (n lg k) care s listeze k-cuantilele unei mulimi.
10.3-7 Descriei un algoritm de timp O(n) care, fiind dat o mulime S de n numere distincte i
un ntreg pozitiv k n, determin cele k numere din S care sunt cele mai apropiate de mediana
lui S.
10.3-8 Fie X [1..n] i Y [1..n] dou tablouri ce conin fiecare n numere deja sortate. Scriei un
algoritm de timp O(lg n) care gsete mediana tuturor celor 2n elemente din tablourile X i Y .
10.3-9 Profesorul Olay acord consultaii unei companii petroliere, care plnuiete realizarea
unei mari conducte ce trece de la est la vest printr-un cmp de petrol cu n puuri. La fiecare pu
trebuie conectat direct la conducta principal o conduct de pompare (racord) care s fie de-a
lungul celui mai scurt drum (fie nord, fie sud), ca n figura 10.2. Cunoscndu-se coordonatele
x i y ale puurilor, cum trebuie profesorul s localizeze optim conducta principal (cea care
minimizeaz lungimea total a racordurilor)? Artai c poziia optim poate fi determinat n
timp liniar.
Probleme
10-1 Cele mai mari i numere n ordine sortat
Fiind dat o mulime de n numere, dorim s gsim cele mai mari i numere n ordinea sortat,
folosind un algoritm bazat pe comparaii. Descriei un algoritm optim care implementeaz fiecare
dintre metodele urmtoare, i analizai timpii de execuie ai metodelor n funcie de n i i.
Probleme 165
i
X 1
wi .
xi >xk
2
a. Descriei un algoritm care folosete Ui (n) comparaii pentru a determina al i-lea cel mai
mic element dintre n elemente, unde i n/2 i
T (n) dac n 2i,
Ui (n) =
n/2 + Ui (n/2) + T (2i) n caz contrar.
Note bibliografice
Algoritmul de timp liniar n cel mai defavorabil caz pentru determinarea medianei a fost
inventat de ctre Blum, Floyd, Pratt, Rivest i Tarjan [29]. Versiunea algoritmului pentru un timp
mediu rapid se datoreaz lui Hoare [97]. Floyd i Rivest [70] au dezvoltat o versiune mbuntit
a timpului mediu care partiioneaz n jurul unui element selectat recursiv dintr-o mostr mic
de elemente.
III Structuri de date
Introducere
Mulimea ca noiune fundamental este la fel de important n informatic ca i n matema-
tic. n timp ce mulimile matematice sunt nemodificabile, mulimile manipulate de algoritmi
pot crete, descrete sau, n restul cazurilor,se pot modifica n timp. Astfel de mulimi se numesc
dinamice. Urmtoarele cinci capitole prezint tehnici de baz pentru reprezentarea mulimilor
dinamice finite i pentru manipularea lor de ctre calculator.
n funcie de algoritmi, sunt necesare diferite tipuri de operaii pentru a fi executate asupra
mulimilor. De exemplu, muli algoritmi au nevoie doar de posibilitatea de a insera elemente
ntr-o mulime, de a terge elemente dintr-o mulime sau de a testa apartenena la o mulime.
O mulime dinamic ce suport aceste operaii este numit dicionar . Ali algoritmi necesit
operaii mai complicate. De exemplu, cozile de prioritate, care sunt introduse n capitolul 7 n
contextul structurii de date ansamblu, suport operaiile de inserare a unui element i extragere a
celui mai mic element dintr-o mulime. Deci nu e surprinztor faptul c cea mai bun modalitate
de a implementa o mulime dinamic depinde de operaiile pe care trebuie s le ofere.
Caut(S,k) O interogare care, fiind date o mulime S i o valoare cheie k, returneaz un pointer
x la un element din S astfel nct cheie[x] = k sau nil dac nu exist un astfel de element
n S.
Introducere 169
terge(S,x) O operaie de modificare care, fiind dat un pointer x la un element din mulimea
S, terge x din S. (Observai c aceast operaie folosete un pointer la un element x i nu
o valoare a cheii).
Minim(S) O interogare pe o mulime total ordonat S care returneaz elementul din mulimea
S cu cea mai mic valoare a cheii.
Maxim(S) O interogare pe o mulime total ordonat S care returneaz elementul din mulimea
S cu cea mai mare valoare a cheii.
Succesor(S,x) O interogare care, fiind dat un element x a crui cheie este dintr-o mulime S
total ordonat, returneaz elementul urmtor mai mare dect x din S sau nil dac x este
elementul maxim.
Predecesor(S,x) O interogare care, fiind dat un element x a crui cheie este dintr-o mulime
S total ordonat, returneaz elementul urmtor mai mic dect x din S sau nil dac x este
elementul minim.
operaie este O(lg n). Arborii de cutare binar au rol de baz pentru multe alte structuri de
date.
Arborii rounegru, o variant a arborilor de cutare binar, sunt introdui n capitolul 14.
Spre deosebire de arborii de cutare binar obinuii, arborii rounegru prezint garania unei
execuii bune: operaiile necesit un timp O(lg n) n cazul cel mai defavorabil. Un arbore rou
negru este un arbore de cutare echilibrat; capitolul 19 prezint un alt tip de arbori de cutare
echilibrai, numii Barbori. Dei mecanismul arborilor rounegru este ntr-o oarecare msur
greu de urmrit, majoritatea proprietilor lor se poate deduce din capitolul respectiv, fr a
studia mecanismul n detaliu. Oricum, parcurgerea codului poate fi instructiv n sine.
n capitolul 15 vom arta cum se pot mbogi arborii rou negru pentru a suporta alte
operaii, n afara celor de baz prezentate mai sus. n primul rnd, i vom mbogi astfel nct
s putem pstra dinamic o statistic de ordine pentru o mulime de chei. Apoi, i vom mbogi
ntr-o manier diferit pentru a memora intervale de numere reale.
11 Structuri de date elementare
n acest capitol vom examina reprezentarea mulimilor dinamice ca structuri de date simple
care utilizeaz referine. Dei multe structuri de date complexe pot fi modelate folosind pointeri,
le vom prezenta doar pe cele elementare: stive, cozi, liste nlnuite i arbori cu rdcin. De
asemenea, vom prezenta o metod prin care obiectele i pointerii pot fi sintetizai din tablouri.
Stive
Operaia Insereaz asupra stivelor este deseori denumit Pune-n-Stiv, iar operaia
terge, care nu cere nici un argument, este deseori numit Scoate-Din-Stiv. Aceste nume
sunt aluzii la stivele fizice, ca de exemplu un vraf de farfurii. Ordinea n care sunt luate farfuriile
din vraf este ordinea invers n care au fost introduse n vraf, deoarece doar ultima farfurie este
accesibil.
Aa cum se vede n figura 11.1, o stiv cu cel mult n elemente poate fi implementat printr-
un tablou S[1..n]. Tabloul are un atribut v arf [S] care este indicele celui mai recent introdus
element. Stiva const din elementele S[1..v arf [S]], unde S[1] este elementul de la baza stivei, iar
S[varf [S]] este elementul din vrful stivei.
Cnd v arf [S] = 0, stiva nu conine nici un element i deci este vid. Se poate testa dac
stiva este vid prin operaia de interogare Stiv-Vid.
Dac se ncearc extragerea (se apeleaz operaia Scoate-Din-Stiv) unui element dintr-o
stiv vid, spunem c stiva are depire inferioar, care n mod normal este o eroare. Dac
vrf [S ] depete valoarea n, stiva are depire superioar. (n implementarea noastr n
pseudocod, nu ne vom pune problema depirii stivei.)
Fiecare dintre operaiile stivei pot fi implementate prin doar cteva linii de cod.
Stiv-Vid(S )
1: dac vrf[S] = 0 atunci
2: returneaz adevrat
3: altfel
4: returneaz fals
172 Capitolul 11 Structuri de date elementare
Figura 11.1 Implementarea unei stive S printr-un tablou. Elementele stivei apar doar n poziiile
haurate folosind o culoare deschis. (a) Stiva S are 4 elemente. Elementul din vrful stivei este 9.
(b) Stiva S dup apelurile Pune-n-Stiv (S,17) i Pune-n-Stiv(S,3). (c) Stiva S dup ce apelul
Scoate-Din-Stiv (S) a ntors ca rezultat elementul 3, care este cel mai recent introdus. Dei elementul
3 apare n continuare n tabel, el nu mai este n stiv; elementul din vrful stivei este 17.
Pune-n-Stiv(S, x)
1: vrf[S] vrf[S] + 1
2: S[vrf[S]] x
Scoate-Din-Stiv(S)
1: dac Stiv-Vid(S ) atunci
2: eroare depire inferioar
3: altfel
4: vrf[S] vrf[S] - 1
5: returneaz S[vrf[S]+1]
Cozi
Vom numi Pune-n-Coad operaia Insereaz aplicat asupra unei cozi, iar operaia
terge o vom numi Scoate-Din-Coad; asemntor operaiei Scoate-Din-Stiv aplicat
stivei, Scoate-Din-Coad nu necesit nici un argument. Principiul FIFO, propriu cozii, impune
ca aceasta s opereze asemntor cu un rnd de oameni ce ateapt la un ghieu. Coada are un
cap i o coad. Cnd un element este pus n coad, ocup locul de la sfritul cozii, ca i un
nou venit ce i ia locul la coada rndului. Elementul scos din coad este ntotdeauna cel din
capul cozii, asemntor persoanei din capul rndului care a ateptat cel mai mult. (Din fericire,
nu trebuie s ne ngrijorm din cauza elementelor care se bag n fa.)
Figura 11.2 ilustreaz o modalitate de a implementa o coad avnd cel mult n 1 elemente,
folosind un tablou Q[1..n]. Coada are un atribut cap[Q] care conine indicele capului ei. Atributul
coada[Q] conine indicele noii locaii n care se va insera n coad elementul nou venit. Elementele
din coad se afl n locaiile cap[Q], cap[Q] + 1, ..., coad
a[Q] 1, iar indicii se parcurg circular, n
sensul c locaia 1 urmeaz imediat dup locaia n. Cnd cap[Q] = coad a[Q] coada este goal.
Iniial avem cap[Q] = coad a[Q] = 1. Cnd coada este vid, o ncercare de a scoate un element din
coad cauzeaz o depire inferioar n coad. Cnd cap[Q] = coad a[Q] + 1, coada este plin
i o ncercare de a pune n coad cauzeaz o depire superioar n coad.
n Pune-n-Coad i Scoate-Din-Coad, verificarea erorilor de depire inferioar a fost
omis. (Exerciiul 11.1-4 cere scrierea codului ce verific aceste dou condiii de eroare.)
11.1. Stive i cozi 173
Figura 11.2 O coad implementat utiliznd un tablou Q[1..12]. Elementele cozii apar doar n poziiile
cu haur deschis. (a) Coada are 5 elemente, n locaiile Q[7..11]. (b) Configuraia cozii dup apelurile
Pune-n-Coad (Q,17), Pune-n-Coad(Q,3), Pune-n-Coad(Q,5). (c) Configuraia cozii dup ce
apelul Scoate-Din-Coad(Q) returneaz valoarea cheii 15, ce s-a aflat anterior n capul cozii. Noul
cap are cheia 6.
Pune-n-Coad(Q, x)
1: Q[coada[Q]] x
2: dac coada[Q] = lung[Q] atunci
3: coada[Q] 1
4: altfel
5: coada[Q] coad
a[Q] + 1
Scoate-Din-Coad(Q)
1: x Q[cap[Q]]
2: dac cap[Q] = lung[Q] atunci
3: cap[Q] 1
4: altfel
5: cap[Q] cap[Q] + 1
6: returneaz x
Exerciii
11.1-1 Folosind ca model figura 11.1, ilustrai efectul fiecreia dintre operaiile Pune-
n-Stiv(S, 4), Pune-n-Stiv(S, 1), Pune-n-Stiv(S, 3), Scoate-Din-Stiv(S), Pune-n-
Stiv(S, 8), Scoate-Din-Stiv(S) pe o stiv iniial vid, memorat ntr-un tablou S[1..6].
174 Capitolul 11 Structuri de date elementare
11.1-2 Explicai cum se pot implementa dou stive ntr-un singur tablou A[1..n] astfel nct
nici una dintre stive s nu aib depire superioar, cu excepia cazului n care numrul total de
elemente din ambele stive (mpreun) este n. Operaiile Pune-n-Stiv i Scoate-Din-Stiv
trebuie s funcioneze ntr-un timp O(1).
11.1-3 Folosind ca model figura 11.2, ilustrai efectul fiecreia dintre operaiile Pune-n-
Coad(Q, 4), Pune-n-Coad(Q, 1), Pune-n-Coad(Q, 3), Scoate-Din-Coad(Q), Pune-
n-Coad(Q, 8) i Scoate-Din-Coad (Q) pe o coad Q, iniial vid, a memorat ntr-un tablou
Q[1..6].
11.1-5 n timp ce stiva permite inserarea i tergerea de elemente doar la un singur capt, iar
coada permite inserarea la un capt i tergerea la cellalt capt, o coad complet permite
inserri i tergeri la ambele capete. Scriei patru proceduri cu timpul de execuie O(1) pentru
inserare de elemente i tergere de elemente la ambele capete ale unei cozi complete implementat
printr-un tablou.
11.1-6 Artai cum se poate implementa o coad prin dou stive. Analizai timpul de execuie
pentru operaiile cozii.
11.1-7 Artai cum se poate implementa o stiv prin dou cozi. Analizai timpul de execuie
pentru operaiile stivei.
Figura 11.3 (a) O list dublu nlnuit L reprezentnd mulimea dinamic {1, 4, 9, 16}. Fiecare
element din list este un obiect avnd cmpuri pentru cheie i doi pointeri (ilustrai prin sgei)
la elementul urmtor, respectiv anterior. Cmpul urm al cozii i cmpul prec al capului sunt nil,
lucru indicat printr-un slash. Atributul cap[L] refer capul listei. (b) Dup execuia lui List-
Insereaz(L, x), unde cheie[x] = 25, capul listei nlnuite este un nou obiect avnd cheia 25. Acest
nou obiect refer vechiul cap avnd cheia 9. (c) Rezultatul apelului List-terge(L, x), unde x refer
obiectul avnd cheia 4.
Pentru a cuta ntr-o list avnd n obiecte, procedura List-Caut necesit un timp (n)
n cazul cel mai defavorabil, deoarece va trebui s caute n toat lista.
Figura 11.3(c) ilustreaz cum se terge un element dintr-o list nlnuit. List-terge se
execut ntr-un timp O(1), dar dac dorim s tergem un element avnd o cheie dat, timpul
necesar pentru cazul cel mai defavorabil este (n), pentru c nainte trebuie s apelm List-
Caut.
Santinele
Codul pentru List-terge ar fi mai simplu dac am ignora condiiile extreme de la capul
i coada listei.
List-terge0 (L, x)
1: urm[prec[x]] urm[x]
2: prec[urm[x]] prec[x]
Figura 11.4 O list nlnuit L ce folosete o santinel nil[L] (haurat cu negru) este o list dublu
nlnuit obinuit, transformat ntr-o list circular cu nil[L] pus ntre cap i coad. Atributul cap[L]
nu mai este necesar, deoarece capul listei poate fi accesat prin urm[nil[L]]. (a) O list vid. (b) Lista
nlnuit din figura 11.3(a), avnd cheia 9 n capul listei i cheia 1 n coada listei. (c) Lista dup execuia
procedurii List-Insereaz0 (L, x), unde cheie[x] = 25. Noul obiect devine capul listei. (d) Lista dup
tergerea obiectului avnd cheia 1. Noua coad este obiectul avnd cheia 4.
Folosim procedura (cu dou linii de cod) List-terge0 pentru a terge un element din list.
Vom folosi urmtoarea procedur pentru inserarea unui element n list.
List-Insereaz0 (L, x)
1: urm[x] urm[nil[L]]
2: prec[urm[nil[L]]] x
3: urm[nil[L]] x
4: prec[x] nil[L]
Exerciii
11.2-1 Se poate implementa operaia Insereaz pentru mulimi dinamice pe o list simplu
nlnuit cu un timp de execuie O(1)? Dar operaia terge?
11.2-5 Operaia pentru mulimi dinamice Reunete are ca intrare dou mulimi disjuncte S1
i S2 i returneaz mulimea S = S1 S2 ce conine toate elementele din S1 i S2 . Mulimile S1
i S2 sunt de obicei distruse de ctre operaie. Artai cum se poate realiza Reunete ntr-un
timp O(1) folosind o structur de date de tip list, adecvat.
11.2-6 Scriei o procedur care interclaseaz dou liste simplu nlnuite sortate ntr-o singur
list simplu nlnuit sortat fr a folosi santinele. Apoi, scriei o procedur similar folosind
o santinel avnd cheia pentru a marca sfritul fiecrei liste. Comparai simplitatea codului
pentru fiecare din cele dou proceduri.
11.2-7 Creai o procedur nerecursiv de timp de execuie (n) care inverseaz o list simplu
nlnuit avnd n elemente. Procedura va folosi un spaiu suplimentar de memorie de mrime
constant.
11.2-8 ? Explicai cum se pot implementa liste dublu nlnuite folosind o singur valoare
referin np[x] pentru fiecare obiect, n locul celor dou valori uzuale (urm i prec). Se presupune
c toate valorile pointerilor pot fi interpretate ca i ntregi pe k bii i se definete np[x] ca fiind
np[x] = urm[x] XOR prec[x], sau exclusiv pe k bii dintre urm[x] i prec[x]. (Valoarea nil
e reprezentat de 0.) Acordai atenie descrierii informaiei necesare pentru accesarea capului
listei. Artai cum pot fi implementate operaiile Caut, Insereaz i terge pe o astfel de
list. De asemenea, artai cum se poate inversa o astfel de list ntr-un timp O(1).
Figura 11.5 Lista nlnuit din figura 11.3(a) reprezentat prin tablourile cheie, urm i prec. Fiecare
poriune vertical a tablourilor reprezint un singur obiect. Pointerii memorai corespund indicilor
tablourilor ilustrai n partea de sus; sgeile arat cum trebuie interpretai aceti indici. Poziiile cu
haur deschis ale obiectelor conin elementele listei. Variabila L conine indicele capului.
Figura 11.6 Lista nlnuit din figura 11.3(a) i figura 11.5 reprezentat printr-un singur tablou A.
Fiecare element al listei este un obiect care ocup un subtablou continuu de lungime 3 n cadrul tabloului.
Cele trei cmpuri cheie, urm i prec corespund deplasamentelor 0, 1 i respectiv 2. Pointerul la un obiect
este indicele primului element al obiectului. Obiectele coninnd elementele listei sunt haurate deschis,
iar sgeile indic ordinea n list.
prec al capului, de obicei vom folosi un ntreg (ca 0 sau -1) care nu poate reprezenta un indice
valid n tablouri. O variabil L memoreaz indicele capului listei.
n pseudocodul nostru, am folosit paranteze ptrate pentru a nota att indexarea ntr-un
tablou ct i selecia unui cmp (atribut) aparinnd unui obiect. n ambele cazuri, semnificaia
lui cheie[x], urm[x] i prec[x] este consistent relativ la implementare.
Figura 11.7 Efectul procedurilor Aloc-Obiect i Elibereaz-Obiect. (a) Lista din figura 11.5
(partea cu haur deschis) i o list liber (partea cu haur nchis). Sgeile indic structura listei
libere. (b) Rezultatul apelului Aloc-Obiect() (care returneaz cheia 4), setnd cheie[4] la 25 i al
apelului List-Insereaz(L, 4). Noul cap al listei libere este obiectul 8, care a fost urm[4] n lista liber.
(c) Dup execuia lui List-terge(L, 5), apelm Elibereaz-Obiect(5). Obiectul 5 devine noul cap
al listei libere, cu obiectul 8 urmndu-i n list.
corespunztoare lui cheie, urm i prec sunt 0, 1, respectiv 2. Pentru a citi valoarea lui prec[i]
pentru un pointer i dat, adugm la valoarea i a pointerului deplasamentul 2, citind astfel A[i+2].
Reprezentarea printr-un singur tablou este flexibil n sensul c permite memorarea de obiecte
cu lungimi diferite n acelai tablou. Problema gestionrii unei astfel de colecii eterogene de
obiecte este mult mai dificil dect problema gestionrii unei colecii omogene, n care toate
obiectele au aceleai cmpuri. Deoarece majoritatea structurilor de date pe care le lum n
considerare sunt compuse din elemente omogene, pentru scopurile noastre va fi suficient s folosim
reprezentarea multi-tablou a obiectelor.
Figura 11.8 Dou liste nlnuite L1 (poriunea cu haur deschis) i L2 (cu haur medie) i o list
liber interconectat (cu haur nchis).
curente din mulimea dinamic i restul de m n obiecte sunt libere; obiectele libere pot fi
folosite pentru reprezentarea elementelor ce se vor insera n viitor n mulimea dinamic.
Vom pstra obiectele libere ntr-o list simplu nlnuit, pe care o vom numi list liber.
Lista liber folosete doar tabloul urm, care memoreaz pointerii urm din list. Capul listei libere
este memorat ntr-o variabil global liber. n cazul n care mulimea dinamic reprezentat de
lista nlnuit L este nevid, lista liber se poate ntreese cu lista L, dup cum se observ n
figura 11.7. Observai c fiecare obiect din reprezentare este fie n lista L, fie n lista liber, dar
nu n amndou.
Lista liber este o stiv: urmtorul obiect alocat este cel mai recent eliberat. Putem folosi o
implementare a operaiilor stivei Pune-n-Stiv i Scoate-Din-Stiv folosind o list pentru a
construi procedurile pentru alocarea i, respectiv, eliberarea obiectelor. Presupunem c variabila
global liber folosit n urmtoarele proceduri refer primul element al listei libere.
Aloc-Obiect()
1: dac liber = nil atunci
2: eroare depire de spaiu
3: altfel
4: x liber
5: liber urm[x]
6: returneaz x
Elibereaz-Obiect(x)
1: urm[x] liber
2: liber x
Iniial lista liber conine toate cele n obiecte nealocate. n cazul n care lista liber este
epuizat, procedura Aloc-Obiect semnaleaz o eroare. n mod curent se poate folosi o singur
list liber care s serveasc mai multe liste nlnuite. Figura 11.8 ilustreaz dou liste nlnuite
i o list liber, interconectate prin tablourile cheie, urm i prec.
Cele dou proceduri se execut ntr-un timp O(1), ceea ce le face eficiente. Ele pot fi modificate
astfel nct s funcioneze pentru orice colecie omogen de obiecte, lsnd unul din cmpurile
obiectului s se comporte ca un cmp urm n lista liber.
Exerciii
11.3-1 Desenai o imagine a irului h13, 4, 8, 19, 5, 11i memorat ca o list dublu nlnuit
folosind reprezentarea multi-tablou. Realizai acelai lucru pentru reprezentarea cu un tablou
unic.
182 Capitolul 11 Structuri de date elementare
Arbori binari
Dup cum se observ n figura 11.9 cmpurile p, stnga i dreapta se folosesc pentru a memora
pointerii pentru printe, descendentul stng i descendentul drept al fiecrui nod din arborele
binar T. Dac p[x] = nil, atunci x este rdcina. Dac nodul x nu are descendent stng, atunci
stnga[x] = nil i similar pentru descendentul drept. Rdcina ntregului arbore T este referit
de atributul rdcin[T ]. Dac rdcin[T ] = nil, atunci arborele este vid.
Figura 11.9 Reprezentarea unui arbore binar T. Fiecare nod x are cmpurile p[x] (partea de sus),
stnga[x] (partea din stnga jos) i dreapta[x] (partea din dreapta jos). Cmpurile cheie nu sunt ilustrate.
i dreapta cu f iu1 , f iu2 , ..., f iuk . Aceast schem nu mai funcioneaz atunci cnd numrul de
descendeni ai unui nod este nemrginit, deoarece nu tim cte cmpuri (tablouri n reprezentarea
multi-tablou) s alocm n avans. Mai mult, chiar dac numrul k de descendeni este mrginit
de o constant mare, dar majoritatea nodurilor au un numr mic de descendeni, vom irosi mult
memorie.
Din fericire, exist o schem inteligent de a folosi arbori binari pentru a reprezenta arbori
cu numr arbitrar de descendeni. Ea are avantajul c utilizeaz un spaiu de O(n) pentru ori-
ce arbore cu rdcin i cu n noduri. Reprezentarea descendent-stng, frate-drept este
ilustrat n figura 11.10. Fiecare nod conine un pointer spre printe p, iar rdcin[T ] refer
rdcina arborelui T. n loc s avem un pointer spre fiecare descendent, fiecare nod x are doar
doi pointeri:
Dac nodul x nu are descendeni atunci fiu-stng[x] = nil, iar dac nodul x este cel mai din
dreapta descendent al printelui su atunci frate-drept[x] = nil.
Exerciii
11.4-1 Desenai arborele binar avnd rdcina la indicele 6, care este reprezentat de urmtoarele
cmpuri.
184 Capitolul 11 Structuri de date elementare
Figura 11.10 Reprezentarea descendent-stng, frate-drept a unui arbore T. Fiecare nod x are cmpurile
p[x] (partea de sus), fiu-stng[x] (partea din stnga jos) i frate-drept[x] (partea din dreapta jos). Cheile
nu sunt ilustrate.
indice cheie stnga dreapta
1 12 7 3
2 15 8 nil
3 4 10 nil
4 10 5 9
5 2 nil nil
6 18 1 4
7 7 nil nil
8 14 6 2
9 21 nil nil
10 5 nil nil
11.4-2 Scriei o procedur recursiv cu timp de execuie O(n) care, fiind dat un arbore binar
cu n noduri, tiprete cheia fiecrui nod din arbore.
11.4-3 Scriei o procedur nerecursiv cu timp de execuie O(n) care, fiind dat un arbore binar
cu n noduri, tiprete cheia fiecrui nod din arbore. Folosii o stiv ca o structur auxiliar de
date.
11.4-4 Scriei o procedur cu timp de execuie O(n) care tiprete toate cheile unui arbore
arbitrar cu rdcin avnd n noduri, dac arborele este memorat folosind reprezentarea descen-
dent-stng, frate-drept.
11.4-5 ? Scriei o procedur nerecursiv cu timp de execuie O(n) care, fiind dat un arbore
binar cu n noduri, tiprete cheile fiecrui nod. Folosii numai un spaiu suplimentar constant
n afara arborelui nsui i nu modificai arborele, nici mcar temporar, n timpul procedurii.
11.4-6 ? Reprezentarea descendent-stng, frate-drept a unui arbore arbitrar cu rdcin
folosete trei pointeri n fiecare nod: fiu-stng, frate-drept i printe. Din fiecare nod se pot
atinge i identifica printele i toi descendenii nodului. Artai cum se poate obine acelai
efect, folosind doar doi pointeri i o valoare boolean n fiecare nod.
Probleme 185
Probleme
11-1 Comparaii ntre liste
Pentru fiecare din cele patru tipuri de liste din tabelul urmtor, care este timpul asimptotic
de execuie n cazul cel mai defavorabil pentru fiecare dintre operaiile pe mulimi dinamice
specificate n tabelul urmtor?
nesortat, sortat, nesortat, sortat,
simplu simplu dublu dublu
nlnuit nlnuit nlnuit nlnuit
Caut(L, k)
Insereaz(L, x)
terge(L, x)
Succesor(L, x)
Predecesor(L, x)
Minim(L)
Maxim(L)
Dac ignorm liniile 46 din procedur, atunci avem algoritmul uzual pentru cutarea ntr-
o list nlnuit sortat, n care indicele i refer pe rnd fiecare poziie din list. Liniile 46
ncearc s sar n avans la o poziie j aleas aleator. Un astfel de salt este benefic dac cheie[j]
este mai mare dect cheie[i] i mai mic dect k; ntr-un astfel de caz j marcheaz o poziie n
list prin care i va trebui s treac n timpul unei cutri obinuite n list. Deoarece lista este
compact, tim c orice alegere a lui j ntre 1 i n refer un obiect din list i nu o poziie n lista
liber.
Note bibliografice
Aho, Hopcroft i Ullman [5] i Knuth [121] sunt referine excelente pentru structuri de date
elementare. Gonnet [90] furnizeaz date experimentale asupra performanelor operaiilor pentru
multe structuri de date.
Originea stivelor i cozilor ca structuri de date n informatic este neclar, deoarece noiunile
corespunztoare existau deja n matematic i n prelucrarea tradiional a documentelor nainte
de introducerea calculatoarelor digitale. Knuth [121] l citeaz pe A. M. Turing pentru folosirea
stivelor la legarea subrutinelor n 1947.
De asemenea, structurile de date bazate pe pointeri par a fi o invenie din folclor. Conform
lui Knuth, pointerii se pare c erau utilizai pe calculatoarele timpurii cu memorie pe tambur
magnetic. Limbajul A-1, dezvoltat de G. M. Hopper n 1951 reprezenta formulele algebrice ca
arbori binari. Knuth crediteaz limbajul IPL-II, dezvoltat n 1956 de A. Newell, J. C. Shaw
i H. A. Simon, cu recunoaterea importanei i promovarea utilizrii pointerilor. Limbajul lor
IPL-III, dezvoltat n 1957, include operaii explicite asupra stivelor.
12 Tabele de dispersie
Multe aplicaii necesit o mulime dinamic pentru care s se aplice numai operaiile specifice
pentru dicionare Insereaz, Caut i terge. De exemplu, un compilator pentru un limbaj
de programare ntreine o tabel de simboluri, n care cheile elementelor sunt iruri arbitrare
de caractere ce corespund identificatorilor din limbaj. O tabel de dispersie este o structur
eficient de date pentru implementarea dicionarelor. Dei cutarea unui element ntr-o tabel
de dispersie poate necesita la fel de mult timp ca i cutarea unui element ntr-o list nlnuit
un timp (n) n cazul cel mai defavorabil n practic, dispersia funcioneaz extrem de bine.
Pe baza unor ipoteze rezonabile, timpul preconizat pentru cutarea unui element ntr-o tabel
de dispersie este O(1).
O tabel de dispersie este o generalizare a noiunii mai simple de tablou. Adresarea direct
ntr-un tablou folosete abilitatea noastr de a examina o poziie arbitrar n tablou ntr-un
timp O(1). Seciunea 12.1 discut n detaliu despre adresarea direct. Adresarea direct este
aplicabil n cazul n care ne putem permite s alocm un tablou care are cte o poziie pentru
fiecare cheie posibil.
Cnd numrul cheilor memorate efectiv este relativ mic fa de numrul total de chei posibile,
tabelele de dispersie devin o alternativ eficient la adresarea direct ntr-un tablou, deoarece o
tabel de dispersie folosete n mod normal un tablou de mrime proporional cu numrul de
chei memorate efectiv. n loc s folosim direct cheia ca indice n tablou, indicele este calculat pe
baza cheii. n seciunea 12.2 sunt prezentate ideile principale, iar n seciunea 12.3 se descrie cum
pot fi calculai indicii din tablou pe baza cheilor, folosind funcii de dispersie. Sunt prezentate i
analizate diferite variaii ale temei de baz; ideea de baz este c dispersia reprezint o tehnic
extrem de eficient i practic; operaiile de baz pentru dicionare necesit, n medie, doar un
timp O(1).
Adresare-Direct-Insereaz(T, x)
T [cheie[x]] x
188 Capitolul 12 Tabele de dispersie
Figura 12.1 Implementarea unei mulimi dinamice printr-un tablou cu adresare direct T. Fiecare
cheie din universul U = {0, 1, ..., 9} corespunde unui indice n tablou. Mulimea K = {2, 3, 5, 8} a cheilor
efective determin locaiile din tablou care conin pointeri ctre elemente. Celelalte locaii, haurate mai
ntunecat, conin nil.
Adresare-Direct-terge(T, x)
T [cheie[x]] nil
Fiecare dintre aceste operaii este rapid: este necesar doar un timp O(1).
Pentru unele aplicaii, elementele din mulimea dinamic pot fi memorate chiar n tabela cu
adresare direct. Aceasta nseamn c n loc s memorm cheia elementului i datele adiionale
ntr-un obiect extern tabelei cu adresare direct, printr-un pointer dintr-o poziie din tabel ctre
obiect, putem s memorm obiectul n locaia respectiv, economisind astfel spaiu. Mai mult,
deseori nu este necesar s memorm cmpul cheie al obiectului, deoarece dac avem indicele
unui obiect n tabel avem i cheia sa. Oricum, dac cheile nu sunt memorate, trebuie s existe
o modalitate de a afirma c locaia este goal.
Exerciii
12.1-1 Se consider o mulime dinamic S care este reprezentat printr-o tabel T cu adresare
direct, de lungime m. Descriei o procedur care gsete elementul maxim din S. Care este
performana procedurii pentru cazul cel mai defavorabil?
12.1-2 Un vector de bii este un tablou simplu de bii (cu 0 i 1). Un vector de bii de
lungime m ocup mult mai puin spaiu dect un tablou de m pointeri. Descriei cum se poate
folosi un vector de bii pentru a reprezenta o mulime dinamic avnd elemente distincte, fr
date adiionale. Operaiile pentru dicionare ar trebui s funcioneze ntr-un timp O(1).
12.1-3 Sugerai cum se poate implementa o tabel cu adresare direct n care cheile elementelor
memorate nu sunt neaprat distincte i elementele pot avea date adiionale. Toate cele trei
operaii pentru dicionare (Insereaz, terge i Caut) ar trebui s se execute ntr-un timp
O(1). (Nu uitai c terge are ca argument un pointer la obiectul ce va fi ters i nu o cheie.)
12.2. Tabele de dispersie 189
Figura 12.2 Folosirea unei funcii de dispersie h pentru a transforma chei n poziii din tabela de
dispersie. Cheile k2 i k5 se transform n aceeai poziie, deci sunt n coliziune.
Figura 12.3 Rezolvarea coliziunii prin nlnuire. Fiecare locaie din tabela de dispersie T [j] conine
o list nluit a tuturor cheilor a cror valoare de dispersie este j. De exemplu, h(k1 ) = h(k4 ) i
h(k5 ) = h(k2 ) = h(k7 ).
h(k) este valoarea de dispersie a cheii k. Figura 12.2 ilustreaz ideea de baz. Scopul funciilor
de dispersie este de a reduce domeniul indicilor tabloului care trebuie manipulai. n loc de |U |
valori, va trebui s manipulm doar m valori. Cerinele de memorare sunt reduse corespunztor.
Dezavantajul acestei idei frumoase este c dou chei se pot dispersa n aceeai locaie, adic
se produce o coliziune. Din fericire, exist tehnici eficiente pentru rezolvarea conflictelor create
de coliziuni.
Desigur, soluia ideal ar fi s nu existe coliziuni. Putem ncerca s atingem acest scop printr-
o alegere potrivit a funciei de dispersie h. O idee este de a-l face pe h s par aleator, evitnd
astfel coliziunile sau cel puin minimiznd numrul lor. Termenul de dispersie, care evoc
imaginea unei frmiri i amestecri aleatoare, capteaz spiritul acestei abordri. (Bineneles,
o funcie de dispersie h trebuie s fie determinist, n sensul c o intrare dat k trebuie s produc
ntotdeauna aceeai ieire h(k).) Deoarece |U | > m, exist cu siguran dou chei care s aibe
aceeai valoare de dispersie; de aceea, evitarea total a coliziunilor este imposibil. Prin urmare,
dei o funcie de dispersie aleatoare, bine proiectat, poate minimiza numrul coliziunilor, avem
n continuare nevoie de o metod pentru rezolvarea coliziunilor ce apar.
Restul acestei seciuni prezint cea mai simpl tehnic de rezolvare a coliziunilor, numit
nlnuire. n seciunea 12.4 se introduce o metod alternativ de rezolvare a coliziunilor, numit
adresare deschis.
Dispersie-Cu-Inlnuire-Insereaz(T, x)
insereaz x n capul listei T [h(cheie[x])]
Dispersie-Cu-Inlnuire-Caut(T, k)
caut un element cu cheia k n lista T [h(k)]
Dispersie-Cu-Inlnuire-terge(T, x) indexDispersie-Cu-Inlantuire-Sterge@Dispersie-
Cu-Inlnuire-terge
terge x din lista T [h(cheie[x])]
Timpul de execuie pentru inserare n cazul cel mai defavorabil este O(1). Pentru cutare,
timpul de execuie n cazul cel mai defavorabil este proporional cu lungimea listei; vom analiza
ndeaproape aceast situaie n cele ce urmeaz. tergerea unui element x poate fi realizat ntr-
un timp O(1) dac listele sunt dublu nlnuite. (Dac listele sunt simplu nlnuite, atunci
trebuie nti s-l gsim pe x n lista T [h(cheie[x])], astfel nct legtura next a predecesorului lui
x s fie modificat corespunztor ca s-l ocoleasc pe x; n acest caz, tergerea i cutarea au
n esen acelai timp de execuie.)
Teorema 12.1 ntr-o tabel de dispersie n care coliziunile sunt rezolvate prin nlnuire, o
cutare fr succes necesit, n medie, un timp (1 + ), n ipoteza dispersiei uniforme simple.
Demonstraie. n ipoteza dispersiei uniforme simple, orice cheie k se poate dispersa cu aceeai
probabilitate n oricare din cele m locaii. Astfel, timpul mediu pentru o cutare fr succes,
pentru o cheie k, este timpul mediu pentru cutarea pn la coada uneia din cele m liste. Deci,
numrul mediu de elemente examinate ntr-o cutare fr succes este i timpul total necesar
(incluznd timpul pentru calculul lui h(k)) este (1 + ).
Teorema 12.2 ntr-o tabel de dispersie n care coliziunile sunt rezolvate prin nlnuire, o
cutare cu succes necesit, n medie, un timp (1 + ), n ipoteza dispersiei uniforme simple.
Demonstraie. Presupunem c cheia care este cutat poate fi, cu aceeai probabilitate, oricare
din cele n chei memorate n tabel. De asemenea, presupunem c procedura Dispersie-Cu-
Inlnuire-Insereaz insereaz un nou element la sfritul unei liste i nu la nceputul ei.
(Conform exerciiului 12.2-3, timpul mediu pentru o cutare cu succes este acelai indiferent
dac noile elemente se insereaz la nceputul sau la sfritul listei.) Numrul mediu de elemente
examinate ntr-o cutare cu succes este cu 1 mai mare dect numrul de elemente examinate n
cazul n care elementul cutat a fost inserat (deoarece fiecare nou element se adaug la sfritul
listei). n concluzie, pentru a afla numrul mediu de elemente examinate, vom considera media
celor n obiecte din tabel, ca fiind 1 plus lungimea presupus a listei n care se adaug al i-lea
element. Lungimea medie a listei respective este (i 1)/m i deci, numrul mediu de elemente
examinate ntr-o cutare cu succes este:
n n
1X i1 1 X 1 (n 1)n 1
1+ =1+ (i 1) = 1 + =1+ .
n i=1 m nm i=1 nm 2 2 2m
Deci, timpul total necesar unei cutri cu succes (incluznd timpul pentru calculul funciei de
dispersie) este (2 + /2 1/2m) = (1 + ).
Ce semnificaie are aceast analiz? Dac numrul de locaii din tabela de dispersie este
cel puin proporional cu numrul de elemente din tabel, avem n = O(m) i, prin urmare,
= n/m = O(m)/m = O(1). Deci, cutarea necesit, n medie, un timp constant. Deoarece
inserarea necesit un timp O(1), n cazul cel mai defavorabil (vezi exerciiul 12.2-3) iar tergerea
necesit un timp O(1) n cazul cel mai defavorabil, cnd listele sunt dublu nlnuite, toate
operaiile pentru dicionare pot fi efectuate n medie ntr-un timp O(1).
Exerciii
12.2-1 Presupunnd c folosim o funcie de dispersie aleatoare h pentru a dispersa n chei
distincte ntr-un tablou T de dimensiune m, care este numrul mediu de coliziuni? Mai exact,
care este cardinalul probabil al mulimii {(x, y) : h(x) = h(y)}?
12.2-2 Ilustrai inserarea cheilor 5, 28, 19, 15, 20, 33, 12, 17, 10 ntr-o tabel de dispersie cu
coliziunile rezolvate prin nlnuire. Tabela are 9 locaii, iar funcia de dispersie este h(k) =
k mod 9.
12.3. Funcii de dispersie 193
12.2-3 Argumentai c timpul mediu pentru o cutare cu succes prin nlnuire este acelai
indiferent dac noile elemente se insereaz la nceputul, respectiv la sfritul unei liste. (Indicaie:
Artai c timpul mediu pentru o cutare cu succes este acelai pentru oricare dou ordine ale
unei liste.)
12.2-4 Profesorul Marley emite ipoteza c se poate mbunti esenial performana dac
modificm schema de nlnuire astfel nct fiecare list s fie pstrat ordonat. n ce mod
afecteaz modificarea profesorului timpul de execuie pentru cutari cu succes, cutri fr
succes, inserri i tergeri?
12.2-5 Sugerai cum poate fi alocat i dealocat spaiul de gestionare pentru elemente n cadrul
tabelei de dispersie prin legarea tuturor locaiilor nefolosite ntr-o list liber. Presupunem c o
locaie poate memora un indicator (engl. flag) mpreun cu un element i un pointer, sau cu
doi pointeri. Toate operaiile pentru dicionare pentru lista liber trebuie s funcioneze ntr-un
timp O(1). Este necesar ca lista liber s fie dublu nlnuit sau este suficient s fie simplu
nlnuit?
12.2-6 Artai c dac |U | > nm, exist o submulime a lui U de mrime n ce conine chei
care se disperseaz toate n aceeai locaie, astfel nct timpul de cutare, pentru dispersie cu
nlnuire, n cazul cel mai defavorabil, este (n).
Din pcate, n general, nu este posibil verificarea acestei condiii, deoarece de regul
distribuia P nu este cunoscut.
Uneori (relativ rar) distribuia P este cunoscut. De exemplu, presupunem c se cunoate
faptul c cheile sunt numere reale aleatoare k, independent i uniform distribuite n intervalul
0 k < 1. n acest caz se poate arta c funcia de dispersie
h(k) = bkmc
194 Capitolul 12 Tabele de dispersie
h(k) = k mod m .
De exemplu, dac tabela de dispersie are dimensiunea m = 12 i cheia este k = 100, atunci
h(k) = 4. Deoarece necesit doar o singur operaie de mprire, dispersia prin diviziune este
rapid.
Cnd folosim metoda diviziunii, de obicei evitm anumite valori ale lui m. De exemplu, m
nu ar trebui s fie o putere a lui 2, pentru c dac m = 2p , atunci h(k) reprezint doar primii
p bii ai lui k. n afara cazului n care se cunoate apriori c distribuia de probabilitate pe
chei produce cu aceeai probabilitate oricare dintre abloanele primilor p bii, este mai bine s
construim funcia de dispersie ca dependent de toi biii cheii. Puterile lui 10 ar trebui evitate
dac aplicaia lucreaz cu numere zecimale ca i chei, pentru c n acest caz funcia de dispersie
12.3. Funcii de dispersie 195
Figura 12.4 Metoda nmulirii pentru dispersie. Reprezentarea pe w bii a cheii k este nmulit cu
valoarea pe w bii bA 2w c, unde 0 < A < 1 este o constant aleas convenabil. Primii p bii ai celei de
a doua jumti a produsului, de lungime w bii, formeaz valoarea de dispersie h(k) dorit.
nu depinde de toate cifrele zecimale ale lui k. n final, se poate arta c dac m = 2p 1 i k este
un ir de caractere interpretat n baza 2p , dou iruri de caractere care sunt identice, exceptnd
o transpoziie a dou caractere adiacente, se vor dispersa n aceeai valoare.
Valori bune pentru m sunt numerele prime nu prea apropiate de puterile exacte ale lui 2. De
exemplu, s presupunem c dorim s alocm o tabel de dispersie, cu coliziunile rezolvate prin
nlnuire, pentru a reine aproximativ n = 2000 iruri de caractere, unde un caracter are 8 bii.
Nu ne deranjeaz s examinm n medie 3 elemente ntr-o cutare fr succes, deci vom aloca
o tabel de dispersie de dimensiune m = 701. Numrul 701 este ales pentru c este un numr
prim apropiat de 2000/3, dar nu este apropiat de nici o putere a lui 2. Tratnd fiecare cheie k
ca un ntreg, funcia noastr de dispersie va fi
Dei aceast metod funcioneaz cu orice valoare a constantei A, ea lucreaz mai bine cu
anumite valori dect cu altele. Alegerea optim depinde de caracteristicile datelor care sunt
dispersate. Knuth [123] discut alegerea lui A n detaliu i sugereaz c
A = ( 5 1)/2 0.6180339887... (12.2)
h(k) = b10000 (123456 0.61803... mod 1)c = b10000 (76300.0041151... mod 1)c =
= b10000 0.0041151...c = b41.151...c = 41 .
Teorema 12.3 Dac h este aleas dintr-o colecie universal de funcii de dispersie i este
folosit pentru a dispersa n chei ntr-o tabel de dimensiune m, unde n m, numrul mediu de
coliziuni n care este implicat o cheie particular x, este mai mic dect 1.
Demonstraie. Pentru fiecare pereche y, z de chei distincte, fie cyz variabila aleatoare care are
valoarea 1 dac h(y) = h(z) (adic, dac y i z sunt n coliziune folosind h) i 0 n caz contrar.
12.3. Funcii de dispersie 197
Deoarece, prin definiie, o singur pereche de chei sunt n coliziune cu probabilitatea 1/m, avem
E[cyz ] = 1/m .
Fie Cx numrul total de coliziuni n care este implicat cheia x dintr-o tabel de dispersie T
de dimensiune m coninnd n chei. Din relaia (6.24) obinem
X n1
E[Cx ] = E[cxy ] = .
m
yT
y6=x
Cu aceast definiie,
[
H = {ha }. (12.4)
a
Teorema 12.4 Clasa H definit de relaiile (12.3) i (12.4) este o clas universal de funcii de
dispersie.
Pentru a observa aceast proprietate s remarcm faptul c deoarece m este prim, cantitatea
nenul x0 y0 are un invers fa de nmulirea modulo m i astfel exist o soluie unic pentru
a0 modulo m. (Vezi seciunea 33.4.) Prin urmare, fiecare pereche de chei x i y este n coliziune
pentru exact mr valori ale lui a, deoarece ea este n coliziune exact o dat pentru fiecare valoare
posibil a lui ha1 , a2 , ..., ar i (de exemplu, pentru valoarea unic a lui a0 observat mai sus).
Deoarece exist mr+1 valori posibile pentru secvena a, cheile x i y sunt n coliziune exact cu
probabilitatea mr /mr+1 = 1/m. n concluzie, H este universal.
198 Capitolul 12 Tabele de dispersie
Exerciii
12.3-1 Presupunem c dorim s efectum o cutare ntr-o list nlnuit de lungime n, n care
fiecare element conine o cheie k mpreun cu o valoare de dispersie h(k). Fiecare cheie este un
ir lung de caractere. Cum putem profita de valorile de dispersie cnd cutm n list un element
cu o cheie dat?
12.3-5 Artai c dac punem restricia ca fiecare component ai din a din relaia (12.3) s fie
nenul, atunci mulimea H = {ha } definit ca n relaia (12.4) nu este universal. (Indicaie: Se
consider cheile x = 0 i y = 1.)
depinde de cheia ce se insereaz. Pentru a determina ce locaii sunt verificate, extindem funcia
de dispersie astfel nct ea s includ i numrul de verificare (ncepnd de la 0) ca un al doilea
argument. Astfel, funcia de dispersie devine
s fie o permutare a lui h0, 1, ..., m 1i, astfel nct fiecare poziie din tabela de dispersie s fie
considerat ca o eventual locaie pentru o nou cheie pe msur ce se umple tabela. n algoritmul
urmtor, presupunem c elementele din tabela de dispersie T sunt chei, fr informaii adiionale;
cheia k este identic cu elementul care conine cheia k. Fiecare locaie conine fie o cheie, fie nil
(dac locaia este liber).
Dispersie-Insereaz(T, k)
1: i 0
2: repet
3: j h(k, i)
4: dac T [j] = nil atunci
5: T [j] k
6: returneaz j
7: altfel
8: ii+1
9: pn cnd i = m
10: eroare depire tabela de dispersie
Algoritmul pentru cutarea unei chei k examineaz aceeai secven de locaii pe care o
folosete i algoritmul de inserare atunci cnd s-a inserat cheia k. Prin urmare, cutarea se poate
termina (fr succes) cnd se ntlnete o locaie liber, pentru c k ar fi fost inserat n acea
locaie i nu mai ncolo n secvena de verificare. (Se observ c aceast argumentaie presupune
c o dat introduse, cheile nu mai sunt terse din tabela de dispersie.) Procedura Dispersie-
Caut are ca intrare o tabel de dispersie T i o cheie k i returneaz j dac locaia j conine
cheia k sau nil dac cheia k nu exist n tabela T .
Dispersie-Caut(T, k)
1: i 0
2: repet
3: j h(k, i)
4: dac T [j] = k atunci
5: returneaz j
6: ii+1
7: pn cnd T [j] = nil sau i = m
8: returneaz nil
tergerea dintr-o tabel de dispersie cu adresare deschis este dificil. Cnd tergem o cheie
dintr-o locaie i, nu putem marca pur i simplu acea locaie ca fiind liber memornd n ea
200 Capitolul 12 Tabele de dispersie
valoarea nil. Procednd astfel, va fi imposibil s accesm orice cheie k a crei inserare a verificat
locaia i i a gsit-o ocupat. O soluie este de a marca locaia, memornd n ea valoarea special
ters n loc de nil. Apoi vom modifica procedura Dispersie-Insereaz astfel nct s trateze
astfel de locaii ca i cnd ar fi libere, astfel nct o nou cheie s poat fi inserat. Nu este
necesar nici o modificare n Dispersie-Caut, deoarece va trece peste valorile ters n timpul
cutrii. Procednd astfel, timpii de cutare nu mai depind de factorul de ncrcare i din
acest motiv n cazul n care cheile trebuie terse, se prefer, n mod uzual, nlnuirea ca tehnic
de rezolvare a coliziunilor.
n analiza noastr, folosim ipoteza dispersiei uniforme: presupunem c fiecare cheie
considerat poate avea, cu aceeai probabilitate, oricare dintre cele m! permutri ale mulimii
{0, 1, ..., m 1} ca secven de verificare. Dispersia uniform generalizeaz noiunea de dispersie
uniform simpl, definit anterior, pentru situaia n care funcia de dispersie produce nu doar
un singur numr, ci o ntreag secven de verificare. Oricum, dispersia uniform real este dificil
de implementat i n practic sunt folosite aproximri convenabile (ca dispersia dubl, definit
mai trziu).
n mod obinuit sunt utilizate trei tehnici pentru a calcula secvenele de verificare necesare
adresrii deschise: verificarea liniar, verificarea ptratic i dispersia dubl. Toate aceste tehnici
garanteaz c hh(k, 0), h(k, 1), ..., h(k, m1)i este o permutare a lui h0, 1, ..., m1i pentru fiecare
cheie k. Nici una din aceste tehnici nu satisface condiia dispersiei uniforme, pentru c nici una
dintre ele nu e capabil s genereze mai mult de m2 secvene de verificare diferite (n loc de m!
ct cere dispersia uniform). Dispersia dubl are cel mai mare numr de secvene de verificare
i, dup cum era de ateptat, d cele mai bune rezultate.
Verificarea liniar
Fiind dat o funcie de dispersie ordinar h0 : U {0, 1, ..., m 1}, metoda verificrii
liniare folosete funcia de dispersie
pentru i = 0, 1, ..., m 1. Fiind dat o cheie k, prima locaie examinat (verificat) este T [h0 (k)].
Apoi examinm locaia T [h0 (k) + 1] i aa mai departe pn la locaia T [m 1]. Apoi continum
circular cu locaiile T [0], T [1], ..., pn cnd, n final, verificm locaia T [h0 (k) 1]. Deoarece
poziia de start a verificrii determin ntreaga secven de verificare liniar, prin care sunt
folosite doar m secvene de verificri distincte.
Verificarea liniar este uor de implementat, dar apare o problem cunoscut sub numele
de grupare primar. n acest caz se formeaz iruri lungi de locaii ocupate, crescnd timpul
mediu de cutare. De exemplu, dac avem n = m/2 chei ntr-o tabel, n care fiecare locaie de
indice par este ocupat i fiecare locaie de indice impar este liber, atunci cutarea fr succes
necesit, 1,5 verificri n cazul mediu. Dac primele n = m/2 locaii sunt cele ocupate, numrul
mediu de verificri crete la aproximativ n/4 = m/8. Gruprile au probabilitate mare de apariie,
pentru c dac o locaie liber este precedat de i locaii ocupate, atunci probabilitatea ca locaia
liber s fie urmtoarea completat este (i + 1)/m, comparativ cu probabilitatea de 1/m pentru
cazul n care locaia precedent ar fi fost liber. Prin urmare, irurile de locaii ocupate tind s
se lungeasc i verificarea liniar nu este o aproximare foarte bun a dispersiei uniforme.
12.4. Adresarea deschis 201
Verificarea ptratic
Verificarea ptratic folosete o funcie de dispersie de forma
h(k, i) = (h0 (k) + c1 i + c2 i2 ) mod m , (12.5)
unde (ca i n cazul verificrii liniare) h0 este o funcie de dispersie auxiliar, c1 i c2 6= 0
sunt constante auxiliare i i = 0, 1, ..., m 1. Poziia verificat iniial este T [h0 (k)]; urmtoarele
poziii examinate sunt decalate cu cantiti ce depind ntr-o manier ptratic de numrul de
verificare i. Aceast metod lucreaz mult mai bine dect verificarea liniar, dar pentru a folosi
integral tabela de dispersie valorile lui c1 , c2 i m trebuie determinate corespunztor. Problema
12-4 ilustreaz o modalitate de determinare a acestor parametri. De asemenea, dac dou chei
au aceeai poziie de start a verificrii, atunci secvenele lor de verificare coincid, pentru c
h(k1 , 0 = h(k2 , 0) implic h(k1 , i) = h(k2 , i). Aceast situaie conduce la o form mai uoar
de grupare, numit grupare secundar. Ca i n cazul verificrii liniare, verificarea iniial
determin ntreaga secven, deci sunt folosite doar m secvene de verificare distincte.
Dispersia dubl
dispersia dubl este una dintre cele mai bune metode disponibile pentru adresarea deschis,
deoarece permutrile produse au multe din caracteristicile permutrilor alese aleator. dispersia
dubl folosete o funcie de dispersie de forma
h(k, i) = (h1 (k) + ih2 (k)) mod m ,
unde h1 i h2 sunt funcii de dispersie auxiliare. Poziia examinat iniial este T [h1 (k)]; poziiile
succesive de verificare sunt decalate fa de poziiile anterioare cu h2 (k) modulo m. Astfel,
contrar situaiei de verificarea liniar sau ptratic, n acest caz secvena de verificare depinde
n dou moduri de cheia k, pentru c fie poziia iniial de verificare, fie decalajul, fie amndou
pot varia. Figura 12.5 ilustreaz un exemplu de inserare prin dispersie dubl.
Valoarea h2 (k) i dimensiunea tabelei de dispersie m trebuie s fie prime ntre ele pentru
a fi parcurs ntreaga tabel de dispersie. n caz contrar, dac m i h2 (k) au un cel mai mare
divizor comun d > 1 pentru o cheie k, atunci o cutare pentru cheia k va examina doar a (1/d)-a
parte din tabela de dispersie. (Vezi capitolul 33.) O modalitate convenabil de a asigura aceast
condiie este de a avea un numr m ca o putere a lui 2 i de a construi h2 astfel nct s produc
ntotdeauna un numr impar. O alt modalitate este de a avea m prim i de a construi h2 astfel
nct s returneze ntotdeauna un ntreg pozitiv mai mic dect m. De exemplu, putem alege m
prim i
h1 (k) = k mod m ,
h2 (k) = 1 + (k mod m0 ) ,
unde m0 este ales s fie un pic mai mic dect m (s zicem m 1 sau m 2). De exemplu, dac
k = 123456, m = 701 i m0 = 700, avem h1 (k) = 80 i h2 (k) = 257, deci prima verificare se afl
la poziia 80 i fiecare a 257-a locaie (modulo m) este examinat pn cnd cheia este gsit
sau a fost examinat toat tabela.
dispersia dubl reprezint o mbuntire fa de verificarea liniar sau ptratic n sensul
c sunt folosite (m2 ) secvene de verificare, fa de (m), pentru c fiecare pereche posibil
(h1 (k), h2 (k)) produce o secven de verificare distinct c si cnd cheia variaz, poziia iniial
202 Capitolul 12 Tabele de dispersie
Figura 12.5 Inserarea prin dispersie dubl. Avem o tabel de dispersie de dimensiune 13, cu h1 (k) =
k mod 13 i h2 (k) = 1 + (k mod 11). Deoarece 14 1 mod 13 i 14 3 mod 11, cheia 14 va fi inserat
n locaia liber 9, dup ce locaiile 1 i 5 au fost examinate i gsite ca fiind deja ocupate.
a verificrii h1 (k) i decalajul h2 (k) pot varia independent. Ca rezultat, performana dispersiei
duble apare ca fiind foarte apropiat de performana schemei ideale a dispersiei uniforme.
Teorema 12.5 Fiind dat o tabel de dispersie cu adresare deschis cu factorul de ncrcare
= n/m < 1, n ipoteza dispersiei uniforme, numrul mediu de verificri dintr-o cutare fr
succes este cel mult 1/(1 ).
locaie ocupat care nu conine cheia dorit, iar ultima locaie examinat este liber. Definim
pi = Pr { exact i verificri acceseaz locaiile ocupate }
pentru i = 0, 1, 2, .... Pentru i > n, avem pi = 0, pentru c putem gsi cel mult n locaii deja
ocupate. Astfel, numrul mediu de verificri este
X
1+ ipi (12.6)
i=1
Care este valoarea lui qi pentru i 1? Probabilitatea ca prima verificare s acceseze o locaie
ocupat este n/m; prin urmare,
n
q1 = .
m
Prin dispersie uniform, a doua verificare, n cazul n care este necesar, va fi la una din cele
m 1 locaii rmase neverificate, din care n 1 sunt ocupate. Facem a doua verificare doar dac
prima verificare acceseaz o locaie ocupat; prin urmare,
n n 1
q2 = .
m m1
n general, a i-a verificare este necesar doar dac primele i 1 verificri acceseaz locaii
ocupate i locaia examinat este cu aceeai probabilitate oricare dintre cele m i + 1 locaii
rmase, din care n i + 1 sunt ocupate. Deci,
n n 1 n i + 1 n i
qi = ... = i
m m1 mi+1 m
pentru i = 1, 2, ..., n, pentru c (n j)/(m j) n/m dac n m i j 0. Dup n verificri,
toate cele n locaii ocupate au fost vizitate i nu vor fi verificate din nou i astfel qi = 0 pentru
i > n.
Acum se poate evalua relaia (12.6). Presupunnd < 1, numrul mediu de verificri ntr-o
cutare fr succes este
X
X 1
1+ ipi = 1 + qi 1 + + 2 + 3 + ... = . (12.7)
i=0 i=1
1
Relaia (12.7) are o interpretare intuitiv: prima verificare se face ntotdeauna, a doua
verificare este necesar cu o probabilitate aproximativ egal cu , a treia verificare este necesar
cu o probabilitate aproximativ egal cu 2 i aa mai departe.
204 Capitolul 12 Tabele de dispersie
Dac este o constant, teorema 12.5 prognozeaz faptul c o cutare fr succes necesit
un timp O(1). De exemplu, dac tabela de dispersie este pe jumtate plin, numrul mediu de
verificri ntr-o cutare fr succes este cel mult 1/(1 .5) = 2. Dac este 90% ocupat, numrul
mediu de verificri este cel mult 1/(1 .9) = 10.
Teorema 12.5 ne d, aproape imediat, performana procedurii Dispersie-Insereaz.
Corolarul 12.6 Inserarea unui element ntr-o tabel de dispersie cu adresare deschis, cu
factorul de ncrcare necesit , n cazul mediu, cel mult 1/(1) verificri, n ipoteza dispersiei
uniforme.
Demonstraie. Un element este inserat doar dac exist spaiu n tabel i, deci, < 1.
Inserarea unei chei necesit o cutare fr succes, urmat de o plasare a cheii n prima locaie
gsit liber. Prin urmare, numrul mediu de verificri este cel mult 1/(1 ).
Calculul numrului mediu de verificri pentru o cutare cu succes necesit un pic mai mult
de lucru.
Teorema 12.7 Fiind dat o tabel de dispersie cu adresare deschis, cu factorul de ncrcare
< 1, numrul mediu de verificri ntr-o cutare cu succes este cel mult
1 1
ln ,
1
n ipoteza dispersiei uniforme i presupunnd c fiecare cheie din tabel este cutat cu aceeai
probabilitate.
Exerciii
12.4-1 Se consider c se insereaz cheile 10, 22, 31, 4, 15, 28, 17, 88, 59 ntr-o tabel de dispersie
de lungime m = 11 folosind adresarea deschis cu funcia primar de dispersie h0 (k) = k mod m.
Ilustrai rezultatul inserrii acestor chei folosind verificarea liniar, verificarea ptratic cu c1 = 1
i c2 = 3 i folosind dispersia dubl cu h2 (k) = 1 + (k mod (m 1)).
12.4-2 Scriei un algoritm n pseudocod pentru Dispersie-terge dup descrierea din text
i modificai Dispersie-Insereaz i Dispersie-Caut pentru a ncorpora valoarea special
ters.
12.4-3 ? S presupunem c folosim dispersia dubl pentru a rezolva coliziunile; mai exact,
folosim funcia de dispersie h(k, i) = (h1 (k) + ih2 (k)) mod m. Artai c secvena de verificare
hh(k, 0), h(k, 1), ..., h(k, m 1)i este o permutare a secvenei de locaii h0, 1, ..., m 1i dac i
numai dac h2 (k) este relativ prim cu m. (Indicaie: Vezi capitolul 33.)
12.4-4 Se consider o tabel de dispersie cu adresare deschis i cu dispersie uniform i factorul
de ncrcare = 1/2. Dai margini superioare pentru numrul mediu de verificri ntr-o cutare
fr succes i pentru numrul mediu de verificri ntr-o cutare cu succes. Care este numrul
mediu de verificri ntr-o cutare cu succes? Repetai calculele pentru factorii de ncrcare 3/4
i 7/8.
12.4-5 ? S presupunem c inserm n chei ntr-o tabel de dispersie de dimensiune m folosind
adresarea deschis i dispersia uniform. Notm cup(n, m) probabilitatea de a nu apare nici
n(n1)/2m
o coliziune. Artai c p(n,
m) e . (Indicaie: Vezi relaia (2.7).) Argumentai c
atunci cnd n depete m, probabilitatea evitrii coliziunilor descrete rapid ctre zero.
12.4-6 ? Se consider o tabel de dispersie cu adresare deschis avnd factorul de ncrcare .
Determinai acea valoare nenul a lui pentru care numrul mediu de verificri ntr-o cutare
fr succes este de dou ori mai mare dect numrul mediu de verificri dintr-o cutare cu
succes. Folosii estimarea (1/)ln(1/(1 )) pentru numrul de verificri necesare ntr-o cutare
cu succes.
Probleme
12-1 Marginea celei mai lungi verificri pentru dispersie
O tabel de dispersie de dimensiune m este folosit pentru a memora n obiecte, cu n m/2.
Pentru rezolvarea coliziunilor se folosete adresarea deschis.
a. n ipoteza dispersiei uniforme, artai c pentru i = 1, 2, ..., n, probabilitatea ca a i-a
inserare s necesite strict mai mult de k verificri este cel mult 2k .
b. Artai c pentru i = 1, 2, ..., n, probabilitatea ca a i-a inserare s necesite mai mult de
2 lg n verificri este cel mult 1/n2 .
Fie variabila aleatoare Xi , semnificnd numrul de verificri necesare pentru a i-a inserare.
Ai artat la punctul (b) c Pr{Xi > 2 lg n} 1/n2 . Fie variabila aleatoare X = max1in Xi
care semnific numrul maxim de verificri necesare oricreia din cele n inserri.
206 Capitolul 12 Tabele de dispersie
d. Artai c lungimea medie a celei mai lungi secvene de verificare este E[X] = O(lg n).
a. Artai c procedura Caut poate fi implementat astfel nct, n cazul cel mai defavorabil
s se execute ntr-un timp O(lg n), fr a folosi spaiu suplimentar fa de cel necesar
memorrii elementelor.
b. Fie Pk probabilitatea ca M = k, adic probabilitatea ca locaia care conine cele mai multe
chei s conin k chei. Artai c Pk nQk .
d. Artai c exist o constant c > 1 astfel nct Qk0 < 1/n3 pentru k0 = c lg n/ lg lg n.
Deducei c Pk < 1/n2 pentru k = c lg n/ lg lg n.
e. Artai c
c lg n c lg n c lg n
E[M ] Pr M> n + Pr M .
lg lg n lg lg n lg lg n
c. Artai c dac modificm definiia lui H din seciunea 12.3.3 astfel nct fiecare funcie
s conin un termen constant b, adic dac nlocuim h(x) cu
r
X
ha,b (x) = ai xi + b mod m ,
i=0
Note bibliografice
Knuth [123] i Gonnet [90] sunt referine excelente pentru algoritmi de dispersie. Knuth
l crediteaz pe H. P. Luhn (1953) cu inventarea tabelelor de dispersie, mpreun cu metoda
nlnuirii pentru rezolvarea coliziunilor. Aproximativ n aceeai perioad, G. M. Amdahl a avut
ideea original a adresrii deschise.
13 Arbori binari de cutare
Arborii de cutare sunt structuri de date ce posed multe operaii specifice mulimilor di-
namice, ntre care menionm Caut, Minim, Maxim, Predecesor, Succesor, Insereaz i
terge. Prin urmare un arbore de cutare se poate folosi att ca dicionar, ct i pe post de
coad cu prioriti.
Operaiile de baz pe arborii binari consum un timp proporional cu nlimea arborelui.
Pentru un arbore binar complet cu n noduri, aceste operaii se execut n cazul cel mai defavorabil
ntr-un timp (lg n). Dac ns arborele este un lan liniar de n noduri, atunci timpul consumat
n cazul cel mai defavorabil este (n). n seciunea 13.4 vom vedea c nlimea unui arbore
binar de cutare construit aleator este O(lg n), deci operaiile de baz pe mulimile dinamice vor
consuma un timp de (lg n).
n practic nu se poate garanta c arborii binari de cutare se construiesc aleator, ns exist
diverse tipuri speciale de astfel de structuri de date pentru care se garanteaz performane bune
ale operaiilor de baz chiar i n cazurile cele mai defavorabile. Astfel, n capitolul 14 se prezint
un astfel de caz special, arborii rou-negru, care au nlimea O(lg n). Capitolul 19 introduce B-
arborii, care se folosesc n special la ntreinerea bazelor de date cu acces direct, memorate pe
suport magnetic extern.
Dup prezentarea proprietilor de baz ale arborilor binari de cutare, seciunile urmtoare
vor ilustra cum se traverseaz un astfel de arbore n scopul listrii valorilor sale n ordine
cresctoare, cum se caut o valoare memorat n arborele binar de cutare, cum se gsete
elementul minim sau maxim, cum se determin succesorul sau predecesorul unui element i cum
se insereaz (adaug) sau se terge un element. Proprietile matematice de baz ale arborilor
au fost prezentate n capitolul 5.
Fie x un nod dintr-un arbore binar de cutare. Dac y este un nod din subarborele
stng al lui x, atunci cheie[y] cheie[x]. Dac y este un nod din subarborele drept
al lui x, atunci cheie[x] cheie[y].
Astfel, n figura 13.1(a) cheia rdcinii este 5, iar cheile 2, 3 i 5 din subarborele stng nu sunt
mai mari dect 5, pe cnd cheile 7 i 8 din subarborele drept nu sunt mai mici dect 5. Aceeai
13.1. Ce este un arbore binar de cutare? 209
Figura 13.1 Arbori binari de cutare. Pentru orice nod x, cheile din subarborele stng al lui x au
valoarea mai mic sau egal cu cheie[x], iar cheile din subarborele drept al lui x au valoarea mai mare
sau egal cu cheie[x]. Aceeai mulime de valori se poate reprezenta prin arbori binari de cutare, diferii.
Timpul de execuie, n cazul cel mai defavorabil, pentru majoritatea operaiilor arborilor de cutare este
proporional cu nlimea arborelui. (a) Un arbore binar de cutare cu 6 noduri i de nlime 2. (b) Un
arbore binar de cutare mai puin eficient care conine aceleai chei i are nlimea 4.
proprietate se verific pentru fiecare nod din arbore. De exemplu, cheia 3 din figura 13.1(a) nu
este mai mic dect cheia 2 din subarborele su stng i nu este mai mare dect cheia 5 din
subarborele su drept.
Proprietatea arborelui binar de cutare ne permite s tiprim toate cheile n ordine cresc-
toare cu ajutorul unui algoritm recursiv simplu, numit traversarea arborelui n inordine.
Numele acestui algoritm deriv din faptul c cheia rdcinii unui subarbore se tiprete ntre
valorile din subarborele su stng i cele din subarborele su drept. (Similar, o traversare a
arborelui n preordine va tipri cheia rdcinii naintea cheilor din subarbori, iar o traversare
a arborelui n postordine va tipri cheia rdcinii dup cheile din subarbori). Pentru a folosi
procedura urmtoare n scopul tipririi tuturor elementelor din arborele binar de cutare T o
vom apela cu Arbore-Traversare-Inordine(rdcin[T ]).
Arbore-Traversare-Inordine(x)
1: dac x 6= nil atunci
2: Arbore-Traversare-Inordine(stnga[x])
3: afieaz cheie[x]
4: Arbore-Traversare-Inordine(dreapta[x])
Spre exemplu, traversarea n inordine a arborelui afieaz cheile fiecruia dintre arborii binari
de cutare din figura 13.1 n ordinea 2, 3, 5, 5, 7, 8. Corectitudinea algoritmului se demonstreaz
prin inducie folosind direct proprietatea arborelui binar de cutare. Deoarece dup apelul iniial
procedura se apeleaz recursiv de exact dou ori pentru fiecare nod din arbore o dat pentru
fiul su stng i nc o dat pentru fiul su drept rezult c este nevoie de un timp (n) pentru
a traversa un arbore binar de cutare cu n noduri.
210 Capitolul 13 Arbori binari de cutare
Exerciii
13.1-1 Desenai arbori binari de cutare de nlime 2, 3, 4, 5 i respectiv 6 pentru mulimea
de chei {1, 4, 5, 10, 16, 17, 21}.
13.1-2 Care este deosebirea dintre proprietatea arborelui binar de cutare i proprietatea de
ansamblu (heap) (7.1)? Se poate folosi proprietatea de ansamblu pentru a afia cheile unui arbore
avnd n noduri n ordine cresctoare ntr-un timp O(n)? Explicai cum sau de ce nu.
13.1-3 Dai un algoritm nerecursiv care efectueaz o traversare n inordine a unui arbore.
(Indicaie: Exist o soluie simpl care folosete o stiv pe post de structur de date auxiliar
i o soluie mai complicat dar n acelai timp mai elegant care nu mai folosete stiva, ns
presupune c exist o operaie care realizeaz testul de egalitate a doi pointeri.)
13.1-4 Dai algoritmi recursivi care realizeaz traversarea n preordine i postordine a unui
arbore cu n noduri ntr-un timp (n).
13.1-5 Argumentai c, deoarece sortarea a n elemente, care folosete modelul comparaiei are
nevoie de un timp de (n lg n), n cazul cel mai defavorabil, orice algoritm pentru construirea
unui arbore binar de cutare care se bazeaz pe comparaii i care folosete la intrare o list
arbitrar avnd n elemente, necesit tot un timp de (n lg n) n cazul cel mai defavorabil.
Cutarea
Procedura urmtoare poate fi folosit la cutarea unui nod avnd cheia cunoscut, ntr-un
arbore binar de cutare. Fiind date un pointer x la rdcina arborelui i o valoare k a cheii,
Arbore-Caut returneaz un pointer la nodul avnd cheia k dac exist un asemenea nod n
arbore sau nil n caz contrar.
Arbore-Caut(x, k)
1: dac x = nil sau k = cheie[x] atunci
2: returneaz x
3: dac k < cheie[x] atunci
4: returneaz Arbore-Caut(stnga[x], k)
5: altfel
6: returneaz Arbore-Caut(dreapta[x], k)
13.2. Interogarea ntr-un arbore binar de cutare 211
Figura 13.2 Interogri ntr-un arbore binar de cutare. Pentru a cuta n arbore cheia 13, se parcurge,
ncepnd cu rdcina, drumul 15 6 7 13. Cheia minim din arbore este 2, care se determin
pornind de la rdcin i urmnd pointerii stnga. Cheia maxim din arbore este 20, determinat
ncepnd cu rdcina i urmnd pointerii dreapta. Succesorul nodului avnd cheia 15 este nodul avnd
cheia 17, deoarece aceast cheie este cheia minim din subarborele drept al nodului avnd cheia 15. Nodul
avnd cheia 13 nu are subarbore drept, prin urmare succesorul su este cel mai de jos nod strmo al
su al crui fiu stng este de asemenea strmo pentru 13. n cazul nodului avnd cheia 13, succesorul
este nodul avnd cheia 15.
Minimul i maximul
Determinarea elementului avnd cheia minim dintr-un arbore binar de cutare se realizeaz
ntotdeauna urmnd pointerii fiu stnga ncepnd cu rdcina i terminnd cnd se ntlnete
nil, aa cum se ilustreaz n figura 13.2. Procedura urmtoare ntoarce un pointer la elementul
minim din subarborele a crui rdcin este nodul x.
212 Capitolul 13 Arbori binari de cutare
Arbore-Minim(x)
1: ct timp stnga[x] 6= nil execut
2: x stnga[x]
3: returneaz x
Deoarece ambele proceduri traseaz drumuri n jos n arbore, ele se execut ntr-un timp
O(h), unde h este nlimea arborelui n care se face cutarea.
n figura 13.2, succesorul nodului cu cheia 13 este nodul cu cheia 15. Pentru a-l determina pe
y, se traverseaz arborele de la x n sus pn cnd se ntlnete un nod care este fiul stng al
printelui su; acest lucru se realizeaz n liniile 37 ale codului procedurii Arbore-Succesor.
n cazul unui arbore de nlime h, timpul de execuie al procedurii Arbore-Succesor
este O(h) deoarece n ambele situaii se urmeaz fie un drum n josul arborelui, fie unul n susul
arborelui. Procedura Arbore-Predecesor, care este similar, se execut tot ntr-un timp O(h).
Rezultatele obinute pn acum se pot rezuma n teorema urmtoare.
Teorema 13.1 Pe un arbore binar de cutare de nlime h, operaiile pe mulimi dinamice
Caut, Minim, Maxim, Succesor i Predecesor se pot executa ntr-un timp O(h).
Exerciii
13.2-1 Presupunem c avem memorate ntr-un arbore binar de cutare numere cuprinse ntre 1
i 1000 i c dorim s cutm numrul 363. Care dintre urmtoarele iruri nu poate fi secvena
nodurilor examinate?
a. 2, 252, 401, 398, 330, 344, 397, 363.
b. 924, 220, 911, 244, 898, 258, 362, 363.
c. 925, 202, 911, 240, 912, 245, 363.
d. 2, 399, 387, 219, 266, 382, 381, 278, 363.
e. 935, 278, 347, 621, 299, 392, 358, 363.
13.2-2 Profesorul Bunyan crede c a descoperit o proprietate remarcabil a arborilor binari
de cutare. S presupunem c determinarea cheii k ntr-un astfel de arbore se termin ntr-o
frunz. mprind cheile din nodurile arborelui n trei mulimi A, B i C construite astfel: A
conine cheile nodurilor de la stnga drumului de cutare, B cheile de pe drumul de cutare,
iar C cheile de la dreapta drumului de cutare, profesorul Bunyan afirm c oricare trei chei
a A, b B i c C trebuie s ndeplineasc condiia a b c. Dai un contraexemplu ct
mai mic, care s infirme proprietatea descoperit de profesor.
13.2-3 Folosii proprietatea arborelui binar de cutare pentru a demonstra riguros corectitudi-
nea codului pentru procedura Arbore-Succesor.
13.2-4 Traversarea n inordine pentru un arbore binar de cutare avnd n noduri se poate
implementa prin gsirea elementului minim din arbore cu procedura Arbore-Minim i apoi
apelnd de n 1 ori procedura Arbore-Succesor. Demonstrai c acest algoritm se execut
ntr-un timp de (n).
13.2-5 Demonstrai c, ntr-un arbore binar de cutare de nlime h, prin k apeluri succesive
ale procedurii Arbore-Succesor, se consum un timp O(k + h), indiferent care este nodul de
pornire.
13.2-6 Fie T un arbore binar de cutare avnd toate cheile distincte, x un nod frunz i y
printele su. Artai c cheie[y] este fie cea mai mic cheie din T care este mai mare dect
cheie[x] fie cea mai mare cheie din T care este mai mic dect cheie[x].
214 Capitolul 13 Arbori binari de cutare
Inserarea
Vom folosi procedura Arbore-Insereaz pentru a insera o nou valoare v ntr-un arbore
binar de cutare T . Procedurii i se transmite un nod z pentru care cheie[z] = v, stnga[z] = nil
i dreapta[z] = nil. Ea va modifica arborele T i unele dintre cmpurile lui z astfel nct z va fi
inserat pe poziia corespunztoare n arbore.
Arbore-Insereaz(T, z)
1: y nil
2: x rdcin[T ]
3: ct timp x 6= nil execut
4: yx
5: dac cheie[z] < cheie[x] atunci
6: x stnga[x]
7: altfel
8: x dreapta[x]
9: p[z] y
10: dac y = nil atunci
11: rdcin[T ] z
12: altfel dac cheie[z] < cheie[y] atunci
13: stnga[y] z
14: altfel
15: dreapta[y] z
Figura 13.3 Inserarea unui element avnd cheia 13 ntr-un arbore binar de cutare. Nodurile haurate
deschis indic drumul n jos, de la rdcin la poziia n care se insereaz elementul. Linia ntrerupt
semnific legtura adugat la arbore pentru a insera elementul.
tergerea
Procedura pentru tergerea unui nod dat z dintr-un arbore binar de cutare primete ca
argument un pointer la z. Procedura ia n considerare toate cele trei situaii ilustrate n figura
13.4. Dac z nu are fii, se va modifica printele su p[z] pentru a-i nlocui fiul z cu nil. Dac
nodul are un singur fiu, z va fi eliminat din arbore prin inserarea unei legturi de la printele
lui z la fiul lui z. n sfrit, dac nodul are doi fii, se va elimina din arbore succesorul y al lui z,
care nu are fiu stng (vezi exerciiul 13.3-4) i apoi se vor nlocui cheia i datele adiionale ale
lui z cu cheia i datele adiionale ale lui y.
Pseudocodul procedurii Arbore-terge organizeaz puin diferit aceste trei situaii.
Arbore-terge(T, z)
1: dac stnga[z] = nil sau dreapta[z] = nil atunci
2: yz
3: altfel
4: y Arbore-Succesor(z)
5: dac stnga[y] 6= nil atunci
6: x stnga[y]
7: altfel
8: x dreapta[y]
9: dac x 6= nil atunci
10: p[x] p[y]
11: dac p[y] = nil atunci
12: rdcin[T ] x
13: altfel dac y =stnga[p[y]] atunci
14: stnga[p[y]] x
15: altfel
16: dreapta[p[y]] x
17: dac y 6= z atunci
18: cheie[z] cheie[y] se copiaz i datele adiionale ale lui y
19: returneaz y
216 Capitolul 13 Arbori binari de cutare
Figura 13.4 tergerea unui nod z dintr-un arbore binar de cutare. n fiecare situaie, nodul care se
terge este haurat mai deschis dect celelalte. (a) Dac z nu are fii, pur i simplu se terge. (b) Dac z
are un singur fiu, z se elimin din arbore. (c) Dac z are doi fii, se elimin succesorul y al su, care are
cel mult un fiu, i apoi se nlocuiete cheia i datele adiionale ale lui z cu cheia i datele adiionale ale
lui y.
n liniile 14, algoritmul determin nodul y care se va scoate din arbore. Nodul y este fie
chiar nodul de intrare z (dac z are cel mult un fiu) fie succesorul lui z (dac z are doi fii). Apoi,
n liniile 58, x se seteaz fie la fiul diferit de nil al lui y fie la nil dac y nu are fii. Nodul
y este eliminat din arbore n liniile 916 prin modificarea pointerilor din p[y] i x. Eliminarea
lui y este oarecum complicat de necesitatea unei gestionri adecvate a cazurilor extreme cnd
x = nil sau cnd y este rdcina arborelui. n sfrit, liniile 1718 se vor executa cnd a fost
eliminat succesorul y al lui z i ele realizeaz mutarea cheii i datelor adiionale ale lui y n z,
scriind peste vechiul coninut al cheii i al datelor adiionale. Nodul y este ntors ca rezultat de
13.4. Arbori binari de cutare construii aleator 217
ctre procedur n linia 19, pentru ca procedura apelant s poat s-l recicleze, punndu-l n
lista de noduri libere. Procedura se execut ntr-un timp O(h) pe un arbore de nlime h.
Pe scurt, am demonstrat urmtoarea teorem.
Teorema 13.2 Operaiile pe mulimi dinamice Insereaz i terge se pot executa ntr-un
timp O(h) pe un arbore de nlime h.
Exerciii
13.3-1 Dai o versiune recursiv a procedurii Arbore-Insereaz.
13.3-2 Presupunem c se construiete un arbore binar de cutare prin inserarea repetat a unor
valori distincte. Artai c numrul de noduri examinate la cutarea unei valori n arbore este cu
1 mai mare dect numrul de noduri examinate la prima inserare a respectivei valori n arbore.
13.3-3 Fiind dat o mulime de n numere, aceasta se poate sorta prin construirea unui arbore
binar de cutare (folosind repetat Arbore-Insereaz pentru inserarea numerelor unul cte
unul) urmat de tiprirea numerelor prin traversarea n inordine a arborelui. Care sunt timpii de
execuie corespunztori celui mai defavorabil caz, respectiv celui mai favorabil caz pentru acest
algoritm de sortare?
13.3-4 Artai c dac un nod dintr-un arbore binar de cutare are doi fii, atunci succesorul
su nu are fiu stng iar predecesorul su nu are fiu drept.
13.3-5 Fie o alt structur de date care conine un pointer la un nod y dintr-un arbore
binar de cutare. Ce probleme pot s apar dac predecesorul z al lui y este ters din arbore
cu procedura Arbore-terge? Cum s-ar putea rescrie aceast procedur pentru a elimina
dificultile aprute?
13.3-6 Operaia de tergere este comutativ (n sensul c dac se terge prima dat nodul x i
apoi nodul y se obine acelai rezultat ca i atunci cnd se terge prima dat nodul y i apoi
nodul x)? Demonstrai sau dai un contraexemplu.
13.3-7 Cnd nodul z din Arbore-terge are doi fii, se poate elimina din arbore predecesorul
su i nu succesorul. Unii au demonstrat c o strategie echitabil, care d aceeai prioritate
(atenie) predecesorului i succesorului produce performane empirice mai bune. Cum ar trebui
modificat algoritmul Arbore-terge pentru a implementa o astfel de strategie echitabil?
Din pcate, se tie puin despre nlimea medie a unui arbore binar de cutare n cazul
cnd se folosesc att inserri ct i tergeri pentru a-l crea. Dac arborele ar fi creat numai prin
inserri, analiza ar fi mai simpl. Vom defini prin urmare noiunea de arbore binar de cutare
construit aleator cu n chei distincte, ca fiind acel arbore care se construiete prin inserarea
ntr-o ordine aleatoare a cheilor ntr-un arbore iniial vid, considernd c oricare dintre cele n!
permutri ale celor n chei este egal probabil. (Exerciiul 13.4-2 v va cere s artai c aceast
noiune este diferit de cea care presupune c orice arbore binar de cutare cu n chei are aceeai
probabilitate de apariie.) Scopul seciunii de fa este s demonstreze c nlimea medie a unui
arbore binar de cutare construit aleator avnd n chei este O(lg n).
Vom ncepe cu investigarea structurii arborilor binari de cutare care sunt construii folosind
numai operaii de inserare.
Lema 13.3 Notm cu T arborele care rezult prin inserarea a n chei distincte k1 , k2 , . . . , kn
(n ordine) ntr-un arbore binar de cutare iniial vid. Cheia ki este un strmo al cheii kj n T ,
pentru 1 i < j n, dac i numai dac:
ki = min{kl : 1 l i i kl > kj }
sau
ki = max{kl : 1 l i i kl < kj }.
Corolarul 13.4 Fie T arborele care rezult prin inserarea a n chei distincte k1 , k2 , . . . , kn (n
ordine) ntr-un arbore binar de cutare iniial vid. Pentru o cheie kj dat, unde 1 j n,
definim mulimile:
Figura 13.5 Ilustrarea celor dou mulimi Gj i Lj care conin cheile de pe drumul de la rdcina
unui arbore binar de cutare la cheia kj = 17. (a) Nodurile care au cheile n Gj sunt haurate cu negru,
iar nodurile care au cheile n Lj sunt albe. Toate celelalte noduri sunt haurate cu gris. Drumul n jos
de la rdcin la nodul cu cheia kj este ngroat. Cheile care sunt la stnga liniei ngroate sunt mai
mici dect kj , iar cele de la dreapta acestei linii sunt mai mari dect kj . Arborele se construiete prin
inserarea cheilor n ordinea dat de prima list din (b). Mulimea G0j = {21, 25, 19, 29} conine acele
elemente care se insereaz nainte de 17 i sunt mai mari dect 17. Mulimea Gj = {21, 19} conine
acele elemente care modific minimul elementelor din G0j . Astfel, 21 este n Gj deoarece el este primul
element din mulime. Cheia 25 nu este n Gj deoarece este mai mare dect elementul minim curent,
adic 21. Cheia 19 este n Gj deoarece ea este mai mic dect minimul curent care este 21 i deci noul
minim curent va fi 19. Cheia 29 nu este n Gj deoarece este mai mare dect elementul minim curent,
adic 19. Structura mulimilor L0j i Lj este simetric.
Atunci cheile de pe drumul de la rdcin la kj sunt chiar cheile din Gj Lj iar adncimea
oricrei chei kj din T este
d(kj , T ) = |Gj | + |Lj |.
Figura 13.5 ilustreaz cele dou mulimi Gj i Lj . Gj conine toate cheile ki inserate nainte de
kj astfel nct ki este cea mai mic cheie din k1 , k2 , . . . , ki care este mai mare dect kj (structura
lui Lj este simetric). Pentru a nelege mai bine mulimea Gj , s ncercm s gsim o metod
de enumerare a elementelor sale. Dintre cheile k1 , k2 , . . . , kj1 vom considera n ordine numai
pe acelea care sunt mai mari dect kj . Aceste chei formeaz mulimea notat n figur cu G0j .
220 Capitolul 13 Arbori binari de cutare
Pe msur ce inserm cheile, vom reine, n timp real, minimul. Mulimea Gj va fi format din
acele chei care suprascriu minimul.
Pentru a facilita analiza, vom simplifica oarecum scenariul actual. S presupunem c,ntr-
o mulime dinamic, se insereaz pe rnd n numere distincte, cte unul o dat. Dac toate
permutrile numerelor respective sunt egal probabile, de cte ori se modific n medie minimul
mulimii numerelor deja inserate? Pentru a rspunde la aceast ntrebare, s presupunem c al
i-lea numr inserat este ki , pentru i = 1, 2, . . . , n. Probabilitatea ca ki s fie minimul primelor
i numere este 1/i, deoarece rangul (poziia) lui ki ntre primele i numere este egal probabil cu
oricare dintre cele i ranguri posibile. Prin urmare, numrul mediu de modificri ale minimului
mulimii este
n
X 1
= Hn ,
i=1
i
unde Hn = ln n + O(1) este al n-lea numr armonic (vezi relaia (3.5) i problema 6-2).
Prin urmare, ne ateptm ca numrul de modificri ale minimului s fie aproximativ egal cu
ln n, iar lema urmtoare arat c probabilitatea ca numrul s fie mult mai mare este foarte
mic.
Lema 13.5 Fie k1 , k2 , . . . , kn o permutare oarecare a unei mulimi de n numere distincte i fie
|S| variabila aleatoare care este cardinalul mulimii
Atunci P r{|S| ( + 1)Hn } 1/n2 , unde Hn este al n-lea numr armonic, iar 4, 32 verific
ecuaia (ln 1) = 2.
Teorema 13.6 nlimea medie a unui arbore binar de cutare construit aleator cu n chei
distincte este O(lg n).
13.4. Arbori binari de cutare construii aleator 221
P r{|Gj | t/2}
= P r{|{ki : 1 i < j i kl > ki > kj pentru orice l < i}| t/2}
P r{|{ki : i n i kl > ki pentru orice l < i}| t/2}
= P r{|S| t/2} ,
unde S este definit n relaia (13.1). n sprijinul acestei afirmaii, s observm c probabilitatea
nu va descrete dac vom extinde intervalul de variaie al lui i de la i < j la i n, deoarece prin
extindere se vor aduga elemente noi la mulime. Analog, probabilitatea nu va descrete dac se
renun la condiia ki > kj , deoarece prin aceasta se nlocuiete o permutare a (de regul) mai
puin de n elemente (i anume acele chei ki care sunt mai mari dect kj ) cu o alt permutare
oarecare de n elemente.
Folosind o argumentare similar, putem demonstra c
Dac alegem t = 2( + 1)Hn , unde Hn este al n-lea numr armonic iar 4.32 verific ecuaia
(ln 1) = 2, putem aplica lema 13.5 pentru a concluziona c
Deoarece discutm despre un arbore binar de cutare construit aleator i cu cel mult n noduri,
probabilitatea ca adncimea oricruia dintre noduri s fie cel puin 2( + 1)Hn este, folosind
inegalitatea lui Boole (6.22), de cel mult n(2/n2 ) = 2/n. Prin urmare, n cel puin 1 2/n din
cazuri, nlimea arborelui binar de cutare construit aleator este mai mic dect 2( + 1)Hn i
n cel mult 2/n din cazuri nlimea este cel mult n. n concluzie, nlimea medie este cel mult
(2( + 1)Hn )(1 2/n) + n(2/n) = O(lg n).
Exerciii
13.4-1 Descriei un arbore binar de cutare cu n noduri astfel ca adncimea medie a unui nod
n arbore s fie (lg n) iar nlimea arborelui s fie (lg n). Ct de mare poate fi nlimea unui
arbore binar de cutare avnd n noduri dac adncimea medie a unui nod este (lg n)?
222 Capitolul 13 Arbori binari de cutare
13.4-2 Artai c noiunea de arbore binar de cutare avnd n chei ales arbitrar (suntem n
situaia n care oricare arbore binar de cutare avnd n chei este egal probabil a fi ales), este
diferit de noiunea de arbore binar de cutare avnd n noduri construit aleator, dat n aceast
seciune. (Indicaie: Analizai toate posibilitile pentru n = 3.)
Probleme
13-1 Arbori binari de cutare cu chei egale
Cheile egale pun probleme implementrii arborilor binari de cutare.
c. Se memoreaz o list de noduri avnd cheile egale cu cheia din x i se insereaz z n acea
list.
d. Se atribuie aleator lui x fie stnga[x], fie dreapta[x]. (Stabilii performana n cazul cel mai
defavorabil i deducei intuitiv performana n cazul mediu).
Figura 13.6 Un arbore cu rdcin care memoreaz irurile de bii 1011, 10, 011, 100 i 0. Fiecare cheie
a unui nod se poate determina prin traversarea drumului de la rdcin la nodul respectiv. Prin urmare
nu este nevoie s memorm cheile n noduri; cheile sunt afiate numai n scop ilustrativ. Nodurile sunt
haurate cu negru dac cheile care le corespund nu sunt n arbore; astfel de noduri sunt prezente numai
pentru a stabili un drum spre alte noduri.
De exemplu, dac a i b sunt iruri de bii, atunci 10100 < 10110 pe baza regulii 1 (punnd
j = 3), iar 10100 < 101000 pe baza regulii 2. Aceast ordonare este similar celei folosite n
dicionarele limbii engleze (i nu numai).
Structura de date arbore cu rdcin ilustrat n figura 13.6 memoreaz irurile de bii
1011, 10, 011, 100 i 0. Dac dorim s cutm o cheie a = a0 a1 . . . ap i ne aflm ntr-un nod
de adncime i, vom merge la stnga dac ai = 0 i la dreapta dac ai = 1. Fie S o mulime de
iruri de caractere binare distincte care au suma lungimilor egal cu n. Artai cum se folosete
arborele ce rdcin pentru a sorta lexicografic S ntr-un timp (n). De exemplu, n figura 13.6
rezultatul sortrii va fi irul 0, 011, 10, 100, 1011.
13-3 Adncimea medie a unui nod ntr-un arbore binar de cutare construit aleator
n aceast problem vom demonstra c adncimea medie a unui nod ntr-un arbore binar de
cutare avnd n noduri construit aleator este O(lg n). Cu toate c acest rezultat este mai slab
dect cel dat n teorema 13.6, tehnica pe care o vom folosi relev o similaritate surprinztoare
ntre construirea unui arbore binar de cutare i execuia algoritmului Quicksort-Aleator din
seciunea 8.3. Ne reamintim din capitolul 5 c lungimea drumului interior P (T ) al unui arbore
binar T este suma adncimilor nodurilor x, notat cu d(x, T ) peste toate nodurile x din T .
a. Demonstrai c adncimea medie a unui nod n T este
1 X 1
d(x, T ) = P (T ).
n n
xT
c. Notm cu P (n) lungimea medie a drumului interior al unui arbore binar de cutare
construit aleator avnd n noduri. Artai c
n1
1X
P (n) = (P (i) + P (n i 1) + n 1) .
n i=0
n1
2X
P (n) = P (k) + (n).
n
k=1
La fiecare apelare recursiv a algoritmului Quicksort, alegem aleator un element pivot pentru
a partiiona mulimea elementelor de sortat. Fiecare nod al unui arbore binar de cutare mparte
n dou mulimea de elemente care aparin subarborelui cu rdcina n respectivul nod.
a. Artai c b0 = 1 i c, pentru n 1,
n1
X
bn = bk bn1k .
k=0
X
B(x) = bn xn
n=0
(vezi problema 4-6 pentru definiia funciilor generatoare). Artai c B(x) = xB(x)2 + 1
i de aici c
1
B(x) = (1 1 4x).
2x
Note bibliografice 225
4n
bn = (1 + O(1/n)).
n3/2
Note bibliografice
Knuth [123] conine o discuie pertinent a arborilor binari de cutare simpli i de asemenea
a numeroase variante ale acestora. Se pare c arborii binari de cutare au fost descoperii inde-
pendent de mai muli cercettori la sfritul anilor 50.
14 Arbori rou-negru
4. Fiecare drum simplu de la un nod la un descendent care este frunz conine acelai numr
de noduri negre.
Lema 14.1 Un arbore rou-negru cu n noduri interne are nlimea mrginit superior de
2 lg(n + 1).
14.1. Proprietile arborilor rou-negru 227
Figura 14.1 Un arbore rou-negru n care nodurile negre sunt nnegrite, iar nodurile roii sunt gri.
Fiecare nod dintr-un asemenea arbore este fie rou fie negru, fiecare frunz (nil) este neagr, fiii unui
nod rou sunt ambii negri, iar oricare drum simplu de la un nod la un descendent frunz conine acelai
numr de noduri negre. Fiecare nod diferit de nil este marcat cu un numr ce reprezint nlimea
neagr a nodului; nodurile nil au nlimea neagr egal cu 0.
Demonstraie. Vom arta la nceput c subarborele care are ca rdcin un nod oarecare x
conine cel puin 2bh(x) 1 noduri interne. Aceast afirmaie va fi demonstrat prin inducie
dup nlimea nodului x. Dac nlimea lui x este 0, atunci x trebuie s fie frunz (nil), iar
subarborele cu rdcina x conine cel puin 2bh(x) 1 = 20 1 = 0 noduri interne. Pentru pasul de
inducie vom considera un nod x care are nlimea pozitiv i este nod intern cu doi fii. Fiecare fiu
are nlimea neagr egal fie cu bh(x), fie cu bh(x) 1, n funcie de culoarea sa (rou, respectiv
negru). Deoarece nlimea unui fiu al lui x este mai mic dect nlimea lui x, putem aplica
ipoteza induciei pentru a demonstra c fiecare fiu are cel puin 2bh(x)1 1 noduri interne. Prin
urmare, subarborele cu rdcina x conine cel puin (2bh(x)1 1)+(2bh(x)1 1)+1 = 2bh(x) 1
noduri interne, ceea ce demonstreaz afirmaia de mai sus.
Pentru a termina demonstraia lemei, notm cu h nlimea arborelui. Conform proprietii
3, cel puin jumtate dintre nodurile de pe orice drum simplu de la rdcin la o frunz, fr a
numra i rdcina, trebuie s fie colorate cu negru. Prin urmare, nlimea neagr a rdcinii
trebuie s fie cel puin h/2; de aici rezult
n 2h/2 1.
Mutnd pe 1 n membrul stng i logaritmnd ambii membri, obinem c lg(n + 1) h/2 sau
c h 2 lg(n + 1).
O consecin imediat a acestei leme este c operaiile pe mulimi dinamice Caut, Minim,
Maxim, Succesor i Predecesor se pot implementa pe arborii rou-negru ntr-un timp
O(lg n), deoarece pe un arbore binar de cutare de nlime h aceste operaii se pot executa
ntr-un timp O(h) (dup cum s-a artat n capitolul 13) i deoarece orice arbore rou-negru
cu n noduri este un arbore de cutare cu nlimea O(lg n). Cu toate c algoritmii Arbore-
Insereaz i Arbore-terge prezentai n capitolul 13 se execut ntr-un timp O(lg n) pe un
arbore rou-negru, ei nu sprijin direct operaiile Insereaz i terge pe mulimi dinamice,
deoarece ei nu garanteaz c arborele binar de cutare rezultat prin aplicarea lor va rmne
228 Capitolul 14 Arbori rou-negru
arbore rou-negru. n seciunile 14.3 i 14.4 vom vedea c i aceste dou operaii se pot executa
ntr-un timp O(lg n).
Exerciii
14.1-1 Trasai arborele binar de cutare complet de nlime 3 avnd cheile {1, 2, . . . , 15}.
Adugai frunze nil i colorai nodurile n trei moduri diferite astfel nct nlimile negre ale
arborilor rou-negru rezultai s fie 2, 3 i respectiv 4.
14.1-2 Presupunem c rdcina unui arbore rou-negru are culoarea rou. Dac i schimbm
culoarea n negru, noul arbore este tot rou-negru?
14.1-3 Artai c cel mai lung drum simplu de la un nod x, dintr-un arbore rou-negru, la o
frunz descendent are lungimea cel mult dublul lungimii celui mai scurt drum simplu de la nodul
x la o frunz descendent.
14.1-4 Care este cel mai mare numr posibil de noduri interne ntr-un arbore rou-negru cu
nlimea neagr k? Dar cel mai mic?
14.1-5 Descriei un arbore rou-negru avnd n chei care are cel mai mare raport posibil dintre
numrul de noduri interne roii i numrul de noduri interne negre. Care este acest raport? Care
arbore are cel mai mic raport, i care este acest raport?
14.2. Rotaii
Executnd pe arbori rou-negru avnd n chei operaiile defimite pe arbori de cutare
Arbore-Insereaz i Arbore-terge va consuma un timp de O(lg n). Deoarece ele modific
arborele, se poate ntmpla ca rezultatul efecturii lor s ncalce proprietile rou-negru
enumerate n seciunea 14.1. Pentru a reface aceste proprieti, att culorile unora dintre nodurile
arborelui ct i structura pointerilor trebuie modificate.
Structura pointerilor se modific prin rotaie, operaie local ntr-un arbore de cutare ce
conserv ordonarea cheilor n inordine. Figura 14.2 ilustreaz cele dou tipuri de rotaii: rotaii
la stnga i rotaii la dreapta. Cnd se efectueaz o rotaie la stnga pe un nod x, presupunem
c fiul drept al acestuia, y, este diferit de nil. Rotaia la stnga pivoteaz n jurul legturii de
la x la y. Ea transform pe y n rdcin a subarborelui, pe x n fiu stng al lui y i pe fiul stng
al lui y n fiu drept al lui x.
Pseudocodul pentru Rotete-Stnga presupune c dreapta[x] 6= nil.
Figura 14.3 ilustreaz modul de operare al algoritmului Rotete-Stnga. Codul pentru
Rotete-Dreapta este similar. Att Rotete-Stnga ct i Rotete-Dreapta se execut
n timp O(1). Prin rotaie se modific numai pointerii; toate celelalte cmpuri ale nodului rmn
aceleai.
14.2. Rotaii 229
Rotete-Stnga(T, x)
1: y dreapta[x] Seteaz y.
2: dreapta[x] stnga[y] Transform subarborele stng al lui y n subarbore drept al lui x.
3: dac stnga[y] 6= nil atunci
4: p[stnga[y]] x
5: p[y] p[x] Leag printele lui x de y.
6: dac p[x] = nil atunci
7: rdcin[T ] y
8: altfel
9: dac x =stnga[p[x]] atunci
10: stnga[p[x]] y
11: altfel
12: dreapta[p[x]] y
13: stnga[y] x Pune pe x ca fiu stng al lui y.
14: p[x] y
Exerciii
14.2-1 Trasai arborele rou-negru care rezult dup apelul procedurii Arbore-Insereaz
aplicat arborelui din figura 14.1, pentru cheia 36. Dac nodul inserat este colorat cu rou, va fi
arborele rezultat un arbore rou-negru? Dar dac este colorat cu negru?
14.2-2 Scriei pseudocodul pentru Rotete-Dreapta.
14.2-3 Fie a, b i c noduri arbitrare n subarborii , i respectiv din arborele plasat n partea
stng a figurii 14.2. Cum se modific adncimile nodurilor a, b i c cnd se efectueaz o rotaie
la dreapta pe nodul y din figur?
14.2-4 Artai c orice arbore binar de cutare avnd n noduri poate fi transformat n orice alt
arbore binar de cutare avnd n noduri, folosind O(n) rotaii. (Indicaie: Artai mai nti c
sunt suficiente cel mult n 1 rotaii la dreapta pentru a transforma arborele ntr-un lan spre
dreapta).
230 Capitolul 14 Arbori rou-negru
Figura 14.3 Un exemplu care ilustreaz modul n care procedura Rotete-Stnga(T, x) modific un
arbore binar de cutare. Frunzele nil sunt omise. Traversarea n inordine aplicat arborelui de intrare
i arborelui modificat produc aceeai list de valori de chei.
14.3. Inserarea
Inserarea unui nod ntr-un arbore rou-negru avnd n noduri se poate realiza ntr-un timp
O(lg n). Vom utiliza la nceput procedura Arbore-Insereaz (seciunea 13.3) pentru a insera
un nod x n arborele T considernd c T este un arbore binar de cutare obinuit i apoi l vom
colora pe x cu rou. Pentru a garanta conservarea proprietilor rou-negru, vom reface arborele
rezultat prin recolorarea nodurilor i efectuarea de rotaii. Majoritatea codului algoritmului RN-
Insereaz gestioneaz diversele cazuri ce pot apare n timpul refacerii proprietilor rou-negru
pentru arborele rezultat n urma execuiei algoritmului Arbore-Insereaz.
Codul algoritmului RN-Insereaz este mai puin complicat dect arat i l vom examina n
trei pai majori. La nceput vom determina ce nclcri ale proprietilor rou-negru se introduc
n liniile 12 cnd se insereaz n arbore nodul x i apoi acesta se coloreaz cu rou. Pe urm
vom examina motivaia principal a ciclului ct timp din liniile 319. n sfrit, vom explora
fiecare dintre cele trei cazuri n care se subdivide corpul ciclului ct timp i vom vedea cum sunt
atinse dezideratele. Figura 14.4 ilustreaz modul de funcionare al algoritmului RN-Insereaz
pe un arbore rou-negru eantion.
Care dintre proprietile rou-negru se pot nclca dup execuia liniilor 12? n mod sigur
proprietatea 1 se conserv, la fel i proprietatea 2, deoarece noul nod rou inserat are fiii setai pe
nil. Proprietatea 4, care afirm c numrul de noduri colorate cu negru este acelai pe orice drum
ce pleac dintr-un nod dat spre frunze, se pstreaz de asemenea, deoarece nodul x nlocuiete un
nod nil (negru), iar nodul x este rou i cu fiii colorai cu negru. Prin urmare, singura proprietate
14.3. Inserarea 231
care ar putea fi distrus este proprietatea 3, care afirm c un nod colorat cu rou nu poate avea
un fiu colorat i el cu rou. Mai exact, proprietatea 3 este nclcat dac printele lui x este
colorat cu rou, deoarece x este el nsui colorat astfel n linia 2. Figura 14.4(a) ilustreaz acest
caz dup ce nodul x a fost inserat i colorat cu rou.
RN-Insereaz(T, x)
1: Arbore-Insereaz(T, x)
2: culoare[x] rou
3: ct timp x 6=rdcin[T ] i culoare[p[x]]=rou execut
4: dac p[x] =stnga[p[p[x]]] atunci
5: y dreapta[p[p[x]]]
6: dac culoare[y] = rou atunci
7: culoare[p[x]] negru Cazul 1
8: culoare[y] negru Cazul 1
9: culoare[p[p[x]]] rou Cazul 1
10: x p[p[x]] Cazul 1
11: altfel
12: dac x = dreapta[p[x]] atunci
13: x p[x] Cazul 2
14: Rotete-Stnga(T, x) Cazul 2
15: culoare[p[x]] negru Cazul 3
16: culoare[p[p[x]]] rou Cazul 3
17: Rotete-Dreapta(T, p[p[x]]) Cazul 3
18: altfel
19: (La fel ca n clauza atunci interschimbnd dreapta cu stnga)
20: culoare[rdcin[T ]] negru
Scopul principal al ciclului ct timp din liniile 319 este s mute n sus n arbore nodul care
ncalc proprietatea 3 i n acelai timp s pstreze ca invariant proprietatea 4. La nceputul
fiecrei iteraii a ciclului, x va referi un nod colorat cu rou i care are printele colorat cu rou -
singura nclcare a proprietilor rou-negru din arbore. Exist dou rezultate posibile ale fiecrei
iteraii din ciclu: ori pointerul x se mut n sus n arbore, ori se efectueaz anumite rotaii i
ciclul se ncheie.
Exist de fapt ase cazuri care trebuie considerate n ciclul ct timp, ns trei dintre ele
sunt simetrice celorlalte trei, n funcie de cum printele p[x] al lui x este fiul stng sau fiul
drept al bunicului p[p[x]] al lui x, lucru care se determin n linia 4. Pseudocodul conine numai
cazul n care p[x] este fiul stng al printelui su, p[p[x]]. S-a fcut o presupunere important,
c rdcina arborelui este colorat cu negru - o proprietate care se garanteaz n linia 20 ori de
cte ori algoritmul se termin - deci p[x] nu este rdcina arborelui i p[p[x]] exist.
Cazul 1 se deosebete de cazurile 2 i 3 prin culoarea fratelui printelui lui x (unchiul lui
x). Linia 5 face pe y s refere unchiul dreapta[p[p[x]]] al lui x i apoi se face un test n linia 6.
Dac y este colorat cu rou, se execut cazul 1. Altfel, se vor executa cazurile 2 sau 3. n toate
cele trei cazuri, bunicul p[p[x]] al lui x este negru, deoarece printele p[x] al lui x este rou iar
proprietatea 3 este nclcat numai ntre x i p[x].
Prelucrrile corespunztoare cazului 1 (liniile 710) sunt ilustrate n figura 14.5. Acest caz
se execut cnd att p[x] ct i x sunt colorai cu rou. Deoarece p[p[x]] este colorat cu negru,
232 Capitolul 14 Arbori rou-negru
Figura 14.4 Modul de operare al algoritmului RN-Insereaz. (a) Nodul x dup inserare. Deoarece x
i printele su p[x] sunt ambii colorai cu rou, proprietatea 3 nu este verificat. Deoarece unchiul y al
lui x este tot rou, se poate folosi cazul 1 din cod. Nodurile sunt recolorate i pointerul x este mutat n
sus n arbore, rezultnd arborele prezentat n (b). Din nou, x i printele su p[x] sunt ambii colorai
cu rou, ns unchiul y al lui x este de data aceasta colorat cu negru. Deoarece x este fiul drept al lui
p[x], se poate folosi cazul 2. Se efectueaz o rotaie la stnga i arborele care rezult este prezentat n
(c). Acum x este fiul stng al printelui su i se va folosi cazul 3. Se efectueaz o rotaie la dreapta
care va produce arborele din (d), care este un arbore rou-negru valid.
14.3. Inserarea 233
att p[x] ct i x se pot colora cu negru, rezolvnd prin urmare conflictul c p[x] i x sunt ambii
colorai cu rou, i apoi vom colora pe p[p[x]] cu rou, conservnd astfel proprietatea 4. Singura
problem care poate s apar este ca p[p[x]] s aib la rndul su un printe colorat cu rou;
prin urmare trebuie s repetm ciclul ct timp cu p[p[x]] pe postul noului nod x.
n cazurile 2 i 3, culoarea unchiului y al lui x este neagr. Cele dou cazuri se deosebesc prin
aceea c x este fiul drept, respectiv fiul stng al lui p[x]. Liniile 1314 corespund cazului 2, care
este ilustrat mpreun cu cazul 3 n figura 14.6. n cazul 2, nodul x este fiul drept al printelui
su. Prin folosirea unei rotaii la stnga, acest caz se transform n cazul 3 (liniile 1517), n care
nodul x este fiul stng al printelui su. Deoarece att x ct i p[x] sunt colorai cu rou, rotaia
nu afecteaz nici nlimea neagr a nodurilor, nici proprietatea 4. Indiferent dac ajungem la
cazul 3 direct sau prin cazul 2, acum unchiul y al lui x este colorat cu negru, deoarece altfel
am fi executat cazul 1. n cazul 3 se execut dou schimbri de culoare i o rotaie la dreapta,
care conserv proprietatea 4, i apoi, deoarece nu mai avem dou noduri consecutive colorate cu
rou, am terminat. Corpul ciclului ct timp nu se va mai executa nc o dat deoarece acum
p[x] este colorat cu negru.
Care este timpul de execuie al algoritmului RN-Insereaz? Deoarece nlimea unui arbore
rou-negru avnd n noduri este O(lg n), apelul lui Arbore-Insereaz va consuma un timp
O(lg n). Corpul ciclului ct timp se repet numai cnd se execut cazul 1, i n acest caz pointerul
x urc n arbore. Prin urmare corpul ciclului ct timp se poate repeta tot de O(lg n) ori. n
concluzie, algoritmul RN-Insereaz se execut ntr-un timp total de O(lg n). Este interesant de
tiut c el nu execut niciodat mai mult de dou rotaii, deoarece ciclul ct timp se termin
n oricare din cazurile 2 i 3.
Exerciii
14.3-1 n linia 2 a algoritmului RN-Insereaz se seteaz la rou culoarea noului nod inserat x.
S observm c dac s-ar seta la negru culoarea lui x, atunci proprietatea 3 a arborilor rou-negru
nu ar fi nclcat. De ce nu s-a setat la negru culoarea lui x?
14.3-3 Desenai arborii rou-negru care rezult dup inserarea succesiv a cheilor 41, 38, 31,
12, 19, 8 ntr-un arbore rou-negru iniial vid.
14.3-5 Considerm un arbore rou-negru format prin inserarea a n noduri, folosind algoritmul
RN-Insereaz. Demonstrai c dac n > 1 atunci arborele are cel puin un nod colorat cu rou.
Figura 14.5 Cazul 1 al procedurii RN-Insereaz. Proprietatea 3 este nclcat deoarece x i printele
su p[x] sunt ambii colorai cu rou. Aceeai aciune este efectuat indiferent dac (a) x este fiul drept
sau (b) x este fiul stng. Fiecare dintre subarborii , , , i au rdcina colorat cu negru i toi au
aceeai nlime neagr. Codul pentru cazul 1 schimb culorile unor noduri, conservnd proprietatea 4:
toate drumurile n jos de la un nod fixat la frunze au acelai numr de noduri colorate cu negru. Ciclul
ct timp continu cu bunicul p[p[x]] al lui x pe post de noul nod x inserat. Orice nclcare a proprietii
3 poate s apar acum numai ntre noul x, care este colorat cu rou, i printele su, dac i acesta este
colorat cu rou.
14.4. tergerea
La fel ca i celelalte operaii de baz pe un arbore rou-negru cu n noduri, tergerea unui
nod consum un timp O(lg n). tergerea unui nod dintr-un arbore rou-negru nu este cu mult
mai complicat dect inserarea unui nod ntr-un astfel de arbore.
Pentru a face mai simple condiiile la limit (extreme) din cod, vom folosi o santinel pentru a
reprezenta nil (vezi pagina 176. Pentru un arbore rou-negru T , santinela nil[T ] este un obiect cu
aceleai cmpuri ca i un nod obinuit din arbore. Cmpul culoare al su este negru iar celelalte
cmpuri p, stnga, dreapta i cheie se pot seta la valori arbitrare. n arborele rou-negru,
toi pointerii la nil vor fi nlocuii cu pointeri la santinela nil[T ].
Santinelele se folosesc pentru a trata unitar toate nodurile arborelui: un fiu nil al unui nod
x se va putea considera ca i nod obinuit al crui printe este x. Am putea aduga cte un
14.4. tergerea 235
Figura 14.6 Cazurile 2 i 3 ale procedurii RN-Insereaz. Ca i n cazul 1, proprietatea 3 este nclcat
n oricare dintre cazurile 2 i 3 deoarece x i printele su p[x] sunt ambii colorai cu rou. Fiecare dintre
subarborii , , i au rdcina colorat cu negru i toi au aceeai nlime neagr. Cazul 2 se
transform n cazul 3 printr-o rotaie la stnga, care conserv proprietatea 4: toate drumurile n jos de
la un nod fixat la frunze au acelai numr de noduri colorate cu negru. Cazul 3 schimb culorile unor
noduri i efectueaz o rotaie la dreapta, care i ea conserv proprietatea 4. Apoi execuia ciclului ct
timp se termin, deoarece proprietatea 3 este verificat: nu mai exist dou noduri consecutive colorate
cu rou.
nod santinel distinct pentru fiecare nod nil din arbore, astfel c printele fiecrui nod nil ar fi
bine definit, ns aceast strategie ar nsemna un consum suplimentar de spaiu. n consecin,
vom folosi o singur santinel nil[T ] pentru a reprezenta toate nodurile nil. Cnd vom dori s
manipulm un fiu al unui nod x, va trebui s nu uitm s setm n prealabil p[nil[T ]] la x.
RN-terge(T, z)
1: dac stnga[z] = nil[T ] sau dreapta[z] = nil[T ] atunci
2: yz
3: altfel
4: y Arbore-Succesor(z)
5: dac stnga[y] 6= nil[T ] atunci
6: x stnga[y]
7: altfel
8: x dreapta[y]
9: p[x] p[y]
10: dac p[y] = nil[T ] atunci
11: rdcin[T ] x
12: altfel dac y =stnga[p[y]] atunci
13: stnga[p[y]] x
14: altfel
15: dreapta[p[y]] x
16: dac y 6= z atunci
17: cheie[z] cheie[y]
18: copiaz i celelalte cmpuri ale lui y
19: dac culoare[y] = negru atunci
20: RN-terge-Repar(T, x)
21: returneaz y
236 Capitolul 14 Arbori rou-negru
Dac nodul y eliminat n RN-terge este negru, tergerea lui are ca efect micorarea cu
1 a numrului de noduri negre de pe fiecare drum care a coninut acest nod. Prin urmare,
proprietatea 4 nu este respectat pentru toi strmoii nodului y. Acest inconvenient se poate
corecta considernd c nodul x are un negru suplimentar sau este dublu colorat cu negru.
Cu alte cuvinte, dac adugm 1 la numrul de noduri colorate cu negru de pe orice drum
care l conine pe x, atunci, n interpretarea de mai sus, proprietatea 4 este verificat. Cnd
vom elimina nodul y colorat cu negru, vom mpinge culoarea sa neagr n fiul su. Singura
problem care apare acum este aceea c nodul x ar putea fi dublu colorat cu negru, ceea ce
ncalc proprietatea 1.
Procedura RN-terge-Repar ncearc s refac proprietatea 1. Scopul ciclului ct timp
din liniile 124 este de a muta n sus n arbore nodul dublu colorat cu negru pn cnd
2. x refer rdcina, caz n care nodul dublu colorat cu negru este doar eliminat sau
n corpul ciclului ct timp, x refer ntotdeauna un nod colorat cu negru, care nu este rdcin i
care este dublu colorat cu negru. Linia 2 determin dac x este fiul stng sau drept al printelui
su p[x]. (Codul este dat pentru situaia n care x este fiul stng al printelui su; cazul cnd
x este fiu drept plasat n linia 24 este simetric). Se folosete un pointer w la fratele lui x.
Deoarece nodul x este dublu colorat cu negru, nodul w nu poate fi nil[T ]; dac ar fi, numrul
de noduri colorate cu negru pe drumul de la p[x] la nil, ar fi mai mic dect numrul de noduri
colorate cu negru pe drumul de la p[x] la x.
Cele patru cazuri expuse n cod sunt ilustrate n figura 14.7. nainte de a examina detaliat
fiecare caz n parte, s aruncm o privire general asupra modului n care se verific respectarea
proprietii 4 pentru transformrile efectuate n toate aceste cazuri. Ideea de baz este aceea
c n fiecare caz numrul de noduri colorate cu negru de la rdcin (incluznd i rdcina) la
fiecare dintre subarborii , , . . . , este conservat prin transformarea efectuat. De exemplu, n
figura 14.7(a), care corespunde cazului 1, numrul de noduri colorate cu negru de la rdcin la
oricare dintre subarborii sau este 3, att nainte ct i dup transformare. (S ne reamintim
c pointerul x refer un nod dublu colorat cu negru). Similar, numrul de noduri negre de la
rdcin la oricare dintre subarborii , , sau este 2, att nainte, ct i dup transformare. n
figura 14.7(b) numrarea trebuie s ia n considerare i culoarea c, care poate fi rou sau negru.
Dac notm numr(rou) = 0 i numr(negru) = 1, atunci numrul de noduri negre de la
rdcin la este 2+numr(c), att nainte, ct i dup transformare. Celelalte cazuri se pot
verifica ntr-o manier similar (exerciiul 14.4-5).
Cazul 1 (liniile 58 din RN-terge-Repar i figura 14.7(a)) apare cnd nodul w, fratele
nodului x, este colorat cu rou. Deoarece w trebuie s aib fiii colorai cu negru, putem
interschimba culorile lui w i p[x] i apoi s efectum o rotaie la stnga n p[x] fr a nclca nici
una dintre proprietile rou-negru. Noul frate al lui x, unul dintre fiii lui w, este acum colorat
cu negru i prin urmare am transformat cazul 1 ntr-unul din cazurile 2, 3 sau 4.
Cazurile 2, 3 i 4 apar cnd nodul w este colorat cu negru; ele se deosebesc prin culorile fiilor
lui w. n cazul 2 (liniile 1011 din RN-terge-Repar i figura 14.7(b)), ambii fii ai lui w sunt
colorai cu negru. Deoarece i w este colorat cu negru, vom scoate afar un negru att de la x
ct i de la w, lsnd x numai cu un negru, punnd w pe rou i adugnd un negru suplimentar
238 Capitolul 14 Arbori rou-negru
la p[x], care va deveni dublu colorat cu negru prin eliminarea negrului suplimentar din fiul su.
Apoi corpul ciclului ct timp se poate repeta cu p[x] pe post de nod x. S observm c dac
se ajunge la cazul 2 din cazul 1, atunci culoarea c a noului nod x este rou, deoarece nodul p[x]
original a fost rou, i prin urmare, dup execuia cazului 2, ciclul se va termina cnd se testeaz
condiia de ciclare.
Cazul 3 (liniile 1417 din RN-terge-Repar i figura 14.7(c)) apare cnd w este colorat
cu negru, fiul su stng este colorat cu rou, iar fiul su drept este colorat cu negru. Putem
interschimba culorile lui w i ale fiului su stng stnga[w] i apoi s efectum o rotaie la
dreapta n w fr a nclca proprietile rou-negru. Noul frate w al lui x este acum un nod
colorat cu negru care are un fiu drept colorat cu rou i prin urmare am transformat cazul 3 n
cazul 4.
Cazul 4 (liniile 1822 din RN-terge-Repar i figura 14.7(d)) apare cnd fratele w al
nodului x este colorat cu negru, iar fiul drept al lui w este colorat cu rou. Efectund anumite
schimbri de culoare i apoi o rotaie la stnga n p[x], se poate elimina negrul suplimentar din
x fr a nclca proprietile rou-negru. Setarea lui x ca rdcin provoac terminarea ciclului
ct timp cnd se testeaz condiia de continuare a ciclrii.
Care este timpul de execuie al procedurii RN-terge? Deoarece nlimea unui arbore
rou-negru avnd n noduri este O(lg n), costul total al procedurii fr a include i apelul lui RN-
terge-Repar este O(lg n). n RN-terge-Repar, fiecare din cazurile 1, 3 i 4 se termin
dup efectuarea unui numr constant de modificri de culoare urmate de cel mult trei rotaii.
Singurul caz n care corpul ciclului ct timp se repet este cazul 2, i n acesta pointerul x
se mut n sus n arbore de cel mult O(lg n) ori, fr a se efectua rotaii. n consecin, RN-
terge-Repar consum un timp de O(lg n) i efectueaz cel mult trei rotaii, iar timpul total
de execuie pentru RN-terge este de O(lg n).
Exerciii
14.4-1 Artai c dac un arbore rou-negru are rdcina colorat cu negru nainte de apelul
procedurii RN-terge, atunci culoarea rdcinii rmne aceeai i dup apel.
14.4-2 n exerciiul 14.3-3 ai determinat arborele rou-negru care rezult prin inserarea
succesiv a cheilor 41, 38, 31, 12, 19, 8 ntr-un arbore iniial vid. Desenai arborii rou-negru
care rezult prin tergerea succesiv a cheilor n ordinea 8, 12, 19, 31, 38, 41.
14.4-3 n care linii de cod din procedura RN-terge-Repar se inspecteaz sau se modific
santinela nil[T ]?
14.4-4 Simplificai codul procedurii Rotete-Stnga prin folosirea unei santinele pentru nil
i a unei alte santinele pentru a memora pointerul la rdcin.
14.4-5 Calculai numrul de noduri negre de la rdcin la fiecare dintre subarborii , , . . . ,
pentru fiecare din cazurile ilustrate n figura 14.7 i verificai dac fiecare numr rmne acelai
dup transformare. Dac un nod are culoarea c sau c0 , folosii notaia numr(c) sau numr(c0 )
pentru a exprima respectivul numr.
14.4-6 Presupunem c se insereaz un nod x ntr-un arbore rou-negru folosind procedura RN-
Insereaz i apoi acesta este ters imediat cu procedura RN-terge. ntrebarea este: arborele
care rezult dup tergerea lui x este identic cu arborele de dinainte de inserarea lui x? Justificai
rspunsul.
14.4. tergerea 239
Figura 14.7 Cazurile coninute n corpul ciclului ct timp al procedurii RN-terge. Nodurile
nnegrite sunt colorate cu negru, cele haurate cu gri nchis sunt colorate cu rou, iar cele haurate
cu gri deschis, care pot s fie colorate fie cu rou, fie cu negru, sunt notate cu c i c0 . Literele , , . . . ,
reprezint subarbori arbitrari. n fiecare caz, configuraia din stnga se transform n configuraia din
dreapta prin schimbarea unor culori i/sau efectuarea unei rotaii. Nodul referit de x este dublu colorat
cu negru. Singurul caz care provoac repetarea ciclrii este cazul 2. (a) Cazul 1 se transform ntr-unul
din cazurile 2, 3 sau 4 prin interschimbarea culorilor nodurilor B i D i efectuarea unei rotaii la stnga.
(b) n cazul 2, negrul suplimentar reprezentat de pointerul x se mut n sus n arbore prin colorarea
nodului D cu rou i setarea lui x pentru a referi nodul B. Dac se ajunge la cazul 2 de la cazul 1,
ciclul ct timp se termin deoarece culoarea c este rou. (c) Cazul 3 se transform n cazul 4 prin
interschimbarea culorilor nodurilor C i D i efectuarea unei rotaii la dreapta. (d) n cazul 4, negrul
suplimentar reprezentat de x se poate elimina prin schimbarea unor culori i efectuarea unei rotaii la
stnga (fr a nclca proprietile rou-negru) i apoi ciclul se termin.
240 Capitolul 14 Arbori rou-negru
Probleme
14-1 Mulimi dinamice persistente
n timpul descrierii unui algoritm avem cteodat nevoie s pstrm versiunile anterioare ale
unei mulimi dinamice cnd aceasta se modific. O astfel de mulime se numete persistent.
O modalitate de implementare a unei mulimi persistente este copierea ntregii mulimi ori de
cte ori aceasta se modific, ns aceast abordare poate ncetini programul i n acelai timp
consum mult spaiu. n unele situaii putem s procedm mai eficient.
Fie o mulime persistent S cu operaiile Insereaz, terge i Caut, care este
implementat folosind arbori binari de cutare, dup cum se arat n figura 14.8(a). Pentru
fiecare versiune a mulimii se memoreaz o rdcin distinct. Pentru a insera cheia 5 n mulime,
se creeaz un nod nou avnd cheia 5. Acest nod devine fiul stng al unui nod nou cu cheia 7,
deoarece nu putem modifica nodul existent avnd cheia 7. Similar, noul nod avnd cheia 7 devine
fiul stng al unui nod nou cu cheia 8 al crui fiu din dreapta este un nod existent avnd cheia
10. Noul nod cu cheia 8 devine, la rndul su, fiul drept al unei rdcini noi r0 avnd cheia 4 al
crei fiu stng este nodul existent cu cheia 3. Prin urmare se va copia numai o parte din arborele
iniial, aa cum se ilustreaz n figura 14.8(b).
Presupunem c fiecare nod din arbore are cmpurile cheie, stnga i dreapta, ns nu are un
cmp printe. (Vezi i exerciiul 14.3-6).
a. Identificai nodurile care trebuie modificate la inserarea unei chei k i la tergerea unui nod
y ntr-un/dintr-un arbore binar de cutare general i persistent.
c. Dac nlimea unui arbore binar de cutare persistent T este h, care sunt cerinele de timp
i spaiu pentru implementarea pe care ai dat-o pentru Persistent-Arbore-Insereaz?
(Cerinele de spaiu sunt proporionale cu numrul de noduri noi alocate).
d. Presupunem acum c fiecare nod are i un cmp printe. n acest caz, Persistent-
Arbore-Insereaz are nevoie de copierea unor informaii suplimentare. Demonstrai c
Persistent-Arbore-Insereaz va avea nevoie de un timp i spaiu (n), unde n este
numrul de noduri din arbore.
e. Artai cum se pot folosi arborii rou-negru pentru a se garanta c cerinele de timp i
spaiu n cazul cel mai defavorabil sunt de O(lg n) pentru inserare sau tergere.
Figura 14.8 (a) Un arbore binar de cutare avnd cheile 2, 3, 4, 7, 8, 10. (b) Arborele binar de cutare
persistent care rezult prin inserarea cheii 5. Cea mai recent versiune a mulimii const din nodurile
ce se pot accesa din rdcina r0 , iar versiunea anterioar este format din nodurile ce se pot accesa din
rdcina r. Nodurile haurate cu gri nchis sunt cele adugate pentru inserarea cheii 5.
a. Fiind dat un arbore rou-negru T , vom memora nlimea neagr a sa n cmpul bh[T ].
Artai c acest cmp se poate ntreine prin algoritmii RN-Insereaz i RN-terge fr
a fi nevoie de spaiu suplimentar de memorie n arbore i fr a mri timpii de execuie
asimptotici. Artai c nlimea neagr a fiecrui nod se poate determina pe parcursul
coborrii n T ntr-un timp O(1) pentru fiecare nod vizitat.
Note bibliografice
Ideea echilibrrii arborelui de cutare se datoreaz lui Adelson-Velskii i Landis [2], care au
introdus o clas de arbori de cutare echilibrai numii arbori AVL. n arborii AVL, echilibrarea
este meninut prin rotaii, ns pentru a reface echilibrarea ar putea fi necesare (lg n) rotaii
dup tergerea unui nod dintr-un arbore avnd n noduri. O alt clas de arbori de cutare,
numii 2-3 arbori, a fost introdus de J. E. Hopcroft n 1970 (manuscris nepublicat). ntr-un
2-3 arbore echilibrarea se menine prin manipularea gradelor nodurilor din arbore. Capitolul 19
242 Capitolul 14 Arbori rou-negru
se ocup cu B-arborii, care sunt o generalizare a 2-3 arborilor i au fost introdui de Bayer i
McCreight [18].
Arborii rou-negru au fost inventai de Bayer [17] sub numele de B-arbori binari simetrici.
Proprietile lor au fost studiate n detaliu de Guibas i Sedgewick [93], care au introdus i
convenia de colorare rou/negru.
Dintre celelalte clase de arbori binari echilibrai, probabil cea mai interesant este cea a
arborilor splay, introdui de Sleator i Tarjan [177], care sunt auto-ajustabili. (O bun des-
criere a arborilor splay este dat de Tarjan [188]). Arborii splay ntrein echilibrarea fr nici o
condiie explicit de echilibrare, cum ar fi de exemplu culoarea. n locul unei astfel de condiii, se
execut operaii splay n arbore (care implic rotaii) ori de cte ori se face o accesare. Costul
amortizat (vezi capitolul 18) al fiecrei operaii pe un arbore cu n noduri este O(lg n).
15 mbogirea structurilor de date
n ingineria programrii apar uneori situaii care nu necesit dect o structur de date clasic,
exact ca n carte ca de exemplu lista dublu nlnuit, tabela de dispersie sau arborele binar
de cutare ns majoritatea problemelor care trebuie rezolvate impun o anumit doz de
creativitate. Totui, doar n puine cazuri este nevoie s se creeze un tip complet nou de structur
de date. Mult mai frecvent este situaia cnd este suficient adugarea de informaii (cmpuri)
suplimentare la o structur de date clasic pentru ca aceasta s se poat folosi n aplicaia
dorit. Desigur, mbogirea structurilor de date nu este ntotdeauna simpl, deoarece informaia
adugat trebuie s fie actualizat i ntreinut prin operaiile ordinare ale structurii de date
respective.
Acest capitol prezint dou structuri de date care se construiesc prin mbogirea arborilor
rou-negru. Seciunea 15.1 descrie o structur de date care posed operaiile generale de statistic
de ordine pe o mulime dinamic. Cu ajutorul acestora se poate determina rapid al i-lea cel mai
mic numr din mulime sau rangul unui element dat n ordonarea total a mulimii. Seciunea
15.2 abstractizeaz procesul de mbogire a unei structuri de date i d o teorem care poate
simplifica mbogirea arborilor rou-negru. Seciunea 15.3 folosete aceast teorem pentru a
uura proiectarea unei structuri de date pentru ntreinerea unei mulimi dinamice de intervale,
ca de exemplu intervalele de timp. Fiind dat un interval de interogare, se poate determina rapid
un interval din mulime care se suprapune cu intervalul dat.
Figura 15.1 Un arbore de statistic de ordine care este de fapt un arbore rou-negru mbogit. Nodurile
haurate cu gri sunt roii, iar nodurile haurate cu negru sunt negre. Pe lng cmpurile uzuale, fiecare
nod x are un cmp dimensiune[x] care reprezint numrul de noduri din subarborele avnd rdcina x.
subarborelui drept al lui x la traversarea n inordine a arborelui, al i-lea cel mai mic element
din subarborele avnd rdcina x este al (i r)-lea cel mai mic element din subarborele avnd
rdcina dreapta[x]. Acest element se determin recursiv n linia 7.
Pentru a vedea cum funcioneaz SO-Selecteaz, s considerm cutarea pentru al 17-lea
cel mai mic element din arborele de statistic de ordine din figura 15.1. Se ncepe cu x egal cu
rdcina, a crei cheie este 26, i cu i = 17. Deoarece dimensiunea subarborelui stng al lui 26
este 12, rangul rdcinii 26 va fi 13. Prin urmare, tim deja c nodul cu rangul 17 este al 17 - 13
= 4-lea cel mai mic element din subarborele drept al lui 26. Dup apelul recursiv, x este nodul
avnd cheia 41, iar i = 4. Deoarece dimensiunea subarborelui stng al lui 41 este 5, rangul su n
subarborele n care acesta este rdcin, este 6. Prin urmare tim deja c nodul cu rangul 4 este
n al 4-lea cel mai mic element al subarborelui stng al lui 41. Dup apelul recursiv, x este nodul
avnd cheia 30, iar rangul su n subarborele pentru care este rdcin este 2. Prin urmare se
face un nou apel recursiv pentru a determina al 4 - 2 = 2-lea cel mai mic element din subarborele
avnd rdcina 38. La acest apel vom constata c subarborele stng are dimensiunea 1, ceea ce
nseamn c rdcina 38 este al 2-lea cel mai mic element. n consecin, acest ultim apel va
ntoarce un pointer la nodul avnd cheia 38 i execuia procedurii se termin.
Deoarece fiecare apel recursiv coboar un nivel n arborele de statistic de ordine, timpul
total pentru SO-Selecteaz este n cel mai defavorabil caz proporional cu nlimea arborelui.
Deoarece arborele este un arbore rou-negru, nlimea sa este O(lg n), unde n este numrul de
noduri. Prin urmare, timpul de execuie pentru SO-Selecteaz este O(lg n) pentru o mulime
dinamic avnd n elemente.
Procedura funcioneaz dup cum urmeaz. Rangul lui x poate fi considerat a fi numrul
de noduri inspectate naintea lui x la traversarea n inordine a arborelui plus 1. Se folosete
urmtorul invariant: la nceputul corpului ciclului ct timp din liniile 36, r este rangul lui
cheie[x] din subarborele avnd rdcina y. Acest invariant se calculeaz dup cum este descris
n continuare. n linia 1 se seteaz r la rangul lui cheie[x] din subarborele avnd rdcina x.
Datorit atribuirii y x din linia 2 invariantul este adevrat pentru prima execuie a testului
din linia 3. La fiecare iteraie a corpului ciclului ct timp, se lucreaz cu subarborele care are
rdcina p[y]. A fost contorizat deja numrul de noduri din subarborele avnd rdcina y care
precede pe x la traversarea n inordine, aa c va trebui s adunm la r numrul de noduri din
subarborele avnd rdcina fratele lui y care-l precede pe x la traversarea n inordine, plus 1,
pentru p[y] dac i p[y] l precede pe x. Dac y este un fiu stng, atunci att p[y], ct i toate
246 Capitolul 15 mbogirea structurilor de date
Figura 15.2 Actualizarea dimensiunii subarborilor n timpul rotaiilor. Cele dou cmpuri dimensiune
care trebuie actualizate sunt cele care sunt la capetele legturii n jurul creia se efectueaz rotaia.
Actualizrile sunt locale, necesitnd numai informaia dimensiune memorat n x, y i n rdcinile
subarborilor ilustrai prin triunghiuri.
nodurile din subarborele drept al lui p[y] sunt inspectate dup x la traversarea n inordine, deci
r nu se modific. Altfel, y este un fiu drept i toate nodurile din subarborele stng al lui p[y] sunt
inspectate naintea lui x, ca i p[y]. Prin urmare, n linia 5 se va aduna la valoarea curent a lui
r numrul dimensiune[stnga[p[y]]] + 1. Datorit atribuirii y p[y] invariantul este adevrat
pentru urmtoarea iteraie. Cnd y =rdcin[T ], procedura va returna valoarea lui r, care este
acum rangul lui cheie[x].
De exemplu, execuia algoritmului SO-Rang pe arborele de statistic de ordine din figura
15.1 pentru a determina rangul nodului avnd cheia 38 va produce urmtoarea secven de valori
pentru cheie[y] i r nregistrate la nceputul corpului ciclului ct timp:
iteraia cheie[y] r
1 38 2
2 30 4
3 41 4
4 26 17
Procedura va returna rangul 17.
Deoarece fiecare iteraie a ciclului ct timp consum un timp de O(1), iar y urc un nivel n
arbore la fiecare iteraie, timpul de execuie al algoritmului SO-Rang este, n cel mai defavorabil
caz, proporional cu nlimea arborelui: O(lg n) pentru un arbore de statistic de ordine avnd
n noduri.
Exerciii
15.1-1 Artai cum opereaz SO-Selecteaz(T, 10) pe arborele rou-negru T din figura 15.1.
15.1-2 Artai cum opereaz SO-Rang(T, x) pe arborele rou-negru T din figura 15.1 i nodul
x cu cheie[x] = 35.
15.1-4 Scriei o procedur recursiv SO-Rang-Cheie(T, k) care are ca date de intrare un arbore
de statistic de ordine T i o cheie k i ntoarce rangul cheii k n mulimea dinamic reprezentat
prin T . Presupunei c valorile cheilor din T sunt distincte.
15.1-5 Fiind dat un element x dintr-un arbore de statistic de ordine avnd n noduri i un
numr natural i, cum se poate determina ntr-un timp O(lg n) al i-lea succesor al lui x n
ordinea liniar a arborelui?
248 Capitolul 15 mbogirea structurilor de date
15.1-7 Artai cum se poate folosi un arbore de statistic de ordine pentru a numra inversiunile
(vezi problema 1-3) dintr-un tablou de dimensiune n ntr-un timp O(n lg n).
15.1-8 ? Considerm n coarde ntr-un cerc, fiecare definit de capetele sale. Descriei un
algoritm de timp O(n lg n) pentru determinarea numrului de perechi de coarde care se
intersecteaz n interiorul cercului. (De exemplu, dac cele n coarde sunttoate
diametre, acestea
se vor intersecta n centrul cercului i prin urmare rspunsul corect este n2 .) Presupunei c nu
exist dou coarde cu acelai capt.
La pasul 2 am adugat cmpurile dimensiune, care conin, pentru fiecare nod x, dimensiunea
subarborelui avnd rdcina x. n general, informaia suplimentar are ca scop s fac operaiile
(proprii structurii mbogite) mai eficiente. De exemplu, am fi putut implementa operaiile SO-
Selecteaz i SO-Rang folosind numai cheile memorate n arbore, ns n acest caz timpul lor
de execuie nu ar fi fost O(lg n). Uneori aceast informaie suplimentar conine referine i nu
date, ca n exerciiul 15.2-1.
Pentru pasul 3, ne-am asigurat c operaiile de inserare i tergere pot ntreine cmpurile
dimensiune fr a-i altera eficiena asimptotic, ele executndu-se tot ntr-un timp O(lg n).
n cazul ideal, un numr mic de modificri ale structurii de date, trebuie s fie suficient pentru
a ntreine informaia suplimentar. De exemplu, dac am memora n fiecare nod rangul su
din arbore, atunci operaiile SO-Selecteaz i SO-Rang s-ar executa mai rapid, dar inserarea
unui nou element minim n arbore, ar provoca modificarea acestei informaii (rangul) n fiecare
dintre nodurile arborelui. n schimb, dac memorm dimensiunea subarborilor n locul rangului,
inserarea unui nou element va necesita modificarea informaiei suplimentare doar n O(lg n)
noduri.
La pasul 4, am proiectat operaiile SO-Selecteaz i SO-Rang. De fapt, mbogirea
structurii de date este impus tocmai de nevoia de a implementa operaii noi. Uneori, informaia
suplimentar se va putea folosi nu numai la proiectarea operaiilor noi, ci i la reproiectarea celor
proprii structurii de date suport, ca n exerciiul 15.2-1.
celelalte cmpuri ale lui x i de informaia din fiii lui x; n acest caz, ambii fii ai lui x sunt nil.
O dat calculat valoarea f [x], modificarea ei se propag n sus n arbore. Prin urmare, timpul
total pentru prima faz a inserrii este O(lg n). n faza a doua singurele modificri structurale
ale arborelui provin din rotaii. Timpul total de actualizare al cmpurilor f este O(lg n) pentru
fiecare rotaie deoarece ntr-o rotaie se modific doar dou noduri. i deoarece la o inserare sunt
necesare cel mult dou rotaii, timpul total pentru inserare este tot O(lg n).
La fel ca inserarea, tergerea are tot dou faze (vezi seciunea 14.4). n prima faz se produc
modificri structurale n arbore n dou momente: cnd nodul care se terge este nlocuit cu
succesorul su i apoi cnd nodul care se terge sau succesorul su este eliminat din arbore.
Propagarea actualizrilor lui f provocate de aceste modificri necesit cel mult O(lg n) deoarece
modificrile sunt locale n arbore. Refacerea arborelui rou-negru din faza a doua a tergerii
necesit cel mult trei rotaii, iar fiecare rotaie necesit un timp cel mult egal cu O(lg n) pentru
a propaga actualizrile lui f . n consecin, timpul total consumat pentru tergere este acelai
cu cel consumat pentru inserare, adic O(lg n).
n multe situaii, cum ar fi ntreinerea cmpurilor dimensiune din arborii de statistic
de ordine, costul de actualizare dup o rotaie este O(1) i nu O(lg n), estimare folosit n
demonstraia teoremei 15.1. Exerciiul 15.2-4 conine un astfel de exemplu.
Exerciii
15.2-1 Artai cum se pot executa operaiile (interogrile) definite pe mulimi dinamice Minim,
Maxim, Succesor i Predecesor, ntr-un timp O(1), n cazul cel mai defavorabil, pe un arbore
mbogit de statistic de ordine. Performana asimptotic a celorlalte operaii pe arborii de
statistic de ordine trebuie s rmn aceeai.
15.2-2 Studiai dac nlimile negre ale nodurilor se pot considera cmpuri n nodurile unui
arbore, ntreinute corespunztor, fr ca performana asimptotic a oricreia dintre operaiile
arborilor rou-negru s fie afectat. Artai cum se poate realiza ntreinerea, dac rspunsul
este afirmativ sau justificai rspunsul negativ.
15.2-3 Studiai dac adncimile nodurilor dintr-un arbore rou-negru se pot considera cmpuri
ale nodurilor care se pot ntreine eficient. Artai cum se poate realiza ntreinerea dac
rspunsul este afirmativ sau justificai rspunsul negativ.
15.2-4 ? Fie un operator binar asociativ i fie a cmpul care trebuie ntreinut n fiecare
nod al unui arbore rou-negru. Presupunem c dorim s adugm fiecrui nod x din arbore
un cmp suplimentar f astfel nct f [x] = a[x1 ] a[x2 ] . . . a[xm ], unde x1 , x2 , . . . , xm este
lista n inordine a nodurilor din subarborele avnd rdcina x. Artai c aceste cmpuri f se
pot actualiza corespunztor ntr-un timp O(1) dup o rotaie. Modificnd puin argumentaia,
artai c i cmpurile dimensiune din arborii de statistic de ordine se pot ntreine ntr-un
timp O(1) pentru fiecare rotaie.
15.2-5 ? Dorim s mbogim arborii rou-negru cu o operaie numit RN-Enumer(x, a, b)
care afieaz toate cheile k din arborele rou-negru avnd rdcina x care verific relaia a
k b. Descriei modul n care se poate implementa RN-Enumer ntr-un timp (m + lg n),
unde m este numrul de chei care se afieaz, iar n este numrul de noduri interne din arbore.
(Indicaie: Nu este nevoie s se adauge cmpuri suplimentare la nodurile arborelui.)
15.3. Arbori de intervale 251
Figura 15.3 Trihotomia intervalelor, pentru dou intervale nchise i i i0 . (a) Cnd i i i0 se suprapun,
sunt patru situaii posibile; n fiecare dintre ele, jos[i] sus[i0 ] i jos[i0 ] sus[i]. (b) sus[i] < jos[i0 ].
(c) sus[i0 ] < jos[i].
a. i i i0 se suprapun,
b. sus[i] < jos[i0 ],
c. sus[i0 ] < jos[i].
Figura 15.4 Un arbore de intervale. (a) O mulime de 10 intervale, sortate de jos n sus dup captul
din stnga (inferior). (b) Arborele de intervale care le reprezint. Traversarea n inordine a acestui arbore
va produce lista nodurilor sortat dup captul din stnga.
captul superior al fiecrui interval este cel puin la fel de mare ca i captul inferior al acestuia,
max[x] va fi de fapt valoarea maxim a capetelor superioare ale intervalelor memorate n subar-
borele avnd rdcina x.
cu i vom vedea mai trziu de ce.) Intervalul din x, [8, 9] nu se suprapune cu i, i deoarece
max[stnga[x]] = 10 este mai mic dect jos[i] = 11 vom continua iniializnd x cu fiul su drept.
(S observm acum c n subarborele stng nu exist nici un interval care s se suprapun cu i.)
Intervalul din nodul x curent, adic [15, 23] nu se suprapune cu i, fiul su stng este nil, aa c
vom continua cu fiul su drept, care este i el nil, deci ciclul se ncheie i procedura returneaz
nil.
Pentru a studia corectitudinea algoritmului Interval-Caut, trebuie s nelegem de ce este
suficient s se examineze nodurile de pe un singur drum care pornete de la rdcin. Ideea de
baz este aceea c pentru orice nod x, dac int[x] nu se suprapune cu i, atunci cutarea continu
ntr-o direcie sigur: intervalul care se suprapune cu i va fi gsit cu siguran dac n arbore
exist un asemenea interval. Teorema urmtoare exprim mai riguros aceast proprietate.
Teorema 15.2 Considerm execuia unei iteraii a ciclului ct timp din algoritmul Interval-
Caut(T, i).
1. Dac se execut linia 4 (deci cutarea continu la stnga), atunci fie c subarborele stng
al lui x conine intervalul care se suprapune cu i, fie c n subarborele drept nu exist nici
un interval care se suprapune cu i.
2. Dac se execut linia 6 (deci cutarea continu la dreapta), atunci n subarborele stng al
lui x nu exist nici un interval care se suprapune cu i.
Figura 15.5 Intervalele pentru demonstraia teoremei 15.2. Valoarea lui max[stnga[x]] este marcat
n fiecare caz cu o linie ntrerupt. (a) Cazul 2: cutarea continu la dreapta. Nu exist nici un interval
i0 care s se suprapun cu i. (b) Cazul 1: cutarea continu la stnga. Fie c subarborele stng al lui x
conine un interval care se suprapune cu i (aceast situaie nu este ilustrat n figur), fie c exist un
interval i0 n subarborele stng al lui x astfel ca sus[i0 ] = max[stnga[x]]. Deoarece i nu se suprapune cu
i0 , orice alt interval i00 din subarborele stng al lui x nu se va suprapune cu i deoarece jos[i0 ] jos[i00 ].
Exerciii
15.3-1 Scriei pseudocodul procedurii Rotete-Stnga care opereaz pe nodurile unui arbore
de intervale i care actualizeaz cmpurile max ntr-un timp O(1).
15.3-2 Rescriei codul pentru Interval-Caut astfel ca el s funcioneze adecvat n cazul cnd
toate intervalele sunt deschise.
15.3-3 Descriei un algoritm eficient care, fiind dat un interval i, returneaz fie un interval care
se suprapune cu i i care are captul din stnga minim, fie nil dac nu exist un asemenea
interval.
15.3-4 Fiind dai un arbore de intervale T i un interval i, descriei cum se poate determina
lista tuturor intervalelor din T care se suprapun cu i ntr-un timp O(min(n, k lg n)), unde k este
numrul de intervale din list. (Opional: Gsii o soluie care nu modific arborele.)
15.3-5 Sugerai modificri ale procedurilor pentru arborele de intervale pentru a putea
implementa operaia Interval-Caut-Exact(T, i), care returneaz fie un pointer la un nod
x din arborele de intervale pentru care jos[int[x]] = jos[i] i sus[int[x]] = sus[i], fie nil dac
T nu conine un astfel de nod. Toate operaiile, inclusiv Interval-Caut-Exact trebuie s se
execute ntr-un timp de O(lg n) pe un arbore avnd n noduri.
15.3-6 Artai cum se poate ntreine o mulime dinamic Q de numere, care pentru operaia
Min-Dif returneaz mrimea diferenei dintre cele mai apropiate dou numere din Q. De
exemplu, dac Q = {1, 5, 9, 15, 18, 22}, atunci Min-Dif(Q) va returna 18 - 15 = 3, deoarece 15
256 Capitolul 15 mbogirea structurilor de date
i 18 sunt cele mai apropiate numere din Q. Realizai operaiile Insereaz, terge, Caut i
Min-Dif ct mai eficient i analizai timpii lor de execuie.
15.3-7 ? Bazele de date de circuite VLSI reprezint un circuit integrat ca o list de drept-
unghiuri. Presupunem c fiecare dreptunghi este orientat rectiliniu (adic are laturile paralele
cu axele x i y ale sistemului de coordonate), deci reprezentarea unui dreptunghi const din
valorile minime i maxime ale coordonatelor sale x i y. Dai un algoritm ce consum un timp
de O(n lg n) pentru a decide dac o mulime de dreptunghiuri astfel reprezentate conine sau
nu dou dreptunghiuri care se suprapun. Algoritmul nu trebuie s determine toate perechile de
coordonate care se intersecteaz, ci doar s raporteze c exist suprapunere i n cazul cnd
un dreptunghi acoper n ntregime alt dreptunghi, chiar dac laturile lor nu se intersecteaz.
(Indicaie: Deplasai o linie de baleiaj peste mulimea de dreptunghiuri.)
Probleme
15-1 Punctul de suprapunere maxim
Presupunem c dorim s memorm punctul de suprapunere maxim asociat unei mulimi
de intervale punctul coninut n cele mai multe intervale din mulime. Artai cum se poate
ntreine eficient acest punct de suprapunere maxim cnd se insereaz sau se terg intervale
n/din mulime.
Note bibliografice
Preparata i Shamos [160] descriu cteva dintre tipurile de arbori de intervale care apar n
literatur. Dintre cei mai importani din punct de vedere teoretic amintim aici cei descoperii
independent de H. Edelsbrunner (1980) i E.M. McCreight (1981), care, ntr-o baz de date cu
n intervale, permit enumerarea tuturor celor k intervale care suprapun un interval de interogare
dat ntr-un timp O(k + lg n).
IV Tehnici avansate de proiectare i analiz
Introducere
Aceast parte prezint trei tehnici importante pentru proiectarea i analiza algoritmilor
eficieni: programarea dinamic (capitolul 16), algoritmii greedy (capitolul 17) i analiza
amortizat (capitolul 18). Prile anterioare au tratat alte tehnici cu aplicare foarte larg cum
ar fi divide i stpnete, randomizarea i soluii recurente. Noile tehnici sunt oarecum mai
sofisticate dar sunt eseniale pentru abordarea eficient a multor probleme de calcul. Temele
introduse n aceast parte vor reaprea ulterior n carte.
n mod tipic, programarea dinamic este folosit pentru probleme de optimizare n care
trebuie fcute un numr finit de alegeri pentru a obine o soluie optimal. Deseori, pe msur
ce facem alegerile apar subprobleme de acelai tip. Programarea dinamic este eficient atunci
cnd o subproblem dat poate aprea din mai multe mulimi pariale de alegeri; tehnica cheie
este s stocm sau s memoizm soluia fiecrei subprobleme n cazul n care aceasta reapare.
Capitolul 16 arat cum aceast idee simpl poate transforma cu uurin algoritmi exponeniali
n algoritmi polinomiali.
La fel ca algoritmii de programare dinamic, algoritmii greedy se folosesc de obicei n probleme
de optimizare n care trebuie fcute un numr de alegeri pentru a ajunge la o soluie optim.
Idea unui algoritm greedy este de a face fiecare alegere ntr-o manier optim local. Un exemplu
simplu este plata restului cu numr minim de monede: pentru a minimiza numrul de monede
necesare pentru a obine restul de la o sum dat de bani este suficient s selectm n mod
repetat moneda cu cea mai mare valoare, dar nu mai mare dect restul rmas. 1 Exist multe
astfel de probleme pentru care o abordare greedy duce la gsirea unei soluii optimale mult mai
repede dect o abordare prin programare dinamic. Totui, nu este ntotdeauna uor de stabilit
dac o abordare greedy va fi eficient. Capitolul 17 recapituleaz teoria matroizilor care poate fi
de multe ori folositoare n stabilirea unei astfel de decizii.
Analiza amortizat este un instrument pentru analiza algoritmilor care execut o secven
de operaii similare. n loc s mrginim costul secvenei de operaii, mrginind separat costul
efectiv al fiecrei operaii, o analiz amortizat poate fi folosit pentru a furniza o margine a
costului efectiv al ntregii secvene. Un motiv pentru care aceast idee poate fi eficient este c,
ntr-o secven de operaii, s-ar putea s fie imposibil ca toate operaiile individuale s poat fi
efectuate n limitele cunoscute pentru cazul cel mai defavorabil. n timp ce unele operaii sunt
costisitoare, multe altele ar putea s nu fie la fel de costisitoare, din punct de vedere al timpului de
execuie. Analiza amortizat nu este doar un instrument de analiz; ea este i un mod de gndire
referitor la proiectarea algoritmilor deoarece proiectarea unui algoritm i analiza timpului su
de execuie sunt adesea strns legate ntre ele. Capitolul 18 introduce trei modaliti echivalente
de efectuare a unei analize amortizate asupra unui algoritm.
1 Pentru a fi siguri c restul poate fi ntotdeauna pltit, presupunem c exist moned avnd valoarea egal cu
unitatea.
16 Programarea dinamic
Paii 13 sunt baza unei abordri de tip programare dinamic. Pasul 4 poate fi omis dac
se dorete doar calculul unei singure soluii optime. n vederea realizrii pasului 4, deseori se
pstreaz informaie suplimentar de la execuia pasului 3, pentru a uura construcia unei
soluii optimale.
Seciunile care urmeaz vor folosi metoda programrii dinamice pentru a rezolva unele
probleme de optimizare. Seciunea 16.1 abordeaz problema nmulirii unui ir de matrice printr-
un numr minim de nmuliri scalare. Pe baza acestui exemplu-problem abordat prin metoda
programrii dinamice, seciunea 16.2 trateaz dou caracteristici eseniale pe care trebuie s
le prezinte problemele pentru ca programarea dinamic s fie o tehnic de soluionare viabil.
Seciunea 16.3 arat cum poate fi determinat cel mai lung subir comun a dou iruri. n final,
seciunea 16.4 folosete programarea dinamic pentru a gsi o triangulare optim pentru un
poligon convex, problem care este surprinztor de asemntoare nmulirii unui ir de matrice.
260 Capitolul 16 Programarea dinamic
Dou matrice A i B se pot nmuli numai dac numrul de coloane din A este egal cu
numrul de linii din B. Astfel, dac A este o matrice avnd dimensiunea p q i B este o matrice
avnd dimensiunea q r, matricea produs C este o matrice avnd dimensiunea p r. Timpul
necesar calculului matricei C este determinat de numrul de nmuliri scalare (a se vedea linia
8 din algoritm) care este pqr. n cele ce urmeaz, vom exprima timpii de execuie n funcie de
numrul de nmuliri scalare.
Pentru a ilustra modul n care apar costuri diferite la parantezri diferite ale produsului
de matrice, s considerm problema irului hA1 , A2 , A3 i de trei matrice. S presupunem c
dimensiunile matricelor sunt 10 100, 100 5 i, respectiv, 5 50. Dac efectum nmulirle
conform parantezrii ((A1 A2 )A3 ), atunci vom avea 10 100 5 = 5000 nmuliri scalare pentru
a calcula matricea A1 A2 de dimensiune 10 5, plus alte 10 5 50 = 2500 nmuliri scalare
pentru a nmuli aceast matrice cu matricea A3 . Astfel rezult un total de 7500 nmuliri
16.1. nmulirea unui ir de matrice 261
scalare. Dac, n schimb, vom efectua nmulirile conform parantezrii (A1 (A2 A3 )), vom avea
100 5 50 = 25.000 nmuliri scalare pentru a a calcula matricea A2 A3 de dimensiuni 100 50,
plus alte 10 100 50 = 50.000 nmuliri scalare pentru a nmuli A1 cu aceast matrice. Astfel
rezult un total de 75.000 nmuliri scalare. Deci, calculnd produsul conform primei parantezri,
calculul este de 10 ori mai rapid.
Problema nmulirii irului de matrice poate fi enunat n urmtorul mod: dndu-se
un ir hA1 , A2 , . . . , An i de n matrice, unde, pentru i = 1, 2, . . . , n, matricea Ai are dimensiunile
pi1 pi , s se parantezeze complet produsul A1 A2 An , astfel nct s se minimizeze numrul
de nmuliri scalare.
Problema 13-4 a cerut s se demonstreze c soluia acestei recurene este secvena de numere
Catalan:
P (n) = C(n 1),
unde
1 2n
C(n) = = (4n /n3/2 ).
n+1 n
Numrul de soluii este, deci, exponenial n n, i metoda forei brute a cutrii exhaustive este,
prin urmare, o strategie slab de determinare a modalitii de parantezare a irului de matrice.
O soluie recursiv
Al doilea pas n aplicarea metodei programrii dinamice este definirea valorii unei soluii
optime n mod recursiv, n funcie de soluiile optime ale subproblemelor. n cazul problemei
nmulirii irului de matrice, o subproblem const n determinarea costului minim al unei
parantezri a irului Ai Ai+1 Aj , pentru 1 i j n. Fie m[i, j] numrul minim de nmuliri
scalare necesare pentru a calcula matricea Ai..j ; costul modalitii optime de calcul a lui A1..n
va fi, atunci, m[1, n].
Putem defini m[i, j] n mod recursiv, dup cum urmeaz. Dac i = j, irul const dintr-o
singur matrice Ai..i = Ai i, pentru calculul produsului nu este necesar nici o nmulire scalar.
Atunci, m[i, i] = 0 pentru i = 1, 2, . . . , n. Pentru a calcula m[i, j] cnd i < j, vom folosi structura
unei soluii optimale gsite la pasul 1. S presupunem c descompunerea optim n paranteze
mparte produsul Ai Ai+1 Aj ntre Ak i Ak+1 , cu i k < j. Atunci, m[i, j] este egal cu
costul minim pentru calculul subprodusului Ai..k i Ak+1..j plus costul nmulirii acestor dou
matrice rezultat. Deoarece evaluarea produsului Ai..k Ak+1..j necesit pi1 pk pj nmuliri scalare,
vom obine
m[i, j] = m[i, k] + m[k + 1, j] + pi1 pk pj .
Aceast ecuaie recursiv presupune cunoaterea valorii lui k, lucru care nu este posibil.
Exist doar j i valori posibile pentru k, i anume k = i, i + 1, . . . , j 1. Deoarece parantezarea
optim trebuie s foloseasc una dintre aceste valori pentru k, va trebui s le verificm pe toate
pentru a o putea gsi pe cea mai bun. Atunci, definiia recursiv a costului minim a parantezrii
produsului Ai Ai+1 Aj devine
(
0 dac i = j,
m[i, j] = min {m[i, k] + m[k + 1, j] + pi1 pk pj } dac i < j. (16.2)
ik<j
Valorile m[i, j] exprim costul soluiilor optime ale subproblemelor. Pentru a putea urmri
modul de construcie a soluiei optime, s definim s[i, j] care va conine valoarea k pentru care
mprirea produsului Ai Ai+1 Aj produce o parantezare optim. Aceasta nseamn c s[i, j]
este egal cu valoarea k pentru care m[i, j] = m[i, k] + m[k + 1, j] + pi1 pk pj .
16.2, acest algoritm necesit un timp exponenial nu mai bun dect metoda forei brute folosit
pentru verificarea fiecrui mod de descompunere n paranteze a produsului de matrice.
Observaia important care se impune n acest moment este c avem relativ puine subpro-
bleme:
o problem pentru fiecare alegere a lui i i j ce satisfac 1 i j n, adic un total
de n2 + n = (n2 ). Un algoritm recursiv poate ntlni fiecare subproblem de mai multe ori pe
ramuri diferite ale arborelui su de recuren. Acest proprietate de suprapunere a subproble-
melor este a doua caracteristic a programrii dinamice.
n loc s calculm recursiv soluia recurenei (16.2), vom aplica cel de-al treilea pas al
schemei generale a metodei programrii dinamice i vom calcula costul optimal cu o abordare
bottom-up. Algoritmul urmtor presupune c matricea Ai are dimensiunile pi1 pi pentru
i = 1, 2, . . . , n. Intrarea este secvena hp0 , p1 , . . . , pn i, unde lungime[p] = n + 1. Procedura
folosete un tablou auxiliar m[1..n, 1..n] pentru costurile m[i, j] i un tablou auxiliar s[1..n, 1..n]
care nregistreaz acea valoare a lui k pentru care s-a obinut costul optim n calculul lui m[i, j].
Ordine-ir-Matrice(p)
1: n lungime[p] 1
2: pentru i 1, n execut
3: m[i, i] 0
4: pentru l 2, n execut
5: pentru i 1, n l + 1 execut
6: j i+l1
7: m[i, j]
8: pentru k i, j 1 execut
9: q m[i, k] + m[k + 1, j] + pi1 pk pj
10: dac q < m[i, j] atunci
11: m[i, j] q
12: s[i, j] k
13: returneaz m, s
pe direcia nord-est din Ai i pe direcia nord-vest din Aj . Fiecare rnd orizontal din tablou
conine valorile pentru iruri de matrice de aceeai lungime. Procedura Ordine-ir-Matrice
calculeaz rndurile de jos n sus i de la stnga la dreapta n cadrul fiecrui rnd. O valoare
m[i, j] este calculat pe baza folosirii produselor pi1 pk pj pentru k = i, i+1, . . . , j 1 i a tuturor
valorilor aflate pe direcia sud-est i sud-vest fa de m[i, j].
O simpl examinare a structurii de ciclu imbricat din Ordine-ir-Matrice conduce la
constatarea c timpul de execuie a algoritmului este O(n3 ). n fiecare dintre cele trei cicluri
imbricate, indicii acestora (l, i i k) iau cel mult n valori. Exerciiul 16.1-3 cere s se demonstreze
c timpul de execuie al acestui algoritm este (n3 ). Algoritmul necesit un spaiu (n2 ) pentru
a stoca tablourile m i s. De aceea, algoritmul Ordine-ir-Matrice este mult mai eficient
dect metoda de enumerare a tuturor variantelor de parantezare a produsului de matrice i de
verificare a acestora.
16.1. nmulirea unui ir de matrice 265
Exerciii
16.1-1 Gsii o parantezare optim a produsului unui ir de matrice al crui ir de dimensiuni
este h5, 10, 3, 12, 5, 50, 6i.
16.1-3 Fie R(i, j) numrul de accesri ale elementului m[i, j] din tabloul m, de ctre algoritmul
Ordine-ir-Matrice, pentru calcularea celorlalte elemente ale tabloului. Artai c, pentru
ntregul tablou, numrul total de accesri este
n X
X n
n3 n
R(i, j) = .
i=1 j=i
3
Pn
(Indicaie: Identitatea i=1 i2 = n(n + 1)(2n + 1)/6 poate fi util.)
16.1-4 Artai c o parantezare complet a unei expresii cu n elemente are exact n 1 perechi
de paranteze.
266 Capitolul 16 Programarea dinamic
Substructura optim
Primul pas al rezolvrii unei probleme de optimizare prin programare dinamic const n
caracterizarea structurii unei soluii optime. Spunem c problema prezint o substructur
optim dac o soluie optim a problemei include soluii optime ale subproblemelor. Ori de
cte ori o problem prezint o structur optim, acesta este un bun indiciu pentru posibilitatea
aplicrii programrii dinamice. (De asemenea, aceasta nseamn c se pot, totui, aplica i
strategii greedy; a se vedea capitolul 17).
n seciunea 16.1 am vzut c problema nmulirii irului de matrice prezint o substruc-
tur optim. Am observat c o parantezare optim pentru A1 A2 An , care separ produsul
ntre Ak i Ak+1 , include soluii optime pentru problemele parantezrii matricelor A1 A2 Ak
i Ak+1 Ak+2 An . Tehnica utilizat pentru a arta c subproblemele au soluii optime este
clasic. Presupunem c exist o soluie mai bun pentru o subproblem i artm c aceast
presupunere contrazice optimalitatea soluiei problemei iniiale.
Substructura optim a unei probleme sugereaz, deseori, un spaiu potrivit al subpro-
blemelor pentru care se poate aplica programarea dinamic. De obicei, exist mai multe
clase de subprobleme care pot fi considerate naturale pentru o problem. De exemplu,
spaiul subproblemelor pe care le-am considerat la nmulirea irului de matrice coninea toate
subsecvenele irului de intrare. La fel de bine, am fi putut alege ca spaiu al subproblemelor
secvene arbitrare de matrice din irul de intrare, dar acest spaiu al subproblemelor ar fi fost
prea mare. Un algoritm de programare dinamic bazat pe acest spaiu al subproblemelor ar
rezolva mult mai multe probleme dect ar fi necesar.
Investigarea substructurii optime a unei probleme prin iterarea instanelor subproblemelor
acesteia este o metod bun pentru a gsi un spaiu potrivit de subprobleme pentru programarea
dinamic. De exemplu, dup examinarea structurii unei soluii optime a problemei nmulirii
irului de matrice, putem itera i examina structura soluiilor optime ale subproblemelor, a sub-
subproblemelor i aa mai departe. Descoperim, astfel, c toate subproblemele sunt compuse din
subsecvene ale irului hA1 , A2 , . . . , An i. Deci, mulimea irurilor de forma hAi , Ai+1 , . . . , Aj i cu
1 i j n este un spaiu de subprobleme natural i rezonabil de utilizat.
Suprapunerea subproblemelor
O a doua component pe care trebuie s o aib o problem de optimizare pentru ca
programarea dinamic s fie aplicabil este ca spaiul subproblemelor s fie restrns, n sensul c
un algoritm recursiv rezolv mereu aceleai subprobleme, n loc s genereze subprobleme noi. De
16.2. Elemente de programare dinamic 267
Figura 16.2 Arborele de recuren pentru calculul apelului ir-Matrice-Recursiv(p, 1, 4). Fiecare
nod conine parametrii i i j. Calculele efectuate n subarborii haurai sunt nlocuite de apariia unui
tablou de echivalen n ir-Matrice-Memorat(p, 1, 4).
obicei, numrul total de subprobleme distincte este dependent polinomial de dimensiunea datelor
de intrare. Cnd un algoritm recursiv abordeaz mereu o aceeai problem, se spune c problema
de optimizare are subprobleme suprapuse. Spre deosebire de aceasta, o problem care se
rezolv cu un algoritm de tip divide i stpnete genereaz, la fiecare nou etap, probleme
noi. n general, algoritmii de programare dinamic folosesc suprapunerea subproblemelor prin
rezolvarea o singur dat a fiecrei subprobleme, urmat de stocarea soluiei ntr-un tablou unde
poate fi regsit la nevoie, necesitnd pentru regsire un timp constant.
Pentru a ilustra proprietatea de subprobleme suprapuse, vom reexamina problema nmulirii
irului de matrice. Revenind la figura 16.1, observm c algoritmul Ordine-ir-Matrice preia,
n mod repetat, soluiile subproblemelor din liniile de jos atunci cnd rezolv subproblemele din
liniile superioare. De exemplu, valoarea m[3, 4] este referit de patru ori: n timpul calculelor
pentru m[2, 4], m[1, 4], m[3, 5] i m[3, 6]. Dac m[3, 4] ar fi recalculat de fiecare dat n loc s fie
preluat din tablou, creterea timpului de execuie ar fi dramatic. Pentru a vedea aceasta, s
considerm urmtoarea procedur recursiv (ineficient) care determin m[i, j], numrul minim
de nmuliri scalare necesare pentru a calcula produsul irului de matrice Ai..j = Ai Ai+1 . . . Aj .
Procedura este bazat direct pe recurena (16.2).
ir-Matrice-Recursiv(p, i, j)
1: dac i = j atunci
2: returneaz 0
3: m[i, j]
4: pentru k i, j 1 execut
5: q ir-Matrice-Recursiv(p, i, k) + ir-Matrice-Recursiv(p, k + 1, j) + pi1 pk pj
6: dac q < m[i, j] atunci
7: m[i, j] q
8: returneaz m[i, j]
De fapt, putem arta c timpul de execuie T (n) necesar pentru calculul lui m[1, n] prin
aceast procedur recursiv este cel puin exponenial n n. S presupunem c executarea liniilor
12 i a liniilor 67 ia cel puin un timp egal cu unitatea. Inspectarea procedurii conduce la
recurena
T (1) 1,
n1
X
T (n) 1+ (T (k) + T (n k) + 1), pentru n > 1.
k=1
Vom arta c T (n) = (2n ) folosind inducia matematic. Mai precis, vom arta c T (n)
n1
2 pentru orice n 1. Pentru n = 1, este clar c T (1) 1 = 20 . Prin inducie, pentru n 2
avem
n1
X n2
X
T (n) 2 2i1 + n = 2 2i + n = 2(2n1 1) + n = (2n 2) + n 2n1 ,
i=1 i=0
Memoizarea
Vom prezenta n continuare o variant a programrii dinamice, care mrete, deseori, eficiena
abordrii uzuale a programrii dinamice, folosind n acelai timp o strategie top-down. Ideea
este de a memoiza algoritmul recursiv natural, dar despre care am artat c este ineficient. Ca
i n cazul programrii dinamice obinuite, soluiile subproblemelor se pstreaz ntr-un tablou,
dar structura de control pentru completarea tabloului este mult mai asemntoare algoritmului
recursiv.
Un algoritm recursiv memoizat folosete un element al tabloului pentru fiecare soluie a
fiecrei subprobleme. Fiecare element al tabloului conine, la nceput, o valoare special care
indic faptul c respectivul element trebuie completat. Atunci cnd subproblema este ntlnit
prima oar pe parcursul execuiei algoritmului recursiv, soluia sa este calculat i apoi stocat
16.2. Elemente de programare dinamic 269
n tablou. Dup aceasta, ori de cte ori este ntlnit subproblema respectiv, valoarea stocat
n tablou este cutat i regsit.1
Procedura urmtoare este versiunea memoizat a procedurii ir-Matrice-Recursiv.
ir-Matrice-Memoizat(p)
1: n lungime[p] 1
2: pentru i 1, n execut
3: pentru j i, n execut
4: m[i, j]
5: returneaz ir-Echivalent(p, 1, n)
ir-Echivalent(p, i, j)
1: dac m[i, j] < atunci
2: returneaz m[i, j]
3: dac i = j atunci
4: m[i, j] 0
5: altfel
6: pentru k i, j 1 execut
7: q ir-Echivalent(p, i, k) + ir-Echivalent(p, k + 1, j) + pi1 pk pj
8: dac q < m[i, j] atunci
9: m[i, j] q
10: returneaz m[i, j]
este stabilit relaia dintre poziiile din tablou i subprobleme. O alt abordare presupune memorarea indexat
(hashing), folosind parametrii subproblemelor drept chei de cutare.
270 Capitolul 16 Programarea dinamic
n concluzie, problema nmulirii irului de matrice se poate rezolva n timp O(n3 ) fie printr-
un algoritm top-down cu memoizare, fie printr-un algoritm de programare dinamic bottom-
up. Ambele metode folosesc proprietatea subproblemelor suprapuse. n total exist numai
(n2 ) subprobleme distincte i fiecare dintre metodele amintite rezolv fiecare subproblem o
singur dat. Fr memoizare, algoritmul recursiv natural necesit un timp exponenial, deoarece
subproblemele sunt rezolvate n mod repetat.
n practic, dac toate subproblemele trebuie rezolvate cel puin o dat, un algoritm de
programare dinamic bottom-up mbuntete cu un factor constant un algoritm top-
down cu memoizare, deoarece nu apare efortul suplimentar necesitat de recuren, iar pentru
gestionarea tabloului, efortul suplimentar este mai mic. Mai mult chiar, exist probleme pentru
care modul regulat de accesare a tabloului n metoda programrii dinamice poate fi folosit pentru
a reduce suplimentar timpul sau spaiul necesar. Reciproc, dac unele subprobleme din spaiul
subproblemelor nu trebuiesc rezolvate deloc, soluia cu memoizare are avantajul de a rezolva
numai subproblemele necesare.
Exerciii
16.2-1 Comparai recurena (16.4) cu recurena (8.4), aprut n analiza timpului mediu de
execuie al algoritmului de sortare rapid. Explicai, intuitiv, de ce soluiile celor dou recurene
sunt att de diferite.
16.2-2 Care este modul cel mai eficient de determinare a numrului optim de nmuliri n
problema produsului de matrice: enumerarea tuturor parantezrilor posibile ale produsului
i calculul numrului de nmuliri pentru fiecare descompunere, sau execuia procedurii ir-
Matrice-Recursiv? Justificai rspunsul.
este un CMLSC pentru X i Y , la fel i irul hB, D, A, Bi, deoarece nu exist un subir comun
de lungime cel puin 5.
n problema celui mai lung subir comun, se dau dou iruri X = hx1 , x2 , . . . , xm i i
Y = hy1 , y2 , . . . , yn i i se dorete determinarea unui subir comun de lungime maxim pentru
X i Y . Aceast seciune va arta c problema CMLSC poate fi rezolvat eficient prin metoda
programrii dinamice.
Pentru tabloul b din figura 16.3, aceast procedur tiprete BCBA. Procedura necesit
un timp de O(m + n), deoarece, cel puin unul dintre i i j este decrementat n fiecare etap a
recurenei.
mbuntirea codului
O dat ce s-a construit un algoritm, se descoper c, deseori, timpul de execuie sau spaiul
folosit pot fi mbuntite. Acest lucru este adevrat, mai ales, pentru programarea dinamic
clasic. Anumite modificri pot simplifica implementarea i pot mbunti factorii constani, dar
nu pot aduce o mbuntire asimptotic a performanei. Alte modificri pot aduce mbuntiri
asimptotice substaniale att pentru timpul de execuie ct i pentru spaiul ocupat. De exemplu,
se poate elimina complet tabloul b. Fiecare element c[i, j] depinde de numai trei alte elemente ale
tabloului c: c[i 1, j 1], c[i 1, j] i c[i, j 1]. Dndu-se valoarea lui c[i, j], se poate determina,
n timp O(1), care dintre aceste trei valori a fost folosit pentru calculul lui c[i, j] fr a mai folosi
274 Capitolul 16 Programarea dinamic
Exerciii
16.3-1 Determinai un CMLSC pentru h1, 0, 0, 1, 0, 1, 0, 1i i h0, 1, 0, 1, 1, 0, 1, 1, 0i.
16.3-2 Artai cum poate fi reconstituit un CMLSC pe baza tabloului c (completat) i a irurilor
iniiale X = hx1 , x2 , . . . , xm i i Y = hy1 , y2 , . . . , yn i n timp O(m + n), fr a folosi tabloul b.
16.4. Triangularea optim a poligoanelor 275
16.3-4 Artai cum se poate calcula lungimea unui CMLSC folosind doar 2 min(m, n) elemente
din tabloul c i un spaiu suplimentar de O(1). Indicai apoi modul de realizare a acestui calcul
folosind doar min(m, n) elemente i un spaiu suplimentar O(1).
16.3-5 Dai un algoritm de complexitate n timp O(n2 ) care gsete cel mai lung subir monoton
cresctor al unui ir de n numere.
16.3-6 ? Scriei un algoritm cu complexitate n timp O(n lg n) care gsete cel mai lung subir
monoton cresctor al unui ir de n numere. (Indicaie: observai c ultimul element al unui subir
candidat de lungime i este cel puin la fel de mare ca ultimul element al subirului candidat de
lungime i 1. Pstrai subirurile candidate legndu-le prin secvena de intrare.)
Figura 16.4 Dou modaliti de triangulare ale unui poligon convex. Fiecare triangulare a acestui
poligon avnd 7 laturi are 7 3 = 4 coarde i mparte poligonul n 7 2 = 5 triunghiuri.
coardele lui P . Problema care se pune este gsirea unei triangulri care minimizeaz suma
ponderilor triunghiurilor din triangulare. O funcie de ponderare care pare natural este
unde |vi vj | reprezint distana euclidian de la vi la vj . Algoritmul pe care l vom descrie este
independent de alegerea funciei de ponderare.
Corespondena cu parantezarea
Exist o surprinztoare coresponden ntre triangularea unui poligon i parantezarea unei
expresii cum ar fi produsul unui ir de matrice. Aceast coresponden poate fi explicat cel mai
bine folosind arbori.
O parantezare complet a unei expresii corespunde unui arbore binar complet, uneori numit
i arbore de analiz gramatical a unei expresii. Figura 16.5(a) prezint un arbore de analiz
gramatical pentru parantezarea produsului irului de matrice
Fiecare frunz a arborelui de analiz gramatical este etichetat cu unul dintre elementele
atomice din expresie (n cazul de fa matrice). Dac rdcina unui subarbore al arborelui de
analiz are un subarbore stng reprezentnd o expresie Es i un subarbore drept reprezentnd o
expresie Ed , atunci subarborele nsui reprezint expresia (Es Ed ). Aceasta este o coresponden
biunivoc ntre arborii de analiz gramatical i expresiile complet parantezate avnd n elemente
atomice.
O triangulare a unui poligon convex hv0 , v1 , . . . , vn1 i poate fi reprezentat, de asemenea,
printr-un arbore de analiz gramatical. Figura 16.5(b) prezint un astfel de arbore corespun-
ztor triangulrii poligonului din figura 16.4(a). Nodurile interne ale arborelui sunt coarde n
triangulare, iar latura v0 v6 este rdcina. Frunzele sunt celelalte laturi ale poligonului. Rdcina
v0 v6 este o latur a triunghiului 4v0 v3 v6 . Acest triunghi determin fiii rdcinii: unul este
16.4. Triangularea optim a poligoanelor 277
Figura 16.5 Arbori de analiz gramatical. (a) Arbore de analiz pentru parantezarea produsului
((A1 (A2 A3 ))(A4 (A5 A6 ))) i pentru triangularea poligonului avnd 7 laturi din figura 16.4(a). (b)
Triangularea poligonului, suprapus cu arborele de analiz. Fiecare matrice Ai corespunde laturii vi1 vi
pentru i = 1, 2, . . . , 6.
coarda v0 v3 , iar cellalt este coarda v3 v6 . S observm c acest triunghi mparte poligonul dat
n trei pri: triunghiul 4v0 v3 v6 nsui, poligonul hv0 , v1 , . . . , v3 i i poligonul hv3 , v4 , . . . , v6 i. Mai
mult, cele dou subpoligoane sunt formate, n ntregime, din laturi ale poligonului considerat,
cu excepia rdcinilor arborilor asociai lor, care sunt coardele v0 v3 i v3 v6 . ntr-o manier
recursiv, poligonul hv0 , v1 , . . . , v3 i conine subarborele stng al rdcinii arborelui de analiz,
iar poligonul hv3 , v4 , . . . , v6 i conine subarborele drept.
n general, o triangulare a unui poligon avnd n laturi corespunde unui arbore de analiz
avnd n 1 frunze. Printr-un mecanism invers, se poate realiza o triangulare plecnd de la un
arbore de analiz. Astfel exist o coresponden biunivoc ntre arborii de analiz i triangulri.
Cum un produs de n matrice complet parantezat corespunde unui arbore de analiz avnd n
frunze, el corespunde, de asemenea, unei triangulri a unui poligon avnd (n+1) vrfuri. Figurile
16.5(a) i (b) ilustreaz aceast coresponden. Fiecare matrice Ai dintr-un produs A1 A2 An
corespunde unei laturi vi1 vi a unui poligon avnd n + 1 vrfuri. O coard vi vj , unde i < j,
corespunde unei matrice Ai+1..j calculat n timpul evalurii produsului.
De fapt, problema nmulirii unui ir de matrice este un caz special al problemei triangulrii
optime. Aceasta nseamn c fiecare instan a produsului unui ir de matrice poate fi
transformat ntr-o problem de triangulare optim. Dndu-se un produs al unui ir de matrice
A1 A2 An , vom defini un poligon convex cu n + 1 vrfuri, P = hv0 , v1 , . . . , vn i. Dac matricea
Ai are dimensiunile pi1 pi pentru i = 1, 2, . . . , n, vom defini funcia de cost a triangulrii
astfel
w(4vi vj vk ) = pi pj pk .
O triangulare optim a lui P relativ la aceast funcie de cost produce un arbore de analiz
pentru o parantezare optim a produsului A1 A2 An .
Cu toate c reciproca nu este adevrat, adic problema triangulrii optime nu este un
278 Capitolul 16 Programarea dinamic
caz special al problemei nmulirii unui ir de matrice, se poate arta c procedura Ordine-
ir-Matrice din seciunea 16.1, cu anumite modificri minore, rezolv problema triangulrii
optime pentru un poligon avnd n + 1 vrfuri. Trebuie doar s nlocuim secvena hp0 , p1 , . . . , pn i
a dimensiunilor matricelor cu secvena hv0 , v1 . . . , vn i a vrfurilor, s schimbm toate referirile
la p n referiri la v i s schimbm linia 9 astfel:
9: q m[i, k] + m[k + 1, j] + w(4vi1 vk vj )
Dup execuia algoritmului, elementul m[1, n] conine ponderea unei triangulri optime. n
continuare vom justifica aceast afirmaie.
O soluie recursiv
Aa cum, conform definiiei, m[i, j] este costul minim al calculului subprodusului irului de
matrice Ai Ai+1 Aj , fie t[i, j], pentru 1 i < j n, ponderea triangulrii optime a poligonului
hvi1 , vi , . . . , vj i. Prin convenie, vom considera poligonul degenerat hvi1 , vi i ca avnd pondere
0. Ponderea unei triangulri optime a poligonului P este dat de t[1, n].
Urmtorul pas este definirea recursiv a lui t[i, j]. Punctul de plecare este poligonul degenerat,
cel cu dou vrfuri: t[i, i] = 0 pentru i = 1, 2, . . . , n. Cnd j i 1, poligonul hvi1 , vi , . . . , vj i
are cel puin trei vrfuri. Dorim s minimizm suma dintre ponderea triunghiului 4vi1 vk vj i
ponderile triangulrilor optime pentru poligoanele hvi1 , vi . . . , vk i i hvk , vk+1 , . . . , vj i, relativ
la toate vrfurile vk , pentru k = i, i + 1, . . . , j 1. n concluzie, funcia recursiv este
(
0 dac i = j,
t[i, j] = min {t[i, k] + t[k + 1, j] + w(4vi1 vk vj )} dac i < j. (16.7)
ikj1
Exerciii
16.4-1 Demonstrai c orice triangulare a unui poligon convex avnd n vrfuri are n 3 coarde
i mparte poligonul n n 2 triunghiuri.
Probleme 279
Figura 16.6 apte puncte n plan poziionate pe o reea unitar. (a) Cel mai scurt circuit nchis,
de lungime 24,88 . . .. Acest circuit nu este bitonic. (b) Circuitul bitonic cel mai scurt pentru aceeai
mulime de puncte. Lungimea sa este 25,58 . . ..
16.4-2 Profesorul Guinevere sugereaz c un algoritm mai rapid pentru rezolvarea problemei
triangulrii optime poate exista n cazul particular n care ponderea triunghiului este chiar aria
sa. Este aceast afirmaie adevrat?
16.4-3 S presupunem c funcia de ponderare w este definit pe coardele triangulrii i nu pe
triunghiuri. Ponderea unei triangulri relative la w este suma ponderilor coardelor triangulrii.
Artai c problema triangulrii optime cu coarde ponderate este doar un caz particular al
problemei triangulrii optime cu triunghiuri ponderate.
16.4-4 Determinai o triangulare optim pentru un octogon regulat, avnd laturi egale cu
unitatea. Utilizai funcia de ponderare:
w(4vi vj vk ) = |vi vj | + |vj vk | + |vk vi |,
unde |vi vj | este distana euclidian de la vi la vj . (Un poligon regulat este un poligon cu laturi
i unghiuri interne egale.)
Probleme
16-1 Problema euclidian bitonic a comis-voiajorului
Problema euclidian a comis-voiajorului este problema determinrii celui mai scurt circuit
care leag o mulime dat de n puncte n plan. Figura 16.6(a) prezint soluia unei probleme n
care avem apte puncte. n cazul general, problema este NP-complet, deci determinarea soluiei
nu se poate face n timp polinomial (a se vedea capitolul 36).
J. L. Bentley a sugerat c problema poate fi simplificat prin restricionarea tipului de circuite
cutate, i anume la circuite bitonice, adic circuite care ncep din punctul cel mai din stnga,
merg numai de la stnga la dreapta ctre punctul cel mai din dreapta, iar apoi merg numai
ctre stnga, napoi spre punctul de plecare. Figura 16.6(b) prezint cel mai scurt circuit bitonic
pentru cele apte puncte. Determinarea unui astfel de circuit se poate face n timp polinomial.
Descriei un algoritm, avnd un timp de execuie O(n2 ), pentru determinarea unui circuit
bitonic optim. Se va presupune c dou puncte distincte nu au aceeai abscis. (Indicaie:
Parcugei de la stnga la dreapta, innd minte posibilitile optime pentru cele dou pri
ale circuitului.)
280 Capitolul 16 Programarea dinamic
(3 cost(copiere))+cost(nlocuire)+cost(tergere)+(4 cost(inserare))+
cost(interschimbare)+cost(eliminare).
Probleme 281
Dndu-se dou secvene x[1..m] i y[1..n] i o mulime dat de costuri asociate operaiilor,
distana de editare de la x la y este costul celei mai puin costisitoare secvene de transformri
care l convertete pe x n y. Elaborai un algoritm, folosind metoda programrii dinamice, pentru
a determina distana de editare de la x[1..m] la y[1..n] i pentru a afia succesiunea optim de
transformri. Analizai timpul de execuie i spaiul de memorie necesare.
a. Descriei un algoritm pentru alctuirea listei invitailor. Scopul este de a maximiza suma
coeficienilor de convieuire a invitailor. Analizai timpul de execuie al algoritmului.
b. Extindei rspunsurile de la punctul (a) astfel nct, dac este returnat un drum, acesta
este cel mai probabil drum plecnd din v0 i avnd eticheta s. Analizai timpul de execuie
al algoritmului.
282 Capitolul 16 Programarea dinamic
Note bibliografice
R. Bellman a nceput studiul sistematic al metodei programrii dinamice n 1955. Cuvntul
programare, ca i n programarea liniar, face referire la utilizarea unei metode care furnizeaz
soluii n mod tabelar. Cu toate c tehnicile de optimizare care incorporeaz elemente de
programare dinamic erau cunoscute anterior, Bellman a mbogit domeniul cu o baz
matematic solid [21].
Hu i Shing [106] au propus un algoritm avnd timp de execuie O(n lg n) pentru problema
nmulirii irului de matrice. Ei au demonstrat, de asemenea, corespondena ntre problema
triangulrii optime a poligoanelor i problema nmulirii unui ir de matrice.
Algoritmul avnd timp de execuie O(mn) pentru determinarea celui mai lung subir comun
pare a avea mai muli autori. Knuth [43] a pus ntrebarea dac exist algoritmi avnd timp de
execuie mai redus dect timp ptratic pentru problema CMLSC. Masek i Paterson [143] au
rspuns afirmativ acestei ntrebri propunnd un algoritm cu timp de execuie O(mn/ lg n) unde
n m, iar secvenele sunt extrase dintr-o mulime mrginit. Pentru cazul particular n care
nici un element nu apare mai mult dect o dat ntr-o secven de intrare, Szymanski [184] a
artat c problema poate fi rezolvat ntr-un timp de ordinul O((n+m) lg (n + m)). Multe dintre
aceste rezultate se extind la problema calculrii distanelor de editare (problema 16-3).
17 Algoritmi greedy
Un algoritm greedy pentru aceast problem este descris de urmtoarea procedur, prezentat
n pseudocod. Vom presupune c activitile (adic datele de intrare) sunt ordonate cresctor
dup timpul de terminare:
f1 f2 . . . fn . (17.1)
n caz contrar aceast ordonare poate fi fcut n timp O(n lg n). Algoritmul de mai jos presupune
c datele de intrare s i f sunt reprezentate ca vectori.
Selector-Activiti-Greedy(s, f )
1: n lungime[s]
2: A {1}
3: j 1
4: pentru i 2, n execut
5: dac si fj atunci
6: A A {i}
7: ji
8: returneaz A
cel mai devreme. Vrem s artm c exist o soluie optim care ncepe cu activitatea 1, conform
unei alegeri greedy.
S presupunem c A S este o soluie optim pentru o instan dat a problemei selectrii
activitilor. Vom ordona activitile din A dup timpul de terminare. Mai presupunem c prima
activitate din A este activitatea k. Dac k = 1, planificarea mulimii A ncepe cu o alegere greedy.
Dac k 6= 1 vrem s artm c exist o alt soluie optim B a lui S care ncepe conform alegerii
greedy, cu activitatea 1. Fie B = A {k} {1}. Deoarece f1 fk , activitile din B sunt
distincte, i cum B are acelai numr de activiti ca i A, B este de asemenea optim. Deci B
este o soluie optim pentru S, care conine alegerea greedy a activitii 1. Am artat astfel c
exist ntotdeauna o planificare optim care ncepe cu o alegere greedy.
Mai mult, o dat ce este fcut alegerea greedy a activitii 1, problema se reduce la
determinarea soluiei optime pentru problema selectrii acelor activiti din S care sunt
compatibile cu activitatea 1. Aceasta nseamn c dac A este o soluie optim pentru problema
iniial, atunci A0 = A {1} este o soluie optim pentru problema selectrii activitilor
S 0 = {i S : si f1 }. De ce? Dac am putea gsi o soluie B 0 pentru S 0 cu mai multe
activiti dect A0 , adugarea activitii 1 la B 0 va conduce la o soluie B a lui S cu mai multe
activiti dect A, contrazicndu-se astfel optimalitatea mulimii A. n acest mod, dup ce este
fcut fiecare alegere greedy, ceea ce rmne este o problem de optimizare de aceeai form ca
problema iniial. Prin inducie dup numrul de alegeri fcute, se arat c realiznd o alegere
greedy la fiecare pas, se obine o soluie optim.
Exerciii
17.1-1 Elaborai un algoritm conform metodei programrii dinamice pentru problema selectrii
activitilor, bazat pe calcularea valorilor mi , iterativ pentru i = 1, 2, . . . , n, unde mi este
dimensiunea celei mai mari mulimi de activiti compatibile dintre activitile {1, 2, . . . , i}.
Se va presupune c datele de intrare au fost ordonate conform ecuaiei (17.1). Comparai timpul
de execuie al algoritmului gsit cu cel al procedurii Selector-Activiti-Greedy.
17.1-3 Nu orice algoritm de tip greedy aplicat problemei selctrii activitilor produce o mulime
maximal de activiti compatibile. Dai un exemplu care s arate c tehnica selectrii activitii
cu timpul de executare cel mai scurt dintre activitile compatibile cu cele deja selectate, nu este
corect. Se cere acelai lucru pentru ncercarea de a selecta ntotdeauna activitatea care se
suprapune cu cele mai puine dintre activitile rmase.
17.2. Elemente ale strategiei greedy 287
Substructur optim
O problem evideniaz o substrucutr optim dac o soluie optim a problemei conine
soluii optime ale subproblemelor. Aceast proprietate este cheia pentru aplicarea programrii
dinamice sau a unui algoritm greedy. Ca exemplu al unei structuri optime, s ne reamintim
demonstraia teoremei 17.1, unde se arat c dac o soluie optim A a problemei selectrii
activitilor ncepe cu activitatea 1, atunci mulimea activitilor A0 = A {1} este o soluie
optim pentru problema selectrii activitilor S 0 = {i S : si f1 }.
288 Capitolul 17 Algoritmi greedy
Figura 17.2 Strategia greedy nu funcioneaz pentru problema 01 a rucsacului. (a) Houl trebuie
s selecteze o submulime a celor trei obiecte din figur a cror greutate nu trebuie s depeasc 50
de uniti. (b) Submulimea optim cuprinde elementele 2 i 3. Orice soluie care conine obiectul 1
nu este optim, chiar dac obiectul 1 are valoarea cea mai mare a ctului valoare/greutate. (c) Pentru
problema fracionar a rucsacului strategia considerrii obiectelor n ordinea celei mai mari valori a
ctului valoare/greutate conduce la soluia optim.
Exerciii
17.2-1 Artai c problema rucsacului fracionar are propietatea alegerii greedy.
17.2-2 Rezolvai prin metoda programrii dinamice problema 0-1 a rucsacului. Soluia trebuie
s fie calculat n O(nW ) uniti de timp, unde n este numrul de obiecte, iar W este greutatea
maxim a obiectelor pe care houl le poate ncrca n rucsac.
17.2-4 Profesorul Midas conduce un automobil de la Newark la Reno pe autostrada 80. Maina
sa are un rezervor de benzin care, dac este plin, asigur cltoria pentru n kilometri. Harta
pe care profesorul o are indic distana n kilometri ntre staiile de benzin de pe drum. El
dorete s se opreasc de ct mai puine ori. Descriei o metod eficient prin care profesorul
Midas poate s determine staiile de benzin la care trebuie s se opreasc i artai c strategia
respectiv conduce la o soluie optim.
290 Capitolul 17 Algoritmi greedy
a b c d e f
Frecven (n mii) 45 13 12 16 9 5
Cuvnt codificat; lungime fix 000 001 010 011 100 101
Cuvnt codificat; lungime variabil 0 101 100 111 1101 1100
Figura 17.3 O problem de codificare a caracterelor. Un fiier de 100.000 de caractere conine doar
caracterele a-f, cu frecvenele indicate. Dac fiecrui caracter i este asociat un cuvnt de cod pe 3 bii,
fiierul codificat va avea 300.000 de bii. Folosind codificarea cu lungime variabil, fiierul codificat va
ocupa doar 224.000 de bii.
17.2-5 Fie dat o mulime {x1 , x2 , . . . , xn } de puncte de pe dreapta real. Descriei un algoritm
eficient care determin cea mai mic mulime de intervale nchise de lungime egal cu unitatea,
care conin toate punctele date. Argumentai corectitudinea algoritmului.
17.2-6 ? Artai cum se poate rezolva problema fracionar a rucsacului n O(n) uniti de
timp. Presupunei c avei deja o soluie pentru problema 10-2.
Figura 17.4 Arborii corespunztori schemelor de codificare din figura 17.3. Fiecare frunz este
etichetat cu un caracter i cu frecvena de apariie a acestuia. Fiecare nod intern este etichetat cu
suma ponderilor frunzelor din subarborele aferent. (a) Arborele corespunztor codificrii de lungime
fix a=000, . . ., f=101 (b) Arborele asociat codificrii prefix optime a=0, b=101,. . ., f=1100.
Coduri prefix
Vom considera n continuare doar codificrile n care nici un cuvnt de cod nu este prefixul
altui cuvnt. Astfel de codificri se numesc codificri prefix 1 . Se poate arta (cu toate c nu
vom proceda astfel n cazul de fa) c o compresie optim a datelor, realizat prin codificarea
caracterelor, poate fi realizat i prin codificarea prefix, deci considerarea codificrii prefix nu
scade din generalitate.
Codificarea prefix este util deoarece simplific att codificarea (deci compactarea) ct i
decodificarea. Codificarea este ntotdauna simpl pentru orice codificare binar a caracterelor;
se concatenenaz cuvintele de cod reprezentnd fiecare caracter al fiierului. De exemplu, prin
codificarea prefix avnd lungime variabil din figura 17.3, putem codifica un fiier de 3 caractere
abc astfel: 0101100=0101100, unde semnul reprezint operaia de concatenare.
Decodificarea este de asemenea relativ simpl pentru codurile prefix. Cum nici un cuvnt de
cod nu este prefixul altuia, nceputul oricrui fiier codificat nu este ambiguu. Putem deci s
identificm cuvntul iniial de cod, s l traducem n caracterul original, s-l ndeprtm din
fiierul codificat i s repetm procesul pentru fiierul codificat rmas. n exemplul nostru, irul
001011101 se translateaz automat n 001011101, secven care se decodific n aabe.
Procesul de decodificare necesit o reprezentare convenabil a codificrii prefix astfel nct
cuvntul iniial de cod s poat fi uor identificat. O astfel de reprezentare poate fi dat de un
arbore binar ale crui frunze sunt caracterele date. Interpretm un cuvnt de cod binar pentru
un caracter ca fiind drumul de la rdcin pn la caracterul respectiv, unde 0 reprezint mergi
la fiul stng iar 1 mergi la fiul drept. n figura 17.4 sunt prezentai arborii pentru cele dou
codificri ale exemplului nostru. Observai c acetia nu sunt arbori binari de cutare, deoarece
frunzele nu trebuie s fie ordonate, iar nodurile interne nu conin chei pentru caractere.
O codificare optim pentru un fiier este ntotdeuna reprezentat printr-un arbore binar
complet, n care fiecare vrf care nu este frunz are doi fii (vezi exerciiul 17.3-1).
Codificarea cu lungime fix din exemplul de mai sus nu este optim deoarece arborele asociat,
1 Codificare independent de prefix este probabil o denumire mai potrivit, dar termenul de codificare prefix
prezentat n figura 17.4(a), nu este un arbore binar complet: exist dou cuvinte de cod care ncep
cu 10. . ., dar nici unul care s nceap cu 11. . .. Conform celor de mai sus ne putem restrnge
atenia numai asupra arborilor binari complei, deci dac C este alfabetul din care fac parte
caracterele, atunci arborele pentru o codificare prefix optim are exact |C| frunze, una pentru
fiecare liter din alfabet, i exact |C| 1 noduri interne.
Dndu-se un arbore T , corespunztor unei codificri prefix, este foarte simplu s calculm
numrul de bii necesari pentru a codifica un fiier. Pentru fiecare caracter c din alfabet, fie
f (c) frecvena lui c n fiier i s notm cu dT (c) adncimea frunzei n arbore (adic nivelul pe
care se afl). S observm c dT (c) reprezint de asemenea cuvntul de cod pentru caracterul c.
Numrul de bii necesari pentru a codifica un fiier este
X
B(T ) = f (c)dT (c), (17.3)
cC
Pentru exemplul nostru, algoritmul lui Huffman lucreaz ca n figura 17.5. Deoarece exist
6 litere n alfabet, dimensiunea iniial a cozii este n = 6, iar pentru a construi arborele sunt
necesari 5 pai de fuzionare. Arborele final reprezint codificarea prefix optim. Codificarea unei
litere este secvena etichetelor nodurilor ce formeaz drumul de la rdcin la liter.
n linia 2, coada de prioriti Q este iniializat cu caracterele din C. Ciclul pentru din
liniile 38 extrage n mod repetat dou noduri x i y cu cea mai mic frecven din coad, i le
nlocuiete n coad cu un nou nod z, reprezentnd fuziunea lor. Frecvena lui z este calculat
n linia 7 ca fiind suma frecvenelor lui x i y. Nodul z are pe x ca fiu stng i pe y ca fiu drept.
(Aceast ordine este arbitrar; interschimbarea fiilor stng i drept ai oricrui nod conduce la
17.3. Coduri Huffman 293
o codificare diferit, dar de acelai cost.) Dup n 1 fuzionri, unicul nod rmas n coad
rdcina arborelui de codificare este returnat n linia 9.
Analiza timpului de execuie pentru algoritmul lui Huffman presupune implementarea lui Q
sub forma unui heap binar (vezi capitolul 7). Pentru o mulime C de n caractere, iniializarea
lui Q n linia 2 poate fi realizat n O(n) uniti de timp utiliznd procedura Construiete-
Heap din seciunea 7.3. Ciclul pentru din liniile 38 se execut de exact | n | 1 ori, i cum
fiecare operaie asupra stivei necesit un timp O(n lg n), ciclul contribuie cu O(n lg n) la timpul
de execuie. Deci timpul total de execuie a procedurii Huffman pe o mulime de n caractere
este O(n lg n).
Figura 17.5 Paii algoritmului Huffman pentru frecvenele date n figura 17.3. Fiecare parte ilustreaz
coninutul cozii ordonate cresctor dup frecven. La fiecare pas, cei doi arbori cu cele mai sczute
frecvene fuzioneaz. Frunzele figurez ca dreptunghiuri ce conin un caracter i frecvena sa. Nodurile
interne figureaz ca cercuri ce conin suma frecvenelor fiilor lor. O muchie care leag un nod intern
cu fiii ei este etichetat cu 0 dac este o muchie ctre un fiu stng, respectiv cu 1 dac este ctre fiul
drept. Cuvntul de cod pentru o liter este secvena etichetelor de pe muchiile care leag rdcina de
frunza asociat caracterului respectiv. (a) Mulimea iniial de n = 6 noduri, unul pentru fiecare liter.
(b)(e) Etape intermediare. (f ) Arborele final.
caractere cu cea mai redus frecven. De ce este aceasta o alegere greedy? Putem interpreta
costul unei singure fuzionri ca fiind suma frecvenelor celor dou obiecte care fuzioneaz.
Exerciiul 17.3-3 arat cum costul total al arborelui construit este suma costurilor obiectelor
din care a fuzionat. La fiecare pas, dintre toate fuzionrile posibile, algoritmul Huffman o alege
pe aceea care determin costul minim.
Urmtoarea lem arat c problema construirii unei codificri prefix optime are proprietatea
substructurii optime.
Lema 17.3 Fie T un arbore binar complet reprezentnd o codificare prefix optim peste un
alfabet C, unde frecvena f [c] este definit pentru fiecare caracter c C. Considerm dou
caractere x i y oarecare care apar ca noduri terminale frai n T , i fie z tatl lor. Atunci,
considernd z ca un caracter avnd frecvena f [z] = f [x] + f [y], arborele T 0 = T {x, y}
reprezint o codificare prefix optim pentru alfabetul C 0 = C {x, y} {z}.
17.3. Coduri Huffman 295
Figura 17.6 O ilustrare a pasului cheie din demonstaia lemei 17.2. n arborele optim T , b i c sunt
dou dintre frunzele aflate pe cel mai de jos nivel n arbore; aceste noduri se consider frai. x i y
sunt dou frunze pe care algoritmul Huffman le fuzioneaz primele; ele apar n poziii arbitrare n T .
Frunzele b i x sunt interschimbate pentru a obine arborele T 0 . Apoi, frunzele c i y sunt interschimbate
pentru a obine arborele T 00 . Cum cele dou interschimbri nu mresc costul, arborele rezultat T 00 este
de asemenea un arbore optim.
Demonstraie. Vom arta mai nti c B(T ), costul arborelui T , poate fi exprimat n funcie de
costul B(T 0 ) al arborelui T 0 considernd costurile componente din ecuaia (17.3). Pentru fiecare
c C {x, y}, avem dT (c) = dT 0 (c), i f [c]dt (c) = f [c]dT 0 (c). Cum dT (x) = dT (y) = dT 0 (z) + 1,
avem
f [x]dT (x) + f [y]dT (y) = (f [x] + f [y])(dT 0 (z) + 1) = f [z]dT 0 (z) + (f [x] + f [y]),
de unde deducem c
Dac T 0 reprezint o codificare prefix care nu este optim pentru alfabetul C 0 , atunci exist
un arbore T 00 ale crui frunze sunt caractere n C 0 astfel nct B(T 00 ) < B(T 0 ). Cum z este tratat
ca un caracter n C 0 , el va apare ca frunz n T 00 . Dac adugm x i y ca fiind fiii lui z n T 00 ,
atunci vom obine o codificare prefix pentru C avnd costul B(T 00 ) + f [x] + f [y] < B(T ), ceea ce
intr n contradicie cu optimalitatea lui T . Deci T 0 trebuie s fie optim pentru alfabetul C 0 .
Execiii
17.3-1 Demonstrai c un arbore binar care nu este complet nu poate corespunde unei codificri
prefix optime.
17.3-2 Stabilii o codificare Huffman optim pentru urmtoarea secven de frecvene bazat
pe primele 8 numere din irul lui Fibonacci
a:1 b:1 c:2 d:3 e:5 f:8 g:13 h:21
Putei generaliza rspunsul astfel nct s determinai codificarea optim cnd frecvenele sunt
primele n numere din irul lui Fibonacci?
296 Capitolul 17 Algoritmi greedy
17.3-4 Artai c pentru o codificare optim, dac sortm caracterele n ordinea necresctoare
a frecvenelor lor, lungimile cuvintelor de cod asociate sunt n ordine nedescresctoare.
17.3-6 Generalizai algoritmul lui Huffman pentru cuvinte de cod ternare (adic acele cuvinte
de cod care folosesc simbolurile 0, 1 i 2) i artai c aceasta conduce la codificri ternare
optime.
17.3-7 Fie dat un fiier de date coninnd un ir de caractere de 8 bii, astfel nct toate cele
256 de caractere apar aproximativ cu aceeai frecven: frecvena maxim este mai mic dect
dublul frecvenei minime. Artai c, n acest caz, codificarea Huffman nu este mai eficient
dect utilizarea unui cod obinuit avnd lungimea fix de 8 bii.
17.4.1. Matroizi
Un matroid este o pereche ordonat M = (S, I) care satisface urmtoarele condiii:
2. I este o familie nevid de submuimi ale lui S, numite submulimi independente ale lui
S, astfel nct dac B I i A B, atunci A I. Spunem c I este ereditar dac
satisface aceast proprietate. S observm c mulimea vid este automat un element al
lui I.
17.4. Bazele teoretice ale metodei greedy 297
3. Dac A I, B I i |A| < |B| atunci exist un element x B a astfel nct A{x} I.
Spunem c M satisface proprietatea de schimb.
Dac A este o submulime a lui E atunci A IG dac i numai dac A nu are cicluri.
Aceasta nseamn c o mulime de muchii este independent dac i numai dac formeaz
o pdure.
Matroidul grafic este strns legat de problema arborelui de acoperire minim care este
prezentat n detaliu n capitolul 24.
Teorema 17.5 Dac G este un graf neorientat, atunci MG = (SG , IG ) este un matroid.
Demonstraie. Evident SG = E este mulime finit. Mai mult, IG este ereditar deoarece o
submulime a unei pduri este o pdure. Altfel spus, eliminarea unor muchii dintr-o mulime de
muchii ce nu formeaz cicluri nu poate crea cicluri noi. Astfel, rmne de artat c MG satisface
proprietatea de schimb. S presupunem c A i B sunt pduri ale lui G i |B| > |A|. Cu alte
cuvinte, A i B sunt mulimi aciclice de muchii i B are mai multe muchii dect A.
Atunci, conform teoremei 5.2 o pdure avnd k muchii conine exact |V | k arbori. (Pentru
a arta acest lucru n alt mod se pleac cu |V | arbori i nici o muchie. Apoi fiecare muchie care
este adugat pdurii, reduce cu 1 numrul de arbori). Astfel, pdurea conine |V | |A| arbori
i pdurea B conine |V | |B| arbori.
Cum pdurea B are mai puini arbori dect A, ea trebuie s conin un arbore T cu vrfuri
aflate n arbori diferii din pdurea A. Mai mult, dearece T este conex, el trebuie s conin o
muchie (u, v) astfel nct vrfurile u i v s fie n arbori diferii din pdurea A. Cum muchia (u, v)
leag vrfuri n doi arbori diferii din pdurea A, ea poate fi adugat pdurii A fr a forma
un ciclu. Atunci, MG satisface proprietatea de schimb, ceea ce ncheie demonstraia faptului c
MG este un matroid.
Dndu-se un matroid M = (S, I), un element x / A se numete extensie a lui A I dac
x poate fi adugat la A cu pstrarea n acelai timp a independenei; aceasta nseamn c x este
o extensie a lui A dac A {x} I. Drept exemplu, s considerm un matroid grafic MG . Dac
A este o mulime independent de muchii, atunci muchia e este o extensie a lui A dac i numai
dac e nu este n A i adugarea ei la A nu creeaz un ciclu.
Dac A este o submulime independent ntr-un matroid M , spunem c A este maximal dac
nu are extensii. Aceasta nseamn c A este maximal dac nu este inclus n nici o submulime
independent mai mare a lui M . Urmtoarea proprietate este utilizat frecvent.
Teorema 17.6 Toate submulimile independente maximale dintr-un matroid au aceeai dimen-
siune.
298 Capitolul 17 Algoritmi greedy
pentru orice A S. De exemplu, dac w(e) desemneaz lungimea unei muchii e ntr-un matroid
grafic MG , atunci w(A) este lungimea total a muchiilor din A.
Deoarece B este optim, A trebuie s fie de asemenea optim i cum x A lema este demons-
trat.
300 Capitolul 17 Algoritmi greedy
Lema 17.8 Fie M = (S, I) un matroid oarecare. Dac x este un element al lui S astfel nct x
nu este o extensie a lui , atunci x nu este o extensie a nici unei submulimi independente A a
lui S.
Demonstraie. Conform lemei 17.8 orice elemente care nu sunt considerate iniial, deoarece nu
sunt extensii ale mulimii vide , pot fi uitate definitiv, deoarece ele nu mai sunt folositoare. O
dat ce primul element x este selectat, din lema 17.7 rezult c algoritmul Greedy nu poate
grei adugnd pe x la A pentru c exist o submulime optim ce l conine pe x. n final
lema 17.9 implic faptul c problema rmas este una de determinare a unei submulimi optime
n matroidul M 0 care este contracia lui M prin x. Dup ce procedura Greedy atribuie lui A
mulimea x toi ceilali pai pot fi interpretai ca acionnd n matroidul M 0 = (S 0 , I 0 ) deoarece
B este independent n M 0 dac i numai dac B {x} este independent n M, pentru orice
mulime B I 0 . n consecin, operaiile din algoritmul Greedy vor determina o submulime
independent de pondere maxim pentru M 0 i toate operaiile din algoritmul Greedy vor gsi
o submulime independent de pondere maxim pentru M .
17.5. O problem de planificare a activitilor 301
Exerciii
17.4-1 Artai c (S, Ik ) este un matroid, unde S este o mulime finit, iar Ik este mulimea
tuturor submulimilor lui S de dimensiune cel mult k, unde k | S |.
17.4-2 ? Dndu-se o matrice T de n n numere reale, artai c (S, I) este un matroid, unde
S este mulimea coloanelor lui T i A I, dac i numai dac n A coloanele sunt liniar
independente.
17.4-3 ? Artai c dac (S, I) este un matroid, atunci i (S, I 0 ) este un matroid, unde I 0 =
{A0 : S S 0 conine mulimi maximale A I}. Aceasta nseamn c mulimile independente
maximale ale lui (S 0 , I 0 ) sunt exact complementarele mulimilor independente maximale ale lui
(S, I).
17.4-5 Artai cum se transform o funcie de ponderare a unei probleme cu matroizi ponderai
cnd soluia optim dorit este o submulime independent, maximal de pondere maxim,
pentru a o aduce la o problem standard de matroizi ponderai. Argumentai c transformarea
este corect.
Se cere determinarea unei planificri pentru S care minimizeaz penalizarea total pentru acti-
vitatea neterminat.
Considerm o planificare dat. Spunem c o activitate este prematur n aceast planificare
dac se termin dup termenul de finalizare. n caz contrar activitatea este n timp n planificare.
O planificare arbitrar poate fi pus ntotdeauna ntr-o form prematur, n care fiecare
activitate care se termin la timp precede activitile ntrziate. S observm c dac o activitate
prematur x, urmeaz unei activiti ntrziate y atunci poziiile lui x i y pot fi schimbate fr
a afecta faptul c x este prematur i y este ntrziat.
Analog, afirmm c o planificare arbitrar poate fi ntotdeauna pus sub forma canonic,
n care activitile premature preced pe cele ntrziate i sunt planificate n ordine nedescresc-
toare a termenelor de terminare. Pentru a realiza acest lucru se pune planificarea ntr-o prim
form prematur. Apoi, atta timp ct exist dou activiti n timp i i j care se termin la
momentele k i k + 1 n planificare cu termenele dj < di , interschimbm poziia lui i cu cea a lui
j. Cum activitatea j este prematur, nainte de interschimbare, k + 1 dj . Atunci k + 1 < di
i astfel activitatea i este tot prematur dup interschimbare. Activitatea j este mutat mai
devreme n planificare, deci ea va fi de asemenea prematur dup interschimbare.
Deci, cutarea unei planificri optime se reduce la determinarea unei mulimi A de activiti
premature. O dat determinat A, putem crea planificarea curent, listnd nti elementele din
A n ordine nedescresctoare a timpilor de terminare, apoi activitile ntrziate (adic S A)
n orice ordine, producnd astfel o ordonare canonic a planificrii optime.
Spunem c mulimea A de activiti este independent dac exist o planificare pentru
aceste activiti astfel nct nici o activitate nu este ntrziat. Evident, mulimea activitilor
n timp pentru o planificare formeaz o mulime independent de activiti. Fie I mulimea
tuturor mulimilor independente de activiti.
Considerm problema determinrii independenei unei mulimi date de activiti A. Pentru
t = 1, 2, . . . n, fie Nt (A) numrul de activiti n A a cror termen de terminare este cel mult t.
Lema 17.11 Pentru orice mulime de activiti A, urmtoarele afirmaii sunt echivalente:
Demonstraie. Evident, dac exist t astfel nct Nt (A) > t, atunci nu exist nici o modalitate
de a face o planificare cu toate activitile n timp pentru A, deoarece exist mai mult de t
activiti care trebuie s se termine nainte de momentul t. Atunci (1) implic (2). Dac (2) este
adevrat atunci rezult (3): nu exist nici o modalitate de a ne bloca atunci cnd planificm
activitile n ordinea nedescresctoare a timpilor de terminare, deoarece din (2) rezult c cel
mai ndeprtat timp de terminare i este cel mult i. n sfrit, evident, (3) implic (1).
Folosind proprietatea 2 din lema 17.11 putem calcula cu uurin dac o mulime dat de
activiti este independent (vezi exerciiul 17.5-2).
17.5. O problem de planificare a activitilor 303
Activitate
1 2 3 4 5 6 7
di 4 2 4 3 1 4 6
wi 70 60 50 40 30 20 10
Figura 17.7 O instan a problemei planificrii activitilor ntr-o unitate de timp cu termen de
finalizare i penalizri pe un singur procesor
Teorema 17.12 Dac S este o mulime de activiti ntr-o unitate de timp i I este mulimea
tuturor mulimilor independente de activiti, atunci sistemul corespunztor (S, I) este un
matroid.
Demonstraie. Fiecare submulime a unei mulimi independente de activiti este evident in-
dependent. Pentru a demonstra proprietatea de schimb s presupunem c B i A sunt mulimi
independente de activiti i | B |>| A |. Fie k cel mai mare timp t astfel nct Nt (B) Nt (A).
Cum Nn (B) =| B | i Nn (A) =| A |, dar | B |>| A | trebuie s avem k < n i Nj (B) > Nj (A)
pentru orice j din intervalul k + 1 j n. Atunci B conine mai multe activiti cu timpul
de terminare k + 1 dect A. Fie x o activitate n B A cu timpul de terminare k + 1. Fie
A0 = A {x}.
Artm acum, folosind proprietatea 2 din lema 17.11, c A0 trebuie s fie independent.
Pentru 1 t k avem Nt (A0 ) Nt (B) t, deoarece B este independent. Atunci A0 este
independent ceea ce ncheie demonstraia faptului c (S, I) este matroid.
Conform teoremei 17.10 putem utiliza un algoritm greedy pentru a determina o mulime
independent de pondere maxim de activiti A. Putem atunci crea o planificare optim avnd
activitile din A ca fiind activiti premature. Aceast metod este un algoritm eficient pentru
planificarea activitilor ntr-o unitate de timp cu termen de terminare i penalizri pentru un
singur procesor. Timpul de execuie este O(n2 ) folosind algoritmul Greedy deoarece fiecare
din cele O(n) verificri independente fcute de algoritm consum O(n) uniti de timp (vezi
exerciiul 17.5-2). O implementare mai rapid este dat n problema 17-3.
Figura 17.7 prezint un exemplu pentru problema planificrii activitilor ntr-o unitate de
timp cu termene de finalizare i penalizri pe un singur procesor. n acest exemplu, algoritmul
greedy selecteaz activitile 1, 2, 3 i 4, respinge activitile 5 i 6, iar n final accept activitatea
7. Planificarea optim final este
h2, 4, 1, 3, 7, 5, 6i,
Exerciii
17.5-1 Rezolvai instana problemei planificrii dat n figura 17.7 dar cu fiecare penalizare wi
nlocuit cu 80 wi .
17.5-2 Artai cum se utilizeaz proprietatea 2 din lema 17.1 pentru a determina n timpul
O(| A |) dac o mulime A de activiti este independent sau nu.
Probleme
17-1 Schimb de monede
S considerm problema schimbrii a n ceni utiliznd cel mai mic numr de monede.
a. Descriei un algoritm greedy pentru a realiza schimbul n monede de 25, 50, 2 i 1.
Demonstrai c algoritmul conduce la o soluie optim.
b. S presupunem c monedele disponibile au valorile c0 , c1 , . . . , ck pentru ntregii c > 1 i
k 1. Artai c algoritmul greedy conduce mereu la soluie optim.
c. Dai o mulime de valori de monede pentru care algoritmul greedy nu conduce la o soluie
optim.
a. Fie G = (X, E) un graf neorientat. Folosind definiia unui matroid, artai c (E, I) este
un matroid, unde A I dac i numai dac A este o submulime aciclic a lui E.
b. Matricea de inciden a unui graf neorientat G = (X, E) este o matrice M , de
dimensiuni | X | | E | astfel nct Mve = 1 dac muchia e este incident vrfului v
i Mve = 0 altfel. Argumentai c o mulime de coloane ale lui M este liniar indepenedent
dac i numai dac mulimea corespunztoare de muchii este aciclic. Utilizai apoi
rezultatul exerciiului 17.4-2 pentru a furniza o alt demonstraie a faptului c (E, I)
de la punctul a) este matroid.
c. S presupunem c o pondere nenegativ w(e) este asociat fiecrei muchii ntr-un graf
neorientat G = (X, E). Elaborai un algoritm eficient pentru a determina o submulime
aciclic a lui E de pondere total maxim.
d. Fie G = (V, E) un graf orientat oarecare i fie (E, I) definit astfel nct A I dac i
numai dac A nu conine cicluri directe. Dai un exemplu de graf orientat G astfel nct
sistemul asociat (E, I) nu este un matroid. Specificai ce condiie din definiia unui matroid
nu este ndeplinit.
e. Matricea de inciden pentru un graf orientat G = (V, E) este o matrice M de
dimensiuni | V | | E | astfel nct Mve = 1 dac muchia e pleac din vrful v,
Mve = 1 dac muchia e intr n vrful v i Mve = 0 altfel. Argumentai c dac o mulime
de muchii ale lui G este liniar independent atunci mulimea corespunztoare de muchii
nu conine cicluri orientate.
Note bibliografice 305
Note bibliografice
Material bibliografic referitor la metoda greedy i matroizi poate fi gsit n Lawler [132] i
Papadimitriou i Steiglitz [154].
Algoritmii de tip greedy au aprut mai nti n literatura referitoare la optimizarea
combinatorial n 1971 ntr-un articol al lui Edmonds [62], cu toate c teoria matroizilor dateaz
nc din 1935, ea fiind prezentat ntr-un articol al lui Whitney [200].
Demonstraia corectitudinii algoritmului greedy pentru problema selectrii activitilor
urmeaz ideea lui Gavril [80]. Problema planificrii activitilor este studiat n Lawler [132],
Horowitz i Sahni [105] i Brassard i Bratley [33].
Codificarea Huffman a fost inventat n 1952 [107]; lucrrile lui Lelewer i Hirschberg [136]
despre tehnici de compactare a datelor sunt cunoscute din 1987.
O extensie a teoriei matroizilor la teoria greedoizilor a fost introdus de Korte i Lovsz
[127, 128, 129, 130]; ea generalizeaz teoria prezentat n acest capitol.
18 Analiza amortizat
ntr-o analiz amortizat timpul necesar execuiei unei secvene de operaii asupra unei
structuri de date este msurat, n medie, pentru toate operaiile efectuate. Analiza amortizat
poate fi folosit pentru a arta c, determinnd media pentru o secven de operaii, costul
unei operaii este mic, chiar dac o anume operaie este costisitoare. Analiza amortizat difer
de analiza pentru cazul mediu prin faptul c nu este luat n calcul probabilitatea; o analiz
amortizat garanteaz performana medie a fiecrei operaii pentru cazul cel mai defavorabil.
Primele trei seciuni din acest capitol prezint cele mai uzuale trei tehnici folosite n analiza
amortizat. Seciunea 18.1 ncepe cu metoda de agregare n care se determin o margine
superioar T (n) a costului total al unei secvene de n operaii. Costul amortizat pe operaie
va fi deci T (n)/n.
n seciunea 18.2 se prezint metoda de cotare, n care se determin costul amortizat al fie-
crei operaii. Dac exist mai multe tipuri de operaii, fiecare astfel de tip poate avea un cost
de amortizare distinct. Metoda de cotare supracoteaz unele operaii la nceputul secvenei, me-
mornd supracotarea ca pe un credit pltit de la nceput pentru anumite obiecte din structura
de date. Acest credit este folosit ulterior pentru operaii care sunt cotate sub costul lor real.
n seciunea 18.3 se prezint metoda de potenial, asemntoare cu metoda de cotare prin
faptul c se determin costul amortizat pentru fiecare operaie, iar la nceput operaiile pot fi
supracotate pentru a compensa subcotrile ulterioare. Metoda de potenial pstreaz creditul
drept energie potenial a structurii de date, n loc s l asocieze obiectelor individuale din
structura de date.
Pentru ilustrarea celor trei metode vor fi prezentate dou exemple. Primul se refer la o
stiv cu operaia suplimentar Scoatere-Multipl-Din-Stiv, care poate extrage mai multe
obiecte din stiv. Al doilea este un contor binar care numr ncepnd de la 0 prin intermediul
unicei operaii Incrementeaz.
Trebuie reinut c, peste tot n acest capitol, cotrile asociate n cadrul analizei amortizate
sunt fcute doar pentru aceast analiz. Ele nu vor aprea n programe. Dac, de exemplu, un
credit este asociat obiectului x n cadrul analizei amortizate, aceasta nu nseamn c n program
va apare vreo variabil credit[x].
Aplicarea analizei amortizate pentru o structur de date particular poate servi la optimizarea
proiectrii. Astfel, n seciunea 18.4 vom folosi metoda de potenial pentru analiza tabelelor care
i mresc i i micoreaz dinamic dimensiunile.
Operatori de stiv
Ca prim exemplu pentru metoda de agregare, vom analiza stive pentru care se adaug o
nou operaie. n seciunea 11.1 au fost introdui cei doi operatori de stiv fundamentali, fiecare
necesitnd timpul O(1):
Pune-n-Stiv(S, x) introduce n stiva S obiectul x;
Scoate-Din-Stiv(s) extrage un obiect din vrful stivei S i l returneaz ca rezultat.
Cum fiecare dintre aceti operatori necesit un timp O(1), costul fiecruia va fi considerat egal
cu 1. De aceea, costul total al unei secvene de n operaii Pune-n-Stiv i Scoate-Din-Stiv
este n, iar timpul real pentru execuia a n operatori este (n).
Lucrurile devin mai interesante dac adugm operatorul Scoatere-Multipl-Din-
Stiv(S, k) care extrage k obiecte din vrful stivei S; dac stiva are mai puin de k obiecte,
este extras ntreg coninutul stivei. n urmtorul algoritm scris n pseudocod, operatorul Stiv-
Vid returneaz adevrat dac stiva este vid, respectiv fals n caz contrar.
Scoatere-Multipl-Din-Stiv(S, k)
1: ct timp nu Stiv-Vid(S) i k 6= 0 execut
2: Scoate-Din-Stiv(S)
3: k k1
costul unei secvene de n operatori este O(n2 ), deoarece pot exista un numr de O(n) operatori
Scoatere-Multipl-Din-Stiv, fiecare avnd costul O(n). Dei aceast analiz este corect,
rezultatul O(n2 ) obinut, considernd costul n cazul cel mai defavorabil pentru fiecare operator
n parte, poate fi mbuntit.
Prin utilizarea metodei de agregare a analizei amortizate, putem obine o margine superioar
mai bun prin considerarea ntregii secvene de n operatori. ntr-adevr, dei o operaie
Scoatere-Multipl-Din-Stiv poate fi costisitoare, orice secven de n operaii Pune-n-
Stiv, Scoate-Din-Stiv i Scoatere-Multipl-Din-Stiv plecnd de la stiva vid poate
avea cel mult costul O(n). De ce? Fiecare obiect poate fi extras cel mult o dat dup introdu-
cerea sa. De aceea, numrul de apeluri Scoate-Din-Stiv, pentru stiv nevid, inclusiv ape-
lurile cuprinse n Scoatere-Multipl-Din-Stiv, este cel mult egal cu numrul de operaii
Pune-n-Stiv, care este cel mult n. Pentru orice n, orice secven de n operatori Pune-
n-Stiv, Scoate-Din-Stiv i Scoatere-Multipl-Din-Stiv va avea costul total O(n).
Costul amortizat al unui operator va fi media corespunztoare: O(n)/n = O(1).
Precizm din nou c, dei timpul de execuie i costul mediu al unui operator de stiv este
O(1), nu s-a folosit un raionament probabilist. Am determinat o margine O(n) pentru cazul cel
mai defavorabil pentru o secven de n operatori. mprind acest cost total la n, am obinut
costul mediu pe operator, adic tocmai costul amortizat.
Acest algoritm este, n esen, cel implementat n hardware de un contor ripple-carry (vezi
seciunea 29.2.1). Figura 18.2 arat cum un contor binar este incrementat de 16 ori, plecnd
de la valoarea iniial 0 i terminnd cu valoarea 16. La nceputul fiecrei iteraii a ciclului ct
timp, n liniile 24 dorim s adunm 1 pe poziia i. Dac A[i] = 1, atunci, prin adunarea lui 1,
bitul de pe poziia i devine 0 i se obine cifra de transport 1, care va fi adunat pe poziia i + 1
la urmtoarea iterare a ciclului. n caz contrar, ciclul se termin; dac i < k, tim c A[i] = 0,
astfel nct adugarea lui 1 pe poziia i, comutnd 0 n 1, se realizeaz pe linia 6. Costul fiecrei
operaii Incrementeaz este liniar n numrul de bii a cror valoare a fost comutat.
Asemntor exemplului cu stiva, o analiz brut produce o margine care este corect, dar nu
suficient de bun. O singur execuie a lui Incrementeaz are, n cazul cel mai defavorabil,
18.1. Metoda de agregare 309
Figura 18.2 Configuraia unui contor binar pe 8 bii a crui valoare crete de la 0 la 16 ca urmare a
16 operaii Incrementeaz. Biii evideniai sunt cei care sunt afectai la obinerea urmtoarei valori
a contorului. Costul msurat n numrul de bii care i schimb valoarea, este scris n dreapta. Este de
remarcat c valoarea costului total nu depete de dou ori numrul total de operaii Incrementeaz.
timpul (k), corespunztor situaiei n care toate componentele lui A sunt egale cu 1. Ca urmare,
o secven de n operaii Incrementeaz, plecnd de la valoarea iniial 0 a contorului, necesit
n cazul cel mai defavorabil timpul O(nk).
Putem mbunti analiza i obine costul O(n) n cazul cel mai defavorabil pentru o secven
de n operaii Incrementeaz, observnd c nu toi biii comut (i schimb valoarea din 0
n 1 sau invers) la fiecare apel al procedurii Incrementeaz. Aa cum se arat n figura 18.2,
A[0] comut la fiecare apel al procedurii Incrementeaz. Bitul A[1] comut la fiecare dou
incrementri: o secven de n operaii Incrementeaz, pentru un contor iniial egal cu zero, face
ca A[1] s comute de bn/2c ori. Similar, bitul A[2] comut la fiecare patru Incrementeazri,
deci de bn/4c ori. Mai general, pentru i = 0, 1, . . . , blg nc, bitul A[i] comut de n/2i ori ntr-o
secven de n operatori Incrementeaz pentru un contor binar cu valoarea iniial 0. Pentru
i > blg nc, bitul A[i] nu comut niciodat. Numrul de comutri pentru secven este, ca urmare:
blg nc j
nk
X X
1
i
< n = 2n,
i=0
2 i=0
2i
Exerciii
18.1-1 Dac am include un operator Inserare-Multipl-n-Stiv printre operatorii de stiv,
s-ar pstra marginea O(1) pentru costul amortizat al operaiilor pe stiv?
18.1-2 Artai c, dac s-ar include un operator Decrement n exemplul cu contorul binar pe
k bii, n operaii ar putea necesita timpul (nk).
Operaii de stiv
Pentru a ilustra metoda de cotare a analizei amortizate, s ne ntoarcem la exemplul referitor
la stive. Reamintim costurile reale ale operaiilor:
Pune-n-Stiv 1,
Scoate-Din-Stiv 1,
Scoatere-Multipl-Din-Stiv min(k, s),
18.2. Metoda de cotare 311
unei operaii Incrementeaz este de cel mult 2 dolari. Deoarece numrul de 1 din contor nu
este niciodat negativ, suma de credit este ntotdeauna nenegativ. Rezult, c pentru n operaii
Incrementeaz, costul amortizat total este O(n), care mrginete costul real total.
Exerciii
18.2-1 Se efectueaz n operaii asupra unei stive a crei mrime este ntotdeauna cel mult egal
cu k. Dup fiecare k operaii, se copiaz ntreaga stiv n scopul salvrii ei. Artai c, pentru
n operaii de stiv, inclusiv salvarea ei, costul este O(n) dac stabilim n mod judicios costuri
amortizate pentru diferitele operaii de stiv.
definim (D0 ) ca fiind 0 i s artm c (Di ) 0 pentru toi i. (Vezi exerciiul 18.3-1 pentru
a deprinde un mod simplu de tratare a cazurilor n care (D0 ) 6= 0).
Intuitiv, dac diferena de potenial (Di )(Di1 ) a operaiei i este pozitiv, atunci costul
amortizat cbi reprezint o supracotare a operaiei i, iar potenialul structurii de date crete. Dac
diferena de potenial este negativ, atunci costul amortizat reprezint o subcotare a operaiei
i, iar costul real al operaiei este pltit prin descreterea potenialului.
Costurile amortizate definite de ecuaiile (18.1) i (18.2) depind de alegerea funciei de
potenial . Funcii de potenial diferite pot conduce la costuri amortizate diferite, care rmn
ns margini superioare ale costurilor reale. De multe ori are loc o negociere la alegerea funciei
de potenial: cea mai bun funcie de potenial depinde de limitele de timp dorite.
Operaii de stiv
Pentru ilustrarea metodei de potenial, ne ntoarcem din nou la exemplul cu operatorii de
stiv Pune-n-Stiv, Scoate-Din-Stiv i Scoatere-Multipl-Din-Stiv. Definim funcia
de potenial pe stiv ca fiind numrul de obiecte din stiv. Pentru stiva vid, de la care se
pleac, avem (D0 ) = 0. Deoarece numrul de elemente din stiv nu este niciodat negativ, stiva
Di la care se ajunge dup operaia i are un potenial nenegativ i, ca urmare,
(Di ) 0 = (D0 ).
Rezult c pentru n operaii costul amortizat total n raport cu reprezint o margine superioar
a costului real.
Calculm, n continuare, costurile amortizate ale diferitelor operaii de stiv. Dac operaia
i este efectuat pe o stiv coninnd s obiecte i are tipul Pune-n-Stiv, atunci diferena de
potenial este
(Di ) (Di1 ) = (s + 1) s = 1.
(Di ) (Di1 ) = k 0 .
Contorul pornete de la zero, deci (D0 ) = 0. Cum (Di ) 0 pentru orice i, costul amortizat
total al unei secvene de n operaii Incrementeaz este o margine superioar pentru costul
real total; rezult c, n cazul cel mai defavorabil, costul a n operaii Incrementeaz este O(n).
Metoda de potenial ne furnizeaz o modalitate simpl de analiz a contorului chiar i n cazul
n care acesta nu pornete de la zero. Iniial, exist b0 de 1, iar dup n operaii Incrementeaz
sunt bn de 1, unde 0 b0 , bn k. Putem rescrie ecuaia (18.2) astfel
n
X n
X
ci = cbi (Dn ) + (D0 ). (18.3)
i=1 i=1
Avem cbi 2 pentru orice 1 i n. Cum (D0 ) = b0 i (Dn ) = bn , costul real total a n
operaii Incrementeaz este
n
X n
X
ci 2 bn + b0 = 2n bn + b0 .
i=1 i=1
n particular, innd cont de faptul c b0 k, dac executm cel puin n = (k) operaii
Incrementeaz, costul real total va fi O(n), indiferent de valoarea iniial a contorului.
Exerciii
18.3-1 Fie o funcie de potenial cu (Di ) (D0 ) pentru orice i, dar (D0 ) 6= 0. Artai c
exist o funcie de potenial 0 astfel nct 0 (D0 ) = 0, 0 (Di ) 0 pentru orice i 1, iar costurile
amortizate corespunztoare lui 0 sunt aceleai ca i costurile amortizate corespunztoare lui .
18.3-3 S considerm o structur de date de tip ansamblu binar cu n elemente, pentru care
instruciunile Insereaz i Extrage-Minim cer timpul O(lg n) n cazul cel mai defavorabil.
Determinai o funcie de potenial astfel nct costul amortizat al procedurii Insereaz este
O(lg n), costul amortizat al procedurii Extrage-Minim este O(1) i demonstrai acest lucru.
18.4. Tabele dinamice 315
su de ncrcare este 1.1 n unele medii software, dac se face o ncercare de a introduce un articol
ntr-un tablou plin, singura alternativ posibil este de a termina programul, mpreun cu afiarea
unui mesaj de eroare. Vom presupune aici c lucrm ntr-un mediu modern care dispune de un
sistem de gestiune a memoriei, care poate aloca i elibera, la cerere, blocuri de memorie. Astfel,
atunci cnd se ncearc inserarea unui articol ntr-un tablou plin, putem expanda (mri) tabloul
prin alocarea unui nou tablou cu mai multe locaii dect cel curent i prin copierea elementelor
din tabloul curent n cel nou.
O metod euristic uzual este de a aloca un nou tablou, care s aib de dou ori mai
multe locaii dect precedentul. Dac se efectueaz doar inserri, factorul de ncrcare este,
ntotdeauna, cel puin egal cu 1/2 i, astfel, spaiul disponibil nu depete niciodat jumtate
din spaiul total alocat tabloului.
n pseudocodul care urmeaz, vom presupune c T este un obiect ce reprezint tabloul.
Cmpul ref [T ] conine un pointer la blocul de memorie reprezentnd tabloul. Cmpul num[T ]
conine numrul de articole din tablou, iar cmpul dim[T ] conine numrul total de articole ce
pot fi memorate n tablou. Iniial, tabloul este vid: num[T ] = dim[T ] = 0.
Insereaz-Tablou(T, x)
1: dac dim[T ] = 0 atunci
2: aloc pentru ref [T ] o locaie de memorie
3: dim[T ] 1
4: dac num[T ] = dim[T ] atunci
5: aloc pentru tablou-nou un numr de 2 dim[T ] locaii
6: insereaz toate articolele din ref [T ] n tablou nou
7: elibereaz ref [T ]
8: ref [T ] tablounou
9: dim[T ] 2 dim[T ]
10: insereaz x n ref [T ]
11: num[T ] num[T ] + 1
un tablou ca fiind plin atunci cnd factorul su de ncrcare este o constant strict mai mic dect 1. (Vezi
exerciiul 18.4-2.)
18.4. Tabele dinamice 317
creat, efectuate n linia 6, au fiecare costul 1. Dac sunt executate n operaii, costul pentru o
operaie, n cazul cel mai defavorabil, este O(n), ceea ce conduce la o margine superioar O(n2 )
pentru timpul de execuie total al celor n operaii.
Aceast margine nu este cea mai convenabil, deoarece costul expandrii tabloului nu
intervine foarte des n timpul efecturii celor n operaii Insereaz-Tablou. Mai precis, operaia
i conduce la o expandare numai dac i 1 este o putere a lui 2. Costul amortizat al unei operaii
este, de fapt, O(1), aa cum se poate arta dac folosim metoda de agregare. Costul operaiei i
este:
i dac i 1 este o putere a lui 2,
ci =
1 altfel.
deoarece exist cel mult n operaii de cost 1, iar costul celorlalte operaii formeaz o progresie
geometric. Deoarece costul total a n operaii Insereaz-Tablou este 3n, costul amortizat al
unei singure operaii este 3.
Folosind metoda de cotare, ne dm seama mai uor de ce costul amortizat al unei operaii
Insereaz-Tablou este 3. Intuitiv, fiecare articol are de pltit pentru 3 inserri elementare:
inserarea propriu-zis n tablou, mutarea sa efectuat atunci cnd tabloul este expandat i
mutarea unui alt articol care a fost deja mutat o dat atunci cnd tabloul a fost expandat. De
exemplu, s presupunem c, imediat dup o expandare, dimensiunea tabloului este m. Atunci
numrul efectiv de articole este m/2 i tabloul nu conine vreun credit. Cotm cu 3 dolari fiecare
inserare. Inserarea elementar care urmeaz imediat cost 1 dolar. Un al doilea dolar este plasat
drept credit pe articolul inserat. Un al treilea dolar este plasat drept credit pe unul dintre cele
m/2 articole existente deja n tablou. Umplerea tabloului cere m/2 inserri suplimentare i, ca
urmare, la momentul n care tabloul devine plin i are deci m articole efective, fiecare articol are
plasat pe el un dolar care va fi pltit la reinserarea sa n timpul urmtoarei expandri.
Pentru analiza unei secvene de n operaii Insereaz-Tablou, putem folosi i metoda de
potenial; o vom folosi n seciunea 18.4.2 pentru proiectarea unei operaii terge-Tablou care
va avea, de asemenea, costul amortizat O(1). ncepem prin a defini o funcie de potenial (a crei
valoare este 0 imediat dup o expandare, dar crete pn la dimensiunea tabloului atunci cnd
acesta devine plin), astfel nct putem plti din potenial pentru efectuarea expandrii. Funcia
reprezint una dintre variantele posibile. Imediat dup o expandare, avem num[T ] = dim[T ]/2 i
astfel (T ) = 0, aa cum dorim. n momentul dinaintea unei expandri, avem num[T ] = dim[T ]
i, deci, (T ) = num[T ], aa cum dorim. Valoarea iniial a potenialului este 0 i deoarece
tabloul este ntotdeauna plin cel puin pe jumtate, num[T ] dim[T ]/2, de unde rezult c
(T ) este ntotdeauna nenegativ. Prin urmare suma costurilor amortizate a celor n operaii
Insereaz-Tablou este o margine superioar pentru suma costurilor reale.
Pentru a analiza costul amortizat al celei de a i-a operaii Insereaz-Tablou, vom nota
prin numi numrul de articole memorate n tablou dup aceast operaie, prin dimi dimensiunea
318 Capitolul 18 Analiza amortizat
tabloului dup aceast operaie, iar prin i potenialul dup aceast operaie. Iniial avem
num0 = 0, dim0 = 0, 0 = 0.
Dac operaia i nu conduce la o expandare, atunci dimi = dimi1 i costul amortizat al
operaiei este
Dac operaia i conduce la o expandare, atunci dimi /2 = dimi1 = numi 1, iar costul amortizat
al operaiei este
n figura 18.3 se arat cum variaz valorile numi , dimi i i n funcie de i. Observai modul n
care potenialul este folosit pentru a plti expandarea tabloului.
costul amortizat al unei operaii asupra tabloului s fie mrginit superior de o constant.
I, , , I, I, , , I, I, . . . ,
unde prin I am notat o inserare, iar prin o tergere. Prima inserare produce o expandare a
tabloului la dimensiunea n. Urmtoarele dou tergeri conduc la o contractare a tabloului napoi
la dimensiunea n/2. Urmtoarele dou inserri conduc la o expandare i aa mai departe. Exist
18.4. Tabele dinamice 319
Figura 18.3 Efectul unei secvene de n operaii Insereaz-Tablou asupra numrului numi de articole
din tablou, numrului dimi de locaii din tablou i potenialului i = 2 numi dimi , fiecare fiind
msurat dup operaia i. Linia subire i corespunde lui numi , linia groas i corespunde lui dimi , iar
cea punctat i corespunde lui i . Observai c, n momentul dinaintea unei expandri, potenialul a
crescut pn la numrul de articole din tablou, i, de aceea, este suficient pentru a plti pentru mutarea
articolelor n noul tablou. Apoi potenialul scade la 0, dar crete imediat la 2 atunci cnd articolul care
a produs expandarea este efectiv inserat.
(n) expandri i contractri, costul fiecreia fiind (n). Ca urmare, costul total al celor n
operaii este (n2 ), iar costul amortizat al unei operaii este (n).
Dificultatea legat de aceast strategie este evident: dup o expandare nu se efectueaz
suficiente tergeri pentru a putea plti pentru contractare. n mod analog, dup o contractare
nu se efectueaz suficiente inserri pentru a plti pentru o expandare.
Putem mbunti aceast strategie permind factorului de ncrcare s scad sub 1/2. Mai
precis, vom dubla n continuare dimensiunea tabloului atunci cnd un articol urmeaz a fi inserat
ntr-un tablou plin, dar vom njumti dimensiunea tabloului atunci cnd o tergere ar face ca
el s fie plin sub un sfert, n loc de pe jumtate plin ca nainte. Factorul de ncrcare al tabloului
este, deci, mrginit inferior de constanta 1/4. Dup o expandare, factorul de ncrcare devine
1/2. Astfel, jumtate din articolele tabloului trebuie terse nainte ca s aib loc o contractare,
deoarece contractarea intervine numai cnd factorul de ncrcare scade sub 1/4. Analog, dup
o contractare factorul de ncrcare al tabloului este de asemenea 1/2. Din acest motiv, numrul
de articole din tablou trebuie s se dubleze prin inserri pentru a urma o contractare, deoarece
contractarea intervine doar dac factorul de ncrcare devine mai mare dect 1.
Nu vom prezenta codul pentru terge-Tablou, deoarece este analog cu Insereaz-
Tablou. Totui, n analiza pe care o facem este convenabil s presupunem c dac numrul
de articole din tablou devine 0, atunci memoria alocat tabloului este eliberat. Cu alte cuvinte,
dac num[T ] = 0, atunci dim[T ] = 0.
Putem folosi acum metoda de potenial pentru a analiza costul unei secvene de n operaii
Insereaz-Tablou i terge-Tablou. ncepem prin a defini o funcie de potenial care ia
valoarea 0 imediat dup ce are loc o expandare i se mrete atunci cnd factorul de ncrcare
320 Capitolul 18 Analiza amortizat
crete la 1 sau scade la 1/4. Vom defini factorul de ncrcare al unui tablou T nevid prin (T ) =
num[T ]/dim[T ]. Deoarece pentru un tablou vid avem num[T ] = dim[T ] = 0 i (T ) = 1, vom
avea ntotdeauna num[T ] = (t) dim[T ], indiferent dac tabloul este vid sau nu. Vom folosi
urmtoarea funcie de potenial:
2 num[T ] dim[T ] dac (T ) 1/2,
(T ) = (18.5)
dim[T ]/2 num[T ] dac (T ) < 1/2.
S observm c funcia de potenial pentru un tablou vid este 0 i c potenialul nu este niciodat
negativ. Ca urmare, costul amortizat total al unei secvene de operaii relative la este o margine
superioar pentru costul real.
nainte de a trece la o analiz mai detaliat, ne oprim pentru a remarca unele proprieti
ale funciei de potenial. S observm c, dac factorul de ncrcare este 1/2, atunci potenialul
este 0. Cnd el devine 1, avem dim[T ] = num[T ], de unde (T ) = num[T ] i deci potenialul
este suficient pentru a plti pentru expandare atunci cnd este inserat un articol. Cnd factorul
de ncrcare este 1/4, avem dim[T ] = 4 num[T ], de unde rezult c (T ) = num[T ] i, deci,
potenialul este suficient pentru a plti pentru o contractare atunci cnd un articol este ters.
Figura 18.4 ilustreaz modul n care se comport potenialul pentru o secven de operaii.
Pentru a analiza o secven de n operaii Insereaz-Tablou i terge-Tablou, notm
prin ci costul real al operaiei i, prin cbi costul su amortizat relativ la , prin numi numrul
de articole memorate n tablou dup operaia i, prin dimi mrimea tabloului dup operaia i,
prin i factorul de ncrcare al tabloului dup operaia i, iar prin i potenialul dup operaia
i. Iniial, num0 = 0, dim0 = 0, 0 = 1, i 0 = 0.
ncepem cu cazul n care operaia i este Insereaz-Tablou. Dac i1 1/2, atunci analiza
este identic cu cea pentru expandarea tabloului, prezentat n seciunea 18.4.1. Indiferent dac
tabloul se expandeaz sau nu, costul amortizat cbi al operaiei este cel mult egal cu 3. Dac i1 <
1/2, tabloul nu poate fi expandat ca urmare a efecturii unei operaii, deoarece expandarea se
produce numai dac i1 = 1. Dac i i < 1/2, costul amortizat al operaiei i este
cbi = ci + i i1 = 1 + (dimi /2 numi ) (dimi1 /2 numi1 )
= 1 + (dimi /2 numi ) (dimi /2 (numi 1)) = 0.
Dac i1 < 1/2 dar i 1/2, atunci
cbi = ci + i i1 = 1 + (2 numi dimi ) (dimi1 /2 numi1 )
= 1 + (2 (2/numi1 + 1) dimi1 ) (dimi1 /2 numi1 )
3 3
= 3 numi1 dimi1 + 3 = 3 i1 dimi1 dimi1 + 3
2 2
3 3
< dimi1 dimi1 + 3 = 3.
2 2
Rezult c operaia Insereaz-Tablou are un cost amortizat mai mic sau egal cu 3.
Ne ntoarcem acum la cazul n care operaia i este terge-Tablou. n acest caz, numi =
numi1 1. Dac i1 < 1/2, trebuie s lum n considerare situaia n care are loc o contractare.
Dac aceasta are loc, atunci dimi = dimi1 i costul amortizat al operaiei este
cbi = ci + i i1 = 1 + (dimi /2 numi ) (dimi1 /2 numi1 )
= 1 + (dimi /2 numi ) (dimi /2 (numi + 1)) = 2.
18.4. Tabele dinamice 321
Dac i1 < 1/2 i operaia i nu implic o contractare, atunci costul real al operaiei este
ci = numi + 1, deoarece este ters un articol i sunt mutate numi articole. Avem dimi /2 =
dimi1 /4 = numi + 1, iar costul amortizat al operaiei este
cbi = ci + i i1 = (numi + 1) + (dimi /2 numi ) (dimi1 /2 numi1 )
= (numi + 1) + ((numi + 1) numi ) ((2 numi + 2) (numi + 1)) = 1.
Cnd operaia i este terge-Tablou i i1 1/2, costul amortizat este, de asemenea, mr-
ginit superior de o constant. Analiza este propus spre rezolvare cititorului n exerciiul 18.4-3.
Recapitulnd, deoarece costul amortizat al fiecrei operaii este mrginit superior de o
constant, timpul real pentru orice secven de n operaii asupra unui tablou dinamic este O(n).
Exerciii
18.4-1 Argumentai de ce dac i1 1/2 i i 1/2, atunci costul amortizat al unei operaii
Insereaz-Tablou este 0.
ce valoarea ateptat a costului de amortizare nu este n mod obligatoriu O(1) pentru toate
inserrile?
Probleme
18-1 Contor binar pe bii inveri
n capitolul 32 este prezentat un algoritm important, numit Transformarea Fourier Rapid (pe
scurt TFR). Primul pas al algoritmului TFR realizeaz o permutare cu inversarea biilor a
unui vector de intrare A[0..n 1], a crui lungime este n = 2k pentru un anumit k nenegativ.
Aceast permutare interschimb elementele de pe poziiile ale cror reprezentri binare sunt una
inversa celeilalte.
Putem exprima fiecare indice a ca o secven de k bii hak1 , ak2 , . . . , a0 i unde a =
Pk1 i
i=0 ai 2 . Definim
De exemplu, dac n = 16 (adic k = 4), atunci revk (3) = 12, deoarece reprezentarea pe 4 bii a
lui 3 este 0011, a crei invers este 1100, care este tocmai reprezentarea pe 4 bii a lui 12.
a. Presupunnd c funcia revk necesit timpul (k), scriei un algoritm care s realizeze
permutarea pe bii inveri a unui vector de lungime n = 2k n timpul O(nk).
Putem folosi un algoritm bazat pe analiza amortizat pentru a mbunti timpul de execuie
a permutrii cu inversarea biilor. Folosim un contor cu inversarea biilor i o procedur In-
crementeaz-Cu-Inversarea-Biilor care, dat fiind o valoare a a contorului cu inversarea
biilor, produce revk (revk (a) + 1). De exemplu, pentru k = 4 i contorul cu inversarea biilor
iniializat cu 0, apelurile succesive ale procedurii Incrementeaz-Cu-Inversarea-Biilor
produc secvena:
0000, 1000, 0100, 1100, 0010, 1010, ... = 0, 8, 4, 12, 2, 10, ....
Probleme 323
a. Artai cum se poate realiza operaia Cutare pentru aceast structur de date. Analizai
timpul de execuie pentru cazul cel mai defavorabil.
b. Artai cum poate fi inserat un element nou n aceast structur. Analizai timpii de
execuie pentru cazul cel mai defavorabil, precum i timpul amortizat de execuie.
dim[st
anga[x]] dim[x] i dim[dreapta[x]] dim[x]
ntregul arbore este -echilibrat dac fiecare nod din arbore este -echilibrat. Urmtoarea
abordare amortizat pentru a pstra caracteristica de arbori cu ponderi echilibrate a fost sugerat
de G. Varghese.
a. Un arbore 1/2-echilibrat este, ntr-un anumit sens, att de echilibrat pe ct este posibil.
Fiind dat un nod x, ntr-un arbore binar de cutare oarecare, artai cum poate fi
reconstituit subarborele de rdcin x astfel nct s devin 1/2-echilibrat. Algoritmul
trebuie s se ncadreze n timpul (dim[x]) i poate folosi o memorie auxiliar de ordinul
O(dim[x]).
b. Artai c o cutare binar ntr-un arbore -echilibrat avnd n noduri poate fi realizat
n timpul O(lg n), pentru cazul cel mai defavorabil.
324 Capitolul 18 Analiza amortizat
Pentru ceea ce urmeaz n aceast problem, vom presupune c este strict mai mare dect 1/2.
Presupunem c operaiile Insereaz i tergere sunt implementate n modul uzual pentru un
arbore de cutare binar avnd n noduri, cu urmtoarea excepie: dup fiecare astfel de operaie,
dac toate nodurile din arbore nu mai sunt -echilibrate, atunci subarborele avnd rdcina n
nodul de acest tip, situat pe cel mai de sus nivel n arbore, este reconstituit astfel nct devine
1/2-echilibrat.
Vom analiza schema de reconstituire folosind metoda de potenial. Pentru un nod x oarecare
din arborele de cutare binar T , definim
(x) =| dim[st
anga[x]] dim[dreapta[x]] |
i definim potenialul lui T prin
X
(T ) = c (x),
xT :(x)2
Note bibliografice
Metoda de agregare a analizei amortizate a fost folosit de Aho, Hopcroft i Ullman [4].
Tarjan [189] trece n revist metodele de cotare i de potenial ale analizei amortizate i prezint
mai multe aplicaii. El atribuie paternitatea metodei de cotare mai multor autori, printre care
M. R. Brown, R. E. Tarjan, S. Huddleston i K. Mehlhorn. Tot el atribuie paternitatea metodei
de potenial lui D. D. Sleator. Termenul amortizat este datorat lui D. D. Sleator i lui R. E.
Tarjan.
V Structuri de date avansate
Introducere
n aceast parte relum, la un nivel mai avansat dect n partea a III-a, structurile de date
care permit operaii pe mulimi dinamice. De exemplu, dou dintre capitolele prii folosesc,
extensiv, tehnicile de analiz amortizat prezentate n capitolul 18.
Capitolul 19 prezint structura de B-arbore, care este arborele echilibrat folosit la memorarea
pe disc magnetic. Deoarece discul magnetic opereaz mult mai ncet dect memoria RAM,
performanele B-arborilor vor fi msurate nu numai prin timpul consumat cu operaiile de cutare
dinamice, ci i prin numrul de accese la disc efectuate. Pentru fiecare operaie, numrul de accese
la disc este proporional cu nlimea B-arborelui.
Capitolele 20 i 21 prezint implementri ale heap-urilor fuzionabile, care permit operaiile
Insereaz, Minimum, Extrage-Min i Reunete. Operaia Reunete permite fuzionarea a
dou heap-uri. Pe structurile de date din aceste capitole se pot executa, de asemenea, operaiile
terge i Descrete-Cheie.
Heap-urile binomiale, descrise n capitolul 20, execut fiecare dintre aceste operaii, n cazul
cel mai defavorabil, n timp O(lg n), unde n este numrul total de elemente din heap-ul de intrare
(sau n cele dou heap-uri de intrare n cazul Reunete). Se vede c operaia Reunete din
heap-ul binomial este superioar operaiei definite pentru heap-ul binar prezentat n capitolul 7,
acesta din urm efectund, n cel mai defavorabil caz, (n) uniti de timp pentru a fuziona.
Heap-urile Fibonacci din capitolul 21 sunt superioare heap-urilor binomiale, cel puin n sens
teoretic. Pentru msurarea performanelor heap-urilor Fibonacci se folosesc margini de timp
amortizate. Se va vedea c operaiile Insereaz, Minimum i Reunete consum n cazul
heap-urilor Fibonacci, timp amortizat de numai O(1), n timp ce Extrage-Min i terge
consum un timp amortizat de O(lg n). Cel mai mare avantaj al heap-urilor Fibonacci este acela
c Descrete-Cheie consum un timp amortizat de numai O(1). Operaia Descrete-Cheie
definit pentru heap-urile Fibonacci este asimptotic mai slab dect operaiile similare la diverii
algoritmi specifici de grafuri, motiv pentru care acetia o folosesc mai rar.
n sfrit, capitolul 22 prezint structuri de date pentru mulimi disjuncte. Se d un univers
de n elemente care sunt grupate n mulimi dinamice. Iniial, fiecare element este singur ntr-o
mulime. Operaia Reunete fuzioneaz dou mulimi, iar cererea Gsete-Mulime identific
mulimea care conine un anumit element la un moment dat. Reprezentnd fiecare mulime
printr-un arbore cu rdcin, vom obine operaii surprinztor de rapide: o secven de m operaii
se execut n timp O(m(m, n)), unde (m, n) este o funcie incredibil de ncet cresctoare n
ipoteza c n reprezint numrul de atomi din ntregul univers, (m, n) este cel mult 4. Analiza
amortizat care determin aceast limit de timp este pe att de complex pe ct de simpl este
structura de date. Capitolul 22 furnizeaz o limitare de timp interesant i relativ simpl.
Tematica abordat n aceast parte conine nu numai exemple de structuri de date avansate.
Printre altele, mai sunt incluse i urmtoarele:
O structur de date, inventat de van Emde Boas [194], care admite operaiile Mi-
nimum, Maximum, Insereaz, terge, Caut, Extrage-Min, Extract-Max,
Predecesor, Succesor. Acestea, n mulimea de chei {1, 2, ..., n} necesit, n cel mai
defavorabil caz, timpul (O(lg lg n)).
Arbori dinamici, definii de ctre Sleator i Tarjan [177] i apoi reluai de Tarjan [188].
Cu ajutorul lor se ntreine o pdure de arbori cu rdcini disjuncte. Fiecare arc din fiecare
Introducere 327
arbore are ataat, drept cost, un numr real. n arborii dinamici se pot efectua operaiin
vederea aflrii prinilor, rdcinilor, costurilor arcelor, costului minim al unui drum de la
un nod la o rdcin. Arborii pot fi manevrai prin tierea de arce, modificarea costurilor
arcelor de pe un drum de la un nod la o rdcin, legarea unei rdcini la un alt arbore
etc. Una dintre implementrile arborilor dinamici necesit un timp amortizat de O(lg n)
pentru fiecare operaie. O alt implementare, mai sofisticat, necesit timp O(lg n) n cel
mai defavorabil caz.
Arborii splay (Oblici), dezvoltai de ctre Sleator i Tarjan [178] i apoi reluai de
Tarjan [188], sunt un tip de arbori binari de cutare care dau un timp amortizat O(lg n)
pentru toate operaiile standard. Una dintre aplicaiile acestor arbori permite simplificarea
arborilor dinamici.
Structurile de date persistente permit att cereri, ct i, uneori, actualizri ale versiunilor
vechi ale structurii. Sunt prezentate tehnicile de creare a structurilor de date nlnuite
persistente descrise de ctre Driscoll, Sarnak, Sleator i Tarjan n [59]. Acestea sunt eficiente
deoarece consum foarte puin timp i spaiu. Problema 14-1 d un exemplu simplu de
mulime (de arbori) dinamic persistent.
19 B-arbori
Figura 19.1 Un B-arbore n care cheile sunt consoane ale alfabetului latin. Un nod intern x conine
n[x] chei i are n[x]+1 fii. Toate frunzele sunt pe acelai nivel n arbore. Nodurile haurate deschis indic
traseul de cutare a literei R.
Capitolul 19 B-arbori 329
Numrul de accese la disc va fi exprimat n funcie de numrul de pagini citite sau scrise pe
disc. Trebuie reinut c accesul la disc nu este constant, ci depinde de distana dintre poziia
curent i pista int, ca i de starea curent a micrii de rotaie. Pentru a simplifica lucrurile,
vom aproxima numrul de pagini citite prin numrul de accese la disc.
ntr-o aplicaie clasic de B-arbori, cantitatea de informaie manipulat depete cu mult
capacitatea memoriei interne. Algoritmii specifici B-arborilor copiaz, de pe disc n memorie,
acele pagini de care este strict nevoie i le scriu napoi pe cele care au fost modificate. Aceti
algoritmi presupun prezena simultan n memorie a unui numr constant de pagini, motiv
pentru care dimensiunea memoriei principale nu limiteaz dimensiunile B-arborilor care sunt
manevrai.
330 Capitolul 19 B-arbori
n fiecare moment, sistemul poate pstra n memoria intern numai un numr limitat de
pagini. Algoritmii specifici B-arborilor presupun c exist suficient spaiu n memoria intern n
acest scop.
Pe cele mai multe sisteme, timpii de execuie ai algoritmilor de B-arbori sunt extrem de
sensibili la numrul de operaii Citete-Disc i Scrie-Disc. Din acest motiv ar fi normal ca
un nod n B-arbore s aib lungimea unei pagini disc. De asemenea, numrul de fii ai unui nod
este bine s fie ct mai mare.
De obicei, factorul de ramificare este ntre 50 i 2000, n funcie de lungimea cheii i de
lungimea unei pagini. Un factor de ramificare mare reduce drastic nlimea arborelui i numrul
de accese la disc pentru accesul la o cheie. De exemplu, n figura 19.3 este prezentat un B-arbore
cu factorul de ramificare 1001 i nlimea 2, care permite memorarea unui miliard de chei. Cu
toate acestea, deoarece nodul rdcin poate fi pstrat permanent n memorie, sunt necesare
numai dou accese la disc pentru a gsi orice cheie din acest arbore.
Figura 19.3 Un B-arbore de nlime 2 conine peste un miliard de chei. Fiecare nod intern sau frunz
conine 1000 de chei. Exist 1001 noduri pe nivelul 1 i peste un milion de frunze pe nivelul 2. Numrul
scris n interiorul fiecrui nod x indic numrul n[x] de chei din x.
2. Dac x este un nod intern, el mai conine n[x] + 1 pointeri spre fiii lui c1 [x], c2 [x], . . .,
cn[x]+1 [x]. Nodurile frunz nu au fii, astfel cmpurile lor ci sunt nedefinite.
3. Cheile cheiei [x] separ domeniile de chei aflate n fiecare subarbore: dac ki este o cheie
oarecare memorat ntr-un subarbore cu rdcina ci [x], atunci
5. Exist o limitare inferioar i una superioar a numrului de chei ce pot fi coninute ntr-un
nod. Aceste margini pot fi exprimate printr-un ntreg fixat t 2, numit grad minim al
B-arborelui:
a. Fiecare nod, cu excepia rdcinii, trebuie s aib cel puin t 1 chei i n consecin
fiecare nod intern, cu excepia rdcinii, trebuie s aib cel puin t fii. Dac arborele
este nevid, atunci rdcina trebuie s aib cel puin o cheie.
b. Fiecare nod poate s conin cel mult 2t 1 chei. De aceea, orice nod intern poate
avea cel mult 2t fii. Un nod cu 2t 1 chei se va numi nod plin.
Cel mai simplu B-arbore apare cnd t = 2. Orice nod intern poate avea 2, 3 sau 4 fii, motiv
pentru care i se mai spune 2-3-4 arbore. Cu toate acestea, n practic, se folosesc valori mult
mai mari pentru t.
Teorema 19.1 Dac n 1, atunci, pentru orice B-arbore T cu n chei de nlime h i gradul
mimim t 2,
n+1
h logt .
2
Demonstraie. Dac un B-arbore are nlimea h, va avea numr minim de chei dac rdcina
conine doar o cheie i toate celelalte noduri cte t 1 chei. n acest caz, exist dou noduri
pe nivelul 1, 2t noduri pe nivelul 2, 2t2 noduri pe nivelul 3 .a.m.d, 2th1 noduri pe nivelul h.
Figura 19.4 prezint un astfel de arbore pentru h = 3. De aceea, numrul n al cheilor satisface
inegalitatea
h
X
th 1
n 1 + (t 1) 2ti1 = 1 + 2(t 1) = 2th 1,
i=1
t1
Figura 19.4 Un B-arbore de nlime 3 care conine numrul minim posibil de chei. n fiecare nod x
este scris numrul efectiv de chei din nod, n[x].
Aici se vede puterea B-arborilor n comparaie cu arborii rou-negru. Dei nlimea ambilor
crete proporional cu O(lg n), t fiind o constant, baza logaritmului la B-arbore poate fi, de
multe ori, mai mare. De aceea, numrul nodurilor examinate la B-arbori scade cu factorul lg t
fa de arborii rou-negru pentru majoritatea operaiilor asupra arborilor. Astfel, numrul de
accese la disc pentru B-arbori se reduce, automat, cu acest factor.
Exerciii
19.1-1 De ce nu se permite gradul minim t = 1?
19.1-2 Pentru ce valori ale lui t, arborele din figura 19.1 este un B-arbore n conformitate cu
definiia?
19.1-3 Ilustrai toi B-arborii coreci cu gradul minim 2 care reprezint mulimea {1, 2, 3, 4, 5}.
19.2. Operaii de baz n B-arbore 333
19.1-5 Descriei structura de date care rezult cnd fiecare nod negru dintr-un arbore rou-
negru absoarbe fiul lui rou, ncorpornd fiii lui cu el nsui.
Rdcina B-arborelui se afl ntotdeauna n memoria intern, astfel c, pentru ,ea nu este
necesar operaia Citete-Disc. Operaia Scrie-Disc se impune, totui, atunci cnd se
modific rdcina.
Fiecare nod transmis ca parametru trebuie s fi fost citit cu ajutorul procedurii Citete-
Disc.
Procedurile prezentate sunt toate dintr-o singur trecere, arborele fiind parcurs de la rd-
cin spre frunze, fr reveniri.
Cutarea n B-arbore
Cutarea ntr-un B-arbore este analog cu cutarea ntr-un arbore binar. Evident, n locul
unei decizii binare care indic una dintre cele dou ci posibile, aici vom avea de-a face cu o
ramificare multipl spre nodurile fii. Mai exact, la fiecare nod intern x, se ia o decizie din n[x] + 1
alternative.
Caut-B-Arbore este o generalizare natural a procedurii Caut-Arbore definit pentru
arborii binari. Caut-B-Arbore primete la intrare un pointer la nodul rdcin x i o cheie
k ce trebuie cutat n subarborele de rdcin x. La cel mai de sus nivel se va apela sub
forma: Caut-B-Arbore(r adacin
a[T ], k). Dac k este n B-arbore, atunci Caut-B-Arbore
returneaz perechea ordonat (y, i) reprezentnd un nod y i un indice i, astfel nct cheiei [y] = k.
n caz contrar, returneaz valoarea nil.
Folosind o procedur de cutare liniar, liniile 13 gsesc cel mai mic i pentru care
k cheiei [x] dau lui i valoarea n[x] + 1 n caz contrar. Liniile 45 verific dac cheia a fost
descoperit i, n caz afirmativ, returneaz valoarea corespunztoare. Liniile 610 ori termin
operaia cu insucces (dac x este o frunz), ori reapeleaz recursiv cutarea acestui fiu n
subarborele corespunztor, dup citirea prealabil a acestuia.
n figura 19.1 se ilustreaz operaia de cutare Caut-B-Arbore a cheii R ntr-un B-arbore.
Sunt evideniate nodurile vizitate n acest caz.
La fel ca la procedura Caut-Arbore definit pentru arbori binari, n timpul apelurilor
recursive, sunt parcurse nodurile pe o cale de la rdcin n jos. Din aceast cauz, numrul
paginilor disc accesate de Caut-B-Arbore sunt (h) = (logt n), unde h este nlimea B-
arborelui, i n numrul de chei. Deoarece n[x] < 2t, timpul consumat n ciclul ct timp din
liniile 23, pentru fiecare nod, este O(t) i timpul total CPU este O(th) = O(t logt n).
334 Capitolul 19 B-arbori
Caut-B-Arbore(x, k)
1: i 1
2: ct timp i n[x] i k > cheiei [x] execut
3: ii+1
4: dac i n[x] i k = cheiei [x] atunci
5: returneaz (x, i)
6: dac f runz
a[x] atunci
7: returneaz nil
8: altfel
9: Citete-Disc(ci [x])
10: returneaz Caut-B-Arbore(ci [x], k)
Creeaz-B-Arbore(T )
1: x Aloc-Nod()
2: f runza[x] adevrat
3: n[x] 0
4: Scrie-Disc(x)
5: r
adacina[T ] x
Figura 19.5 Divizarea unui nod cu t = 4. Nodul y este divizat n dou noduri y i z, iar cheia median
S este mutat n printele lui y.
Divide-Fiu-B-Arbore(x, i, y)
1: z Aloc-Nod()
2: f runz a[z] f runz a[y]
3: n[z] t 1
4: pentru j 1, t 1 execut
5: cheiej [z] cheiej+t [y]
6: dac nu f runz a[y] atunci
7: pentru j 1, t execut
8: cj [z] cj+t [y]
9: n[y] t 1
10: pentru j n[x] + 1, i + 1, 1 execut
11: cj+1 [x] cj [x]
12: ci+1 [x] z
13: pentru j n[x], i, 1 execut
14: cheiej+1 [x] cheiej [x]
15: cheiei [x] cheiet [y]
16: n[x] n[x] + 1
17: Scrie-Disc(y)
18: Scrie-Disc(z)
19: Scrie-Disc(x)
Procedura Divide-Fiu-B-Arbore lucreaz ntr-o manier obinuit cut and paste. Astfel
y, al i-lea fiu al lui x, este nodul care va fi divizat. Nodul y are iniial 2t 1 fii, dar dup divizare
i mai rmn doar primii t 1 fii. Nodul z adopt ultimii t 1 fii ai lui y, n timp ce cheia
median este deplasat n printele x, spre a separa nodurile y i z.
Liniile 18 creeaz nodul z, deplaseaz ultimele t 1 chei i cei t subarbori corespunztori
din nodul y. Linia 9 actualizeaz numrul de chei din y. Liniile 1016 insereaz z ca fiu al lui
x, mut cheia median din y n x spre a separa nodurile y i z i actualizeaz numrul de chei
din x. n sfrit, liniile 1719 cer scrierea paginilor disc modificate. Timpul CPU consumat de
Divide-Fiu-B-Arbore este (t) datorit ciclurilor din liniile 45 i 78 (celelalte cicluri au cel
mult t iteraii).
336 Capitolul 19 B-arbori
Figura 19.6 Divizarea rdcinii cu t = 4. Nodul rdcin r este divizat n dou i se creeaz un nou
nod rdcin s. Noul nod conine cheia median din r i ca fii cele dou jumti ale lui r. nlimea
B-arborelui crete cu 1 cnd rdcina este divizat.
Insereaz-B-Arbore(T, k)
1: r r ad
acin a[T ]
2: dac n[r] = 2t 1 atunci
3: s Aloc-Nod()
4: r
ad acina[T ] s
5: f runz a[s] fals
6: n[s] 0
7: c1 [s] r
8: Divide-Fiu-B-Arbore(s, 1, r)
9: Insereaz-B-Arbore-Neplin(s, k)
10: altfel
11: Insereaz-B-Arbore-Neplin(r, k)
Liniile 39 trateaz cazul n care nodul rdcin r este plin: se creeaz o rdcin nou s
cu doi descendeni i este divizat vechea rdcin r. Divizarea rdcinii este singura operaie
care determin creterea nlimii B-arborelui. n figura 19.6 este ilustrat aceast situaie. Spre
deosebire de arborii binari, care cresc n jos (spre frunze), B-arborele crete n partea de sus,
prelungind rdcina. Procedura se ncheie apelnd Insereaz-B-Arbore-Neplin pentru a
insera cheia k ntr-un arbore cu o rdcin care nu este plin. Aceast din urm procedur
parcurge arborele recursiv spre frunze, garantndu-se faptul c, dup parcurgere, nu vor rmne
noduri pline (dac este cazul se va apela Divide-Fiu-B-Arbore.
Procedura recursiv auxiliar Insereaz-B-Arbore-Neplin insereaz cheia k n nodul x
despre care se presupune c nu este plin la momentul apelului. mpreun cu Insereaz-B-
Arbore, se asigur aceast condiie pentru toate nodurile parcurse.
19.2. Operaii de baz n B-arbore 337
Insereaz-B-Arbore-Neplin(x, k)
1: i n[x]
2: dac f runz a[x] atunci
3: ct timp i 1 i k < cheiei [x] execut
4: cheiei+1 [x] cheiei [x]
5: ii1
6: cheiei+1 [x] k
7: n[x] n[x] + 1
8: Scrie-Disc(x)
9: altfel
10: ct timp i 1 i k < cheiei [x] execut
11: ii1
12: ii+1
13: Citete-Disc(ci [x])
14: dac n[ci [x]] = 2t 1 atunci
15: Divide-Fiu-B-Arbore(x, i, ci [x])
16: dac k > cheiei [x] atunci
17: ii+1
18: Insereaz-B-Arbore-Neplin(ci [x], k)
Exerciii
19.2-1 Artai rezultatul inserrii cheilor F, S, Q, K, C, L, H, T, V, W, M, R, N, P, A, B, X, Y,
D, Z, E, n aceast ordine, ntr-un B-arbore, iniial vid. Desenai configuraiile din arbore care
preced divizri de noduri i desenai configuraia final.
19.2-2 Explicai n ce condiii pot fi (sunt) executate operaii redundante de acces la disc la
apelarea procedurii Insereaz-B-Arbore. (O operaie Citete-Disc este redundant dac
pagina este deja n memorie, iar o operaie Scrie-Disc este redundant dac informaia scris
din memorie este identic cu cea de pe disc.)
338 Capitolul 19 B-arbori
Figura 19.7 Inserarea de chei ntr-un B-arbore. Acesta are gradul minim t = 3, deci un nod poate avea
cel mult 5 chei. Nodurile modificate prin inserri sunt haurate mai deschis. (a) Arborele iniial. (b)
Rezultatul inserrii cheii B introducerea ei n frunz. (c) Introducerea cheii Q n arborele precedent:
nodul RST U V este divizat n dou noduri coninnd RS i U V , cheia T este mutat n rdcin, iar
Q este inserat n partea stng a nodului RS. (d) Rezultatul inserrii cheii L n arborele precedent.
Rdcina este divizat, iar nlimea B-arborelui crete cu 1. Apoi L este inserat n frunza care conine
JK. (e) Rezultatul inserrii cheii F n arborele anterior. Nodul ABCDE este divizat nainte ca F s
fie inserat n nodul DE.
19.2-3 Explicai cum se poate gsi cheia minim memorat ntr-un B-arbore i cum se poate
gsi predecesorul unei chei memorate ntr-un B-arbore.
19.2-4 ? Presupunem c cheile {1, 2, . . . , n} sunt inserate ntr-un B-arbore iniial vid cu gradul
minim 2. Cte noduri va avea n final acest B-arbore?
19.2-5 Deoarece nodurile frunz nu conin pointeri la subarbori fii, se poate concepe folosirea
n frunze a unei valori t diferite (mai mari) dect la nodurile interne pentru a ocupa mai eficient
19.3. tergerea unei chei dintr-un B-arbore 339
paginile disc. Artai cum se modific procedurile de creare i inserare ntr-un B-arbore n acest
caz.
19.2-7 Presupunem c echipamentul disc permite s se aleag arbitrar lungimea paginii, dar c
timpul de citire a unei pagini, cu o lungime selectat, este a + bt, unde a i b sunt constante date,
iar t este gradul minim al B-arborelui. Descriei cum trebuie ales t, astfel nct s minimizeze
(aproximativ) timpul de cutare n B-arbore. Cutai, de exemplu, o valoare optim pentru t n
cazul a = 30 milisecunde i b = 40 microsecunde.
1. Dac cheia k este ntr-un nod x care este frunz, atunci se terge cheia k din nodul x.
a. Dac fiul y care precede cheia k are cel puin t chei, atunci se caut predecesorul k 0 al
cheii k n subarborele de rdcin y. Se terge k 0 i se nlocuiete k din x cu k 0 , dup
care se aplic mai departe, recursiv, aceeai regul. (Gsirea cheii k 0 i tergerea ei se
poate face ntr-un singur pas.)
b. n manier simetric, dac fiul z care succede cheia k n nodul x are cel puin t chei,
atunci se caut succesorul k 0 al cheii k n subarborele de rdcin z. Se terge k 0 i
se nlocuiete k din x cu k 0 , dup care se aplic mai departe, recursiv, aceeai regul.
(Gsirea cheii k 0 i tergerea ei se poate face ntr-un singur pas.)
c. n caz contrar, dac att y ct i z au numai cte t1 chei, cele dou noduri fuzioneaz
n sensul c n y intr k i toate cheile din z, dup care y va conine 2t 1 chei. Apoi
se elibereaz nodul z i recursiv, se terge cheia k din y.
340 Capitolul 19 B-arbori
Figura 19.8 tergerea de chei dintr-un B-arbore. Gradul lui minim este t = 3 astfel c nodurile, cu
excepia rdcinii, nu pot avea mai puin de 2 chei. Nodurile modificate sunt haurate mai deschis.
(a) B-arborele din figura 19.7(e). (b) tergerea cheii F corespunde cazului 1: tergere din frunz. (c)
tergerea cheii M : cazul 2a, cheia L care l precede pe M este mutat n vechiul loc al lui M . (d)
tergerea cheii G: cazul 2c, cheia G este pus mai jos i se formeaz prin fuziune nodul DEGJK, dup
care G este ters din frunz (cazul 1). (e) tergerea cheii D: cazul 3b, recurena nu poate s coboare
din nodul CL deoarece are numai dou chei, deci P este mpins n jos i prin fuzionarea cu CL i T X
se obine nodul CLP T X; apoi se terge D din frunz (cazul 1). (e) Dup (d) se terge rdcina i
nlimea scade cu 1. (f ) tergerea cheii B: cazul 3a, C este mutat n vechiul loc al lui B i E este mutat
n locul lui C.
3. Dac cheia k nu este prezent n nodul intern x, se determin rdcina ci [x] care indic
subarborele n care se afl cheia k, dac aceasta se afl n arbore. Dac ci [x] are numai
t 1 chei, se execut paii 3a sau 3b, necesari pentru a se pstra n noduri numrul minim
de t chei. Apoi se reaplic recursiv procedura la fiul potrivit al lui x.
a. Dac ci [x] are numai t 1 chei, dar are un nod frate n stnga sau n dreapta lui care
Probleme 341
are t chei, are loc mutarea unei chei din x n ci [x], apoi mutarea unei chei n x din
fratele din stnga sau dreapta a lui ci [x].
b. Dac ci [x] i fraii lui au cte t 1 chei, fuzioneaz ci cu unul dintre frai, ceea ce
implic mutarea unei chei din x n nodul nou fuzionat ca i cheie median.
Deoarece majoritatea cheilor dintr-un B-arbore sunt n frunze, ne ateptm ca, n practic,
cele mai multe tergeri s aib loc n frunze. Procedura de tergere terge-B-Arbore
acioneaz descendent i fr reveniri. Cnd se terge o cheie dintr-un nod intern, au loc o
serie de nlocuiri de chei, astfel nct tergerea efectiv s se fac n frunz (cazurile 2a sau 2b).
Dei procedura pare complicat, ea presupune numai O(h) accese la disc pentru un B-arbore
de nlime h, deoarece ntre dou apeluri recursive au loc numai O(1) accese la disc. Timpul
CPU necesar este de O(th) = O(t logt n).
Exerciii
19.3-1 Prezentai rezultatele obinute dup tergerea, n aceast ordine, a cheilor C, P i V din
B-arborele din figura 19.8(f).
Probleme
19-1 Stive n memoria secundar
Considerm implementarea unei stive pentru un sistem de calcul care are o memorie intern
rapid relativ mic i o memorie secundar pe disc lent, dar practic orict de mare. Operaiile
specifice Pune-n-Stiv i Scoate-Din-Stiv au ca operand un cuvnt. Se admite creterea
orict de mare a acestei stive; ceea ce depete memoria intern, se extinde automat pe disc.
342 Capitolul 19 B-arbori
a. Care este valoarea asimptotic a numrului de accese disc la o stiv cu n operaii asupra
stivei, n cel mai defavorabil caz? Care este timpul CPU pentru n operaii pe stiv?
(Rspunsul se va exprima n funcie de m i n).
b. Care este, n cel mai defavorabil caz, numrul de accese la disc i timpul CPU pentru n
operaii Pune-n-Stiv?
c. Care este, n cel mai defavorabil caz, numrul de accese la disc i timpul CPU pentru n
operaii asupra stivei?
Presupunem c realizm o implementare a stivei n care se pstreaz dou pagini disc n memorie
(cu gestiunea aferent lor).
d. Descriei cum se gestioneaz, n acest caz, paginile stivei, astfel nct numrul amortizat
al acceselor de disc s fie O(1/m), iar timpul mediu amortizat CPU s fie O(1).