Sie sind auf Seite 1von 896

Titlul original: Introduction to Algorithms

Copyright c ( 1990 Massachusetts Institute of Technology


Editor coordonator: Clara Ionescu
Coordonator traducere: Horia F. Pop
Traducere:
Prefaa: Simona Motogna Capitolul 19: Florian M. Boian
Capitolul 1: Horia F. Pop Capitolul 20: Ioan Lazar
Capitolul 2: Paul Blaga Capitolul 21: Ioan Lazar
Capitolul 3: Paul Blaga Capitolul 22: Virginia Niculescu
Capitolul 4: Paul Blaga Capitolul 23: Adrian Monea
Capitolul 5: Adrian Monea Capitolul 24: Adrian Monea
Capitolul 6: Radu Trmbia Capitolul 25: Luminia State
Capitolul 7: Clara Ionescu Capitolul 26: Mihai Scoraru
Capitolul 8: Zoltn Ksa Capitolul 27: Zoltn Ksa, Simona Motogna
Capitolul 9: Luminia State Capitolul 28: Zoltn Ksa
Capitolul 10: Luminia State Capitolul 29: Florian M. Boian
Capitolul 11: Simona Motogna Capitolul 30: Mihai Scoraru
Capitolul 12: Simona Motogna Capitolul 31: Liviu Negrescu
Capitolul 13: Bazil Prv Capitolul 32: Radu Trmbia
Capitolul 14: Bazil Prv Capitolul 33: Liviu Negrescu
Capitolul 15: Bazil Prv Capitolul 34: Liana Bozga
Capitolul 16: Cristina Vertan Capitolul 35: Liana Bozga
Capitolul 17: Cristina Vertan Capitolul 36: Mihai Scoraru
Capitolul 18: Cristina Vertan Capitolul 37: Horia F. Pop
Lecturare:
Florian M. Boian, Liana Bozga, Carmen Bucur, Ioana Chiorean, Horia Georgescu,
Clara Ionescu, Eugen Ionescu, Zoltn Ksa, Ioan Lazar, Adrian Monea, Simona Motogna,
Virginia Niculescu, Bazil Prv, Horia F. Pop, Mihai Scoraru, Radu Trmbia
Index: Simona Motogna
Graca: Dan Creu
Coperta: Mircea Drgoi
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
Prefaa ediiei n limba romn ix
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
II. Ordonare i statistici de ordine 116
7. Heapsort 119
7.1. Heap-uri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
7.2. Reconstituirea proprietii de heap . . . . . . . . . . . . . . . . . . . . . . . . . . 121
7.3. Construirea unui heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
7.4. Algoritmul heapsort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
7.5. Cozi de prioriti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
8. Sortarea rapid 131
8.1. Descrierea sortrii rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
8.2. Performana algoritmului de sortare rapid . . . . . . . . . . . . . . . . . . . . . 133
8.3. Variantele aleatoare ale sortrii rapide . . . . . . . . . . . . . . . . . . . . . . . . 137
8.4. Analiza algoritmului de sortare rapid . . . . . . . . . . . . . . . . . . . . . . . . 139
9. Sortare n timp liniar 147
9.1. Margini inferioare pentru sortare . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
9.2. Sortarea prin numrare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
9.3. Ordonare pe baza cifrelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
9.4. Ordonarea pe grupe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
10.Mediane i statistici de ordine 158
10.1. Minim i maxim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
10.2. Selecia n timp mediu liniar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10.3. Selecia n timp liniar n cazul cel mai defavorabil . . . . . . . . . . . . . . . . . . 161
III. Structuri de date 167
11.Structuri de date elementare 171
11.1. Stive i cozi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
11.2. Liste nlnuite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
11.3. Implementarea pointerilor i obiectelor . . . . . . . . . . . . . . . . . . . . . . . . 178
11.4. Reprezentarea arborilor cu rdcin . . . . . . . . . . . . . . . . . . . . . . . . . 182
12.Tabele de dispersie 187
12.1. Tabele cu adresare direct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
12.2. Tabele de dispersie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
12.3. Funcii de dispersie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Cuprins v
12.4. Adresarea deschis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
13.Arbori binari de cutare 208
13.1. Ce este un arbore binar de cutare? . . . . . . . . . . . . . . . . . . . . . . . . . 208
13.2. Interogarea ntr-un arbore binar de cutare . . . . . . . . . . . . . . . . . . . . . 210
13.3. Inserarea i tergerea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
13.4. Arbori binari de cutare construii aleator . . . . . . . . . . . . . . . . . . . . . . 217
14.Arbori rou-negru 226
14.1. Proprietile arborilor rou-negru . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
14.2. Rotaii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
14.3. Inserarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
14.4. tergerea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
15.mbogirea structurilor de date 243
15.1. Statistici dinamice de ordine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
15.2. Cum se mbogete o structur de date . . . . . . . . . . . . . . . . . . . . . . . 248
15.3. Arbori de intervale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
IV. Tehnici avansate de proiectare i analiz 257
16.Programarea dinamic 259
16.1. nmulirea unui ir de matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
16.2. Elemente de programare dinamic . . . . . . . . . . . . . . . . . . . . . . . . . . 266
16.3. Cel mai lung subir comun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
16.4. Triangularea optim a poligoanelor . . . . . . . . . . . . . . . . . . . . . . . . . . 275
17.Algoritmi greedy 283
17.1. O problem de selectare a activitilor . . . . . . . . . . . . . . . . . . . . . . . . 283
17.2. Elemente ale strategiei greedy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
17.3. Coduri Human . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
17.4. Bazele teoretice ale metodei greedy . . . . . . . . . . . . . . . . . . . . . . . . . . 296
17.5. O problem de planicare a activitilor . . . . . . . . . . . . . . . . . . . . . . . 301
18.Analiza amortizat 306
18.1. Metoda de agregare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
18.2. Metoda de cotare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
18.3. Metoda de potenial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
18.4. Tabele dinamice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
V. Structuri de date avansate 325
19.B-arbori 328
19.1. Deniia B-arborelui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
19.2. Operaii de baz n B-arbore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
19.3. tergerea unei chei dintr-un B-arbore . . . . . . . . . . . . . . . . . . . . . . . . . 339
vi Cuprins
20.Heap-uri binomiale 344
20.1. Arbori binomiali i heap-uri binomiale . . . . . . . . . . . . . . . . . . . . . . . . 345
20.2. Operaii pe heap-uri binomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
21.Heap-uri Fibonacci 362
21.1. Structura heap-urilor Fibonacci . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
21.2. Operaiile heap-urilor interclasabile . . . . . . . . . . . . . . . . . . . . . . . . . . 364
21.3. Descreterea unei chei i tergerea unui nod . . . . . . . . . . . . . . . . . . . . . 372
21.4. Mrginirea gradului maxim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
22.Structuri de date pentru mulimi disjuncte 379
22.1. Operaii pe mulimi disjuncte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
22.2. Reprezentarea mulimilor disjuncte prin liste nlnuite . . . . . . . . . . . . . . . 381
22.3. Pduri de mulimi disjuncte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
22.4. Analiza reuniunii dup rang comprimnd drumul . . . . . . . . . . . . . . . . . . 388
VI. Algoritmi de grafuri 398
23.Algoritmi elementari de grafuri 400
23.1. Reprezentrile grafurilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
23.2. Cutarea n lime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
23.3. Cutarea n adncime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410
23.4. Sortarea topologic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
23.5. Componente tare conexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
24.Arbori de acoperire minimi 428
24.1. Dezvoltarea unui arbore de acoperire minim . . . . . . . . . . . . . . . . . . . . . 429
24.2. Algoritmii lui Kruskal i Prim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
25.Drumuri minime de surs unic 441
25.1. Drumuri minime i relaxare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
25.2. Algoritmul Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
25.3. Algoritmul Bellman-Ford . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
25.4. Drumuri minime de surs unic n grafuri orientate aciclice . . . . . . . . . . . . 460
25.5. Constrngeri cu diferene i drumurile minime . . . . . . . . . . . . . . . . . . . . 462
26.Drumuri minime ntre toate perechile de vrfuri 473
26.1. Drumuri minime i nmulirea matricelor . . . . . . . . . . . . . . . . . . . . . . . 475
26.2. Algoritmul Floyd-Warshall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
26.3. Algoritmul lui Johnson pentru grafuri rare . . . . . . . . . . . . . . . . . . . . . . 486
26.4. O modalitate general pentru rezolvarea problemelor de drum n grafuri orientate 490
27.Flux maxim 498
27.1. Reele de transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
27.2. Metoda lui Ford-Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505
27.3. Cuplaj bipartit maxim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Cuprins vii
27.4. Algoritmi de preux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
27.5. Algoritmul mutare-n-fa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
VII. Capitole speciale 541
28.Reele de sortare 544
28.1. Reele de comparare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
28.2. Principiul zero-unu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548
28.3. O reea de sortare a secvenelor bitone . . . . . . . . . . . . . . . . . . . . . . . . 550
28.4. Reeaua de interclasare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 552
28.5. Reeaua de sortare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
29.Circuite aritmetice 561
29.1. Circuite combinaionale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
29.2. Circuite de sumare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
29.3. Circuite multiplicatoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
29.4. Circuite cu ceas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
30.Algoritmi pentru calculatoare paralele 590
30.1. Saltul de pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
30.2. Algoritmi CRCW i algoritmi EREW . . . . . . . . . . . . . . . . . . . . . . . . 601
30.3. Teorema lui Brent i eciena efortului . . . . . . . . . . . . . . . . . . . . . . . . 608
30.4. Calculul paralel de prex, ecient ca efort . . . . . . . . . . . . . . . . . . . . . . 612
30.5. ntreruperi deterministe de simetrie . . . . . . . . . . . . . . . . . . . . . . . . . . 617
31.Operaii cu matrice 626
31.1. Proprietile matricelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
31.2. Algoritmul lui Strassen pentru nmulirea matricelor . . . . . . . . . . . . . . . . 633
31.3. Sisteme de numere algebrice i nmulirea matricelor booleene . . . . . . . . . . . 638
31.4. Rezolvarea sistemelor de ecuaii liniare . . . . . . . . . . . . . . . . . . . . . . . . 642
31.5. Inversarea matricelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
31.6. Matrice simetrice pozitiv-denite i aproximarea prin
metoda celor mai mici ptrate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
32.Polinoame i TFR 666
32.1. Reprezentarea polinoamelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
32.2. TFD i TFR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
32.3. Implementri eciente ale TFR . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
33.Algoritmi din teoria numerelor 687
33.1. Noiuni elementare de teoria numerelor . . . . . . . . . . . . . . . . . . . . . . . 688
33.2. Cel mai mare divizor comun . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
33.3. Aritmetic modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
33.4. Rezolvarea ecuaiilor liniare modulare . . . . . . . . . . . . . . . . . . . . . . . . 702
33.5. Teorema chinez a restului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
33.6. Puterile unui element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
viii Cuprins
33.7. Criptosistemul RSA cu cheie public . . . . . . . . . . . . . . . . . . . . . . . . . 711
33.8. Testul de primalitate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
33.9. Factorizarea ntreag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
34.Potrivirea irurilor 731
34.1. Algoritmul naiv pentru potrivirea irurilor . . . . . . . . . . . . . . . . . . . . . . 732
34.2. Algoritmul Rabin-Karp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
34.3. Potrivirea irurilor folosind automate nite . . . . . . . . . . . . . . . . . . . . . 739
34.4. Algoritmul Knuth-Morris-Pratt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
34.5. Algoritmul Boyer-Moore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
35.Geometrie computaional 759
35.1. Proprietile segmentului de dreapt . . . . . . . . . . . . . . . . . . . . . . . . . 759
35.2. Determinarea cazului n care oricare dou segmente se intersecteaz . . . . . . . 764
35.3. Determinarea nvelitorii convexe . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
35.4. Determinarea celei mai apropiate perechi de puncte . . . . . . . . . . . . . . . . . 778
36.NP-completitudine 785
36.1. Timpul polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
36.2. Vericri n timp polinomial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 792
36.3. NP-completitudine i reductibilitate . . . . . . . . . . . . . . . . . . . . . . . . . 796
36.4. Demonstraii ale NP-completitudinii . . . . . . . . . . . . . . . . . . . . . . . . . 804
36.5. Probleme NP-complete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 810
37.Algoritmi de aproximare 826
37.1. Problema acoperirii cu vrfuri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
37.2. Problema comis-voiajorului . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
37.3. Problema acoperirii mulimii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834
37.4. Problema sumei submulimii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 838
Bibliograe 845
Index 853
Prefaa ediiei n limba romn
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 sucient 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 sacricat 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 L
A
T
E
X.
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
tiinic 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 L
A
T
E
X, tehnoredactarea
a constituit i ea un efort. n special pregtirea desenelor a ridicat multe probleme, gracianul
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 e 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:
Urmnd exemplul american, lista cu greelile gsite va 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 aat de la MIT Press, lucreaz la o versiune nou a crii, revizuit i
mbogit. V promitem c, imediat ce aceast versiune va disponibil pentru traducere, o
vom publica i n limba romn.
Prefa
Aceast carte se dorete a o introducere exhaustiv n studiul modern al algoritmilor. Ea
prezint muli algoritmi i i studiaz n profunzime, pstrnd totui analiza i proiectarea lor la
un nivel accesibil tuturor cititorilor. Am ncercat s pstrm explicaiile la un nivel elementar
fr a afecta profunzimea abordrii sau rigoarea matematic.
Fiecare capitol prezint un algoritm, o tehnic de proiectare, o arie de aplicare sau un
subiect legat de acestea. Algoritmii sunt descrii n englez i n pseudocod, care a fost astfel
conceput nct s poat neles de oricine care posed cunotiine elementare de programare.
Cartea conine peste 260 de guri, care ilustreaz modul de funcionare a algoritmilor. Deoarece
considerm ca un criteriu de baz n proiectare, vom include analiza atent a timpilor
de execuie a algoritmilor prezentai.
Cartea se adreseaz, n primul rnd, celor care studiaz un curs elementar sau academic de
algoritmi sau structuri de date. Deoarece studiaz att aspecte tehnice, ct i matematice n
proiectarea algoritmilor, este la fel de binevenit pentru profesionitii autodidaci.
Pentru profesori
Aceast carte a fost conceput pentru a 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 privit ca un depozit din care se poate alege
materialul cel mai adecvat cursului care urmeaz s e 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 dicile, 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 ecare capitol cu probleme. Exerciiile sunt, n general, ntrebri scurte care testeaz
stpnirea noiunilor de baz prezentate. Unele dintre ele sunt simple vericri, 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 dicil 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 ecare algoritm ntr-o manier accesibil i interesant. Pentru a un
ajutor cnd ntlnii algoritmi neobinuii sau dicili, am descris ecare 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?
Este necesar o anumit experien de programare. n particular, trebuie s nelegei
procedurile recursive i structurile de date simple, ca tablouri sau liste nlnuite.
Este necesar o anumit experien n demonstraii prin inducie matematic. Unele
poriuni din carte se bazeaz pe anumite cunotine de calcul elementar. n afar de asta,
partea nti a acestei cri v prezint toate tehnicile matematice necesare.
Pentru profesioniti
Aria larg de subiecte prezentate n aceast carte o recomand ca un excelent manual de
algoritmi. Deoarece ecare 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 ecare algoritm ntr-un stil clar i concis.
n consecin, nu lum n considerare tratarea erorilor sau alte aspecte tehnice care necesit
presupuneri specice relative unor medii de programare. Am urmrit s prezentm ecare
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
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, Sha 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 T
E
X 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, Cli 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 bibliograce. 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 bibliograce.
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 specici, 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, Je Shallit, Cli 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 L
A
T
E
X, un pachet de macrouri T
E
X. 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. Bibliograa a fost pregtit
folosind BibT
E
X. 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 L
A
T
E
X.
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 ne, 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 suet aceast carte lor.
Thomas H. Cormen
Charles E. Leiserson
Ronald L. Rivest
1 Introducere
Acest capitol v va familiariza cu conceptele de baz folosite n aceast carte, referitor la
proiectarea i analiza algoritmilor. Este un text, practic, independent de restul crii, dar include
cteva referiri la materialul care va introdus n partea I.
ncepem cu o discuie asupra problemelor generale ale calculabilitii i ale algoritmilor
necesari pentru rezolvarea acestora, cu problema sortrii, ca exemplu introductiv. Pentru a
arta cum vom specica algoritmii prezentai, vom introduce un pseudocod, care ar trebui
s e familiar cititorilor obinuii cu programarea. Sortarea prin inserie, un algoritm simplu
de sortare, va servi ca exemplu iniial. Vom analiza timpul de execuie pentru sortarea prin
inserie, introducnd o notaie care s descrie modul n care crete acest timp o dat cu numrul
obiectelor aate n operaia de sortare. De asemenea, vom introduce n proiectarea algoritmilor
metoda , pe care o vom utiliza pentru dezvoltarea unui algoritm numit sortare
prin interclasare. Vom ncheia cu o comparaie ntre cei doi algoritmi de sortare.
1.1. Algoritmi
Fr a foarte exaci, spunem c un algoritm este orice procedur de calcul bine denit
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 denite. Enunul problemei specic, 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
deni formal problema sortrii :
Date de intrare: Un ir de n numere 'a
1
, a
2
, . . . , a
n
`.
Date de ieire: O permutare (reordonare) a irului iniial, 'a
t
1
, a
t
2
, . . . , a
t
n
` astfel nct a
t
1

a
t
2
a
t
n
.
Fiind dat un ir de intrare, ca, de exemplu, '31, 41, 59, 26, 41, 58`, un algoritm de sortare
returneaz, la ieire, irul '26, 31, 41, 41, 58, 59`. 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 denirea 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 e 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 uneori utili dac rata lor de eroare poate 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 specicat printr-un program pentru calculator sau chiar ca un
echipament hardware. Singura condiie este aceea ca specicaiile s produc o descriere precis
a procedurii de calcul care urmeaz a 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.
Sortarea prin inserie
ncepem cu sortarea prin inserie, care este un algoritm ecient pentru sortarea unui
numr mic de obiecte. Sortarea prin inserie funcioneaz n acelai fel n care muli oameni
sorteaz un pachet de cri de joc obinuite. Se ncepe cu pachetul aezat pe mas cu faa n jos
i cu mna stng goal. Apoi, lum cte o carte de pe mas i o inserm n poziia corect n
mna stng. Pentru a gsi poziia corect pentru o carte dat, o comparm cu ecare dintre
crile aate deja n mna stng, de la dreapta la stnga, aa cum este ilustrat n gura 1.1.
1.1. Algoritmi 3
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 sortat. (Pe parcursul codului, numrul de elemente ale lui A este notat prin
[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, [A] execut
2: A[j]
3: Insereaz A[j] n irul sortat A[1..j 1]
4: i j 1
5: ct timp i > 0 i A[i] > execut
6: A[i + 1] A[i]
7: i i 1
8: A[i + 1]
Figura 1.2 ilustreaz modul de funcionare a acestui algoritm pentru A = '5, 2, 4, 6, 1, 3`.
Indicele j corespunde crii care urmeaz a 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 aate nc pe mas. Indicele se deplaseaz de la stnga la dreapta n interiorul
vectorului. La ecare 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).
Convenii pentru pseudocod
La scrierea pseudocodului vom folosi urmtoarele convenii:
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
2. Ciclurile de tipul ct timp, pentru, repet i construciile condiionale dac, atunci i
altfel au aceeai interpretare ca i structurile similare din Pascal.
3. Simbolul indic faptul c restul liniei este un comentariu.
4. O atribuire multipl de forma i j e nseamn atribuirea valorii expresiei e ambelor
variabile i i j; aceasta ar trebui tratat ca un echivalent al atribuirii j e, urmat de
atribuirea i j.
n limbajele de programare reale, indentarea, ca unic metod pentru indicarea structurilor de bloc, nu este
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
Figura 1.2 Modul de operare a procedurii Sorteaz-Prin-Inserie asupra vectorului A =
'5, 2, 4, 6, 1, 3). Poziia indicelui j este indicat printr-un cerc.
5. Variabilele (de exemplu i, j, ) 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 specicnd 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
indicnd numrul de elemente ale acestuia. Pentru a specica numrul de elemente ale unui
vector A, se va scrie [A]. Dei vom folosi parantezele drepte att pentru indexarea
elementelor unui vector, ct i pentru atributele obiectelor, va 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 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 gura 1.2, ilustrai modul de operare al procedurii Sorteaz-Prin-
Inserie asupra vectorului A = '31, 41, 59, 26, 41, 58`.
1.1-2 Rescriei procedura Sorteaz-Prin-Inserie pentru a sorta n ordine necresctoare n
loc de ordine nedescresctoare.
1.1-3 S considerm problema cutrii :
Date de intrare: Un ir de n numere A = 'a
1
, a
2
, . . . , a
n
` i o valoare v.
Date de ieire: Un indice i astfel nct v = A[i] sau valoarea special nil dac v nu apare n
A.
Scriei un algoritm pentru o cutare liniar, care parcurge irul n cutarea lui v.
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 e 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.
1.2. Analiza algoritmilor
Analiza unui algoritm a ajuns s nsemne prevederea resurselor pe care algoritmul le solicit.
Uneori, resurse ca memoria, limea benzii de comunicaie, pori logice sunt prima preocupare,
dar, de cele mai multe ori, vrem s msurm timpul de execuie necesar algoritmului. n general,
analiznd mai muli algoritmi pentru o anumit problem, cel mai ecient poate identicat
uor. O astfel de analiz poate indica mai muli candidai viabili, dar civa algoritmi inferiori
sunt, de obicei, eliminai n timpul analizei.
nainte de a analiza un algoritm, trebuie s avem un model al tehnologiei de implementare care
urmeaz s e folosit, incluznd un model pentru resursele acesteia i costurile corespunztoare.
n cea mai mare parte a acestei cri, vom presupune c tehnologia de implementare este un
model de calcul generic cu un procesor, main cu acces aleator (random-access machine,
RAM) i vom presupune c algoritmii vor implementai ca programe pentru calculator. n
modelul RAM, instruciunile sunt executate una dup alta, fr operaii concurente. Totui, n
partea nal a crii, vom avea ocazia s investigm modele de calcul paralel i hardware digital.
Analiza, chiar i a unui singur algoritm, poate , uneori, o ncercare dicil. Matematica
necesar poate s includ combinatoric, teoria probabilitilor, dexteritate algebric i abilitatea
de a identica cei mai importani termeni ntr-o expresie. Deoarece comportarea unui algoritm
poate diferit n funcie de datele de intrare, avem nevoie de un mijloc de exprimare a acestei
comportri n formule simple, uor de neles.
Dei, pentru a analiza un algoritm, selectm numai un anumit tip de model de main de
calcul, rmn mai multe posibiliti de alegere a felului n care decidem s exprimm aceast
analiz. Un scop imediat este de a gsi un mijloc de exprimare care s e simplu de scris i de
manevrat, care s arate principalele resurse necesare unui algoritm i s suprime detaliile inutile.
6 Capitolul 1 Introducere
Analiza sortrii prin inserie
Timpul de execuie necesar procedurii Sorteaz-Prin-Inserie depinde de intrare: sortarea
a o mie de numere ia mai mult timp dect sortarea a trei. Mai mult dect att, Sorteaz-
Prin-Inserie poate s consume timpi diferii pentru a sorta dou iruri de numere de aceeai
dimensiune, n funcie de msura n care acestea conin numere aproape sortate. n general,
timpul necesar unui algoritm crete o dat cu dimensiunea datelor de intrare, astfel nct este
tradiional s se descrie timpul de execuie al unui program n funcie de dimensiunea datelor de
intrare. n acest scop, trebuie s denim cu mai mult precizie termenii de timp de execuie i
dimensiune a datelor de intrare.
Deniia dimensiunii datelor de intrare depinde de problema studiat. Pentru multe
probleme, cum ar sortarea sau calculul unei transformate Fourier discrete, cea mai natural
msur este de exemplu, pentru sortare, un vector
de dimensiune n. Pentru multe alte probleme, ca spre exemplu nmulirea a doi ntregi, cea
mai bun msur pentru dimensiunea datelor de intrare este necesari
pentru reprezentarea datelor de intrare n notaie binar. Uneori, este mai potrivit s exprimm
dimensiunea datelor de intrare prin dou numere n loc de unul. De exemplu, dac datele de
intrare ale unui algoritm sunt reprezentate de un graf, dimensiunea datelor de intrare poate
descris prin numrul de vrfuri i muchii ale grafului. Pentru ecare problem pe care o vom
studia, vom indica msura utilizat pentru dimensiunea datelor de intrare.
Timpul de execuie a unui algoritm pentru un anumit set de date de intrare este determinat
de numrul de operaii primitive sau pai executai. Este util s denim noiunea de pas astfel
nct s e ct mai independent de calculator. Pentru moment, s adoptm urmtorul punct de
vedere. Pentru execuia unei linii din pseudocod este necesar o durat constant de timp. O
anumit linie poate avea nevoie de un timp de execuie diferit dect o alta, dar vom presupune c
ecare execuie a liniei i consum timpul c
i
, unde c
i
este o constant. Acest punct de vedere este
conform cu modelul RAM i, n acelai timp, reect, destul de bine, modul n care pseudocodul
poate , de fapt, utilizat n cele mai multe cazuri concrete.
2
n prezentarea care urmeaz, expresia noastr pentru timpul de execuie al algoritmului
Sorteaz-Prin-Inserie va evolua de la o formul relativ complicat, care folosete toate
costurile de timp c
i
, la una mult mai simpl n notaii, care este mai concis i mai uor de
manevrat. Aceast notaie mai simpl va face, de asemenea, uor de determinat dac un algoritm
este mai ecient dect altul.
ncepem prin a relua prezentarea procedurii Sorteaz-Prin-Inserie, adugnd costul
de timp pentru ecare instruciune i un numr care reprezint de cte ori aceasta este efectiv
executat. Pentru ecare j = 2, 3, . . . , n, unde n = [A], vom nota cu t
j
numrul de
execuii ale testului ct timp din linia 5 pentru valoarea xat j. Vom presupune c un
comentariu nu este o instruciune executabil, prin urmare nu cere timp de calcul.
Timpul de execuie al algoritmului este suma tuturor timpilor de execuie corespunztori
Exist aici cteva subtiliti: paii de calcul pe care i precizm sunt, cel mai adesea, variante ale unor
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
Sorteaz-Prin-Inserie(A)
1: pentru j 2, [A] execut
2: A[j]
3: Insereaz A[j] n irul sortat A[1..j 1]
4: i j 1
5: ct timp i > 0 i A[i] > execut
6: A[i + 1] A[i]
7: i i 1
8: A[i + 1]
c
1
n
c
2
n 1
0 n 1
c
4
n 1
c
5

n
j=2
t
j
c
6

n
j=2
(t
j
1)
c
7

n
j=2
(t
j
1)
c
8
n 1
ecrei instruciuni executate: o instruciune care consum timpul c
i
pentru execuie i este
executat de n ori, va contribui cu c
i
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 i , obinnd
T(n) = c
1
n +c
2
(n 1) +c
4
(n 1) +c
5
n

j=2
t
j
+c
6
n

j=2
(t
j
1) +c
7
n

j=2
(t
j
1)
+ c
8
(n 1).
Chiar pentru date de intrare de aceeai mrime, timpul de execuie al unui algoritm dat poate
s depind de datelor de intrare. De exemplu, pentru Sorteaz-Prin-Inserie, cazul
cel mai favorabil apare cnd vectorul de intrare este deja sortat. Pentru ecare j = 2, 3 . . . , n,
vom gsi c A[i] n linia 5, cnd i are valoarea iniial j 1. Rezult t
j
= 1 pentru
j = 2, 3, . . . , n i timpul de execuie n cazul cel mai favorabil este
T(n) = c
1
n +c
2
(n 1) +c
4
(n 1) +c
5
(n 1) +c
8
(n 1)
= (c
1
+c
2
+c
4
+c
5
+c
8
)n (c
2
+c
4
+c
5
+c
8
).
Acest timp de execuie poate exprimat sub forma an +b pentru anumite a i b care
depind doar de timpii de execuie c
i
, ind 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 ecare element A[j] cu ecare
element din subvectorul A[1..j 1], i, astfel, t
j
= j pentru j = 2, 3, . . . , n. Observnd c
n

j=2
j =
n(n + 1)
2
1
i
n

j=2
(j 1) =
n(n 1)
2
Un fenomen de acest tip nu mai are loc atunci cnd se refer la alte resurse, cum ar , 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
T(n) = c
1
n +c
2
(n 1) +c
4
(n 1) +c
5

n(n + 1)
2
1

+c
6

n(n 1)
2

+ c
7

n(n 1)
2

+c
8
(n 1)
=

c
5
2
+
c
6
2
+
c
7
2

n
2
+

c
1
+c
2
+c
4
+
c
5
2

c
6
2

c
7
2
+c
8

n
(c
2
+c
4
+c
5
+c
8
) .
Rezult c timpul de execuie n cazul cel mai defavorabil poate exprimat sub forma
an
2
+bn +c, unde constantele a, b i c depind, din nou, de costurile c
i
ale instruciunilor, ind
astfel o funcie ptratic de n.
De obicei, la fel ca la sortarea prin inserie, timpul de execuie al unui algoritm dat este
x 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.
Analiza celui mai defavorabil caz i a cazului mediu
n analiza sortrii prin inserie am cercetat ambele situaii extreme: cazul cel mai favorabil, n
care vectorul de intrare era deja sortat, respectiv cel mai defavorabil, n care vectorul de intrare
era sortat n ordine invers. n continuare (pe tot parcursul acestei cri), ne vom concentra, de
regul, pe gsirea timpului de execuie n cazul cel mai defavorabil , cu alte cuvinte, a
celui mai mare timp de execuie posibil relativ la date de intrare de dimensiune constant
n. Precizm trei motive pentru aceast orientare:
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 x. Cunoscnd acest
timp, avem o garanie c algoritmul nu va avea, niciodat, un timp de execuie mai mare.
Nu va nevoie s facem presupuneri sau investigaii suplimentare asupra timpului de
execuie i s sperm c acesta nu va , 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 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 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 vericate jumtate din
elementele subvectorului A[1..j 1], deci t
j
= 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
n anumite cazuri particulare, vom interesai de timpul mediu de execuie al unui
algoritm. O problem care apare n analiza cazului mediu este aceea c s-ar putea s nu e
prea clar din ce sunt constituite datele de intrare medii pentru o anumit problem. Adesea,
vom presupune c toate datele de intrare avnd o dimensiune dat sunt la fel de probabile. n
practic, aceast presupunere poate fals, dar un algoritm aleator poate, uneori, s o foreze.
Ordinul de cretere
Pentru a uura analiza procedurii Sorteaz-Prin-Inserie, am utilizat mai multe presu-
puneri simplicatoare. n primul rnd, am ignorat costul real al ecrei instruciuni, folosind
constantele c
i
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 an
2
+bn+c pentru anumite constante a, b i c care depind de costurile c
i
ale instruciunilor. Astfel, am ignorat nu numai costurile reale ale instruciunilor, dar i costurile
abstracte c
i
.
Vom face acum nc o abstractizare simplicatoare. 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 an
2
) deoarece ceilali termeni sunt relativ nesemnicativi
pentru valori mari ale lui n. Ignorm, de asemenea, i factorul constant c, deoarece, pentru
numere foarte mari, factorii constani sunt mai puin semnicativi dect rata de cretere n
determinarea ecienei computaionale a unor algoritmi. Astfel, vom spune, de exemplu, c
sortarea prin inserie are un timp de execuie n cazul cel mai defavorabil de (n
2
) (pronunat
teta de n ptrat). Vom folosi notaia de tip n acest capitol cu caracter informal; va denit
cu precizie n capitolul 2.
n mod uzual, vom considera un algoritm ca ind mai ecient dect altul dac timpul su
de execuie n cazul cel mai defavorabil are un ordin de cretere mai mic. Aceast evaluare ar
putea incorect pentru date de intrare de dimensiune mic, dar n cazul unor date de intrare
de dimensiuni foarte mari, un algoritm de tipul (n
2
), de exemplu, va executat n cazul cel
mai defavorabil mult mai repede dect unul de tipul (n
3
).
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 vericate, n medie, presupunnd c elementul cutat se a 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 ? Justicai rspunsurile.
1.2-3 S considerm problema evalurii unui polinom ntr-un punct. Fiind dai n coecieni
a
0
, a
1
, . . . , a
n1
i un numr real x, dorim s calculm

n1
i=0
a
i
x
i
. Descriei un algoritm simplu
10 Capitolul 1 Introducere
n timp (n
2
) pentru aceast operaie. Descriei i un algoritm n timp (n) care folosete
urmtoarea metod de rescriere a unui polinom, numit schema lui Horner:
n1

i=0
a
i
x
i
= ( (a
n1
x +a
n2
)x + +a
1
)x +a
0
1.2-4 Scriei funcia n
3
/1000 100n
2
100n + 3 cu ajutorul notaiei .
1.2-5 Cum poate modicat aproape orice algoritm pentru a avea un timp de execuie bun n
cel mai favorabil caz?
1.3. Proiectarea algoritmilor
Exist multe moduri de proiectare a algoritmilor. Sortarea prin inserie folosete o metod
care s-ar putea numi incremental: avnd deja sortat subvectorul A[1..j1], inserm elementul
A[j] n locul potrivit producnd subvectorul A[1..j].
n aceast seciune vom examina o abordare diferit, numit . Vom utiliza
aceast abordare pentru a construi un algoritm de sortare al crui timp de execuie n cazul cel
mai defavorabil va mult mai mic dect al celui corespunztor sortrii prin inserie. Unul din
avantajele algoritmilor de tipul este acela c timpul lor de execuie este
adesea uor de determinat folosind tehnici care vor introduse n capitolul 4.
1.3.1. Abordarea divide i stpnete
Muli algoritmi utili au o structur recursiv: pentru a rezolva o problem dat, acetia sunt
apelai de ctre ei nii o dat sau de mai multe ori pentru a rezolva subprobleme apropiate.
Aceti algoritmi folosesc de obicei o abordare de tipul divide i stpnete: ei rup problema
de rezolvat n mai multe probleme similare problemei iniiale, dar de dimensiune mai mic, le
rezolv n mod recursiv i apoi le combin pentru a crea o soluie a problemei iniiale.
Paradigma implic trei pai la ecare nivel de recursivitate:
Divide problema ntr-un numr de subprobleme.
Stpnete subproblemele prin rezolvarea acestora n mod recursiv. Dac dimensiunile acestora
sunt sucient de mici, rezolv subproblemele n modul uzual, nerecursiv.
Combin soluiile tuturor subproblemelor n soluia nal pentru problema iniial.
Algoritmul de sortare prin interclasare urmeaz ndeaproape paradigma
. Intuitiv, acesta opereaz astfel.
Divide: mparte irul de n elemente care urmeaz a sortat n dou subiruri de cte n/2
elemente.
Stpnete: Sorteaz recursiv cele dou subiruri utiliznd sortarea prin interclasare.
Combin: Interclaseaz cele dou subiruri sortate pentru a produce rezultatul nal.
1.3. Proiectarea algoritmilor 11
Figura 1.3 Modul de operare al sortrii prin interclasare asupra vectorului A = '5, 2, 4, 6, 1, 3, 2, 6).
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 ind 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 aate deasupra pachetelor (fapt care va face ca o nou carte s e deasupra pachetului
respectiv) i de a o pune cu faa n jos pe locul n care se va forma pachetul sortat nal. Repetm
acest procedeu pn cnd unul din pachete este epuizat. n aceast faz, este sucient 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, ecare pas de baz dureaz un timp constant,
deoarece comparm de ecare dat doar dou cri. Deoarece avem de fcut cel mult n astfel de
operaii elementare, timpul de execuie pentru procedura Interclaseaz este (n).
Acum, putem utiliza procedura Interclaseaz ca subrutin pentru algoritmul de sortare
12 Capitolul 1 Introducere
Sorteaz-Prin-Interclasare(A, p, r)
1: dac p < r atunci
2: q (p +r)/2|
3: Sorteaz-Prin-Interclasare(A, p, q)
4: Sorteaz-Prin-Interclasare(A, q + 1, r)
5: Interclaseaz(A, p, q, r)
prin interclasare. Procedura Sorteaz-Prin-Interclasare(A, p, r) sorteaz elementele din
subvectorul A[p..r]. Dac p r, subvectorul are cel mult un element i este, prin urmare, deja
sortat. Altfel, pasul de divizare este prezent aici prin simplul calcul al unui indice q care m-
parte A[p..r] n doi subvectori, A[p..q] coninnd n/2| elemente i A[q + 1..r] coninnd n/2|
elemente.
4
Pentru a sorta ntregul ir A = 'A[1], A[2], . . . A[n]`, vom apela procedura Sortea-
z-Prin-Interclasare sub forma Sorteaz-Prin-Interclasare(A, 1, [A]) unde, din
nou, [A] = n. Dac analizm modul de operare al procedurii, de jos n sus, cnd n este
o putere a lui 2, algoritmul const din interclasarea perechilor de iruri de lungime 1, pentru a
forma iruri sortate de lungime 2, interclasarea acestora n iruri sortate de lungime 4, i aa
mai departe, pn cnd dou iruri sortate de lungime n/2 sunt interclasate pentru a forma irul
sortat nal de dimensiune n. Figura 1.3 ilustreaz acest proces.
1.3.2. Analiza algoritmilor de tipul divide i stpnete
Cnd un algoritm conine un apel recursiv la el nsui, timpul su de execuie poate , adesea,
descris printr-o relaie de recuren sau, mai simplu, recuren, care descrie ntregul timp
de execuie al unei probleme de dimensiune n cu ajutorul timpilor de execuie pentru date de
intrare de dimensiuni mai mici. Putem, apoi, folosi instrumente matematice pentru a rezolva
problema de recuren i pentru a obine margini ale performanei algoritmului.
O recuren pentru timpul de execuie al unui algoritm de tipul divide-et-impera se bazeaz
pe cele trei etape denite n descrierea metodei. La fel ca pn acum, vom nota cu T(n) timpul
de execuie al unei probleme de mrime n. Dac dimensiunea problemei este sucient de mic,
de exemplu n c pentru o anumit constant c, soluia direct ia un timp constant de execuie,
pe care l vom nota cu (1). S presupunem c divizm problema n a subprobleme, ecare
dintre acestea avnd dimensiunea de 1/b din dimensiunea problemei originale. Dac D(n) este
timpul necesar pentru a divide problema n subprobleme, iar C(n) este timpul necesar pentru a
combina soluiile subproblemelor n soluia problemei originale, obinem recurena
T(n) =

(1) dac n c,
aT(n/b) +D(n) +C(n) n caz contrar.
n capitolul 4 vom vedea cum se pot rezolva recurene uzuale pentru probleme de aceast
form.
Analiza sortrii prin interclasare
Dei algoritmul Sorteaz-Prin-Interclasare funcioneaz corect cnd numrul elemen-
telor nu este par, analiza bazat pe recuren se simplic dac presupunem c dimensiunea
Notaia x desemneaz cel mai mic numr ntreg mai mare sau egal dect x i x desemneaz cel mai mare
numr ntreg mai mic sau egal dect x. Aceste notaii sunt denite 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, ecare 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:
T(n) =

(1) dac n = 1,
2T(n/2) + (n) dac n > 1.
n capitolul 4, vom arta c T(n) este (nlg n), unde lg n reprezint log
2
n. Pentru numere
sucient de mari, sortarea prin interclasare, avnd timpul de execuie (nlg n), este mai per-
formant dect sortarea prin inserie, al crei timp de execuie n cazul cel mai defavorabil este
(n
2
).
Exerciii
1.3-1 Utiliznd ca model gura 1.3, ilustrai modul de operare al sortrii prin interclasare pentru
vectorul A = '3, 41, 52, 26, 38, 57, 9, 49`.
1.3-2 Scriei pseudocodul pentru Interclaseaz(A, p, q, r).
1.3-3 Utilizai inducia matematic pentru a arta c, dac n este o putere a lui 2, soluia
recurenei
T(n) =

2 dac n = 2,
2T(n/2) +n dac n = 2
k
, k > 1.
este T(n) = nlg n.
1.3-4 Sortarea prin inserie poate 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 aat la mijlocul vectorului i se poate elimina
din discuie una din jumti. Cutarea binar este un algoritm care repet acest procedeu,
njumtind de ecare dat partea irului n care se face cutarea. Scriei un pseudocod e
iterativ, e recursiv, pentru cutarea binar. Argumentai c timpul de execuie n cazul cel mai
defavorabil este (lg n).
1.3-6 Observai c blocul ct timp (liniile 57) din procedura Sorteaz-Prin-Inserie
(seciunea 1.1) folosete o cutare liniar pentru a parcurge napoi subvectorul A[1..j 1]. Putem
utiliza n locul acesteia o cutare binar (vezi exerciiul 1.3-5), pentru a mbunti timpul de
execuie total pentru sortarea prin inserie n cazul cel mai defavorabil, la valoarea (nlg n)?
1.3-7 Descriei un algoritm al crui timp de execuie s e (nlg n) i care, pornind de la o
mulime dat S de n numere reale i un alt numr real x, s decid dac printre elementele lui
S exist dou elemente avnd suma x.
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 nal, s-ar obine, eventual, un produs
digerabil, dar cu un efort considerabil mai mare dect cel necesar, iar rezultatul ar , probabil,
mai puin plcut din punct de vedere estetic.
Algoritmii care sunt proiectai s rezolve o aceeai problem pot s difere foarte mult n
ecien. Aceste diferene pot cu mult mai semnicative 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 e 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 ind c sunt
necesare 2n
2
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
inecient, codului rezultat indu-i necesare 50nlg n instruciuni. Pentru a sorta un milion de
numere, supercalculatorul are nevoie de
2 (10
6
)
2
instruciuni
10
8
instruciuni/secund
= 20.000 secunde 5, 56 ore,
n timp ce pentru calculatorul personal sunt necesare
50 10
6
lg 10
6
instruciuni
10
6
instruciuni/secund
1.000 secunde 16, 67 minute.
Probleme 15
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
ecieni, 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 8n
2
pai, n timp ce sortarea prin interclasare se execut n 64nlg 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
100n
2
este mai rapid dect un algoritm cu timpul timpul de execuie de 2
n
?
1.4-3 S considerm problema de a determina dac un ir arbitrar de n numere 'x
1
, x
2
, . . . , x
n
`
conine cel puin doi termeni egali. Artai c acest fapt poate realizat n (nlg n), n care
lg n reprezint log
2
n.
Probleme
1-1 Comparaia timpilor de execuie
Pentru ecare funcie f(n) i timp t din urmtorul tabel, determinai cea mai mare valoare a lui
n pentru o problem care poate 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
nlg n
n
2
n
3
2
n
n!
1-2 Sortarea prin inserie pe vectori mici n sortarea prin interclasare
Dei timpul de execuie al algoritmului de sortare prin interclasare n cazul cel mai defavorabil
este (nlg n), iar sortarea prin inserie are un timp de execuie pentru situaii similare de (n
2
),
factorii constani din sortarea prin inserie pot face ca aceasta s e, totui, mai rapid pentru
valori mici ale lui n. Astfel, are sens s se utilizeze sortarea prin inserie n cadrul sortrii prin
16 Capitolul 1 Introducere
interclasare, dac subproblemele devin sucient de mici. S considerm o modicare a sortrii
prin interclasare n care n/k subvectori de lungine k sunt sortai utiliznd sortarea prin inserie
i apoi interclasai folosind procedura standard de sortare prin interclasare, unde k este o valoare
care urmeaz a determinat.
a. Artai c cei n/k subvectori, ecare de lungime k, pot sortai prin inserie cu timp de
execuie (nk) n cazul cel mai defavorabil.
b. Artai c aceti subvectori pot sortai prin interclasare cu timp de execuie (nlg(n/k))
n cazul cel mai defavorabil.
c. Fiind dat faptul c algoritmul modicat are timp de execuie (nk + nlg(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 modicat are acelai timp de execuie ca i sortarea
standard prin interclasare?
d. Cum ar trebui ales k n mod practic?
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.
a. Enumerai cele cinci inversiuni ale vectorului '2, 3, 8, 6, 1`.
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? Justicai rspunsul.
d. Descriei un algoritm care determin numrul de inversiuni din orice permutare de n
elemente avnd timp de execuie (nlg n) n cazul cel mai defavorabil. ( Mo-
dicai sortarea prin interclasare.)
Note bibliograce
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
[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 semnicativ
pentru multe din problematicile prezentate aici. Conform lui Knuth, cuvntul algoritm este
derivat din numele al-Khowrizm, un matematician persan din secolul IX.
Note bibliograce 17
Aho, Hopcroft i Ullman [4] au susinut analiza asimptotic a algoritmilor ca mijloc de
comparare a performanei relative. Ei au popularizat utilizarea relaiilor de recuren pentru a
descrie timpii de execuie ai algoritmilor recursivi.
Knuth [123] prezint o tratare enciclopedic a multor algoritmi de sortare. Comparaia
algoritmilor de sortare (capitolul 9) include analize exacte ale numrrii pailor, precum aceea
care am efectuat-o aici pentru sortarea prin inserie. Discuia lui Knuth despre sortarea prin
inserie conine cteva variaii ale algoritmului. Cea mai important este sortarea lui Shell,
introdus de D. L. Shell, care utilizeaz sortarea prin inserie pe subiruri periodice ale datelor
de intrare pentru a produce un algoritm de sortare mai rapid.
Sortarea prin interclasare este, de asemenea, descris de Knuth. Acesta menioneaz c
J. von Neumann a inventat n anul 1938 un mecanism capabil s interclaseze dou pachete
de cartele perforate ntr-un singur pas. J. von Neumann, unul dintre pionierii informaticii, se
pare c a scris n 1945 un program pentru sortarea prin interclasare pe calculatorul EDVAC.
I Fundamente matematice
Introducere
Analiza algoritmilor necesit deseori utilizarea uneltelor matematice. Aceste unelte uneori
sunt foarte simple, cum ar algebra de liceu, dar altele, cum ar rezolvarea recurenelor s-ar
putea s reprezinte o noutate. Aceast parte a crii este un compendiu al metodelor i uneltelor
pe care n aceast carte le vom folosi pentru analiza algoritmilor.
V sugerm s nu ncercai s asimilai toat matematica din acest capitol dintr-o dat.
Rsfoii capitolele din aceast parte pentru a vedea ce conin. Apoi putei trece direct la capitolele
care se ocup de algoritmi. Pe msur ce citii aceste capitole, revenii la aceast parte oricnd
avei nevoie de o mai bun nelegere a uneltelor folosite n analizele de factur matematic.
Oricum, la un moment dat, vei dori s studiai ecare din aceste capitole n ntregime, astfel
nct s v formai fundamente matematice solide.
Capitolul 2 denete riguros mai multe notaii asimptotice, de exemplu notaia folosit n
capitolul 1. n restul capitolului 2 sunt prezentate alte notaii matematice. Scopul este mai mult
de a asigura faptul c modul n care folosii notaiile matematice este acelai cu cel folosit n
carte, i nu de a v nva noi noiuni matematice.
Capitolul 3 ofer metode pentru evaluarea i mrginirea sumelor, operaii ce apar foarte des
n analiza algoritmilor.
n capitolul 4 sunt prezentate metode de rezolvare a recurenelor, pe care le-am folosit, de
exemplu, pentru a analiza sortarea prin interclasare n capitolul 1 i cu care ne vom ntlni de
multe ori. O tehnic foarte ecient, care poate folosit pentru a rezolva recurene ce apar n
algoritmi divide i stpnete, este metoda master. O mare parte din capitolul 4 este alocat
demonstrrii corectitudinii metodei master, dei cititorul poate sri peste aceast demonstraie
fr o pierdere prea mare.
Capitolul 5 conine deniii i notaii de baz pentru mulimi, relaii, funcii, grafuri i arbori.
Acest capitol prezint de asemenea i unele proprieti de baz ale acestor concepte matematice.
Acest material este esenial pentru nelegerea crii, dar poate ignorat fr probleme dac ai
studiat anterior un curs de matematic discret.
Capitolul 6 ncepe cu principii elementare de numrare: permutri, combinri i alte noiuni
asemntoare. Restul capitolului conine deniii i proprieti elementare de probabilitate. Cei
mai muli algoritmi din aceast carte nu necesit estimri probabilistice pentru analiza lor, deci
putei omite cu uurin ultimele seciuni la o prim lectur, chiar fr a le rsfoi. Ulterior, cnd
vei ntlni o analiz probabilistic pe care dorii s o nelegei mai bine, vei constata c acest
capitol este bine organizat n acest sens.
2 Creterea funciilor
Ordinul de cretere a timpului de execuie al unui algoritm, denit n capitolul 1 d o
caracterizare simpl pentru eciena algoritmilor i ne d n acelai timp posibilitatea de a
compara performanele relative ale unor algoritmi alternativi. De ndat ce dimensiunea n a
datelor de intrare devine sucient de mare, algoritmul de sortare prin interclasare, cu timpul de
execuie (nlg n) n cazul cel mai defavorabil, este mai performant dect sortarea prin inserie,
al crei timp de execuie n cazul cel mai defavorabil este (n
2
). Dei uneori se poate determina
exact timpul de execuie al unui algoritm, aa cum am fcut pentru sortarea prin inserie n
capitolul 1, n general, o precizie suplimentar nu merit efortul fcut. Pentru date de intrare
sucient de mari, constantele multiplicative i termenii de ordin inferior din expresia exact a
unui timp de execuie sunt dominai de efectele dimensiunii datelor de intrare n sine.
Cnd examinm date de intrare de dimensiuni sucient de mari, astfel nct numai ordinul
de cretere a timpului de execuie s e relevant, studiem eciena asimptotic a algoritmilor.
Cu alte cuvinte, suntem interesai de modul de cretere a timpului de execuie a unui algoritm
o dat cu mrirea dimensiunii datelor de intrare, cnd dimensiunea datelor de
intrare crete nemrginit. n mod uzual, un algoritm care este asimptotic mai ecient va cea
mai bun alegere, cu excepia cazului n care datele de intrare sunt de dimensiune foarte mic.
Acest capitol ofer mai multe metode standard pentru simplicarea analizei asimptotice a
algoritmilor. Seciunea urmtoare ncepe prin a deni mai multe tipuri de notaie asimptotic,
dintre care am ntlnit deja -notaia. Vor prezentate mai multe convenii de notaie care vor
utilizate pe parcursul crii i n nal vom trece n revist comportamentul funciilor care apar
frecvent n analiza algoritmilor.
2.1. Notaia asimptotic
Notaiile pe care le utilizm pentru a descrie timpul asimptotic de execuie al unui algoritm
sunt denite cu ajutorul unor funcii al cror domeniu de deniie este de fapt mulimea nu-
merelor naturale N = 0, 1, 2, . . .. Astfel de notaii sunt convenabile pentru a descrie funcia
timp de execuie n cazul cel mai defavorabil T(n) care n mod uzual este denit doar pentru
dimensiuni ntregi ale datelor de intrare. Totui, este necesar uneori s folosim
notaia asimptotic ntr-o varietate de moduri. De exemplu, notaia se extinde cu uurin la
domeniul numerelor reale sau, alternativ, se poate restrnge la o submulime a mulimii nume-
relor naturale. Este important totui s nelegem sensul exact al notaiei pentru ca atunci cnd
este utilizat n mod abuziv s nu e utilizat n mod . n aceast seciune se denesc
principalele notaii asimptotice i de asemenea, se introduc cteva abuzuri de notaie mai des
ntlnite.
-notaia
n capitolul 1 am artat c timpul de execuie pentru sortarea prin inserie n cazul cel mai
defavorabil este T(n) = (n
2
). S denim acum exact aceast notaie. Pentru o funcie dat
2.1. Notaia asimptotic 21
g(n), notm cu (g(n)),
(g(n)) = f(n) : exist constantele pozitive c
1
, c
2
i n
0
astfel nct
0 c
1
g(n) f(n) c
2
g(n) pentru orice n n
0
.
O funcie f(n) aparine mulimii (g(n)) dac exist constantele pozitive c
1
i c
2
astfel nct
aceasta s e plasat ntre c
1
g(n) i c
2
g(n) pentru n sucient de mare. Dei (g(n)) este o
mulime, vom scrie f(n) = (g(n)) pentru a indica faptul c f(n) este un membru al acesteia.
Acest abuz al utilizrii semnului de egalitate pentru a desemna apartenena la o mulime poate
s par confuz la nceput, dar vom vedea mai trziu c are avantajele sale.
Figura 2.1 (a) d o imagine intuitiv a funciilor f(n) i g(n), cnd f(n) = (g(n)). Pentru
toate valorile lui n aate la dreapta lui n
0
, valoarea lui f(n) este mai mare sau egal cu c
1
g(n)
i mai mic sau egal cu c
2
g(n). Cu alte cuvinte, pentru orice n n
0
, s-ar putea spune c
funcia f(n) este egal cu g(n) pn la un factor constant. Vom spune c g(n) este o margine
asimptotic tare pentru f(n).
Deniia lui (g(n)) cere ca orice membru f(n) (g(n)) s e asimptotic nenegativ,
adic f(n) s e nenegativ pentru n destul de mare. O funcie asimptotic pozitiv este strict
pozitiv pentru orice n sucient de mare. Prin urmare, funcia g(n) nsi ar trebui s e
nenegativ, altfel mulimea (g(n)) este vid. Din acest motiv vom presupune n continuare
c orice funcie utilizat n cadrul -notaiei este asimptotic nenegativ. Aceast presupunere
rmne valabil i pentru celelalte notaii asimptotice denite n acest capitol.
n capitolul 1 am introdus o noiune neriguroas de -notaie care ducea la neglijarea
termenilor de ordin inferior i a coecientului constant al termenului de ordin maxim. S justi-
cm pe scurt aceast imagine intuitiv, utiliznd de data aceasta deniia, pentru a arta c
1
2
n
2
3n = (n
2
). Pentru a face aceasta, trebuie determinate constantele pozitive c
1
, c
2
i n
0
astfel nct
c
1
n
2

1
2
n
2
3n c
2
n
2
pentru orice n n
0
. mprind cu n
2
, se obine
c
1

1
2

3
n
c
2
.
Inegalitatea din dreapta va vericat pentru orice n 1 dac alegem c
2
1/2. n acelai fel,
inegalitatea din stnga va vericat pentru orice valoare n 7 dac alegem c
1
1/14. Astfel,
lund c
1
= 1/14, c
2
= 1/2 i n
0
= 7, se poate verica faptul c
1
2
n
2
3n = (n
2
). Evident,
sunt posibile i alte alegeri pentru aceste constante, ns faptul important aici este doar acela c
acestea exist. S mai observm c aceste constante depind de funcia
1
2
n
2
3n; o alt funcie
aparinnd lui (n
2
) va cere de regul alte constante.
Putem utiliza deniia formal i pentru a verica faptul c 6n
3
= (n
2
). S presupunem, n
scopul obinerii unei contradicii, c exist c
2
i n
0
astfel nct 6n
3
c
2
n
2
pentru orice n n
0
.
De aici, n c
2
/6, inegalitate care nu poate adevrat pentru n orict de mare deoarece c
2
este o constant.
Intuitiv, termenii de ordin inferior ai unei funcii asimptotic pozitive pot ignorai n
determinarea unor margini asimptotic strnse, deoarece acetia sunt nesemnicativi pentru valori
mari ale lui n. O fraciune inm a termenului de rang maxim este sucient pentru a domina
termenii de rang inferior. Astfel, dnd lui c
1
o valoare ceva mai mic dect coecientul termenului
22 Capitolul 2 Creterea funciilor
Figura 2.1 Exemple grace pentru notaiile , O i . n ecare parte, valoarea indicat a lui n
0
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
n
0
, c
1
i c
2
astfel nct la dreapta lui n
0
, valoarea lui f(n) se a ntotdeauna ntre c
1
g(n) i c
2
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 n
0
i c astfel nct la dreapta lui n
0
, 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 n
0
i c astfel nct
la dreapta lui n
0
, valoarea lui f(n) este ntotdeauna mai mare sau egal cu cg(n).
de rang maxim i dnd lui c
2
o valoare ceva mai mare, s-ar putea ca inegalitile din deniia -
notaiei s e satisfcute. Coecientul termenului de rang maxim poate de asemenea ignorat,
deoarece acesta poate schimba c
1
i c
2
doar cu un factor constant.
Pentru a exemplica, s considerm o funcie ptratic oarecare f(n) = an
2
+ 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) = (n
2
). Pentru a arta acelai lucru n mod formal, alegem
constantele c
1
= a/4, c
2
= 7a/4 i n
0
= 2 max[b[/a,

[c[/a. Cititorul poate arta c 0


c
1
n
2
an
2
+ bn + c c
2
n
2
pentru orice n n
0
. n general, pentru orice polinom p(n) =

d
i=0
a
i
x
i
, unde a
i
sunt constante i a
d
> 0, avem p(n) = (n
d
). (vezi problema 2-1)
Deoarece orice constant este un polinom de gradul 0, putem expima orice funcie constant
ca (n
0
) sau (1). Aceast ultim notaie este un mic abuz deoarece nu este clar care variabil
tinde la innit.
1
Vom folosi des notaia (1) nelegnd prin aceasta e o constant, e 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)),
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 specicai: funcia n
2
poate scris ca n n
2
sau chiar
r r
2
. 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
O(g(n)) = f(n) : exist constantele pozitive c i n
0
astfel nct
0 f(n) cg(n) pentru orice n n
0
.
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 aat n spatele O-notaiei. Pentru toate valorile
lui n aate la dreapta lui n
0
, 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 an
2
+bn+c, unde a > 0, n (n
2
), arat
de asemenea c orice funcie ptratic este n O(n
2
). Ceea ce poate prea i mai surprinztor
este c orice funcie an + b este n O(n
2
), ceea ce se veric uor, lund c = a + [b[ i
n
0
= 1.
Unor cititori, care s-au mai ntlnit cu notaii de tipul O, ar putea s li se par ciudat c
scriem n = O(n
2
). n literatur, O-notaia este folosit uneori informal pentru a descrie margini
asimptotice strnse, adic ceea ce am denit utiliznd -notaia. n aceast carte, totui, atunci
cnd scriem f(n) = O(g(n)), armm, 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(n
2
) 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 ecare dintre cele n
2
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(n
2
) 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 (n
2
) a timpului de execuie
n cazul cel mai defavorabil al sortrii prin inserie, totui, nu implic o delimitare (n
2
) asupra
timpului de execuie al sortrii prin inserie pentru 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(n
2
) 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(n
2
) este c timpul de execuie n
cazul cel mai defavorabil (care este o funcie de n) este O(n
2
), sau, echivalent, oricare ar datele
de intrare de dimensiune n, pentru ecare valoare a lui n, timpul de execuie pentru acest set
de date de intrare este O(n
2
).
24 Capitolul 2 Creterea funciilor
-notaia
La fel cum O-notaia furnizeaz o delimitare asimptotic pentru o funcie, -
notaia furnizeaz o delimitare asimptotic inferioar. Pentru o funcie dat g(n), vom
nota cu (g(n)), mulimea
(g(n)) = f(n) : exist constantele pozitive c i n
0
astfel nct
0 cg(n) f(n) pentru orice n n
0

Imaginea intuitiv n spatele -notaiei este artat n gura 2.1(c). Pentru toate valorile n aate
la dreapta lui n
0
, f(n) este mai mare sau egal cu cg(n).
Din deniiile 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)).
Ca un exemplu de aplicare a acestei teoreme, faptul c an
2
+bn+c = (n
2
) implic imediat
an
2
+bn+c = O(n
2
) i an
2
+bn+c = (n
2
). n practic, n loc s utilizm teorema 2.1 pentru a
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 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 a prin urmare ntre O(n) i (n
2
) 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 (n
2
) deoarece acesta este (n) n cazul datelor de intrare deja sortate. Nu este
contradictoriu s spunem totui c acest timp de execuie este (n
2
)
deoarece exist cel puin un tip de date de intrare care impun algoritmului un timp de execuie
(n
2
). Atunci cnd spunem c al unui algoritm este (g(n)), nelegem c
n
n, timpul de execuie pe acel set de date de intrare este cel puin o constant nmulit cu
g(n), pentru n sucient de mare.
Notaia asimptotic n ecuaii
Am vzut deja cum poate utilizat o notaie asimptotic n formulele matematice. De
exemplu, la introducerea O-notaiei, am scris n = O(n
2
). Am putea scrie, de asemenea 2n
2
+
3n + 1 = 2n
2
+ (n). Cum interpretm astfel de formule?
Atunci cnd o notaie asimptotic se a singur n membrul drept al unei ecuaii, ca n n =
O(n
2
), deja am denit semnul de egalitate ca reprezentnd apartenena din teoria mulimilor:
n O(n
2
). n general, totui, cnd notaia asimptotic apare ntr-o relaie, o vom interpreta
2.1. Notaia asimptotic 25
ca reprezentnd o funcie anonim pe care nu ne obosim s o numim. De exemplu, egalitatea
2n
2
+3n+1 = 2n
2
+(n) nseamn de fapt 2n
2
+3n+1 = 2n
2
+f(n), unde f(n) este o funcie
oarecare din mulimea (n). n acest caz, f(n) = 3n + 1, care este ntr-adevr n (n).
Folosirea notaiilor asimptotice n aceste situaii poate ajuta la eliminarea unor detalii inutile
dintr-o ecuaie. De exemplu, n capitolul 1, am exprimat timpul de execuie n cazul cel mai
defavorabil la sortarea prin interclasare prin relaia de recuren
T(n) = 2 T(n/2) + (n)
Dac suntem interesai doar de comportarea asimptotic a lui T(n), nu are nici un rost s
specicm exact toi termenii de ordin inferior: acetia sunt toi presupui a inclui n funcia
anonim notat prin termenul (n).
Numrul funciilor "anonime" ntr-o expresie este neles ca ind egal cu numrul notaiilor
asimptotice care apar n aceast expresie. De exemplu, n expresia
n

i=1
O(i)
exist o singur funcie anonim (o funcie de i). Aceast expresie 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
2n
2
+ (n) = (n
2
).
Vom interpreta astfel de ecuaii utiliznd urmtoarea regul:
Astfel, sensul exemplului
nostru este acela c pentru funcie f(n) (n), exist funcie g(n) (n
2
)
astfel nct 2n
2
+ 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 nlnuite ca n
2n
2
+ 3n + 1 = 2n
2
+ (n) = (n
2
)
Putem interpreta ecare ecuaie separat dup regula de mai sus. Prima ecuaie spune c exist o
funcie f(n) (n) astfel nct 2n
2
+3n+1 = 2n
2
+f(n) pentru orice n. A doua ecuaie spune
c pentru funcie g(n) (n) (aa cum este f(n)), exist o funcie h(n) (n
2
)
astfel nct 2n
2
+ g(n) = h(n) pentru orice n. S observm c aceast interpretare implic
2n
2
+3n +1 = (n
2
), 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 denit anterior poate sau nu s e o
delimitare asimptotic strns. Astfel, relaia 2n
2
= O(n
2
), este o delimitare asimptotic strns
pe cnd 2n = O(n
2
) nu este. Vom utiliza n cele ce urmeaz o-notaia pentru a desemna o
delimitare superioar care nu este asimptotic strns. Formal, vom deni o(g(n)) (o mic de g
de n) ca ind mulimea
o(g(n)) = f(n) : pentru orice constant pozitiv c > 0 exist o constant
n
0
> 0 astfel nct 0 f(n) < cg(n) pentru orice n n
0
.
26 Capitolul 2 Creterea funciilor
De exemplu, 2n = o(n
2
), dar 2n
2
= o(n
2
).
Deniiile pentru O-notaie i o-notaie sunt similare. Principala diferen este aceea c n
f(n) = O(g(n)), delimitarea 0 f(n) c g(n) are loc pentru o constant c > 0, dar,
n f(n) = o(g(n)), delimitarea 0 f(n) < c g(n) are loc pentru constantele c > 0. Intuitiv,
n cazul o-notaiei, funcia f(n) devine neglijabil relativ la g(n) atunci cnd n tinde la innit;
cu alte cuvinte
lim
n
f(n)
g(n)
= 0. (2.1)
Unii autori folosesc aceast limit ca o deniie pentru o-notaie: deniia din aceast carte
impune, de asemenea, funciilor anonime s e asimptotic nenegative.
-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 deni este
f(n) (g(n)) dac i numai dac g(n) o(f(n)).
Formal, totui, denim (g(n)) ("omega mic de g de n") ca ind mulimea
(g(n)) = f(n) : pentru orice constant pozitiv c > 0 exist o constant
n
0
> 0 astfel nct 0 cg(n) < f(n) pentru orice n n
0
.
De exemplu, n
2
/2 = (n), dar n
2
/2 = (n). Relaia f(n) = (g(n)) implic
lim
n
f(n)
g(n)
= ,
dac limita exist. Cu alte cuvinte, f(n) devine orict de mare relativ la g(n) atunci cnd n
tinde la innit.
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)).
Reexivitatea:
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.
O proprietate a numerelor reale, totui, nu se transpune la notaii asimptotice:
Trihotomia: Pentru orice dou numere reale a i b exact una dintre urmtoarele relaii este
adevrat: a < b, a = b sau a > b.
Dei orice dou numere reale pot comparate, nu toate funciile sunt asimptotic comparabile.
Cu alte cuvinte, pentru dou funcii f(n) i g(n), se poate ntmpla s nu aib loc nici f(n) =
O(g(n)), nici f(n) = (g(n)). De exemplu, funciile n i n
1+sin n
nu pot comparate utiliznd
notaii asimptotice, deoarece valoarea exponentului n n
1+sin n
oscileaz ntre 0 i 2, lund toate
valorile intermediare.
Exerciii
2.1-1 Fie f(n) i g(n) funcii asimptotic nenegative. Utiliznd deniia de baz a -notaiei,
demonstrai c max(f(n), g(n)) = (f(n) +g(n)).
2.1-2 Demonstrai c pentru orice constante reale a i b, unde b > 0, avem
(n +a)
b
= (n
b
). (2.2)
2.1-3 Explicai de ce armaia Timpul de execuie al algoritmului A este cel puin O(n
2
) este
lipsit de coninut.
2.1-4 Este adevrat c 2
n+1
= O(2
n
)? Este adevrat c 2
2n
= O(2
n
)?
2.1-5 Demonstrai teorema 2.1.
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-7 Demonstrai c o(g(n)) (g(n)) este mulimea vid.
28 Capitolul 2 Creterea funciilor
2.1-8 Putem extinde notaia noastr la cazul a doi parametri n i m care tind la innit n mod
independent, cu viteze diferite. Peentru o funcie dat g(n, m) notm cu O(g(n, m)) mulimea
de funcii
O(g(n, m)) = f(n, m) : exist constantele pozitive c, n
0
i m
0
astfel nct
0 f(n, m) cg(n, m) pentru orice n n
0
i m m
0
.
Dai deniiile corespunztoare pentru (g(n, m)) i (g(n, m)).
2.2. Notaii standard i funcii comune
Aceast seciune trece n revist cteva funcii i notaii matematice standard i exploreaz
relaiile dintre ele. Ea ilustreaz, de asemenea, utilizarea notaiilor asimptotice.
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).
Pri ntregi inferioare i superioare
Pentru orice numr real x, notm cel mai mare ntreg mai mic sau egal cu x prin x| (se
citete partea ntreag inferioar a lui x) i cel mai mic ntreg mai mare sau egal cu x prin x|
(se citete partea ntreag superioar a lui x). Pentru orice x real,
x 1 < x| x x| < x + 1.
Pentru orice ntreg n,
n/2| +n/2| = n,
iar pentru orice ntreg n i orice ntregi a = 0 i b > 0,
n/a|/b| = n/ab| (2.3)
i
n/a|/b| = n/ab|. (2.4)
Funciile parte ntreag inferioar i superioar sunt monoton cresctoare.
2.2. Notaii standard i funcii comune 29
Polinoame
Fiind dat un ntreg pozitiv d, un polinom n n de gradul d este o funcie p(n) de forma
p(n) =
d

i=0
a
i
n
i
,
unde constantele a
0
, a
1,
. . . a
d
sunt coecienii polinomului, iar a
d
= 0. Un polinom este
dac i numai dac a
d
> 0. Pentru un polinom asimptotic pozitiv p(n) de grad
d avem p(n) = (n
d
). Pentru orice constant real a 0, funcia n
a
este monoton cresctoare,
iar pentru orice constant real a 0 funcia n
a
este monoton descresctoare. Spunem c o
funcie f(n) este polinomial mrginit dac f(n) = n
O(1)
, ceea ce este echivalent cu a spune
c f(n) = O(n
k
) pentru o anumit constant k (vezi exerciiul 2.2-2).
Exponeniale
Pentru orice a = 0, m i n reale avem urmtoarele identiti:
a
0
= 1,
a
1
= a,
a
1
= 1/a,
(a
m
)
n
= a
mn
,
(a
m
)
n
= (a
n
)
m
,
a
m
a
n
= a
m+n
.
Pentru orice n i a 1, funcia a
n
este monoton cresctoare n n. Cnd ne va conveni, vom
presupune c 0
0
= 1.
Ratele de cretere ale polinoamelor i exponenialelor pot legate prin urmtorul fapt. Pentru
orice constante a i b astfel nct a > 1,
lim
n
n
b
a
n
= 0, (2.5)
din care putem trage concluzia c
n
b
= o(a
n
).
Astfel, orice funcie exponenial avnd baza strict mai mare dect 1 crete mai repede dect
orice funcie polinomial.
Utiliznd e pentru a nota 2.71828 . . ., baza funciei logaritm natural, avem, pentru orice x
real,
e
x
= 1 +x +
x
2
2!
+
x
3
3!
+ =

i=0
x
i
i!
, (2.6)
unde ! desemneaz funcia factorial denit mai trziu n aceast seciune. Pentru orice x real
avem inegalitatea
e
x
1 +x, (2.7)
30 Capitolul 2 Creterea funciilor
unde egalitatea are loc numai pentru x = 0. Cnd [x[ 1, avem aproximaia
1 +x e
x
1 +x +x
2
. (2.8)
Cnd x 0, aproximaia lui e
x
prin 1 +x este destul de bun:
e
x
= 1 +x + (x
2
).
(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,
lim
n

1 +
x
n

n
= e
x
.
Logaritmi
Vom utiliza urmtoarele notaii:
lg n = log
2
n (logaritm binar),
lnn = log
e
n (logaritm natural),
lg
k
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
, astfel c lg n +k va nsemna (lg n) +k i
nu lg(n +k). Pentru n > 0 i b > 1, funcia log
b
n este strict cresctoare.
Pentru orice numere reale a > 0, b > 0, c > 0 i n,
a = b
log
b
a
,
log
c
(ab) = log
c
a + log
c
b,
log
b
a
n
= nlog
b
a,
log
b
a =
log
c
a
log
c
b
,
log
b
(1/a) = log
b
a,
log
b
a =
1
log
a
b
,
a
log
b
n
= n
log
b
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 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:
ln(1 +x) = x
x
2
2
+
x
3
3

x
4
4
+
x
5
5

Avem, de asemenea, urmtoarele inegaliti pentru x > 1:
x
1 +x
ln(1 +x) x, (2.10)
2.2. Notaii standard i funcii comune 31
unde egalitatea are loc numai pentru x = 0.
Spunem c o funcie f(n) este polilogaritmic mrginit dac f(n) = lg
O(1)
n. Putem lega
creterile polinoamelor i polilogaritmilor nlocuind pe n cu lg n i pe a cu 2
a
n ecuaia (2.5),
obinnd
lim
n
lg
b
n
(2
a
)
lg n
= lim
n
lg
b
n
n
a
= 0.
Din aceast limit, putem conchide c
lg
b
n = o(n
a
)
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 denit pentru numere ntregi n 0 prin
n! =

1 dac n = 0,
n (n 1)! dac n > 0.
Astfel, n! = 1 2 3 n.
O margine superioar slab a funciei factorial este n! n
n
, deoarece ecare dintre cei n
factori ai produsului factorial este cel mult n. Aproximaia lui Stirling,
n! =

2n

n
e

1 +

1
n

, (2.11)
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(n
n
),
n! = (2
n
),
lg(n!) = (nlg n).
Urmtoarele delimitri sunt, de asemenea, valabile pentru orice n:

2n

n
e

n
n!

2n

n
e

ne
1/12n
(2.12)
Funcia logaritm iterat
Utilizm notaia lg

n (se citete logaritm stea de n) pentru a nota logaritmul iterat, care


este denit dup cum urmeaz. Fie funcia lg
(i)
n denit recursiv pentru ntregii nenegativi i
prin
lg
(i)
n =

n dac i = 0,
lg(lg
(i1)
n) dac i > 0 i lg
(i1)
n > 0,
nedenit dac i > 0 i lg
(i1)
n 0 sau lg
(i1)
n este nedenit.
32 Capitolul 2 Creterea funciilor
Calculai diferena ntre funcia lg
(i)
n (funcia logaritm aplicat succesiv de i ori, ncepnd cu
argumentul n) i lg
i
n (logaritmul lui n ridicat la puterea i). Funcia logaritm iterat este denit
prin
lg

n = min

i 0 : lg
(i)
n 1

.
Funcia logaritm iterat este o funcie lent cresctoare:
lg

2 = 1,
lg

4 = 2,
lg

16 = 3,
lg

65536 = 4,
lg

(2
65536
) = 5.
Deoarece numrul atomilor din universul observabil este estimat la aproximativ 10
80
, care este
mult mai mic dect 2
65536
, rareori ntlnim o valoare a lui n astfel nct lg

n > 5.
Numere Fibonacci
Numerele Fibonacci sunt denite prin urmtoarea recuren:
F
0
= 0, F
1
= 1, F
i
= F
i1
+F
i2
pentru i 2. (2.13)
Astfel, ecare numr Fibonacci este suma celor dou numere Fibonacci anterioare, rezultnd
secvena
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . . . .
Numerele Fibonacci sunt legate de raportul de aur i de conjugatul su

, care sunt date de
urmtoarele formule:
=
1 +

5
2
= 1.61803 . . . ,

=
1

5
2
= .61803 . . . . (2.14)
Mai precis, avem
F
i
=

i

5
, (2.15)
ceea ce se poate demonstra prin inducie (exerciiul 2.2-7). Deoarece [

[ < 1, avem [

i
[/

5 <
1/

5 < 1/2, astfel c cel de-al i-lea numr Fibonacci este egal cu
i
/

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 deniia O-notaiei pentru a arta c T(n) = n
O(1)
dac i numai dac exist o
constant k > 0 astfel nct T(n) = O(n
k
).
2.2-3 Demonstrai ecuaia (2.9).
2.2-4 Demonstrai c lg(n!) = (nlg n) i c n! = o(n
n
).
2.2-5 Este funcia lg n|! polinomial mrginit? Este funcia lg lg n|! 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 veric egalitatea F
i
=
(
i

i
)/

5, unde este raportul de aur iar



este conjugatul su.
2.2-8 Demonstrai c pentru i 0 cel de-al (i + 2)-lea numr Fibonacci veric F
i+2

i
.
Probleme
2-1 Comportamentul asimptotic al polinoamelor
Fie
p(n) =
d

i=0
a
i
p
i
,
unde a
d
> 0 un polinom de gradul d n n i e k o constant. Utilizai proprietile notaiilor
asimptotice pentru a demonstra urmtoarele proprieti.
a. Dac k d, atunci p(n) = O(n
k
).
b. Dac k d, atunci p(n) = (n
k
).
c. Dac k = d, atunci p(n) = (n
k
).
d. Dac k > d, atunci p(n) = o(n
k
).
e. Dac k < d, atunci p(n) = (n
k
).
2-2 Creteri asimptotice relative
Indicai, pentru ecare pereche de expresii (A, B) din tabelul urmtor, dac A este O, o, ,
sau de B. Presupunei c k 1, > 0 i c > 1 sunt constante. Rspunsul trebuie s e sub
forma unui tabel, cu da sau nu scrise n ecare rubric.
A B O o
a. lg
k
n n

b. n
k
c
n
c.

n n
sin n
d. 2
n
2
n/2
e. n
lg m
m
lg n
f. lg(n!) lg(n
n
)
34 Capitolul 2 Creterea funciilor
2-3 Ordonarea dup ratele de cretere asimptotic
a. Ordonai urmtoarele funcii dup ordinea de cretere; mai precis, gsii un aranjament de
funcii g
1
, g
2
, . . . g
30
care s verice g
1
= (g
2
), g
2
= (g
3
), . . . , g
29
= (g
30
). Partiionai
lista n clase de echivalen astfel nct f(n) i g(n) s e n aceeai clas de echivalen
dac i numai dac f(n) = (g(n)).
lg(lg

n) 2
lg

n
(

2)
lg n
n
2
n! (lg n)!

3
2

n
n
3
lg
2
n lg(n!) 2
2
n
n
1/ lg n
lnln n lg

n n 2
n
n
lg lg n
lnn 1
2
lg n
(lg n)
lg n
e
n
4
lg n
(n + 1)!

lg n
lg

(lg n) 2

2 lg n
n 2
n
nlg n 2
2
n+1
b. Dai un exemplu de o singur funcie nenegativ f(n) astfel nct pentru toate funciile
g
i
(n) de la punctul (a), f(n) s nu e nici O(g
i
(n)) nici (g
i
(n)).
2-4 Proprieti ale notaiilor asimptotice
Fie f(n) i g(n) funcii asimptotic pozitive. Demonstrai urmtoarele conjecturi sau demonstrai
c ele nu sunt adevrate.
a. f(n) = O(g(n) implic g(n) = O(f(n).
b. f(n) +g(n) = (min(f(n), g(n))).
c. f(n) = O(g(n)) implic lg(f(n)) = O(lg(g(n))), unde lg(g(n)) > 0 i f(n) 1 pentru orice
n sucient de mare.
d. f(n) = O(g(n)) implic 2
f(n)
= O(2
g(n)
).
e. f(n) = O((f(n))
2
).
f. f(n) = O(g(n)) implic g(n) = (f(n)).
g. f(n) = (f(n/2)).
h. f(n) +o(f(n)) = (f(n)).
2-5 Variaii ale lui O i
Unii autori denesc ntr-un mod uor diferit de al nostru; s utilizm

(se citete omega
innit) pentru aceast deniie alternativ. Spunem c f(n) =

(g(n)) dac exist o constant


pozitiv c astfel nct f(n) cg(n) 0 pentru innit de muli n.
a. Artai c pentru oricare dou funcii f(n) i g(n) care sunt asimptotic nenegative, e
f(n) = O(g(n)), e f(n) =

(g(n)) e amndou, n timp ce aceast armaie nu este


adevrat dac utilizm n loc de

.
b. Descriei avantajele i dezavantajele poteniale ale utilizrii lui

n locul lui pentru a
descrie timpii de execuie ai programelor.
Note bibliograce 35
Unii autori l denesc i pe O ntr-un mod uor diferit; s utilizm O
t
pentru deniia alternativ.
Spunem c f(n) = O
t
(g(n)) dac i numai dac [f(n)[ = O(g(n)).
c. Ce se ntmpl cu ecare dintre direciile lui dac i numai dac din teorema 2.1 cu
aceast nou deniie?
Unii autori denesc

O (se citete o moale) ca nsemnnd O cu factorii logaritmici ignorai:

O(g(n)) = f(n) : exist constantele pozitive, c, k i n


0
astfel nct
0 f(n) cg(n) lg
k
(n) pentru orice n n
0
.
d. Denii

i

ntr-un mod analog. Demonstrai proprietatea analog corespunztoare
teoremei 2.1.
2-6 Funcii iterate
Operatorul de iteraie

utilizat n funcia lg

poate aplicat funciilor monoton cresctoare


pe mulimea numerelor reale. Pentru o funcie f care satisface f(n) < n denim funcia f
(i)
recursiv pentru numerele ntregi i nenegative prin
f
(i)
(n) =

f(f(
(i1)
(n)) dac i > 0,
n dac i = 0.
Pentru o constant dat c R, denim funcia iterat f

c
prin
f

c
(n) = mini 0 : f
(i)
(n) c,
care nu trebuie s e bine-denit n toate cazurile. Cu alte cuvinte, cantitatea f

c
(n) este numrul
de aplicaii iterate ale funciei f necesare pentru a reduce argumentul la c sau la mai puin.
Pentru ecare dintre urmtoarele funcii f(n) i constantele c, dai o evaluare ct se poate
de strns a lui f

c
(n).
f(n) c f

c
(n)
a. lg n 1
b. n 1 0
c. n/2 1
d. n/2 2
e.

n 2
f.

n 1
g. n
1/3
2
h. n/ lg n 2
Note bibliograce
Knuth [121] investigheaz originea O-notaiei i arm 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
gsit n Knuth [121, 124] i Brassard i Bratley [33].
Nu toi autorii denesc notaiile asimptotice n acelai mod, dei diferitele deniii concord
n cele mai comune situaii. Unele dintre deniiile 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 gsite n orice carte de referin
de matematic, cum ar Abramowitz i Stegun [1] sau Beyer [27], sau ntr-o carte de analiz,
cum ar 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 un ciclu ct timp sau
pentru, timpul su de execuie poate exprimat ca suma timpilor necesari la ecare 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
ecare iteraie, am obinut o sum (sau serie)
n

j=2
j.
Evaluarea sumei a dat o margine (n
2
) 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 gsite n orice manual de
analiz.
3.1. Formule de nsumare i proprieti
Fiind dat un ir de numere a
1
, a
2
, . . ., suma nit a
1
+a
2
+. . . +a
n
poate scris
n

k=1
a
k
.
Dac n = 0, valoarea sumei este denit ca ind 0. Dac n nu este un numr ntreg, mai
presupunem c limita superioar este n|. Analog, dac suma ncepe cu k = x, unde x nu este
un ntreg, presupunem c valoarea iniial pentru nsumare este x|. (n general, vom scrie n
mod explicit prile ntregi inferioare sau superioare). Valoarea unei serii nite este ntotdeauna
bine denit, iar termenii si pot adunai n orice ordine.
Fiind dat un ir de numere a
1
, a
2
, . . ., suma innit a
1
+a
2
+. . . poate scris

k=1
a
k
,
care este interpretat ca
lim
n
n

k=1
a
k
.
Dac limita nu exist, seria diverge; altfel, ea converge. Termenii unei serii convergente nu
pot ntotdeauna adunai n orice ordine. Putem rearanja, totui, termenii unei serii absolut
convergente, care este o serie

k=1
a
k
pentru care seria

k=1
[a
k
[ converge de asemenea.
38 Capitolul 3 Sume
Liniaritate
Pentru orice numr real c i orice iruri nite a
1
, a
2
, . . . , a
n
i b
1
, b
2
, . . . , b
n
n

k=1
(ca
k
+b
k
) = c
n

k=1
a
k
+
n

k=1
b
k
.
Proprietatea de liniaritate este vericat, de asemenea, i de seriile innite convergente.
Proprietatea de liniaritate poate exploatat pentru a manipula sumele care ncorporeaz
notaii asimptotice. De exemplu,
n

k=1
(f(k)) =

k=1
f(k)

.
n aceast ecuaie, -notaia din membrul stng se aplic variabilei k, dar n membrul drept ea
se aplic lui n. Astfel de manipulri pot aplicate i seriilor innite convergente.
Serii aritmetice
Suma
n

k=1
k = 1 + 2 +. . . +n,
care a aprut cnd am analizat sortarea prin inserie, este o serie aritmetic i are valoarea
n

k=1
k =
1
2
n(n + 1) (3.1)
= (n
2
) (3.2)
Serii geometrice
Pentru orice x = 1 real, suma
n

k=0
x
k
= 1 +x +x
2
+. . . +x
n
este o serie geometric sau exponenial i are valoarea
n

k=0
x
k
=
x
n+1
1
x 1
. (3.3)
Cnd suma este innit i [x[ < 1 avem seria geometric innit descresctoare

k=0
x
k
=
1
1 x
. (3.4)
3.1. Formule de nsumare i proprieti 39
Serii armonice
Pentru ntregi pozitivi n, al n-lea numr armonic este
H
n
= 1 +
1
2
+
1
3
+
1
4
+. . . +
1
n
=
n

k=1
1
k
= lnn +O(1). (3.5)
Integrarea i diferenierea seriilor
Se pot obine formule suplimentare prin integrarea sau diferenierea formulelor de mai sus. De
exemplu, difereniind ambii membri ai seriei geometrice innite (3.4) i nmulind cu x, obinem

k=0
kx
k
=
x
(1 x)
2
(3.6)
Serii telescopante
Pentru orice ir a
0
, a
1
, . . . , a
n
n

k=1
(a
k
a
k1
) = a
n
a
0
(3.7)
deoarece ecare dintre termenii a
1
, a
2
, . . . , a
n1
este adunat exact o dat i sczut exact o dat.
Spunem c suma telescopeaz. Analog,
n1

k=0
(a
k
a
k+1
) = a
0
a
n
.
Ca un exemplu de sum telescopant, s considerm seria
n1

k=1
1
k(k + 1)
.
Deoarece putem rescrie ecare termen ca
1
k(k + 1)
=
1
k

1
k + 1
,
obinem
n1

k=1
1
k(k + 1)
=
n1

k=1

1
k

1
k + 1

= 1
1
n
.
40 Capitolul 3 Sume
Produse
Produsul nit a
1
a
2
a
n
poate scris
n

k=1
a
k
.
Dac n = 0, valoarea produsului este denit ca ind 1. Putem converti o formul cu un produs
ntr-o formul cu o sum, utiliznd identitatea
lg

k=1
a
k

=
n

k=1
lg a
k
.
Exerciii
3.1-1 Gsii o formul simpl pentru

n
k=1
(2k 1).
3.1-2 Artai c

n
k=1
1/(2k 1) = ln(

n) +O(1) manipulnd seria armonic.


3.1-3 Artai c

k=0
(k 1)/2
k
= 0.
3.1-4 Evaluai suma

k=1
(2k + 1)x
2k
.
3.1-5 Utilizai proprietatea de liniaritate a nsumrii pentru a demonstra c

n
k=1
O(f
k
(n)) =
O(

n
k=1
f
k
(n)).
3.1-6 Demonstrai c

k=1
(f(k)) = (

k=1
f(k)).
3.1-7 Evaluai produsul

n
k=1
2 4
k
.
3.1-8 Evaluai produsul

n
k=2
(1 1/k
2
).
3.2. Delimitarea sumelor
Exist multe tehnici disponibile pentru delimitarea sumelor care descriu timpii de execuie
ai algoritmilor. Iat cteva dintre metodele cel mai frecvent utilizate.
Inducia matematic
Cea mai simpl cale de a evalua o serie este utilizarea induciei matematice. De exemplu,
s demonstrm c seria aritmetic

n
k=1
k are valoarea
1
2
n(n + 1). Putem verica 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

k=1
k =
n

k=1
k + (n + 1) =
1
2
n(n + 1) + (n + 1) =
1
2
(n + 1)(n + 2).
3.2. Delimitarea sumelor 41
Nu trebuie s ghicim valoarea exact a unei sume pentru a utiliza inducia matematic.
Inducia poate utilizat i pentru a demonstra o delimitare. De exemplu, s demonstrm c
seria geometric

n
k=0
3
k
este O(3
n
). Mai precis, s demonstrm c

n
k=0
3
k
c 3
n
pentru o
anumit constant c. Pentru condiia iniial n = 0 avem

0
k=0
3
k
= 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

k=0
3
k
=
n

k=0
3
k
+ 3
n+1
c 3
n
+ 3
n+1
=

1
3
+
1
c

c 3
n+1
c 3
n+1
ct timp (1/3 + 1/c) 1 sau, echivalent, c 3/2. Astfel,

n
k=0
3
k
= O(3
n
), ceea ce am dorit s
artm.
Trebuie s m prudeni cnd utilizm notaii asimptotice pentru a demonstra delimitri prin
inducie. Considerm urmtoarea demonstraie vicioas a faptului c

n
k=1
k = O(n). Desigur,

1
k=1
k = O(1). Acceptnd delimitarea pentru n, o demonstrm acum pentru n + 1:
n+1

k=1
k =
n

k=1
k + (n + 1)
= O(n) + (n + 1) =
= O(n + 1).
Greeala n argumentaie este aceea c O ascunde o constant care crete n funcie de n
i deci nu este constant. Nu am artat c aceeai constant e valabil pentru n.
Delimitarea termenilor
Uneori, o limit superioar bun a unei serii se poate obine delimitnd ecare termen al
seriei, i este, de multe ori, sucient 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

k=1
k
n

k=1
n = n
2
.
n general, pentru o serie

n
k=1
a
k
, dac punem a
max
= max
1kn
a
k
, atunci
n

k=1
a
k
na
max
.
Tehnica delimitrii ecrui termen dintr-o serie prin cel mai mare termen este o metod slab
cnd seria poate , n fapt, delimitat printr-o serie geometric. Fiind dat seria

n
k=0
a
k
, s
presupunem c a
k+1
/a
k
r pentru orice k 0, unde r < 1 este o constant. Suma poate
delimitat printr-o serie geometric descresctoare innit, deoarece a
k
a
0
r
k
, i astfel,
n

k=0
a
k

k=0
a
0
r
k
= a
0

k=0
r
k
= a
0
1
1 r
.
42 Capitolul 3 Sume
Putem aplica aceast metod pentru a delimita suma

k=1
(k/3
k
). Primul termen este 1/3,
iar raportul termenilor consecutivi este
(k + 1)/3
k+1
k/3
k
=
1
3

k + 1
k

2
3
,
pentru toi k 1. Astfel, ecare termen este mrginit superior de (1/3)(2/3)
k
, astfel nct

k=1
k
3
k

k=1
1
3

2
3

k
=
1
3

1
1 2/3
= 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 innit, care diverge, deoarece

k=1
1
k
= lim
n
n

k=1
1
k
= lim
n
(lg n) = .
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 , 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 dicil se pot obine exprimnd seria ca o sum de dou sau mai
multe serii, partiionnd domeniul indicelui i apoi delimitnd ecare dintre seriile rezultate.
De exemplu, s presupunem c ncercm s gsim o limit inferioar pentru seria aritmetic

n
k=1
k, despre care s-a artat deja c are limita superioar n
2
. Am putea ncerca s minorm
ecare 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, n
2
.
Putem obine o limit inferioar mai bun, partiionnd nti suma. S presupunem, pentru
comoditate, c n este par. Avem
n

k=1
k =
n/2

k=1
k +
n

k=n/2+1
k
n/2

k=1
0 +
n

k=n/2+1
(n/2) (n/2)
2
= (n
2
)
care este o limit asimptotic strns, deoarece

n
k=1
k = O(n
2
).
Pentru o sum care apare din analiza unui algoritm, putem partiiona adesea suma i ignora
un numr constant de termeni iniiali. n general, aceast tehnic se aplic atunci cnd ecare
termen a
k
din suma

n
k=0
a
k
este independent de n. Atunci pentru orice k
0
> 0 constant putem
scrie
n

k=0
a
k
=
k
0
1

k=0
a
k
+
n

k=k
0
a
k
= (1) +
n

k=k
0
a
k
,
3.2. Delimitarea sumelor 43
deoarece termenii iniiali ai sumei sunt toi constani i numrul lor este constant. Apoi, putem
utiliza alte metode pentru a delimita

n
k=k
0
a
k
. De exemplu, pentru a gsi o limit superioar
asimptotic pentru

k=0
k
2
2
k
,
observm c raportul termenilor consecutivi este
(k + 1)
2
/2
k+1
k
2
/2
k
=
(k + 1)
2
2k
2

8
9
,
dac k 3. Astfel, suma poate partiionat n

k=0
k
2
2
k
=
2

k=0
k
2
2
k
+

k=3
k
2
2
k
O(1) +
9
8

k=0

8
9

k
= O(1),
deoarece a doua sum este o serie geometric descresctoare.
Tehnica partiionrii sumelor poate utilizat pentru a gsi delimitri asimptotice n situaii
mult mai dicile. De exemplu, putem obine o delimitare O(lg n) a seriei armonice (3.5)
H
n
=
n

k=1
1
k
.
Ideea este s partiionm domeniul de la 1 la n n lg n| pri i s delimitm superior
contribuia ecrei pri prin 1. Astfel,
n

k=1
1
k

|lg n|

i=0
2
i
1

j=0
1
2
i
+j

|lg n|

i=0
2
i
1

j=0
1
2
i

|lg n|

i=0
1 lg n + 1. (3.8)
Aproximarea prin integrale
Cnd o sum poate exprimat ca

n
k=m
f(k), unde f(k) este o funcie monoton cresctoare,
o putem aproxima prin integrale:

n
m1
f(x)dx
n

k=m
f(k)

n+1
m
f(x)dx. (3.9)
Justicarea pentru aceast aproximare este artat n gura 3.1. Suma este reprezentat prin
aria dreptunghiurilor din gur, 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

n+1
m
f(x)dx
n

k=m
f(k)

n
m1
f(x)dx (3.10)
Aproximaia integral (3.10) d o estimare strns pentru al n-lea numr armonic. Pentru o
limit inferioar, obinem
n

k=1
1
k

n+1
1
dx
x
= ln(n + 1). (3.11)
44 Capitolul 3 Sume
Figura 3.1 Aproximarea lui

n
k=m
f(k) prin integrale. Aria ecrui dreptunghi este indicat n
interiorul dreptunghiului, iar aria tuturor dreptunghiurilor reprezint valoarea sumei. Integrala este
reprezentat prin aria haurat de sub curb. Comparnd ariile n (a), obinem

n
m1
f(x)dx

n
k=m
f(k), i apoi, deplasnd dreptunghiurile cu o unitate la dreapta, obinem

n
k=m
f(k)

n+1
m
f(x)dx din (b).
Pentru limita superioar, deducem inegalitatea
n

k=2
1
k

n
1
dx
x
= lnn,
care d limita
n

k=1
1
k
lnn + 1 (3.12)
Exerciii
3.2-1 Artai c

n
k=1
1/k
2
este mrginit superior de o constant.
Probleme 45
3.2-2 Gsii o margine superioar a sumei
|lg n|

k=0
n/2
k
|.
3.2-3 Artai c al n-lea numr armonic este (lg n), partiionnd suma.
3.2-4 Aproximai

n
k=1
k
3
printr-o integral.
3.2-5 De ce nu am utilizat aproximaia integral (3.10) direct pentru

n
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.
a.
n

k=1
k
r
.
b.
n

k=1
lg
s
k.
c.
n

k=1
k
r
lg
s
k.
Note bibliograce
Knuth [121] este o referin excelent pentru materialul prezentat n acest capitol. Proprieti
de baz ale seriilor pot gsite n orice carte bun de analiz, cum ar 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 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 descris prin recurena
T(n) =

(1) dac n = 1,
2T(n/2) + (n) dac n > 1,
(4.1)
a crei soluie s-a armat c este T(n) = (nlg 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 denit 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,
T(n) =

(1) dac n = 1,
T(n/2|) +T(n/2|) + (n) dac n > 1.
(4.2)
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 sucient de mic. n consecin, pentru comoditate, vom omite, n general, armaiile
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 modic, 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 arm 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.
4.1. Metoda substituiei
Metoda substituiei pentru rezolvarea recurenelor presupune intuirea formei soluiei i apoi
utilizarea induciei matematice pentru a gsi constantele i a arta cum funcioneaz soluia.
Numele provine din substituirea rspunsului intuit pentru funcii cnd ipoteza induciei se aplic
pentru valori mai mici. Metoda este puternic dar ea poate aplicat, n mod evident, numai
n cazurile n care este uor de intuit forma soluiei.
Metoda substituiei poate utilizat pentru a stabili e margini superioare, e margini infe-
rioare pentru o recuren. De exemplu, s determinm o limit superioar pentru recurena
T(n) = 2T(n/2|) +n (4.4)
care este similar cu recurenele (4.2) i (4.3). Intuim c soluia este T(n) = O(nlg n). Metoda
noastr const n a demonstra c T(n) cnlg n pentru o alegere corespunztoare a constantei
c > 0. ncepem prin a presupune c aceast delimitare este valabil pentru n/2|, adic
T(n/2|) cn/2| lg(n/2|). Substituind n recuren, se obine
T(n) 2(cn/2|) lg(n/2|)) +n cnlg(n/2) +n = cnlg n cnlg 2 +n
= cnlg n cn +n cnlg n,
unde ultimul pas este valabil ct timp c 1.
Inducia matematic ne cere acum s artm c soluia ndeplinete condiiile la limit.
Adic trebuie s artm c putem alege constanta c sucient de mare astfel nct delimitarea
T(n) cnlg n s funcioneze i pentru condiiile la limit. Aceast cerin conduce uneori la
probleme. S presupunem c T(1) = 1 este singura condiie la limit a recurenei. Atunci, din
nefericire, nu putem alege c sucient de mare, deoarece T(1) c1 lg 1 = 0.
Aceast dicultate n demonstrarea unei ipoteze de inducie pentru o condiie la limit
precis poate depit cu uurin. Protm de faptul c notaia asimptotic ne cere doar s
demonstrm c T(n) > cnlg n pentru n n
0
unde n
0
este o constant. Ideea este s nlturm
din discuie condiia la limit dicil T(1) = 1 n demonstraia inductiv i s includem n = 2
i n = 3 ca parte a condiiilor la limit pentru demonstraie. Putem impune T(2) i T(3) ca i
condiii la limit pentru demonstraia inductiv, deoarece pentru n > 3, recurena nu se aplic
n mod direct lui T(1). Din recuren, deducem T(2) = 4 i T(3) = 5. Demonstraia inductiv c
T(n) cnlg n pentru o anumit constant c 1 poate completat acum, alegnd c sucient de
mare pentru ca T(2) c2 lg 2 i T(3) c3 lg 3. Dup cum se dovedete, orice alegere a lui c 2
este sucient. Pentru majoritatea recurenelor pe care le vom examina, extensia condiiilor la
limit pentru a face ipoteza de inducie s funcioneze pentru valori mici ale lui n este imediat.
48 Capitolul 4 Recurene
Realizarea unei aproximri bune
Din nefericire, nu exist o metod general de intuire a soluiilor corecte ale unei recurene.
Intuirea unei soluii necesit experien i, ocazional, creativitate. Din fericire, totui, exist o
anumit euristic care poate ajuta.
Dac o recuren este similar cu una pe care ai vzut-o deja, intuirea unei soluii similare
este rezonabil. Ca exemplu, s considerm recurena
T(n) = 2T(n/2|) + 17) +n,
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(n/2|) i T(n/2| + 17) nu e att de mare: ambele l taie pe n
aproximativ n dou. n consecin, intuim c T(n) = O(nlg n), relaie a crei corectitudine se
poate verica 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(n
2
). Apoi, putem cobor gradual limita superioar i ridica
limita inferioar pn cnd ajungem la soluia corect, asimptotic strns, T(n) = (nlg 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 sucient 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
T(n) = T(n/2|) +T(n/2|) + 1.
Intuim c soluia este O(n) i ncercm s artm c T(n) cn pentru o alegere
corespunztoare a constantei c. Substituind presupunerea noastr n recuren, obinem
T(n) cn/2| +cn/2| + 1 = cn + 1,
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(n
2
), care poate 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 dicultate 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
T(n) (cn/2| b) + (cn/2| b) + 1 = cn 2b + 1 cn b,
4.1. Metoda substituiei 49
ct timp b 1. Ca i mai nainte, constanta c trebuie s e aleas sucient 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(cn/2|) +n cn +n
= O(n), =
deoarece c este o constant. Eroarea este c nu am demonstrat forma exact a ipotezei de
inducie, adic faptul c T(n) cn.
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(

n|) + lg n,
care pare dicil. Putem simplica 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 e ntregi, cum e cazul cu

n. Redenumind m = lg n, obinem
T(2
m
) = 2T(2
m/2
) +m.
Putem redenumi acum S(m) = T(2
n
) pentru a obine nou recuren
S(m) = 2S(m/2) +m,
care e foarte asemntoare cu recurena (4.4) i are aceeai soluie: S(m) = O(mlg n). Revenind
de la S(m) la T(n), obinem T(n) = T(2
m
) = S(m) = O(mlg m) = O(lg nlg lg n).
Exerciii
4.1-1 Artai c soluia lui T(n) = T(n/2|) + 1 este O(lg n).
4.1-2 Artai c soluia lui T(n) = 2T(n/2|) + n este (nlg n). Concluzionai c soluia este
(nlg n).
4.1-3 Artai c fcnd o ipotez de inducie diferit, putem depi dicultatea 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 (nlg n) este soluia recurenei exacte (4.2) pentru procedura Sorteaz-
Prin-Interclasare.
4.1-5 Artai c soluia lui T(n) = 2T(n/2| + 17) +n este O(nlg n).
4.1-6 Rezolvai recurena T(n) = 2T (

n) + 1 fcnd o schimbare de variabile, indiferent dac


valorile sunt ntregi sau nu.
4.2. Metoda iteraiei
Metoda iterrii unei recurene nu ne cere s aproximm o soluie dar poate necesita mai
multe noiuni de algebr dect metoda substituiei. Ideea este s dezvoltm (iterm) recurena
i s o exprimm ca o sum de termeni care depind numai de n i de condiiile iniiale. Se pot
utiliza apoi tehnici de evaluare a sumelor pentru a gsi delimitri ale soluiei.
De exemplu, s considerm recurena
T(n) = 3T(n/4|) +n.
O iterm dup cum urmeaz:
T(n) = n + 3T(n/4|) = n + 3(n/4| + 3T(n/16|))
= n + 3(n/4| + 3(n/16| + 3T(n/64|)))
= n + 3n/4| + 9n/16| + 27T(n/64|),
unde n/4|/4| = n/16| i n/16|/4| = n/64| rezult din identitatea (2.4).
Ct de departe trebuie s iterm recurena pentru a ajunge la condiia limit? Cel de-al i-lea
termen din serie este 3
i
n/4
i
|. Iteraia ajunge la n = 1 cnd n/4
i
| = 1 sau, echivalent, cnd i
depete log
4
n.
Continund iterarea pn n acest punct i utiliznd delimitarea n/4
i
| n/4
i
, descoperim
c suma conine o serie geometric descresctoare:
T(n) n + 3n/4 + 9n/16 + 27n/64 +. . . + 3
log
4
n
(1)
n

i=0

3
4

i
+

n
log
3
4

= 4n +o(n) = O(n).
Aici, am utilizat identitatea (2.9) pentru a concluziona c 3
log
4
n
= n
log
4
3
i am utilizat faptul
c log
4
3 < 1 pentru a deduce c (n
log
4
3
) = o(n).
Metoda iteraiei duce de obicei la multe noiuni de algebr, iar asigurarea corectitudinii
calculelor poate 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 ecare
nivel al procesului de iteraie. Uneori, n procesul de iterare a unei recurene, putei intui soluia
fr a face toate calculele. Atunci iterarea poate 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 denit numai pe
puterile exacte ale unui numr. n exemplul nostru, dac am presupus c n = 4
k
pentru un
4.2. Metoda iteraiei 51
anumit ntreg k, funcia parte ntreag inferioar ar putut 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. Deniiile notaiei asimptotice pretind ca
delimitrile s e demonstrate pentru ntregii sucient 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
dicultate tehnic poate depit. Problema 4-5 ofer, de asemenea, condiii n care o analiz
pentru puterile exacte ale unui ntreg poate 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) +n
2
.
Pentru comoditate, presupunem c n este o putere exact a lui 2. Partea (a) a gurii arat
T(n), care n partea (b) a fost dezvoltat ntr-un arbore echivalent care reprezint recurena.
Termenul n
2
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 ecare dintre cele dou subnoduri de la al
doilea nivel al recurenei este (n/2)
2
. Continum dezvoltarea ecrui 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 ecare nivel al arborelui. Nivelul cel mai
nalt are valoarea total n
2
, nivelul al doilea are valoarea (n/2)
2
+(n/2)
2
= n
2
/2, al treilea nivel
are valoarea (n/4)
2
+ (n/4)
2
+ (n/4)
2
+ (n/4)
2
= n
2
/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 (n
2
).
Cu un alt exemplu, mai complicat, gura 4.2 arat arborele de recuren pentru
T(n) = T(n/3) +T(2n/3) +n.
(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 ecare
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 = log
3/2
n, nlimea arborelui este log
3/2
n. Astfel, soluia
recurenei este cel mult nlog
3/2
n = O(nlg n).
Exerciii
4.2-1 Determinai o limit superioar asimptotic bun pentru recurena T(n) = 3T(n/2|)+n
prin iteraie.
4.2-2 Argumentai c soluia recurenei T(n) = T(n/3) + T(2n/3) + n este (nlg n) fcnd
apel la un arbore de recuren.
52 Capitolul 4 Recurene
Figura 4.1 Construirea arborelui de recuren pentru T(n) = 2T(n/2) +n
2
. 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-3 Determinai arborele de recuren pentru T(n) = 4T(n/2|) + n i dai margini
asimptotice strnse pentru soluia sa.
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
Figura 4.2 Un arbore de recuren pentru T(n) = T(n/3) +T(2n/3) +n.
4.3. Metoda master
Metoda master furnizeaz o reet pentru rezolvarea recurenelor de forma
T(n) = aT(n/b) +f(n) (4.5)
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, ecare de dimensiune n/b, unde a i b sunt constante pozitive.
Cele a subprobleme sunt rezolvate recursiv, ecare 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 denit,
deoarece n/b ar putea s nu e un ntreg. nlocuirea ecruia dintre cei a termeni T(n/b) e cu
T(n/b|) e cu T(n/b|) 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, e f(n) o funcie i e T(n)
denit pe ntregii nenegativi prin recurena
T(n) = aT(n/b) +f(n)
unde interpretm n/b e ca n/b|, e ca n/b|. Atunci T(n) poate delimitat asimptotic dup
cum urmeaz.
1. Dac f(n) = O(n
log
b
a
) pentru o anumit constant > 0, atunci T(n) = (n
log
b
a
).
2. Dac f(n) = (n
log
b
a
), atunci T(n) = (n
log
b
a
lg n).
3. Dac f(n) = (n
log
b
a+
) pentru o anumit constant > 0, i dac af(n/b) cf(n)
pentru o anumit constant c < 1 i toi n sucient de mari, atunci T(n) = (f(n)).
nainte de a aplica teorema master la cteva exemple, s ne oprim puin ca s nelegem ce
spune. n ecare dintre cele trei cazuri, comparm funcia f(n) cu funcia n
log
b
a
. Intuitiv, soluia
recurenei este determinat de cea mai mare dintre cele dou funcii. Dac funcia n
log
b
a
este
mai mare, ca n cazul 1, atunci soluia este T(n) = (n
log
b
a
). Dac funcia f(n) este mai mare,
ca n cazul 3, atunci soluia este T(n) = (f(n)). Dac cele dou funcii sunt de acelai ordin de
mrime, ca n cazul 2, nmulim cu un factor logaritmic, iar soluia este T(n) = (n
log
b
a
lg n) =
(f(n) lg n).
Dincolo de aceast intuiie, exist nite detalii tehnice care trebuie nelese. n primul caz,
f(n) trebuie nu numai s e mai mic dect n
log
b
a
, trebuie s e mai mic. Adic f(n)
trebuie s e asimptotic mai mic dect n
log
b
a
cu un factor n

pentru o anumit constant > 0.


n al treilea caz, f(n) trebuie nu numai s e mai mare dect n
log
b
a
, trebuie s e polinomial
mai mare i, n plus, s verice condiia de regularitate af(n/b) cf(n). Aceast condiie este
satisfcut de majoritatea funciilor polinomial mrginite pe care le vom ntlni.
Este important de realizat c cele trei cazuri nu acoper toate posibilitile pentru f(n).
Exist un gol ntre cazurile 1 i 2 cnd f(n) este mai mic dect n
log
b
a
, dar nu polinomial mai
mic. Analog, exist un gol ntre cazurile 2 i 3, cnd f(n) este mai mare dect b
log
b
a
dar nu
polinomial mai mare. Dac funcia f(n) cade ntr-unul dintre aceste goluri, sau cnd a condiia
de regularitate din cazul 3 nu este vericat, metoda master nu poate utilizat pentru a rezolva
recurena.
Utilizarea metodei master
Pentru a utiliza metoda master, stabilim pur i simplu care caz al teoremei se aplic (dac e
vreunul) i scriem soluia.
Ca un prim exemplu, s considerm
T(n) = 9T(n/3) +n.
Pentru aceast recuren, avem a = 9, b = 3, f(n) = n i astfel n
log
b
a
= n
log
3
9
= (n
2
).
Deoarece f(n) = O(n
log
3
9
), unde = 1, putem s aplicm cazul 1 al teoremei master i s
considerm c soluia este T(n) = (n
2
).
S considerm acum
T(n) = T(2n/3) + 1,
4.4. Demonstraia teoremei master 55
n care a = 1, b = 3/2, f(n) = 1 i n
log
b
a
= n
log
3/2
1
= n
0
= 1. Cazul 2 este cel care se aplic,
deoarece f(n) = (n
log
b
a
) = (1) i astfel soluia recurenei este T(n) = (lg n).
Pentru recurena
T(n) = 3T(n/4) +nlg n,
avem a = 3, b = 4, f(n) = nlg n i n
log
b
a
= n
log
4
3
= O(n
0.793
). Deoarece f(n) = (n
log
4
3+
),
unde 0.2, cazul 3 se aplic dac putem arta c pentru f(n) este vericat condiia de
regularitate. Pentru n sucient de mare, af(n/b) = 3(n/4) lg(n/4) (3/4)nlg n = cf(n) pentru
c = 3/4. n consecin, din cazul 3, soluia recurenei este T(n) = (nlg n).
Metoda master nu se aplic recurenei
T(n) = 2T(n/2) +nlg n,
chiar dac are forma potrivit: a = 2, b = 2, f(n) = nlg n i n
lg
b
a
= n. Se pare c ar trebui
s se aplice cazul 3, deoarece f(n) = nlg n este asimptotic mai mare dect n
log
b
a
= n, dar nu
mai mare. Raportul f(n)/n
log
b
a
= (nlg n)/n = lg n este asimptotic mai mic dect n

pentru orice constant pozitiv . n consecin, recurena cade n golul dintre cazurile 2 i 3.
(Soluia este dat n exerciiul 4.4-2).
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) +n
2
.
c. T(n) = 4T(n/2) +n
3
.
4.3-2 Timpul de execuie al unui algoritm A este descris prin recurena T(n) = 7T(n/2) +n
2
.
Un algoritm concurent A
t
are timpul de execuie de T
t
= aT
t
(n/4) +n
2
. Care este cea mai mare
valoare ntreag a lui a astfel nct A
t
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.
4.4. Demonstraia teoremei master
Aceast seciune conine o demonstraie a teoremei master (teorema 4.1) pentru cititorii
avnd cunotine mai avansate. Pentru a aplica teorema nu este nevoie de nelegerea demon-
straiei.
56 Capitolul 4 Recurene
Demonstraia const din dou pri. Prima parte analizeaz recurena master (4.5) n
ipoteza simplicatoare c T(n) este denit numai pe puterile exacte ale lui b > 1, adic pentru
n = 1, b, b
2
, . . . 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 denite numai pe puteri exacte ale lui b. Reamintim c deniiile
notaiilor asimptotice pretind ca delimitrile s e demonstrate pentru toate numerele sucient
de mari, nu numai pentru cele care sunt puteri ale lui b. Deoarece am putea introduce noi notaii
asimptotice care s se aplice mulimii b
i
: i = 0, 1, . . . n locul ntregilor nenegativi, acest abuz
este minor.
Oricum, trebuie s m 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 denit ca
T(n) =

n dac n = 1, 2, 4, 8, . . . ,
n
2
n rest,
caz n care cea mai bun margine superioar ce poate demonstrat este T(n) = O(n
2
). Din
cauza acestui gen de consecine drastice, niciodat nu vom utiliza notaia asimptotic pe un
domeniu limitat fr s atragem atenia asupra acestui lucru.
4.4.1. Demonstraia pentru puteri exacte
Prima parte a demonstraiei teoremei master analizeaz recurena master (4.5),
T(n) = aT(n/b) +f(n),
n ipoteza c n este o putere exact a lui b > 1, unde n nu trebuie s e 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 e f(n) o funcie nenegativ denit pe puterile
exacte ale lui b. Denim T(n) pe puterile exacte ale lui b prin recurena
T(n) =

(1) dac n = 1,
aT(n/b) +f(n) dac n = b
i
,
unde i este un ntreg pozitiv. Atunci
T(n) = (n
log
b
a
) +
log
b
n1

j=0
a
j
f(n/b
j
). (4.6)
4.4. Demonstraia teoremei master 57
Demonstraie. Iterarea recurenei conduce la
T(n) = f(n) +aT(n/b) = f(n) +af(n/b) +a
2
T(n/b
2
)
= f(n) +af(n/b) +a
2
f(n/b
2
) +. . . +a
log
b
n1
f(n/b
log
b
n1
) +a
log
b
n
T(1).
Deoarece a
log
b
n
= n
log
b
a
, ultimul termen al acestei expresii devine
a
log
b
n
T(1) = (n
log
b
a
),
utiliznd condiia la limit T(1) = (1). Termenii rmai pot exprimai sub forma sumei
log
b
n1

j=0
a
j
f(n/b
j
);
astfel,
T(n) = (n
log
b
a
) +
log
b
n1

j=0
a
j
f(n/b
j
),
ceea ce completeaz demonstraia.
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 i, ecare cu costul f(n/b). (Este convenabil s ne gndim la
a ca ind un ntreg, n special cnd vizualizm arborele de recuren, dar din punct de vedere
matematic nu este necesar acest lucru.) Fiecare dintre i are a i cu costul f(n/b
2
) i astfel exist
a
2
noduri situate la distana 2 de rdcin. n general, exist a
j
noduri care sunt la distana
j de rdcin i ecare are costul f(n/b
j
). Costul ecrei frunze este T(1) = (1) i ecare
frunz este la distana log
b
n de rdcin, deoarece n/b
log
b
n
= 1. Exist n
log
b
n
= n
log
b
a
frunze
n arbore.
Putem obine ecuaia (4.6) nsumnd costurile ecrui nivel al arborelui, dup cum se arat
n gur. Costul pentru un nivel j de noduri interne este a
j
f(n/b
j
) i astfel totalul pe toate
nivelurile de noduri interne este
log
b
n1

j=0
a
j
f(n/b
j
).
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 n
log
b
a
subprobleme de dimensiune 1, este (n
log
b
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 n
log
b
a
frunze, avnd nlimea log
b
n. Costul ecrui 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 e f(n) o funcie nenegativ denit pe puterile
exacte ale lui b. O funcie denit pe puterile exacte ale lui b prin
g(n) =
log
b
n1

j=0
a
j
f(n/b
j
) (4.7)
poate delimitat asimptotic pentru puterile exacte ale lui b dup cum urmeaz.
1. Dac f(n) = O(n
log
b
a
) pentru o constant > 0, atunci g(n) = O(n
log
b
a
).
2. Dac f(n) = (n
log
b
a
), atunci g(n) = (n
log
b
a
lg n).
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(n
log
b
a
), de unde f(n/b
j
) = O((n/b
j
)
log
b
a
).
nlocuind n ecuaia (4.7) rezult
g(n) = O

log
b
n1

j=0
a
j

n
b
j

log
b
a

. (4.8)
4.4. Demonstraia teoremei master 59
Delimitm suma din interiorul O-notaiei factoriznd termenii i simplicnd, rezultnd o
serie geometric cresctoare
log
b
n1

j=0
a
j

n
b
j

log
b
a
= n
log
b
a
log
b
n1

j=0

ab

b
log
b
a

j
= n
log
b
a
log
b
n1

j=0
(b

)
j
= n
log
b
a

b
log
b
n
1
b

= n
log
b
a

1
b

.
Deoarece b i sunt constante, ultima expresie se reduce la n
log
b
a
O(n

) = O(n
log
b
a
).
nlocuind aceast expresie n suma din ecuaia (4.8), obinem
g(n) = O

n
log
b
a

,
i cazul 1 este demonstrat.
n ipoteza c f(n) = (n
log
b
a
) pentru cazul 2, avem f(n/b
j
) = ((n/b
j
)
log
b
a
). nlocuind n
ecuaia (4.7) rezult
g(n) =

log
b
n1

j=0
a
j

n
b
j

log
b
a

(4.9)
Delimitm suma din interiorul lui ca i n cazul 1, dar de data aceasta nu obinem o serie
geometric. n schimb, descoperim c ecare termen al sumei este acelai
log
b
n1

j=0
a
j

n
b
j

log
b
a
= n
log
b
a
log
b
n1

j=0

a
b
log
b
a

j
= n
log
b
a
log
b
n1

j=0
1 = n
log
b
a
log
b
n.
nlocuind aceast expresie pentru sum n ecuaia (4.9) rezult
g(n) = (n
log
b
a
log
b
n) = (n
log
b
a
lg n),
i cazul 2 este demonstrat.
Cazul 3 se demonstreaz similar. Deoarece f(n) apare n deniia (4.7) a lui g(n) i toi
termenii lui g(n) sunt nenegativi, putem concluziona c g(n) = (f(n)) pentru puterile exacte
ale lui b. n ipoteza c af(n/b) cf(n) pentru o anumit constant c < 1 i toi n b, avem
a
j
f(n/b
j
) c
j
f(n).
Substituind n ecuaia (4.7) i simplicnd, rezult o serie geometric, dar spre deosebire de
seria din cazul 1, aceasta are termeni descresctori
g(n)
log
b
n1

j=0
a
j
f(n/b
j
)
log
b
n1

j=0
c
j
f(n) f(n)

j=0
c
j
= f(n)
1
1 c
= O(f(n)),
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 e f(n) o funcie nenegativ, denit pe puterile
exacte ale lui b. Denim T(n) pe puterile exacte ale lui b prin recurena
T(n) =

(1) dac n = 1,
aT(n/b) +f(n) dac n = b
i
,
unde i este un ntreg pozitiv. Atunci T(n) poate delimitat asimptotic pentru puterile exacte
ale lui b dup cum urmeaz
1. Dac f(n) = O(n
log
b
a
) pentru o anumit constant > 0, atunci T(n) = (n
log
b
a
).
2. Dac f(n) = (n
log
b
a
), atunci T(n) = (n
log
b
a
lg n).
3. Dac f(n) = (n
log
b
a+
) pentru o anumit constant > 0 i dac af(n/b) cf(n) pentru
o anumit constant c < 1 i toate valorile lui n sucient 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
T(n) = (n
log
b
a
) +O(n
log
b
a
) = (n
log
b
a
),
iar pentru cazul 2,
T(n) = (n
log
b
a
) + (n
log
b
a
lg n) = (n
log
b
a
lg n).
Pentru cazul 3, condiia af(n/b) cf(n) implic f(n) = (n
log
b
a+
) (vezi exerciiul 4.4-3).
n consecin,
T(n) = (n
log
b
a
) + (f(n)) = (f(n)).
Cu aceasta lema este demonstrat.
4.4.2. Pri ntregi inferioare i superioare
Pentru a demonstra teorema master, trebuie s extindem acum analiza noastr la situaia n
care n recurena master sunt utilizate pri ntregi inferioare i superioare, astfel c recurena
este denit pentru orice numere ntregi, nu doar pentru puterile exacte ale lui b. Obinerea unei
margini inferioare pentru
T(n) = aT(n/b|) +f(n) (4.10)
i a unei margini superioare pentru
T(n) = aT(n/b|) +f(n) (4.11)
este o operaie de rutin, deoarece delimitarea n/b| nb poate utilizat n primul caz pentru a
obine rezultatul dorit, iar delimitarea n/b| n/b poate 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, n/b|,
n/b|/b|,
n/b|/b|/b|,
.
.
.
S notm al i-lea element din ir cu n
i
, unde
n
i
=

n dac i = 0,
n
i1
/b| dac i > 0.
(4.12)
Primul nostru scop este s determinm numrul k de iteraii astfel nct n
k
s e o constant.
Utiliznd inegalitatea x| x + 1, obinem
n
0
n,
n
1

n
b
+ 1,
n
2

n
b
2
+
1
b
+ 1,
n
3

n
b
3
+
1
b
2
+
1
b
+ 1,
.
.
.
n general,
n
i

n
b
i
+
i1

j=0
1
b
j

n
b
i
+
b
b 1
,
i astfel, cnd i = log
b
n|, obinem n
i
b +b/(b 1) = O(1).
Putem itera acum recurena (4.10), obinnd
T(n) = f(n
0
) +aT(n
1
) = f(n
0
) +af(n
1
) +a
2
T(n
2
)
f(n
0
) +af(n
1
) +a
2
f(n
2
) +. . . +a
|log
b
n|1
f(n
|log
b
n|1
) +a
|log
b
n|
T(n
|log
b
n|
)
= (n
log
b
a
) +
|log
b
n|1

j=0
a
j
g(n
j
) (4.13)
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
g(n) =
|log
b
n|1

j=0
a
j
f(n
j
) (4.14)
din (4.13) ntr-o manier similar cu demonstraiei lemei 4.3. ncepnd cu cazul 3, dac
af(n/b|) cf(n) pentru n > b + b/(b 1), unde c < 1 este o constant, atunci rezult c
a
j
f(n
j
) c
j
f(n). De aceea, suma din ecuaia (4.14) poate evaluat exact ca n lema 4.3. Pentru
cazul 2, avem f(n) = (n
log
b
a
). Dac putem arta c f(n
j
) = O(n
log
b
a
/a
j
) = O((n/b
j
)
log
b
a
),
atunci demonstraia este valabil i n acest caz. Observm c j log
b
n| implic b
j
/n 1.
62 Capitolul 4 Recurene
Delimitarea f(n) = O(n
log
b
a
) implic existena unei constante c > 0 astfel nct pentru n
j
sucient de mare,
f(n
j
) c

n
b
j
+
b
b 1

log
b
a
= c

n
log
b
a
a
j

1 +

b
j
n

b
b 1

log
b
a
= c

n
log
b
a
a
j

1 +
b
b 1

log
b
a
O

n
log
b
a
a
j

,
deoarece c(1 + b/(b 1))
log
b
a
este o constant. Astfel, cazul 2 este demonstrat. Demonstraia
cazului 1 este aproape identic. Cheia este s demonstrm delimitarea f(n
j
) = O(n
log
b
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 n
i
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) = (n
log
b
a
lg
k
n), unde k 0, atunci recurena master are soluia
T(n) = (n
log
b
a
lg
k+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) = (n
log
b
a+
).
Probleme
4-1 Exemple de recurene
Dai margini asimptotice superioare i inferioare pentru ecare dintre urmtoarele recurene.
Presupunei c T(n) este constant pentru n 2. Facei marginile ct de strnse se poate i
justicai a rspunsurile.
a. T(n) = 2T(n/2) +n
3
.
b. T(n) = T(9n/10) +n.
c. T(n) = 16T(n/4) +n
2
.
d. T(n) = 7T(n/3) +n
2
.
e. T(n) = 7T(n/2) +n
2
.
f. T(n) = 2T(n/4) +

n.
g. T(n) = T(n 1) +n.
Probleme 63
h. T(n) = T (

n) + 1.
4-2 Gsirea ntregului lips
Un tablou A[1..n] conine toate valorile ntregi de la 0 la n, cu excepia unuia. Ar uor s
determinm ntregul lips n timp O(n) utiliznd un tablou auxiliar B[0..n] pentru a nregistra
numerele care apar n A. n aceast problem, totui, accesul complet la un element din A nu se
poate realiza printr-o singur operaie. Elementele lui A sunt reprezentate n binar, iar singura
operaie pe care o putem utiliza pentru a le accesa este extrage al j-lea bit al lui A[i], care cere
timp constant.
Artai c dac utilizm numai aceast operaie nc se mai poate determina ntregul lips
n timp O(n).
4-3 Costul transmiterii parametrilor
Pe parcursul acestei cri presupunem c transmiterea parametrilor n timpul apelrilor
procedurilor cere timp constant, chiar dac este transmis un tablou cu N elemente. Aceast
ipotez este valid n majoritatea sistemelor, deoarece nu este transmis tabloul nsui, ci un
pointer ctre tablou. Aceast problem examineaz implicaiile a trei strategii de transmitere a
parametrilor:
1. Un tablou este transmis prin pointer. Timpul este (1).
2. Un tablou este transmis prin copiere. Timpul este (N), unde N este dimensiunea
tabloului.
3. Un tablou este transmis copiind numai subdomeniul care ar putea accesat de procedura
apelat. Timpul este (p q + 1) dac este transmis subtabloul A[p..q].
a. Considerai algoritmul recursiv de cutare binar pentru gsirea unui numr ntr-
un tablou sortat (vezi exerciiul 1.3-5). Dai recurene pentru timpul de execuie n
cazul cel mai defavorabil cnd tablourile sunt transmise utiliznd ecare dintre cele
trei metode de mai sus i dai margini superioare bune pentru soluiile recurenelor.
Presupunem c dimensiunea problemei iniiale este N, iar dimensiunea subproblemei
este n.
b. Refacei partea (a) pentru algoritmul Sorteaz-Prin-Interclasare din seciunea
1.3.1.
4-4 Alte exemple de recurene
Dai margini asimptotice superioare i inferioare pentru T(n) pentru ecare dintre urmtoarele
recurene. Presupunei c T(n) este constant pentru n 8. Facei marginile ct de strnse se
poate i justicai rspunsurile.
a. T(n) = 3T(n/2) +nlg n.
b. T(n) = 3T(n/3 + 5) +n/2.
c. T(n) = 2T(n/2) +n/ lg n.
d. T(n) = T(n 1) + 1/n.
e. T(n) = T(n 1) + lg n.
64 Capitolul 4 Recurene
f. T(n) =

nT(

n) +n.
4-5 Condiii de pant
Adesea suntem n stare s delimitm o recuren T(n) pentru puterile exacte ale unei constante
ntregi b. Aceast problem ne d condiii suciente pentru a extinde delimitarea la toate valorile
n > 0 reale.
a. Fie T(n) i h(n) funcii monoton cresctoare i s presupunem c T(n) h(n) cnd n
este o putere exact a unei constante b > 1. Mai mult, s presupunem c h(n) este lent
cresctoare, n sensul c h(n) = O(h(n/b)). Demonstrai c T(n) = O(h(n)).
b. S presupunem c avem recurena T(n) = aT(n/b) +f(n), unde a 1, b > 1, iar f(n) este
monoton cresctoare. Totodat condiiile iniiale pentru recuren sunt date de T(n) =
g(n) pentru n n
0
, unde g(n) este monoton cresctoare, iar g(n
0
) aT(n
0
/b) + f(n
0
).
Demonstrai c T(n) este monoton cresctoare.
c. Simplicai demonstraia teoremei master pentru cazul n care f(n) este monoton
cresctoare i lent cresctoare. Utilizai lema 4.4.
4-6 Numere Fibonacci
Aceast problem dezvolt proprieti ale numerolor lui Fibonacci, care sunt denite prin recu-
rena (2.13). Vom utiliza tehnica funciilor generatoare pentru a rezolva recurena lui Fibonacci.
S denim funcia generatoare (sau seria formal de puteri ) T ca
T(z) =

i=0
F
i
z
i
= 0 +z +z
2
+ 2z
3
+ 3z
4
+ 5z
5
+ 8z
6
+ 13z
7
+ 21z
8
+ .
a. Artai c T(z) = z +T(z) +z
2
T(z).
b. Artai c
T(z) =
z
1 z z
2
=
z
(1 z)(1

z)
=
1

1
1 z

1
1

z

,
unde
=
1 +

5
2
= 1.61803 . . . i

=
1

5
2
= 0.61803 . . . .
c. Artai c
T(z) =

i=0
1

5
(
i

i
)z
i
.
d. Demonstrai c F
i
=
i
/

5 pentru i > 0, rotunjit la cel mai apropiat ntreg. (


[

[ < 1.)
e. Demonstrai c F
i+2

i
pentru i 0.
Note bibliograce 65
4-7 Testarea chip-urilor VLSI
Profesorul Diogenes are n chip-uri VLSI
1
presupuse a identice, care sunt capabile n principiu
s se testeze unele pe altele. Matria de testare a profesorului utilizeaz dou chip-uri deodat.
Cnd matria este ncrcat, ecare chip l testeaz pe cellalt i raporteaz dac este bun sau
defect. Un chip bun raporteaz ntotdeauna corect dac cellalt cip este bun sau defect, dar
rspunsul unui chip defect nu este demn de ncredere. Astfel, cele patru rezultate posibile ale
testului sunt dup cum urmeaz:
Chip-ul A spune Chip-ul B spune Concluzie
B este bun A este bun ambele sunt bune sau ambele sunt defecte
B este bun A este defect cel puin unul este defect
B este defect A este bun cel puin unul este defect
B este defect A este defect cel puin unul este defect
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 n/2| teste pe perechi sunt suciente pentru a
reduce dimensiunea problemei la jumtate.
c. Artai c cip-urile bune pot identicate 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 bibliograce
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 justicat 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.
VLSI nseamn very-large-scale-integration (integrare la scar foarte mare), care este tehnologia chip-urilor
de circuite integrate utilizat astzi pentru fabricarea majoritii microprocesoarelor.
5 Mulimi etc.
n capitolele anterioare am studiat unele noiuni matematice. n acest capitol vom recapitula
i vom completa notaiile, deniiile 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
deni 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 = 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 denim mulimi pornind de la alte mulimi deja denite. Dndu-se o mulime A,
putem deni o mulime B A impunnd o restricie care s disting elementele din B de
celelalte elemente din A. De exemplu putem deni mulimea numerelor ntregi pare prin
x : x Z
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.)
Unii autori susin c 0 nu face parte din mulimea numerelor naturale. Totui tendina modern este de a
include i numrul 0 n aceast mulime.
5.1. Mulimi 67
Dndu-se dou mulimi A i B putem deni noi mulimi aplicnd unii operatori cu mul-
imi:
Intersecia mulimilor A i B este mulimea
A B = x : x A i x B.
Reuniunea mulimilor A i B este mulimea
A B = x : x A sau x B.
Diferena dintre dou mulimi A i B este mulimea
AB = x : x A i x / B.
Operaiile cu mulimi respect urmtoarele reguli:
Reguli ale mulimii vide:
A = ,
A = A.
Reguli de idempoten:
A A = A,
A A = A.
Reguli de comutativitate:
A B = B A,
A B = B A.
Reguli de asociativitate:
A (B C) = (A B) C,
A (B C) = (A B) C.
Reguli de distributivitate:
A (B C) = (A B) (A C),
A (B C) = (A B) (A C).
(5.1)
Reguli de absorbie:
A (A B) = A,
A (A B) = A.
Legile lui DeMorgan:
A(B C) = (AB) (AC),
A(B C) = (AB) (AC).
(5.2)
68 Capitolul 5 Mulimi etc.
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 gura 5.1, folosind o diagram Venn,
o imagine grac 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, denim complementul unei mulimi
A ca ind A = U A. Pentru orice mulime A U, urmtoarele propoziii sunt adevrate:
A = A,
A A = ,
A A = U.
Dndu-se dou mulimi A, B U, regulile lui DeMorgan pot rescrise cu ajutorul complemen-
telor mulimilor A i B fa de U astfel:
A B = A B,
A B = A B.
Dou mulimi A i B sunt disjuncte dac nu au nici un element comun, adic A B = .
O colecie o = S
i
de mulimi nevide formeaz o partiie a unei mulimi S dac:
mulimile sunt distincte dou cte dou, adic S
i
, S
j
o i i = j implic S
i
S
j
= i
reuniunea lor este S, adic
S =

S
i
S.
S
i
Cu alte cuvinte, o formeaz o partiie a lui S dac ecare element al mulimii S apare n exact
o mulime S
i
o.
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 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 nit;
altfel, ea este innit. O mulime innit care poate pus n coresponden biunivoc cu
mulimea numerelor naturale N este numit mulime numrabil innit; n caz contrar
5.1. Mulimi 69
ea este nenumrabil. Mulimea Z a numerelor ntregi este numrabil dar mulimea R a
numerelor reale este nenumrabil.
Pentru oricare dou mulimi nite A i B, avem identitatea:
[A B[ = [A[ +[B[ [A B[, (5.3)
de unde putem deduce c
[A B[ [A[ +[B[.
Dac A i B sunt disjuncte, atunci [A B[ = 0, deci [A B[ = [A[ + [B[. Dac A B, atunci
[A[ [B[.
O mulime nit cu n elemente este uneori denumit n-mulime. O 1-mulime este denumit
mulime cu un singur element. O submulime cu k elemente a unei mulimi este denumit
uneori k-submulime.
Mulimea tuturor submulimilor unei mulimi S, incluznd mulimea vid i mulimea
S, este notat prin 2
S
i este denumit mulimea prilor lui S. De exemplu, 2
a,b
=
, a, b, a, b. Mulimea prilor unei mulimi nite S are cardinalul 2
]S]
.
Uneori ne intereseaz structuri asemntoare mulimilor n cadrul crora elementele sunt
ordonate. O pereche ordonat format din dou elemente a i b este notat cu (a, b) i poate
denit ca ind mulimea (a, b) = a, a, b. Deci perechea ordonat (a, b) este identic
cu perechea ordonat (b, a).
Produsul cartezian a dou mulimi A i B, notat prin AB, este mulimea tuturor pere-
chilor ordonate astfel nct primul element al perechii face parte din mulimea A, iar al doilea
este un element al mulimii B. Mai exact:
AB = (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
nite, cardinalul produsului lor cartezian este:
[AB[ = [A[ [B[. (5.4)
Produsul cartezian a n mulimi A
1
, A
2
, . . . , A
n
este o mulime de n-tuple
A
1
A
2
A
n
= (a
1
, a
2
, . . . , a
n
) : a
i
A
i
, i = 1, 2, . . . , n,
al crei cardinal este:
[A
1
A
2
A
n
[ = [A
1
[ [A
2
[ [A
n
[,
dac toate mulimile sunt nite. Notm produsul cartezian dintre o mulime A i ea nsi prin
A
2
= AA.
Similar, avem:
A
n
= AA A.
Cardinalul acestei ultime mulimi este [A
n
[ = [A[
n
dac A este nit. Un n-tuplu poate privit
ca un ir nit 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 nit de mulimi:
A
1
A
2
A
n
= A
1
A
2
A
n
,
A
1
A
2
A
n
= A
1
A
2
A
n
.
5.1-3 Demonstrai generalizarea ecuaiei (5.3), care este denumit principiul includerii i
al excluderii:
[A
1
A
2
A
n
[ =
[A
1
[ +[A
2
[ + +[A
n
[
[A
1
A
2
[ [A
1
A
3
[ (toate perechile)
+[A
1
A
2
A
3
[ + (toate tripletele)
.
.
.
+(1)
n1
[A
1
A
2
A
n
[.
5.1-4 Artai c mulimea numerelor naturale impare este numrabil.
5.1-5 Artai c, pentru orice mulime nit S, mulimea prilor sale 2
S
are 2
]S]
elemente
(adic exist 2
]S]
submulimi distincte ale lui S).
5.1-6 Dai o deniie inductiv pentru un n-tuplu extinznd deniia 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 Rb. 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 A
1
, A
2
, . . . , A
n
este o submulime a lui A
1
A
2
A
n
.
O relaie binar R AA este reexiv dac
a Ra
pentru orice a A. De exemplu, = i sunt relaii reexive peste N n timp ce relaia <
nu este. Relaia R este simetric dac
a Rb implic b Ra
pentru orice a, b A. De exemplu, = este simetric, dar < i nu sunt. Relaia R este
tranzitiv dac
a Rb i b Rc implic a Rc
5.2. Relaii 71
pentru orice a, b, c A. De exemplu, relaiile <, i = sunt tranzitive, dar relaia R =
(a, b) : a, b N i a = b 1 nu este deoarece 3 R4 i 4 R5 nu implic 3 R5.
O relaie care este reexiv, simetric i tranzitiv poart denumirea de relaie de
echivalen. De exemplu = este o relaie de echivalen peste mulimea numerelor naturale
n timp ce < nu este. Dac R este o relaie de echivalen peste o mulime A, atunci pentru
oricare a A, clasa de echivalen a lui a este mulimea [a] = b A : a R b, adic
mulimea tuturor elementelor echivalente cu a. De exemplu, dac denim R = (a, b) : a, b
N i a + b este un numr par, atunci R este o relaie de echivalen deoarece a + a este par
(reexivitate), dac a + b este par atunci i b + a este par (simetrie) i, dac a + b este par
i b + c este par, atunci i a + c este par (tranzitivitate). Clasa de echivalen a lui 4 este
[4] = 0, 2, 4, 6, . . ., iar clasa de echivalen a lui 3 este [3] = 1, 3, 5, 7, . . .. O teorem de baz
n studiul claselor de echivalen este urmtoarea.
Teorema 5.1 (O relaie de echivalen este identic cu o partiie) Clasele de echiva-
len ale oricrei relaii de echivalen R peste o mulime A formeaz o partiie a lui A i
oricare partiie a lui A determin a relaie de echivalen peste A pentru care mulimile din
partiie sunt clase de echivalen.
Demonstraie. Pentru prima parte a demonstraiei, trebuie s artm c clasele de echivalen
ale lui R sunt nevide, disjuncte dou cte dou i reuniunea lor este A. Deoarece R este reexiv,
a [a], clasele de echivalen sunt nevide; mai mult, deoarece ecare element a A aparine
clasei de echivalen [a], reuniunea claselor de echivalen este A. Rmne de artat c clasele
de echivalen sunt distincte dou cte dou, adic dac dou clase de echivalen [a] i [b] au
un element c comun, ele sunt, de fapt, identice. Avem a Rc i b Rc de unde deducem (datorit
proprietilor de simetrie i tranzitivitate ale lui R) c a Rb. Deci, pentru oricare element x [a]
avem xRa implic xRb, deci [a] [b]. Similar, putem demonstra c [b] [a], deci [a] = [b].
Pentru a doua parte a demonstraiei, e / = /
i
o partiie a mulimii A. Denim relaia
R = (a, b) : exist i astfel nct a A
i
i b A
i
. Susinem c R este o relaie de echivalen
peste A. Proprietatea de reexivitate este respectat deoarece a A
i
implic a Ra. Proprietatea
de simetrie este i ea respectat deoarece dac a Rb atunci a i b fac parte din aceeai mulime
A
i
, deci b Ra. Dac a Rb i b Rc atunci toate cele trei elemente se a n aceeai mulime, deci
b Ra i proprietatea de tranzitivitate este respectat. Pentru a vedea c mulimile partiiei sunt
clase de echivalen ale lui R, observai c, dac a A
i
, atunci x [a] implic x A
i
i x A
i
implic x [a].
O relaie binar R peste o mulime A este antisimetric dac
a R b i b R a implic a = b.
De exemplu, relaia peste mulimea numerelor naturale este antisimetric deoarece a b
i b a implic a = b. O relaie care este reexiv, antisimetric i tranzitiv este o relaie
de ordine parial. O mulime peste care este denit o relaie de ordine parial poart
denumirea de mulime parial ordonat. De exemplu, relaia este descendent al lui este
o relaie de ordine parial a mulimii tuturor inelor umane (dac privim indivizii ca ind
propriii lor descendeni).
ntr-o mulime parial ordonat A, poate s nu existe un singur element maxim x, astfel
nct y Rx pentru orice y A. Pot exista mai multe elemente maximale x, astfel nct pentru
nici un y A nu exist relaia xRy. De exemplu, ntr-o colecie de cutii avnd diferite dimensiuni
72 Capitolul 5 Mulimi etc.
pot exista mai multe cutii maximale care nu pot introduse n interiorul nici unei alte cutii,
neexistnd totui nici o cutie maxim n interiorul creia s poat 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 Rb sau b Ra, adic orice pereche
de elemente din A poate 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 inelor 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-3 Dai exemple de relaii care sunt:
a. reexive i simetrice, dar netranzitive,
b. reexive i tranzitive, dar nesimetrice,
c. simetrice i tranzitive, dar nereexive.
5.2-4 Fie S o mulime nit 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-
exiv. El ofer urmtoarea demonstraie: prin simetrie a Rb implic b Ra, deci tranzitivitatea
implic a Ra. 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 ecrui 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 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 ecare 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 a 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 deni o funcie enumernd valorile sale pentru ecare
element din domeniu. De exemplu, putem deni 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 nit de lungime n este o funcie f al crei domeniu este mulimea 0, 1, . . . , n 1.
Deseori, denim un ir nit prin enumerarea valorilor sale: 'f(0), f(1), . . . , f(n 1)`. Un ir
innit este o funcie al crei domeniu este mulimea numerelor naturale N. De exemplu, irul
lui Fibonacci, denit prin (2.13), este irul innit '0, 1, 1, 2, 3, 5, 8, 13, 21, . . .`.
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 : A
1
A
2
A
n
B,
vom scrie b = f(a
1
, a
2
, . . . , a
n
) n loc de a scrie b = f((a
1
, a
2
, . . . , a
n
)). De asemenea, vom numi
ecare a
i
un argument al lui f, cu toate c singurul argument veritabil al lui f este n-tuplul
(a
1
, a
2
, . . . , a
n
).
Dac f : A B este o funcie i b = f(a), uneori, spunem c b este imaginea lui a prin f.
Imaginea unei mulimi A
t
A prin f este denit prin:
f(A
t
) = b B : b = f(a) pentru a A
t
.
Domeniul de valori al unei funcii este imaginea domeniului su, adic f(A). De exemplu
imaginea funciei f : N N denit 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) = n/2| este o funcie surjectiv de la N la N deoarece ecare 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 = a
t
implic f(a) = f(a
t
). De exemplu funcia f(n) = 2n este o funcie
injectiv de la N la N deoarece ecare numr par b este imaginea prin f a cel mult un element
din domeniu, mai precis a lui b/2. Funcia f(n) = n/2| 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
n/2| 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 ecare 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 denit prin:
f
1
(b) = a dac i numai dac f(a) = b.
De exemplu, inversa funciei f(n) = (1)
n
n/2| este
f
1
(m) =

2m dac m 0,
2m1 dac m < 0.
Exerciii
5.3-1 Fie A i B dou mulimi nite 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 Vericai 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 deniie 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.3-4 Dai o bijecie ntre Z i Z Z.
5.4. Grafuri
Aceast seciune prezint dou tipuri de grafuri: orientate i neorientate. Cititorul trebuie
avizat c anumite deniii din literatura de specialitate difer de cele prezentate aici, dar n cele
mai multe cazuri diferenele sunt minore. Seciunea 23.1 arat cum pot reprezentate grafurile
n memoria calculatorului.
Un graf orientat (sau digraf) G este o pereche (V, E), unde V este o mulime nit, 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 grac a unui graf orientat cu mulimea de vrfuri
1, 2, 3, 4, 5, 6. n gur, 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 , i nu din perechi ordonate. Cu alte cuvinte, o muchie este o mulime
u, v, unde u, v V i u = 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 aceeai muchie. ntr-un
graf neorientat, autobuclele sunt interzise i astfel ecare 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 grac a unui graf neorientat avnd mulimea
de vrfuri 1, 2, 3, 4, 5, 6.
Multe deniii pentru grafuri orientate i neorientate sunt aceleai, dei anumii termeni pot
avea semnicaii 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 gura 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 gura 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 gurii 5.2, vrful 2 este
adiacent vrfului 1, deoarece muchia (arcul) (1, 2) aparine ambelor grafuri. Vrful 1 este
adiacent vrfului 2 n gura 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 gura 5.2(b), are gradul 2. Un vrf al crui grad este 0, cum este, de exemplu,
vrful 4, din gura 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 gura 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 u
t
ntr-un graf G = (V, E) este un ir
de vrfuri 'v
0
, v
1
, v
2
, ..., v
k
` astfel nct u = v
0
, u
t
= v
k
, i (v
i1
, v
i
) E pentru i = 1, 2, ..., k.
Lungimea unui drum este numrul de muchii (arce) din acel drum. Drumul conine vrfurile
v
0
, v
1
, v
2
, ..., v
k
i muchiile (v
0
, v
1
), (v
1
, v
2
), ..., (v
k1
, v
k
). Dac exist un drum p de la u la u
t
,
spunem c u
t
este accesibil din u prin p, relaie reprezentat uneori prin u
p
Y u
t
dac G este
orientat. Un drum este elementar dac toate vrfurile din el sunt distincte. n gura 5.2(a),
drumul '1, 2, 5, 4` este un drum elementar de lungime 3. Drumul '2, 5, 4, 5` nu este elementar.
Un subdrum al unui drum p = 'v
0
, v
1
, ..., v
k
` este un subir continuu al vrfurilor sale. Cu
76 Capitolul 5 Mulimi etc.
alte cuvinte, pentru orice 0 i j k, subirul de vrfuri 'v
i
, v
i+1
, ..., v
j
` este un subdrum al
lui p.
ntr-un graf orientat, un drum 'v
0
, v
1
, ..., v
k
` formeaz un ciclu dac v
0
= v
k
i drumul
conine cel puin o muchie. Ciclul este elementar dac, pe lng cele de mai sus, v
1
, v
2
, ..., v
k
sunt distincte. O autobucl este un ciclu de lungime 1. Dou drumuri 'v
0
, v
1
, v
2
, ..., v
k1
, v
0
`
i 'v
t
0
, v
t
1
, v
t
2
, ..., v
t
k1
, v
t
0
` formeaz acelai ciclu dac exist un numr ntreg j astfel nct v
t
i
=
v
(i+j) mod k
pentru i = 0, 1, ..., k 1. n gura 5.2(a), drumul '1, 2, 4, 1` formeaz acelai ciclu
ca drumurile '2, 4, 1, 2` i '4, 1, 2, 4`. Acest ciclu este elementar, dar ciclul '1, 2, 4, 5, 4, 1` nu este
elementar. Ciclul '2, 2` format de muchia (2, 2) este o autobucl. Un graf orientat fr autobucle
este elementar. ntr-un graf neorientat, un drum 'v
0
, v
1
, ..., v
k
` formeaz un ciclu elementar
dac k > 3, v
0
= v
k
i vrfurile v
1
, v
2
, ..., v
k
sunt distincte. De exemplu, n gura 5.2(b), drumul
'1, 2, 5, 1` este un ciclu. Un graf fr cicluri este aciclic.
Un graf neorientat este conex dac ecare 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 gura 5.2(b) are trei componente conexe: 1, 2, 5, 3, 6, i 4. Fiecare
vrf din 1, 2, 5 este accesibil din ecare vrf din 1, 2, 5. Un graf neorientat este conex dac
are exact o component conex, sau, altfel spus, dac ecare vrf este accesibil din ecare vrf
diferit de el.
Un graf orientat este tare conex dac ecare 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 gura 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 G
t
= (V
t
, E
t
) sunt izomorfe dac exist o bijecie f : V V
t
astfel nct (u, v) E dac, i numai dac, (f(u), f(v)) E
t
. Cu alte cuvinte, putem reeticheta
vrfurile lui G pentru ca acestea s e vrfuri din G
t
, pstrnd muchiile corespunztoare din
G i G
t
. Figura 5.3(a) prezint o pereche de grafuri izomorfe G i G
t
cu mulimile de vrfuri
V = 1, 2, 3, 4, 5, 6 i V
t
= u, v, w, x, y, z. Funcia din V n V
t
, 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 gura 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 gurii nu posed un astfel de
vrf.
Spunem c un graf G
t
= (V
t
, E
t
) este un subgraf al grafului G = (V, E) dac V
t
V i
E
t
E. Dat ind o mulime V
t
V , subgraful lui G indus de V
t
este graful G
t
= (V
t
, E
t
),
unde
E
t
= (u, v) E : u, v V
t
.
Subgraful indus de mulimea de vrfuri 1, 2, 3, 6, din gura 5.2(a), apare n gura 5.2(c) i are
mulimea de muchii (1, 2), (2, 2), (6, 3).
Dat ind un graf neorientat G = (V, E), versiunea orientat a lui G este graful orientat
G
t
= (V, E
t
), unde (u, v) E
t
dac, i numai dac, (u, v) E. Cu alte cuvinte, ecare muchie
neorientat (u, v) din G este nlocuit n versiunea orientat prin dou arce orientate: (u, v)
i (v, u). Dat ind un graf orientat G = (V, E), versiunea neorientat a lui G este graful
neorientat G
t
= (V, E
t
), unde (u, v) E
t
dac, i numai dac, u = 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 partiionat n dou mulimi V
1
i V
2
astfel nct (u, v) E implic
e c u V
1
i v V
2
, e c u V
2
i v V
1
. Cu alte cuvinte, toate muchiile merg de la
mulimea V
1
la mulimea V
2
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 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 ecare hipermuchie, n loc de a conecta
dou vrfuri, conecteaz o submulime arbitrar de vrfuri. Muli algoritmi scrii pentru grafuri
orientate i neorientate obinuite pot 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
ecare profesor i amintete de cte ori a salutat pe cineva. La sfritul petrecerii, decanul
facultii nsumeaz numrul strngerilor de mn fcute de ecare 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

vV
grad(v) = 2[E[.
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 Vericai 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 gura 5.2(a)? Care este versiunea
orientat a grafului neorientat din gura 5.2(b)?
5.4-6 Artai c un hipergraf poate reprezentat printr-un graf bipartit dac stabilim ca
incidena n hipergraf s corespund adiacenei n graful bipartit. ( 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 deniii i proprieti matematice pentru mai multe tipuri de arbori. Seciunile
11.4 i 23.1 descriu modurile de reprezentare a arborilor n memoria calculatorului.
5.5.1. Arbori liberi
Dup cum a fost denit n seciunea 5.4, un arbore liber este un graf neorientat, aciclic i
conex. Deseori omitem adjectivul liber atunci cnd spunem c un graf este un arbore. Dac un
graf neorientat este aciclic, dar s-ar putea s nu e conex, el formeaz o pdure. Muli algoritmi
pentru arbori funcioneaz, de asemenea, i pe pduri. Figura 5.4(a) prezint un arbore liber, iar
gura 5.4(b) prezint o pdure. Pdurea din gura 5.4(b) nu este un arbore pentru c nu este
conex. Graful din gura 5.4(c) nu este nici arbore i nici pdure, deoarece conine un ciclu.
Urmtoarea teorem prezint ntr-o form concentrat multe proprietai importante ale
arborilor liberi.
Teorema 5.2 (Proprietile arborilor liberi) Fie G = (V, E) un graf neorientat. Urmtoa-
rele armaii sunt adevrate:
1. G este un arbore liber.
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 p
1
i p
2
. Aceste drumuri se despart pentru
prima dat n vrful w, i se rentlnesc pentru prima oar n vrful z. Drumul p

mpreun cu inversul
drumului p

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.
4. G este conex, i [E[ = [V [ 1.
5. G este aciclic, i [E[ = [V [ 1.
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 p
1
i p
2
, dup cum este prezentat n gura 5.5. Fie w vrful unde drumurile
se despart pentru prima dat. Cu alte cuvinte, w este primul vrf, att din p
1
ct i din p
2
, al
crui succesor n p
1
este x i al crui succesor din p
2
este y, cu x = y. Fie z primul vrf unde
drumurile se rentlnesc, adic z este primul vrf de dup w din p
1
care se a de asemenea i
n p
2
. Fie p
t
subdrumul din p
1
de la w la z i care trece prin x, i e p
tt
drumul din p
2
de la w
la z i care trece prin y. Drumurile p
t
i p
tt
nu au nici un vrf comun cu excepia vrfurilor lor
terminale. Astfel, drumul obinut, alturnd lui p
t
inversul lui p
tt
, 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 e 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 e 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 ecare 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 v
1
, v
2
, ..., v
k
. Fie G
k
= (V
k
, E
k
)
subgraful lui G format din ciclul respectiv. Observai c [V
k
[ = [E
k
[ = k. Dac k < [V [, atunci,
trebuie s existe un vrf v
k+1
V V
k
care s e adiacent unui vrf oarecare v
i
V
k
, din moment
ce G este conex. Denim G
k+1
= (V
k+1
, E
k+1
) ca ind subgraful lui G avnd V
k+1
= V
k
v
k+1

i E
k+1
= E
k
(v
i
, v
k+1
). Observai c [V
k+1
[ = [E
k+1
[ = k+1. Dac k+1 < n putem continua,
denind G
k+2
n aceeai manier, i aa mai departe, pn cnd obinem G
n
= (V
n
, E
n
), unde
n = [V [, V
n
= V , i [E
n
[ = [V
n
[ = [V [. Deoarece G
n
este un subgraf al lui G, avem E
n
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 deniie, 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.
5.5.2. Arbori cu rdcin i arbori ordonai
Un arbore cu rdcin este un arbore liber n care unul dintre vrfuri se deosebete de
celelalte. Vrful evideniat se numete rdcina arborelui. De multe ori ne referim la un vrf al
unui arbore cu rdcin ca la un nod
2
al arborelui. Figura 5.6(a) prezint un arbore cu radcin
pe o mulime de 12 noduri a crui rdcin este 7.
S lum un nod x ntr-un arbore T care are rdcina r. Orice nod y pe drumul unic din r n
x este numit un strmo al lui x. Dac y este un strmo al lui x, atunci x este un descendent
al lui y. (Fiecare nod este att un strmo ct i un descendent al lui nsui.) Dac y este un
strmo al lui x i x = y, atunci y este un strmo propriu al lui x, iar x este un descendent
propriu al lui y. Subarborele cu rdcina x este arborele indus de ctre descendenii lui x
i avnd rdcina x. De exemplu, subarborele avnd ca rdcin nodul 8, din gura 5.6, conine
nodurile 8, 6, 5, i 9.
Dac ultima muchie de pe drumul de la rdcina r a unui arbore T pn la un nod x este
(y, x), atunci y este printele lui x, iar x este un copil al lui y. Rdcina este singurul nod din
Termenul de nod este adesea folosit n literatura de teoria grafurilor ca un sinonim pentru vrf. Vom
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 a 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 ecrui 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 gura 5.6 sunt diferii atunci cnd sunt privii ca ind arbori
ordonai, dar sunt identici atunci cnd sunt considerai a doar arbori cu rdcin.
5.5.3. Arbori binari i arbori poziionali
Arborii binari pot descrii cel mai bine ntr-o manier recursiv. Un arbore binar T este
o structur denit pe o mulime nit de noduri care
nu conine nici un nod, sau
este constituit din trei mulimi de noduri disjuncte: un nod rdcin, un arbore binar
numit subarborele stng al su, i un arbore binar numit subarborele drept al lui T.
Arborele binar care nu conine nici un nod se numete arborele vid sau arborele nul, notat
uneori prin nil. Dac subarborele stng nu este vid, atunci rdcina acestuia se numete copilul
Observai c gradul unui nod depinde de modul n care este privit T: ca arbore cu rdcin sau ca arbore
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 ecare 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 ecare 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 clasicat ca ind un copil drept sau un copil stng. Figura 5.7(b) prezint un arbore binar
care difer de arborele din gura 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 reprezentat prin nodurile interne ale
unui arbore ordonat, dup cum se arat n gura 5.7(c). Ideea este s nlocuim ecare copil
absent din arborele binar cu un nod ce nu are nici un copil. Aceste noduri de tip frunz sunt
reprezentate, n gur, prin ptrate. Arborele rezultat este un arbore binar complet: ecare
nod este e o frunz, e 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 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 ecare 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, ecare 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
Figura 5.8 Un arbore binar complet de nlime 3, cu 8 frunze i 7 noduri interne.
log
k
n. Numrul nodurilor interne ale unui arbore k-ar complet de nlime h este
1 +k +k
2
+... +k
h1
=
h1

i=0
k
i
=
k
h
1
k 1
din ecuaia (3.3). Astfel, un arbore binar complet are 2
h
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 ecruia
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 v
0
V astfel nct exist un
unic drum de la v
0
la ecare 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
lg n|.
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 Asociem un cost w(x) = 2
d
ecrei 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, ..., k1 astfel nct
c(u) = 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 armaii 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 colorat cu d +1
culori.
d. Artai c dac G are O([V [) muchii, atunci G poate colorat cu O(

[V [) culori.
5-2 Grafuri de prieteni
Reformulai ecare dintre urmtoarele armaii sub forma unei teoreme despre grafuri neori-
entate, iar apoi demonstrai teorema. Putei presupune c prietenia este simetric dar nu i
reexiv.
a. n orice grup de n 2 persoane, exist dou persoane cu acelai numr de prieteni n grup.
b. Orice grup de ase persoane conine e trei persoane ntre care exist o relaie de prietenie
reciproc, e trei persoane care nu se cunosc nici una pe cealalt.
c. Orice grup de persoane poate mprit n dou subgrupuri astfel nct cel puin jumtate
din prietenii ecrei persoane s se ae n grupul din care persoana respectiv face
parte.
d. Dac toate persoanele dintr-un grup sunt prietene cu cel puin jumtate din persoanele
din grup, atunci grupul poate aezat la o mas astfel nct ecare persoan este aezat
ntre doi prieteni.
5-3 mprirea arborilor n dou
Muli algoritmi divide i stpnete care lucreaz pe grafuri cer ca graful s e mparit n dou
subgrafuri de dimensiuni aproximativ egale, prin eliminarea unui mic numr de muchii. Aceast
problem cerceteaz mprirea n dou a arborilor.
a. Demonstrai c, prin eliminarea unei singure muchii, putem partiiona vrfurile oricrui
arbore binar avnd n vrfuri n dou mulimi A i B astfel nct [A[ 3n/4 i [B[ 3n/4.
b. Demonstrai c aceast constant de 3/4 de la punctul (a) este optimal n cel mai
defavorabil caz, dnd un exemplu de arbore simplu a crui cea mai echilibrat partiie,
dup eliminarea unei singure muchii, are proprietatea [A[ = 3n/4.
Note bibliograce 85
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[ = n/2| i
[B[ = n/2|.
Note bibliograce
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 innit. Termenul de funcie este atribuit lui G. W.
Leibnitz, care l-a folosit pentru a se referi la mai multe feluri de formule matematice. Deniia 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 ecare 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 deniii i rezultate din teoria grafurilor, se
a n cartea scris de Harary [94].
6 Numrare i probabilitate
n acest capitol trecem n revist combinatorica elementar i teoria elementar a probabili-
tilor. Dac avei o bun fundamentare n aceste domenii, putei trece mai uor peste nceputul
capitolului i s v concentrai asupra seciunilor urmtoare. Multe dintre capitole nu necesit
probabiliti, dar pentru anumite capitole ele sunt eseniale.
n seciunea 6.1 trecem n revist principalele rezultate ale teoriei numrrii (combinatori-
ca, analiza combinatorie), inclusiv formule standard pentru numrarea permutrilor i combi-
nrilor. n seciunea 6.2 sunt prezentate axiomele probabilitii i rezultatele de baz legate de
distribuiile de probabilitate. Variabilele aleatoare sunt introduse n seciunea 6.3, unde se dau de
asemenea proprietile mediei i ale dispersiei. Seciunea 6.4 investigheaz distribuia geometric
i cea binomial care apar n studiul probelor bernoulliene. Studiul distribuiei binomiale este
continuat n seciunea 6.5, care este o discuie avansat despre cozile distribuiei. n ne, n
seciunea 6.6 ilustrm analiza probabilistic prin intermediul a trei exemple: paradoxul zilei de
natere, aruncarea aleatoare a bilelor n cutii i ctigarea liniilor (secvenelor).
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
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.
Regulile sumei i produsului
O mulime ale crei elemente dorim s le numrm poate exprimat uneori ca o reuniune
de mulimi disjuncte sau ca un produs cartezian de mulimi.
Regula sumei ne spune c numrul de moduri de alegere a unui element din cel puin una
din dou mulimi este suma cardinalilor mulimilor. Altfel spus, dac A i B sunt dou
mulimi nite fr nici un element comun, atunci [AB[ = [A[ +[B[, ceea ce rezult din ecuaia
(5.3). De exemplu, ecare poziie de pe un numr de main este o liter sau o cifr. Numrul de
posibiliti, pentru ecare poziie, este 26 + 10 = 36 deoarece sunt 26 de alegeri pentru o liter
i 10 alegeri pentru o cifr.
Regula produsului spune c numrul de moduri n care putem alege o pereche ordonat
este numrul de alegeri pentru primul element nmulit cu numrul de alegeri pentru al doilea
element. Adic, dac A i B sunt dou mulimi nite, atunci [A B[ = [A[ [B[, care este, pur
i simplu, ecuaia (5.4). De exemplu, dac un productor de ngheat ofer 28 de arome de
ngheat i 4 tipuri de glazuri, numrul total de sortimente cu un glob de ngheat i o glazur
este 28 4 = 112.
6.1. Numrare 87
iruri
Un ir peste o mulime nit S este o secven de elemente din S. De exemplu, exist 8
iruri binare de lungime 3:
000, 001, 010, 011, 100, 101, 110, 111.
Vom numi, uneori, k-ir un ir de lungime k. Un subir s
t
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 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 2
k
. Intuitiv,
pentru a construi k-iruri peste o mulime de n elemente (n-mulime), avem n moduri de alegere
pentru primul element; pentru ecare 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 = n
k
.
Permutri
O permutarea unei mulimi nite S este o secven ordonat a tuturor elementelor lui S, cu
ecare element aprnd exact o singur dat. De exemplu, dac S = a, b, c, exist 6 permutri
ale lui S:
abc, acb, bac, bca, cab, cba.
Exist n! permutri ale unei mulimi avnd n elemente, deoarece primul element al secvenei
poate 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.
Numrul de k-permutri ale unei n-mulimi este
n(n 1)(n 2) (n k + 1) =
n!
(n k)!
, (6.1)
deoarece exist n moduri de a alege primul element, n 1 moduri de a alege al doilea element
i tot aa, pn se selecteaz k elemente, ultimul ind o selecie de n k + 1 elemente.
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:
ab, ac, ad, bc, bd, cd.
sau aranjament n.t.
88 Capitolul 6 Numrare i probabilitate
(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 exprimat cu ajutorul numrului de k-
permutri ale unei n-mulimi. Pentru orice k-combinare, exist exact k! permutri ale elementelor
sale, ecare ind 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!
k!(n k)!
. (6.2)
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.
Coecieni binomiali
Vom utiliza notaia

n
k

(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
k

=
n!
k!(n k)!
. (6.3)
Aceast formul este simetric n k i n k:

n
k

n
n k

. (6.4)
Aceste numere sunt cunoscute i sub numele de coecieni binomiali deoarece apar n dez-
voltarea binomial (formula binomului lui Newton):
(x +y)
n
=
n

k=0

n
k

x
k
y
nk
. (6.5)
Un caz special al dezvoltrii binomiale este acela n care x = y = 1:
2
n
=
n

k=0

n
k

. (6.6)
Aceast formul corespunde numrrii celor 2
n
n-iruri binare dup numrul de cifre 1 pe care
ele l conin: exist

n
k

iruri binare ce conin exact k de 1 deoarece exist



n
k

moduri de a alege
k din cele n poziii n care vom pune cifre 1.
Exist multe identiti referitoare la coecienii binomiali. Exerciiile de la sfritul acestei
seciuni v ofer posibilitatea s demonstrai cteva.
Margini binomiale
Uneori, avem nevoie s delimitm mrimea unui coecient binomial. Pentru 1 k n, avem
marginea inferioar

n
k

=
n(n 1) (n k + 1)
k(k 1) 1
=

n
k

n 1
k 1

n k + 1
1

n
k

k
. (6.7)
6.1. Numrare 89
Utiliznd inegalitatea k! (k/e)
k
, dedus din formula lui Stirling (2.12), obinem marginea
superioar

n
k

=
n(n 1) (n k + 1)
k(k 1) 1

n
k
k!
(6.8)

en
k

k
. (6.9)
Pentru orice 0 k n, putem utiliza inducia (vezi exerciiul 6.1-12) pentru a demonstra
delimitarea

n
k

n
n
k
k
(n k)
nk
, (6.10)
unde, pentru comoditate, am presupus c 0
0
= 1. Pentru k = n, unde 0 1, aceast
margine se poate rescrie sub forma

n
n


n
n
(n)
n
((1 )n)
(1)n
=

1
1

n
(6.11)
= 2
nH()
, (6.12)
unde
H() = lg (1 ) lg(1 ) (6.13)
este funcia entropie (binar) i unde, pentru comoditate, am presupus c 0 lg 0 = 0, astfel
c H(0) = H(1) = 0.
Exerciii
6.1-1 Cte k-subiruri are un n-ir? (Considerm k-subirurile identice ce apar pe poziii diferite
ca ind 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 rotit pentru a o obine pe cealalt.
6.1-4 n cte moduri pot alese trei numere distincte din mulimea 1, 2, . . . , 100 astfel ca
suma lor s e par?
6.1-5 Demonstrai identitatea:

n
k

=
n
k

n 1
k 1

(6.14)
pentru 0 < k n.
90 Capitolul 6 Numrare i probabilitate
6.1-6 Demonstrai identitatea:

n
k

=
n
n k

n 1
k

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
k

n 1
k

n 1
k 1

.
6.1-8 Utiliznd rezultatul din exerciiul 6.1-7, construii o tabel a coecienilor binomiali,

n
k

pentru n = 0, 1, . . . , 6 i 0 k n, cu

0
0

n vrf,

1
0

i

1
1

pe linia urmtoare i aa mai


departe. O astfel de tabel de coecieni binomiali se numete triunghiul lui Pascal .
6.1-9 Demonstrai c
n

i=1
i =

n + 1
2

.
6.1-10 Artai c, pentru orice n 0 i 0 k n, maximul valorii lui

n
k

se realizeaz cnd
k = n/2| sau k = n/2|.
6.1-11 Argumentai c, pentru orice n 0, j 0, k 0 i j +k n,

n
j +k

n
j

n j
k

. (6.15)
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-13 Utilizai aproximaia lui Stirling pentru a demonstra c

2n
n

=
2
2n

n
(1 +O(1/n)) . (6.16)
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 deni probabilitatea n termeni de spaiu de selecie S, care este o mulime ale crei
elemente se numesc evenimente elementare. Fiecare eveniment elementar poate privit ca
un rezultat posibil al unui experiment. Pentru experimentul aruncrii a dou monede distincte
i distinctibile, putem privi spaiul de selecie ca ind mulimea tuturor 2-irurilor peste s, b:
S = ss, sb, bs, bb.
Un eveniment este o submulime
2
a spaiului de selecie S. De exemplu, n experimentul
aruncrii a dou monede, evenimentul de a obine un ban sau o stem este sb,bs. Evenimentul
S se numete eveniment sigur, iar evenimentul se numete eveniment nul sau eveniment
imposibil . Spunem c dou evenimente sunt mutual exclusive sau incompatibile dac A
B = . Vom trata, uneori, un eveniment elementar s S ca ind evenimentul s. Prin deniie,
toate evenimentele elementare sunt mutual exclusive.
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 :
1. PrA 0 pentru orice eveniment A.
2. PrS = 1.
3. PrA B = PrA + PrB pentru oricare dou evenimente mutual exclusive A i B.
Mai general, pentru orice secven (nit sau innit numrabil) de evenimente A
1
, A
2
, . . .
care sunt dou cte dou mutual exclusive
Pr

i
A
i

i
PrA
i
.
Vom numi PrA probabilitatea evenimentului A. De notat c axioma 2 este o cerin de
normalizare: nu este nimic fundamental n alegerea lui 1 ca probabilitate a evenimentului sigur,
exceptnd faptul c este mai natural i mai convenabil.
Pentru o distribuie de probabilitate general, pot exista anumite submulimi ale lui S care nu sunt considerate
evenimente. Aceast situaie apare de obicei cnd spaiul de selecie este innit nenumrabil. Cerina principal
este ca mulimea evenimentelor din spaiul de selecie s e nchis la operaiile de complementare i la intersecia
unui numr nit sau numrabil de evenimente. Cele mai multe dintre distribuiile pe care le vom ntlni sunt
denite peste spaii de selecie nite sau numrabile i vom considera toate submulimile spaiului de selecie ca
ind evenimente. O excepie notabil va 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 PrA PrB. Utiliznd

A pentru a nota evenimentul S A (complementul
sau evenimentul contrar lui A), avem Pr

A = 1 PrA. Pentru oricare dou evenimente


A i B,
PrA B = PrA + PrB PrA B (6.17)
PrA + PrB. (6.18)
n exemplul nostru cu aruncarea monedei presupunem c ecare eveniment elementar are pro-
babilitatea 1/4. Probabilitatea de a obine cel puin o stem este
Prss, sb, bs = Prss + Prsb + Prbs = 3/4.
Altfel, deoarece probabilitatea de a obine mai puin de o stem este Prbb = 1/4, probabili-
tatea de a obine cel puin o stem este 1 1/4 = 3/4.
Distribuii discrete de probabilitate
O distribuie de probabilitate este discret dac este denit peste un spaiu de selecie
nit sau numrabil. Fie S spaiul de selecie. Atunci pentru orice eveniment A,
PrA =

sA
Prs,
deoarece evenimentele elementare, mai concret cele din A, sunt mutual exclusive. Dac S este
nit i ecare eveniment elementar s S are probabilitatea
Prs = 1/[S[,
atunci avem distribuia de probabilitate uniform
3
pe S. ntr-un astfel de caz, experimentul
este descris adesea ca alegerea unui element al lui S la ntmplare.
De exemplu, s considerm procesul de aruncare a unei monede perfecte (corecte, ideale),
pentru care probabilitatea de a obine stema este aceeai cu probabilitatea de a obine banul,
adic 1/2. Dac aruncm moneda de n ori, avem distribuia de probabilitate uniform denit
peste spaiul de selecie S = s, b
n
, o mulime de dimensiune (cardinal) 2
n
. Fiecare element
din S poate reprezentat ca un ir de lungime n peste s, b i ecare apare cu probabilitatea
1/2
n
. Evenimentul
A = stema apare de exact k ori i banul apare de n k ori
este o submulime a lui S, de dimensiune (cardinal) [A[ =

n
k

deoarece exist

n
k

iruri de
lungime n peste s, b ce conin exact k s-uri. Astfel probabilitatea lui A este PrA =

n
k

/2
n
.
distribuia uniform discret pe S n.t.
6.2. Probabilitate 93
Distribuia de probabilitate uniform continu
Distribuia de probabilitate uniform continu este un exemplu de distribuie de probabilitate
n care nu toate submulimile spaiului de selecie sunt considerate evenimente. Distribuia de
probabilitate uniform continu este denit pe un interval nchis [a, b] al axei reale, cu a < b.
Intuitiv, dorim ca toate punctele intervalului [a, b] s e echiprobabile. Exist, totui, o innitate
nenumrabil de puncte, aa c, dac atribuim tuturor punctelor aceeai probabilitate nit,
pozitiv, nu putem satisface axiomele 2 i 3. Din acest motiv, vom asocia o probabilitate numai
submulimi ale lui S, astfel ca axiomele s e satisfcute pentru astfel de evenimente.
Pentru orice interval nchis [c, d], unde a c d b, distribuia de probabilitate
uniform continu denete probabilitatea evenimentului [c, d] ca ind
Pr[c, d] =
d c
b a
.
De notat c, pentru orice punct x = [x, x], probabilitatea lui x este 0. Dac nlturm capetele
unui interval [c, d], obinem un interval deschis (c, d). Deoarece [c, d] = [c, c](c, d)[d, d], pe baza
axiomei 3 avem Pr[c, d] = Pr(c, d). n general, mulimea evenimentelor pentru distribuia
de probabilitate uniform continu este constituit din toate submulimile lui [a, b] care pot
obinute printr-o reuniune nit de intervale deschise sau nchise.
Probabilitate condiionat i independen
Uneori avem, cu anticipaie, unele cunotine pariale despre un experiment. De exemplu, s
presupunem c un prieten a aruncat dou monede perfecte i c v-a spus c cel puin una din
ele a artat stema. Care este probabilitatea s obinem dou steme? Informaia dat elimin
posibilitatea de a avea de dou ori banul. Cele trei evenimente care au rmas sunt echiprobabile,
deci deducem c ecare din ele apare cu probabilitatea 1/3. Deoarece numai unul dintre acestea
nseamn dou steme, rspunsul la ntrebarea noastr este 1/3.
Probabilitatea condiionat formalizeaz noiunea de a avea cunotine pariale despre rezul-
tatul unui experiment. Probabilitea condiionat a evenimentului A, tiind c un alt eveni-
ment B a aprut, se denete prin
PrA[B =
PrA B
PrB
, (6.19)
ori de cte ori PrB = 0. (Notaia PrA[B se va citi probabilitatea lui A condiionat de B.)
Intuitiv, deoarece se d c evenimentul B a aprut, evenimentul ca A s apar, de asemenea
este A B. Adic, A B este mulimea rezultatelor n care apar att A ct i B
4
. Deoarece
rezultatul este unul din evenimentele elementare ale lui B, normalizm probabilitile tuturor
evenimentelor elementare din B, mprindu-le la PrB, astfel ca suma lor s e 1. Probabilita-
tea lui A condiionat de B este, de aceea, raportul dintre probabilitatea evenimentului AB i
probabilitatea lui B. n exemplul de mai sus, A este evenimentul ca ambele monede s dea stema,
iar B este evenimentul ca s se obin cel puin o stem. Astfel, PrA[B = (1/4)/(3/4) = 1/3.
Dou evenimente sunt independente dac
PrA B = PrA PrB,
Elementele lor sau rezultatele lor n.t.
94 Capitolul 6 Numrare i probabilitate
ceea ce este echivalent, dac PrB = 0, cu condiia
PrA[B = PrA.
De exemplu, s presupunem c se arunc dou monede perfecte i c rezultatele sunt indepen-
dente. Atunci probabilitatea de a obine dou steme este (1/2)(1/2) = 1/4. Presupunem acum
c un eveniment este ca prima moned s dea o stem i cel de-al doilea este ca monedele s dea
rezultate diferite. Fiecare dintre aceste evenimente apare cu probabilitatea 1/2, iar probabilitatea
ca s apar ambele evenimente este 1/4; astfel, conform deniiei independenei, evenimentele
sunt independente chiar dac ne-am putea gndi c ambele depind de prima moned. n ne,
s presupunem c monedele sunt legate, astfel nct pe ambele s cad e stema, e banul i c
ambele posibiliti sunt egal probabile. Atunci probabilitatea ca ecare moned s dea stema este
1/2, dar probabilitatea ca ambele s dea stema este 1/2 = (1/2)(1/2). n consecin, evenimentul
ca o moned s dea stema i evenimentul ca cealalt s dea stema nu sunt independente.
O colecie de evenimente A
1
, A
2
, . . . , A
n
se numete independent pe perechi (sau spunem
c evenimentele sunt dou cte dou independente n.t.) dac
PrA
i
A
j
= PrA
i
PrA
j

pentru orice 1 i < j n. Spunem c evenimentele A


1
, . . . , A
n
sunt (mutual ) independente
(sau independente n totalitate) dac ecare k-submulime A
i
1
, A
i
2
, . . . , A
i
k
a coleciei, unde
2 k n i 1 i
1
< i
2
< . . . < i
k
n satisface
PrA
i
1
A
i
2
. . . A
i
k
= PrA
i
1
PrA
i
2
. . . PrA
i
k
.
De exemplu, s presupunem c aruncm dou monede perfecte. Fie A
1
evenimentul ca prima
moned s dea stema, e A
2
evenimentul ca a doua moned s dea stema i A
3
evenimentul ca
cele dou monede s e diferite. Avem
PrA
1
= 1/2,
PrA
2
= 1/2,
PrA
3
= 1/2,
PrA
1
A
2
= 1/4,
PrA
1
A
3
= 1/4,
PrA
2
A
3
= 1/4,
PrA
1
A
2
A
3
= 0.
Deoarece pentru 1 i < j 3, avem PrA
i
A
j
= PrA
i
PrA
j
= 1/4, evenimentele
A
1
, A
2
i A
3
sunt dou cte dou independente. Ele nu sunt mutual independente, deoarece
PrA
1
A
2
A
3
= 0 i PrA
1
PrA
2
PrA
3
= 1/8 = 0.
Teorema lui Bayes
Din deniia probabilitii condiionate (6.19) rezult c, pentru dou evenimente A i B,
ecare cu probabilitate nenul, avem
PrA B = PrB PrA[B = PrA PrB[A (6.20)
Exprimnd din ecuaiile de mai sus PrA[B, obinem
PrA[B =
PrA PrB[A
PrB
, (6.21)
6.2. Probabilitate 95
relaie care este cunoscut sub numele de teorema lui Bayes. Numrtorul PrB 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,
PrB = PrB A + PrB

A = PrA PrB[A + Pr

A PrB[

A.
nlocuind n ecuaia (6.21), obinem o form echivalent a teoremei lui Bayes:
PrA[B =
PrA PrB[A
PrA PrB[A + Pr

A PrB[

A
.
Teorema lui Bayes poate uura calculul probabilitilor condiionate. De exemplu, s presupunem
c avem o moned perfect i o moned fals care cade ntotdeauna pe stem. Efectum un
experiment ce const din trei evenimente independente: una dintre cele dou monede este aleas
la ntmplare, aruncat o dat i apoi aruncat din nou. S presupunem c moneda aleas a dat
stema la ambele aruncri. Care este probabilitatea ca ea s e fals?
Vom rezolva aceast problem utiliznd teorema lui Bayes. Fie A evenimentul ca s e aleas
moneda fals i e B evenimentul ca moneda s ne dea de dou ori stema. Dorim s determinm
PrA[B. Avem PrA = 1/2, PrB[A = 1, Pr

A = 1/2 i PrB[

A = 1/4; deci
PrA[B =
(1/2) 1
(1/2) 1 + (1/2) (1/4)
= 4/5.
Exerciii
6.2-1 Demonstrai inegalitatea lui Boole: pentru orice secven nit sau innit numrabil
de evenimente A
1
, A
2
, . . .
PrA
1
A
2
. . . PrA
1
+ PrA
2
+ . (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, ecare 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 e 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 simulat o aruncare de moned perfec-
t examinnd aruncri multiple. ( aruncai moneda de dou ori i apoi e returnai
rezultatul, e 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
un polinom n lg b.
6.2-6 Demonstrai c
PrA[B + Pr

A[B = 1.
96 Capitolul 6 Numrare i probabilitate
6.2-7 Artai c, pentru orice colecie de evenimente A
1
, A
2
, . . . , A
n
,
PrA
1
A
2
. . . A
n
=
PrA
1
PrA
2
[A
1
PrA
3
[A
1
A
2
PrA
n
[A
1
A
2
. . . A
n1
.
6.2-8 Artai cum se poate construi o mulime de n evenimente care s e dou cte dou
independente, dar orice submulime de k > 2 dintre ele mulime de evenimente mutual
independente.
6.2-9 Dou evenimente A i B sunt independente condiionat dac
PrA B[C = PrA[C PrB[C,
unde C este dat. Dai un exemplu simplu, dar netrivial, de dou evenimente care nu sunt
independente, dar care sunt independente condiionat, ind dat un al treilea eveniment.
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 e 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 ansa dumneavoastr dac v schimbai opiunea?
6.2-11 Un director al unei nchisori a ales aleator un prizonier din trei pentru a eliberat.
Ceilali doi vor executai. Gardianul tie care va 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 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 executat. Prizonierul X se simte mai fericit acum,
deoarece sau el sau Z va liber, ceea ce nseamn c probabilitatea ca el s e liber este acum
1/2. Are dreptate, sau ansa sa este tot 1/3? Explicai.
6.3. Variabile aleatoare discrete
O variabil aleatoare (discret) X este o funcie de la un spaiu de selecie S, nit sau
innit numrabil, la mulimea numerelor reale. Ea asociaz un numr real ecrui rezultat al
unui experiment, ceea ce ne permite s lucrm cu distribuia de probabilitate indus de mulimea
de numere rezultat. Variabilele aleatoare pot denite i pentru spaii de selecie nenumrabile,
dar se ajunge la probleme tehnice a cror rezolvare nu este necesar pentru scopurile noastre.
De aceea, vom presupune c variabilele aleatoare sunt discrete.
Pentru o variabil aleatoare X i un numr real x, denim evenimentul X = x ca ind
s S : X(s) = x; astfel
PrX = x =

sS:X(s)=x
Prs.
Funcia
f(x) = PrX = x
6.3. Variabile aleatoare discrete 97
este densitatea de probabilitate
5
a variabilei aleatoare X. Din axiomele probabilitii, PrX =
x 0 i

x
PrX = 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 ecare eveniment elementar s S are aceeai probabilitate:
Prs = 1/36. Denim variabila aleatoare X ca ind celor dou valori de pe feele
zarurilor. Avem PrX = 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 e denite pe acelai spaiu de selecie.
Dac X i Y sunt variabile aleatoare, funcia
f(x, y) = PrX = x i Y = y
este funcia densitate de probabilitate asociat lui X i Y . Pentru o valoare xat y,
PrY = y =

x
PrX = x i Y = y
i la fel, pentru o valoare xat x
PrX = x =

y
PrX = x i Y = y.
Utiliznd deniia (6.19) a probabilitii condiionate, avem
PrX = x[Y = y =
PrX = x i Y = y
PrY = y
.
Spunem c dou variabile aleatoare X i Y sunt independente dac, pentru orice x i y,
evenimentele X = x i Y = y sunt independente, sau echivalent, dac, pentru orice x i y, avem
PrX = x i Y = y = PrX = x PrY = y.
Dndu-se o mulime de variabile aleatoare peste acelai spaiu de selecie, se pot deni noi
variabile aleatoare, cum ar suma, produsul sau alte funcii de variabilele originale.
Valoarea medie a unei variabile aleatoare
Cea mai simpl i mai util descriere a distribuiei unei variabile aleatoare este media
valorilor pe care le ia. Valoarea medie (sau sinonim sperana sau media) a unei variabile
aleatoare discrete X este
E[X] =

x
xPrX = x, (6.23)
care este bine denit dac suma este nit 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 ecare
stem i pierdei 2$ pentru ecare ban. Valoarea medie a variabilei aleatoare X ce reprezint
ctigul dumneavoastr este
E[X] = 6 Pr2s + 1 Pr1s,1b 4 Pr2b = 6(1/4) + 1(1/2) 4(1/4) = 1.
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
Media sumei a dou variabile aleatoare este suma mediilor, adic
E[X +Y ] = E[X] + E[Y ], (6.24)
ori de cte ori E[X] i E[Y ] sunt denite. Aceast proprietate se extinde la sume nite i absolut
convergente de medii.
Dac X este o variabil aleatoare, orice funcie g(x) denete o nou variabil aleatoare g(X).
Dac valoarea medie a lui g(X) este denit, atunci
E[g(X)] =

x
g(x) PrX = x.
Lund g(x) = ax, avem pentru orice constant
E[aX] = aE[X]. (6.25)
n consecin, mediile sunt liniare: pentru oricare dou variabile aleatoare X i Y i orice
constant a,
E[aX +Y ] = aE[X] + E[Y ]. (6.26)
Cnd dou variabile aleatoare X i Y sunt independente i media ecreia este denit, avem
E[XY ] =

y
xy PrX = x i Y = y =

y
xy PrX = x PrY = y =
=

x
xPrX = x

y
y PrY = y

= E[X]E[Y ].
n general, cnd n variabile aleatoare X
1
, X
2,
. . . , X
n
sunt mutual independente
E[X
1
X
2
. . . X
n
] = E[X
1
]E[X
2
] . . . E[X
n
]. (6.27)
Atunci cnd o variabil aleatoare X ia valori din mulimea numerelor naturale N =
0, 1, 2, . . ., exist o formul convenabil pentru media sa
E[X] =

i=0
i PrX = i =

i=0
i (PrX i PrX i + 1) =

i=1
PrX i, (6.28)
deoarece ecare termen PrX i este adunat de i ori i sczut de i1 ori (exceptnd PrX 0
care este adunat de 0 ori i nu este sczut deloc).
Dispersie i abatere medie ptratic
Dispersia unei variabile aleatoare X cu media E[X] este
Var[X] = E

(X E[X])
2

= E

X
2
2XE[X] +E
2
[X]

=
= E[X
2
] 2E[XE[X]] +E
2
[X] = E[X
2
] 2E
2
[X] +E
2
[X] =
= E[X
2
] E
2
[X]. (6.29)
6.3. Variabile aleatoare discrete 99
Justicarea 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 rescris pentru a obine o expresie a mediei ptratului
unei variabile aleatoare:
E[X
2
] = Var[X] +E
2
[X]. (6.30)
Dispersia unei variabile aleatoare X i dispersia lui aX sunt legate prin
Var[aX] = a
2
Var[X].
Cnd X i Y sunt variabile aleatoare independente,
Var[X +Y ] = Var[X] + Var[Y ].
n general, dac n variabile aleatoare X
1
, X
2
, . . . , X
n
sunt dou cte dou independente, atunci
V ar

i=1
X
i

=
n

i=1
Var[X
i
]. (6.31)
Abaterea medie ptratic (deviaia standard) a variabilei aleatoare X este rdcina
ptrat pozitiv a dispersiei lui X. Abaterea medie ptratic a unei variabile aleatoare X se
noteaz uneori cu
X
sau cu , cnd variabila aleatoare este subneleas din context. Cu aceast
notaie, dispersia lui X se noteaz cu
2
.
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, ecare 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 denit. De-
monstrai inegalitatea lui Markov:
PrX t E[X]/t (6.32)
pentru orice t > 0.
100 Capitolul 6 Numrare i probabilitate
6.3-6 Fie S un spaiu de selecie i X i X
t
variabile aleatoare astfel nct X(s) X
t
(s)
pentru orice s S. Demonstrai c pentru orice constant real t,
PrX t PrX
t
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].
6.3-9 Demonstrai c Var[aX] = a
2
Var[X] folosind deniia (6.29) a dispersiei.
6.4. Distribuia geometric i distribuia binomial
Aruncarea unei monede este un exemplu de prob bernoullian, care este denit ca un
experiment cu numai dou rezultate posibile: succes, care apare cu probabilitatea p i eec,
care apare cu probabilitatea q = 1 p. Cnd vorbim de probe bernoulliene n mod colectiv,
nseamn c probele sunt mutual independente i, dac nu se specic altceva, c ecare are
aceeai probabilitate de succes p. Dou distribuii importante deriv din probele bernoulliene:
distribuia geometric i cea binomial.
Distribuia geometric
Presupunem c avem o secven de probe bernoulliene, ecare 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
PrX = 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.
Presupunnd c p < 1, media distribuiei geometrice poate calculat utiliznd identitatea
(3.6):
E[X] =

k=1
kq
k1
p =
p
q

k=0
kq
k
=
p
q

q
(1 q)
2
= 1/p. (6.34)
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/p
2
. (6.35)
De exemplu, s presupunem c aruncm, repetat, dou zaruri pn cnd obinem e suma apte,
e 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
Figura 6.1 O distribuie geometric cu probabilitatea de succes p = 1/3 i probabilitatea de eec
q = 1 p. Media distribuiei este 1/p = 3.
Distribuia binomial
Cte succese apar n n probe bernouliene, unde un succes apare cu probabilitatea p i un
eec cu probabilitatea q = 1 p? Denim variabila aleatoare X ca ind numrul de succese n n
probe. Atunci X ia valori n domeniul 0, 1, . . . , n i pentru k = 0, . . . , n,
PrX = k =

n
k

p
k
q
nk
, (6.36)
deoarece sunt

n
k

moduri de a alege care k probe din totalul celor n sunt succese i probabilitatea
de apariie a ecreia dintre ele este p
k
q
nk
. O distribuie de probabilitate ce satisface ecuaia
(6.36) se numete distribuie binomial. Pentru comoditate, denim familia distribuiilor bi-
nomiale utiliznd notaia
b(k; n, p) =

n
k

p
k
(1 p)
nk
. (6.37)
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

k=0
b(k; n, p) = 1, (6.38)
aa cum cere axioma 2 de probabilitate.
102 Capitolul 6 Numrare i probabilitate
Figura 6.2 Distribuia binomial b(k; 15, 1/3) ce rezult din n = 15 probe bernoulliene, ecare 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 e q = 1 p.
Din deniia mediei avem
E[X] =
n

k=0
kb(k; n, p) =
n

k=1
k

n
k

p
k
q
nk
= np
n

k=1

n 1
k 1

p
k1
q
nk
=
= np
n1

k=0

n 1
k

p
k
q
(n1)k
= np
n1

k=0
b(k; n 1, p) = np. (6.39)
Utiliznd liniaritatea mediei, putem obine acelai rezultat cu substanial mai puin algebr. Fie
X
i
o variabil aleatoare ce descrie numrul de succese la a i-a prob. Atunci, E[X
i
] = p1+q0 = p
i, din liniaritatea mediei (6.26), numrul mediu de succese din n ncercri este
E[X] = E

i=1
X
i

=
n

i=1
E[X
i
] =
n

i=1
p = np.
Aceeai abordare poate folosit la calculul dispersiei. Utiliznd ecuaia (6.29), avem Var[X
i
] =
E[X
2
i
] E
2
[X
i
]. Deoarece X
i
ia numai valorile 0 i 1, avem E[X
2
i
] = E[X
i
] = p i deci
Var[X
i
] = p p
2
= pq. (6.40)
Pentru a calcula dispersia lui X, vom exploata avantajul independenei celor n ncercri; astfel
din ecuaia (6.31)
Var[X] = Var

i=1
X
i

=
n

i=1
Var[X
i
] =
n

i=1
pq = npq. (6.41)
6.4. Distribuia geometric i distribuia binomial 103
Conform gurii 6.2, distribuia binomial b(k; n, p) crete pe msur ce k variaz de la 0 la n, pn
cnd atinge media np i apoi scade. Putem demonstra c distribuia se comport ntotdeauna
n acest mod, examinnd raportul termenilor succesivi
b(k; n, p)
b(k 1; n, p)
=

n
k

p
k
q
nk

n
k1

p
k1
q
nk+1
=
n!(k 1)!(n k + 1)!p
k!(n k)!n!q
=
=
(n k + 1)p
kq
= 1 +
(n + 1)p k
kq
. (6.42)
Acest raport este mai mare dect 1 cnd (n + 1)p k este pozitiv. n consecin, b(k; n, p) >
b(k1; n, p) pentru k < (n+1)p (distribuia crete) i b(k; n, p) < b(k1; n, p) pentru k > (n+1)p
(distribuia descrete). Dac k = (n+1)p este ntreg, atunci b(k; n, p) = b(k1; n, p) i distribuia
are dou maxime: n k = (n+1)p i n k 1 = (n+1)p1 = npq. Altfel, distribuia i atinge
maximul n ntregul k unic, situat n domeniul np q < k < (n + 1)p.
Lema urmtoare ne d o margine superioar a distribuiei binomiale.
Lema 6.1 Fie n 0, 0 < p < 1, q = 1 p i 0 k n. Atunci
b(k; n, p)

np
k

nq
n k

nk
.
Demonstraie. Utiliznd ecuaia (6.10) avem
b(k; n, p) =

n
k

p
k
q
nk

n
k

n
n k

nk
p
k
q
nk
=

np
k

nq
n k

nk
.
Exerciii
6.4-1 Vericai 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, ecare
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. Artai c probabilitatea ca ei s obin acelai numr de steme este egal cu

2n
n

/4
n
. ( pentru profesorul Rosencrantz considerm stema succes; pentru profesorul
Guildenstern considerm banul succes). Utilizai raionamentul pentru a verica identitatea
n

k=0

n
k

2
=

2n
n

.
104 Capitolul 6 Numrare i probabilitate
6.4-7 Artai c pentru 0 k n,
b(k; n, 1/2) 2
nH(k/n)n
,
unde H(x) este funcia entropie binar (6.13).
6.4-8 Considerm n probe bernoulliene, unde, pentru i = 1, 2, . . . , n, a i-a prob are proba-
bilitatea de succes p
i
i e X variabila aleatoare ce desemneaz numrul total de succese. Fie
p p
i
pentru orice i = 1, 2, . . . , n. Demonstrai c, pentru 1 k n,
PrX < k
k1

i=0
b(i; n, p).
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 p
i
, i e X
t
variabila aleatoare
ce reprezint numrul total de succese dintr-o mulime A
t
de n probe bernoulliene, unde a i-a
prob are o probabilitate de succes p
t
i
p
i
. Demonstrai c, pentru 0 k n,
PrX
t
k PrX k.
( Artai cum se pot obine probele bernoulliene din A
t
printr-un experiment ce implic
probele din A i utilizai rezultatul exerciiului 6.3-6.)
6.5. Cozile distribuiei binomiale
Probabilitatea de a avea cel puin sau cel mult k succese n n probe bernoulliene, ecare
cu probabilitatea de succes p, este, adesea, de mai mare interes dect probabilitatea de a avea
exact k succese. n aceast seciune vom investiga cozile distribuiei binomiale, adic cele dou
regiuni ale distribuiei b(k; n, p) care sunt ndeprtate de media np.
6
Vom demonstra cteva
margini importante (ale sumei tuturor termenilor) dintr-o coad. Vom demonstra, mai nti,
o margine pentru coada dreapt a distribuiei b(k; n, p). Marginile pentru coada stng pot
determinate din cele pentru coada dreapt schimbnd ntre ele rolurile succeselor i eecurilor.
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
PrX k =
n

i=k
b(i; n, p)

n
k

p
k
.
Demonstraie. Vom utiliza inegalitatea (6.15)

n
k +i

n
k

n k
i

.
Regiuni de forma {X k} sau {X k} n.t.
6.5. Cozile distribuiei binomiale 105
Avem
PrX k =
n

i=k
b(i; n, p) =
nk

i=0
b(k +i; n, p) =
nk

i=0

n
k +i

p
k+i
(1 p)
n(k+i)

nk

i=0

n
k

n k
i

p
k+i
(1 p)
n(k+i)
=

n
k

p
k
nk

i=0

n k
i

p
i
(1 p)
(nk)i
=

n
k

p
k
nk

i=0
b(i; n k, p) =

n
k

p
k
,
cci

nk
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
PrX k =
k

i=0
b(i; n, p)

n
n k

(1 p)
nk
=

n
k

(1 p)
nk
.
Marginea urmtoare se concentreaz asupra cozii stngi a distribuiei binomiale. Cu ct ne
ndeprtm de medie, numrul de succese din coada stng scade exponenial, aa cum ne arat
teorema urmtoare.
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
PrX < k =
k1

i=0
b(i; n, p) <
kq
np k
b(k; n, p).
Demonstraie. Vom majora seria

k1
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)
b(i; n, p)
=
iq
(n i + 1)p
<

i
n i

q
p

k
n k

q
p

.
Dac lum
x =

k
n k

q
p

< 1,
rezult c
b(i 1; n, p) < xb(i; n, p),
106 Capitolul 6 Numrare i probabilitate
pentru 0 < i k. Iternd, obinem
b(i; n, p) < x
ki
b(k; n, p)
pentru 0 i < k i deci
k1

i=0
b(i; n, p) <
k1

i=0
x
ki
b(k; n, p) < b(k; n, p)

i=1
x
i
=
x
1 x
b(k; n, p) =
kq
np k
b(k; n, p).
Cnd k np/2, avem kq/(np k) 1, ceea ce nseamn c b(k; n, p) majoreaz suma
tuturor termenilor mai mici dect k. De exemplu, s presupunem c aruncm n monede perfecte.
Teorema 6.4 ne spune c, lund p = 1/2 i k = n/4, probabilitatea de a obine mai puin de n/4
steme este mai mic dect probabilitatea de a obine n/4 steme. Mai mult, pentru orice r 4,
probabilitatea de a obine mai puin de n/r steme este mai mic dect probabilitatea de a obine
exact n/r steme. Teorema 6.4 poate , de asemenea, util n combinaie cu margini superioare
ale distribuiei binomiale cum ar lema 6.1. O margine a cozii drepte se poate determina la fel.
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
PrX > k =
n

i=k+1
b(i; n, p) <
(n k)p
k np
b(k; n, p).
Teorema urmtoare consider n probe bernoulliene, ecare cu o probabilitate p
i
de succes,
pentru i = 1, 2, . . . , n. Aa cum ne arat corolarul urmtor, putem utiliza teorema pentru a
furniza o margine superioar a cozii drepte a distribuiei binomiale, punnd la ecare ncercare
p = p
i
.
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 p
i
, iar eecul cu probabilitatea q
i
= 1 p
i
. Fie
X o variabil aleatoare ce reprezint numrul total de succese i e = E [X]. Atunci, pentru
r > ,
PrX r

e
r

r
.
Demonstraie. Deoarece, pentru orice > 0, funcia e
x
este strict cresctoare n x, avem
PrX r = Pre
(X)
e
r
,
unde va determinat mai trziu. Utiliznd inegalitatea lui Markov (6.32) obinem
PrX r E

e
(X)

e
r
. (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, e X
i
o variabil aleatoare care are valoarea 1, dac a i-a prob bernoullian este un
succes i 0, dac este un eec. Astfel
X =
n

i=1
X
i
i
X =
n

i=1
(X
i
p
i
).
nlocuind pentru X , obinem
E

e
(X)

= E

i=1
e
(X
i
p
i
)

=
n

i=1
E

e
(X
i
p
i
)

,
care rezult din (6.27) deoarece independena mutual a variabilelor aleatoare X
i
implic
independena mutual a variabilelor aleatoare e
(X
i
p
i
)
(vezi exerciiul 6.3-4). Din deniia
mediei
E

e
(X
i
p
i
)

= e
(1p
i
)
p
i
+e
(0p
i
)
q
i
= p
i
e
q
i
+q
i
e
p
i

p
i
e

+ 1 exp(p
i
e

), (6.44)
unde exp(x) reprezint funcia exponenial: exp(x) = e
x
. (Inegalitatea (6.44) rezult din
inegalitile > 0, q
i
1, e
q
i
e

i e
p
i
1, iar ultima linie rezult din inegalitatea
(2.7)). n consecin,
E

e
(X)

i=1
exp(p
i
e

) = exp(e

)
cci =

n
i=1
p
i
. Deci, din inegalitatea (6.43), rezult c
PrX r exp(e

r). (6.45)
Alegnd = ln(r/) (vezi exerciiul 6.5-6), obinem
PrX r exp

e
ln(r/)
r ln(r/)

= exp(r r ln(r/)) =
e
r
(r/)
r
=

e
r

r
.
Cnd se aplic probelor bernoulliene, n care la ecare 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 ecare prob, succesul
apare cu probabilitatea p, iar eecul cu probabilitatea q = 1 p. Atunci, pentru r > np,
PrX np r =
n

k=|np+r|
b(k; n, p)

npe
r

r
.
Demonstraie. Pentru o distribuie binomial, (6.39) implic = E [X] = np.
108 Capitolul 6 Numrare i probabilitate
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
k1

i=0

n
i

a
i
< (a + 1)
n
k
na k(a + 1)
b(k; n, a/(a + 1)),
pentru orice a > 0 i orice k, astfel nct 0 < k < n.
6.5-3 Demonstrai c, dac 0 < k < np, unde 0 < p < 1 i q = 1 p, atunci
k1

i=0
p
i
q
ni
<
kq
np k

np
k

nq
n k

nk
.
6.5-4 Artai c ipotezele teoremei 6.6 implic
Pr X r

(n )e
r

r
.
La fel, artai c ipotezele corolarului 6.7 implic
Prnp X r

nqe
r

r
.
6.5-5 Considerm o secven de n probe bernoulliene, unde la a i-a prob, pentru i =
1, 2, . . . , n succesul apare cu probabilitatea p
i
, iar eecul cu probabilitatea q
i
= 1 p
i
. Fie X o
variabil aleatoare ce reprezint numrul total de succese i e = E[X]. Artai c, pentru
r 0,
PrX r e
r
2
/2n
.
( Demonstrai c p
i
e
q
i
+q
i
e
1p
i
e

2
/2
. Apoi urmai mersul demonstraiei teoremei
6.6, utiliznd aceast inegalitate n locul inegalitii (6.44).)
6.5-6 Artai c, alegnd = ln(r/), se minimizeaz membrul drept al inegalitii (6.45).
6.6. Analiz probabilistic
Aceast seciune utilizeaz trei exemple pentru a ilustra analiza probabilistic. Primul deter-
min probabilitatea ca, ntr-o camer n care sunt k persoane, s existe o anumit pereche care
s-i srbtoreasc ziua de natere n aceeai zi. Al doilea exemplu ilustreaz aruncarea aleatoare
a bilelor n cutii. Al treilea investigheaz secvenele de steme consecutive la aruncarea monedei.
6.6. Analiz probabilistic 109
6.6.1. Paradoxul zilei de natere
Un exemplu bun pentru ilustrarea raionamentului probabilist este clasicul paradox al zilei
de natere. Ci oameni trebuie s e ntr-o ncpere pentru a avea o bun ans s gsim doi
nscui n aceeai zi a anului? Rspunsul este c trebuie s e surprinztor de puini. Paradoxul
este acela c, de fapt, trebuie mult mai puini dect numrul de zile dintr-un an, aa cum se va
vedea. Pentru a rspunde la ntrebare, s numerotm oamenii din camer cu ntregii 1, 2, . . . , k,
unde k este numrul de oameni din ncpere. Vom ignora anii biseci i vom presupune c toi
anii au n = 365 de zile. Pentru i = 1, 2, . . . , k, e b
i
ziua din an n care cade ziua de natere a
lui i, unde 1 b
i
n. Presupunem c zilele de natere sunt uniform distribuite n cele n zile ale
anului, aa c Prb
i
= r = 1/n, pentru i = 1, 2, . . . , k i r = 1, 2, . . . , n.
Probabilitatea ca dou persoane i i j s aib aceeai zi de natere depinde de faptul c
selecia aleatoare este dependent sau independent. Dac zilele de natere sunt independente,
atunci probabilitatea ca ziua de natere a lui i i ziua de natere a lui j s cad amndou n
ziua r este
Prb
i
= r i b
j
= r = Prb
i
= r Prb
j
= r = 1/n
2
.
Astfel, probabilitatea ca ambele s cad n aceeai zi este
Prb
i
= b
j
=
n

r=1
Prb
i
= r i b
j
= r =
n

r=1
1
n
2
= 1/n.
Intutiv, o dat ales b
i
, probabilitatea ca b
j
s e 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 e diferite. Evenimentul ca toate cele k
persoane s aib zile de natere distincte este
B
k
=
k1

i=1
A
i
,
unde A
i
este evenimentul ca ziua de natere a persoanei (i +1) s e diferit de ziua de natere
a persoanei j, pentru orice j i, adic,
A
i
= b
i+1
= b
j
: j = 1, 2, . . . , i.
Deoarece putem scrie B
k
= A
k1
B
k1
, din ecuaia (6.20) obinem recurena
PrB
k
= PrB
k1
PrA
k1
[B
k1
, (6.46)
unde lum PrB
1
= 1 drept condiie iniial. Cu alte cuvinte, probabilitatea ca b
1
, b
2
, . . . , b
k
s e zile de natere distincte este probabilitatea ca b
1
, b
2
, . . . , b
k1
s e distincte nmulit cu
probabilitatea ca b
k
= b
i
, pentru i = 1, 2, . . . , k 1, tiind c b
1
, b
2
, . . . , b
k1
sunt distincte.
110 Capitolul 6 Numrare i probabilitate
Dac b
1
, b
2
, . . . , b
k1
sunt distincte, probabilitatea condiionat ca b
k
= b
i
pentru i =
1, 2, . . . , k 1 este (nk +1)/n, deoarece printre cele n zile exist n(k 1) care nu sunt luate
n considerare. Iternd recurena (6.46), obinem
PrB
k
= PrB
1
PrA
1
[B
1
PrA
2
[B
2
. . . PrA
k1
[B
k1
=
= 1

n 1
n

n 2
n

. . .

n k + 1
n

=
= 1

1
1
n

1
2
n

. . .

1
k 1
n

.
Inegalitatea (2.7), 1 +x e
x
ne d
PrB
k
e
1/n
e
2/n
. . . e
(k1)n
= e

k1
i=1
i/n
= e
k(k1)/2n
1/2
cnd k(k 1)/2n ln(1/2). Probabilitatea ca toate cele k zile de natere s e distincte este
cel mult 1/2 cnd k(k 1) 2nln2, adic pentru k (1 +

1 + (8 ln2)n)/2, rezultat obinut


rezolvnd inecuaia ptratic. Pentru n = 365, trebuie s avem k 23. Astfel, dac n ncpere
sunt cel puin 23 de oameni, probabilitatea ca cel puin doi s aib aceeai zi de natere este cel
puin 1/2. Pe Marte, unde anul are 669 de zile, este nevoie de 31 de marieni pentru a obine
aceeai probabilitate.
O alt metod de analiz
Putem utiliza liniaritatea mediei (ecuaia (6.26)) pentru o obine o analiz mai simpl, dar
aproximativ, a paradoxului zilei de natere. Pentru ecare pereche (i, j) dintre cele k persoane
din ncpere, s denim variabilele aleatoare X
ij
, pentru 1 i < j k, prin
X
ij
=

1 dac persoanele i i j au aceeai zi de natere


0 n caz contrar.
Probabilitatea ca dou persoane s aib aceeai zi de natere este 1/n i astfel, conform deniiei
mediei (6.23),
E [X
ij
] = 1 (1/n) + 0 (1 1/n) = 1/n.
Numrul mediu de perechi de indivizi avnd aceeai zi de natere este, conform ecuaiei (6.24),
suma mediilor individuale ale tuturor perechilor, care este
k

i=2
i1

j=1
E [X
ij
] =

k
2

1
n
=
k(k 1)
2n
.
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 e 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 e
cel puin 1. Dei numrul de oameni determinat n ecare din cele dou situaii difer, ambele
sunt asimptotic la fel: (

n).
6.6.2. Bile i cutii
Considerm procesul de aruncare aleatoare a unor bile identice n b cutii, numerotate cu
1, 2, . . . , b. Aruncrile sunt independente i, la ecare aruncare, bila are aceeai probabilitate
de a nimeri n oricare dintre cutii. Probabilitatea ca bila s aterizeze n oricare dintre cutiile
date este 1/b. Astfel, procesul de aruncare a bilelor este o secven de probe bernoulliene cu
o probabilitate de succes de 1/b, unde succes nseamn cderea bilei n cutia dat. Se poate
formula o varietate de ntrebri interesante referitoare la procesul de aruncare a bilelor.
? Numrul de bile care cad ntr-o cutie dat urmeaz distribuia
binomial b(k; n, 1/b). Dac se arunc n bile, numrul mediu de bile care cad n cutia dat este
n/b.
? Numrul
de aruncri, pn cnd cutia dat conine o bil, urmeaz distribuia geometric cu probabilitatea
1/b i astfel numrul mediu de aruncri, pn se obine un succes, este 1/(1/b) = b.
? S numim lovitur
o aruncare n care o bil cade ntr-o cutie goal. Dorim s tim numrul mediu n de aruncri
necesare pentru a obine b lovituri.
Loviturile se pot utiliza pentru a partiiona cele n aruncri n stadii. Al i-lea stadiu const
din aruncrile de dup a (i 1)-a lovitur pn la a i-a lovitur. Primul stadiu const din prima
aruncare, deoarece ni se garanteaz c avem o lovitur atunci cnd toate cutiile sunt goale.
Pentru ecare aruncare din timpul celui de-al i-lea stadiu, exist i 1 cutii ce conin bile i
b i + 1 cutii goale. Astfel, pentru toate aruncrile din stadiul i, probabilitatea de a obine o
lovitur este (b i + 1)/b.
Fie n
i
numrul de aruncri la al i-lea stadiu. Astfel, numrul de aruncri necesare pentru a
obine b lovituri este n =

b
i=1
n
i
. Fiecare variabil aleatoare n
i
are o distribuie geometric cu
probabilitatea de succes (b i + 1)/b i de aceea
E [n
i
] =
b
b i + 1
.
Din liniaritatea mediei, obinem
E [n] = E

i=1
n
i

=
b

i=1
E [n
i
] =
b

i=1
b
b i + 1
= b
b

i=1
1
i
= b(lnb +O(1)).
Ultima inegalitate rezult din marginea (3.5) referitoare la seria armonic. Deci sunt necesare
aproximativ b lnb aruncri nainte de a ne putea atepta ca ecare cutie s conin o bil.
6.6.3. Linii (secvene)
S presupunem c aruncm o moned perfect de n ori. Care este cea mai lung linie
(secven) de steme consecutive pe care ne ateptm s-o obinem? Rspunsul este (lg n), aa
cum ne arat analiza urmtoare.
112 Capitolul 6 Numrare i probabilitate
Vom demonstra, nti, c lungimea celei mai lungi secvene de steme este O(lg n). Fie A
ik
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 A
ik
, probabilitatea ca
toate cele k aruncri s aib ca rezultat stema, are o distribuie geometric cu p = q = 1/2:
PrA
ik
= 1/2
k
. (6.47)
Pentru k = 2 lg n|,
Pr

A
i,2|lg n|

= 1/2
2|lg n|
1/2
2 lg n
= 1/n
2
,
i, astfel, probabilitatea ca o secven de steme de lungime cel puin 2 lg n| s nceap din
poziia i este chiar mic, considernd c sunt cel mult n poziii (de fapt n 2lg n| + 1) n care
secvena ar putea ncepe. Probabilitatea ca o secven de steme de lungime cel puin 2 lg n| s
nceap oriunde este deci
Pr

n2|lg n|+1

i=1
A
i,2|lg n|

i=1
1/n
2
=
1
n
,
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 2lg n| este cel mult 1/n; deci
probabilitatea ca cea mai lung secven s aib lungimea mai mic dect 2lg n| este cel puin
1 1/n. Deoarece ecare secven are lungimea cel mult n, lungimea medie a celei mai lungi
secvene este mrginit superior de
(2 lg n|)(1 1/n) +n(1/n) = O(lg n).
ansa ca o secven de steme s depeasc rlg n| se diminueaz rapid o dat cu r. Pentru
r 1, probabilitatea ca o secven de rlg n| s nceap n poziia i este
PrA
i,r|lg n|
= 1/2
r|lg n|
1/n
r
.
Astfel, probabilitatea ca cea mai lung secven s aib lungimea cel puin rlg n| este cel mult
n/n
r
= 1/n
r1
, sau echivalent, probabilitatea ca cea mai lung secven s aib lungimea mai
mic dect rlg n| este cel puin 1 1/n
r1
.
De exemplu, pentru n = 1000 de aruncri de moned, probabilitatea de a avea o secven de
cel puin 2lg n| = 20 de steme este de cel mult 1/n = 1/1000. ansa de a avea o secven mai
lung de 3lg n| = 30 de steme este de cel mult 1/n
2
= 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 lg n|/2. Din ecuaia (6.47) avem
PrA
i,|lg n|/2
= 1/2
|lg n|/2
1/

n.
Probabilitatea ca o secven de lungime cel puin lg n|/2 s nu nceap n poziia i este deci cel
mult 1 1/

n. Putem partiiona cele n aruncri ale monedei n cel puin 2n/lg n|| grupuri
Probleme 113
de lg n|/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 e o
secven de lungime lg n|/2 este
(1 1/

n)
|2n/|lg n||
(1 1/

n)
2n/ lg n1
e
(2n/ lg n1)/

n
= O(e
lg n
) = O(1/n).
Pentru a justica aceasta, am utilizat inegalitatea (2.7), 1 + x e
x
. Astfel, probabilitatea ca
cea mai lung linie s depeasc lg n|/2 este cel puin 1 O(1/n). Deoarece cea mai lung
secven are lungimea cel puin 0, lungimea medie a celei mai lungi linii (secvene) este de cel
puin
(lg n|/2)(1 O(1/n)) + 0 (1/n) = (lg n).
Exerciii
6.6-1 Presupunem c mai multe bile sunt aruncate n b cutii. Fiecare aruncare este independent
i ecare 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 e
independente n totalitate (mutual independente) sau este sucient s e independente dou cte
dou? Justicai rspunsul.
6.6-3 Ci oameni trebuie invitai la o petrecere pentru a face verosimil existena a
dintre ei cu aceeai zi de natere?
6.6-4 Care este probabilitatea ca un k-ir peste o mulime de lungime n s e 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, ecare aruncare este independent i
ecare 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 n2 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 b
n
.
114 Capitolul 6 Numrare i probabilitate
b. S presupunem c bilele sunt distincte i c bilele din ecare cutie sunt ordonate.
Demonstrai c numrul de moduri n care se pot aeza bilele n cutii este (b+n1)!/(b1)!.
( 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

. ( cte dintre
aranjamentele din partea (b) se repet dac bilele devin identice?)
d. Presupunem c bilele sunt identice i c nici o cutie nu conine mai mult de o bil. Artai
c numrul de moduri n care se pot aeza bilele este

b
n

.
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

.
6-2 Analiza programului de determinare a maximului
Programul urmtor determin valoarea maxim dintr-un tablou neordonat A[1..n].
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 e 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 e executat?
d. Fie s
1
, s
2
, . . . , s
n
n variabile aleatoare, unde s
i
reprezint numrul de execuii (0 sau 1) ale
liniei 5 n timpul celei de-a i-a iteraii a ciclului pentru. Ce este E[s
i
]?
e. Fie s = s
1
+ s
2
+ + s
n
numrul total de execuii ale liniei 5 n timpul unei execuii a
programului. Artai c E[s] = (lg n).
6-3 Problema angajrii
D-na profesoar Dixon vrea s angajeze un nou asistent cercettor. Ea a aranjat interviuri cu n
solicitani i vrea s-i bazeze decizia doar pe calicarea lor. Din nefericire, regulile universitii
cer ca dup ecare interviu candidatul s e respins sau s i se ofere postul solicitat. Profesoara
Dixon a decis s adopte strategia de a selecta un ntreg pozitiv k < n, s intervieveze i s
resping primii k solicitani i apoi s-l angajeze pe solicitantul care este mai pregtit dect toi
solicitanii precedeni. Dac cel mai bun este ntre primii k intervievai, va angajat al n-lea
solicitant. Artai c d-na profesoar Dixon i maximizeaz ansa de a angaja cel mai bine
pregtit solicitant, alegnd k aproximativ egal cu n/e i c ansa de a-l angaja pe cel mai bine
pregtit este atunci aproximativ 1/e.
Note bibliograce 115
6-4 Numrare probabilistic
Cu un contor de t bii putem numra n mod obinuit pn la 2
t
1. Cu numrarea
probabilistic a lui R. Morris putem numra pn la valori mult mai mari, cu preul unei
pierderi a preciziei. Vom lua o valoare de contor i care va reprezenta numrul de n
i
, pentru
i = 0, 1, . . . , 2
t
1, unde n
i
formeaz o secven cresctoare de valori nenegative. Vom presupune
c valoarea iniial a contorului este 0, reprezentnd numrul de valori n
0
= 0. Operaia
Incrementeaz lucreaz pe un contor ce conine valoarea i n mod probabilist. Dac i = 2
t
1,
se raporteaz o eroare de tip depire superioar. Altfel, contorul este incrementat cu 1 cu proba-
bilitatea 1/(n
i+1
n
i
) i rmne neschimbat cu probabilitatea 1 1/(n
i+1
n
i
). Dac selectm
n
i
= i, pentru orice i 0, atunci contorul este unul obinuit. O situaie mai interesant apare
dac selectm, de exemplu, n
i
= 2
i1
, pentru i > 0, sau n
i
= F
i
(al i-lea numr Fibonacci vezi
seciunea 2.2). Pentru aceast problem s presupunem c n
2
t
1
este sucient de mare, astfel
ca probabilitatea unei depiri superioare s e neglijabil.
a. Artai c valoarea medie reprezentat de contor, dup ce au fost efectuate n operaii
Incrementeaz, este exact n.
b. Analiza dispersiei numrului reprezentat de contor depinde de secvena de numere n
i
.
S considerm un caz simplu: n
i
= 100i, pentru orice i 0. Estimai dispersia valorii
reprezentate de registru dup ce au fost efectuate n operaii Incrementeaz.
Note bibliograce
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 Cherno [40] i Hoeding [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 'a
1
, a
2
, ..., a
n
`.
Ieire: O permutare (reordonare) 'a
t
1
, a
t
2
, ..., a
t
n
` a irului dat astfel nct a
t
1
a
t
n
.
irul de intrare este, de obicei, un tablou cu n elemente, dei el poate 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, ecare
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 ecare 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 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 e o sarcin dicil.
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 (n
2
). 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, (nlg 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(nlg 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 (n
2
). Timpul mediu de execuie este (nlg 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 (nlg 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 (nlg 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 folosit pentru a extinde domeniul ordonrii prin numrare. Dac avem de ordonat
n numere ntregi, ecare numr avnd d cifre, cu ecare 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 (nlg 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(n
2
) 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
dicile, anumite seciuni cer o abordare sosticat 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 sosticate 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(nlg 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
1
. Structura de date heap este util nu doar pentru
algoritmul heapsort, ea poate la fel de util i n tratarea ecient 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 ( ), de exemplu n limbajele de tip Lisp.
Structura de date heap se refer la heap-ul menionat n alocarea dinamic, i ori de cte ori,
n aceast carte vom vorbi despre heap, vom nelege structura denit n acest capitol.
7.1. Heap-uri
Structura de date heap (binar) este un vector care poate vizualizat sub forma unui
arbore binar aproape complet (vezi seciunea 5.5.3), conform gurii 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 ecare 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 ind un
indice i, corespunztor unui nod, se pot determina uor indicii printelui acestuia Printe(i),
al ului Stnga(i) i al ului Dreapta(i).
Printe(i)
returneaz i/2|
Stnga(i)
returneaz 2i
Dreapta(i)
returneaz 2i + 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 nesemnicativ va
1. n procedura Printe valoarea i/2| se va calcula prin translatarea cu o poziie binar la
dreapta a reprezentrii binare a lui i. ntr-o implementare ecient a algoritmului heapsort, aceste
proceduri sunt adeseori codicate sub forma unor macro-uri sau a unor proceduri in-line.
Pentru orice nod i, diferit de rdcin, este adevrat urmtoarea proprietate de heap:
A[Printe(i)] A[i], (7.1)
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.
Denim nlimea unui nod al arborelui ca ind numrul muchiilor aparinnd celui mai
lung drum care leag nodul respectiv cu o frunz, iar nlimea arborelui ca ind 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.
Procedura Reconstituie-Heap are timpul de execuie O(lg n) i este de prim importan
n ntreinerea proprietii de heap (7.1).
Procedura Construiete-Heap are un timp de execuie liniar i genereaz un heap dintr-
un vector neordonat, furnizat la intrare.
Procedura Heapsort se execut n timpul O(nlg n) i ordoneaz un vector n spaiul
alocat acestuia.
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-2 Artai c un heap avnd n elemente are nlimea lg n|.
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 aa cel mai mic element al unui heap, presupunnd c toate elementele
sunt distincte?
7.1-5 Este vectorul n care elementele se succed n ordine descresctoare un heap?
7.1-6 Este secvena '23, 17, 14, 6, 13, 10, 1, 5, 7, 12` un heap?
7.2. Reconstituirea proprietii de heap
Procedura Reconstituie-Heap este un subprogram important n prelucrarea heap-urilor.
Datele de intrare ale acesteia sunt un vector A i un indice i din vector. Atunci cnd se apeleaz
Reconstituie-Heap, se presupune c subarborii, avnd ca rdcini nodurile Stnga(i)
respectiv Dreapta(i), sunt heap-uri. Dar, cum elementul A[i] poate mai mic dect descendenii
si, acesta nu respect proprietatea de heap (7.1). Sarcina procedurii Reconstituie-Heap este
de a scufunda n heap valoarea A[i], astfel nct subarborele care are n rdcin valoarea
elementului de indice i, s devin un heap.
Reconstituie-Heap(A, i)
1: l Stnga(i)
2: r Dreapta(i)
3: dac l dimesiune-heap[A] i A[l] > A[i] atunci
4: maxim l
5: altfel
6: maxim i
7: dac r dimesiune-heap[A] i A[r] > A[maxim] atunci
8: maxim r
9: dac maxim = i atunci
10: schimb A[i] A[maxim]
11: Reconstituie-Heap(A, maxim)
Figura 7.2 ilustreaz efectul procedurii Reconstituie-Heap. La ecare 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)
Conguraia 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.
subarborele de rdcin maxim s nu ndeplineasc proprietatea de heap. Rezult c procedura
Reconstituie-Heap trebuie apelat recursiv din nou pentru acest subarbore.
Timpul de execuie al procedurii Reconstituie-Heap, corespunztor unui arbore de rd-
cin i i dimensiune n, este (1), timp n care se pot analiza relaiile dintre A[i], A[Stnga(i)] i
A[Dreapta(i)] la care trebuie adugat timpul n care Reconstituie-Heap se execut pentru
subarborele avnd ca rdcin unul dintre descendenii lui i. Dimensiunea acestor subarbori este
de cel mult 2n/3 cazul cel mai defavorabil ind acela n care nivelul inferior al arborelui este
plin exact pe jumtate astfel, timpul de execuie al procedurii Reconstituie-Heap poate
descris prin urmtoarea inegalitate recursiv:
T(n) T(2n/3) + (1).
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 exprimat alternativ ca ind egal cu O(h).
7.3. Construirea unui heap 123
Exerciii
7.2-1 Utiliznd ca model gura 7.2, ilustrai modul de funcionare al procedurii Reconstituie-
Heap(A, 3) pentru vectorul A = '27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0`.
7.2-2 Care este efectul apelului procedurii Reconstituie-Heap(A, i), dac elementul A[i] este
mai mare dect descendenii si?
7.2-3 Care este efectul procedurii Reconstituie-Heap(A, i) pentru i > [A]/2?
7.2-4 Procedura Reconstituie-Heap poate implementat ecient din punct de vedere al
timpului constant de execuie, dar se poate ntmpla ca anumite compilatoare s genereze cod
inecient pentru apelul recursiv din linia a 11-a. Elaborai o variant a procedurii Reconsti-
tuie-Heap, n care recursivitatea este nlocuit cu iterativitate.
7.2-5 Artai c timpul de execuie a procedurii Reconstituie-Heap, n cazul unui heap de
dimensiune n, este, n cel mai defavorabil caz, (lg n). ( n cazul unui heap format din
n elemente, determinai valorile ataate nodurilor astfel nct procedura Reconstituie-Heap
s e apelat recursiv pentru toate nodurile aparinnd drumurilor care pornesc de la rdcin
la frunze.)
7.3. Construirea unui heap
Procedura Reconstituie-Heap poate utilizat de jos n sus pentru transformarea
vectorului A[1..n] n heap, unde n = lungime[A]. Deoarece toate elementele subirului A[(n/2|+
1)..n] sunt frunze, acestea pot considerate ca ind heap-uri formate din cte un element. Astfel,
procedura Construiete-Heap trebuie s traverseze doar restul elementelor i s execute
procedura Reconstituie-Heap pentru ecare nod ntlnit. Ordinea de prelucrare a nodurilor
asigur ca subarborii, avnd ca rdcin descendeni ai nodului i s formeze heap-uri nainte ca
Reconstituie-Heap s e executat pentru aceste noduri.
Construiete-Heap(A)
1: dimesiune-heap[A] lungime[A]
2: pentru i lungime[A]/2|,1 execut
3: Reconstituie-Heap(A, i)
Figura 7.3 ilustreaz modul de funcionare al procedurii Construiete-Heap.
Timpul de execuie al procedurii Construiete-Heap poate calculat simplu, determinnd
limita superioar a acestuia: ecare apel al procedurii Reconstituie-Heap necesit un timp
O(lg n) i, deoarece pot O(n) asemenea apeluri, rezult c timpul de execuie poate cel mult
O(nlg n). Aceast estimare este corect, dar nu este sucient de tare asimptotic.
Vom obine o limit mai tare observnd c timpul de execuie a procedurii Reconstituie-
Heap depinde de nlimea nodului n arbore, aceasta ind mic pentru majoritatea nodurilor.
Estimarea noastr mai riguroas se bazeaz pe faptul c un heap avnd n elemente are nlimea
lg n (vezi exerciiul 7.1-2) i c pentru orice nlime h, n heap exist cel mult n/2
h+1
| noduri
de nlime h (vezi exerciiul 7.3-3).
124 Capitolul 7 Heapsort
Figura 7.3 Modul de execuie a procedurii Construiete-Heap. n gur se vizualizeaz structurile
de date n starea lor anterioar apelului procedurii Reconstituie-Heap (linia 3 din procedura
Construiete-Heap). (a) Se consider un vector A avnd 10 elemente i arborele binar corespunztor.
Dup cum se vede n gur, variabila de control i a ciclului, n momentul apelului Reconstituie-
Heap(A, i), indic nodul 5. (b) reprezint rezultatul; variabila de control i a ciclului acum indic nodul
4. (c) - (e) vizualizeaz iteraiile succesive ale ciclului pentru din Construiete-Heap. Se observ
c, atunci cnd se apeleaz procedura Reconstituie-Heap pentru un nod dat, subarborii acestui nod
sunt deja heap-uri. (f ) reprezint heap-ul nal al procedurii Construiete-Heap.
7.4. Algoritmul heapsort 125
Timpul de execuie a procedurii Reconstituie-Heap pentru un nod de nlime h ind
O(h), obinem pentru timpul de execuie a procedurii Construiete-Heap:
|lg n|

h=0

n
2
h+1

O(h) = O

n
|lg n|

h=0
h
2
h

. (7.2)
Ultima nsumare poate evaluat prin nlocuirea x = 1/2 n formula (3.6). Obinem

h=0
h
2
h
=
1/2
(1 1/2)
2
= 2. (7.3)
Astfel, timpul de execuie al procedurii Construiete-Heap poate estimat ca ind:
O

n
|lg n|

h=0
h
2
h

= O

h=0
h
2
h

= O(n). (7.4)
De aici rezult c se poate construi un heap dintr-un vector ntr-un timp liniar.
Exerciii
7.3-1 Utiliznd ca model gura 7.3, ilustrai modul de funcionare al procedurii Construiete-
Heap pentru vectorul A = '5, 3, 17, 10, 84, 19, 6, 22, 9`.
7.3-2 De ce trebuie micorat variabila de control i a ciclului n linia 2 a procedurii
Construiete-Heap de la lungime[A]/2| la 1, n loc s e mrit de la 1 la lungime[A]/2|?
7.3-3 Artai c, ntr-un heap de nlime h avnd n elemente, numrul nodurilor este cel
mult n/2
h+1
|.
7.4. Algoritmul heapsort
Algoritmul heapsort ncepe cu apelul procedurii Construiete-Heap n scopul transformrii
vectorului de intrare A[1..n] n heap, unde n = lungime[A]. Deoarece cel mai mare element al
vectorului este ataat nodului rdcin A[1], acesta va ocupa locul denitiv n vectorul ordonat
prin interschimbarea sa cu A[n]. n continuare, excluznd din heap cel de-al n-lea element (i
micornd cu 1 dimesiune-heap[A]), restul de A[1..(n 1)] elemente se pot transforma uor n
heap, deoarece subarborii nodului rdcin au proprietatea de heap (7.1), cu eventuala excepie
a elementului ajuns n nodul rdcin.
Heapsort(A)
1: Construiete-Heap(A)
2: pentru i lungime[A], 2 execut
3: schimb A[1] A[i]
4: dimesiune-heap[A] dimesiune-heap[A] 1
5: Reconstituie-Heap(A, 1)
126 Capitolul 7 Heapsort
Apelnd procedura Reconstituie-Heap(A, 1) se restabilete proprietatea de heap pentru
vectorul A[1..(n 1)]. Acest procedeu se repet micornd dimensiunea heap-ului de la n 1 la
2.
Figura 7.4 ilustreaz, pe un exemplu, modul de funcionare a procedurii Heapsort, dup
ce n prealabil datele au fost transformate n heap. Fiecare heap reprezint starea iniial la
nceputul pasului iterativ (linia 2 din ciclul pentru).
Timpul de execuie al procedurii Heapsort este O(nlg n), deoarece procedura Constru-
iete-Heap se execut ntr-un timp O(n), iar procedura Reconstituie-Heap, apelat de n1
ori, se execut n timpul O(lg n).
Exerciii
7.4-1 Utiliznd ca model gura 7.4, ilustrai modul de funcionare al procedurii Heapsort
pentru vectorul A = '5, 13, 2, 25, 7, 17, 20, 8, 4`.
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?
7.4-3 Artai c timpul de execuie al algoritmului heapsort este (nlg n).
7.5. Cozi de prioriti
Heapsort este un algoritm excelent, dar o implementare bun a algoritmului de sortare rapid,
algoritm prezentat n capitolul 8, se poate dovedi de multe ori mai ecient. n schimb, structura
de date heap este foarte util. n aceast seciune vom prezenta una din cele mai frecvente
aplicaii ale unui heap: utilizarea lui sub forma unei cozi de prioriti.
Coada de prioriti este o structur de date care conine o mulime S de elemente, ecare
avnd asociat o valoare numit cheie. Asupra unei cozi de prioriti se pot efectua urmtoarele
operaii.
Insereaz(S, x) insereaz elementul x n mulimea S. Aceast operaie poate scris n felul
urmtor: S S x.
Maxim(S) returneaz elementul din S avnd cheia cea mai mare.
Extrage-Max(S) elimin i returneaz elementul din S avnd cheia cea mai mare.
O aplicaie a cozilor de prioriti const n planicarea lucrrilor pe calculatoare partajate.
Sarcinile care trebuie efectuate i prioritile relative se memoreaz ntr-o coad de prioritate.
Cnd o lucrare este terminat sau ntrerupt, procedura Extrage-Max va selecta lucrarea
avnd prioritatea cea mai mare dintre lucrrile n ateptare. Cu ajutorul procedurii Inserare,
n coad poate introdus oricnd o lucrare nou.
O coad de prioriti poate utilizat i n simularea unor evenimente controlate. Din coad
fac parte evenimentele de simulat, ecruia atandu-i-se o cheie reprezentnd momentul cnd va
avea loc evenimentul. Evenimentele trebuie simulate n ordinea desfurrii lor n timp, deoarece
simularea unui eveniment poate determina necesitatea simulrii altuia n viitor. n cazul acestei
aplicaii, este evident c ordinea evenimentelor n coada de prioriti trebuie inversat, iar
7.5. Cozi de prioriti 127
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
procedurile Maxim i Extrage-Max se vor nlocui cu Minim i Extrage-Min. Programul
de simulare va determina urmtorul eveniment cu ajutorul procedurii Extrage-Min, iar dac
va trebui introdus un nou element n ir, se va apela procedura Inserare.
Rezult n mod resc faptul c o coad de prioriti poate implementat utiliznd un heap.
Operaia Maxim-Heap va determina n timpul (1) cel mai mare element al heap-ului care, de
fapt, este valoarea A[1]. Procedura Extrage-Max-Din-Heap este similar structurii repetitive
pentru (liniile 35) din procedura Heapsort:
Extrage-Max-Din-Heap(A)
1: dac dimesiune-heap[A] < 1 atunci
2: eroare depire inferioar heap
3: max A[1]
4: A[1] A[dimesiune-heap[A]]
5: dimesiune-heap[A] dimesiune-heap[A] 1
6: Reconstituie-Heap(A, 1)
7: returneaz maxim
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 denitiv 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
n gura 7.5 este ilustrat un exemplu al operaiei Insereaz-n-Heap. Timpul de execuie
al procedurii Insereaz-n-Heap, pentru un heap avnd n elemente, este O(lg n), deoarece
drumul parcurs de la noua frunz ctre rdcin are lungimea O(lg n).
n concluzie, pe un heap se poate efectua orice operaie specic unei cozi de prioriti,
denit pe o mulime avnd n elemente, ntr-un timp O(lg n).
Exerciii
7.5-1 Utiliznd ca model gura 7.5, ilustrai operaia Insereaz-n-Heap(A, 10) pentru heap-
ul A = '15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1`.
7.5-2 Dat ind heap-ul A = '15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1`, ilustrai operaia Extrage-Max-
Din-Heap.
7.5. Cozi de prioriti 129
Figura 7.5 Operaia Insereaz-n-Heap. (a) Heap-ul din gura 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 denite n seciunea 11.1.)
7.5-4 Scriei o implementare a procedurii Heap-Cu-Chei-Cresctoare(A, i, k) de timp
O(lg n), care realizeaz atribuirea A[i] max(A[i], k), i actualizeaz structura heap n mod
corect.
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(nlg k) pentru a interclasa k liste ordonate, unde n este
numrul total de elemente din listele de intrare. ( se utilizeaz un heap)
130 Capitolul 7 Heapsort
Probleme
7-1 Construirea unui heap prin inserare
Procedura Construiete-Heap, din seciunea 7.3, poate implementat folosind, n mod
repetat, procedura Inserare-n-Heap, n scopul inserrii elementelor n heap. Fie urmtoarea
implementare:
Construiete-Heap
t
(A)
1: dimesiune-heap[A] 1
2: pentru i 2, lungime[A] execut
3: Insereaz-n-Heap(A, A[i])
a. Pentru date de intrare identice, procedurile Construiete-Heap i Construiete-
Heap
t
construiesc acelai heap? Demonstrai sau gsii contraexemple.
b. Artai c, n cazul cel mai defavorabil, procedura Construiete-Heap
t
cere un timp
(nlg n) pentru a construi un heap avnd n elemente.
7-2 Analiza heap-urilor d-are
Un heap d-ar este asemntor unui heap binar, dar nodurile nu au doi ci d descendeni.
a. Cum se poate reprezenta un heap d-ar sub forma unui vector?
b. Care este nlimea (n funcie de n i d) a unui heap d-ar, avnd n elemente?
c. Descriei o implementare ecient pentru operaia Extrage-Max. Analizai timpul de
execuie n funcie de n i d.
d. Descriei o implementare ecient pentru operaia Inserare. Analizai timpul de execuie
n funcie de n i d.
e. Descriei o implementare ecient pentru operaia Heap-Cu-Chei-Cresctoare(A, i, k)
care realizeaz A[i] max(A[i], k) i actualizeaz structura heap n mod corect. Analizai
timpul de execuie n funcie de d i n.
Note bibliograce
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 (n
2
), 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 (nlg n), i constanta
ascuns n formula (nlg 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(n
2
), iar timpul mediu O(nlg n).
8.1. Descrierea sortrii rapide
Algoritmul de sortare rapid, ca de altfel i algoritmul de sortare prin interclasare, se bazeaz
pe paradigma divide i stpnete, introdus n seciunea 1.3.1. Iat un proces divide i
stpnete n trei pai, pentru un subir A[p..r].
Divide: irul A[p..r] este mprit (rearanjat) n dou subiruri nevide A[p..q] i A[q + 1..r],
astfel nct ecare element al subirului A[p..q] s e 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.
Descrierea algoritmului este urmtoarea:
Quicksort(A, p, r)
1: dac p < r atunci
2: q Partiie(A, p, r)
3: Quicksort(A, p, q)
4: Quicksort(A, q + 1, r)
Pentru ordonarea ntregului ir A, iniial se apeleaz Quicksort(A, 1, [A]).
132 Capitolul 8 Sortarea rapid
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 j 1
7: pn cnd A[j] x
8: repet
9: i i + 1
10: pn cnd A[i] x
11: dac i < j atunci
12: interschimb A[i] A[j]
13: altfel
14: returneaz j
n gura 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 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 ecare element al irului A[p..i] s e 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 e 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 innit. 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 gura 8.1 drept model, s se ilustreze operaiile procedurii Partiie n cazul
vectorului A = '13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21`.
8.1-2 Ce valoare a lui q returneaz procedura Partiie, dac toate elementele vectorului A[p..r]
sunt egale.
8.1-3 S se argumenteze, pe scurt, armaia c timpul de execuie al procedurii Partiie,
pentru un vector de n elemente, este (n).
8.1-4 Cum trebuie modicat procedura Quicksort pentru a ordona descresctor?
8.2. Performana algoritmului de sortare rapid
Timpul de execuie al algoritmului de sortare rapid depinde de faptul c partiionarea este
echilibrat sau nu, iar acesta din urm de elementele alese pentru partiionare. Dac partiionarea
este echilibrat, algoritmul asimptotic este la fel de rapid ca sortarea prin interclasare. n cazul
n care partiionarea nu este echilibrat, algoritmul se execut la fel de ncet ca sortarea prin
inserare. n aceast seciune vom investiga, fr rigoare matematic, performana algoritmului
de sortare rapid n cazul partiionrii echilibrate.
134 Capitolul 8 Sortarea rapid
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 (n
2
).
Partiionarea n cazul cel mai defavorabil
Comportarea cea mai defavorabil a algoritmului de sortare rapid apare n situaia n care
procedura de partiionare produce un vector de n1 elemente i unul de 1 element. (Demonstraia
se face n seciunea 8.4.1) S presupunem c aceast partiionare dezechilibrat apare la ecare
pas al algoritmului. Deoarece timpul de partiionare este de (n), i T(1) = (1), formula
recursiv pentru timpul de execuie a algoritmului de sortare rapid este:
T(n) = T(n 1) + (n).
Pentru evaluarea formulei de mai sus, observm c T(1) = (1), apoi iterm formula:
T(n) = T(n 1) + (n) =
n

k=1
(k) =

k=1
k

= (n
2
).
Ultima egalitate se obine din observaia c

n
k=1
k este o progresie aritmetic (3.2). n gura
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 ecare pas recursiv al algoritmului, atunci
timpul de execuie este (n
2
). 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 (n
2
)
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).
Partiionarea n cazul cel mai favorabil
Dac algoritmul de partiionare produce doi vectori de n/2 elemente, algoritmul de sortare
rapid lucreaz mult mai repede. Formula de recuren n acest caz este:
T(n) = 2T(n/2) + (n)
8.2. Performana algoritmului de sortare rapid 135
Figura 8.3 Arborele de recuren pentru Quicksort cnd procedura Partiie produce ntotdeauna
pri egale (cazul cel mai favorabil). Timpul de execuie rezultat este (nlg n).
a crei soluie este T(n) = (nlg n) (dup cazul 2 al teoremei 4.1). Deci partiionarea cea mai
bun produce un algoritm de sortare mult mai rapid. n gura 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 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 simplicare, n loc de (n) s-a pus n. Arborele de recuren corespunztor se
gsete n gura 8.4. S observm c la ecare nivel al arborelui costul este n pn cnd la
adncimea log
10
n = (lg n) se atinge o condiie iniial. n continuare, la celelalte niveluri,
costul nu depete valoarea n. Apelul recursiv se termin la adncimea log
10/9
n = (lg n).
Costul total al algoritmului de sortare rapid este deci (nlg n). Ca urmare, cu o partiionare
n proporie de 9 la 1 la ecare nivel al partiionrii (care intuitiv pare a total dezechilibrat),
algoritmul de sortare rapid are un timp de execuie de (nlg n) asimptotic acelai ca n cazul
partiionrii n dou pri egale. De fapt, timpul de execuie va O(nlg n) i n cazul partiionrii
ntr-o proporie de 99 la 1. La orice partiionare ntr-o proporie , adncimea arborelui
de recursivitate este (lg n) i costul, la ecare nivel, este O(n). Deci timpul de execuie este
(nlg n) la orice partiionare ntr-o proporie constant.
Intuirea comportrii medii
Pentru a avea o idee clar asupra comportrii medii a algoritmului de sortare rapid, trebuie
s facem presupuneri asupra frecvenei anumitor intrri. Cea mai evident presupunere este c
136 Capitolul 8 Sortarea rapid
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 (nlg 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 ecare nivel, cum am presupus n discuiile anterioare. Este de ateptat ca
unele partiionri s e 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 simplicare, c partiionrile bune i rele
alterneaz pe niveluri, i c partiionrile bune corespund celui mai bun caz, iar cele rele celui
mai defavorabilcaz. n gura 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 ecare, 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 gura 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 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(nlg 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 ecare. (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 (nlg n).
8.2-2 Demonstrai c, n cazul unui vector A avnd n elemente distincte, ordonate descresctor,
timpul de execuie al algoritmului Quicksort este (n
2
).
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-4 S presupunem c partiionarea la ecare nivel, n cadrul algoritmului de sortare rapid,
se face ntr-o proporie de 1 la , unde 0 < 1/2 i este constant. Demonstrai c, n
arborele de recuren, adncimea minim a unui nod terminal este aproximativ lg n/ lg , pe
cnd adncimea maxim este aproximativ lg n/ lg(1 ). (Nu se va ine cont de rotunjiri.)
8.2-5 Argumentai armaia 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?
8.3. Variantele aleatoare ale sortrii rapide
n analiza comportrii medii a algoritmului de sortare rapid, am presupus c toate permut-
rile elementelor de intrare sunt la fel de probabile. Muli consider c, dac aceast presupunere
este adevrat, algoritmul de sortare rapid, este cea mai bun soluie pentru a sorta vectori de
dimensiuni mari. Totui, nu ne putem atepta ca, n practic aceasta s se ntmple ntotdeauna
138 Capitolul 8 Sortarea rapid
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 o distribuie de date de intrare, este de 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 ecare
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 modicare
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 aleatoare.)
Aceast variant a algoritmului de sortare rapid (ca de altfel muli ali algoritmi aleatori) are
interesanta proprietate c, practic, .
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 e 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 puine permutri.
O strategie aleatoare este de obicei util cnd exist multe moduri n care un algoritm se poate
executa, dar este dicil s determinm un mod care s e 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 beneciile
unei decizii bune sunt mult mai mari dect costurile unor decizii rele, o selecie aleatoare de decizii
bune i rele poate determina un algoritm ecient. 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 modicarea procedurii Partiie, se poate obine o variant nou a algoritmului de
sortare rapid care folosete aceast strategie de alegere aleatoare. La ecare pas al sortrii
rapide, nainte de partiionarea vectorului, interschimbm elementul A[p] cu un element ales
aleator din vectorul A[p..r]. Aceast modicare asigur ca elementul pivot x = A[p] s e,
cu aceeai probabilitate, orice element dintre cele r p + 1 elemente ale vectorului. Astfel,
partiionarea vectorului de intrare poate , n medie, rezonabil de echilibrat. Algoritmul aleator,
bazat pe permutarea elementelor de intrare, are i el o comportare medie bun, dar ceva mai
dicil de studiat dect aceast versiune.
Modicrile 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)
Noul algoritm de sortare rapid folosete n loc de Partiie procedura Partiie-Aleatoare:
Quicksort-Aleator(A, p, r)
1: dac p < r atunci
2: q Partiie-Aleatoare(A, p, r)
3: Quicksort-Aleator(A, p, q)
4: Quicksort-Aleator(A, q + 1, r)
Analiza algoritmului se va face n seciunea urmtoare.
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 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.
8.4. Analiza algoritmului de sortare rapid
Rezultatul studiului intuitiv din seciunea 8.2 ne face s credem c algoritmul de sortare
rapid are o comportare bun. n aceast seciune vom face o analiz mai riguroas. ncepem cu
analiza cazului celui mai defavorabil, att pentru algoritmul Quicksort ct i pentru algoritmul
Quicksort-Aleator, i terminm cu analiza cazului mediu pentru algoritmul Quicksort-
Aleator.
8.4.1. Analiza celui mai defavorabil caz
Am vzut, n seciunea 8.2, c mprirea cea mai rea la ecare nivel ne conduce la timpul de
execuie al algoritmului (n
2
), care, intuitiv, reprezint comportarea n cazul cel mai defavorabil.
n continuare vom demonstra aceast armaie.
Folosind metoda substituiei (vezi seciunea 4.1), se poate demonstra c timpul de execuie
al algoritmului Quicksort este O(n
2
). Fie T(n) timpul de execuie al algoritmului de sortare
140 Capitolul 8 Sortarea rapid
rapid, n cazul cel mai defavorabil, pentru o intrare de dimensiunea n. Avem urmtoarea formul
de recuren
T(n) = max
1qn1
(T(q) +T(n q)) + (n), (8.1)
unde parametrul q parcurge valorile ntre 1 i n1, deoarece procedura Partiie produce dou
subiruri, avnd ecare, cel puin un element. Presupunem c T(n) cn
2
, pentru o constant c.
nlocuind n formula (8.1), obinem urmtoarele:
T(n) max
1qn1
(cq
2
+c(n q)
2
) + (n) = c max
1qn1
(q
2
+ (n q)
2
) + (n).
Expresia q
2
+(n q)
2
atinge valoarea sa maxim n domeniul de valori 1 q n 1 la una
din extreme, deoarece derivata a doua, dup q a expresiei, este pozitiv (vezi exerciiul 8.4-2).
Deci, avem
max
1qn1
(q
2
+ (n q)
2
) 1
2
+ (n 1)
2
= n
2
2(n 1).
Continund majorarea lui T(n), obinem:
T(n) cn
2
2c(n 1) + (n) cn
2
,
deoarece constanta c poate aleas sucient de mare, astfel nct termenul 2c(n 1) s domine
termenul (n). Rezult c timpul de execuie (cel mai defavorabil) al algoritmului de sortare
rapid este (n
2
).
8.4.2. Analiza cazului mediu
Am explicat deja, intuitiv, de ce timpul mediu de execuie al algoritmului Quicksort-
Aleator este (nlg n): dac procedura Partiie-Aleatoare mparte vectorul, la ecare nivel,
n aceeai proporie, atunci adncimea arborelui de recuren este (lg n), i timpul de execuie la
ecare nivel este (n). Pentru a putea analiza mai exact timpul mediu de execuie al algoritmului
Quicksort-Aleator, va trebui s nelegem esena procedurii de partiionare. n continuare,
vom putea gsi o formul de recuren pentru timpul mediu de execuie, necesar pentru sortarea
unui vector de dimensiune n. Ca parte a procesului de rezolvare a recurenei, vom gsi margini
tari pentru o sum interesant.
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 simplicare, 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(nlg 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
aleator din vectorul A[p..r], probabilitatea ca rang(x) = i (unde i = 1, 2, . . . , n) este egal cu
1/n.
Vom calcula, n continuare, probabilitatea diferitelor rezultate ale procedurii de partiionare.
Dac rang(x) = 1, atunci, n procedura Partiie, la prima execuie a ciclului ct timp din
liniile 414, variabilele i i j vor primi aceeai valoare p. Deci, cnd procedura returneaz valoarea
q = j, n primul subir, singurul element va A[p]. Probabilitatea acestui caz este 1/n, deoarece
aceasta este probabiltatea ca rang(x) s e egal cu 1.
Dac rang(x) 2, atunci, exist cel puin un element care este mai mic dect x = A[p]. n
consecin, la prima trecere prin ciclul ct timp variabila i va avea valoarea egal cu p, iar j
nu va atinge valoarea p. Deci, prin interschimbarea a dou elemente ntre ele, elementul A[p]
ajunge n al doilea subir. Cnd procedura Partiie se termin, ecare dintre cele rang(x) 1
elemente, care se a n primul subir, vor mai mici sau egale cu x. Deci, cnd rang(x) 2,
probabilitatea ca n primul subir s e i elemente (pentru orice i = 1, 2, . . . , n 1) este egal
cu 1/n.
Combinnd cele dou cazuri, putem trage concluzia c dimensiunea qp+1, a primului subir,
este egal cu 1, cu probabilitatea 2/n, iar aceast dimensiune este egal cu i (i = 2, 3, . . . , n1),
cu probabilitatea 1/n.
O relaie de recuren pentru cazul mediu
Vom da n continuare o formul de recuren pentru timpul mediu de execuie al algoritmului
Quicksort-Aleator. Fie T(n) timpul mediu necesar ordonrii unui vector avnd n elemente.
Un vector de 1 element poate ordonat cu procedura Quicksort-Aleator n timp constant,
deci T(1) = (1). Procedura Quicksort-Aleator partiioneaz vectorul A[1..n] de dimensiune
n n (n) uniti de timp. Procedura Partiie returneaz un indice q, iar Quicksort-Aleator
este apelat recursiv pentru un vector de q elemente i pentru unul cu nq elemente. Deci timpul
mediu pentru ordonarea unui vector, avnd n elemente, se poate exprima astfel:
T(n) =
1
n

T(1) +T(n 1) +
n1

q=1
(T(q) +T(n q))

+ (n). (8.2)
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(n
2
) (din analiza celui mai defavorabil caz), se poate scrie:
1
n
(T(1) +T(n 1)) =
1
n
((1) +O(n
2
)) = O(n),
i astfel termenul (n), n formula (8.2), poate absorbi expresia
1
n
(T(1) + T(n 1)). Astfel,
formula de recuren (8.2) poate scris sub forma:
T(n) =
1
n
n1

q=1
(T(q) +T(n q)) + (n). (8.3)
Se poate observa c, pentru k = 1, 2, . . . , n 1, ecare 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 nal va :
T(n) =
2
n
n1

k=1
T(k) + (n). (8.4)
142 Capitolul 8 Sortarea rapid
Rezolvarea ecuaiei de recuren
Vom putea rezolva ecuaia de recuren (8.4) folosind metoda substituiei. S presupunem
c T(n) anlg n +b, pentru un a > 0 i b > 0. Valorile a i b pot alese destul de mari, astfel
nct anlg n +b s e mai mare dect T(1). Pentru n > 1 avem:
T(n) =
2
n
n1

k=1
T(k) + (n)
2
n
n1

k=1
(ak lg k +b) + (n) =
=
2a
n
n1

k=1
k lg k +
2b
n
(n 1) + (n).
Vom arta, mai trziu, c ultima sum poate majorat astfel:
n1

k=1
k lg k
1
2
n
2
lg n
1
8
n
2
. (8.5)
Folosind aceast majorare, se obine:
T(n)
2a
n

1
2
n
2
lg n
1
8
n
2

+
2b
n
(n 1) + (n)
anlg n
a
4
n + 2b + (n) = anlg n +b +

(n) +b
a
4
n

anlg n +b,
deoarece valoarea lui a poate aleas astfel nct
a
4
n s domine expresia (n) +b. Se poate deci
trage concluzia c timpul mediu de execuie a algoritmului de sortare rapid este O(nlg n).
Margini strnse pentru nsumarea cu chei
Trebuie s mai demonstrm marginea (8.5) a sumei

n1
k=1
k lg k.
Deoarece ecare termen al sumei este cel mult nlg n, se poate scrie:
n1

k=1
k lg k n
2
lg n,
formul care reprezint o estimare destul de precis, abstracie fcnd de o constant, dar nu
este sucient de puternic pentru a obine T(n) = O(nlg n) ca soluie a recurenei. Pentru a
obine soluia de mai sus, avem nevoie de o margine de forma
1
2
n
2
lg n (n
2
).
Aceast margine se poate obine folosind metoda de mprire a sumei n dou, ca n seciunea
3.2. Vom obine:
n1

k=1
k lg k =
|n/2|1

k=1
k lg k +
n1

k=|n/2|
k lg k.
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

k=1
k lg k (lg n 1)
|n/2|1

k=1
k + lg n
n1

k=|n/2|
k = lg n
n1

k=1
k
|n/2|1

k=1
k
Probleme 143

1
2
n(n 1) lg n
1
2

n
2
1

n
2

1
2
n
2
lg n
1
8
n
2
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 (nlg n).
8.4-2 Demonstrai c expresia q
2
+ (n q)
2
, unde q = 1, 2, . . . , n 1, atinge maximul pentru
q = 1 sau q = n 1.
8.4-3 Demonstrai c timpul mediu de execuie al lui Quicksort-Aleator este (nlg 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 armaia c acest algoritm de sortare are un timp
mediu de execuie O(nk +nlg(n/k)). Cum trebuie aleas valoarea lui k, teoretic i practic?
8.4-5 Demonstrai urmtoarea identitate:

xlnxdx =
1
2
x
2
lnx
1
4
x
2
,
i, folosind metoda de calculul aproximativ al integralei, dai o margine mai bun dect cea din
(8.5) pentru

n1
k=1
k lg k.
8.4-6 Modicai 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 armaia 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 niciodat egal cu r (astfel,
partiionarea nu este niciodat trivial).
c. La terminarea partiionrii ecare element din A[p..j] este mai mic sau egal cu orice element
din A[j + 1..r].
144 Capitolul 8 Sortarea rapid
8-2 Algoritmul de partiionare a lui Lomuto
Considerm urmtoarea variant a procedurii Partiie, dat de N. Lomuto. Vectorul A[p..r] se
mparte n vectorii A[p..i] i A[i + 1..j] astfel nct ecare element din primul vector este mai
mic sau egal cu x = A[r] i ecare element din cel de al doilea vector este mai mare ca x.
Partiie-Lomuto(A, p, r)
1: x A[r]
2: i p 1
3: pentru j p, r execut
4: dac A[j] x atunci
5: i i + 1
6: interschimb A[i] A[j]
7: dac i < r atunci
8: returneaz i
9: altfel
10: returneaz i 1
a. Argumentai c procedura Partiie-Lomuto este corect.
b. Cel mult, de cte ori poate mutat un element n procedura Partiie? Dar n procedura
Partiie-Lomuto?
c. Argumentai c timpul de execuie al procedurii Partiie-Lomuto, ca de altfel i al
procedurii Partiie, pe un subir de n elemente, este (n).
d. Cum afecteaz, nlocuirea procedurii Partiie cu procedura Partiie-Lomuto, timpul
de execuie al algoritmului de sortare rapid Quicksort cnd toate datele de intrare sunt
egale?
e. Denii o procedur Partiie-Lomuto-Aleatoare care interschimb elementul A[r] cu
un element ales aleator din vectorul A[p..r], apoi apeleaz procedura Partiie-Lomuto.
Demonstrai c probabilitatea ca procedura Partiie-Lomuto-Aleatoare s returneze
valoarea q, este aceeai cu probabilitatea ca procedura Partiie-Aleatoare s returneze
valoarea p +r q.
8-3 Sortare circular
Profesorii Howard, Fine i Howard au propus urmtorul algoritm elegant pentru sortare:
Sorteaz-Circular(A, i, j)
1: dac A[i] > A[j] atunci
2: interschimb A[i] A[j]
3: dac i + 1 j atunci
4: revenire
5: k (j i + 1)/3| Trunchiere.
6: Sorteaz-Circular(A, i, j k) Primele dou-treimi.
7: Sorteaz-Circular(A, i +k, j) Ultimele dou-treimi.
8: Sorteaz-Circular(A, i, j k) Primele dou-treimi din nou.
Probleme 145
a. Demonstrai c Sorteaz-Circular(A, 1, [A]) ordoneaz corect vectorul de in-
trare A[1..n], unde n = [A].
b. Determinai o formul de recuren, pentru timpul de execuie al procedurii Sorteaz-
Circular, i o margine asimptotic tare (folosind notaia ), pentru timpul de execuie,
n cazul cel mai defavorabil.
c. Comparai timpul de execuie al algoritmului Sorteaz-Circular, n cazul cel mai de-
favorabil, cu timpii corespunztori ai algoritmilor de sortare prin inserare, sortare prin
interclasare, heapsort i sortare rapid. Merit profesorii s e felicitai?
8-4 Adncimea stivei pentru algoritmul de sortare rapid
Algoritmul Quicksort, prezentat n seciunea 8.1, se autoapeleaz de dou ori. Dup apelul
procedurii Partiie, este sortat recursiv primul subir, apoi subirul al doilea. Al doilea apel
recursiv din Quicksort nu este neaprat necesar, el poate evitat prin folosirea unei structuri de
control iterative. Aceast tehnic, numit recursivitate de coad, este oferit n mod automat
de compilatoarele mai bune. Se consider urmtoarea variant a algoritmului de sortare rapid,
care simuleaz recursivitatea de coad:
Quicksort
t
(A, p, r)
1: ct timp p < r execut
2: Partiionarea i sortarea primului subir
3: q Partiie(A, p, r)
4: Quicksort
t
(A, p, q)
5: p q + 1
a. Artai c algoritmul Quicksort
t
(A, 1, [A]) sorteaz corect vectorul A.
Compilatoarele, de obicei, execut apelurile recursive, folosind o stiv care conine infor-
maii pertinente, inclusiv valorile parametrilor la ecare apel. Informaiile referitoare la cel
mai recent apel se gsesc n vrful stivei, pe cnd informaiile referitoare la primul apel
se pstreaz la baza stivei. Cnd se apeleaz o procedur, informaiile sale se depun n
vrful stivei (operaia push), iar la terminarea execuiei, aceste informaii se scot din stiv
(operaia pop). Deoarece presupunem c parametrii vectorului se reprezint cu ajutorul
pointerilor, informaiile necesare ecrui apel necesit un spaiu de stiv de O(1) uniti.
Adncimea stivei este spaiul maxim utilizat de stiv, n timpul execuiei algoritmului.
b. Descriei un scenariu n care, pentru un vector de intrare de dimensiune n, adncimea
stivei algoritmului Quicksort
t
este (n).
c. Modicai textul algoritmului Quicksort
t
astfel nct adncimea stivei, n cazul cel mai
defavorabil, s e (lg n). Pstrai valoarea O(nlg n) pentru timpul mediu de execuie a
algoritmului.
8-5 Partiionare mijlocul-din-3
O metod prin care procedura Quicksort-Aleator poate mbuntit este de a face
partiionarea n jurul unui element x, ales mai atent dect aleator. O metod obinuit poate
metoda mijlocul-din-3, care const n a alege elementul mijlociu ca mrime, dintre trei elemente
146 Capitolul 8 Sortarea rapid
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 A
t
[1..n] vectorul sortat
rezultat. Fie p
i
= Prx = A
t
[i] probabilitatea ca elementul pivot x, ales cu metoda mijlocul-
din-3, s e al i-lea element n vectorul de ieire.
a. Dai o formul exact pentru p
i
n funcie de n i i, pentru i = 2, 3, . . . , n1. (S observm
c p
1
= p
n
= 0.)
b. Cu ct crete probabilitatea alegerii ca pivot a elementului x = A
t
[(n + 1)/2|], 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 =
A
t
[i], unde n/3 i 2n/3, atunci cu ct crete probabilitatea obinerii unei mpriri
bune fa de implementarea original? ( Aproximai suma cu o integral.)
d. Artai c metoda mijlocul-din-3 afecteaz numai factorul constant din expresia (nlg n)
a timpului de execuie al algoritmului de sortare rapid.
Note bibliograce
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(nlg 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
ecare din aceti algoritmi putem efectiv obine cte o secven de n numere de intrare care
determin execuia algoritmului n timpul (nlg n).
Aceti algoritmi au o proprietate interesant:
. 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, (nlg 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 e 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 (nlg n).
9.1. Margini inferioare pentru sortare
ntr-o sortare prin comparaii folosim numai comparaiile dintre elemente pentru a ctiga
informaii de ordine despre o secven de intrare 'a
1
, a
2
, ..., a
n
`. Respectiv, date ind elementele
a
i
i a
j
, facem testele a
i
< a
j
, a
i
a
j
, a
i
= a
j
, a
i
a
j
, sau a
i
> a
j
pentru a determina ordinea
lor relativ. Nu putem s inspectm valorile elementelor sau s obinem informaii asupra ordinii
lor n nici un alt mod.
n aceast seciune vom presupune, fr a pierde din generalitate, c toate elementele de
intrare sunt distincte. Dat ind aceast presupunere, comparaiile de tipul a
i
= a
j
sunt nefolo-
sitoare, deci putem s armm c nu sunt fcute comparaii de acest fel. Studiind comparaiile
a
i
a
j
, a
i
a
j
, a
i
> a
j
i a
i
< a
j
observm c acestea sunt echivalente, deoarece aduc
informaie identic despre ordinea relativ a lui a
i
i a
j
. De aceea vom considera c toate com-
paraiile au forma a
i
a
j
.
Modelul arborelui de decizie
Sortrile prin comparaii pot viziualizate n mod abstract n termenii arborilor de decizie.
Un arbore de decizie reprezint comparaiile realizate de un algoritm de sortare cnd acesta
opereaz asupra unor date de intrare avnd o mrime dat. Controlul, micarea datelor i toate
celelalte aspecte ale algoritmului sunt ignorate. Figura 9.1 vizualizeaz un arbore de decizie
corespunztor algoritmului de sortare prin inserie din seciunea 1.1 ce opereaz cu o secven
de intrare avnd trei elemente.
148 Capitolul 9 Sortare n timp liniar
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 ecare nod intern este etichetat prin a
i
: a
j
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 '(1), (2), ..., (n)`. (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 ecare nod intern este fcut o comparaie
a
i
a
j
. Subarborele stng dicteaz comparaiile urmtoare pentru a
i
a
j
, iar subarborele
drept dicteaz comparaiile urmtoare pentru a
i
> a
j
. 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, ecare dintre cele n! permutri de n elemente trebuie s apar n dreptul unei
frunze a arborelui de decizie.
O margine inferioar n cel mai defavorabil caz
Lungimea celui mai lung drum de la rdcina unui arbore de decizie la oricare dintre frunzele
sale reprezint numrul de comparaii, n cel mai defavorabil caz, pe care le realizeaz algoritmul
de sortare. n consecin, numrul de comparaii, n cel mai defavorabil caz, pentru o sortare prin
comparaii corespunde nlimii arborelui de decizie. O margine inferioar a nlimilor arborilor
de decizie este astfel o margine inferioar a timpului de execuie al oricrui algoritm de sortare
prin comparaii. Urmtoarea teorem stabilete o astfel de margine inferioar.
Teorema 9.1 Orice arbore de decizie care sorteaz n elemente are nlimea (nlg n).
Demonstraie. S considerm un arbore de decizie avnd nlimea h i care sorteaz n ele-
mente. ntruct exist n! permutri ale celor n elemente, ecare permutare reprezentnd o ordine
distinct de sortare, arborele trebuie s aib cel puin n! frunze. Deoarece un arbore binar avnd
nlimea h nu are mai mult de 2
h
frunze, avem
n! 2
h
,
iar, prin logaritmare, rezult
h lg(n!),
deoarece funcia lg este monoton cresctoare. Din aproximarea lui Stirling (2.11), avem
n! >

n
e

n
,
9.2. Sortarea prin numrare 149
unde e = 2.71828... este baza logaritmilor naturali; astfel
h lg

n
e

n
= nlg n nlg e = (nlg 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(nlg n) asupra duratei timpilor de execuie corespund marginii inferioare (nlg 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 strnse la lg(n!) fr a folosi aproximaia Stirling. n loc de
aceast aproximaie, evaluai suma

n
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/2
n
?
9.1-4 Profesorul Solomon arm c marginea inferioar (nlg n) pentru sortarea a n numere nu
se aplic n cazul mediului de care dispune, unde dup o singur comparaie a
i
: a
j
, programul se
ramic n trei direcii, dup cum a
i
< a
j
, a
i
= a
j
respectiv a
i
> a
j
. Demonstrai c profesorul
nu are dreptate demonstrnd c numrul comparaiilor tridirecionale cerut de sortarea celor n
elemente este tot (nlg n).
9.1-5 Demonstrai c, pentru a interclasa dou liste ordonate ce conin ecare 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, ecare 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 sucient
sortarea celor k elemente din ecare dintre cele n/k subsecvene. Gsii o margine inferioar
(nlg k) a numrului de comparaii necesar pentru rezolvarea acestei variante a problemei de
sortare. ( combinarea simpl a marginilor inferioare pentru subecvenele individuale nu
este riguroas.)
9.2. Sortarea prin numrare
Sortarea prin numrare presupune c ecare dintre cele n elemente ale datelor de intrare
este un numr ntreg ntre 1 i k, pentru un numr ntreg k oarecare. Cnd k = O(n), sortarea
se execut n timpul O(n).
150 Capitolul 9 Sortare n timp liniar
Figura 9.2 Modul de funcionare al algoritmului Sortare-Prin-Numrare pe un tablou A[1..8] de
intrare, unde ecare element din tabloul A este un numr ntreg pozitiv nu mai mare dect k = 6. (a)
Tabloul A i tabloul auxiliar C dup liniei 4. (b) Tabloul C dup executarea liniei 7. (c)-(e) Tabloul
de ieire B i tabloul auxiliar C dup unul, dou, respectiv trei iteraii ale buclei din liniile 911. Doar
elementele haurate din tabloul B au fost completate. (f ) Tabloul B sortat, furnizat la ieire.
Ideea de baz n sortarea prin numrare este de a determina numrul de elemente mai mici
dect x, pentru ecare element x din datele de intrare. Acest informaie poate 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 pe poziia 18 n tabloul de ieire. Aceast schem trebuie
uor modicat 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 gura 9.2. Dup iniializarea din liniile
9.2. Sortarea prin numrare 151
12, n liniile 34 se contorizeaz ecare 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 ecare numr ntreg i = 1, 2, . . . , k. n liniile 67
se determin, pentru ecare 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 nal, n liniile 911, ecare 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 ecare A[j], valoarea C[A[j]] este poziia nal 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 e distincte, decrementm valoarea C[A[j]] de ecare 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 (nlg 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 (nlg 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 gura 9.2 ca model, ilustrai modul de operare al algoritmului Sortare-Prin-
Numrare pe tabloul A = '7, 1, 3, 1, 2, 4, 5, 7, 2, 4, 3`.
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 modicat astfel funcioneaz corect. Algoritmul modicat este stabil?
9.2-4 Se presupune c ieirea algoritmului de sortare este un ux de date, de exemplu, o aare
n mod grac. Modicai algoritmul Sortare-Prin-Numrare pentru a obine rezultatul n
ordinea sortat fr a utiliza vectori suplimentari n afara lui A i C. ( 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 ind 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).
9.3. Ordonare pe baza cifrelor
Ordonarea pe baza cifrelor este algoritmul folosit de ctre mainile de sortare a cartelelor,
care se mai gsesc la ora actual numai n muzeele de calculatoare. Cartelele sunt organizate n
80 de coloane, i ecare coloan poate perforat n 12 poziii. Sortatorul poate programat
mecanic s examineze o coloan dat a ecrei cartele dintr-un pachet i s distribuie ecare
cartela ntr-una dintre cele 12 cutii, n funcie de poziia perforat. Un operator poate apoi
s strng cartelele cutie cu cutie, astfel nct cartelele care au prima poziie perforat s e
deasupra cartelelor care au a doua poziie perforat .a.m.d.
Pentru cifre zecimale sunt folosite numai 10 poziii n ecare coloan. (Celelalte dou poziii
sunt folosite pentru codicarea caracterelor nenumerice). Un numr avnd d cifre ar ocupa un
cmp format din d coloane. ntruct sortatorul de cartele poate analiza numai o singur coloan
la un moment dat, problema sortrii a n cartele n funcie de un numr avnd d cifre necesit
un algoritm de sortare.
Intuitiv, am putea dori s sortm numere n funcie de cifr, s sortm
recursiv ecare dintre cutiile ce se obin, i apoi s combinm pachetele n ordine. Din nefericire,
ntruct cartelele din 9 dintre cele 10 cutii trebuie s e pastrate pentru a putea sorta ecare
dintre cutii, aceast procedur genereaz teancuri intermediare de cartele care trebuie urmrite.
(Vezi exerciiul 9.3-5.)
Ordonarea pe baza cifrelor rezolv problema sortrii cartelelor ntr-un mod care contrazice
intuiia, sortnd nti n funcie de cifr. Cartelele sunt apoi
combinate ntr-un singur pachet, cele din cutia 0 precednd cartelele din cutia 1, iar acestea
din urm precednd pe cele din cutia 2 i aa mai departe. Apoi ntregul pachet este sortat
din nou n funcie de a doua cifr cea mai puin semnicativ i recombinat apoi ntr-o manier
asemntoare. Procesul continu pn cnd cartelele au fost sortate pe baza tuturor celor d cifre.
De remarcat c n acel moment cartelele sunt complet sortate n funcie de numrul avnd d
cifre. Astfel, pentru sortare sunt necesare numai d treceri prin lista de numere. n gura 9.3 este
ilustrat modul de operare al algoritmului de ordonare pe baza cifrelor pe un pachet de apte
numere de cte trei cifre.
Este esenial ca sortarea cifrelor n acest algoritm s e stabil. Sortarea realizat de ctre
un sortator de cartele este stabil, dar operatorul trebuie s e atent s nu schimbe ordinea
cartelelelor pe msur ce acestea ies dintr-o cutie, chiar dac toate cartelele dintr-o cutie au
aceeai cifr n coloana aleas.
ntr-un calculator care funcioneaz pe baz de acces secvenial aleator, ordonarea pe baza
cifrelor este uneori utilizat pentru a sorta nregistrrile de informaii care sunt indexate cu chei
avnd cmpuri multiple. De exemplu, am putea dori s sortm date n funcie de trei parametri:
an, lun, zi. Am putea executa un algoritm de sortare cu o funcie de comparare care, considernd
dou date calendaristice, compar anii, i dac exist o legtur, compar lunile, iar dac apare
din nou o legtur, compar zilele. Alternativ, am putea sorta informaia de trei ori cu o sortare
9.3. Ordonare pe baza cifrelor 153
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 semnicaiei. Sgeile verticale indic poziia cifrei
dup care s-a sortat pentru a produce ecare 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, ecare 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
Corectitudinea algoritmului de ordonare pe baza cifrelor poate demonstrat prin inducie
dup coloanele care sunt sortate (vezi exerciiul 9.3-3). Analiza timpului de execuie depinde de
sortarea stabil folosit ca algoritm intermediar de sortare. Cnd ecare cifr este n intervalul
[1, k], iar k nu este prea mare, sortarea prin numrare este opiunea evident. Fiecare trecere
printr-o mulime de n numere a cte d cifre se face n timpul (n + k). Se fac d treceri, astfel
nct timpul total necesar pentru algoritmul de ordonare pe baza cifrelor este (dn +kd). Cnd
d este constant i k = O(n), algoritmul de ordonare pe baza cifrelor se execut n timp liniar.
Unii informaticieni consider c numrul biilor ntr-un cuvnt calculator este (lg n). Pentru
exemplicare, s presupunem c d lg n este numrul de bii, unde d este o constant pozitiv.
Atunci, dac ecare numr care va sortat ncape ntr-un cuvnt al calculatorului, l vom putea
trata ca pe un numr avnd d cifre reprezentat n baza n. De exemplu, s considerm sortarea a
1 milion de numere avnd 64 de bii. Tratnd aceste numere ca numere de patru cifre n baza 2
16
,
putem s le sortm pe baza cifrelor doar prin patru treceri, comparativ cu o sortare clasic prin
comparaii de timp (nlg n) care necesit aproximativ lg n = 20 de operaii pentru ecare numr
sortat. Din pcate, versiunea algoritmului de ordonare pe baza cifrelor care folosete sortarea
prin numrare ca sortare intermediar stabil nu sorteaz pe loc, lucru care se ntmpl n cazul
multora din sortrile prin comparaii de timp (nlg n). Astfel, dac se dorete ca necesarul de
memorie s e mic, atunci este preferabil algoritmul de sortare rapid.
Exerciii
9.3-1 Folosind gura 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, n
2
] 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?
9.4. Ordonarea pe grupe
Ordonarea pe grupe se execut, n medie, n timp liniar. Ca i sortarea prin numrare,
Ordonarea pe grupe este rapid pentru c face anumite presupuneri despre datele de intrare.
n timp ce sortarea prin numrare presupune c intrarea const din ntregi dintr-un domeniu
mic, ordonarea pe grupe presupune c intrarea este generat de un proces aleator care distribuie
elementele n mod uniform n intervalul [0, 1). (Vezi seciunea 6.2 pentru deniia distribuiei
uniforme.)
Principiul algoritmului de ordonare pe grupe este de a mpri intervalul [0, 1) n n
subintervale egale, numite grupe (engl. ) i apoi s distribuie cele n numere de intrare n
aceste grupe. ntruct datele de intrare sunt uniform distribuite n intervalul [0, 1), nu ne atep-
tm s e prea multe numere n ecare grup. Pentru a obine rezultatul dorit, sortm numerele
din ecare grup, apoi trecem prin ecare grup n ordine, listnd elementele din ecare.
Pseudocodul nostru pentru ordonarea pe grupe presupune c datele de intrare formeaz un
tablou A avnd n elemente i c ecare element A[i] satisface relaia 0 A[i] < 1. Codul necesit
un tablou auxiliar B[0..n1] de liste nlnuite (reprezentnd grupele) i presupune c exist un
mecanism pentru meninerea acestor liste. (n seciunea 11.2 se descrie cum se implementeaz
operaiile de baz pe listele nlnuite.)
Ordonare-Pe-Grupe(A)
1: n lungime[A]
2: pentru i 1, n execut
3: insereaz A[i] n lista B[nA[i]|]
4: pentru i 0, n 1 execut
5: sorteaz lista B[i] folosind sortarea prin inserie
6: concateneaz n ordine listele B[0] , B[1] , ..., B[n 1]
Figura 9.4 ilustreaz modul de funcionare al algoritmului de ordonare pe grupe pe un tablou
de intrare cu 10 numere.
Pentru a demonstra c acest algoritm funcioneaz corect, se consider dou elemente A[i] i
A[j]. Dac aceste elemente sunt distribuie n aceeai grup, ele apar n ordinea relativ adecvat
n secvena de ieire, deoarece grupa lor este sortat de sortarea prin inserie. S presupunem,
totui, c ele sunt distribuite n grupe diferite. Fie aceste grupe B[i
t
] i respectiv B[j
t
], i s
9.4. Ordonarea pe grupe 155
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 i
t
< j
t
. Cnd listele lui B sunt concatenate n
linia 6, elementele grupei B[i
t
] apar naintea elementelor lui B[j
t
], i astfel A[i] precede A[j] n
secvena de ieire. Deci trebuie s artm c A[i] A[j]. Presupunnd contrariul, avem
i
t
= nA[i]| nA[j]| = j
t
,
ceea ce este o contradicie, ntruct i
t
< j
t
. 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, e n
i
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

n
2
i

= O

n
2
i

.
n consecin, timpul mediu total necesar sortrii tuturor elementelor n toate grupele va
n1

i=0
O

n
2
i

= O

n1

i=0
E

n
2
i

. (9.1)
Pentru a evalua aceast sum trebuie s determinm distribuia pentru ecare variabil
aleatoare n
i
. Avem n elemente n n grupe. Probabilitatea ca un element dat s intre ntr-o grup
B[i] este 1/n, ntruct ecare 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 ecare minge este aruncat independent, cu
probabilitatea p = 1/n de a intra ntr-o anume grup. Astfel, probabilitatea ca n
i
= k urmeaz o
distribuie binomial b(k; n, p) care are media E [n
i
] = np = 1 i varianta V ar [n
i
] = np(1 p) =
156 Capitolul 9 Sortare n timp liniar
1 1/n. Pentru ecare variabil aleatoare X, ecuaia (6.30) este echivalent cu
E

n
2
i

= V ar [n
i
] +E
2
[n
i
] = 1
1
n
+ 1
2
= 2
1
n
= (1) .
Utiliznd acest salt n ecuaia (9.1) concluzionm c timpul mediu pentru sortarea prin inserie
este O(n). Astfel, ntregul algoritm de ordonare pe grupe se execut n timp mediu liniar.
9.4.1. Exerciii
9.4-1 Utiliznd ca model gura 9.4, ilustrai modul de funcionare al algoritmului Ordonare-
Pe-Grupe pe tabloul A = '.79, .13, .16, .64, .39, .20, .89, .53, .71, .42`.
9.4-2 Care este timpul de execuie n cazul cel mai defavorabil pentru algoritmul de ordonare
pe grupe? Ce modicare simpl a algoritmului pstreaz timpul mediu liniar de execuie i face
ca timpul de execuie n cazul cel mai defavorabil s e O(nlg n)?
9.4-3 Se dau n puncte n cercul unitate, p
i
= (x
i
, y
i
), astfel nct 0 < x
2
i
+ y
2
i
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 mediu (n) care s sorteze cele n puncte n funcie de distanele fa de origine
d
i
=

x
2
i
+y
2
i
. ( proiectai dimensiunile grupelor din Ordonarea-Pe-Grupe pentru
a reecta distribuia uniform a punctelor n cercul unitate.)
9.4-4 O funcie de distribuie a probabilitii P(x) pentru variabila aleatoare X este
denit de P(x) = PrX 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 (nlg 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
T
A
. Presupunem c ecare permutare a intrrilor lui A apare cu o probabilitate constant.
a. S presupunem c ecare frunz a lui T
A
este etichetat cu probabilitatea de a 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 e 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) = min
1ik1
d(i) +d(k i) +k. ( 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
d. Demonstrai c pentru o valoare dat a lui k > 1 i i din domeniul 1 i k 1, funcia
i lg i + (k i) lg(k i) este minim pentru i = k/2. Artai c d(k) = (k lg k).
e. Demonstrai c D(T
A
) = (n! lg (n!)) pentru T
A
, i concluzionai c timpul mediu pentru
sortarea a n elemente este (nlg n) .
Acum s considerm o sortare prin comparaii B. Putem extinde modelul arborelui
de decizie pentru a gestiona caracterul aleator prin ncorporarea a dou feluri de noduri: noduri
de comparaie i noduri de randomizare. Un astfel de nod modeleaz o selectare aleatoare
de forma Aleator(1, r), fcut de ctre algoritmul B; nodul are r descendeni, ecare dintre ei
avnd aceeai probabilitate de a selectat n timpul execuiei algoritmului.
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.
9-2 Sortarea pe loc n timp liniar
a. S presupunem c avem de sortat un tablou cu n articole i cheia ecrui 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 e 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
modica sortarea prin numrare astfel nct nregistrrile s poat sortate pe loc n
timpul O(n+k). Putei folosi un spaiu suplimentar de memorie de ordinul O(k), pe lng
tabloul de intrare. ( Cum ai realiza acest lucru pentru k = 3?)
Note bibliograce
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 semnicativ cifr pare s e 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 = (n + 1/2)| (mediana
inferioar) i i = (n + 1/2)| (mediana superioar). Pentru simplicare, 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 enunat riguros dup cum urmeaz:
Date de intrare: O mulime A de n numere (distincte) i un numr i, avnd proprietatea
1 i n.
Date de ieire: Elementul x A, care este mai mare dect exact i 1 alte elemente ale lui A.
Problema seleciei poate rezolvat n timp O(nlg 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.
10.1. Minim i maxim
Cte comparaii sunt necesare pentru a determina minimul unei mulimi de n elemente?
Putem obine uor o margine superioar de n 1 comparaii: se examineaz pe rnd ecare
element al mulimii i se reine cel mai mic element vizitat pn la momentul curent. n procedura
Minim presupunem c mulimea const din tabloul A, unde lungime [A] = n.
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
Determinarea maximului poate realizat la fel de bine i prin n 1 comparaii.
10.2. Selecia n timp mediu liniar 159
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 ecare element, cu excepia
nvingtorului, trebuie s piard cel puin un meci. Deci, pentru a determina minimul, sunt
necesare n1 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).
Minim i maxim simultane
n unele aplicaii trebuie gsite simultan minimul i maximul unei mulimi de n elemente.
De exemplu, un program grac poate avea nevoie s scaleze o mulime de date (x, y) pentru a le
aa pe un ecran dreptunghiular sau pe un alt dispozitiv de ieire. Pentru a realiza acest lucru,
programul trebuie, mai nti, s determine minimul i maximul ecrei coordonate.
Nu este prea dicil de proiectat un algoritm care s poat gsi att minimul ct i maximul
a n elemente folosind numrul asimptotic optimal de comparaii (n). Se determin minimul i
maximul independent, folosind n1 comparaii pentru ecare, deci un total de 2n2 comparaii.
De fapt, sunt suciente numai 3 n/2| 2 comparaii pentru a determina att minimul ct
i maximul. Prima pereche necesit numai o comparaie pentru a stabili valorile iniiale pentru
minimul i maximul curente, ceea ce justic termenul 2. n acest scop, pstrm minimul i
maximul gsite pe msur ce se lucreaz. n loc s prelucrm ecare element de intrare compa-
rndu-l cu minimul i maximul curente cu un cost de dou comparaii per element, vom prelucra
perechi de elemente. Comparm perechile de elemente ale datelor de intrare, mai nti ,
apoi comparm elementul mai mic cu minimul curent i elementul mai mare cu maximul curent,
cu un cost de trei comparaii pentru ecare dou elemente.
Exerciii
10.1-1 Artai c al doilea cel mai mic dintre n elemente poate determinat, n cel mai
defavorabil caz, prin n +lg n| 2 comparaii. ( Gsii i cel mai mic element.)
10.1-2 Artai c, n cel mai defavorabil caz, sunt necesare 3n/2| 2 comparaii pentru a
determina maximul i minimul a n elemente. ( Studiai cte numere pot potenial
maximul sau minimul, i cercetati cum afecteaz o comparaie aceste calcule.)
10.2. Selecia n timp mediu liniar
Problema general a seleciei pare mai dicil dect simpla problem a gsirii unui minim, i
n plus, surprinztor, timpul asimptotic de execuie pentru ambele probleme este acelai: (n).
n aceast seciune vom prezenta un algoritm divide i stpnete pentru problema seleciei.
Algoritmul Selecie-Aleatoare este modelat pe baza algoritmului de sortare rapid din
capitolul 8. Ca i la sortarea rapid, ideea este de a partiiona recursiv tabloul de intrare.
Spre deosebire de sortarea rapid, care prelucreaz recursiv ambele componente ale partiiei,
160 Capitolul 10 Mediane i statistici de ordine
Selecie-Aleatoare lucreaz numai cu o component. Aceast diferen se evideniaz la
analiz: n timp ce sortarea rapid are un timp mediu de execuie de (nlg n), timpul mediu al
algoritmului Selecie-Aleatoare este (n).
Selecie-Aleatoare folosete procedura Partiie-Aleatoare, prezentat n seciunea
8.3. Astfel, ca i Quicksort-Aleator, este un algoritm aleator, ntruct comportamentul su
este parial determinat de datele de ieire ale unui generator de numere aleatoare. Codul urmtor
pentru Selecie-Aleatoare returneaz al i-lea cel mai mic element al tabloului A[p..r].
Selecie-Aleatoare(A, p, r, i)
1: dac p = r atunci
2: returneaz A[p]
3: q Partiie-Aleatoare(A, p, r)
4: k q p + 1
5: dac i k atunci
6: returneaz Selecie-Aleatoare(A, p, q, i)
7: altfel
8: returneaz Selecie-Aleatoare(A, q + 1, r, i k)
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 ecare element al lui
A[p..q] este mai mic dect ecare 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 (n
2
),
chiar i pentru gsirea minimului, pentru c am putea 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, ..., n1.
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
T (n)
1
n

T (max (1, n 1)) +


n1

k=1
T (max (k, n k))

+O(n)

1
n

T (n 1) + 2
n1

k=|n/2|
T (k)

+O(n) =
2
n
n1

k=|n/2|
T(k) +O(n).
10.3. Selecia n timp liniar n cazul cel mai defavorabil 161
A doua linie rezult din prima ntruct max(1, n 1) = n 1 i
max(k, n k) =

k dac k n/2|,
n k dac k < n/2|.
Dac n este impar, ecare termen T (n/2|) , T (n/2| + 1) , . . . , T (n 1) apare de dou ori n
sum, i chiar dac n este par, ecare termen T (n/2| + 1) , T (n/2| + 2) , ..., T (n 1) apare
de dou ori, iar termenul T (n/2|) apare o singur dat. n oricare dintre cele dou cazuri, suma
de pe prima linie este mrginit superior de suma de pe a doua linie. n cazul cel mai defavorabil,
T(n 1) = O(n
2
), i astfel termenul
1
n
T (n 1) poate incorporat de ctre termenul O(n).
Demonstrm recurena prin substituie. Presupunem c T(n) cn pentru unele constante c
care satisfac condiiile iniiale ale recurenei. Folosind aceast ipotez de inducie, avem
T(n)
2
n
n1

k=|n/2|
ck +O(n) =
2c
n

n1

k=1
k
|n/2|1

k=1
k

+O(n)
=
2c
n

1
2
(n 1) n
1
2

n
2

n
2

+O(n)
c (n 1)
c
n

n
2
1

n
2

+O(n) = c

3
4
n
1
2

+O(n) cn,
ntruct putem alege un c sucient de mare pentru ca c(n/4 + 1/2) s domine termenul O(n).
Astfel, orice statistic de ordine i n special mediana, poate determinat ntr-un timp
mediu liniar.
Exerciii
10.2-1 Scriei versiunea iterativ a algoritmului Selecie-Aleatoare.
10.2-2 S presupunem c folosim Selecie-Aleatoare pentru a selecta elementul minim al
unui tablou A = '3, 2, 9, 0, 7, 5, 4, 8, 6, 1`. Descriei o secven de partiii care se genereaz, n
cazul cel mai defavorabil, de ctre 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 ecare
element din A[p..q] este mai mic dect ecare element din A[q + 1..r]. Dac exist
elemente egale, mai funcioneaz corect procedura Selecie-Aleatoare?
10.3. Selecia n timp liniar n cazul cel mai defavorabil
S examinm acum un algoritm de selecie al crui timp de execuie pentru cazul cel mai
defavorabil este O(n). La fel ca i Selecie-Aleatoare, algoritmul Selecie gsete elemen-
tul dorit partiionnd recursiv un tablou de intrare. Ideea algoritmului este de a o
partiionare bun a tabloului. Selecie utilizeaz algoritmul determinist Partiie din algorit-
mul de sortare rapid (vezi seciunea 8.1), modicat astfel nct s preia ca parametru de intrare
elementul n jurul cruia este efectuat partajarea.
162 Capitolul 10 Mediane i statistici de ordine
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 ind a i-a cea mai mic valoare.)
1. Se mpart cele n elemente ale tabloului de intrare n n/5| grupe de cte 5 elemente ecare
i cel mult un grup s conin restul de n mod 5 elemente.
2. Se determin mediana ecruia din cele n/5| grupe cu sortarea prin inserie, ordonnd
elementele ecrui 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 n/5| mediane gsite la
pasul 2.
4. Se partiioneaz tabloul de intrare n jurul medianei medianelor x, utiliznd o versiune
modicat a algoritmului Partiie. Fie k numrul de elemente de pe latura inferioar a
partiiei, astfel nct s e 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 n/5| 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
3

1
2

n
5

3n
10
6.
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(n/5|), 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
T(n)

(1) dac n 80,


T (n/5|) +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 n/5| +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
ecare 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 ecare grup de cte 5 sunt mai mari dect x, i c cele 3 elemente din
stnga lui x din ecare 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 sucient de mare astfel nct c(n/10 7) s e 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 (nlg 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 inecient.
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 n/4| dac n 38.
10.3-3 Artai cum poate modicat algoritmul de sortare rapid astfel nct s se execute n
timpul O(nlg n) n cel mai defavorabil caz.
10.3-4 S presupunem c un algoritm utilizeaz numai comparaii pentru a determina al
i-lea cel mai mic element dintr-o mulime de n elemente. Artai c el poate determina i cele
i 1 elemente mai mici i cele ni elemente mai mari, fr a mai face nici o comparaie n plus.
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(nlg k) care s listeze k-cuantilele unei mulimi.
10.3-7 Descriei un algoritm de timp O(n) care, ind 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 ecare 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 ecare pu
trebuie conectat direct la conducta principal o conduct de pompare (racord) care s e de-a
lungul celui mai scurt drum (e nord, e sud), ca n gura 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 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 ecare
dintre metodele urmtoare, i analizai timpii de execuie ai metodelor n funcie de n i i.
Probleme 165
a. Sortai numerele i listai cele mai mari i numere.
b. Construii o coad de prioriti din numere i apelai Extrage-Max de i ori.
c. Utilizai un algoritm de statistic de ordine pentru a gsi al i-lea cel mai mare numr,
partiionai i sortai cele mai mari i numere.
10-2 Mediana ponderat
Pentru n elemente distincte x
1
, x
2
, . . . , x
n
cu ponderile pozitive w
1
, w
2
, . . . , w
n
, astfel nct

n
i=1
w
i
= 1, mediana ponderat este elementul x
k
ce satisface condiiile

x
i
<x
k
w
i
<
1
2
i

x
i
>x
k
w
i

1
2
.
(Aceasta este de fapt mediana inferioar ponderat; mediana superioar ponderat se
denete similar.)
a. Argumentai c mediana elementelor x
1
, x
2
, . . . , x
n
este mediana ponderat a lui x
i
cu
ponderile w
i
= 1/n pentru i = 1, 2, . . . , n.
b. Artai cum se calculeaz mediana ponderat a n elemente n timpul O(nlg n) n cazul cel
mai defavorabil, folosind sortarea.
c. Artai cum se calculeaz mediana ponderat n timpul (n) n cazul cel mai defavorabil
folosind un algoritm de timp mediu liniar cum ar , de exemplu, Selecie din seciunea
10.3.
Problema amplasrii ociului potal este denit n modul urmtor. Se consider n puncte
p
1
, p
2
, ..., p
n
cu ponderile asociate w
1
, w
2
, ..., w
n
. Se dorete determinarea unui punct p (nu
neaprat unul din punctele de intrare) care s minimizeze suma

n
i=1
w
i
d(p, p
i
), unde d(a, b)
este distana dintre punctele a i b.
d. Argumentai c mediana ponderat este cea mai bun soluie pentru problema amplasrii
ociului potal n cazul unidimensional n care punctele sunt numere reale simple, iar
distana dintre punctele a i b este d(a, b) = [a b[.
e. Gsii cea mai bun soluie pentru problema amplasrii ociului potal n cazul bidi-
mensional, n care punctele sunt perechi de coordonate (x, y) i distana dintre punctele
a = (x
1
, y
1
) i b = (x
2
, y
2
) este distana Manhattan: d (a, b) = [x
1
x
2
[ +[y
1
y
2
[.
10-3 Statistici de ordin mic
Numrul de comparaii T (n) n cazul cel mai defavorabil folosit de ctre procedura Selecie
pentru a alege statistica de a i-a ordine din n numere s-a demonstrat c satisface relaia T (n) =
(n), dar constanta ascuns de notaia este destul de mare. Cnd i este mic n raport cu n
se poate implementa o procedur diferit care utilizeaz Selecie ca o subrutin, dar face mai
puine comparaii n cazul cel mai defavorabil.
166 Capitolul 10 Mediane i statistici de ordine
a. Descriei un algoritm care folosete U
i
(n) comparaii pentru a determina al i-lea cel mai
mic element dintre n elemente, unde i n/2 i
U
i
(n) =

T (n) dac n 2i,


n/2 +U
i
(n/2) +T(2i) n caz contrar.
( ncepei cu n/2| comparaii pe perechi disjuncte i apelai procedura recursiv
pentru mulimea coninnd elementul mai mic din ecare pereche.)
b. Artai c U
i
(n) = n +O(T (2i) lg (n/i)).
c. Artai c dac i este constant, atunci U
i
(n) = n +O(lg n).
d. Artai c dac i = n/k pentru k 2, atunci U
i
(n) = n +O(T (2n/k) lg k).
Note bibliograce
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 nemodicabile, mulimile manipulate de algoritmi
pot crete, descrete sau, n restul cazurilor,se pot modica n timp. Astfel de mulimi se numesc
dinamice. Urmtoarele cinci capitole prezint tehnici de baz pentru reprezentarea mulimilor
dinamice nite i pentru manipularea lor de ctre calculator.
n funcie de algoritmi, sunt necesare diferite tipuri de operaii pentru a 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.
Elementele unei mulimi dinamice
ntr-o implementare tipic a unei mulimi dinamice, ecare element este reprezentat de un
obiect ale crui cmpuri pot examinate i manipulate dac avem un pointer (o referin) la
acel obiect (capitolul 11 prezint implementarea obiectelor i pointerilor n medii de programare
care nu le conin ca tipuri de date de baz). Unele categorii de mulimi dinamice presupun
c un cmp al obiectului este un cmp cheie, de identicare. Dac toate cheile sunt diferite,
mulimea dinamic poate privit ca o mulime de valori ale cheilor. Obiectul poate conine
date adiionale, care sunt gestionate n alte cmpuri ale obiectului, dar sunt de fapt neutilizate
de ctre implementarea mulimii. De asemenea, obiectul poate avea cmpuri ce sunt manipulate
de ctre operaiile mulimilor, aceste cmpuri putnd conine date sau referine spre alte obiecte
din mulime.
Unele mulimi dinamice presupun c valorile cheilor sunt alese dintr-o mulime total ordonat,
ca de exemplu mulimea numerelor reale sau mulimea tuturor cuvintelor aate n ordine (uzual)
lexicograc. (O mulime total ordonat satisface proprietatea de trihotomie, denit la pagina
27). O ordine total ne permite s denim, de exemplu, cel mai mic element n mulime sau s
vorbim despre urmtorul element mai mare dect un element dat din mulime.
Operaii pe mulimi dinamice
Operaiile pe o mulime dinamic pot mprite n dou categorii: interogri , care re-
turneaz informaii despre mulime sau operaii de modicare, care modic mulimea. n
continuare se prezint o list a operaiilor uzuale. Orice aplicaie specic necesit n general
doar implementarea unora dintre ele.
Caut( ) O interogare care, ind date o mulime i o valoare cheie , returneaz un pointer
la un element din astfel nct [ ] = sau nil dac nu exist un astfel de element
n .
Introducere 169
Insereaz( ) O operaie de modicare care adaug la mulimea elementul referit de .
n mod obinuit se presupune c toate cmpurile din elementul necesare implementrii
mulimii au fost iniializate n prealabil.
terge( ) O operaie de modicare care, ind dat un pointer la un element din mulimea
, terge din . (Observai c aceast operaie folosete un pointer la un element i nu
o valoare a cheii).
Minim( ) O interogare pe o mulime total ordonat care returneaz elementul din mulimea
cu cea mai mic valoare a cheii.
Maxim( ) O interogare pe o mulime total ordonat care returneaz elementul din mulimea
cu cea mai mare valoare a cheii.
Succesor( ) O interogare care, ind dat un element a crui cheie este dintr-o mulime
total ordonat, returneaz elementul urmtor mai mare dect din sau nil dac este
elementul maxim.
Predecesor( ) O interogare care, ind dat un element a crui cheie este dintr-o mulime
total ordonat, returneaz elementul urmtor mai mic dect din sau nil dac este
elementul minim.
Interogrile Succesor i Predecesor sunt deseori extinse la mulimi cu elemente nedis-
tincte. Pentru o mulime cu chei, presupunerea obinuit este c un apel al lui Minim urmat
de n 1 apeluri ale lui Succesor enumer elementele din mulime n ordinea sortrii.
Timpul necesar pentru a executa o operaie asupra mulimilor este, n mod obinuit, msurat
n termenii mrimii mulimii, dat ca unul dintre argumente. De exemplu, capitolul 14 descrie
o structur de date ce poate realiza oricare dintre operaiile descrise mai sus pe o mulime de
dimensiune n timpul (lg ).
Sumarul prii a treia
Capitolele 1115 descriu diferite structuri de date ce pot folosite pentru a implementa
mulimi dinamice; multe dintre acestea vor utilizate ulterior la construirea unor algoritmi
ecieni pentru o diversitate de probleme. O alt structur de date important ansamblul a
fost deja introdus n capitolul 7.
Capitolul 11 prezint fundamentele lucrului cu structuri de date simple ca: stive, cozi, liste
nlnuite i arbori cu rdcin. De asemenea, se arat cum pot implementate obiectele sau
referinele n medii de programare care nu le posed ca primitive. O mare parte din acest material
ar trebui s e familiar tuturor celor care au studiat un curs introductiv n programare.
Capitolul 12 introduce tabele de dispersie (hash), care au operaii pentru dicionare:
Insereaz, terge, Caut. n cazul cel mai nefavorabil, dispersia necesit timpul (n) pentru
a executa o operaie Caut, pe cnd timpul prevzut pentru operaiile de dispersie este (1).
Analiza dispersiei se bazeaz pe probabiliti, dar cea mai mare parte a capitolului nu necesit
cunotine despre acest subiect.
Arborii de cutare binar, prezentai n capitolul 13 au toate operaiile pe mulimi dinamice
descrise mai sus. n cazul cel mai defavorabil, ecare operaie necesit un timp ( ) pe un arbore
cu elemente, dar pe un arbore binar de cutare construit aleator, timpul mediu pentru ecare
170
operaie este (lg ). 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 (lg ) 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 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 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 sintetizai din tablouri.
11.1. Stive i cozi
Stivele i cozile sunt mulimi dinamice n care elementul care este eliminat din mulime de
ctre operaia terge este prespecicat. ntr-o stiv, elementul ters din mulime este elementul
cel mai recent inserat: stiva implementeaz principiul ultimul sosit, primul servit (last-in,
rst-out) sau LIFO. Similar, ntr-o coad, elementul ters este ntotdeauna cel care a stat n
mulime cel mai mult (primul introdus): coada implementeaz principiul primul sosit, primul
servit (rst-in, rst-out) sau FIFO. Exist mai multe modaliti eciente de a implementa
stivele i cozile cu ajutorul calculatorului. n aceast seciune vom arta cum se pot folosi
tablourile simple pentru a implementa ecare dintre aceste structuri.
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 zice, 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 gura 11.1, o stiv cu cel mult elemente poate 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[v arf[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
[ ] depete valoarea , stiva are depire superioar. (n implementarea noastr n
pseudocod, nu ne vom pune problema depirii stivei.)
Fiecare dintre operaiile stivei pot implementate prin doar cteva linii de cod.
Stiv-Vid( )
1: dac [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: [S] [S] + 1
2: [S]] x
Scoate-Din-Stiv(S)
1: dac Stiv-Vid( ) atunci
2: eroare depire inferioar
3: altfel
4: [S] [S] - 1
5: returneaz S[ [S]+1]
Figura 11.1 ilustreaz modicrile produse n urma apelurilor operaiilor Pune-n-Stiv i
Scoate-Din-Stiv. Fiecare dintre cele trei operaii asupra stivelor necesit un timp O(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
coad a[Q] conine indicele noii locaii n care se va insera n coad elementul nou venit. Elementele
din coad se a 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 . 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, vericarea erorilor de depire inferioar a fost
omis. (Exerciiul 11.1-4 cere scrierea codului ce veric 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) Conguraia cozii dup apelurile
Pune-n-Coad (Q,17), Pune-n-Coad(Q,3), Pune-n-Coad(Q,5). (c) Conguraia cozii dup ce
apelul Scoate-Din-Coad(Q) returneaz valoarea cheii 15, ce s-a aat anterior n capul cozii. Noul
cap are cheia 6.
Pune-n-Coad(Q, x)
1: Q[coad a[Q]] x
2: dac coad a[Q] = lung[Q] atunci
3: coad a[Q] 1
4: altfel
5: coad a[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
n gura 11.2 sunt ilustrate efectele operaiilor Pune-n-Coad i Scoate-Din-Coad.
Fiecare operaie necesit un timp O(1).
Exerciii
11.1-1 Folosind ca model gura 11.1, ilustrai efectul ecreia 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 . Operaiile Pune-n-Stiv i Scoate-Din-Stiv
trebuie s funcioneze ntr-un timp O(1).
11.1-3 Folosind ca model gura 11.2, ilustrai efectul ecreia 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 , iniial vid

, a memorat ntr-un tablou


Q[1..6].
11.1-4 Rescriei Pune-n-Coad i Scoate-Din-Coad pentru a detecta depirile unei cozi.
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.
11.2. Liste nlnuite
O list nlnuit este o structur de date n care obiectele sunt aranjate ntr-o anumit
ordine. Spre deosebire de tablou, n care ordinea este determinat de indicii tabloului, ordinea
ntr-o list nlnuit este determinat de un pointer coninut n ecare obiect. Listele nlnuite
asigur o reprezentare mai simpl i mai exibil pentru mulimi dinamice, suportnd (dei nu
neaprat ecient) toate operaiile descrise la pagina 168.
Dup cum se arat n gura 11.3, ecare element al unei liste dublu nlnuite este un
obiect cu un cmp i alte dou cmpuri pointer: (urmtor) i (precedent). Obiectul
poate conine i alte date. Fiind dat un element din list, urm[x] indic spre succesorul su din
lista nlnuit, iar prec[x] indic spre predecesorul su. Dac prec[x] = nil atunci elementul
nu are nici un predecesor i deci e primul element din list, sau capul listei. Dac urm[x] =nil
atunci elementul nu are succesor i deci este ultimul element sau coada listei. Un atribut
cap[L] refer primul element al listei. Dac cap[L] =nil, lista este vid.
O list poate avea una din urmtoarele forme. Ea poate simplu nlnuit sau dublu
nlnuit, poate sortat sau nu, i poate , sau nu, circular. Dac o list este simplu
nlnuit vom omite pointerul din ecare element. Dac o list este sortat, ordinea
din list corespunde ordinii cheilor memorate n elementele listei; elementul minim este capul
listei, iar elementul maxim este coada listei. Dac lista este nesortat, elementele pot aprea n
orice ordine. ntr-o list circular referina a capului listei refer coada iar referina
a cozii listei refer capul ei. Astfel, lista poate privit ca un inel de elemente. n restul acestei
seciuni vom presupune c listele cu care lucrm sunt nesortate i dublu nlnuite.
11.2. Liste nlnuite 175
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.
Cutarea ntr-o list nlnuit
Procedura List-Caut(L, k) gsete primul element avnd cheia din lista printr-o
cutare liniar simpl, returnnd pointerul la acest element. Dac n list nu apare nici un
obiect avnd cheia , atunci se returneaz nil. Pentru lista nlnuit din gura 11.3(a), apelul
List-Caut(L, 4) returneaz un pointer la al treilea element, iar apelul List-Caut(L, 7)
returneaz nil.
List-Caut(L, x)
1: x cap[L]
2: ct timp x = nil i cheie[x] = k execut
3: x urm[x]
4: returneaz x
Pentru a cuta ntr-o list avnd obiecte, procedura List-Caut necesit un timp (n)
n cazul cel mai defavorabil, deoarece va trebui s caute n toat lista.
Inserarea ntr-o list nlnuit
Fiind dat un element al crui cmp a fost iniializat, procedura List-Insereaz l
plaseaz pe n faa listei nlnuite, dup cum se poate observa n gura 11.3(b).
List-Insereaz(L, x)
1: urm[x] cap[L]
2: dac cap[L] = nil atunci
3: prec[cap[L]] x
4: cap[L] x
5: prec[x] nil
Timpul de execuie pentru List-Insereaz pe o list cu n elemente este O(1).
176 Capitolul 11 Structuri de date elementare
tergerea dintr-o list nlnuit
Procedura List-terge elimin un element dintr-o list nlnuit . Pentru aceasta,
trebuie transmis ca argument un pointer spre i va scos din list, actualizndu-se pointerii.
Dac dorim s tergem un element cu o cheie dat, mai nti trebuie s apelm List-Caut
pentru a aa pointerul spre acel element.
List-terge(L, x)
1: dac prec[x] = nil atunci
2: urm[prec[x]] urm[x]
3: altfel
4: cap[L] urm[x]
5: dac urm[x] = nil atunci
6: prec[urm[x]] prec[x]
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 mai simplu dac am ignora condiiile extreme de la capul
i coada listei.
List-terge
t
(L, x)
1: urm[prec[x]] urm[x]
2: prec[urm[x]] prec[x]
O santinel este un obiect ctiv care ne permite s simplicm condiiile de la extreme. De
exemplu, s presupunem c n lista avem la dispoziie un obiect nil[L], care reprezint nil, dar
care are toate cmpurile unui element al listei. De cte ori avem o referin la nil n codul listei,
o vom nlocui cu o referin la santinela nil[L]. Dup cum se observ n gura 11.4, santinela
transform o list dublu nlnuit ntr-o list circular, cu santinela nil[L] plasat ntre cap i
coad; cmpul urm[nil[L]] indic spre capul listei, iar prec[nil[L]] indic spre coad. Similar,
att cmpul al cozii ct i cmpul al capului indic spre nil[L]. Deoarece urm[nil[L]]
indic spre cap, putem elimina atributul cap[L], nlocuind referinele ctre el cu referine ctre
urm[nil[L]]. O list vid va conine doar santinela, deoarece att urm[nil[L]] ct i prec[nil[L]]
pot setate pe nil[L].
Codul pentru List-Caut rmne la fel ca nainte, dar cu referinele spre nil i cap[L]
schimbate dup cum s-a precizat anterior.
List-Caut
t
(L, k)
1: x urm[nil[L]]
2: ct timp x = nil[L] i cheie[x] = k execut
3: x urm[x]
4: returneaz
11.2. Liste nlnuite 177
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 accesat prin urm[nil[L]]. (a) O list vid. (b) Lista
nlnuit din gura 11.3(a), avnd cheia 9 n capul listei i cheia 1 n coada listei. (c) Lista dup execuia
procedurii List-Insereaz

(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-terge
t
pentru a terge un element din list.
Vom folosi urmtoarea procedur pentru inserarea unui element n list.
List-Insereaz
t
(L, x)
1: urm[x] urm[nil[L]]
2: prec[urm[nil[L]]] x
3: urm[nil[L]] x
4: prec[x] nil[L]
Figura 11.4 ilustreaz efectele procedurilor List-Insereaz
t
i List-terge
t
pe un exemplu.
Rareori santinelele reduc marginile asimptotice de timp pentru operaiile structurilor de date,
dar pot reduce factorii constani. Ctigul pe care l reprezint folosirea santinelelor n cadrul
ciclurilor este de obicei mai mult legat de claritatea codului, dect de vitez; de exemplu, codul
pentru lista nlnuit este simplicat prin utilizarea santinelelor, dar ctigm doar un timp O(1)
n procedurile List-Insereaz
t
i List-terge
t
. Oricum, n alte situaii, folosirea santinelelor
ajut la restrngerea codului dintr-un ciclu, reducndu-se astfel coecientul, de exemplu, pentru
n sau n
2
din timpul de execuie.
Santinelele trebuie folosite cu discernmnt. Dac avem multe liste mici, spaiul suplimentar
folosit de santinelele acestor liste poate reprezenta o risip semnicativ de memorie. Astfel, n
cartea de fa santinelele se vor folosi doar acolo unde se obine o simplicare semnicativ a
codului.
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-2 Implementai o stiv folosind o list simplu nlnuit . Operaiile Pune-n-Stiv i
Scoate-Din-Stiv ar trebui s necesite tot un timp O(1).
178 Capitolul 11 Structuri de date elementare
11.2-3 Implementai o coad folosind o list simplu nlnuit . Operaiile Pune-n-Coad
i Scoate-Din-Coad ar trebui s necesite tot un timp O(1).
11.2-4 Implementai operaiile specice dicionarelor Insereaz, terge i Caut folosind
liste simplu nlnuite, respectiv circulare. Care sunt timpii de execuie pentru aceste proceduri?
11.2-5 Operaia pentru mulimi dinamice Reunete are ca intrare dou mulimi disjuncte S
1
i S
2
i returneaz mulimea S = S
1
S
2
ce conine toate elementele din S
1
i S
2
. Mulimile S
1
i S
2
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 ecrei liste. Comparai simplitatea codului
pentru ecare din cele dou proceduri.
11.2-7 Creai o procedur nerecursiv de timp de execuie (n) care inverseaz o list simplu
nlnuit avnd 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 ecare obiect, n locul celor dou valori uzuale ( i ). Se presupune
c toate valorile pointerilor pot interpretate ca i ntregi pe bii i se denete np[x] ca ind
np[x] = urm[x] XOR prec[x], sau exclusiv pe 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 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).
11.3. Implementarea pointerilor i obiectelor
Cum implementm pointerii i obiectele n limbaje cum ar Fortran, care nu asigur lucrul
cu astfel de date? n aceast seciune, vom arta dou modaliti de implementare a structurilor
de date nlnuite fr un tip de date pointer explicit. Vom sintetiza obiectele i pointerii din
tablouri i indici de tablouri.
O reprezentare multi-tablou a obiectelor
O colecie de obiecte care au aceleai cmpuri se poate reprezenta utiliznd cte un tablou
pentru ecare cmp. De exemplu, gura 11.5 ilustreaz cum se poate implementa lista nlnuit
din gura 11.3(a) prin trei tablouri. Tabloul reine valorile curente ale cheilor din mulimea
dinamic, iar pointerii sunt memorai n tablourile i . Pentru un indice de tablou dat,
cheie[x], urm[x] i prec[x] reprezint un obiect n lista nlnuit. ntr-o astfel de implementare,
un pointer este un simplu indice n tablourile i .
n gura 11.3(a), obiectul avnd cheia 4 urmeaz dup obiectul avnd cheia 16 n lista
nlnuit. n gura 11.5, cheia 4 apare n cheie[2], iar cheia 16 apare n cheie[5], deci vom
avea urm[5] = 2 i prec[2] = 5. Dei constanta nil apare n cmpul al cozii i n cmpul
11.3. Implementarea pointerilor i obiectelor 179
Figura 11.5 Lista nlnuit din gura 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 gura 11.3(a) i gura 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.
al capului, de obicei vom folosi un ntreg (ca 0 sau -1) care nu poate reprezenta un indice
valid n tablouri. O variabil 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, semnicaia
lui cheie[x], urm[x] i prec[x] este consistent relativ la implementare.
O reprezentare a obiectelor printr-un tablou unic
Cuvintele din memoria unui calculator sunt n mod obinuit adresate prin ntregi ntre 0 i
M 1, unde M este un numr ntreg sucient de mare. n multe limbaje de programare, un
obiect ocup o mulime contigu de locaii n memoria calculatorului. Un pointer este pur i
simplu adresa primei locaii de memorie a obiectului iar celelalte locaii de memorie din cadrul
obiectului pot indexate adugnd un deplasament la acest pointer.
n medii de programare care nu au tipuri de date pointer explicite putem folosi aceeai
strategie pentru implementarea obiectelor. De exemplu, gura 11.6 ilustreaz cum se poate folosi
un singur tablou pentru a memora lista nlnuit din gura 11.3(a) i gura 11.5. Un obiect
ocup un subtablou contiguu A[j..k]. Fiecare cmp al obiectului corespunde unui deplasament
din intervalul 0..k j, iar un pointer la obiect este indicele . n gura 11.6, deplasamentele
180 Capitolul 11 Structuri de date elementare
Figura 11.7 Efectul procedurilor Aloc-Obiect i Elibereaz-Obiect. (a) Lista din gura 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 i sunt 0, 1, respectiv 2. Pentru a citi valoarea lui prec[i]
pentru un pointer dat, adugm la valoarea a pointerului deplasamentul 2, citind astfel A[i+2].
Reprezentarea printr-un singur tablou este exibil 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 dicil 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 sucient s folosim
reprezentarea multi-tablou a obiectelor.
Alocarea i eliberarea obiectelor
Pentru a insera o cheie ntr-o mulime dinamic reprezentat printr-o list dublu nlnuit,
trebuie s alocm un pointer la un obiect neutilizat la momentul respectiv n reprezentarea listei
nlnuite. Prin urmare, este util s inem evidena obiectelor care nu sunt folosite la un moment
dat, n reprezentarea listei nlnuite; astfel, ori de cte ori avem nevoie de un nou obiect, acesta
va preluat din lista de obiecte nefolosite. n unele sisteme, un aa numit garbage collector
(colector de reziduuri) este responsabil cu determinarea obiectelor neutilizate. Oricum, sunt
multe aplicaii, sucient de simple astfel nct i pot asuma responsabilitatea de a returna
un obiect neutilizat ctre gestionarul de obiecte nefolosite. Vom studia acum problema alocrii
i eliberrii (sau dealocrii) obiectelor omogene folosind, de exemplu, o list dublu nlnuit
reprezentat prin tablouri multiple.
S presupunem c tablourile din reprezentarea multi-tablou au lungimea i c la un moment
dat mulimea dinamic conine n m elemente. Atunci obiecte vor reprezenta elementele
11.3. Implementarea pointerilor i obiectelor 181
Figura 11.8 Dou liste nlnuite L
1
(poriunea cu haur deschis) i L
2
(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
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 , care memoreaz pointerii din list. Capul listei libere
este memorat ntr-o variabil global . n cazul n care mulimea dinamic reprezentat de
lista nlnuit este nevid, lista liber se poate ntreese cu lista , dup cum se observ n
gura 11.7. Observai c ecare obiect din reprezentare este e n lista , e 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 folosit n urmtoarele proceduri refer primul element al listei libere.
Aloc-Obiect()
1: dac = 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 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 i .
Cele dou proceduri se execut ntr-un timp O(1), ceea ce le face eciente. Ele pot modicate
astfel nct s funcioneze pentru orice colecie omogen de obiecte, lsnd unul din cmpurile
obiectului s se comporte ca un cmp n lista liber.
Exerciii
11.3-1 Desenai o imagine a irului '13, 4, 8, 19, 5, 11` 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
11.3-2 Scriei procedurile Aloc-Obiect i Elibereaz-Obiect pentru o colecie omogen
de obiecte implementat printr-o reprezentare cu un tablou unic.
11.3-3 De ce nu este necesar s setm sau s resetm cmpurile ale obiectelor din
implementarea procedurilor Aloc-Obiect i Elibereaz-Obiect?
11.3-4 De multe ori este de dorit s pstrm toate elementele unei liste dublu nlnuite
ntr-o zon compact la memorare, folosind, de exemplu, primele locaii din reprezentarea
multi-tablou. (Aceasta este situaia ntr-un mediu de calcul cu memorie virtual, paginat.)
Explicai, cum se pot implementa procedurile Aloc-Obiect i Elibereaz-Obiect astfel
nct reprezentarea s e compact. Presupunei c nu exist pointeri la elementele listei
nlnuite n afara listei nsei. ( : Folosii implementarea stivei printr-un tablou.)
11.3-5 Fie o list dublu nlnuit de lungime memorat n tablourile i de
lungime . S presupunem c aceste tablouri sunt gestionate de procedurile Aloc-Obiect i
Elibereaz-Obiect, care pstreaz o list liber dublu nlnuit . Mai presupunem c din
cele locaii, sunt exact n lista i nm n lista liber. Scriei o procedur Compacteaz-
List(L, F) care, ind date lista i lista liber , mut elementele din astfel nct ele s ocupe
poziiile 1, 2, ..., m din tablou i ajusteaz lista liber astfel nct s rmn corect, ocupnd
poziiile m+1, m+2, ..., n din tablou. Timpul de execuie pentru procedura scris trebuie s e
(m) i ea trebuie s utilizeze doar un spaiu suplimentar constant. Dai o argumentare atent
a corectitudinii procedurii scrise.
11.4. Reprezentarea arborilor cu rdcin
Metodele pentru reprezentarea listelor date n seciunea precedent se extind la orice
structur omogen de date. n aceast seciune, vom discuta n mod special problema
reprezentrii arborilor cu rdcin prin structuri de date nlnuite. Vom studia mai nti arborii
binari i apoi vom prezenta o metod pentru arbori cu rdcin n care nodurile pot avea un
numr arbitrar de descendeni.
Vom reprezenta ecare nod al arborilor printr-un obiect. Ca n cazul listelor nlnuite,
presupunem c ecare nod conine un cmp . Restul cmpurilor care prezint interes sunt
pointeri ctre celelalte noduri i pot varia n funcie de tipul arborelui.
Arbori binari
Dup cum se observ n gura 11.9 cmpurile i se folosesc pentru a memora
pointerii pentru printe, descendentul stng i descendentul drept al ecrui nod din arborele
binar . Dac p[x] = nil, atunci este rdcina. Dac nodul nu are descendent stng, atunci
[x] = nil i similar pentru descendentul drept. Rdcina ntregului arbore este referit
de atributul [T]. Dac [T] = nil, atunci arborele este vid.
Arbori cu rdcin cu numr nelimitat de ramuri
Schema pentru reprezentarea arborilor binari poate extins la orice clas de arbori n care
numrul de descendeni ai ecrui nod nu depete o constant : vom nlocui cmpurile
11.4. Reprezentarea arborilor cu rdcin 183
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 cu fiu
1
, fiu
2
, ..., fiu
k
. 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 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 noduri. Reprezentarea descendent-stng, frate-drept este
ilustrat n gura 11.10. Fiecare nod conine un pointer spre printe , iar [T] refer
rdcina arborelui . n loc s avem un pointer spre ecare descendent, ecare nod are doar
doi pointeri:
1. [x] refer cel mai din stnga descendent al nodului i
2. [x] refer fratele lui , cel mai apropiat spre dreapta.
Dac nodul nu are descendeni atunci [x] = nil, iar dac nodul este cel mai din
dreapta descendent al printelui su atunci [x] = nil.
Alte reprezentri ale arborilor
Uneori reprezentm arborii cu rdcin i n alte moduri. n capitolul 7, de exemplu, am
reprezentat un ansamblu, care se bazeaz pe un arbore binar complet, printr-un singur tablou
plus un indice. Arborii care apar n capitolul 22 sunt traversai numai spre rdcin, de aceea
doar pointerii spre prini sunt prezeni; nu exist pointeri spre descendeni. Sunt posibile i
multe alte scheme. Care este cea mai bun schem care depinde de aplicaie.
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), u-stng[x] (partea din stnga jos) i frate-drept[x] (partea din dreapta jos). Cheile
nu sunt ilustrate.
indice
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, ind dat un arbore binar
cu noduri, tiprete cheia ecrui nod din arbore.
11.4-3 Scriei o procedur nerecursiv cu timp de execuie O(n) care, ind dat un arbore binar
cu noduri, tiprete cheia ecrui 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 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, ind dat un arbore
binar cu noduri, tiprete cheile ecrui nod. Folosii numai un spaiu suplimentar constant
n afara arborelui nsui i nu modicai 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 ecare nod: i . Din ecare nod se pot
atinge i identica printele i toi descendenii nodului. Artai cum se poate obine acelai
efect, folosind doar doi pointeri i o valoare boolean n ecare nod.
Probleme 185
Probleme
11-1 Comparaii ntre liste
Pentru ecare din cele patru tipuri de liste din tabelul urmtor, care este timpul asimptotic
de execuie n cazul cel mai defavorabil pentru ecare dintre operaiile pe mulimi dinamice
specicate 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)
11-2 Absambluri interclasate folosind liste nlnuite
Un ansamblu interclasat are urmtoarele operaii: Creeaz-Ansamblu (care creeaz un
ansamblu interclasat vid), Insereaz, Minim, Extrage-Min i Reunete. Artai cum se pot
implementa ansamblurile interclasate folosind liste nlnuite n ecare din urmtoarele cazuri.
ncercai s realizai ecare operaie ct mai ecient posibil. Analizai timpul de execuie n
termenii dimensiunii mulimii (mulimilor) dinamice cu care se opereaz. a. Listele sunt sortate.
b. Listele nu sunt sortate. c. Listele nu sunt sortate, iar mulimile dinamice ce se interclaseaz
sunt disjuncte.
11-3 Cutarea ntr-o list sortat compact
Exerciiul 11.3-4 cerea modul n care putem menine o list avnd elemente, compact n
primele poziii ale unui tablou. Vom presupune c toate cheile sunt distincte i c lista compact
este de asemenea sortat, adic, cheie[i] < cheie[urm[i]], oricare ar i = 1, 2, ..., n pentru care
urm[i] = nil. Cu aceste presupuneri ne ateptm ca urmtorul algoritm aleator s efectueze
cutarea n list ntr-un timp O(n).
List-Compact-Caut(L, k)
1: i cap[L]
2: n lung[L]
3: ct timp i = nil i cheie[i] k execut
4: j Random(1, n)
5: dac cheie[i] < cheie[j] i cheie[j] < k atunci
6: i j
7: i urm[i]
8: dac cheie[i] = k atunci
9: returneaz
10: returneaz nil
186 Capitolul 11 Structuri de date elementare
Dac ignorm liniile 46 din procedur, atunci avem algoritmul uzual pentru cutarea ntr-
o list nlnuit sortat, n care indicele refer pe rnd ecare poziie din list. Liniile 46
ncearc s sar n avans la o poziie aleas aleator. Un astfel de salt este benec dac cheie[j]
este mai mare dect cheie[i] i mai mic dect ; ntr-un astfel de caz marcheaz o poziie n
list prin care va trebui s treac n timpul unei cutri obinuite n list. Deoarece lista este
compact, tim c orice alegere a lui ntre 1 i refer un obiect din list i nu o poziie n lista
liber.
a. De ce presupunem n List-Compact-Caut c toate cheile sunt distincte? Argumentai
c salturile aleatoare nu ajut neaprat n cazul asimptotic, dac lista conine dubluri ale
cheilor.
Performana procedurii List-Compact-Caut poate analizat mprind execuia sa
n dou faze. n timpul primei faze, ignorm orice avans realizat n determinarea lui , ce se
realizeaz n liniile 79. Deci, faza 1 const doar n avansul n list prin salturi aleatoare. Asem-
ntor, faza 2 ignor avansul ce se realizeaz n liniile 46 i astfel va opera ca o cutare liniar
obinuit.
Fie X
t
variabila aleatoare care descrie distana n lista nlnuit (i anume, prin nlnuirea
pointerilor ) de la poziia la cheia dorit dup iteraii ale fazei 1.
b. Argumentai c timpul de execuie dorit pentru List-Compact-Caut este O(t +
E[X
t
]), pentru orice t 0.
c. Artai c E[X
t
]

n
r=1
(1 r/n)
t
. ( : Folosii relaia (6.28).)
d. Artai c

n1
r=1
r
t
n
t+1
/(t + 1).
e. Demonstrai c E[X
t
] n/(t + 1) i explicai de ce aceast formul este intuitiv.
f. Artai c List-Compact-Caut se execut ntr-un timp de O(

n).
Note bibliograce
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 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 specice
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 identicatorilor din limbaj. O tabel de dispersie este o structur
ecient 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
ecare cheie posibil.
Cnd numrul cheilor memorate efectiv este relativ mic fa de numrul total de chei posibile,
tabelele de dispersie devin o alternativ ecient 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 pe
baza cheii. n seciunea 12.2 sunt prezentate ideile principale, iar n seciunea 12.3 se descrie cum
pot 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 ecient i practic; operaiile de baz pentru dicionare necesit, n medie, doar un
timp O(1).
12.1. Tabele cu adresare direct
Adresarea direct este o tehnic simpl care funcioneaz bine atunci cnd universul al
cheilor este rezonabil de mic. S presupunem c o aplicaie necesit o mulime dinamic n care
ecare element are o cheie aleas dintr-un univers U = 0, 1, ..., m 1, unde nu este foarte
mare. Vom presupune c nu exist dou elemente avnd aceeai cheie.
Pentru a reprezenta mulimea dinamic folosim un tablou sau o tabel cu adresare direct
T[0..m1], n care ecare poziie sau locaie corespunde unei chei din universul . Figura 12.1
ilustreaz aceast abordare; locaia refer elementul avnd cheia din mulime. Dac mulimea
nu conine un element cu cheia , atunci T[k] = nil.
Operaiile pentru dicionare sunt uor de implementat.
Adresare-Direct-Caut(T, k)
returneaz T[k]
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 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 arma c locaia este goal.
Exerciii
12.1-1 Se consider o mulime dinamic care este reprezentat printr-o tabel cu adresare
direct, de lungime . Descriei o procedur care gsete elementul maxim din . 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 ocup mult mai puin spaiu dect un tablou de 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 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 k
2
i k
5
se transform n aceeai poziie, deci sunt n coliziune.
12.1-4 Dorim s implementm un dicionar folosind adresarea direct pe un tablou . La
nceput, intrrile n tablou pot conine date nesemnicative, iar iniializarea ntregului tablou
este nepractic datorit mrimii sale. Descriei o schem pentru implementarea unui dicionar cu
adresare direct printr-un tablou uria. Fiecare obiect memorat ar trebui s utilizeze un spaiu
O(1); operaiile Caut, Insereaz i terge ar trebui s funcioneze ecare ntr-un timp
O(1); iniializarea structurii de date ar trebui s necesite un timp O(1). ( Folosii o
stiv suplimentar, a crei mrime s e numrul de chei efectiv memorate n dicionar, pentru
a determina dac o intrare dat n tabloul uria este valid sau nu.)
12.2. Tabele de dispersie
Dicultatea n adresarea direct este evident: dac universul este mare, memorarea tabe-
lului poate nepractic, sau chiar imposibil, dat ind memoria disponibil a unui calculator
uzual. Mai mult, mulimea a cheilor poate att de mic relativ la , nct
majoritatea spaiului alocat pentru ar irosit.
Cnd mulimea a cheilor memorate ntr-un dicionar este mult mai mic dect universul
al cheilor posibile, o tabel de dispersie necesit un spaiu de memorie mult mai mic dect
o tabel cu adresare direct. Mai exact, cerinele de memorare pot reduse la ([K[), chiar i
atunci cnd cutarea unui element n tabela de dispersie necesit tot un timp O(1). (Singurul
punct slab este c aceast margine este stabilit pentru , n timp ce pentru adresarea
direct ea era valabil pentru .)
Prin adresare direct, un element avnd cheia este memorat n locaia . Prin dispersie,
acest element este memorat n locaia h(k); aceasta nseamn c o funcie de dispersie este
folosit pentru a calcula locaia pe baza cheii . n acest caz, transform universul al cheilor
n locaii ale unei tabele de dispersie T[0..m1]:
h : U 0, 1, ..., m1.
Vom spune c un element cu cheia se disperseaz n locaia h(k); de asemenea vom spune c
190 Capitolul 12 Tabele de dispersie
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(k
1
) = h(k
4
) i
h(k
5
) = h(k
2
) = h(k
7
).
h(k) este valoarea de dispersie a cheii . 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 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 eciente pentru rezolvarea conictelor create
de coliziuni.
Desigur, soluia ideal ar s nu existe coliziuni. Putem ncerca s atingem acest scop printr-
o alegere potrivit a funciei de dispersie . O idee este de a-l face pe 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 trebuie s e determinist, n sensul c o intrare dat 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.
Rezolvarea coliziunii prin nlnuire
Prin nlnuire punem toate elementele ce se disperseaz n aceeai locaie, ntr-o list
nlnuit, dup cum se arat n gura 12.3. Locaia conine un pointer ctre capul listei tu-
turor elementelor care se disperseaz n locaia ; dac nu exist astfel de elemente, locaia
conine nil.
Operaiile pentru dicionare sunt uor de implementat pe o tabel de dispersie, n cazul n
care coliziunile sunt rezolvate prin nlnuire.
12.2. Tabele de dispersie 191
Dispersie-Cu-Inlnuire-Insereaz(T, x)
insereaz n capul listei T[h(cheie[x])]
Dispersie-Cu-Inlnuire-Caut(T, k)
caut un element cu cheia n lista T[h(k)]
Dispersie-Cu-Inlnuire-terge(T, x) indexDispersie-Cu-Inlantuire-Sterge@Dispersie-
Cu-Inlnuire-terge
terge 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 poate realizat ntr-
un timp O(1) dac listele sunt dublu nlnuite. (Dac listele sunt simplu nlnuite, atunci
trebuie nti s-l gsim pe n lista T[h(cheie[x])], astfel nct legtura a predecesorului lui
s e modicat corespunztor ca s-l ocoleasc pe ; n acest caz, tergerea i cutarea au
n esen acelai timp de execuie.)
Analiza dispersiei cu nlnuire
Ct de bine funcioneaz dispersia prin nlnuire? n particular, ct dureaz cutarea unui
element avnd o cheie dat?
Fiind dat o tabel de dispersie cu locaii ce memoreaz elemente, vom deni factorul
de ncrcare pentru prin n/m, raport care reprezint numrul mediu de elemente memorate
ntr-o nlnuire. Analiza noastr se bazeaz pe ; adic, ne imaginm ca ind x n timp ce
i tind la innit. (Se observ c poate mai mic, egal sau mai mare dect 1.)
Comportamentul, n cazul cel mai defavorabil, al dispersiei prin nlnuire este slab: toate
cele chei se disperseaz n aceeai locaie, crend o list de lungime . Timpul de cutare pentru
cazul cel mai defavorabil este astfel (n) plus timpul pentru calculul funciei de dispersiecu
nimic mai bun dect n cazul n care am folosit o list nlnuit a tuturor elementelor. Este
clar c tabelele de dispersie nu sunt folosite pentru performana lor n cazul cel mai defavorabil.
Performana dispersiei n cazul mediu depinde de ct de bine distribuie (n medie) funcia de
dispersie mulimea cheilor ce trebuie memorate n cele locaii. n seciunea 12.3 se discut
aceste probleme, dar deocamdat vom presupune c orice element se poate dispersa n oricare
din cele locaii cu aceeai probabilitate, independent de locul n care s-au dispersat celelalte
elemente. Vom numi aceast ipotez de lucru dispersie uniform simpl.
Presupunem c valoarea de dispersie h(k) poate calculat ntr-un timp O(1), astfel nct
timpul necesar pentru a cuta un element avnd cheia depinde liniar de lungimea listei T[h(k)].
Lsnd de o parte timpul O(1) necesar pentru calculul funciei de dispersie i pentru accesul
la locaia h(k), s lum n considerare numrul mediu de elemente examinate de algoritmul de
cutare, adic, numrul de elemente din lista T[h(k)] care sunt vericate pentru a vedea dac
cheia lor este egal cu k. Vom considera dou cazuri. n primul caz, cutarea este fr succes:
nici un element din tabel nu are cheia k. n al doilea caz, cutarea gsete cu succes un element
avnd cheia k.
192 Capitolul 12 Tabele de dispersie
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 , 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 ecare nou element se adaug la sfritul
listei). n concluzie, pentru a aa numrul mediu de elemente examinate, vom considera media
celor n obiecte din tabel, ca ind 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:
1
n
n

i=1

1 +
i 1
m

= 1 +
1
nm
n

i=1
(i 1) = 1 +

1
nm

(n 1)n
2

= 1 +

2

1
2m
.
Deci, timpul total necesar unei cutri cu succes (incluznd timpul pentru calculul funciei de
dispersie) este (2 +/2 1/2m) = (1 +).
Ce semnicaie 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 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. (
Artai c timpul mediu pentru o cutare cu succes este acelai pentru dou ordine ale
unei liste.)
12.2-4 Profesorul Marley emite ipoteza c se poate mbunti esenial performana dac
modicm schema de nlnuire astfel nct ecare list s e pstrat ordonat. n ce mod
afecteaz modicarea profesorului timpul de execuie pentru cutari cu succes, cutri fr
succes, inserri i tergeri?
12.2-5 Sugerai cum poate 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. ) 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 e dublu nlnuit sau este sucient s e 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).
12.3. Funcii de dispersie
n aceast seciune vom discuta unele aspecte legate de construirea de funcii de dispersie
bune, apoi vom prezenta trei scheme pentru crearea lor: dispersia prin diviziune, dispersia prin
nmulire i dispersia universal.
Ce nseamn o funcie de dispersie bun?
O funcie de dispersie bun satisface (aproximativ) ipoteza dispersiei uniforme simple: ecare
cheie se poate dispersa cu aceeai probabilitate n oricare dintre cele m locaii. Mai formal, s
presupunem c ecare cheie este aleas independent din U conform unei distribuii de probabi-
litate P; dei, P(k) este probabilitatea de a aleas cheia k. Atunci ipoteza dispersiei uniforme
simple const n

k:h(k)=j
P(k) =
1
m
pentru j = 0, 1, ..., m1 . (12.1)
Din pcate, n general, nu este posibil vericarea 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) = km|
194 Capitolul 12 Tabele de dispersie
satisface relaia (12.1).
n practic, se pot folosi tehnici euristice pentru a crea funcii de dispersie care par a se
comporta bine. Informaia calitativ despre P este uneori util n procesul de construcie al lor.
De exemplu, s considerm o tabel de simboluri a unui compilator, n care cheile sunt iruri
de caractere arbitrare, reprezentnd identicatori dintr-un program. O situaie des ntlnit este
aceea n care simboluri foarte asemntoare, ca pt i pts, apar n acelai program. O funcie de
dispersie bun va minimiza posibilitatea ca asemenea variaii s se disperseze n aceeai locaie.
O abordare uzual este de a obine valoarea de dispersie ntr-un mod care se vrea independent
de orice model sau ablon ce poate exista ntre date. De exemplu, metoda diviziunii (discutat
n detaliu mai jos) calculeaz valoarea de dispersie ca ind restul mpririi cheii la un numr
prim specicat. n afara cazului n care numrul este ntr-un fel dependent de abloanele din
distribuia de probabilitate P, aceast metod d rezultate bune.
n nal, s remarcm faptul c unele aplicaii ale funciilor de dispersie pot impune proprieti
mai tari dect cele asigurate de dispersia uniform simpl. De exemplu, am putea dori ca unele
chei care sunt apropiate ntr-un anumit sens s produc valori de dispersie care s e total
diferite. (Aceast proprietate este dorit n special cnd folosim vericarea liniar, denit n
seciunea 12.4.)
Interpretarea cheilor ca numere naturale
Majoritatea funciilor de dispersie presupun universul cheilor din mulimea N = 0, 1, 2, ...
a numerelor naturale. Astfel, dac cheile nu sunt numere naturale, trebuie gsit o modalitate
pentru a le interpreta ca numere naturale. De exemplu, o cheie care este un ir de caractere
poate interpretat ca un ntreg ntr-o baz de numeraie aleas convenabil. Prin urmare,
identicatorul pt poate interpretat ca o pereche de numere zecimale (112,116), pentru c p =
112 i t = 116 n mulimea codurilor ASCII; atunci pt exprimat ca un ntreg n baza 128 devine
(112 128)+116 = 14452. n mod obinuit, n orice aplicaie se poate crea direct o astfel de
metod simpl de a interpreta ecare cheie ca un numr natural (posibil mare). n continuare,
vom presupune c avem chei numere naturale.
12.3.1. Metoda diviziunii
Prin metoda diviziunii pentru crearea funciilor de dispersie, transformm o cheie k ntr-
una din cele m locaii considernd restul mpririi lui k la m. Prin urmare, funcia de dispersie
este
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 e o putere a lui 2, pentru c dac m = 2
p
, 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 ]A 2
w
, 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 nal, se poate arta c dac m = 2
p
1 i k este
un ir de caractere interpretat n baza 2
p
, 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 ecare cheie k
ca un ntreg, funcia noastr de dispersie va
h(k) = k mod 701 .
Ca o msur de precauie, putem s vericm ct de uniform distribuie aceast funcie de
dispersie mulimi de chei n locaii, unde cheile sunt alese din date reale.
12.3.2. Metoda nmulirii
Metoda nmulirii pentru crearea de funcii de dispersie opereaz n doi pai. n primul pas,
nmulim cheia k cu o constant A din intervalul 0 < A < 1 i extragem partea fracionar a lui
kA. Apoi, nmulim aceast valoare cu m i considerm partea ntreag inferioar a rezultatului.
Pe scurt, funcia de dispersie este
h(k) = m(kA mod 1)| ,
unde kA mod 1 nseamn partea fracionar a lui kA, adic, kAkA|.
Un avantaj al metodei nmulirii este c valoarea lui m nu este critic. De obicei o alegem ca
ind o putere a lui 2 m = 2
p
pentru un ntreg p pentru c atunci putem implementa funcia pe
majoritatea calculatoarelor dup cum urmeaz. S presupunem c lungimea cuvntului mainii
este de w bii i c k ncape pe un singur cuvnt. Referindu-ne la gura 12.4, nmulim nti
k cu ntregul pe w bii A 2
w
|. Rezultatul este o valoare pe 2w bii r
1
2
w
+ r
0
, unde r
1
este
primul cuvnt al produsului i r
0
este al doilea cuvnt al produsului. Valoarea de dispersie de p
bii dorit const din cei mai semnicativi p bii ai lui r
0
.
196 Capitolul 12 Tabele de dispersie
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)


se va comporta relativ bine.
De exemplu, dac avem k = 123456, m = 10000 i A din relaia (12.2), atunci
h(k) = 10000 (123456 0.61803... mod 1)| = 10000 (76300.0041151... mod 1)| =
= 10000 0.0041151...| = 41.151...| = 41 .
12.3.3. Dispersia universal
Dac cheile ce se disperseaz sunt alese de un adversar maliios, atunci el poate alege n chei
care toate se vor dispersa n aceeai locaie, rezultnd un timp mediu de acces (n). n cazul cel
mai defavorabil, orice funcie de dispersie xat este vulnerabil la acest tip de comportament;
singura modalitate ecient de a mbunti aceast situaie este de a alege funcia de dispersie
n mod astfel nct alegerea s e de cheile care se vor memora. Aceast
abordare, numit dispersie universal, produce n medie o performan bun, indiferent de
ce chei sunt alese de ctre adversar.
Ideea care st la baza dispersiei universale este de a selecta funcia de dispersie n mod
aleator n momentul execuiei dintr-o clas de funcii construit cu atenie. Ca i n cazul sortrii
rapide, randomizarea asigur c nici o intrare nu va produce comportamentul n cazul cel mai
defavorabil. Datorit randomizrii, algoritmul se poate comporta diferit la ecare execuie, chiar
pentru o aceeai intrare. Aceast abordare asigur o performan bun pentru cazul mediu,
indiferent de cheile care sunt date ca intrare. Revenind la exemplul cu tabela de simboluri a unui
compilator, descoperim c alegerea identicatorilor de ctre programator nu poate cauza, din
punct de vedere al consistenei, performane slabe la dispersie. Performana slab apare doar
atunci cnd compilatorul alege o funcie de dispersie aleatoare care provoac o dispersie slab a
mulimii identicatorilor, dar probabilitatea ca aceast situaie s apar este mic i este aceeai
pentru orice mulime de identicatori de aceeai mrime.
Fie H o colecie nit de funcii de dispersie care transform un univers dat U al cheilor, n
domeniul 0, 1, ..., m1. O astfel de colecie se numete universal dac pentru ecare pereche
de chei distincte x, y U, numrul de funcii de dispersie h H pentru care h(x) = h(y) este
exact [H[/m. Cu alte cuvinte, cu o funcie de dispersie aleas aleator din H, ansa unei coliziuni
ntre x i y cnd x = y este exact 1/m, care este exact ansa unei coliziuni dac h(x) i h(y)
sunt alese aleator din mulimea 0, 1, ..., m1.
Urmtoarea teorem arat c o clas universal de funcii de dispersie d un comportament
bun n cazul mediu.
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 ecare pereche y, z de chei distincte, e c
yz
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 deniie, o singur pereche de chei sunt n coliziune cu probabilitatea 1/m, avem
E[c
yz
] = 1/m.
Fie C
x
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
E[C
x
] =

yT
y,=x
E[c
xy
] =
n 1
m
.
Deoarece n m, obinem E[C
x
] < 1.
Dar ct de uor este s construim o clas universal de funcii de dispersie? Este relativ
uor, dup cum se poate demonstra folosind unele cunotine din teoria numerelor. S alegem
dimensiunea m a tabelei noastre ca ind numr prim (ca i n metoda diviziunii). Descompunem
o cheie x n r+1 octei (de exemplu, caractere sau subiruri binare de caractere de lungime x),
astfel nct x = 'x
0
, x
1
, ...x
r
`; singura cerin este ca valoarea maxim a unui octet s e mai
mic dect m. Notm prin a = 'a
0
, a
1
, ...a
r
` un ir de r +1 elemente alese aleator din mulimea
0, 1, ..., m1. Denim o funcie de dispersie corespunztoare h
a
H astfel:
h
a
(x) =
r

i=0
a
i
x
i
mod m . (12.3)
Cu aceast deniie,
H =

a
h
a
. (12.4)
are m
r+1
elemente.
Teorema 12.4 Clasa H denit de relaiile (12.3) i (12.4) este o clas universal de funcii de
dispersie.
Demonstraie. Considerm o pereche oarecare de chei distincte x i y. Presupunem c x
0
= y
0
.
(O argumentaie similar se poate face pentru diferena dintre oricare alte poziii ale octeilor.)
Pentru orice valori xe ale lui a
1
, a
2
, ..., a
r
exist exact o valoare a lui a
0
care satisface ecuaia
h(x) = h(y); acest a
0
este soluia ecuaiei
a
0
(x
0
y
0
)
r

i=1
a
i
(x
i
y
i
) (mod m) .
Pentru a observa aceast proprietate s remarcm faptul c deoarece m este prim, cantitatea
nenul x
0
y
0
are un invers fa de nmulirea modulo m i astfel exist o soluie unic pentru
a
0
modulo m. (Vezi seciunea 33.4.) Prin urmare, ecare pereche de chei x i y este n coliziune
pentru exact m
r
valori ale lui a, deoarece ea este n coliziune exact o dat pentru ecare valoare
posibil a lui 'a
1
, a
2
, ..., a
r
` (de exemplu, pentru valoarea unic a lui a
0
observat mai sus).
Deoarece exist m
r+1
valori posibile pentru secvena a, cheile x i y sunt n coliziune exact cu
probabilitatea m
r
/m
r+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
ecare element conine o cheie k mpreun cu o valoare de dispersie h(k). Fiecare cheie este un
ir lung de caractere. Cum putem prota de valorile de dispersie cnd cutm n list un element
cu o cheie dat?
12.3-2 Presupunem c un ir de r caractere este dispersat pe m poziii, ind considerat ca
numr n baza 128, cruia i se aplic metoda diviziunii. Numrul m este uor de reprezentat
n memorie ca un cuvnt pe 32 de bii, dar irul de r caractere, tratat ca un numr n baza
128, necesit multe cuvinte. Cum putem aplica metoda diviziunii pentru a calcula valoarea de
dispersie a irului de caractere fr a folosi mai mult dect un numr suplimentar constant de
cuvinte de memorie n afar de irul propriu-zis?
12.3-3 Se consider o versiune a metodei diviziunii n care h(k) = k mod m, unde m = 2
p
1
i k este un ir de caractere interpretat n baza 2
p
. Artai c dac irul de caractere x poate
obinut din irul de caractere y prin permutri de caractere, atunci x i y se disperseaz n
aceeai valoare. Dai un exemplu de aplicaie n care aceast proprietate nu este dorit pentru o
funcie de dispersie.
12.3-4 Se consider o tabel de dispersie de dimensiune m = 1000 i funcia de dispersie
h(k) = m(kA mod 1)| pentru A = (

5 1)/2. Calculai locaiile n care se pun cheile 61, 62,


63, 64, i 65.
12.3-5 Artai c dac punem restricia ca ecare component a
i
din a din relaia (12.3) s e
nenul, atunci mulimea H = h
a
denit ca n relaia (12.4) nu este universal. ( Se
consider cheile x = 0 i y = 1.)
12.4. Adresarea deschis
Prin adresare deschis, toate elementele sunt memorate n interiorul tabelei de dispersie.
Prin urmare, ecare intrare n tabel conine e un element al mulimii dinamice, e nil. Cnd
cutm un element, vom examina sistematic locaiile tabelei e pn cnd este gsit elementul
dorit, e pn cnd este clar c elementul nu este n tabel. Nu exist liste sau elemente memorate
n afara tabelei, aa cum se ntmpl n cazul nlnuirii. Prin urmare, prin adresare deschis,
tabela de dispersie se poate umple astfel nct nici o inserare nu mai este posibil; factorul de
ncrcare nu poate depi niciodat valoarea 1.
Desigur, am putea memora listele nlnuite pentru a crea legturile n cadrul tabelei de
dispersie, n locaiile altfel neutilizate ale acesteia (vezi exerciiul 12.2-5), dar avantajul adresrii
deschise este c evit total folosirea pointerilor. Secvena de locaii care se examineaz nu se
determin folosind pointerii, ci se . Spaiul de memorie suplimentar, eliberat prin faptul
c nu memorm pointerii, ofer tabelei de dispersie un numr mai mare de locaii pentru acelai
spaiu de memorie, putnd rezulta coliziuni mai puine i acces mai rapid.
Pentru a realiza inserarea folosind adresarea deschis, examinm succesiv sau vericm
tabela de dispersie pn cnd gsim o locaie liber n care s punem cheia. n loc s e xat
n ordinea 0, 1, ..., m 1 (care necesit un timp de cutare (n)), irul de poziii examinate
12.4. Adresarea deschis 199
. Pentru a determina ce locaii sunt vericate, extindem funcia
de dispersie astfel nct ea s includ i numrul de vericare (ncepnd de la 0) ca un al doilea
argument. Astfel, funcia de dispersie devine
h : U 0, 1, ..., m1 0, 1, ..., m1 .
n cadrul adresrii deschise, cerem ca pentru ecare cheie k, secvena de vericare
'h(k, 0), h(k, 1), ..., h(k, m1)`
s e o permutare a lui '0, 1, ..., m1`, astfel nct ecare poziie din tabela de dispersie s e
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 e o cheie, e 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: i i + 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 fost inserat n acea
locaie i nu mai ncolo n secvena de vericare. (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: i i + 1
7: pn cnd T[j] = nil sau i = m
8: returneaz nil
tergerea dintr-o tabel de dispersie cu adresare deschis este dicil. Cnd tergem o cheie
dintr-o locaie i, nu putem marca pur i simplu acea locaie ca ind liber memornd n ea
200 Capitolul 12 Tabele de dispersie
valoarea nil. Procednd astfel, va imposibil s accesm orice cheie k a crei inserare a vericat
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 modica procedura Dispersie-Insereaz astfel nct s trateze
astfel de locaii ca i cnd ar libere, astfel nct o nou cheie s poat inserat. Nu este
necesar nici o modicare 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 ecare cheie
considerat poate avea, cu aceeai probabilitate, oricare dintre cele m! permutri ale mulimii
0, 1, ..., m1 ca secven de vericare. Dispersia uniform generalizeaz noiunea de dispersie
uniform simpl, denit anterior, pentru situaia n care funcia de dispersie produce nu doar
un singur numr, ci o ntreag secven de vericare. Oricum, dispersia uniform real este dicil
de implementat i n practic sunt folosite aproximri convenabile (ca dispersia dubl, denit
mai trziu).
n mod obinuit sunt utilizate trei tehnici pentru a calcula secvenele de vericare necesare
adresrii deschise: vericarea liniar, vericarea ptratic i dispersia dubl. Toate aceste tehnici
garanteaz c 'h(k, 0), h(k, 1), ..., h(k, m1)` este o permutare a lui '0, 1, ..., m1` pentru ecare
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 m
2
secvene de vericare diferite (n loc de m!
ct cere dispersia uniform). Dispersia dubl are cel mai mare numr de secvene de vericare
i, dup cum era de ateptat, d cele mai bune rezultate.
Vericarea liniar
Fiind dat o funcie de dispersie ordinar h
t
: U 0, 1, ..., m 1, metoda vericrii
liniare folosete funcia de dispersie
h(k, i) = (h
t
(k) +i) mod m
pentru i = 0, 1, ..., m1. Fiind dat o cheie k, prima locaie examinat (vericat) este T[h
t
(k)].
Apoi examinm locaia T[h
t
(k) +1] i aa mai departe pn la locaia T[m1]. Apoi continum
circular cu locaiile T[0], T[1], ..., pn cnd, n nal, vericm locaia T[h
t
(k) 1]. Deoarece
poziia de start a vericrii determin ntreaga secven de vericare liniar, prin care sunt
folosite doar m secvene de vericri distincte.
Vericarea 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 ecare locaie de
indice par este ocupat i ecare locaie de indice impar este liber, atunci cutarea fr succes
necesit, 1,5 vericri n cazul mediu. Dac primele n = m/2 locaii sunt cele ocupate, numrul
mediu de vericri 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 e urmtoarea completat este (i +1)/m, comparativ cu probabilitatea de 1/m pentru
cazul n care locaia precedent ar fost liber. Prin urmare, irurile de locaii ocupate tind s
se lungeasc i vericarea liniar nu este o aproximare foarte bun a dispersiei uniforme.
12.4. Adresarea deschis 201
Vericarea ptratic
Vericarea ptratic folosete o funcie de dispersie de forma
h(k, i) = (h
t
(k) +c
1
i +c
2
i
2
) mod m, (12.5)
unde (ca i n cazul vericrii liniare) h
t
este o funcie de dispersie auxiliar, c
1
i c
2
= 0
sunt constante auxiliare i i = 0, 1, ..., m1. Poziia vericat iniial este T[h
t
(k)]; urmtoarele
poziii examinate sunt decalate cu cantiti ce depind ntr-o manier ptratic de numrul de
vericare i. Aceast metod lucreaz mult mai bine dect vericarea liniar, dar pentru a folosi
integral tabela de dispersie valorile lui c
1
, c
2
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 vericrii, atunci secvenele lor de vericare coincid, pentru c
h(k
1
, 0 = h(k
2
, 0) implic h(k
1
, i) = h(k
2
, i). Aceast situaie conduce la o form mai uoar
de grupare, numit grupare secundar. Ca i n cazul vericrii liniare, vericarea iniial
determin ntreaga secven, deci sunt folosite doar m secvene de vericare 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) = (h
1
(k) +ih
2
(k)) mod m,
unde h
1
i h
2
sunt funcii de dispersie auxiliare. Poziia examinat iniial este T[h
1
(k)]; poziiile
succesive de vericare sunt decalate fa de poziiile anterioare cu h
2
(k) modulo m. Astfel,
contrar situaiei de vericarea liniar sau ptratic, n acest caz secvena de vericare depinde
n dou moduri de cheia k, pentru c e poziia iniial de vericare, e decalajul, e amndou
pot varia. Figura 12.5 ilustreaz un exemplu de inserare prin dispersie dubl.
Valoarea h
2
(k) i dimensiunea tabelei de dispersie m trebuie s e prime ntre ele pentru
a parcurs ntreaga tabel de dispersie. n caz contrar, dac m i h
2
(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 h
2
astfel nct s produc
ntotdeauna un numr impar. O alt modalitate este de a avea m prim i de a construi h
2
astfel
nct s returneze ntotdeauna un ntreg pozitiv mai mic dect m. De exemplu, putem alege m
prim i
h
1
(k) = k mod m,
h
2
(k) = 1 + (k mod m
t
) ,
unde m
t
este ales s e un pic mai mic dect m (s zicem m1 sau m2). De exemplu, dac
k = 123456, m = 701 i m
t
= 700, avem h
1
(k) = 80 i h
2
(k) = 257, deci prima vericare se a
la poziia 80 i ecare 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 vericarea liniar sau ptratic n sensul
c sunt folosite (m
2
) secvene de vericare, fa de (m), pentru c ecare pereche posibil
(h
1
(k), h
2
(k)) produce o secven de vericare 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 h
1
(k) =
k mod 13 i h
2
(k) = 1+(k mod 11). Deoarece 14 1 mod 13 i 14 3 mod 11, cheia 14 va inserat
n locaia liber 9, dup ce locaiile 1 i 5 au fost examinate i gsite ca ind deja ocupate.
a vericrii h
1
(k) i decalajul h
2
(k) pot varia independent. Ca rezultat, performana dispersiei
duble apare ca ind foarte apropiat de performana schemei ideale a dispersiei uniforme.
Analiza dispersiei cu adresare deschis
Analiza noastr pentru adresarea deschis, este, ca i analiza pentru nlnuire, exprimat
n termenii factorului de ncrcare al tabelei de dispersie, cnd n i m tind spre innit. S
reamintim c dac sunt memorate n elemente ntr-o tabel cu m locaii, numrul mediu de
elemente pe locaie este = n/m. Desigur, prin adresare deschis, avem cel mult un element
ntr-o locaie i, prin urmare, n m, ceea ce implic 1.
Presupunem c este folosit dispersia uniform. n aceast schem idealizat, secvena de
vericare 'h(k, 0), h(k, 1), ..., h(k, m1)` pentru orice cheie k poate s apar sub forma oricrei
permutri a mulimii '0, 1, ..., m1`. Aceasta nseamn c ecare secven de vericare posibil
poate folosit ca secven de vericare pentru o inserare sau o cutare. Desigur, o cheie dat
are o secven de vericare unic, x, asociat ei; considernd distribuia de probabilitate pe
spaiul cheilor i operaia funciei de dispersie pe chei, ecare secven de vericare posibil are
aceeai probabilitate de apariie.
Analizm acum numrul mediu de vericri pentru dispersia cu adresare deschis, n ipoteza
dispersiei uniforme i ncepem cu o analiz a numrului de vericri ce apar ntr-o cutare fr
succes.
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 vericri dintr-o cutare fr
succes este cel mult 1/(1 ).
Demonstraie. ntr-o cutare fr succes, ecare vericare, cu excepia ultimei, acceseaz o
12.4. Adresarea deschis 203
locaie ocupat care nu conine cheia dorit, iar ultima locaie examinat este liber. Denim
p
i
= Pr exact i vericri acceseaz locaiile ocupate
pentru i = 0, 1, 2, .... Pentru i > n, avem p
i
= 0, pentru c putem gsi cel mult n locaii deja
ocupate. Astfel, numrul mediu de vericri este
1 +

i=1
ip
i
(12.6)
Pentru a evalua relaia (12.6), denim
q
i
= Pr cel puin i vericri acceseaz locaiile ocupate
pentru i = 0, 1, 2, .... Apoi putem folosi identitatea (6.28):

i=1
ip
i
=

i=1
q
i
.
Care este valoarea lui q
i
pentru i 1? Probabilitatea ca prima vericare s acceseze o locaie
ocupat este n/m; prin urmare,
q
1
=
n
m
.
Prin dispersie uniform, a doua vericare, n cazul n care este necesar, va la una din cele
m1 locaii rmase nevericate, din care n1 sunt ocupate. Facem a doua vericare doar dac
prima vericare acceseaz o locaie ocupat; prin urmare,
q
2
=

n
m

n 1
m1

.
n general, a i-a vericare este necesar doar dac primele i 1 vericri 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,
q
i
=

n
m

n 1
m1

...

n i + 1
mi + 1

n
m

i
=
i
pentru i = 1, 2, ..., n, pentru c (n j)/(mj) n/m dac n m i j 0. Dup n vericri,
toate cele n locaii ocupate au fost vizitate i nu vor vericate din nou i astfel q
i
= 0 pentru
i > n.
Acum se poate evalua relaia (12.6). Presupunnd < 1, numrul mediu de vericri ntr-o
cutare fr succes este
1 +

i=0
ip
i
= 1 +

i=1
q
i
1 + +
2
+
3
+... =
1
1
. (12.7)
Relaia (12.7) are o interpretare intuitiv: prima vericare se face ntotdeauna, a doua
vericare este necesar cu o probabilitate aproximativ egal cu , a treia vericare 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
vericri ntr-o cutare fr succes este cel mult 1/(1.5) = 2. Dac este 90% ocupat, numrul
mediu de vericri 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) vericri, 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 vericri este cel mult 1/(1 ).
Calculul numrului mediu de vericri 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 vericri ntr-o cutare cu succes este cel mult
1

ln
1
1
,
n ipoteza dispersiei uniforme i presupunnd c ecare cheie din tabel este cutat cu aceeai
probabilitate.
Demonstraie. O cutare pentru o cheie k urmeaz aceeai secven de vericare ce a fost
urmat cnd elementul avnd cheia k a fost inserat. Conform corolarului 12.6, dac k a fost a
i + 1-a cheie inserat n tabela de dispersie, numrul mediu de vericri fcute ntr-o cutare a
lui k este cel mult 1/(1 i/m) = m(mi). Calculnd media peste toate cele n chei din tabela
de dispersie, obinem numrul mediu de vericri dintr-o cutare cu succes:
1
n
n1

i=0
m
mi
=
m
n
n1

i=0
1
mi
=
1

(H
m
H
mn
) ,
unde H
i
=

i
j=1
1/j este al i-lea numr armonic (denit ca n relaia (3.5)). Folosind marginile
lni H
i
lni + 1 din relaiile (3.11) i (3.12), obinem
1

(H
m
H
mn
) =
1

k=mn+1
1/k
1

m
mn
(1/x)dx
=
1

ln(m/(mn)) =
1

ln(1/(1 ))
ca mrginire pentru numrul mediu de vericri ntr-o cutare cu succes.
Dac tabela de dispersie este pe jumtate ocupat, numrul mediu de vericri ntr-o cutare
cu succes este mai mic dect 1,387. Dac tabela de dispersie este 90% ocupat, numrul mediu
de vericri este mai mic dect 2,559.
Probleme 205
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 h
t
(k) = k mod m.
Ilustrai rezultatul inserrii acestor chei folosind vericarea liniar, vericarea ptratic cu c
1
= 1
i c
2
= 3 i folosind dispersia dubl cu h
2
(k) = 1 + (k mod (m1)).
12.4-2 Scriei un algoritm n pseudocod pentru Dispersie-terge dup descrierea din text
i modicai 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) = (h
1
(k) + ih
2
(k)) mod m. Artai c secvena de vericare
'h(k, 0), h(k, 1), ..., h(k, m 1)` este o permutare a secvenei de locaii '0, 1, ..., m 1` dac i
numai dac h
2
(k) este relativ prim cu m. ( 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 vericri ntr-o cutare
fr succes i pentru numrul mediu de vericri ntr-o cutare cu succes. Care este numrul
mediu de vericri 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
o coliziune. Artai c p(n, m) e
n(n1)/2m
. ( 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 vericri ntr-o cutare
fr succes este de dou ori mai mare dect numrul mediu de vericri dintr-o cutare cu
succes. Folosii estimarea (1/)ln(1/(1)) pentru numrul de vericri necesare ntr-o cutare
cu succes.
Probleme
12-1 Marginea celei mai lungi vericri 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 vericri este cel mult 2
k
.
b. Artai c pentru i = 1, 2, ..., n, probabilitatea ca a i-a inserare s necesite mai mult de
2 lg n vericri este cel mult 1/n
2
.
Fie variabila aleatoare X
i
, semnicnd numrul de vericri necesare pentru a i-a inserare.
Ai artat la punctul (b) c PrX
i
> 2 lg n 1/n
2
. Fie variabila aleatoare X = max
1in
X
i
care semnic numrul maxim de vericri necesare oricreia din cele n inserri.
206 Capitolul 12 Tabele de dispersie
c. Artai c PrX > 2 lg n 1/n.
d. Artai c lungimea medie a celei mai lungi secvene de vericare este E[X] = O(lg n).
12-2 Cutarea ntr-o mulime static
Se cere s se implementeze o mulime dinamic avnd n elemente, n care cheile sunt numere.
Mulimea este static (nu exist operaiile Insereaz i terge) i singura operaie necesar
este Caut. Se pune la dispoziie un timp arbitrar pentru a preprocesa cele n elemente, astfel
nct operaiile de cutare s se execute rapid.
a. Artai c procedura Caut poate 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. Se consider implementarea mulimii printr-o tabel de dispersie cu adresare deschis avnd
m locaii care folosete dispersia uniform. Care este spaiul minim necesar (de lungime
mn) suplimentar pentru ca performana, n cazul mediu a unei cutri fr succes, s e
cel puin la fel de bun ca marginea de la punctul (a)? Rspunsul trebuie s e o mrginire
asimptotic a lui mn n funcie de n.
12-3 Margini pentru mrimea locaiei la nlnuire
S presupunem c avem o tabel de dispersie cu n locaii, avnd coliziuni rezolvate prin nlnuire
i s presupunem c se insereaz n chei n tabel. Fiecare cheie se poate dispersa, cu aceeai
probabilitate, n oricare dintre locaii. Fie M numrul maxim de chei ntr-o locaie, dup ce toate
cheile au fost inserate. Demonstrai c E[M], valoarea medie a lui M, are o margine superioar
egal cu O(lg n/ lg lg n).
a. Fie Q
k
probabilitatea ca un numr de k chei s se disperseze ntr-o locaie particular.
Argumentai c probabilitatea Q
k
este dat de
Q
k
=

1
n

1
1
n

nk

n
k

.
b. Fie P
k
probabilitatea ca M = k, adic probabilitatea ca locaia care conine cele mai multe
chei s conin k chei. Artai c P
k
nQ
k
.
c. Folosii aproximarea Stirling, din relaia (2.11), pentru a arta c Q
k
< e
k
/k
k
.
d. Artai c exist o constant c > 1 astfel nct Q
k
0
< 1/n
3
pentru k
0
= c lg n/ lg lg n.
Deducei c P
k
< 1/n
2
pentru k = c lg n/ lg lg n.
e. Artai c
E[M] Pr

M >
c lg n
lg lg n

n + Pr

M
c lg n
lg lg n

c lg n
lg lg n
.
Deducei c E[M] = O(lg n/ lg lg n).
Note bibliograce 207
12-4 Vericarea ptratic
S presupunem c avem o cheie k, care trebuie cutat ntr-o tabel de dispersie avnd poziiile
0, 1, ..., m1 i s presupunem c avem o funcie de dispersie h care transform spaiul cheilor
n mulimea 0, 1, ..., m1. Schema de cutare este urmtoarea.
1. Se calculeaz valoarea i h(k) i se iniializeaz j 0.
2. Se veric poziia i pentru cheia dorit k. Dac se gsete sau dac poziia este liber
atunci cutarea se termin.
3. Se fac atribuirile j (i +j) mod m i se revine la pasul 2.
Se presupune c m este o putere a lui 2.
a. Artai c aceast schem este o instaniere a schemei generale de vericare ptratic
evideniind valorile specice ale constantelor c
1
i c
2
din relaia (12.5).
b. Demonstrai c acest algoritm examineaz ecare poziie din tabel n cazul cel mai
defavorabil.
12-5 dispersie k-universal
Fie H = h o clas de funcii de dispersie n care ecare h transform universul U al
cheilor n 0, 1, ..., m 1. Spunem c H este k-universal dac pentru ecare secven x
de k chei distincte 'x
1
, x
2
, ..., x
k
` i pentru ecare funcie h aleas aleator din H, secvena
'h(x
1
), h(x
2
), ..., h(x
k
)` este, cu aceeai probabilitate, oricare dintre cele m
k
secvene de lungime
k avnd elemente din 0, 1, ..., m1.
a. Artai c dac H este 2-universal atunci ea este universal.
b. Artai c clasa H denit n seciunea 12.3.3 nu este 2-universal.
c. Artai c dac modicm deniia lui H din seciunea 12.3.3 astfel nct ecare funcie
s conin un termen constant b, adic dac nlocuim h(x) cu
h
a,b
(x) =
r

i=0
a
i
x
i
+b mod m,
atunci H este 2-universal.
Note bibliograce
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 specice 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.
13.1. Ce este un arbore binar de cutare?
Aa cum sugereaz numele su, un arbore binar de cutare este organizat sub form de
arbore binar, aa cum se observ n gura 13.1. Un astfel de arbore se poate reprezenta printr-o
structur de date nlnuit, n care ecare nod este un obiect. Pe lng un cmp cheie i date
adiionale, ecare obiect nod conine cmpurile , dreapta i p care puncteaz spre (refer)
nodurile corespunztoare ului stng, ului drept i respectiv printelui nodului. Dac un u
sau un printe lipsete, cmpul corespunztor acestuia va conine valoarea nil. Nodul rdcin
este singurul nod din arbore care are valoarea nil pentru cmpul printe p.
ntr-un arbore binar de cutare, cheile sunt ntotdeauna astfel memorate nct ele satisfac
proprietatea arborelui binar de cutare:
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 gura 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 ecient care conine aceleai chei i are nlimea 4.
proprietate se veric pentru ecare nod din arbore. De exemplu, cheia 3 din gura 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( [T]).
Arbore-Traversare-Inordine(x)
1: dac x = nil atunci
2: Arbore-Traversare-Inordine( [x])
3: aeaz cheie[x]
4: Arbore-Traversare-Inordine(dreapta[x])
Spre exemplu, traversarea n inordine a arborelui aeaz cheile ecruia dintre arborii binari
de cutare din gura 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 ecare nod din arbore o dat pentru
ul su stng i nc o dat pentru ul 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 aa 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.
( 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 (nlg 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 (nlg n) n cazul cel mai defavorabil.
13.2. Interogarea ntr-un arbore binar de cutare
Principala operaie efectuat pe un arbore binar de cutare este cutarea unei chei memorate
n acesta. n afar de operaia Caut, arborii binari de cutare permit i alte interogri precum
Minim, Maxim, Succesor i Predecesor. n aceast seciune vom examina aceste operaii i
vom arta c ecare dintre ele se poate executa ntr-un timp O(h) pe un arbore binar de cutare
de nlime h.
Cutarea
Procedura urmtoare poate 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( [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 u stng este de asemenea strmo pentru 13. n cazul nodului avnd cheia 13, succesorul
este nodul avnd cheia 15.
Procedura ncepe cutarea cu rdcina i traseaz un drum n jos n arbore, aa cum se
ilustreaz n gura 13.2. Pentru ecare nod x ntlnit, se compar cheia k cu cheie[x]. Dac
cele dou chei sunt egale, cutarea s-a terminat. Dac k are o valoare mai mic dect cheie[x],
cutarea continu n subarborele stng al lui x, deoarece din proprietatea arborelui binar de
cutare rezult c k nu poate memorat n subarborele drept al lui x. Simetric, dac k este
mai mare dect cheie[x], cutarea continu n subarborele drept al lui x. Nodurile traversate n
timpul aplicrii recursive a acestei proceduri formeaz un drum n jos, pornind de la rdcin,
deci timpul de execuie al procedurii Arbore-Caut este O(h), unde h este nlimea arborelui.
Aceeai procedur se poate scrie iterativ, prin derularea recursivitii ntr-un ciclu ct
timp. Versiunea iterativ este mai ecient pe majoritatea calculatoarelor.
Arbore-Caut-Iterativ(x, k)
1: ct timp x = nil i k = cheie[x] execut
2: dac k < cheie[x] atunci
3: x [x]
4: altfel
5: x dreapta[x]
6: returneaz x
Minimul i maximul
Determinarea elementului avnd cheia minim dintr-un arbore binar de cutare se realizeaz
ntotdeauna urmnd pointerii u ncepnd cu rdcina i terminnd cnd se ntlnete
nil, aa cum se ilustreaz n gura 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 [x] = nil execut
2: x [x]
3: returneaz x
Proprietatea arborelui binar de cutare garanteaz corectitudinea algoritmului Arbore-
Minim. Dac un nod x nu are subarbore stng, atunci din faptul c ecare cheie din subarborele
su drept este cel puin la fel de mare ca i cheie[x] rezult c cheia minim a subarborelui
avnd rdcina x este chiar cheie[x]. Dac nodul x are un subarbore stng, atunci deoarece orice
cheie din subarborele su drept este mai mare sau egal cu cheie[x] i orice cheie din subarborele
su stng este mai mic sau egal cu cheie[x], rezult c cheia minim din subarborele avnd
rdcina x este cheia minim a subarborelui avnd rdcina [x].
Pseudocodul pentru procedura Arbore-Maxim este simetric.
Arbore-Maxim(x)
1: ct timp dreapta[x] = nil execut
2: x dreapta[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.
Succesorul i predecesorul unui nod
Cunoscnd un nod dintr-un arbore binar de cutare, este important cteodat s putem
determina succesorul su n ordinea de sortare determinat de traversarea n inordine a arborelui.
Dac toate cheile sunt distincte, succesorul unui nod x este nodul avnd cea mai mic cheie mai
mare dect cheie[x]. Structura de arbore binar de cutare permite determinarea succesorului
unui nod chiar i fr compararea cheilor. Procedura urmtoare returneaz succesorul unui nod
x dintr-un arbore binar de cutare, dac succesorul exist, sau nil, dac x are cea mai mare
cheie din arbore.
Arbore-Succesor(x)
1: dac dreapta[x] = nil atunci
2: returneaz Arbore-Minim(dreapta[x])
3: y p[x]
4: ct timp y = nil i x = dreapta[y] execut
5: x y
6: y p[y]
7: returneaz y
Codul procedurii Arbore-Succesor trateaz dou alternative. Dac subarborele drept al
nodului x nu este vid, atunci succesorul lui x este chiar cel mai din stnga nod din acest subar-
bore drept, care este determinat n linia 2 prin apelul Arbore-Minim(dreapta[x]). De exemplu,
succesorul nodului cu cheia 15 din gura 13.2 este nodul cu cheia 17.
n cellalt caz, cnd subarborele drept al nodului x este vid i x are un succesor y, atunci
y este cel mai de jos strmo al lui x al crui u din stnga este de asemenea strmo al lui x.
13.2. Interogarea ntr-un arbore binar de cutare 213
n gura 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 ul 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 e un drum n josul arborelui, e 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 poate 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 arm 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 inrme 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 e cea mai mic cheie din T care este mai mare dect
cheie[x] e cea mai mare cheie din T care este mai mic dect cheie[x].
214 Capitolul 13 Arbori binari de cutare
13.3. Inserarea i tergerea
Operaiile de inserare i tergere provoac modicarea mulimii dinamice reprezentat de
arborele binar de cutare. Structura de date trebuie modicat n sensul c ea trebuie pe de o
parte s reecte inserarea sau tergerea, iar pe de alt parte s conserve proprietatea arborelui
binar de cutare. Aa cum vom vedea n cele ce urmeaz, modicarea unui arbore pentru a insera
un element nou, este relativ simpl (direct), pe cnd gestiunea tergerii unui element este mai
complicat.
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, [z] = nil
i dreapta[z] = nil. Ea va modica arborele T i unele dintre cmpurile lui z astfel nct z va
inserat pe poziia corespunztoare n arbore.
Arbore-Insereaz(T, z)
1: y nil
2: x [T]
3: ct timp x = nil execut
4: y x
5: dac cheie[z] < cheie[x] atunci
6: x [x]
7: altfel
8: x dreapta[x]
9: p[z] y
10: dac y = nil atunci
11: [T] z
12: altfel dac cheie[z] < cheie[y] atunci
13: [y] z
14: altfel
15: dreapta[y] z
Figura 13.3 ilustreaz modul de lucru al procedurii Arbore-Insereaz. Ca i Arbore-
Caut i Arbore-Caut-Iterativ, Arbore-Insereaz ncepe cu rdcina arborelui i
traseaz un drum n jos. Pointerul x va referi nodul din drum, iar pointerul y va referi printele
lui x. Dup iniializare, ciclul ct timp din liniile 38 asigur deplasarea acestor pointeri n josul
arborelui, selectarea alternativei la stnga sau la dreapta realizndu-se n funcie de rezultatul
comparrii cheilor cheie[z] i cheie[x], pn cnd x este setat pe nil. Acest nil ocup poziia n
care trebuie s e plasat elementul z. Liniile 915 realizeaz setarea pointerilor pentru a realiza
efectiv inserarea lui z.
Ca i celelalte operaii primitive pe arborii de cutare, procedura Arbore-Insereaz se
execut ntr-un timp O(h) pe un arbore de nlime h.
13.3. Inserarea i tergerea 215
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
semnic 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 gura
13.4. Dac z nu are i, se va modica printele su p[z] pentru a-i nlocui ul z cu nil. Dac
nodul are un singur u, z va eliminat din arbore prin inserarea unei legturi de la printele
lui z la ul lui z. n sfrit, dac nodul are doi i, se va elimina din arbore succesorul y al lui z,
care nu are u 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 [z] = nil sau dreapta[z] = nil atunci
2: y z
3: altfel
4: y Arbore-Succesor(z)
5: dac [y] = nil atunci
6: x [y]
7: altfel
8: x dreapta[y]
9: dac x = nil atunci
10: p[x] p[y]
11: dac p[y] = nil atunci
12: [T] x
13: altfel dac y = [p[y]] atunci
14: [p[y]] x
15: altfel
16: dreapta[p[y]] x
17: dac y = 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 ecare situaie, nodul care se
terge este haurat mai deschis dect celelalte. (a) Dac z nu are i, pur i simplu se terge. (b) Dac z
are un singur u, z se elimin din arbore. (c) Dac z are doi i, se elimin succesorul y al su, care are
cel mult un u, 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 e
chiar nodul de intrare z (dac z are cel mult un u) e succesorul lui z (dac z are doi i). Apoi,
n liniile 58, x se seteaz e la ul diferit de nil al lui y e la nil dac y nu are i. Nodul
y este eliminat din arbore n liniile 916 prin modicarea 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 i, atunci succesorul
su nu are u stng iar predecesorul su nu are u 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
dicultile 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 i, 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
modicat algoritmul Arbore-terge pentru a implementa o astfel de strategie echitabil?
13.4. Arbori binari de cutare construii aleator
Am demonstrat c toate operaiile de baz pe un arbore binar de cutare se execut ntr-
un timp O(h), h ind nlimea arborelui. nlimea unui arbore binar de cutare se schimb
continuu cnd se fac inserri i tergeri de noduri n/din arbore. Pentru a analiza comportamentul
arborilor binari de cutare, n practic, va trebui s facem anumite ipoteze statistice asupra
distribuiei cheilor i asupra irului de inserri i tergeri.
218 Capitolul 13 Arbori binari de cutare
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 creat numai prin
inserri, analiza ar mai simpl. Vom deni prin urmare noiunea de arbore binar de cutare
construit aleator cu n chei distincte, ca ind 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 k
1
, k
2
, . . . , k
n
(n ordine) ntr-un arbore binar de cutare iniial vid. Cheia k
i
este un strmo al cheii k
j
n T,
pentru 1 i < j n, dac i numai dac:
k
i
= mink
l
: 1 l i i k
l
> k
j

sau
k
i
= maxk
l
: 1 l i i k
l
< k
j
.
Demonstraie. : Presupunem c k
i
este un strmo al lui k
j
. Notm cu T
i
arborele care
rezult dup ce au fost inserate n ordine cheile k
1
, k
2
, . . . , k
i
. Drumul de la rdcin la nodul
k
i
n T
i
este acelai cu drumul de la rdcin la nodul k
i
n T. De aici rezult c dac s-ar insera
n T
i
nodul k
j
, acesta (k
j
) ar deveni e u stng, e u drept al nodului k
i
. Prin urmare (vezi
exerciiul 13.2-6), k
i
este e cea mai mic cheie dintre k
1
, k
2
, . . . , k
i
care este mai mare dect
k
j
, e cea mai mare cheie dintre k
1
, k
2
, . . . , k
i
care este mai mic dect k
j
.
: Presupunem c k
i
este cea mai mic cheie dintre k
1
, k
2
, . . . , k
i
care este mai mare dect
k
j
. (Cazul cnd k
i
este cea mai mare cheie dintre k
1
, k
2
, . . . , k
i
care este mai mic dect k
j
se
trateaz simetric). Compararea cheii k
j
cu oricare dintre cheile de pe drumul de la rdcin la
k
i
n arborele T, produce aceleai rezultate ca i compararea cheii k
i
cu cheile respective. Prin
urmare, pentru inserarea lui k
j
se va parcurge drumul de la rdcin la k
i
, apoi k
j
se va insera
ca descendent al lui k
i
.
Urmtorul corolar al lemei 13.3 caracterizeaz precis adncimea unei chei n funcie de
permutarea de intrare.
Corolarul 13.4 Fie T arborele care rezult prin inserarea a n chei distincte k
1
, k
2
, . . . , k
n
(n
ordine) ntr-un arbore binar de cutare iniial vid. Pentru o cheie k
j
dat, unde 1 j n,
denim mulimile:
G
j
= k
i
: 1 i < j i k
l
> k
i
> k
j
pentru toi indicii l < i cu k
l
> k
j

i
L
j
= k
i
: 1 i < j i k
l
< k
i
< k
j
pentru toi indicii l < i cu k
l
< k
j
.
13.4. Arbori binari de cutare construii aleator 219
Figura 13.5 Ilustrarea celor dou mulimi G
j
i L
j
care conin cheile de pe drumul de la rdcina
unui arbore binar de cutare la cheia k
j
= 17. (a) Nodurile care au cheile n G
j
sunt haurate cu negru,
iar nodurile care au cheile n L
j
sunt albe. Toate celelalte noduri sunt haurate cu gris. Drumul n jos
de la rdcin la nodul cu cheia k
j
este ngroat. Cheile care sunt la stnga liniei ngroate sunt mai
mici dect k
j
, iar cele de la dreapta acestei linii sunt mai mari dect k
j
. Arborele se construiete prin
inserarea cheilor n ordinea dat de prima list din (b). Mulimea G

j
= {21, 25, 19, 29} conine acele
elemente care se insereaz nainte de 17 i sunt mai mari dect 17. Mulimea G
j
= {21, 19} conine
acele elemente care modic minimul elementelor din G

j
. Astfel, 21 este n G
j
deoarece el este primul
element din mulime. Cheia 25 nu este n G
j
deoarece este mai mare dect elementul minim curent,
adic 21. Cheia 19 este n G
j
deoarece ea este mai mic dect minimul curent care este 21 i deci noul
minim curent va 19. Cheia 29 nu este n G
j
deoarece este mai mare dect elementul minim curent,
adic 19. Structura mulimilor L

j
i L
j
este simetric.
Atunci cheile de pe drumul de la rdcin la k
j
sunt chiar cheile din G
j
L
j
iar adncimea
oricrei chei k
j
din T este
d(k
j
, T) = [G
j
[ +[L
j
[.
Figura 13.5 ilustreaz cele dou mulimi G
j
i L
j
. G
j
conine toate cheile k
i
inserate nainte de
k
j
astfel nct k
i
este cea mai mic cheie din k
1
, k
2
, . . . , k
i
care este mai mare dect k
j
(structura
lui L
j
este simetric). Pentru a nelege mai bine mulimea G
j
, s ncercm s gsim o metod
de enumerare a elementelor sale. Dintre cheile k
1
, k
2
, . . . , k
j1
vom considera n ordine numai
pe acelea care sunt mai mari dect k
j
. Aceste chei formeaz mulimea notat n gur cu G
t
j
.
220 Capitolul 13 Arbori binari de cutare
Pe msur ce inserm cheile, vom reine, n timp real, minimul. Mulimea G
j
va format din
acele chei care suprascriu minimul.
Pentru a facilita analiza, vom simplica 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 modic n medie minimul
mulimii numerelor deja inserate? Pentru a rspunde la aceast ntrebare, s presupunem c al
i-lea numr inserat este k
i
, pentru i = 1, 2, . . . , n. Probabilitatea ca k
i
s e minimul primelor
i numere este 1/i, deoarece rangul (poziia) lui k
i
ntre primele i numere este egal probabil cu
oricare dintre cele i ranguri posibile. Prin urmare, numrul mediu de modicri ale minimului
mulimii este
n

i=1
1
i
= H
n
,
unde H
n
= lnn +O(1) este al n-lea numr armonic (vezi relaia (3.5) i problema 6-2).
Prin urmare, ne ateptm ca numrul de modicri ale minimului s e aproximativ egal cu
lnn, iar lema urmtoare arat c probabilitatea ca numrul s e mult mai mare este foarte
mic.
Lema 13.5 Fie k
1
, k
2
, . . . , k
n
o permutare oarecare a unei mulimi de n numere distincte i e
[S[ variabila aleatoare care este cardinalul mulimii
S = k
i
: 1 i n i k
l
> k
i
pentru orice l < i . (13.1)
Atunci Pr[S[ ( +1)H
n
1/n
2
, unde H
n
este al n-lea numr armonic, iar 4, 32 veric
ecuaia (ln 1) = 2.
Demonstraie. Putem considera c determinarea cardinalului mulimii S se face prin n ncercri
Bernoulli, avnd succes la a i-a ncercare dac k
i
este mai mic dect elementele k
1
, k
2
, . . . , k
i1
.
Probabilitatea de a avea succes la a i-a ncercare este 1/i. ncercrile sunt independente deoarece
probabilitatea ca k
i
s e minimul dintre elementele k
1
, k
2
, . . . , k
i
este independent de ordonarea
relativ a mulimii k
1
, k
2
, . . . , k
i1
.
Putem folosi teorema 6.6 pentru a mrgini probabilitatea ca [S[ (+1)H
n
. Valoarea medie
pentru [S[ este = H
n
lnn. Deoarece > 1, din teorema 6.6 rezult
Pr[S[ ( + 1)H
n
= Pr[S[ H
n

eH
n
H
n

H
n
= e
(1ln )H
n
e
(ln 1) ln n
= n
(ln 1)
= 1/n
2
,
n care am folosit deniia lui .
Acum avem instrumente pentru a mrgini nlimea unui arbore binar de cutare construit
aleator.
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
Demonstraie. Fie k
1
, k
2
, . . . , k
n
o permutare oarecare a celor n chei i e T arborele binar de
cutare care rezult prin inserarea cheilor n ordinea specicat pornind de la un arbore iniial
vid. Vom discuta prima dat probabilitatea ca adncimea d(k
j
, T) a unei chei date k
j
s e
cel puin t, pentru o valoare t arbitrar. Conform caracterizrii adncimii d(k
j
, T) din corolarul
13.4, dac adncimea lui k
j
este cel puin t, atunci cardinalul uneia dintre cele dou mulimi G
j
i L
j
trebuie s e cel puin t/2. Prin urmare,
Prd(k
j
, T) t Pr[G
j
[ t/2 +Pr[L
j
[ t/2 . (13.2)
S examinm la nceput Pr[G
j
[ t/2. Avem
Pr[G
j
[ t/2
= Pr[k
i
: 1 i < j i k
l
> k
i
> k
j
pentru orice l < i[ t/2
Pr[k
i
: i n i k
l
> k
i
pentru orice l < i[ t/2
= Pr[S[ t/2 ,
unde S este denit n relaia (13.1). n sprijinul acestei armaii, 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 k
i
> k
j
, deoarece prin aceasta se nlocuiete o permutare a (de regul) mai
puin de n elemente (i anume acele chei k
i
care sunt mai mari dect k
j
) cu o alt permutare
oarecare de n elemente.
Folosind o argumentare similar, putem demonstra c
Pr[L
j
[ t/2 Pr[S[ t/2 ,
i apoi, folosind inegalitatea (13.2) obinem:
Prd(k
j
, T) t 2Pr[S[ t/2 .
Dac alegem t = 2( +1)H
n
, unde H
n
este al n-lea numr armonic iar 4.32 veric ecuaia
(ln 1) = 2, putem aplica lema 13.5 pentru a concluziona c
Prd(k
j
, T) 2( + 1)H
n
2Pr[S[ ( + 1)H
n
2/n
2
.
Deoarece discutm despre un arbore binar de cutare construit aleator i cu cel mult n noduri,
probabilitatea ca adncimea dintre noduri s e cel puin 2( + 1)H
n
este, folosind
inegalitatea lui Boole (6.22), de cel mult n(2/n
2
) = 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)H
n
i
n cel mult 2/n din cazuri nlimea este cel mult n. n concluzie, nlimea medie este cel mult
(2( + 1)H
n
)(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 e (lg n) iar nlimea arborelui s e (lg n). Ct de mare poate 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 ales), este
diferit de noiunea de arbore binar de cutare avnd n noduri construit aleator, dat n aceast
seciune. ( Analizai toate posibilitile pentru n = 3.)
13.4-3 Fiind dat o constant r 1, determinai pe t astfel nct probabilitatea ca nlimea
arborelui binar de cutare construit aleator s e cel puin tH
n
, s e mai mic dect 1/n
r
.
13.4-4 Considerm algoritmul Quicksort-Aleator ce are ca date de intrare un ir de n
numere. Demonstrai c pentru orice constant k > 0 toate cele n! permutri, mai puin O(1/n
k
)
dintre ele, se execut ntr-un timp O(nlg n).
Probleme
13-1 Arbori binari de cutare cu chei egale
Cheile egale pun probleme implementrii arborilor binari de cutare.
a. Care este performana asimptotic a algoritmului Arbore-Insereaz cnd acesta se
folosete pentru a insera n elemente cu chei identice ntr-un arbore binar de cutare, iniial
vid?
Ne propunem s mbuntim algoritmul Arbore-Insereaz testnd nainte de linia 5 dac
cheie[z] = cheie[x] i nainte de linia 12 dac cheie[z] = cheie[y]. Dac are loc egalitatea,
se va implementa una dintre strategiile descrise n continuare. Gsii pentru ecare strategie
performana asimptotic a inserrii de n elemente avnd chei identice ntr-un arbore binar de
cutare iniial vid (Strategiile sunt descrise pentru linia 5, n care se compar cheile lui z i x.
Pentru a obine strategiile pentru linia 12, nlocuii x cu y).
b. Se folosete un comutator boolean b[x] pentru nodul x, i se seteaz x la [x] sau
dreapta[x] n funcie de valoarea lui b[x], care va lua alternativ valorile Fals respectiv
Adevrat la ecare vizitare a nodului n Arbore-Insereaz.
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 e [x], e dreapta[x]. (Stabilii performana n cazul cel mai
defavorabil i deducei intuitiv performana n cazul mediu).
13-2 Arbori cu rdcin
Fiind date dou iruri de caractere a = a
0
a
1
. . . a
p
i b = b
0
b
1
. . . b
q
, n care ecare a
i
i ecare b
j
sunt caractere dintr-o mulime ordonat de caractere, spunem c irul de caractere a este mai
mic lexicograc dect irul de caractere b dac se veric una dintre condiiile urmtoare:
1. exist un ntreg j, 0 j min(p, q), astfel nct a
i
= b
i
pentru orice i = 0, 1, . . . j 1 i
a
j
< b
j
, sau
2. p < q i a
i
= b
i
pentru orice i = 0, 1, . . . p.
Probleme 223
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 aate 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 gura 13.6 memoreaz irurile de bii
1011, 10, 011, 100 i 0. Dac dorim s cutm o cheie a = a
0
a
1
. . . a
p
i ne am ntr-un nod
de adncime i, vom merge la stnga dac a
i
= 0 i la dreapta dac a
i
= 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 lexicograc S ntr-un timp (n). De exemplu, n gura 13.6
rezultatul sortrii va 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
n

xT
d(x, T) =
1
n
P(T).
Acum dorim s artm c valoarea medie pentru P(T) este O(nlg n).
b. Notm cu T
L
i respectiv T
R
subarborele stng, respectiv subarborele drept al arborelui
T. Demonstrai c dac T are n noduri, atunci
P(T) = P(T
L
) +P(T
R
) +n 1.
224 Capitolul 13 Arbori binari de cutare
c. Notm cu P(n) lungimea medie a drumului interior al unui arbore binar de cutare
construit aleator avnd n noduri. Artai c
P(n) =
1
n
n1

i=0
(P(i) +P(n i 1) +n 1) .
d. Artai c P(n) se poate rescrie astfel:
P(n) =
2
n
n1

k=1
P(k) + (n).
e. Reamintindu-v analiza versiunii aleatoare a algoritmului Quicksort, demonstrai c
P(n) = O(nlg n) .
La ecare 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.
f. Descriei o implementare a algoritmului Quicksort n care comparrile efectuate pentru a
sorta o mulime de elemente sunt exact aceleai care se folosesc pentru a insera elementele
ntr-un arbore binar de cutare. (Ordinea n care se fac comparrile poate s difere, ns
trebuie fcute exact aceleai comparri.)
13-4 Numrul de arbori binari distinci
Notm cu b
n
numrul de arbori binari distinci avnd n noduri. n aceast problem vei gsi o
formul pentru b
n
i o estimare asimptotic.
a. Artai c b
0
= 1 i c, pentru n 1,
b
n
=
n1

k=0
b
k
b
n1k
.
b. Fie B(x) funcia generatoare
B(x) =

n=0
b
n
x
n
(vezi problema 4-6 pentru deniia funciilor generatoare). Artai c B(x) = xB(x)
2
+ 1
i de aici c
B(x) =
1
2x
(1

1 4x).
Note bibliograce 225
Dezvoltarea n serie Taylor a lui f(x) n vecintatea punctului x = a este dat de
f(x) =

k=0
f
(k)
(a)
k!
(x a)
k
,
unde f
(k)
(x) este derivata de ordinul k a lui f n punctul x.
c. Artai c
b
n
=
1
n + 1

2n
n

(al n-lea numr Catalan) folosind dezvoltarea n serie Taylor a expresiei



1 4x n
vecintatea lui x = 0. (Dac dorii, putei folosi generalizarea dezvoltrii binomiale (6.5)
pentru exponeni nentregi n n locul dezvoltrii n serie Taylor, n care pentru orice numr
real n i orice ntreg k, coecientul binomial

n
k

va interpretat ca n(n1) . . . (nk+1)/k!


dac k 0 i 0 n caz contrar.)
d. Artai c
b
n
=
4
n

n
3/2
(1 +O(1/n)).
Note bibliograce
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
Capitolul 13 a artat c un arbore binar de cutare de nlime h poate implementa oricare
dintre operaiile de baz pe mulimi dinamice precum Caut, Predecesor, Succesor,
Minim, Maxim, Insereaz i terge ntr-un timp O(h). Prin urmare, operaiile pe mulimi
sunt rapide dac nlimea arborelui de cutare este mic; dac ns arborele are nlimea mare,
performanele operaiilor s-ar putea s nu e mai bune dect cele ale listelor nlnuite. Arborii
rou-negru sunt un caz particular de arbori de cutare care sunt echilibrai n ideea garantrii
unui timp O(lg n) pentru cazul cel mai defavorabil al execuiei operaiilor de baz pe mulimi
dinamice.
14.1. Proprietile arborilor rou-negru
Un arbore rou-negru este un arbore binar de cutare care are un bit suplimentar pentru
memorarea ecrui nod: culoarea acestuia, care poate rou sau negru. Prin restrngerea
modului n care se coloreaz nodurile pe orice drum de la rdcin la o frunz, arborii rou-negru
garanteaz c nici un astfel de drum nu este mai lung dect dublul lungimii oricrui alt drum,
deci c arborele este aproximativ echilibrat.
Fiecare nod al arborelui conine astfel cmpurile , , , i . Dac ul
sau printele unui nod nu exist, cmpul pointer corespunztor din nod are valoarea nil. Vom
considera c aceste valori nil sunt pointeri la noduri (frunze) externe arborelui binar de cutare
i c nodurile obinuite, care conin chei, sunt noduri interne ale arborelui.
Un arbore binar de cutare este arbore rou-negru dac el ndeplinete urmtoarele
proprieti rou-negru:
1. Fiecare nod este e rou, e negru.
2. Fiecare frunz (nil) este neagr.
3. Dac un nod este rou, atunci ambii i ai si sunt negri.
4. Fiecare drum simplu de la un nod la un descendent care este frunz conine acelai numr
de noduri negre.
n gura 14.1 este prezentat un exemplu de arbore rou-negru.
Numrul de noduri negre pe orice drum de la un nod (fr a include n numrare i nodul)
n jos spre o frunz se va numi nlime neagr a nodului i se va nota cu bh(x). Noiunea de
nlime neagr este bine denit pe baza proprietii 4, conform creia toate drumurile de la nod
n jos au acelai numr de noduri negre. Vom deni nlimea neagr a unui arbore rou-negru
ca ind nlimea neagr a rdcinii sale.
Lema urmtoare va arta de ce arborii rou-negru sunt arbori de cutare ecieni.
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 e rou e negru, ecare frunz (nil) este neagr, ii 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 2
bh(x)
1 noduri interne. Aceast armaie va demonstrat prin inducie
dup nlimea nodului x. Dac nlimea lui x este 0, atunci x trebuie s e frunz (nil), iar
subarborele cu rdcina x conine cel puin 2
bh(x)
1 = 2
0
1 = 0 noduri interne. Pentru pasul de
inducie vom considera un nod x care are nlimea pozitiv i este nod intern cu doi i. Fiecare u
are nlimea neagr egal e cu bh(x), e cu bh(x) 1, n funcie de culoarea sa (rou, respectiv
negru). Deoarece nlimea unui u al lui x este mai mic dect nlimea lui x, putem aplica
ipoteza induciei pentru a demonstra c ecare u are cel puin 2
bh(x)1
1 noduri interne. Prin
urmare, subarborele cu rdcina x conine cel puin (2
bh(x)1
1)+(2
bh(x)1
1)+1 = 2
bh(x)
1
noduri interne, ceea ce demonstreaz armaia 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 e colorate cu negru. Prin urmare, nlimea neagr a rdcinii
trebuie s e cel puin h/2; de aici rezult
n 2
h/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 e 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 demite pe arbori de cutare
Arbore-Insereaz i Arbore-terge va consuma un timp de O(lg n). Deoarece ele modic
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 modicate.
Structura pointerilor se modic 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 ul 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 u stng al lui y i pe ul stng
al lui y n u drept al lui x.
Pseudocodul pentru Rotete-Stnga presupune c dreapta[x] = 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 modic numai pointerii; toate celelalte cmpuri ale nodului rmn
aceleai.
14.2. Rotaii 229
Figura 14.2 Operaii de rotaie pe un arbore binar de cutare. Operaia Rotete-Dreapta(T, y)
transform conguraia de dou noduri din stnga n conguraia prezentat n dreapta prin modicarea
unui numr constant de pointeri. Conguraia din dreapta se poate transforma n conguraia din stnga
prin operaia invers Rotete-Stnga(T, x). Cele dou noduri pot s apar oriunde ntr-un arbore binar
de cutare. Literele , i reprezint subarbori arbitrari. Operaia de rotaie conserv ordonarea cheilor
n inordine: cheile din sunt naintea lui cheie[x], care este naintea cheilor din , care la rndul lor
sunt mai mici dect cheie[y] i care, n sfrit, este mai mic dect cheile din .
Rotete-Stnga(T, x)
1: y dreapta[x] Seteaz y.
2: dreapta[x] [y] Transform subarborele stng al lui y n subarbore drept al lui x.
3: dac [y] = nil atunci
4: p[ [y]] x
5: p[y] p[x] Leag printele lui x de y.
6: dac p[x] = nil atunci
7: [T] y
8: altfel
9: dac x = [p[x]] atunci
10: [p[x]] y
11: altfel
12: dreapta[p[x]] y
13: [y] x Pune pe x ca u 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 gura 14.1, pentru cheia 36. Dac nodul inserat este colorat cu rou, va
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 gurii 14.2. Cum se modic adncimile nodurilor a, b i c cnd se efectueaz o rotaie
la dreapta pe nodul y din gur?
14.2-4 Artai c orice arbore binar de cutare avnd n noduri poate transformat n orice alt
arbore binar de cutare avnd n noduri, folosind O(n) rotaii. ( Artai mai nti c
sunt suciente 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) modic un
arbore binar de cutare. Frunzele nil sunt omise. Traversarea n inordine aplicat arborelui de intrare
i arborelui modicat 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
ecare 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 ii setai pe
nil. Proprietatea 4, care arm 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 ii colorai cu negru. Prin urmare, singura proprietate
14.3. Inserarea 231
care ar putea distrus este proprietatea 3, care arm c un nod colorat cu rou nu poate avea
un u 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 = [T] i culoare[p[x]]=rou execut
4: dac p[x] = [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[ [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
ecrei 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 ecrei
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 ul stng sau ul
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 ul 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 gura 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 vericat. 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 ul 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 ul 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 conictul 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 ul drept, respectiv ul stng al lui p[x]. Liniile 1314 corespund cazului 2, care
este ilustrat mpreun cu cazul 3 n gura 14.6. n cazul 2, nodul x este ul drept al printelui
su. Prin folosirea unei rotaii la stnga, acest caz se transform n cazul 3 (liniile 1517), n care
nodul x este ul 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 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 nclcat. De ce nu s-a setat la negru culoarea lui x?
14.3-2 n linia 20 a algoritmului RN-Insereaz se seteaz la negru culoarea rdcinii. Care
este avantajul acestei operaii?
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-4 Presupunem c nlimea neagr a ecruia dintre subarborii , , , i din gurile
14.5 i 14.6 este k. Etichetai ecare nod din cele dou guri cu nlimea neagr a sa pentru a
verica respectarea proprietii 4 prin transformrile indicate.
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.
14.3-6 Sugerai o implementare ecient a algoritmului RN-Insereaz n cazul n care
reprezentarea arborilor rou-negru nu conine informaii despre pointerii printe.
234 Capitolul 14 Arbori rou-negru
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 ul drept
sau (b) x este ul 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 xat 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, , dreapta i cheie se pot seta la valori arbitrare. n arborele rou-negru,
toi pointerii la nil vor nlocuii cu pointeri la santinela nil[T].
Santinelele se folosesc pentru a trata unitar toate nodurile arborelui: un u 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 xat 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 vericat: nu mai exist dou noduri consecutive colorate
cu rou.
nod santinel distinct pentru ecare nod nil din arbore, astfel c printele ecrui nod nil ar
bine denit, 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 u al unui nod x, va trebui s nu uitm s setm n prealabil p[nil[T]] la x.
RN-terge(T, z)
1: dac [z] = nil[T] sau dreapta[z] = nil[T] atunci
2: y z
3: altfel
4: y Arbore-Succesor(z)
5: dac [y] = nil[T] atunci
6: x [y]
7: altfel
8: x dreapta[y]
9: p[x] p[y]
10: dac p[y] = nil[T] atunci
11: [T] x
12: altfel dac y = [p[y]] atunci
13: [p[y]] x
14: altfel
15: dreapta[p[y]] x
16: dac y = 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
Procedura RN-terge reprezint o modicare minor a procedurii Arbore-terge (seci-
unea 13.3). Dup eliminarea nodului din arbore, ea apeleaz o procedur ajuttoare RN-ter-
ge-Repar care schimb culorile i efectueaz rotaiile necesare conservrii proprietilor rou-
negru.
Exist trei deosebiri ntre procedurile Arbore-terge i RN-terge. n primul rnd, toate
referirile la nil din Arbore-terge au fost nlocuite n RN-terge prin referine la nil[T].
n al doilea rnd, testul pentru x = nil din linia 9 a lui Arbore-terge a fost eliminat, iar
atribuirea p[x] p[y] se face necondiionat n linia 9 a algoritmului RN-terge. Astfel, dac
x este santinela nil[T], pointerul su printe va referi printele nodului y eliminat din arbore.
Ultima deosebire const n apelul procedurii RN-terge-Repar care se execut n liniile 1920
cnd y este colorat cu negru. Dac y este colorat cu rou, proprietile rou-negru sunt conservate
chiar dac y este eliminat din arbore, deoarece n arbore nu s-au modicat nlimile negre i nu
exist noduri adiacente colorate cu rou. Nodul x transmis procedurii RN-terge-Repar este
nodul care a fost unicul u al lui y nainte ca y s e eliminat, dac y a avut un u diferit de
nil, sau santinela nil[T] n cazul cnd y nu a avut i. n ultimul caz atribuirea necondiionat
din linia 9 garanteaz c printele lui x este acum nodul care a fost anterior printele lui y,
indiferent dac x este un nod intern care conine o cheie sau este santinela nil[T].
Acum putem s examinm modul n care procedura RN-terge-Repar restabilete
proprietile rou-negru ale arborelui de cutare.
RN-terge-Repar(T, x)
1: ct timp x = [T] i culoare[x] = negru execut
2: dac x = [p[x]] atunci
3: w dreapta[p[x]]
4: dac culoare[w] = rou atunci
5: culoare[w] negru Cazul 1
6: culoare[p[x]] rou Cazul 1
7: Rotete-Stnga(T, p[x]) Cazul 1
8: w dreapta[p[x]] Cazul 1
9: dac culoare[ [w]] = negru i culoare[dreapta[w]] = negru atunci
10: culoare[w] rou Cazul 2
11: x p[x] Cazul 2
12: altfel
13: dac culoare[dreapta[w]] = negru atunci
14: culoare[ [w]] negru Cazul 3
15: culoare[w] rou Cazul 3
16: Rotete-Dreapta(T, w) Cazul 3
17: w dreapta[p[x]] Cazul 3
18: culoare[w] culoare[p[x]] Cazul 4
19: culoare[p[x]] negru Cazul 4
20: culoare[dreapta[w]] negru Cazul 4
21: Rotete-Stnga(T, p[x]) Cazul 4
22: x [T] Cazul 4
23: altfel
24: (La fel ca n clauza atunci interschimbnd dreapta cu stnga)
25: culoare[x] negru
14.4. tergerea 237
Dac nodul y eliminat n RN-terge este negru, tergerea lui are ca efect micorarea cu
1 a numrului de noduri negre de pe ecare 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 vericat. Cnd
vom elimina nodul y colorat cu negru, vom mpinge culoarea sa neagr n ul su. Singura
problem care apare acum este aceea c nodul x ar putea 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
1. x refer un nod colorat cu rou, caz n care se va colora x cu negru n linia 25
2. x refer rdcina, caz n care nodul dublu colorat cu negru este doar eliminat sau
3. se pot efectua rotaii i recolorri adecvate.
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 ul stng sau drept al printelui
su p[x]. (Codul este dat pentru situaia n care x este ul stng al printelui su; cazul cnd
x este u 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 nil[T]; dac ar , numrul
de noduri colorate cu negru pe drumul de la p[x] la nil, ar 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 gura 14.7. nainte de a examina detaliat
ecare caz n parte, s aruncm o privire general asupra modului n care se veric respectarea
proprietii 4 pentru transformrile efectuate n toate aceste cazuri. Ideea de baz este aceea
c n ecare caz numrul de noduri colorate cu negru de la rdcin (incluznd i rdcina) la
ecare dintre subarborii , , . . . , este conservat prin transformarea efectuat. De exemplu, n
gura 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
gura 14.7(b) numrarea trebuie s ia n considerare i culoarea c, care poate rou sau negru.
Dac notm (rou) = 0 i (negru) = 1, atunci numrul de noduri negre de la
rdcin la este 2+ (c), att nainte, ct i dup transformare. Celelalte cazuri se pot
verica ntr-o manier similar (exerciiul 14.4-5).
Cazul 1 (liniile 58 din RN-terge-Repar i gura 14.7(a)) apare cnd nodul w, fratele
nodului x, este colorat cu rou. Deoarece w trebuie s aib ii 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 ii 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 ilor
lui w. n cazul 2 (liniile 1011 din RN-terge-Repar i gura 14.7(b)), ambii i 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 ul 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 gura 14.7(c)) apare cnd w este colorat
cu negru, ul su stng este colorat cu rou, iar ul su drept este colorat cu negru. Putem
interschimba culorile lui w i ale ului su stng [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 u drept colorat cu rou i prin urmare am transformat cazul 3 n
cazul 4.
Cazul 4 (liniile 1822 din RN-terge-Repar i gura 14.7(d)) apare cnd fratele w al
nodului x este colorat cu negru, iar ul 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, ecare din cazurile 1, 3 i 4 se termin
dup efectuarea unui numr constant de modicri 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 modic
santinela nil[T]?
14.4-4 Simplicai 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 ecare dintre subarborii , , . . . ,
pentru ecare din cazurile ilustrate n gura 14.7 i vericai dac ecare numr rmne acelai
dup transformare. Dac un nod are culoarea c sau c
t
, folosii notaia (c) sau (c
t
)
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? Justicai
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 e colorate e cu rou, e cu negru, sunt notate cu c i c

. Literele , , . . . ,
reprezint subarbori arbitrari. n ecare caz, conguraia din stnga se transform n conguraia 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 modic. 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 modic, ns aceast abordare poate ncetini programul i n acelai timp
consum mult spaiu. n unele situaii putem s procedm mai ecient.
Fie o mulime persistent S cu operaiile Insereaz, terge i Caut, care este
implementat folosind arbori binari de cutare, dup cum se arat n gura 14.8(a). Pentru
ecare 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 ul stng al unui nod nou cu cheia 7,
deoarece nu putem modica nodul existent avnd cheia 7. Similar, noul nod avnd cheia 7 devine
ul stng al unui nod nou cu cheia 8 al crui u din dreapta este un nod existent avnd cheia
10. Noul nod cu cheia 8 devine, la rndul su, ul drept al unei rdcini noi r
t
avnd cheia 4 al
crei u stng este nodul existent cu cheia 3. Prin urmare se va copia numai o parte din arborele
iniial, aa cum se ilustreaz n gura 14.8(b).
Presupunem c ecare nod din arbore are cmpurile cheie, i dreapta, ns nu are un
cmp printe. (Vezi i exerciiul 14.3-6).
a. Identicai nodurile care trebuie modicate la inserarea unei chei k i la tergerea unui nod
y ntr-un/dintr-un arbore binar de cutare general i persistent.
b. Scriei o procedur Persistent-Arbore-Insereaz care, pentru un arbore persistent T
i o cheie k de inserat, ntoarce un arbore persistent nou T
t
care este rezultatul inserrii
cheii k n T.
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 ecare 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.
14-2 Operaii de uniune pe arbori rou-negru
Operaia de uniune are ca argumente dou mulimi dinamice S
1
i S
2
i un element x astfel nct
pentru orice x
1
S
1
i x
2
S
2
are loc relaia cheie[x
1
] cheie[x] cheie[x
2
]. Ea returneaz o
mulime S = S
1
x S
2
. n aceast problem investigm modul de implementare al operaiei
de uniune pe arbori rou-negru.
Note bibliograce 241
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 r

, 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 nevoie de spaiu suplimentar de memorie n arbore i fr a mri timpii de execuie
asimptotici. Artai c nlimea neagr a ecrui nod se poate determina pe parcursul
coborrii n T ntr-un timp O(1) pentru ecare nod vizitat.
Dorim s implementm operaia RN-Uniune(T
1
, x, T
2
) care distruge T
1
i T
2
i ntoarce arborele
rou-negru T = T
1
x T
2
. Notm cu n numrul total de noduri din T
1
i T
2
.
b. Fr a restrnge generalitatea, presupunem c bh[T
1
] bh[T
2
]. Descriei un algoritm de
timp O(lg n) care determin nodul colorat cu negru din T
1
cu cea mai mare cheie i care
are nlimea neagr egal cu bh[T
2
].
c. Notm cu T
y
subarborele avnd rdcina y. Descriei cum se poate nlocui T
y
cu T
y
xT
2
ntr-un timp O(1) i fr a distruge proprietatea arborelui binar de cutare.
d. Ce culoare trebuie atribuit lui x pentru a conserva proprietile rou-negru 1, 2 i 4?
Descriei cum se poate reface proprietatea 3 ntr-un timp O(lg n).
e. Artai c timpul de execuie al procedurii RN-Uniune este O(lg n).
Note bibliograce
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 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 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 ecrei 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 sucient 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 e 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
simplica 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.
15.1. Statistici dinamice de ordine
Capitolul 10 a introdus noiunea de statistic de ordine. Specic, a i-a statistic de ordine a
unei mulimi de n elemente, unde i 1, 2, . . . , n, este elementul din mulime care are a i-a cea
mai mic cheie. Am artat c orice statistic de ordine se poate determina ntr-un timp O(n)
n cazul unei mulimi neordonate. n aceast seciune vom vedea cum se pot modica arborii
rou-negru pentru ca orice statistic de ordine s se determine ntr-un timp O(lg n) i vom aa
cum se determin rangul unui element poziia acestuia n ordonarea liniar a mulimii tot
ntr-un timp O(lg n).
Figura 15.1 prezint o structur de date care posed operaii rapide de statistici de ordine. Un
arbore de statistic de ordine T este de fapt un arbore rou-negru care conine o informaie
suplimentar n ecare nod. La cmpurile uzuale pentru un nod x dintr-un arbore rou-negru
cheie[x], culoare[x], p[x], [x] i dreapta[x] se adaug un cmp nou, dimensiune[x]. Acest
cmp conine numrul de noduri (interne) din subarborele cu rdcina x (incluzndu-l i pe
x), adic dimensiunea subarborelui. Dac facem convenia dimensiune[nil] = 0, atunci are loc
identitatea:
dimensiune[x] = dimensiune[ [x]] +dimensiune[dreapta[x]] + 1
(Pentru a gestiona adecvat condiia extrem pentru nil, o implementare efectiv va face
explicit testul x =nil anterior accesrii cmpului dimensiune sau, mai simplu, ca n seciunea
14.4, va folosi o santinel nil[T] pentru a-l reprezenta pe nil, cu dimensiune[nil[T]] = 0.)
244 Capitolul 15 mbogirea structurilor de date
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, ecare
nod x are un cmp dimensiune[x] care reprezint numrul de noduri din subarborele avnd rdcina x.
Regsirea unui element cu rangul cunoscut
nainte de a arta cum se ntreine informaia de dimensiune n timpul inserrii i tergerii,
s examinm implementarea a dou interogri de statistic de ordine care folosesc aceast
informaie suplimentar. ncepem cu o operaie care regsete un element cu rangul cunoscut.
Procedura SO-Selecteaz(x, i) returnraz un pointer la nodul care conine a i-a cea mai mic
cheie din subarborele avnd rdcina x. Pentru a determina a i-a cea mai mic cheie dintr-un
arbore de statistic de ordine T vom face apelul SO-Selecteaz( [T], i).
SO-Selecteaz(x, i)
1: r dimensiune[ [x]] + 1
2: dac i = r atunci
3: returneaz x
4: altfel dac i < r atunci
5: returneaz SO-Selecteaz( [x], i)
6: altfel
7: returneaz SO-Selecteaz(dreapta[x], i r)
Ideea pe care se bazeaz SO-Selecteaz este similar celei de la algoritmii de selecie
prezentai n capitolul 10. Valoarea lui dimensiune[ [x]] reprezint numrul de noduri care
sunt inspectate anterior lui x, la traversarea n inordine a subarborelui avnd rdcina x. Prin
urmare, dimensiune[ [x]] + 1 este rangul lui x n subarborele avnd rdcina x.
n linia 1 a algoritmului SO-Selecteaz se calculeaz r, rangul nodului x n subarborele
avnd rdcina x. Dac i = r, atunci nodul x este al i-lea cel mai mic element i x va returnat
n linia 3. Dac i < r, atunci al i-lea cel mai mic element se va gsi n subarborele stng al
lui x, prin urmare se va apela recursiv algoritmul pentru subarborele avnd rdcina [x]
n linia 5. Dac i > r, atunci al i-lea cel mai mic element se va gsi n subarborele drept al
lui x. Deoarece n subarborele avnd rdcina x sunt r elemente care se inspecteaz naintea
15.1. Statistici dinamice de ordine 245
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 gura 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 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 ecare 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.
Determinarea rangului unui element
Fiind dat un pointer la un nod x dintr-un arbore de statistic de ordine T, procedura SO-
Rang returnneaz poziia lui x n ordinea liniar dat de traversarea n inordine a lui T.
SO-Rang(T, x)
1: r dimensiune[ [x]] + 1
2: y x
3: ct timp y = [T] execut
4: dac y = dreapta[p[y]] atunci
5: r r +dimensiune[ [p[y]]] + 1
6: y p[y]
7: returneaz r
Procedura funcioneaz dup cum urmeaz. Rangul lui x poate considerat a 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 ecare 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 u 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 modic. Altfel, y este un u 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[ [p[y]]] + 1. Datorit atribuirii y p[y] invariantul este adevrat
pentru urmtoarea iteraie. Cnd y = [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 gura
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 ecare iteraie a ciclului ct timp consum un timp de O(1), iar y urc un nivel n
arbore la ecare 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.
ntreinerea dimensiunilor subarborilor
Fiind dat valoarea cmpului dimensiune din ecare nod, procedurile SO-Selecteaz i
SO-Rang pot calcula rapid informaia de statistic de ordine. Dac ns aceste cmpuri nu se
pot ntreine ecient prin operaiile de baz ce modic arborii rou-negru, strdania noastr de
pn acum a fost n zadar. Vom arta acum c dimensiunile subarborilor se pot ntreine att
pentru inserare ct i pentru tergere, fr afectarea timpilor asimptotici de execuie ai acestor
operaii.
Am remarcat n seciunea 14.3 c operaia de inserare a unui nod ntr-un arbore rou-negru
const din dou faze. n prima faz se coboar n arbore ncepnd de la rdcin i se insereaz
nodul nou ca u al unui nod existent. A doua faz nseamn urcarea n arbore, modicnd
culorile i efectund la sfrit rotaii pentru a conserva proprietile rou-negru.
15.1. Statistici dinamice de ordine 247
Pentru a ntreine dimensiunile subarborilor n prima faz, se va incrementa cmpul
dimensiune[x] pentru ecare nod x de pe drumul traversat de la rdcin n jos spre frunze. Noul
nod care se adaug va primi valoarea 1 pentru cmpul su dimensiune. Deoarece pe drumul
parcurs sunt O(lg n) noduri, costul suplimentar pentru ntreinerea cmpurilor dimensiune va
i el O(lg n).
n faza a doua, singurele modicri structurale ale arborelui rou-negru sunt produse de
rotaii, care sunt cel mult dou. Mai mult, rotaia este o operaie local: ea invalideaz
numai cmpurile dimensiune din nodurile incidente (de la capetele) legturii n jurul creia
se efectueaz rotaia. La codul procedurii Rotete-Stnga(T, x) dat n seciunea 14.2, vom
aduga urmtoarele dou linii:
1: dimensiune[y] dimensiune[x]
2: dimensiune[x] dimensiune[ [x]] +dimensiune[dreapta[x]] + 1
Figura 15.2 ilustreaz modul n care sunt actualizate cmpurile dimensiune. Pentru
procedura Rotete-Dreapta modicrile sunt simetrice.
Deoarece la inserarea unui nod ntr-un arbore rou-negru sunt necesare cel mult dou rotaii,
se consum suplimentar doar un timp O(1) pentru actualizarea cmpurilor dimensiune n faza
a doua a inserrii. n concluzie, timpul total necesar pentru inserarea unui nod ntr-un arbore
de statistic de ordine avnd n noduri este O(lg n) acelai din punct de vedere asimptotic cu
cel pentru arborii rou-negru obinuii.
tergerea unui nod dintr-un arbore rou-negru are de asemenea dou faze: prima opereaz
pe arborele binar de cutare, iar a doua necesit cel mult trei rotaii i n rest nu efectueaz
alte modicri structurale ale arborelui. (Vezi seciunea 14.4.) Prima faz elimin din arbore
un nod y. Pentru a actualiza dimensiunile subarborilor, vom traversa un drum n sus de la
nodul y la rdcin i vom decrementa cmpurile dimensiune ale nodurilor de pe acest drum.
Deoarece drumul are lungimea O(lg n) n cazul unui arbore rou-negru avnd n noduri, timpul
suplimentar consumat cu ntreinerea cmpurilor dimensiune n prima faz a tergerii unui nod
este O(lg n). Cele O(1) rotaii din faza a doua a tergerii sunt gestionate n aceeai manier ca
i n cazul inserrii. Prin urmare, att inserarea ct i tergerea, inclusiv ntreinerea cmpurilor
dimensiune, consum un timp 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 gura 15.1.
15.1-2 Artai cum opereaz SO-Rang(T, x) pe arborele rou-negru T din gura 15.1 i nodul
x cu cheie[x] = 35.
15.1-3 Scriei o versiune nerecursiv a lui SO-Selecteaz.
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-6 S observm c toate referirile la cmpul dimensiune din procedurile SO-Selecteaz
i SO-Rang au ca scop calcularea rangului lui x n subarborele avnd rdcina x. n consecin,
presupunem c memorm n ecare nod rangul su n subarborele pentru care el este rdcin.
Artai cum se poate ntreine aceast informaie la inserare i tergere. (Reamintim c aceste
operaii au nevoie de rotaii.)
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(nlg n).
15.1-8 Considerm n coarde ntr-un cerc, ecare denit de capetele sale. Descriei un
algoritm de timp O(nlg n) pentru determinarea numrului de perechi de coarde care se
intersecteaz n interiorul cercului. (De exemplu, dac cele n coarde sunt toate diametre, acestea
se vor intersecta n centrul cercului i prin urmare rspunsul corect este

n
2

.) Presupunei c nu
exist dou coarde cu acelai capt.
15.2. Cum se mbogete o structur de date
La proiectarea algoritmilor apare frecvent problema mbogirii structurilor de date uzuale
pentru ca acestea s ofere funcionalitate suplimentar. Acest proces de mbogire va folosit
n seciunea urmtoare pentru a proiecta o structur de date care are operaii cu intervale. n
aceast seciune vom examina paii acestui proces de mbogire. De asemenea, vom demonstra
o teorem care ne va permite s mbogim mai simplu arborii rou-negru n multe situaii.
Procesul de mbogire a unei structuri de date se poate mpri n patru pai:
1. alegerea unei structuri de date suport,
2. determinarea informaiei suplimentare care trebuie inclus i ntreinut n structura de
date de baz,
3. vericarea posibilitii ntreinerii informaiei suplimentare n cazul operaiilor de baz care
modic structura suport, i
4. proiectarea noilor operaii.
Ca i n cazul altor metode de proiectare prezentate schematic, nu trebuie s respectm orbete
paii de mai sus n ordinea enumerat. Prin natura ei, munca de proiectare recurge frecvent la
ncercri i reveniri n caz de eec, iar realizarea activitilor prevzute n pai se face de regul n
paralel. Nu are nici un rost, de exemplu, s determinm informaia suplimentar i s proiectm
noile operaii (paii 2 i 4) dac nu vom putea ntreine ecient informaia suplimentar memorat
n structura de date. Totui, aceast metod n patru pai va asigura o abordare ordonat a
eforturilor de mbogire a unei structuri de date i o schem de organizare a documentaiei
referitoare la aceasta.
Paii de mai sus au fost exemplicai n seciunea 15.1 pentru proiectarea arborilor de
statistic de ordine. La pasul 1 am ales ca structur de date suport arborii rou-negru. O
indicaie asupra utilitii acestor arbori la obinerea statisticilor de ordine este dat de eciena
operaiilor specice mulimilor dinamice pe o ordine total, precum Minim, Maxim, Succesor
i Predecesor.
15.2. Cum se mbogete o structur de date 249
La pasul 2 am adugat cmpurile dimensiune, care conin, pentru ecare nod x, dimensiunea
subarborelui avnd rdcina x. n general, informaia suplimentar are ca scop s fac operaiile
(proprii structurii mbogite) mai eciente. De exemplu, am putut implementa operaiile SO-
Selecteaz i SO-Rang folosind numai cheile memorate n arbore, ns n acest caz timpul lor
de execuie nu ar 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 eciena asimptotic, ele executndu-se tot ntr-un timp O(lg n).
n cazul ideal, un numr mic de modicri ale structurii de date, trebuie s e sucient pentru
a ntreine informaia suplimentar. De exemplu, dac am memora n ecare 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 modicarea acestei informaii (rangul) n ecare
dintre nodurile arborelui. n schimb, dac memorm dimensiunea subarborilor n locul rangului,
inserarea unui nou element va necesita modicarea 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.
mbogirea arborilor rou-negru
n cazul n care o structur de date mbogit are la baz arbori rou-negru, putem s
demonstrm c anumite tipuri de informaii suplimentare se pot ntreine ecient prin inserare
i tergere, simplicndu-se astfel realizarea pasului 3. Demonstraia teoremei urmtoare este
similar argumentrii fcute n seciunea 15.1 referitoare la ntreinerea cmpului dimensiune
pentru arborii de statistic de ordine.
Teorema 15.1 (mbogirea unui arbore rou-negru)
Fie T un arbore rou-negru avnd n noduri i e f un cmp suplimentar al acestuia. Dac
cmpul f din nodul x se poate calcula folosind numai informaia din nodurile x, [x] i
dreapta[x], inclusiv f[ [x]] i f[dreapta[x]], atunci valorile cmpurilor f din toate nodurile
lui T se pot ntreine n timpul operaiilor de inserare i tergere fr a afectat performana
asimptotic de O(lg n) a acestor operaii.
Demonstraie. Ideea principal a demonstraiei se bazeaz pe faptul c modicarea cmpului
f dintr-un nod x se propag numai la strmoii lui x din arbore. Astfel, modicarea lui f[x]
s-ar putea s necesite actualizarea lui f[p[x]], i doar att; modicarea lui f[p[x]] s-ar putea
s necesite actualizarea lui f[p[p[x]]], i doar att; i tot aa urcm n arbore cte un nivel la
ecare modicare. Acest proces se va termina cnd se actualizeaz f[ [T]], deoarece nu
mai exist alt nod care s depind de noua valoare. Deoarece nlimea unui arbore rou-negru
este O(lg n), modicarea unui cmp f dintr-un nod cere un timp de O(lg n) pentru actualizarea
nodurilor dependente de aceast modicare.
Inserarea unui nod x n T se desfoar n dou faze (vezi seciunea 14.3). Pe parcursul primei
faze x se insereaz ca u al unui nod existent p[x]. Valoarea lui f[x] se poate calcula ntr-un
timp de O(1) deoarece, prin ipotez, aceast valoare depinde numai de informaia existent n
250 Capitolul 15 mbogirea structurilor de date
celelalte cmpuri ale lui x i de informaia din ii lui x; n acest caz, ambii i ai lui x sunt nil.
O dat calculat valoarea f[x], modicarea 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 modicri structurale
ale arborelui provin din rotaii. Timpul total de actualizare al cmpurilor f este O(lg n) pentru
ecare rotaie deoarece ntr-o rotaie se modic 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
modicri 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 modicri necesit cel mult O(lg n) deoarece
modicrile sunt locale n arbore. Refacerea arborelui rou-negru din faza a doua a tergerii
necesit cel mult trei rotaii, iar ecare 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 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) denite 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 e afectat. Artai cum se poate realiza ntreinerea, dac rspunsul
este armativ sau justicai rspunsul negativ.
15.2-3 Studiai dac adncimile nodurilor dintr-un arbore rou-negru se pot considera cmpuri
ale nodurilor care se pot ntreine ecient. Artai cum se poate realiza ntreinerea dac
rspunsul este armativ sau justicai rspunsul negativ.
15.2-4 Fie un operator binar asociativ i e a cmpul care trebuie ntreinut n ecare
nod al unui arbore rou-negru. Presupunem c dorim s adugm ecrui nod x din arbore
un cmp suplimentar f astfel nct f[x] = a[x
1
] a[x
2
] . . . a[x
m
], unde x
1
, x
2
, . . . , x
m
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. Modicnd puin argumentaia,
artai c i cmpurile dimensiune din arborii de statistic de ordine se pot ntreine ntr-un
timp O(1) pentru ecare rotaie.
15.2-5 Dorim s mbogim arborii rou-negru cu o operaie numit RN-Enumer(x, a, b)
care aeaz toate cheile k din arborele rou-negru avnd rdcina x care veric 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 aeaz, iar n este numrul de noduri interne din arbore.
( 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 i

. (a) Cnd i i i

se suprapun,
sunt patru situaii posibile; n ecare dintre ele, jos[i] sus[i

] i jos[i

] sus[i]. (b) sus[i] < jos[i

].
(c) sus[i

] < jos[i].
15.3. Arbori de intervale
n aceast seciune vom mbogi arborii rou-negru pentru a realiza operaii pe mulimi
dinamice de intervale. Un interval nchis este o pereche ordonat de numere reale [t
1
, t
2
] cu
t
1
t
2
. Intervalul [t
1
, t
2
] reprezint mulimea t R : t
1
t t
2
. Intervalele deschise
sau semideschise nu conin nici una dintre marginile mulimii, respectiv nu conin una dintre
acestea. n aceast seciune vom presupune c intervalele cu care lucrm sunt nchise; extinderea
rezultatelor la intervale deschise sau semideschise este imediat.
Intervalele reprezint un instrument convenabil de reprezentare a evenimentelor care ocup
ecare un interval continuu de timp. Am putea dori, de exemplu, s interogm o baz de date de
intervale de timp pentru a descoperi ce evenimente au aprut ntr-un anumit interval. Structura
de date prezentat n aceast seciune ofer un mijloc ecient de ntreinere a unei astfel de baze
de date de intervale.
Intervalul [t
1
, t
2
] se poate reprezenta sub forma unui obiect i, care are cmpurile jos[i] = t
1
(captul inferior) i sus[i] = t
2
(captul superior). Spunem c intervalele i i i
t
se suprapun
dac i i
t
= , adic dac jos[i] sus[i
t
] i jos[i
t
] sus[i]. Pentru orice dou intervale i i i
t
are loc trihotomia intervalelor, adic ele veric doar una din urmtoarele trei proprieti:
a. i i i
t
se suprapun,
b. sus[i] < jos[i
t
],
c. sus[i
t
] < jos[i].
n gura 15.3 sunt prezentate cele trei posibiliti.
Numim arbore de intervale un arbore rou-negru care ntreine o mulime dinamic de
elemente, n care ecare element x conine un interval int[x]. Arborii de intervale au urmtoarele
operaii.
Interval-Insereaz(T, x) adaug la arborele de intervale T elementul x care are n
cmpul int un interval.
252 Capitolul 15 mbogirea structurilor de date
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.
Interval-terge(T, x) terge elementul x din arborele de intervale T.
Interval-Caut(T, i) returneaz un pointer la un element x din arborele de intervale T
pentru care int[x] se suprapune cu intervalul i, sau nil dac n mulime nu exist un astfel
de element.
Figura 15.4 ilustreaz modul de reprezentare al unei mulimi de intervale cu ajutorul unui arbore
de intervale. Vom aplica metoda n patru pai descris n seciunea 15.2 pentru a proiecta arborele
de intervale i operaiile proprii acestuia.
Pasul 1: Structura de date suport
Am ales ca structur de date suport un arbore rou-negru n care ecare nod x conine un
cmp interval int[x] i pentru care cheia nodului x este captul inferior, jos[int[x]], al intervalului.
Prin urmare, o traversare n inordine a structurii de date va produce o list a intervalelor,
ordonat dup captul inferior al acestora.
Pasul 2: Informaia suplimentar
Pe lng cmpul interval int[x], ecare nod x va conine o valoare max[x] care reprezint
valoarea maxim a capetelor intervalelor memorate n subarborele avnd rdcina x. Deoarece
15.3. Arbori de intervale 253
captul superior al ecrui interval este cel puin la fel de mare ca i captul inferior al acestuia,
max[x] va de fapt valoarea maxim a capetelor superioare ale intervalelor memorate n subar-
borele avnd rdcina x.
Pasul 3: ntreinerea informaiei suplimentare
Trebuie s vericm c inserarea i tergerea se pot executa ntr-un timp O(lg n) pe un ar-
bore de intervale avnd n noduri. Valoarea cmpului max[x] se poate determina dac se cunosc
intervalul int[x] i valorile max ale ilor nodului x:
max[x] = max(sus[int[x]], max[ [x]], max[dreapta[x]]).
Folosind teorema 15.1, rezult c inserarea i tergerea se execut ntr-un timp O(lg n). De
fapt, actualizarea cmpurilor max dup o rotaie se poate realiza ntr-un timp O(1), aa cum se
arat n exerciiile 15.2-4 i 15.3-1.
Pasul 4: Proiectarea noilor operaii
Singura operaie care trebuie proiectat este Interval-Caut(T, i), care gsete un interval
din T suprapus pe intervalul i. Dac T nu conine nici un astfel de interval, se returneaz nil.
Interval-Caut(T, i)
1: x [T]
2: ct timp x = nil i i nu se suprapune cu int[x] execut
3: dac [x] = nil i max[ [x]] jos[i] atunci
4: x [x]
5: altfel
6: x dreapta[x]
7: returneaz x
Cutarea intervalului care se suprapune cu i ncepe iniializnd x cu rdcina arborelui i
continu cobornd n arbore. Ea se termin e cnd s-a gsit un interval care se suprapune cu
i, e cnd x devine nil. Deoarece ecare iteraie a ciclului necesit un timp O(1) i deoarece
nlimea unui arbore rou-negru avnd n noduri este O(lg n), procedura Interval-Caut va
consuma un timp O(lg n).
nainte de a studia dac algoritmul Interval-Caut este corect, s examinm cum funcio-
neaz el pe arborele de intervale din gura 15.4. Presupunem c dorim s determinm un interval
care se suprapune cu intervalul i = [22, 25]. Se ncepe iniializnd x cu rdcina arborelui, care
conine intervalul [16, 21] care nu se suprapune cu i. Deoarece max[ [x]] = 23 este mai
mare dect jos[i] = 22, ciclul continu cu x iniializat cu ul stng al rdcinii noul nod x care
conine intervalul [8, 9] i care nici el nu se suprapune cu i. De data aceasta, max[ [x]] =
10 este mai mic dect jos[i] = 22, deci ciclul continu iniializnd x cu ul su drept. Intervalul
[15, 23] memorat n acest nod se suprapune cu i, deci procedura va returna acest nod.
Pentru a da un exemplu de cutare fr succes, s determinm intervalul care se suprapune cu
intervalul i = [11, 14] n arborele de intervale din gura 15.4. ncepem iniializnd x cu rdcina
arborelui. Deoarece intervalul memorat n rdcin nu se suprapune cu i i max[ [x]] = 23
este mai mare dect jos[i] = 11, vom continua cu ul stng al lui x, nodul care conine intervalul
[8, 9]. (S observm c n subarborele drept nu exist nici un interval care s se suprapun
254 Capitolul 15 mbogirea structurilor de date
cu i vom vedea mai trziu de ce.) Intervalul din x, [8, 9] nu se suprapune cu i, i deoarece
max[ [x]] = 10 este mai mic dect jos[i] = 11 vom continua iniializnd x cu ul 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, ul su stng este nil, aa c
vom continua cu ul 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
sucient 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 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 e c subarborele stng
al lui x conine intervalul care se suprapune cu i, e 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.
Demonstraie. Ambele cazuri se demonstreaz folosind trihotomia intervalelor. Vom demonstra
la nceput cazul 2, acesta ind mai simplu. S remarcm c dac se execut linia 6, atunci
datorit condiiei de ramicare din linia 3, avem e [x] = nil e max[ [x]] < jos[i].
Dac [x] = nil, atunci este evident c subarborele avnd rdcina [x] nu conine
nici un interval care s se suprapun cu i deoarece el nu conine nici un nod, deci nici un
interval. Presupunem acum c [x] = nil i c max[ [x]] < jos[i]. Fie i
t
un interval
din subarborele stng al lui x (vezi gura 15.5(a)). Deoarece max[ [x]] este cel mai mare
capt de interval din subarborele stng al lui x, avem:
sus[i
t
] max[st anga[x]] < jos[i] ,
i din trihotomia intervalelor rezult c i i i
t
nu se suprapun, deci am demonstrat cazul 2.
Pentru a demonstra cazul 1, putem presupune c n subarborele stng al lui x nu exist
intervale care s se suprapun cu i (dac ar exista astfel de intervale, am terminat demonstraia)
i atunci trebuie doar s demonstrm c nici n subarborele drept al lui x nu exist intervale
care s se suprapun cu i. S observm c dac se execut linia 4, atunci datorit condiiei
de ramicare din linia 3, avem max[ [x]] jos[i]. Mai mult, din deniia cmpului max
rezult c n subarborele stng al lui x trebuie s existe un interval i
t
astfel nct:
sus[i
t
] = max[st anga[x]] jos[i].
(Figura 15.5(b) reect aceast situaie). Deoarece i i i
t
nu se suprapun i deoarece relaia
sus[i
t
] < jos[i] nu este adevrat, din trihotomia intervalelor rezult c sus[i] < jos[i
t
]. Deoarece
arborii de intervale au drept chei capetele din stnga ale intervalelor, din proprietatea arborelui
de cutare rezult c pentru orice interval i
tt
din subarborele stng al lui x are loc inegalitatea
sus[i] < jos[i
t
] jos[i
tt
].
15.3. Arbori de intervale 255
Figura 15.5 Intervalele pentru demonstraia teoremei 15.2. Valoarea lui max[stnga[x]] este marcat
n ecare caz cu o linie ntrerupt. (a) Cazul 2: cutarea continu la dreapta. Nu exist nici un interval
i

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 gur), e c exist un
interval i

n subarborele stng al lui x astfel ca sus[i

] = max[stnga[x]]. Deoarece i nu se suprapune cu


i

, orice alt interval i

din subarborele stng al lui x nu se va suprapune cu i deoarece jos[i

] jos[i

].
Conform trihotomiei intervalelor, rezult c i i i
tt
nu se suprapun.
Teorema 15.2 garanteaz c dac algoritmul Interval-Caut continu cu unul dintre ii lui
x i nu se gsete nici un interval de suprapunere, atunci cutarea care ar continua cu cellalt
u al lui x ar de asemenea fr succes.
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 ecient care, ind dat un interval i, returneaz e un interval care
se suprapune cu i i care are captul din stnga minim, e 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. ( Gsii o soluie care nu modic arborele.)
15.3-5 Sugerai modicri ale procedurilor pentru arborele de intervale pentru a putea
implementa operaia Interval-Caut-Exact(T, i), care returneaz e un pointer la un nod
x din arborele de intervale pentru care jos[int[x]] = jos[i] i sus[int[x]] = sus[i], e 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 ecient 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 ecare 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(nlg 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.
( 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 ecient acest punct de suprapunere maxim cnd se insereaz sau se terg intervale
n/din mulime.
15-2 Permutarea Josephus
Permutarea Josephus se denete dup cum urmeaz. Presupunem c n persoane sunt
aranjate n cerc i c exist un ntreg pozitiv m n. ncepnd cu o persoan stabilit, se
parcurge cercul i ecare a m-a persoan se scoate din conguraie. Dup ce persoana a fost
eliminat, numrarea continu cu conguraia rmas. Procesul de eliminare continu pn
cnd toate cele n persoane au fost scoase din conguraie. Ordinea n care se elimin persoanele
din conguraie va deni permutarea Josephus (n,m) a ntregilor 1, 2, . . . , n. De exemplu,
permutarea Josephus (7, 3) este '3, 6, 2, 7, 5, 1, 4`.
a. Presupunem c m este constant. Descriei un algoritm ce consum un timp O(n) care, ind
dat un ntreg n, produce permutarea Josephus (n, m).
b. Presupunem c m nu este constant. Descriei un algoritm ce consum un timp O(nlg n)
care, ind dai ntregii n i m, produce permutarea Josephus (n, m).
Note bibliograce
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
ecieni: 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 divide i stpnete, randomizarea i soluii recurente. Noile tehnici sunt oarecum mai
sosticate dar sunt eseniale pentru abordarea ecient 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 nit de alegeri pentru a obine o soluie optimal. Deseori, pe msur
ce facem alegerile apar subprobleme de acelai tip. Programarea dinamic este ecient atunci
cnd o subproblem dat poate aprea din mai multe mulimi pariale de alegeri; tehnica cheie
este s stocm sau s memoizm soluia ecrei 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 ecare 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 sucient 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 ecient. Capitolul 17 recapituleaz teoria matroizilor care poate
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 ecrei operaii, o analiz amortizat poate folosit pentru a furniza o margine a
costului efectiv al ntregii secvene. Un motiv pentru care aceast idee poate ecient este c,
ntr-o secven de operaii, s-ar putea s e imposibil ca toate operaiile individuale s poat
efectuate n limitele cunoscute pentru cazul cel mai defavorabil. n timp ce unele operaii sunt
costisitoare, multe altele ar putea s nu e 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.
Pentru a siguri c restul poate ntotdeauna pltit, presupunem c exist moned avnd valoarea egal cu
unitatea.
16 Programarea dinamic
Programarea dinamic, asemenea metodelor , rezolv problemele com-
binnd soluiile unor subprobleme. (n acest context, termenul de programare se refer la o
metod tabelar i nu la scrierea codului pentru un calculator.) Dup cum am artat n capitolul
1, algoritmii partiioneaz problema n subprobleme independente, rezolv
recursiv subproblemele i apoi combin soluiile lor pentru a rezolva problema iniial. Spre
deosebire de aceast abordare, programarea dinamic este aplicabil atunci cnd subproblemele
nu sunt independente, adic subproblemele au n comun sub-subprobleme. n acest context,
un algoritm de tipul ar presupune mai multe calcule dect ar necesar
dac s-ar rezolva n mod repetat sub-subproblemele comune. Un algoritm bazat pe programare
dinamic rezolv ecare sub-subproblem o singur dat i, apoi, memoreaz soluia acesteia ntr-
un tablou, prin aceasta evitnd recalcularea soluiei ori de cte ori respectiva sub-subproblem
apare din nou.
n general, metoda programrii dinamice se aplic problemelor de optimizare. Asemenea
probleme pot avea mai multe soluii posibile. Fiecare soluie are o valoare, iar ceea ce se dorete
este determinarea soluiei a crei valoare este optim (minim sau maxim). O asemenea soluie
se numete optim a problemei, prin contrast cu optim, deoarece pot mai
multe soluii care realizeaz valoarea optim.
Dezvoltarea unui algoritm bazat pe programarea dinamic poate mprit ntr-o secven
de patru pai.
1. Caracterizarea structurii unei soluii optime.
2. Denirea recursiv a valorii unei soluii optime.
3. Calculul valorii unei soluii optime ntr-o manier de tip bottom-up.
4. Construirea unei soluii optime din informaia calculat.
Paii 13 sunt baza unei abordri de tip programare dinamic. Pasul 4 poate 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 e o tehnic de soluionare viabil.
Seciunea 16.3 arat cum poate determinat cel mai lung subir comun a dou iruri. n nal,
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
16.1. nmulirea unui ir de matrice
Primul nostru exemplu de programare dinamic este un algoritm care rezolv problema
nmulirii unui ir de matrice. Se d un ir (o secven) 'A
1
, A
2
, . . . , A
n
` de n matrice care
trebuie nmulite, i se doree calcularea produsului
A
1
A
2
A
n
(16.1)
Expresia (16.1) se poate evalua folosind algoritmul standard de nmulire a unei perechi
de matrice ca subrutin, o dat ce expresia a fost parantezat (parantezarea este necesar
pentru a rezolva toate ambiguitile privind nmulirile de matrice). Un produs de matrice este
complet parantezat e dac este format dintr-o unic matrice, e dac este produsul a dou
produse de matrice care sunt la rndul lor complet parantezate. Cum nmulirea matricelor
este asociativ, toate parantezrile conduc la acelai produs. De exemplu, dac irul de matrice
este 'A
1
, A
2
, A
3
, A
4
`, produsul A
1
A
2
A
3
A
4
poate complet parantezat n cinci moduri distincte,
astfel:
(A
1
(A
2
(A
3
A
4
))), (A
1
((A
2
A
3
)A
4
)), ((A
1
A
2
)(A
3
A
4
)), ((A
1
(A
2
A
3
))A
4
), (((A
1
A
2
)A
3
)A
4
).
Modul n care parantezm un ir de matrice poate avea un impact dramatic asupra costului
evalurii produsului. S considerm mai nti costul nmulirii a dou matrice. Algoritmul
standard este dat de urmtoarea procedur, descris n pseudocod. Prin linii i coloane sunt
referite numrul de linii, respectiv de coloane ale matricei.
nmulire-Matrice(A, B)
1: dac coloane[A] = linii[B] atunci
2: mesaj de eroare: dimensiuni incompatibile
3: altfel
4: pentru i 1, linii[A] execut
5: pentru j 1, coloane[B] execut
6: C[i, j] 0
7: pentru k 1, coloane[A] execut
8: C[i, j] C[i, j] +A[i, k] B[k, j]
9: returneaz C
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 pq 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 'A
1
, A
2
, A
3
` de trei matrice. S presupunem c
dimensiunile matricelor sunt 10 100, 100 5 i, respectiv, 5 50. Dac efectum nmulirle
conform parantezrii ((A
1
A
2
)A
3
), atunci vom avea 10 100 5 = 5000 nmuliri scalare pentru
a calcula matricea A
1
A
2
de dimensiune 10 5, plus alte 10 5 50 = 2500 nmuliri scalare
pentru a nmuli aceast matrice cu matricea A
3
. Astfel rezult un total de 7500 nmuliri
16.1. nmulirea unui ir de matrice 261
scalare. Dac, n schimb, vom efectua nmulirile conform parantezrii (A
1
(A
2
A
3
)), vom avea
100 5 50 = 25.000 nmuliri scalare pentru a a calcula matricea A
2
A
3
de dimensiuni 100 50,
plus alte 10 100 50 = 50.000 nmuliri scalare pentru a nmuli A
1
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 enunat n urmtorul mod: dndu-se
un ir 'A
1
, A
2
, . . . , A
n
` de n matrice, unde, pentru i = 1, 2, . . . , n, matricea A
i
are dimensiunile
p
i1
p
i
, s se parantezeze complet produsul A
1
A
2
A
n
, astfel nct s se minimizeze numrul
de nmuliri scalare.
Evaluarea numrului de parantezri
nainte de a rezolva problema nmulirii irului de matrice prin programare dinamic, trebuie
s ne convingem c vericarea exhaustiv a tuturor parantezrilor nu conduce la un algoritm
ecient. Fie P(n) numrul de parantezri distincte ale unei secvene de n matrice. Deoarece
secvena de matrice o putem diviza ntre matricele k i (k+1), pentru orice k = 1, 2, . . . , n1, i,
apoi, putem descompune n paranteze, n mod independent, ecare dintre cele dou subsecvene,
obinem recurena:
P(n) =

1 dac n = 1,
n1

k=1
P(k)P(n k) dac n 2.
Problema 13-4 a cerut s se demonstreze c soluia acestei recurene este secvena de numere
Catalan:
P(n) = C(n 1),
unde
C(n) =
1
n + 1

2n
n

= (4
n
/n
3/2
).
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.
Structura unei parantezri optime
Primul pas din schema general a metodei programrii dinamice const n caracterizarea
structurii unei soluii optimale. Pentru problema nmulirii irului de matrice, aceasta este
descris n continuare. Pentru simplitate, vom adopta convenia de notare A
i..j
pentru matricea
care rezult n urma evalurii produsului A
i
A
i+1
A
j
. O parantezare optim a produsului
A
1
A
2
A
n
mparte produsul ntre A
k
i A
k+1
pentru un anumit ntreg k din intervalul
1 k < n. Aceasta nseamn c, pentru o valoare a lui k, mai nti calculm matricele A
1..k
i
A
k+1..n
i, apoi, le nmulim pentru a produce rezultatul nal A
1..n
. Costul acestei parantezri
optime este, deci, costul calculului matricei A
1..k
, plus costul calculului matricei A
k+1..n
, plus
costul nmulirii celor dou matrice.
Observaia cheie este c parantezarea subirului prex A
1
A
2
A
k
, n cadrul parantez-
rii optime a produsului A
1
A
2
A
n
, trebuie s e o parantezare pentru A
1
A
2
A
k
.
262 Capitolul 16 Programarea dinamic
De ce? Dac ar existat o modalitate mai puin costisitoare de parantezare a lui A
1
A
2
A
k
,
nlocuirea respectivei parantezri n parantezarea lui A
1
A
2
A
n
ar produce o alt parantezare
pentru A
1
A
2
A
n
, al crei cost ar mai mic dect costul optimului, ceea ce este o contradicie.
O observaie asemntoare este valabil i pentru parantezarea subirului A
k+1
A
k+2
A
n
n
cadrul parantezrii optime a lui A
1
A
2
A
n
: aceasta trebuie s e o parantezare optim pentru
A
k+1
A
k+2
A
n
.
Prin urmare, o soluie optim a unei instane a problemei nmulirii irului de matrice conine
soluii optime pentru instane ale subproblemelor. Existena substructurilor optime n cadrul
unei soluii optime este una dintre caracteristicile cadrului de aplicare a metodei programrii
dinamice, aa cum se va arta n seciunea 16.2.
O soluie recursiv
Al doilea pas n aplicarea metodei programrii dinamice este denirea 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 A
i
A
i+1
A
j
, pentru 1 i j n. Fie m[i, j] numrul minim de nmuliri
scalare necesare pentru a calcula matricea A
i..j
; costul modalitii optime de calcul a lui A
1..n
va , atunci, m[1, n].
Putem deni m[i, j] n mod recursiv, dup cum urmeaz. Dac i = j, irul const dintr-o
singur matrice A
i..i
= A
i
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 A
i
A
i+1
A
j
ntre A
k
i A
k+1
, cu i k < j. Atunci, m[i, j] este egal cu
costul minim pentru calculul subprodusului A
i..k
i A
k+1..j
plus costul nmulirii acestor dou
matrice rezultat. Deoarece evaluarea produsului A
i..k
A
k+1..j
necesit p
i1
p
k
p
j
nmuliri scalare,
vom obine
m[i, j] = m[i, k] +m[k + 1, j] +p
i1
p
k
p
j
.
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 vericm pe toate
pentru a o putea gsi pe cea mai bun. Atunci, deniia recursiv a costului minim a parantezrii
produsului A
i
A
i+1
A
j
devine
m[i, j] =

0 dac i = j,
min
ik<j
m[i, k] +m[k + 1, j] +p
i1
p
k
p
j
dac i < j.
(16.2)
Valorile m[i, j] exprim costul soluiilor optime ale subproblemelor. Pentru a putea urmri
modul de construcie a soluiei optime, s denim s[i, j] care va conine valoarea k pentru care
mprirea produsului A
i
A
i+1
A
j
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] +p
i1
p
k
p
j
.
Calculul costului optimal
n acest moment, este uor s scriem un algoritm recursiv bazat pe recurena (16.2) care
calculeaz costul minim m[1, n] al produsului A
1
A
2
A
n
. Dup cum vom vedea n seciunea
16.1. nmulirea unui ir de matrice 263
16.2, acest algoritm necesit un timp exponenial nu mai bun dect metoda forei brute folosit
pentru vericarea ecrui 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 ecare alegere a lui i i j ce satisfac 1 i j n, adic un total
de

n
2

+n = (n
2
). Un algoritm recursiv poate ntlni ecare 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 A
i
are dimensiunile p
i1
p
i
pentru
i = 1, 2, . . . , n. Intrarea este secvena 'p
0
, p
1
, . . . , p
n
`, 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 [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 +l 1
7: m[i, j]
8: pentru k i, j 1 execut
9: q m[i, k] +m[k + 1, j] +p
i1
p
k
p
j
10: dac q < m[i, j] atunci
11: m[i, j] q
12: s[i, j] k
13: returneaz m, s
Algoritmul completeaz tabloul m ntr-un mod ce corespunde rezolvrii problemei parantez-
rii unor iruri de matrice de lungime din ce n ce mai mare. Ecuaia (16.2) arat c m[i, j], costul
de calcul al produsului irului de j i +1 matrice, depinde doar de costurile calculrii produselor
irurilor de mai puin de j i + 1 matrice. Aceasta nseamn c, pentru k = i, i + 1, . . . , j 1,
matricea A
i..k
este un produs de ki +1 < j i +1 matrice, iar matricea A
k+1..j
este un produs
de j k < j i + 1 matrice.
Algoritmul iniializeaz, mai nti, m[i, i] 0 pentru i = 1, 2, . . . , n (costul minim al irurilor
de lungime 1) n liniile 23. Se folosete, apoi, recurena (16.2) pentru a calcula m[i, i +1] pentru
i = 1, 2, . . . , n 1 (costul minim al irurilor de lungime 2) la prima execuie a ciclului din liniile
412. La a doua trecere prin ciclu, se calculeaz m[i, i + 2] pentru i = 1, 2, . . . , n 2 (costul
minim al irurilor de lungime 3) etc. La ecare pas, costul m[i, j] calculat pe liniile 912 depinde
doar de intrrile m[i, k] i m[k + 1, j] ale tabloului, deja calculate.
Figura 16.1 ilustreaz aceast procedur pe un ir de n = 6 matrice. Deoarece am denit
m[i, j] doar pentru i j, din tabloul m folosim doar poriunea situat strict deasupra diagonalei
principale. Figura arat tablourile rotite astfel nct diagonala principal devine orizontal, iar
irul de matrice este nscris de-a lungul liniei de jos. Folosind acest model, costul minim m[i, j] de
nmulire a subirului A
i
A
i+1
A
j
de matrice poate gsit la intersecia liniilor care pornesc
264 Capitolul 16 Programarea dinamic
Figura 16.1 Tabelele m i s calculate de Ordine-ir-Matrice pentru n = 6 i matricele cu dimen-
siunile date mai jos:
matrice dimensiuni
A
1
30 35
A
2
35 15
A
3
15 5
A
4
5 10
A
5
10 20
A
6
20 25
Tabelele sunt rotite astfel nct diagonala principal devine orizontal. n tabloul m sunt utilizate doar
elementele de deasupra diagonalei principale, iar n tabloul s sunt utilizate doar elementele de sub
diagonala principal. Numrul minim de nmuliri scalare necesare pentru nmulirea a ase matrice este
m[1, 6] = 15.125. Dintre ptratele haurate cu gri deschis, perechile care sunt colorate cu aceeai nuan
sunt considerate mpreun n linia 9, cnd calculm
m[2, 5] = min

m[2, 2] +m[3, 5] +p
1
p
2
p
5
= 0 + 2500 + 35 15 20 = 13000
m[2, 3] +m[4, 5] +p
1
p
3
p
5
= 2625 + 1000 + 35 5 20 = 7125
m[2, 4] +m[5, 5] +p
1
p
4
p
5
= 4375 + 0 + 35 10 20 = 11375

= 7125.
pe direcia nord-est din A
i
i pe direcia nord-vest din A
j
. 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 ecrui rnd. O valoare
m[i, j] este calculat pe baza folosirii produselor p
i1
p
k
p
j
pentru k = i, i+1, . . . , j 1 i a tuturor
valorilor aate 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(n
3
). n ecare 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 (n
3
). Algoritmul necesit un spaiu (n
2
) pentru
a stoca tablourile m i s. De aceea, algoritmul Ordine-ir-Matrice este mult mai ecient
dect metoda de enumerare a tuturor variantelor de parantezare a produsului de matrice i de
vericare a acestora.
16.1. nmulirea unui ir de matrice 265
Construirea unei soluii optime
Dei algoritmul Ordine-ir-Matrice determin numrul optim de nmuliri scalare
necesare pentru calculul produsului irului de matrice, acesta nu prezint n mod direct, cum
trebuie fcut nmulirea. Pasul 4 al schemei generale a metodei programrii dinamice urmrete
construirea unei soluii optime din informaia disponibil.
n acest caz particular, vom folosi tabloul s[1..n, 1..n] pentru a determina modul optim de
nmulire a matricelor. Fiecare element s[i, j] conine valoarea lui k pentru care parantezarea
optim a produsului A
i
A
i+1
A
j
mparte produsul ntre A
k
i A
k+1
. Atunci tim c, n produsul
nal de calcul al matricei A
1..n
, optimul este A
1..s[1,n]
A
s[1,n]+1..n
. nmulirile anterioare pot
determinate recursiv, deoarece s[1, s[1, n]] determin ultima nmulire matriceal din calculul
lui A
1..s[1,n]
i s[s[1, n] +1, n] determin ultima nmulire matriceal din calculul lui A
s[1,n]+1..n
.
Urmtoarea procedur recursiv calculeaz produsul irului de matrice A
i..j
, ind date matricele
A = 'A
1
, A
2
, . . . , A
n
`, tabloul s calculat de Ordine-ir-Matrice i indicii i i j. Apelul iniial
este nmulire-ir-Matrice(A,s,1,n).
nmulire-ir-Matrice(A,s,i,j)
1: dac j > i atunci
2: X nmulire-ir-Matrice(A, s, i, s[i, j])
3: Y nmulire-ir-Matrice(A, s, s[i, j] + 1, j)
4: returneaz nmulire-Matrice(X, Y )
5: altfel
6: returneaz A
i
n exemplul din gura 16.1, apelul nmulire-ir-Matrice(A,s,1,6) calculeaz produsul
irului de matrice conform descompunerii n paranteze
((A
1
(A
2
A
3
))((A
4
A
5
)A
6
)). (16.3)
Exerciii
16.1-1 Gsii o parantezare optim a produsului unui ir de matrice al crui ir de dimensiuni
este '5, 10, 3, 12, 5, 50, 6`.
16.1-2 Proiectai un algoritm ecient Scrie-Optim-Prini pentru a aa parantezarea
optim a unui ir de matrice dat de tabloul s calculat de Ordine-ir-Matrice. Analizai
algoritmul.
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

i=1
n

j=i
R(i, j) =
n
3
n
3
.
( Identitatea

n
i=1
i
2
= n(n + 1)(2n + 1)/6 poate 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
16.2. Elemente de programare dinamic
Cu toate c am prezentat un exemplu de aplicare a metodei programrii dinamice, este
posibil s existe, n continuare, ntrebri asupra situaiilor n care ea este aplicabil, sau, altfel
spus, cnd trebuie cutat o soluie de programare dinamic pentru o anumit problem?
n aceast seciune se vor examina dou componente de baz pe care trebuie s le prezinte
problema de optimizare pentru ca programarea dinamic s e aplicabil: substructura optim
i subproblemele suprapuse. Se va urmri, ns, i o variant a metodei, numit memoizare, n
care se utilizeaz proprietatea de suprapunere a subproblemelor.
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 A
1
A
2
A
n
, care separ produsul
ntre A
k
i A
k+1
, include soluii optime pentru problemele parantezrii matricelor A
1
A
2
A
k
i A
k+1
A
k+2
A
n
. 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 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 putut alege ca spaiu al subproblemelor
secvene arbitrare de matrice din irul de intrare, dar acest spaiu al subproblemelor ar fost
prea mare. Un algoritm de programare dinamic bazat pe acest spaiu al subproblemelor ar
rezolva mult mai multe probleme dect ar 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 'A
1
, A
2
, . . . , A
n
`. Deci, mulimea irurilor de forma 'A
i
, A
i+1
, . . . , A
j
` 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 e aplicabil este ca spaiul subproblemelor s e 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 ecare nou etap, probleme
noi. n general, algoritmii de programare dinamic folosesc suprapunerea subproblemelor prin
rezolvarea o singur dat a ecrei subprobleme, urmat de stocarea soluiei ntr-un tablou unde
poate 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 gura 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 recalculat de ecare dat n loc s e
preluat din tablou, creterea timpului de execuie ar dramatic. Pentru a vedea aceasta, s
considerm urmtoarea procedur recursiv (inecient) care determin m[i, j], numrul minim
de nmuliri scalare necesare pentru a calcula produsul irului de matrice A
i..j
= A
i
A
i+1
. . . A
j
.
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) +p
i1
p
k
p
j
6: dac q < m[i, j] atunci
7: m[i, j] q
8: returneaz m[i, j]
Figura 16.2 prezint arborele de recuren produs de apelul ir-Matrice-Recursiv(p,1,4).
Fiecare nod este etichetat cu valorile parametrilor i i j. Se observ c anumite perechi de valori
apar de mai multe ori.
268 Capitolul 16 Programarea dinamic
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,
T(n) 1 +
n1

k=1
(T(k) +T(n k) + 1), pentru n > 1.
S observm c pentru i = 1, 2, . . . , n 1, ecare termen T(i) apare o dat ca T(k) i o dat ca
T(nk); adunnd cele n1 uniti cu unitatea din primul termen al sumei, recurena se poate
rescrie ca
T(n) 2
n1

i=1
T(i) +n. (16.4)
Vom arta c T(n) = (2
n
) folosind inducia matematic. Mai precis, vom arta c T(n)
2
n1
pentru orice n 1. Pentru n = 1, este clar c T(1) 1 = 2
0
. Prin inducie, pentru n 2
avem
T(n) 2
n1

i=1
2
i1
+n = 2
n2

i=0
2
i
+n = 2(2
n1
1) +n = (2
n
2) +n 2
n1
,
ceea ce completeaz demonstraia. Atunci, totalul calculelor realizate de apelul ir-Matrice-
Recursiv(p, 1, n) este cel puin exponenial n n.
Comparai acest algoritm recursiv, top-down, cu algoritmul de programare dinamic
bottom-up. Acesta din urm este mult mai ecient deoarece folosete proprietatea de
suprapunere a subproblemelor. Problema are exact (n
2
) subprobleme distincte, i algoritmul
de programare dinamic o rezolv pe ecare o singur dat. Pe de alt parte, algoritmul recursiv
trebuie s rezolve n mod repetat ecare subproblem, ori de cte ori apare n arborele de
recuren. Se poate ncerca aplicarea programrii dinamice ori de cte ori arborele de recuren
corespunztor soluiei recursive naturale conine, n mod repetat, o aceeai subproblem, iar
numrul total de subprobleme este mic.
Memoizarea
Vom prezenta n continuare o variant a programrii dinamice, care mrete, deseori, eciena
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 inecient. 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 ecare soluie a
ecrei 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) +p
i1
p
k
p
j
8: dac q < m[i, j] atunci
9: m[i, j] q
10: returneaz m[i, j]
Algoritmul ir-Matrice-Memoizat, la fel ca i Ordine-ir-Matrice, utilizeaz tabloul
m[1..n, 1..n] al valorilor calculate pentru m[i, j], numrul minim de nmuliri scalare necesare
pentru a calcula matricea A
i..j
. Fiecare element al tabloului conine, la nceput, elementul
pentru a arta c respectivul element trebuie determinat. Atunci cnd se execut apelul ir-
Echivalent(p, i, j), dac m[i, j] < , pe linia 1, procedura se rezum la a returna costul
deja calculat m[i, j] (linia 2). Altfel, costul este calculat la fel ca n algoritmul ir-Matrice-
Recursiv, memorat n m[i, j] i returnat. (Valoarea este convenabil pentru marcarea
elementelor necalculate ale tabloului, deoarece este valoarea folosit la iniializarea valorii
m[i, j] n linia 3 din ir-Matrice-Recursiv.) Atunci, ir-Echivalent(p, i, j) returneaz,
ntotdeauna, valoarea m[i, j], dar o calculeaz efectiv numai n cazul primului apel avnd
parametrii i i j.
Figura 16.2 ilustreaz modul n care algoritmul ir-Matrice-Memoizat economisete timp
n raport cu ir-Matrice-Recursiv. Subarborii haurai reprezint valori cutate n tablou i
care nu sunt calculate.
Asemntor algoritmului de programare dinamic Ordine-ir-Matrice, procedura ir-
Matrice-Memoizat are timpul de execuie O(n
3
). Fiecare dintre cele (n
2
) elemente ale
tabloului este iniializat o singur dat n linia 4 a procedurii ir-Matrice-Memoizat i
completat cu valoarea denitiv printr-un singur apel al procedurii ir-Echivalent. Fiecare
dintre aceste (n
2
) apeluri dureaz un timp O(n), fr a lua n considerare timpul necesar
calculrii celorlalte elemente ale tabloului, deci, n total, este folosit un timp O(n
3
). Prin urmare,
memoizarea transform un algoritm (2
n
) ntr-un algoritm O(n
3
).
Aceast abordare presupune c mulimea parametrilor tuturor subproblemelor posibile este cunoscut i c
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(n
3
) e printr-
un algoritm top-down cu memoizare, e printr-un algoritm de programare dinamic bottom-
up. Ambele metode folosesc proprietatea subproblemelor suprapuse. n total exist numai
(n
2
) subprobleme distincte i ecare dintre metodele amintite rezolv ecare 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 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 ecient de determinare a numrului optim de nmuliri n
problema produsului de matrice: enumerarea tuturor parantezrilor posibile ale produsului
i calculul numrului de nmuliri pentru ecare descompunere, sau execuia procedurii ir-
Matrice-Recursiv? Justicai rspunsul.
16.2-3 Desenai arborele de recuren pentru procedura Sorteaz-Prin-Interclasare,
descris n seciunea 1.3.1, pentru un vector de 16 elemente. Explicai de ce memoizarea este
inecient pentru accelerarea unui algoritm bun de tip divide i stpnete, aa cum este
Sorteaz-Prin-Interclasare.
16.3. Cel mai lung subir comun
Urmtoarea problem pe care o vom lua n considerare este problema celui mai lung subir
comun. Un subir al unui ir dat este irul iniial din care lipsesc unele elemente (eventual nici
unul). n mod formal, dndu-se irul X = 'x
1
, x
2
, . . . , x
m
`, un alt ir Z = 'z
1
, z
2
, . . . , z
k
` este un
subir al lui X dac exist un ir strict cresctor de indici din X, 'i
1
, i
2
, . . . , i
k
`, astfel nct,
pentru toate valorile j = 1, 2, . . . , k, avem x
i
j
= z
j
. De exemplu, Z = 'B, C, D, B` este un subir
al lui X = 'A, B, C, B, D, A, B`, secvena de indici corespunztoare ind '2, 3, 5, 7`.
Dndu-se dou iruri X i Y , spunem c irul Z este un subir comun pentru X i Y dac
Z este un subir att pentru X ct i pentru Y. De exemplu, dac X = 'A, B, C, B, D, A, B`
i Y = 'B, D, C, A, B, A`, irul 'B, C, A` este un subir comun pentru X i Y . irul 'B, C, A`
nu este subir comun (CMLSC) pentru X i Y , deoarece are lungimea 3, iar irul
'B, C, B, A`, care este de asemenea subir comun lui X i Y , are lungimea 4. irul 'B, C, B, A`
16.3. Cel mai lung subir comun 271
este un CMLSC pentru X i Y , la fel i irul 'B, D, A, B`, deoarece nu exist un subir comun
de lungime cel puin 5.
n problema celui mai lung subir comun, se dau dou iruri X = 'x
1
, x
2
, . . . , x
m
` i
Y = 'y
1
, y
2
, . . . , y
n
` i se dorete determinarea unui subir comun de lungime maxim pentru
X i Y . Aceast seciune va arta c problema CMLSC poate rezolvat ecient prin metoda
programrii dinamice.
Caracterizarea celui mai lung subir comun
O abordare prin metoda forei brute pentru rezolvarea problemei CMLSC const n
enumerarea tuturor subirurilor lui X i vericarea dac acestea constituie un subir i pentru
Y , memornd cel mai lung subir gsit. Fiecare subir al lui X corespunde unei submulimi a
indicilor lui X, '1, 2, . . . , m`. Exist 2
m
subiruri pentru X i, deci, aceast abordare necesit un
timp exponenial, ceea ce o face inabordabil pentru iruri de lungimi mari.
Problema CMLSC are proprietatea de substructur optim, aa cum vom arta n urmtoarea
teorem. Clasa natural de subprobleme corespunde unor perechi de prexe ale celor dou iruri
de intrare. Mai precis, dndu-se un ir X = 'x
1
, x
2
, . . . , x
m
`, denim prexul i al lui X, pentru
i = 0, 1, . . . , m, ca ind X
i
= 'x
1
, x
2
, . . . , x
i
`. De exemplu, dac X = 'A, B, C, B, D, A, B`,
atunci X
4
= 'A, B, C, B` iar X
0
este irul vid.
Teorema 16.1 (Substructura optimal a unui CMLSC) Fie irurile X = 'x
1
, x
2
, . . . ,
x
m
` i Y = 'y
1
, y
2
, . . . , y
n
` i e Z = 'z
1
, z
2
, . . . , z
k
` un CMLSC pentru X i Y .
1. Dac x
m
= y
n
, atunci z
k
= x
m
= y
n
i Z
k1
este un CMLSC pentru X
m1
i Y
n1
.
2. Dac x
m
= y
n
, atunci, din z
k
= x
m
rezult c Z este un CMLSC pentru X
m1
i Y .
3. Dac x
m
= y
n
, atunci, din z
k
= y
n
rezult c Z este un CMLSC pentru X i Y
n1
.
Demonstraie. (1) Dac z
k
= x
m
, atunci putem aduga x
m
= y
n
la Z pentru a obine un
subir comun a lui X i Y de lungime k + 1, contrazicnd presupunerea c Z este
subir comun pentru X i Y . Deci, va trebui s avem z
k
= x
m
= y
n
. Prexul Z
k1
este un subir
comun de lungime k 1 pentru X
m1
i Y
n1
. Dorim s demonstrm c este un CMLSC. S
presupunem, prin absurd, c exist un subir W comun pentru X
m1
i Y
n1
, a crui lungime
este e mai mare dect k 1. Atunci, adugnd la W elementul x
m
= y
n
, se va forma un subir
comun a lui X i Y a crui lungime este mai mare dect k, ceea ce este o contradicie.
(2) Dac z
k
= x
m
, atunci Z este un subir comun pentru X
m1
i Y . Dac ar exista un subir
comun W al lui X
m1
i Y , cu lungime mai mare dect k, atunci W ar i un subir comun al
lui X
m
i Y , contrazicnd presupunerea c Z este un CMLSC pentru X i Y .
(3) Demonstraia este simetric celei de la (2).
Caracterizarea din teorema 16.1 arat c un CMLSC al dou iruri conine un CMLSC pentru
prexele celor dou iruri. Atunci, problema CMLSC are proprietatea de substructur optimal.
O soluie recursiv are, de asemenea, proprietatea de suprapunere a problemelor, dup cum vom
arta n cele ce urmeaz.
272 Capitolul 16 Programarea dinamic
O soluie recursiv a subproblemelor
Teorema 16.1 implic faptul c exist e una, e dou probleme care trebuie examinate
pentru gsirea unui CMLSC pentru X = 'x
1
, x
2
, . . . , x
m
` i Y = 'y
1
, y
2
, . . . , y
n
`. Dac x
m
= y
n
,
trebuie gsit un CMLSC pentru X
m1
i Y
n1
. Adugarea elementului x
m
= y
n
la acest CMLSC
produce un CMLSC pentru X i Y . Dac x
m
= y
n
, atunci trebuie rezolvate dou subprobleme:
gsirea unui CMLSC pentru X
m1
i Y i gsirea unui CMLSC pentru X i Y
n1
. Cel mai lung
CMLSC dintre acestea dou va CMLSC pentru X i Y .
Se poate observa c problema CMLSC se descompune n subprobleme suprapuse. Pentru a
gsi un CMLSC al irurilor X i Y , va trebui, probabil, calculat CMLSC pentru X i Y
n1
,
respectiv, pentru X
m1
i Y . Dar ecare dintre aceste subprobleme conine sub-subproblema
gsirii CMLSC pentru X
m1
i Y
n1
. Multe alte subprobleme au n comun sub-subprobleme.
Ca i problema nmulirii irului de matrice, soluia recursiv pentru problema CMLSC
implic stabilirea unei recurene pentru costul unei soluii optime. S denim c[i, j] ca lungimea
unui CMLSC al irurilor X
i
i Y
j
. Dac i = 0 sau j = 0, CMLSC are lungimea 0. Substructura
optimal a problemei CMLSC produce formula recursiv
c[i, j] =

0 dac i = 0 sau j = 0,
c[i 1, j 1] + 1 dac i, j > 0 i x
i
= y
j
,
max(c[i, j 1], c[i 1, j]) dac i, j > 0 i x
i
= y
j
.
(16.5)
Calculul lungimii unui CMLSC
Pe baza ecuaiei (16.5) se poate scrie un algoritm recursiv avnd timp exponenial pentru
calculul lungimii unui CMLSC a dou iruri. Deoarece exist numai (mn) subprobleme dis-
tincte, vom folosi metoda programrii dinamice pentru a calcula soluiile n mod bottom-up.
Lungime-CMLSC(X, Y )
1: m lungime[X]
2: n lungime[Y ]
3: pentru i 1, m execut
4: c[i, 0] 0
5: pentru j 0, n execut
6: c[0, j] 0
7: pentru i 1, m execut
8: pentru j 1, n execut
9: dac x
i
= y
j
atunci
10: c[i, j] c[i 1, j 1] + 1
11: b[i, j] `
12: altfel
13: dac c[i 1, j] c[i, j 1] atunci
14: c[i, j] c[i 1, j]
15: b[i, j]
16: altfel
17: c[i, j] c[i, j 1]
18: b[i, j]
19: returneaz c, b
16.3. Cel mai lung subir comun 273
Procedura Lungime-CMLSC are ca date de intrare dou iruri X = 'x
1
, x
2
, . . . , x
m
` i
Y = 'y
1
, y
2
, . . . , y
n
`. Procedura memoreaz valorile c[i, j] ntr-un tablou c[0..m, 0..n] ale crui
elemente sunt calculate n ordinea cresctoare a liniilor. (Aceasta nseamn c se completeaz
mai nti prima linie de la stnga la dreapta, apoi a doua linie i aa mai departe.) De asemenea,
se construiete un tablou b[1..m, 1..n] care simplic determinarea unei soluii optimale. Intuitiv,
b[i, j] indic elementul tabloului care corespunde soluiei optime a subproblemei alese la calculul
lui c[i, j]. Procedura returneaz tablourile b i c; c[m, n] conine lungimea unui CMLSC pentru
X i Y .
Figura 16.3 conine tabloul produs de Lungime-CMLSC pentru irurile X = 'A, B, C,
B, D, A, B` i Y = 'B, D, C, A, B, A`. Timpul de execuie al procedurii este O(mn), deoarece
calculul ecrui element al tabloului necesit un timp O(1).
Construirea unui CMLSC
Tabelul b returnat de Lungime-CMLSC poate folosit pentru construcia rapid a unui
CMLSC pentru X = 'x
1
, x
2
, . . . , x
m
` i Y = 'y
1
, y
2
, . . . , y
n
`. Pur i simplu, se ncepe cu
b[m, n] i se parcurge tabloul conform direciilor indicate. Ori de cte ori se ntlnete un
element ` pe poziia b[i, j], aceasta nseamn c x
i
= y
j
este un element al CMLSC. Prin
aceast metod, elementele CMLSC sunt regsite n ordine invers. Urmtoarea procedur
recursiv tiprete un CMLSC al irurilor X i Y n ordinea corect. Apelul iniial este Scrie-
CMLSC(b,X,lungime[X],lungime[Y ]).
Scrie-CMLSC(b, X, i, j)
1: dac i = 0 sau j = 0 atunci
2: revenire
3: dac b[i, j] =` atunci
4: Scrie-CMLSC(b, X, i 1, j 1)
5: tiprete x
i
6: altfel dac b[i, j] = atunci
7: Scrie-CMLSC(b, X, i 1, j)
8: altfel
9: Scrie-CMLSC(b, X, i, j 1)
Pentru tabloul b din gura 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 ecare etap a
recurenei.
mbuntirea codului
O dat ce s-a construit un algoritm, se descoper c, deseori, timpul de execuie sau spaiul
folosit pot mbuntite. Acest lucru este adevrat, mai ales, pentru programarea dinamic
clasic. Anumite modicri pot simplica implementarea i pot mbunti factorii constani, dar
nu pot aduce o mbuntire asimptotic a performanei. Alte modicri 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
Figura 16.3 Tabelele c i b calculate de Lungime-CMLSC pentru irurile X = 'A, B, C, B, D, A, B)
i Y = 'B, D, C, A, B, A). Ptratul din linia i i coloana j conine valoarea c[i, j] precum i sgeata
potrivit pentru valoarea lui b[i, j]. Valoarea 4 a lui c[7, 6] colul cel mai din dreapta jos n tablou
este lungimea unui CMLSC 'B, C, B, A) al lui X i Y . Pentru i, j > 0, valoarea c[i, j] depinde doar de
valoarea expresiei x
i
= y
j
i de valorile elementelor c[i1, j], c[i, j 1] i c[i1, j 1], care sunt calculate
naintea lui c[i, j]. Pentru a reconstrui elementele unui CMLSC, se urmresc sgeile corespunztoare lui
b[i, j] ncepnd cu colul cel mai din dreapta; drumul este haurat. Fiecare ` pe acest drum corespunde
unui element (care este evideniat) pentru care x
i
= y
j
aparine unui CMLSC.
tabloul b. Ca o consecin, putem reconstrui un CMLSC n timp O(m+n) folosind o procedur
similar cu Scrie-CMLSC. (Exerciiul 16.3-2 cere algoritmul corespunztor n pseudocod.)
Dei prin aceast metod se elibereaz un spaiu (mn), spaiul auxiliar necesar calculului unui
CMLSC nu descrete asimptotic, deoarece este oricum necesar un spaiu (mn) pentru tabloul
c.
Totui, spaiul necesar pentru Lungime-CMLSC l putem reduce deoarece, la un moment
dat, sunt necesare doar dou linii ale tabloului c: linia care este calculat i linia precedent. (De
fapt, putem folosi doar puin mai mult spaiu dect cel necesar unei linii a lui c, pentru a calcula
lungimea unui CMLSC; vezi exerciiul 16.3-4.) Aceast mbuntire funcioneaz doar dac
este necesar numai lungimea unui CMLSC; dac este nevoie i de reconstruirea elementelor
unui CMLSC, tabloul mai mic nu conine destul informaie pentru a reface etapele n timp
O(m+n).
Exerciii
16.3-1 Determinai un CMLSC pentru '1, 0, 0, 1, 0, 1, 0, 1` i '0, 1, 0, 1, 1, 0, 1, 1, 0`.
16.3-2 Artai cum poate reconstituit un CMLSC pe baza tabloului c (completat) i a irurilor
iniiale X = 'x
1
, x
2
, . . . , x
m
` i Y = 'y
1
, y
2
, . . . , y
n
` n timp O(m+n), fr a folosi tabloul b.
16.4. Triangularea optim a poligoanelor 275
16.3-3 Dai o versiune cu memoizare a procedurii Lungime-CMLSC, care se execut n timp
O(mn).
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(n
2
) 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(nlg n) care gsete cel mai lung subir
monoton cresctor al unui ir de n numere. ( 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.)
16.4. Triangularea optim a poligoanelor
n acest paragraf vom investiga problema determinrii unei triangulri optime a unui poligon
convex. Aceast problem geometric prezint multe similariti cu problema parantezrii
produsului de matrice, chiar dac aceste asemnri nu sunt evidente.
Un poligon este o curb nchis, liniar pe poriuni, n plan. Mai explicit, este o curb
avnd captul iniial identic cu cel nal i format dintr-o secven de segmente de dreapt,
numite laturi ale poligonului. Un punct care unete dou fee ale poligonului se numete
vrf . Vom presupune, n continuare, c poligonul este simplu, adic nu se auto-intersecteaz.
Mulimea de puncte din plan cuprinse de un poligon simplu formeaz interiorul poligonului,
mulimea punctelor aparinnd efectiv poligonului formeaz frontiera, iar mulimea de puncte
care nconjoar poligonul se numete exterior. Un poligon simplu este numit convex dac,
dndu-se oricare dou puncte de pe frontier sau din interiorul su, toate punctele aparinnd
segmentului care unete aceste dou puncte se a e pe frontier e n interiorul poligonului.
Un poligon convex poate reprezentat prin precizarea vrfurilor, de exemplu n sensul
acelor de ceasornic. Adic, dac P = 'v
0
, v
1
, . . . , v
n1
` este un poligon convex, atunci cele n
laturi ale sale sunt v
0
v
1
, v
1
v
2
, . . . , v
n1
v
n
, unde vom considera v
n
ca ind v
0
. (n general, vom
presupune, implicit, c toate operaiile aritmetice asupra indicilor vrfurilor poligonului sunt
efectuate modulo numrul de vrfuri.)
Dndu-se dou vrfuri neadiacente v
i
i v
j
, segmentul v
i
v
j
se numete coard a poligonului.
O coard v
i
v
j
mparte poligonul n dou poligoane: 'v
i
, v
i+1
, . . . , v
j
` i 'v
j
, v
j+1
, . . . , v
i
`.
O triangulare a poligonului este o mulime T de coarde ale poligonului care l mpart
n triunghiuri disjuncte (poligoane cu 3 laturi). Figura 16.4 prezint dou modaliti de
triangulare a unui poligon avnd 7 laturi. ntr-o triangulare, coardele nu se intersecteaz (cu
excepia capetelor lor), iar mulimea T este maximal, adic orice coard care nu aparine
mulimii T va intersecta o coard din T. Laturile triunghiurilor produse de triangulare sunt e
coarde n triangulare, e laturi ale poligonului. Fiecare triangulare a unui poligon convex cu n
vrfuri are n 3 coarde i mparte poligonul n n 2 triunghiuri.
Pentru problema triangulrii optime a unui poligon, se dau un poligon convex P =
'v
0
, v
1
, . . . , v
n1
` i o funcie de ponderare w denit pe triunghiurile formate de laturile i
276 Capitolul 16 Programarea dinamic
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
w(v
i
v
j
v
k
) = [v
i
v
j
[ +[v
j
v
k
[ +[v
k
v
i
[,
unde [v
i
v
j
[ reprezint distana euclidian de la v
i
la v
j
. 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 produsul unui ir de matrice. Aceast coresponden poate 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
((A
1
(A
2
A
3
))(A
4
(A
5
A
6
))). (16.6)
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 E
s
i un subarbore drept reprezentnd o
expresie E
d
, atunci subarborele nsui reprezint expresia (E
s
E
d
). Aceasta este o coresponden
biunivoc ntre arborii de analiz gramatical i expresiile complet parantezate avnd n elemente
atomice.
O triangulare a unui poligon convex 'v
0
, v
1
, . . . , v
n1
` poate reprezentat, de asemenea,
printr-un arbore de analiz gramatical. Figura 16.5(b) prezint un astfel de arbore corespun-
ztor triangulrii poligonului din gura 16.4(a). Nodurile interne ale arborelui sunt coarde n
triangulare, iar latura v
0
v
6
este rdcina. Frunzele sunt celelalte laturi ale poligonului. Rdcina
v
0
v
6
este o latur a triunghiului v
0
v
3
v
6
. Acest triunghi determin ii rdcinii: unul este
16.4. Triangularea optim a poligoanelor 277
Figura 16.5 Arbori de analiz gramatical. (a) Arbore de analiz pentru parantezarea produsului
((A
1
(A
2
A
3
))(A
4
(A
5
A
6
))) i pentru triangularea poligonului avnd 7 laturi din gura 16.4(a). (b)
Triangularea poligonului, suprapus cu arborele de analiz. Fiecare matrice A
i
corespunde laturii v
i1
v
i
pentru i = 1, 2, . . . , 6.
coarda v
0
v
3
, iar cellalt este coarda v
3
v
6
. S observm c acest triunghi mparte poligonul dat
n trei pri: triunghiul v
0
v
3
v
6
nsui, poligonul 'v
0
, v
1
, . . . , v
3
` i poligonul 'v
3
, v
4
, . . . , v
6
`. Mai
mult, cele dou subpoligoane sunt formate, n ntregime, din laturi ale poligonului considerat,
cu excepia rdcinilor arborilor asociai lor, care sunt coardele v
0
v
3
i v
3
v
6
. ntr-o manier
recursiv, poligonul 'v
0
, v
1
, . . . , v
3
` conine subarborele stng al rdcinii arborelui de analiz,
iar poligonul 'v
3
, v
4
, . . . , v
6
` 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 A
i
dintr-un produs A
1
A
2
A
n
corespunde unei laturi v
i1
v
i
a unui poligon avnd n + 1 vrfuri. O coard v
i
v
j
, unde i < j,
corespunde unei matrice A
i+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 ecare instan a produsului unui ir de matrice poate
transformat ntr-o problem de triangulare optim. Dndu-se un produs al unui ir de matrice
A
1
A
2
A
n
, vom deni un poligon convex cu n + 1 vrfuri, P = 'v
0
, v
1
, . . . , v
n
`. Dac matricea
A
i
are dimensiunile p
i1
p
i
pentru i = 1, 2, . . . , n, vom deni funcia de cost a triangulrii
astfel
w(v
i
v
j
v
k
) = p
i
p
j
p
k
.
O triangulare optim a lui P relativ la aceast funcie de cost produce un arbore de analiz
pentru o parantezare optim a produsului A
1
A
2
A
n
.
Cu toate c reciproca nu este adevrat, adic problema triangulrii optime 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 modicri minore, rezolv problema triangulrii
optime pentru un poligon avnd n+1 vrfuri. Trebuie doar s nlocuim secvena 'p
0
, p
1
, . . . , p
n
`
a dimensiunilor matricelor cu secvena 'v
0
, v
1
. . . , v
n
` 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(v
i1
v
k
v
j
)
Dup execuia algoritmului, elementul m[1, n] conine ponderea unei triangulri optime. n
continuare vom justica aceast armaie.
Substructura unei triangulri optime
S considerm o triangulare optim T a unui poligon avnd n+1 vrfuri P = 'v
0
, v
1
, . . . , v
n
`
care conine triunghiul v
0
v
k
v
n
pentru un anumit k cu 1 k n 1. Ponderea asociat lui T
este suma ponderilor triunghiului v
0
v
k
v
n
i a triunghiurilor corespunztoare triangulrii celor
dou subpoligoane 'v
0
, v
1
, . . . , v
k
` i 'v
k
, v
k+1
, . . . , v
n
`. Triangularea subpoligoanelor determinate
de T trebuie, deci, s e optim, deoarece, dac s-ar obine pentru unul dintre ele o pondere de
valoare mai mic, s-ar contrazice minimalitatea ponderii lui T.
O soluie recursiv
Aa cum, conform deniiei, m[i, j] este costul minim al calculului subprodusului irului de
matrice A
i
A
i+1
A
j
, e t[i, j], pentru 1 i < j n, ponderea triangulrii optime a poligonului
'v
i1
, v
i
, . . . , v
j
`. Prin convenie, vom considera poligonul degenerat 'v
i1
, v
i
` ca avnd pondere
0. Ponderea unei triangulri optime a poligonului P este dat de t[1, n].
Urmtorul pas este denirea 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 'v
i1
, v
i
, . . . , v
j
`
are cel puin trei vrfuri. Dorim s minimizm suma dintre ponderea triunghiului v
i1
v
k
v
j
i
ponderile triangulrilor optime pentru poligoanele 'v
i1
, v
i
. . . , v
k
` i 'v
k
, v
k+1
, . . . , v
j
`, relativ
la toate vrfurile v
k
, pentru k = i, i + 1, . . . , j 1. n concluzie, funcia recursiv este
t[i, j] =

0 dac i = j,
min
ikj1
t[i, k] +t[k + 1, j] +w(v
i1
v
k
v
j
) dac i < j.
(16.7)
S comparm aceast recuren cu (16.2), recuren pe care am construit-o pentru numrul
m[i, j], reprezentnd numrul de nmuliri scalare necesare pentru a calcula A
i
A
i+1
A
j
.
Cu excepia funciei de ponderare, recurenele sunt identice, aadar, cu modicrile minore
menionate mai sus, procedura Ordine-ir-Matrice poate calcula ponderea unei triangulri
optime. La fel ca Ordine-ir-Matrice, procedura de triangulare optim se execut ntr-un
timp de ordinul (n
3
) i folosete un spaiu de memorie de ordinul (n
2
).
Exerciii
16.4-1 Demonstrai c orice triangulare a unui poligon convex avnd n vrfuri are n3 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 armaie adevrat?
16.4-3 S presupunem c funcia de ponderare w este denit 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(v
i
v
j
v
k
) = [v
i
v
j
[ +[v
j
v
k
[ +[v
k
v
i
[,
unde [v
i
v
j
[ este distana euclidian de la v
i
la v
j
. (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 simplicat 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(n
2
), pentru determinarea unui circuit
bitonic optim. Se va presupune c dou puncte distincte nu au aceeai abscis. (
Parcugei de la stnga la dreapta, innd minte posibilitile optime pentru cele dou pri
ale circuitului.)
280 Capitolul 16 Programarea dinamic
16-2 Tiprire uniform
S considerm problema tipririi uniforme a unui paragraf cu ajutorul unei imprimante. Textul
de intrare este o succesiune de n cuvinte, de lungimi l
1
, l
2
, . . . , l
n
, lungimea ind msurat n
caractere. Se dorete tiprirea uniform a paragrafului pe un anumit numr de linii, ecare linie
avnd cel mult M caractere. Acest criteriu de uniformitate funcioneaz dup cum urmeaz:
dac o linie conine cuvintele de la cuvntul i la cuvntul j, cu i j iar ntre cuvinte se las exact
un spaiu, numrul de spaii suplimentare de la sfritul unei linii este Mj +i

j
k=i
l
k
, numr
care trebuie s e nenegativ, astfel nct cuvintele s ncap pe linie. Dorim s minimizm suma
cuburilor numrului de spaii suplimentare de la sfritul liniilor, n raport cu toate liniile, mai
puin ultima. Elaborai un algoritm folosind metoda programrii dinamice, care s tipreasc
uniform la imprimant un paragraf de n cuvinte. Analizai timpul de execuie i spaiul de
memorie necesare algoritmului.
16-3 Distana de editare
Exist mai multe modaliti prin care un terminal inteligent actualizeaz o linie dintr-un
text, nlocuind un ir surs x[1..m] cu un ir destinaie y[1..n]: un singur caracter al irului
surs poate ters, nlocuit cu un alt caracter sau copiat n irul destinaie; sau dou caractere
adiacente ale irului surs pot interschimbate n timp ce sunt copiate n irul destinaie. Dup
ce au fost realizate toate operaiile, un ntreg sux al irului surs poate ters, o astfel de
operaie ind cunoscut sub numele de tergere pn la sfritul liniei (sau, mai pe scurt,
eliminare).
De exemplu, o modalitate de transformare a irului surs algoritm n irul destinaie
altruiti utilizeaz urmtoarea secven de operaii.
Operaie ir destinaie ir surs
copiaz a a lgoritm
copiaz l al goritm
nlocuiete g cu t alt oritm
terge o alt ritm
copiaz r altr itm
insereaz u altru itm
insereaz i altrui itm
insereaz altrui itm
schimb it n ti altruiti m
elimin m altruiti
Pentru a obine acelai rezultat operaiile pot executate n diverse ordini.
Fiecare dintre aceste operaii: tergerea, nlocuirea, copierea, inserarea, interschimbarea i
eliminarea, au asociate un cost. (Presupunem costul asociat nlocuirii unui caracter ca ind mai
mic dect costurile combinate ale tergerii i inserrii; n caz contrar operaia de nlocuire nu
va utilizat). Costul unei secvene date de transformri este suma costurilor transformrilor
individuale. Pentru secvena de mai sus, costul transformrii cuvntului algoritm n altruiti
este
(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 aa succesiunea optim de
transformri. Analizai timpul de execuie i spaiul de memorie necesare.
16-4 Planicarea unei recepii de ctre o companie
Profesorul McKenzie este consultantul preedintelui Corporaiei A.-B., care intenioneaz s
ofere o recepie pentru companiile ce o compun. Corporaia are o structur ierarhic, relaiile
de subordonare formeaz un arbore orientat, n care rdcina este preedintele. Fiecare angajat
are ataat un coecient de convieuire, care este un numr real. Pentru a organiza o petrecere
plcut pentru toi participanii, preedintele dorete ca nici un angajat s nu se ntlneasc cu
eful su direct.
a. Descriei un algoritm pentru alctuirea listei invitailor. Scopul este de a maximiza suma
coecienilor de convieuire a invitailor. Analizai timpul de execuie al algoritmului.
b. Cum poate profesorul s se asigure c preedintele va invitat la propria sa petrecere?
16-5 Algoritmul Viterbi
Programarea dinamic poate utilizat n cazul unui graf orientat G = (V, E) pentru recu-
noaterea vorbirii. Fiecare muchie (u, v) E este etichetat cu un sunet (u, v) dintr-o mulime
nit de sunete. Graful etichetat este un model formal al unei persoane care vorbete o limb
cu anumite restricii. Fiecare drum n graf care ncepe ntr-un vrf dat v
0
V corespunde unei
secvene posibile de sunete produse de model. Eticheta unui drum este denit de concatenarea
etichetelor muchiilor care compun drumul respectiv.
a. Fie un graf G cu muchiile etichetate, un vrf v
0
V i o secven s = '
1
,
2
, . . . ,
k
`
de caractere din . Descriei un algoritm ecient care returneaz un drum din G, dac
exist un astfel de drum, care ncepe din v
0
i are eticheta s; n caz contrar, algoritmul va
returna nu-exist-drum. Analizai timpul de execuie al algoritmului. ( pot
utile noiunile din capitolul 23.)
S presupunem acum c ecare muchie (u, v) E are asociat, de asemenea, o probabilitate
nenegativ p(u, v) de traversare a muchiei (u, v) dinspre vrful u i de producere a sunetului
corespunztor. Suma probabilitilor asociate muchiilor care pleac din orice vrf este 1. Pro-
babilitatea asociat unui drum se denete ca ind produsul probabilitilor asociate muchiilor
care l compun. Putem interpreta probabilitatea asociat unui drum care pleac din v
0
, ca ind
probabilitatea ca un traseu aleator care ncepe n v
0
s urmeze drumul specicat; selectarea
muchiei care pleac dintr-un vrf u se face probabilistic, conform probabilitilor muchiilor care
pleac din u.
b. Extindei rspunsurile de la punctul (a) astfel nct, dac este returnat un drum, acesta
este plecnd din v
0
i avnd eticheta s. Analizai timpul de execuie
al algoritmului.
282 Capitolul 16 Programarea dinamic
Note bibliograce
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(nlg 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 armativ 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 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
Algoritmii aplicai problemelor de optimizare sunt, n general, compui dintr-o secven de
pai, la ecare pas existnd mai multe alegeri posibile. Pentru multe probleme de optimizare,
utilizarea metodei programrii dinamice pentru determinarea celei mai bune soluii se dovedete
a o metod prea complicat. Un algoritm greedy va alege la ecare moment de timp soluia
ce pare a cea mai bun la momentul respectiv. Deci este vorba despre o alegere optim, fcut
local, cu sperana c ea va conduce la un optim global. Acest capitol trateaz probleme de
optimizare ce pot rezolvate cu ajutorul algoritmilor greedy.
Algoritmii greedy conduc n multe cazuri la soluii optime, dar nu ntotdeauna. . . n seciunea
17.1 vom prezenta mai nti o problem simpl dar netrivial, problema selectrii activitilor, a
crei soluie poate calculat n mod ecient cu ajutorul unei metode de tip greedy. n seciunea
17.2 se recapituleaz cteva elemente de baz ale metodei greedy. n seciunea 17.3 este descris
o aplicaie important a metodei greedy: proiectarea unor coduri pentru compactarea datelor
i anume codurile Human. n seciunea 17.4 sunt investigate structuri combinatoriale numite
matroizi pentru care algoritmii greedy produc ntotdeauna soluie optim. n ncheiere, n
seciunea 17.5 se exemplic utilizarea matroizilor pentru problema planicrii sarcinilor de
timp unitar, sarcini avnd anumii termeni limit de realizare i anumite penalizri n caz de
nendeplinire.
Metoda greedy este destul de puternic i se aplic cu succes unui spectru larg de probleme.
Capitolele urmtoare vor prezenta mai muli algoritmi ce pot privii ca aplicaii ale metodei
greedy, cum ar algoritmii de determinare a arborelui parial de cost minim (capitolul 24),
algoritmul lui Dijkstra pentru determinarea celor mai scurte drumuri pornind dintr-un vrf
(capitolul 25) i algoritmul lui Chvatal, o euristic pentru determinarea acoperirii unei mulimi
(capitolul 37). Arborii pariali de cost minim sunt un exemplu clasic pentru metoda greedy.
Cu toate c acest capitol i capitolul 24 pot studiate independent, cititorul poate gsi util
parcurgerea lor paralel.
17.1. O problem de selectare a activitilor
Primul exemplu pe care l vom considera este o problem de repartizare a unei resurse mai
multor activiti care concureaz pentru a obine resursa respectiv. Vom vedea c un algoritm
de tip greedy reprezint o metod simpl i elegant pentru selectarea unei mulimi maximale
de activiti mutual compatibile.
S presupunem c dispunem de o mulime S = 1, 2, . . . , n de n activiti care doresc s
foloseasc o aceeai resurs (de exemplu o sal de lectur). Aceast resurs poate folosit de o
singur activitate la un anumit moment de timp. Fiecare activitate i are un timp de pornire
s
i
i un timp de oprire f
i
, unde s
i
f
i
. Dac este selecionat activitatea i, ea se desfoar
pe durata intervalului [s
i
, f
i
). Spunem c activitile i i j sunt compatibile dac intervalele
[s
i
, f
i
) i [s
j
, f
j
) nu se intersecteaz (adic i i j sunt compatibile dac s
i
f
j
sau s
j
f
i
).
Problema selectrii activitilor const din selectarea unei mulimi maximale de activiti
mutual compatibile.
284 Capitolul 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:
f
1
f
2
. . . f
n
. (17.1)
n caz contrar aceast ordonare poate fcut n timp O(nlg n). Algoritmul de mai jos presupune
c datele de intrare s i f sunt reprezentate ca vectori.
Selector-Activiti-Greedy(s, f)
1: n [s]
2: A 1
3: j 1
4: pentru i 2, n execut
5: dac s
i
f
j
atunci
6: A A i
7: j i
8: returneaz A
Operaiile realizate de algoritm pot vizualizate n gura 17.1. n mulimea A se introduc
activitile selectate. Variabila j identic ultima activitate introdus n A. Deoarece activitile
sunt considerate n ordinea nedescresctoare a timpilor lor de terminare, f
j
va reprezenta
ntotdeauna timpul maxim de terminare a oricrei activiti din A. Aceasta nseamn c
f
j
= maxf
k
: k A (17.2)
n liniile 23 din algoritm se selecteaz activitatea 1, se iniializeaz A astfel nct s nu conin
dect aceast activitate, iar variabila j ia ca valoare aceast activitate. n continuare liniile 47
consider pe rnd ecare activitate i i o adaug mulimii A dac este compatibil cu toate
celelalte activiti deja selectate. Pentru a vedea dac activitatea i este compatibil cu toate
celelalte activiti existente la momentul curent n A, este sucient, conform ecuaiei (17.2), s
e ndeplinit condiia din linia 5 adic momentul de pornire s
i
s nu e mai devreme dect
momentul de oprire f
j
al activitii cel mai recent adugate mulimii A. Dac activitatea i este
compatibil, atunci n liniile 67 ea este adugat mulimii A, iar variabila j este actualizat.
Procedura Selector-Activiti-Greedy este foarte ecient. Ea poate planica o mulime
S de n activiti n (n), presupunnd c activitile au fost deja ordonate dup timpul lor de
terminare. Activitatea aleas de procedura Selector-Activiti-Greedy este ntotdeauna
cea cu primul timp de terminare care poate planicat legal. Activitatea astfel selectat
este o alegere greedy (lacom) n sensul c, intuitiv, ea las posibilitatea celorlalte activiti
rmase pentru a planicate. Cu alte cuvinte, alegerea greedy maximizeaz cantitatea de timp
neplanicat rmas.
Demonstrarea corectitudinii algoritmului greedy
Algoritmii de tip greedy nu furnizeaz ntotdeauna soluiile optime. Cu toate acestea,
algoritmul Selector-Activiti-Greedy determin ntotdeauna o soluie optim pentru o
instan a problemei selectrii activitilor.
Teorema 17.1 Algoritmul Selector-Activiti-Greedy furnizeaz soluii de dimensiune
maxim pentru problema selectrii activitilor.
17.1. O problem de selectare a activitilor 285
Figura 17.1 Operaiile algoritmului Selector-Activiti-Greedy asupra celor 11 activiti date
n stnga. Fiecare linie a gurii corespunde unei iteraii din ciclul pentru din liniile 47. Activitile
care au fost selectate pentru a incluse n mulimea A sunt haurate, iar activitatea curent i este
nehaurat. Dac timpul de pornire s
i
al activitii i este mai mic dect timpul de terminare al activitii
j (sgeata dintre ele este spre stnga), activitatea este ignorat. n caz contrar (sgeata este ndreptat
spre dreapta), activitatea este acceptat i este adugat mulimii A.
Demonstraie. Fie S = 1, 2, . . . , n mulimea activitilor care trebuie planicate. Deoarece
presupunem c activitile sunt ordonate dup timpul de terminare, activitatea 1 se va termina
286 Capitolul 17 Algoritmi greedy
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, planicarea mulimii A ncepe cu o alegere greedy.
Dac k = 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 f
1
f
k
, 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 planicare 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 A
t
= A 1 este o soluie optim pentru problema selectrii activitilor
S
t
= i S : s
i
f
1
. De ce? Dac am putea gsi o soluie B
t
pentru S
t
cu mai multe
activiti dect A
t
, adugarea activitii 1 la B
t
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 ecare 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 ecare 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 m
i
, iterativ pentru i = 1, 2, . . . , n, unde m
i
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-2 S presupunem c avem o mulime de activiti de planicat pentru un numr mare de
sli de lectur. Se dorete planicarea tuturor activitilor folosindu-se ct mai puine sli de
lectur posibil. Elaborai un algoritm greedy ecient pentru a determina ce activitate trebuie s
utilizeze o sal de lectur i care anume.
(Aceast problem este cunoscut de asemenea sub numele de problema colorrii gra-
furilor interval . Putem crea un graf interval ale crui vrfuri sunt activitile date i ale
crui muchii conecteaz activitile incompatibile. Determinarea celui mai mic numr de culori
necesare pentru a colora ecare vrf, astfel nct dou vrfuri adiacente s nu aib aceeai cu-
loare, este echivalent cu determinarea numrului minim de sli de lectur necesare planicrii
tuturor activitilor date.)
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
17.2. Elemente ale strategiei greedy
Un algoritm greedy determin o soluie optim a unei probleme n urma unei succesiuni de
alegeri. La ecare moment de decizie din algoritm este aleas opiunea care pare a cea mai
potrivit. Aceast strategie euristic nu produce ntotdeauna soluia optim, dar exist i cazuri
cnd aceasta este obinut, ca n cazul problemei selectrii activitilor. n acest paragraf vom
prezenta cteva proprieti generale ale metodei greedy.
Cum se poate decide dac un algoritm greedy poate rezolva o problem particular de opti-
mizare? n general nu exist o modalitate de a stabili acest lucru, dar exist dou caracteristici
pe care le au majoritatea problemelor care se rezolv prin tehnici greedy: proprietatea de alegere
greedy i substructura optim.
Proprietatea de alegere greedy
Prima caracteristic a unei probleme este aceea de a avea proprietatea alegerii greedy,
adic se poate ajunge la o soluie optim global, realiznd alegeri (greedy) optime local. Aici
intervine diferena dintre algoritmii greedy i programarea dinamic. La rezolvarea unei metode
prin metoda programrii dinamice la ecare pas al algoritmului se face cte o alegere dar ea
depinde de soluiile subproblemelor. ntr-un algoritm greedy se realizeaz orice alegere care pare
a cea mai bun la momentul respectiv, iar subproblema rezultat este rezolvat dup ce alegerea
este fcut. Alegerea realizat de un algoritm greedy poate depinde de alegerile fcute pn n
momentul respectiv, dar nu poate depinde de alegerile ulterioare sau de soluiile subproblemelor.
Astfel, spre deosebire de programarea dinamic prin care se rezolv subproblemele n manier
bottom-up, o strategie greedy de obicei progreseaz n manier top-down, realiznd alegeri
greedy succesive i reducnd iterativ dimensiunea problemei respective.
Desigur, trebuie s demonstrm c o alegere greedy la ecare pas conduce la o soluie optim
global, i aceasta este o problem mai delicat. De obicei, ca n cazul teoremei 17.1, demonstraia
examineaz o soluie optim global. Apoi se arat c soluia poate modicat astfel nct la
ecare pas este realizat o alegere greedy, iar aceast alegere reduce problema la una similar
dar de dimensiuni mai reduse. Se aplic apoi principiul induciei matematice pentru a arta c o
alegere greedy poate utilizat la ecare pas. Faptul c o alegere greedy conduce la o problem
de dimensiuni mai mici reduce demonstaia corectitudinii la demonstrarea faptului c o soluie
optim trebuie s evidenieze o substructur optim.
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 A
t
= A 1 este o soluie
optim pentru problema selectrii activitilor S
t
= i S : s
i
f
1
.
288 Capitolul 17 Algoritmi greedy
Comparaie ntre metoda Geedy i metoda programrii dinamice
Deoarece proprietatea de substructur optim este exploatat att de metoda greedy ct i de
cea a programrii dinamice, poate exista tentaia de a genera o soluie prin metoda programrii
dinamice, cu toate c un algoritm greedy ar sucient, sau invers, se poate crede c un algoritm
greedy poate produce o soluie optim n timp ce corect ar trebui aplicat metoda programrii
dinamice. Pentru a ilustra diferenele dintre cele dou metode vom analiza n continuare dou
variante ale unei probleme clasice de optimizare.
Problema 01 a rucsacului se formuleaz dup cum urmeaz. Un ho care jefuiete un
magazin gsete n obiecte; obiectul i are valoarea v
i
i greutatea w
i
, unde v
i
i w
i
sunt numere
ntregi. El dorete s ia o ncrctur ct mai valoroas posibil, dar nu poate cra n sac o
greutate total mai mare dect W, unde W este i el un numr ntreg. Ce obiecte trebuie s ia?
(Aceast problem poart numele de problema 0-1 a rucsacului pentru c un obiect e este luat
n ntregime e deloc; houl nu poate lua o parte din obiect sau un acelai obiect de mai multe
ori).
n problema fracionar a rucsacului hoului i este permis s ia i pri din obiecte.
Un obiect din problema 0-1 a rucsacului poate gndit ca un lingou de aur, iar un obiect din
problema fracionar a rucsacului poate imaginat ca o anumit cantitate de praf de aur.
La ambele probleme se evideniaz proprietatea de substructur optim. Pentru problema
01, considerm ncrctura cea mai valoroas cea avnd greutatea cel mult W. Dac din
ncrctur se scoate obiectul j, ceea ce rmne trebuie s e o ncrctur avnd greutatea
cel mult W w
j
pe care houl o poate lua dintre cele n 1 obiecte iniiale, mai puin j.
Pentru problema fracionar vom considera c dac ndeprtm un obiect j de greutate w din
ncrctura optim, ceea ce rmne trebuie s e cea mai valoroas ncrctur avnd greutatea
cel mult W w pe care houl o poate lua dintre cele n1 obiecte iniiale, plus greutatea w
j
w
din obiectul j.
Cu toate c problemele sunt similare, problema fracionar a rucsacului poate rezolvat
printr-un algoritm de tip greedy, n timp ce pentru pentru problema 01 nu este corect o astfel de
rezolvare. Pentru a rezolva problema fracionar calculm mai nti valoarea v
i
/w
i
(valoare per
greutate) pentru ecare obiect. Respectnd o strategie greedy, houl ncepe prin a lua ct poate
de mult din obiectul avnd valoarea per greutate maxim. n cazul n care obiectul respectiv a
fost epuizat iar houl mai poate cra, el va lua ct de mult posibil din obiectul cu urmtoarea
valoare per greutate, n ordine descresctoare i aa mai departe, pn nu mai poate ncrca n
rucsac. Astfel, prin ordonarea valorilor per greutate, algoritmul greedy se execut n O(nlg n)
uniti de timp. Lsm ca exerciiu demonstrarea faptului c problema fracionar a rucsacului
are proprietatea alegerii greedy.
Pentru a arta c pentru problema 01 a rucsacului nu se poate folosi o strategie greedy, vom
considera instana problemei ilustat n gura 17.2(a). n aceast gur exist trei obiecte, iar
rucsacul are capacitatea 50 de uniti. Primul obiect cntrete 10 i valoreaz 60. Obiectul al
doilea are greutatea 20 i valoarea 100, iar al treilea cntrete 30 i are o valoarea 120. Astfel,
valoarea/greutate a primului obiect este 6 care este mai mare dect valoarea/greutate a celui
de-al doilea obiect (2) sau a celui de-al treilea obiect (4). Conform strategiei greedy, la nceput
va selectat obiectul 1. Cu toate acestea, dup cum se poate vedea din analiza din gura 17.2(b)
soluia optim alege obiectele 2 i 3 i las obiectul 1 deoparte. Nici una din cele dou soluii
posibile care conin obiectul 1 nu sunt optime.
Pentru problema fracionar similar, strategia greedy consider mai nti obiectul 1 i
17.2. Elemente ale strategiei greedy 289
Figura 17.2 Strategia greedy nu funcioneaz pentru problema 01 a rucsacului. (a) Houl trebuie
s selecteze o submulime a celor trei obiecte din gur 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.
conduce la o soluie optim aa cum se vede n gura 17.2(c).
Considerarea obiectului 1 nu este valabil n problema rucsacului 01 deoarece houl nu
poate s umple rucsacul pn la capacitatea lui maxim, iar spaiul liber micoreaz ctul
valoare/greutate a ncrcturii sale. n problema 01, atunci cnd lum n considerare un obiect
pentru a-l pune n rucsac, trebuie s comparm soluia subproblemei n care obiectul este inclus
cu soluia subproblemei n care obiectul lipsete. Comparaia trebuie realizat nainte de a face
alegerea. Problema formulat n acest mod produce o serie de subprobleme care se suprapun o
caracteristic a programrii dinamice, care poate ntr-adevr folosit (vezi exerciiul 17.2-2).
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 e 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-3 S presupunem c n problema 01 a rucsacului, ordinea obiectelor dup sortarea
cresctoare dup greutate este aceeai ca i dup sortarea descresctoare dup valoare. Elaborai
un algoritm ecient pentru a determina o soluie optim a acestei variante a problemei rucsacului
i argumentai corectitudinea algoritmului.
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 ecient 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 codicat; lungime x 000 001 010 011 100 101
Cuvnt codicat; lungime variabil 0 101 100 111 1101 1100
Figura 17.3 O problem de codicare a caracterelor. Un ier de 100.000 de caractere conine doar
caracterele a-f, cu frecvenele indicate. Dac ecrui caracter i este asociat un cuvnt de cod pe 3 bii,
ierul codicat va avea 300.000 de bii. Folosind codicarea cu lungime variabil, ierul codicat va
ocupa doar 224.000 de bii.
17.2-5 Fie dat o mulime x
1
, x
2
, . . . , x
n
de puncte de pe dreapta real. Descriei un algoritm
ecient 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.
17.3. Coduri Human
Codurile Human reprezint o tehnic foarte utilizat i ecient pentru compactarea datelor;
n funcie de caracteristicile ierului care trebuie comprimat, spaiul economisit este ntre 20%
i 90%. Algoritmul greedy pentru realizarea acestei codicri utilizeaz un tabel cu frecvenele
de apariie ale ecrui caracter. Ideea este de a utiliza o modalitate optim pentru reprezentarea
ecrui caracter sub forma unui ir binar.
S presupunem c avem un ier ce conine 100.000 de caractere, pe care dorim s l memorm
ntr-o form compactat. Frecvenele de apariie ale caracterelor n text sunt date de gura 17.3:
exist doar ase caractere diferite i ecare dintre ele apare de 45.000 de ori.
Exist mai multe modaliti de reprezentare a unui astfel de ier. Vom considera problema
proiectrii unui cod binar al caracterelor (pe scurt cod) astfel nct ecare caracter este
reprezentat printr-un ir binar unic. Dac utilizm un cod de lungime x, avem nevoie de
3 bii pentru a reprezenta ase caractere: a=000, b=001, . . . , f=101. Aceast metod necesit
300.000 de bii pentru a codica tot ierul. Se pune problema dac se poate face o compactare
i mai bun.
O codicare cu lungime variabil poate mbunti semnicativ performanele, atribuind
caracterelor cu frecvene mai mari cuvinte de cod mai scurte iar celor cu frecvene mai reduse
cuvinte de cod mai lungi. Figura 17.3 prezint o astfel de codicare; irul 0 avnd lungimea de
1 bit reprezint caracterul a n timp ce irul 1100 de lungime 4 reprezint caracterul f. Aceast
codicare necesit (45 1 + 13 3 + 12 3 + 16 3 + 9 4 + 5 4) 1.000 = 224.000 bii pentru a
reprezenta un ier i economisete aproximativ 25% din spaiu. Vom vedea c aceasta este de
fapt o codicare-caracter optim pentru acest ier.
17.3. Coduri Human 291
Figura 17.4 Arborii corespunztori schemelor de codicare din gura 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 codicrii de lungime
x a=000, . . ., f=101 (b) Arborele asociat codicrii prex optime a=0, b=101,. . ., f=1100.
Coduri prex
Vom considera n continuare doar codicrile n care nici un cuvnt de cod nu este prexul
altui cuvnt. Astfel de codicri se numesc codicri prex
1
. Se poate arta (cu toate c nu
vom proceda astfel n cazul de fa) c o compresie optim a datelor, realizat prin codicarea
caracterelor, poate realizat i prin codicarea prex, deci considerarea codicrii prex nu
scade din generalitate.
Codicarea prex este util deoarece simplic att codicarea (deci compactarea) ct i
decodicarea. Codicarea este ntotdauna simpl pentru orice codicare binar a caracterelor;
se concatenenaz cuvintele de cod reprezentnd ecare caracter al ierului. De exemplu, prin
codicarea prex avnd lungime variabil din gura 17.3, putem codica un ier de 3 caractere
abc astfel: 0101100=0101100, unde semnul reprezint operaia de concatenare.
Decodicarea este de asemenea relativ simpl pentru codurile prex. Cum nici un cuvnt de
cod nu este prexul altuia, nceputul oricrui ier codicat nu este ambiguu. Putem deci s
identicm cuvntul iniial de cod, s l traducem n caracterul original, s-l ndeprtm din
ierul codicat i s repetm procesul pentru ierul codicat rmas. n exemplul nostru, irul
001011101 se translateaz automat n 001011101, secven care se decodic n aabe.
Procesul de decodicare necesit o reprezentare convenabil a codicrii prex astfel nct
cuvntul iniial de cod s poat uor identicat. O astfel de reprezentare poate dat de un
arbore binar ale crui frunze sunt caracterele date. Interpretm un cuvnt de cod binar pentru
un caracter ca ind drumul de la rdcin pn la caracterul respectiv, unde 0 reprezint mergi
la ul stng iar 1 mergi la ul drept. n gura 17.4 sunt prezentai arborii pentru cele dou
codicri ale exemplului nostru. Observai c acetia nu sunt arbori binari de cutare, deoarece
frunzele nu trebuie s e ordonate, iar nodurile interne nu conin chei pentru caractere.
O codicare optim pentru un ier este ntotdeuna reprezentat printr-un arbore binar
, n care ecare vrf care nu este frunz are doi i (vezi exerciiul 17.3-1).
Codicarea cu lungime x din exemplul de mai sus nu este optim deoarece arborele asociat,
Codicare independent de prex este probabil o denumire mai potrivit, dar termenul de codicare prex
este cel cunoscut n literatura de specialitate.
292 Capitolul 17 Algoritmi greedy
prezentat n gura 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 codicare prex optim are exact [C[ frunze, una pentru
ecare liter din alfabet, i exact [C[ 1 noduri interne.
Dndu-se un arbore T, corespunztor unei codicri prex, este foarte simplu s calculm
numrul de bii necesari pentru a codica un ier. Pentru ecare caracter c din alfabet, e
f(c) frecvena lui c n ier i s notm cu d
T
(c) adncimea frunzei n arbore (adic nivelul pe
care se a). S observm c d
T
(c) reprezint de asemenea cuvntul de cod pentru caracterul c.
Numrul de bii necesari pentru a codica un ier este
B(T) =

cC
f(c)d
T
(c), (17.3)
Vom numi acest numr costul arborelui T.
Construcia unui cod Human
Human a inventat un algoritm greedy care construiete o codicare prex optim numit
codul Human. Algoritmul construiete arborele corespunztor codicrii optime, ntr-o
manier bottom-up. Se ncepe cu o mulime de [ C [ frunze i se realizeaz o secven de
[ C [ 1 operaii de fuzionri pentru a crea arborele nal.
n algoritmul n pseudocod care urmeaz, vom presupune c C este o mulime de n caractere i
ecare caracter c C este un obiect avnd o frecven dat f[c]. Va folosit o coad de prioriti
pentru a identica cele dou obiecte cu frecvena cea mai redus care vor fuziona. Rezultatul
fuzionrii celor dou obiecte este un nou obiect a crui frecven este suma frecvenelor celor
dou obiecte care au fuzionat.
Huffman(C)
1: n [C[
2: Q C
3: pentru i 1, n 1 execut
4: z Aloc-Nod()
5: x [z] Extrage-Min(Q)
6: y [z] Extrage-Min(Q)
7: f[z] f[x] +f[y]
8: Insereaz(Q, z)
9: returneaz Extrage-Min(Q)
Pentru exemplul nostru, algoritmul lui Human lucreaz ca n gura 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 nal reprezint codicarea prex optim. Codicarea 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 ind suma frecvenelor lui x i y. Nodul z are pe x ca u stng i pe y ca u drept.
(Aceast ordine este arbitrar; interschimbarea ilor stng i drept ai oricrui nod conduce la
17.3. Coduri Human 293
o codicare diferit, dar de acelai cost.) Dup n 1 fuzionri, unicul nod rmas n coad
rdcina arborelui de codicare este returnat n linia 9.
Analiza timpului de execuie pentru algoritmul lui Human 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 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
ecare operaie asupra stivei necesit un timp O(nlg n), ciclul contribuie cu O(nlg n) la timpul
de execuie. Deci timpul total de execuie a procedurii Huffman pe o mulime de n caractere
este O(nlg n).
Corectitudinea algoritmului lui Human
Pentru a demonstra c algoritmul de tip greedy al lui Human este corect, vom arta c
problema determinrii unei codicri prex optime implic alegeri greedy i are o substructur
optim. Urmtoarea lem se refer la proprietatea alegerii greedy.
Lema 17.2 Fie C un alfabet n care ecare caracter c C are frecvena f[c]. Fie x i y dou
caractere din C avnd cele mai mici frecvene. Atunci exist o codicare prex optim pentru
C n care cuvintele de cod pentru x i y au aceeai lungime i difer doar pe ultimul bit.
Demonstraie. Ideea demonstraiei este de a lua arborele T reprezentnd o codicare prex
optim i a-l modica pentru a realiza un arbore reprezentnd o alt codicare prex optim. n
noul arbore, caracterele x i y vor apare ca frunze cu acelai tat i se vor aa pe nivelul maxim
n arbore. Dac putem realiza acest lucru, atunci cuvintele lor de cod vor avea aceeai lungime
i vor diferi doar pe ultimul bit.
Fie b i c dou caractere reprezentnd noduri terminale (frunze) frai situate pe nivelul maxim
al arborelui T. Fr a restrnge generalitatea, vom presupune c f[b] f[c] i f[x] f[y]. Cum
f[x] i f[y] sunt frunzele cu frecvenele cele mai sczute, n aceast ordine, iar f[b] i f[c] sunt
deci frecvene arbitrare, n ordine, avem f[x] f[b] i f[y] f[c]. Dup cum se vede n gura
17.6, vom schimba n T poziiile lui b i x pentru a produce arborele T
t
, iar apoi vom schimba n
T
t
poziiile lui c i y pentru a obine arborele T
tt
. Conform ecuaiei (17.3), diferena costurilor
lui T i T
t
este
B(T) B(T
t
) =

cC
f(c)d
T
(c)

cC
f(c)d
T
(c)
= f[x]d
T
(x) +f[b]d
T
(b) f[x]d
T
(x) f[b]d
T
(b)
= f[x]d
T
(x) +f[b]d
T
(b) f[x]d
T
(b) f[b]d
T
(x)
= (f[b] f[x])(d
T
(b) d
T
(x)) 0,
deoarece att f[b] f[x] i d
T
[b] d
T
[x] sunt nenegative. Mai precis, f[b] f[x] este nenegativ
deoarce x este frunza avnd frecvena minim iar d
T
[b] d
T
[x] este nenegativ pentru c b este
o frunz aat pe nivelul maxim n T. n mod analog, deoarece interschimbarea lui y cu c nu
mrete costul, diferena B(T) B(T
tt
) este nenegativ. Astfel B(T) B(T
tt
), ceea ce implic
B(T
tt
) = B(T). Aadar T
tt
este un arbore optim n care x i y apar ca noduri terminale frai, i
se a pe nivelul maxim, ceea ce trebuia demonstrat.
Din lema 17.2 se deduce faptul ca procesul de construcie a unui arbore optim prin fuzionri
poate, fr a restrnge generalitatea, s nceap cu o alegere greedy a fuzionrii acelor dou
294 Capitolul 17 Algoritmi greedy
Figura 17.5 Paii algoritmului Human pentru frecvenele date n gura 17.3. Fiecare parte ilustreaz
coninutul cozii ordonate cresctor dup frecven. La ecare pas, cei doi arbori cu cele mai sczute
frecvene fuzioneaz. Frunzele gurez ca dreptunghiuri ce conin un caracter i frecvena sa. Nodurile
interne gureaz ca cercuri ce conin suma frecvenelor ilor lor. O muchie care leag un nod intern
cu ii ei este etichetat cu 0 dac este o muchie ctre un u stng, respectiv cu 1 dac este ctre ul
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 ecare liter.
(b)(e) Etape intermediare. (f ) Arborele nal.
caractere cu cea mai redus frecven. De ce este aceasta o alegere greedy? Putem interpreta
costul unei singure fuzionri ca ind 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 ecare pas, dintre toate fuzionrile posibile, algoritmul Huffman o alege
pe aceea care determin costul minim.
Urmtoarea lem arat c problema construirii unei codicri prex optime are proprietatea
substructurii optime.
Lema 17.3 Fie T un arbore binar complet reprezentnd o codicare prex optim peste un
alfabet C, unde frecvena f[c] este denit pentru ecare caracter c C. Considerm dou
caractere x i y oarecare care apar ca noduri terminale frai n T, i e z tatl lor. Atunci,
considernd z ca un caracter avnd frecvena f[z] = f[x] + f[y], arborele T
t
= T x, y
reprezint o codicare prex optim pentru alfabetul C
t
= C x, y z.
17.3. Coduri Human 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 aate pe cel mai de jos nivel n arbore; aceste noduri se consider frai. x i y
sunt dou frunze pe care algoritmul Human le fuzioneaz primele; ele apar n poziii arbitrare n T.
Frunzele b i x sunt interschimbate pentru a obine arborele T

. Apoi, frunzele c i y sunt interschimbate


pentru a obine arborele T

. Cum cele dou interschimbri nu mresc costul, arborele rezultat T

este
de asemenea un arbore optim.
Demonstraie. Vom arta mai nti c B(T), costul arborelui T, poate exprimat n funcie de
costul B(T
t
) al arborelui T
t
considernd costurile componente din ecuaia (17.3). Pentru ecare
c C x, y, avem d
T
(c) = d
T
(c), i f[c]d
t
(c) = f[c]d
T
(c). Cum d
T
(x) = d
T
(y) = d
T
(z) +1,
avem
f[x]d
T
(x) +f[y]d
T
(y) = (f[x] +f[y])(d
T
(z) + 1) = f[z]d
T
(z) + (f[x] +f[y]),
de unde deducem c
B(T) = B(T
t
) +f[x] +f[y].
Dac T
t
reprezint o codicare prex care nu este optim pentru alfabetul C
t
, atunci exist
un arbore T
tt
ale crui frunze sunt caractere n C
t
astfel nct B(T
tt
) < B(T
t
). Cum z este tratat
ca un caracter n C
t
, el va apare ca frunz n T
tt
. Dac adugm x i y ca ind ii lui z n T
tt
,
atunci vom obine o codicare prex pentru C avnd costul B(T
tt
) +f[x] +f[y] < B(T), ceea ce
intr n contradicie cu optimalitatea lui T. Deci T
t
trebuie s e optim pentru alfabetul C
t
.
Teorema 17.4 Procedura Huffman realizeaz o codicare prex optim.
Demonstraie. Este imediat, din lemele 17.2 i 17.3.
Execiii
17.3-1 Demonstrai c un arbore binar care nu este complet nu poate corespunde unei codicri
prex optime.
17.3-2 Stabilii o codicare Human 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 codicarea optim cnd frecvenele sunt
primele n numere din irul lui Fibonacci?
296 Capitolul 17 Algoritmi greedy
17.3-3 Demonstrai c, pentru o codicare, costul arborelui asociat poate calculat, de
asemenea, ca sum peste toate nodurile interne, ale frecvenelor combinate ale celor doi i ai
nodului respectiv.
17.3-4 Artai c pentru o codicare optim, dac sortm caracterele n ordinea necresctoare
a frecvenelor lor, lungimile cuvintelor de cod asociate sunt n ordine nedescresctoare.
17.3-5 Fie C = 0, 1, . . . , n 1 o mulime de caractere. Artai c orice codicare prex
optimal pe C poate reprezentat sub forma unei secvene de 2n1 +nlg n| bii. (
Pentru a specica structura arborelui, utilizai 2n 1 bii, conform parcurgerii acestuia.)
17.3-6 Generalizai algoritmul lui Human pentru cuvinte de cod ternare (adic acele cuvinte
de cod care folosesc simbolurile 0, 1 i 2) i artai c aceasta conduce la codicri ternare
optime.
17.3-7 Fie dat un ier 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, codicarea Human nu este mai ecient
dect utilizarea unui cod obinuit avnd lungimea x de 8 bii.
17.3-8 Artai c de la nici o modalitate de comprimare nu se poate atepta s compacteze
un ier care conine caractere alese aleator, reprezentate pe 8 bii, prin schimbarea unui singur
caracter. ( Comparai numrul de iere cu numrul posibil de iere codicate).
17.4. Bazele teoretice ale metodei greedy
n aceast seciune vom prezenta teoria care st la baza algoritmilor greedy. Aceast teorie
poate utilizat pentru a determina cazurile n care algoritmul greedy va conduce la soluie
optim. Ea necesit cunoaterea unor structuri combinatoriale numite matroizi. Cu toate c
aceast teorie nu acoper toate cazurile pentru care se poate aplica o metod greedy (de exemplu
nu acoper problema selectrii activitilor din seciunea 17.1 sau problema codicrii Human
din seciunea 17.3), ea cuprinde multe cazuri de interes practic. Mai mult, aceast teorie s-a
dezvoltat ntr-un timp scurt i a fost extins pentru a acoperi ct mai multe aplicaii (a se vedea
i notele de la sfritul capitolului).
17.4.1. Matroizi
Un matroid este o pereche ordonat M = (S, 1) care satisface urmtoarele condiii:
1. S este o mulime nit nevid.
2. 1 este o familie nevid de submuimi ale lui S, numite submulimi independente ale lui
S, astfel nct dac B 1 i A B, atunci A 1. Spunem c 1 este ereditar dac
satisface aceast proprietate. S observm c mulimea vid este automat un element al
lui 1.
17.4. Bazele teoretice ale metodei greedy 297
3. Dac A 1, B 1 i [A[ < [B[ atunci exist un element x Ba astfel nct Ax 1.
Spunem c M satisface proprietatea de schimb.
Cuvntul matroid a fost introdus de Hassel Whitney. El a studiat matroizii matriceali ,
n care elementele lui S sunt liniile dintr-o matrice dat i o mulime de linii este independent
dac liniile din mulime sunt liniar independente n sensul uzual. Este uor de artat c aceast
structur denete un matroid (vezi exerciiul 17.4-2).
Un alt exemplu de matroid este urmtorul: considerm matroidul grac M
G
= (S
G
, 1
G
)
denit n termenii unui graf neorientat G = (V, E) dup cum urmeaz:
Mulimea S
G
este mulimea E a muchiilor grafului G.
Dac A este o submulime a lui E atunci A 1
G
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 grac 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 M
G
= (S
G
, 1
G
) este un matroid.
Demonstraie. Evident S
G
= E este mulime nit. Mai mult, 1
G
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 M
G
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 ecare 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
aate 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 e n arbori diferii din pdurea A. Cum muchia (u, v)
leag vrfuri n doi arbori diferii din pdurea A, ea poate adugat pdurii A fr a forma
un ciclu. Atunci, M
G
satisface proprietatea de schimb, ceea ce ncheie demonstraia faptului c
M
G
este un matroid.
Dndu-se un matroid M = (S, 1), un element x / A se numete extensie a lui A 1 dac
x poate adugat la A cu pstrarea n acelai timp a independenei; aceasta nseamn c x este
o extensie a lui A dac Ax 1. Drept exemplu, s considerm un matroid grac M
G
. 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
Demonstraie. Presupunem, prin reducere la absurd, c A este o submulime independent
maximal a lui M i exist o alt submulime B a lui M cu aceleai proprieti. Atunci, din
proprietatea de schimb, rezult c A este extensibil la o mulime mai mare A x pentru un
x B A, ceea ce contrazice presupunerea c A este maximal.
Pentru a ilustra aceast teorem, s construim matroidul grac M
G
pentru un graf conex
neorientat G. Fiecare submulime independent maximal a lui M
G
poate un arbore liber cu
exact [V [ 1 muchii ce leag toate vrfurile din G. Un astfel de arbore se numete arbore de
acoperire al lui G.
Spunem c un matroid M = (S, 1) este ponderat dac are asociat o funcie de ponderare w
care atribuie o pondere pozitiv w(x) ecrui element x S. Funcia de ponderare w se extinde
la submulimile din S prin nsumare:
w(A) =

xA
w(x)
pentru orice A S. De exemplu, dac w(e) desemneaz lungimea unei muchii e ntr-un matroid
grac M
G
, atunci w(A) este lungimea total a muchiilor din A.
17.4.2. Algoritmi greedy pe un matroid ponderat
Numeroase probleme pentru care un algoritm greedy furnizeaz soluii optime pot formulate
astfel nct s conduc la determinarea unei submuimi independente de pondere maxim ntr-
un matroid ponderat. Cu alte cuvinte, se d un matroid ponderat M = (S, 1) i se dorete
determinarea unei mulimi independente A 1 astfel nct w(A) s e maximizat. Vom spune
c o astfel de submulime, independent i de pondere maxim posibil este submulimea optim
a matroidului. Deoarece ponderea w(x) a oricrui element x n S este pozitiv, o submulime
optim este ntotdeauna o submulime maximal independent. Este util ca A s e ct mai
mare cu putin.
De exemplu, n cazul arborelui de acoperire minim se consider un graf neorientat, conex,
G = (V, E) i o funcie lungime w astfel nct w(e) este lungimea (pozitiv) a muchiei e. (Vom
folosi termenul de lungime pentru ponderi n matroidul asociat). Se cere determinarea unei
submulimi de muchii care unete toate vrfurile i are lungime total minim. Pentru a privi
aceasta ca o problem de determinare a submulimii optime a unui matroid, s considerm
matroidul M
G
cu funcia de ponderare w
t
, unde w
t
(e) = w
0
w(e) i w
0
este mai mare dect
lungimea maxim a oricrei muchii. n acest matroid ponderat, toate ponderile sunt pozitive
i o submulime optim este un arbore de acoperire avnd lungimea minim n graful original.
Mai precis, ecare submulime independent maximal A corespunde unui arbore de acoperire
i deoarece
w
t
(A) = ([V [ 1)w
0
w(A)
pentru orice submulime independent maximal A, submulimea independent ce maximizeaz
w
t
(A) trebuie s minimizeze w(A). n consecin, orice algoritm care poate gsi o submulime
optim A ntr-un matroid arbitrar poate rezolva problema arborelui de acoperire minim.
n capitolul 24 sunt prezentai algoritmi pentru problema arborelui de acoperire minim, dar
n acest paragraf vom descrie un algoritm greedy ce funcioneaz pentru orice matroid ponderat.
Algoritmul folosete ca date de intrare matroidul ponderat M = (S, 1) cu o funcie asociat w
17.4. Bazele teoretice ale metodei greedy 299
de pondere pozitiv w i ntoarce o submulime optim A. n algoritmul descris n pseudocod,
vom nota componentele lui M cu S[M] i 1[M], iar funcia de ponderare cu w. Algoritmul este
de tip greedy deoarece ia n considerare pe rnd ecare element x S n ordinea necresctoare
a ponderilor i l adaug imediat la mulimea A deja obinut dac A x este independent.
Greedy(M, w)
1: A
2: ordoneaz S[M] necresctor dup ponderile w
3: pentru ecare x S[M], n ordine necresctoare dup ponderea w(x) execut
4: dac A x 1(M) atunci
5: A A x
6: returneaz A
Elementele lui S sunt considerate pe rnd, n ordinea necresctoare a ponderilor. Elementul
considerat x poate adugat la A dac menine independena lui A. n caz contrar x este
abandonat. Deoarece mulimea vid este independent conform deniiei unui matroid, i cum
x este adugat la A doar dac A x este independent, prin inducie, submulimea A
este ntotdeauna independent. Deci algoritmul Greedy returneaz ntotdeauna o submulime
independent A. Vom vedea n continuare c A este o submulime de pondere maxim posibil,
deci c A este o submulime optim.
Timpul de execuie al algoritmului Greedy este uor de calculat. Fie n = [S[. Etapa de
sortare se realizeaz n O(nlg n).
Linia 4 este executat exact de n ori, o dat pentru ecare element din S. Fiecare execuie
a liniei 4 necesit vericarea independenei mulimii A x. Cum ecare astfel de vericare se
realizeaz n O(f(n)), ntregul algoritm necesit O(nlg n +nf(n)) uniti de timp.
Vom arta n cele ce urmeaz c algoritmul Greedy returneaz o submulime optim.
Lema 17.7 (Matroizii evideniaz proprietatea alegerii greedy) S presupunem c M
=(S, 1) este un matroid ponderat cu o funcie de ponderare w i c S este ordonat necresctor
dup ponderi. Fie x primul element din S astfel nct x este independent, dac un astfel de
x exist. Dac x exist, atunci exist o submulime optim A a lui S care l conine pe x.
Demonstraie. Dac un astfel de x nu exist atunci singura submulime independent este
submulimea vid i demonstraia se ncheie. Altfel, e B o submulime nevid, optim oarecare.
Presupunem c x / B; altfel lum A = B i demonstraia se ncheie.
Nici un element din B nu are ponderea mai mare dect w(x). S observm c y B implic
y este independent deoarece B 1 i 1 este ereditar. Alegerea fcut asupra lui x asigur
w(x) w(y) pentru orice y B.
Mulimea A se construiete dup cum urmeaz. Se pleac cu A = x. Din alegerea lui x, A
este independent. Folosind proprietatea de schimb n mod repetat, se gsete un nou element
al lui B care poate adugat la A pn cnd [ A [=[ B [, astfel nct independena lui A este
mereu pstrat. Atunci, A = B y x pentru y B i deci
w(A) = w(B) w(y) +w(x) w(B)
Deoarece B este optim, A trebuie s e de asemenea optim i cum x A lema este demons-
trat.
300 Capitolul 17 Algoritmi greedy
Lema 17.8 Fie M = (S, 1) 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. Demonstraia se face prin reducere la absurd. Presupunem c x este o extensie a
lui A dar nu a mulimii vide . Cum x este o extensie a lui A rezult c Ax este independent.
Deoarece 1 este ereditar, x trebuie s e independent, ceea ce contrazice presupunerea c x
nu este o extensie a lui .
Lema 17.8 arat c orice element care nu poate folosit la un anumit moment nu mai poate
folosit niciodat ulterior. De aici se deduce c algoritmul Greedy nu poate grei, trecnd
peste elementele iniiale din S care nu sunt extensii ale lui , deoarece ele nu mai pot niciodat
folosite.
Lema 17.9 (Matroizii pun n eviden proprietatea de substructur optimal) Fie x
primul element ales de algoritmul Greedy din S pentru matroidul ponderat M = (S, 1).
Problema rmas, de determinare a unei submulimi independendente de pondere maxim care l
conine pe x, se reduce la gsirea unei submulimi independente de pondere maxim a matroidului
ponderat M
t
= (S
t
, 1
t
), unde
S
t
= y S : x, y 1, 1
t
= B S x : B x 1,
i funcia de ponderare pentru M
t
este funcia de ponderare pentru M restricionat la S
t
.
(Numim M
t
contracia lui M prin elementul x.)
Demonstraie. Dac A este o submulime oarecare independent de pondere maxim a lui M,
care conine elementul x, atunci A
t
= Ax este o submulime independent a lui M
t
. Invers,
orice submulime independent A
t
a lui M
t
conduce la o submulime independent A = A
t
x
a lui M. Cum n ambele cazuri avem w(A) = w(A
t
) +w(x), o soluie de pondere maxim n M,
care l conine pe x, conduce la o soluie de pondere maxim n M
t
i invers.
Teorema 17.10 (Corectitudinea algoritmului greedy pe matroizi) Dac M = (S, 1) es-
te un matroid ponderat cu funcia de ponderare w, atunci apelul Greedy(M, w) returneaz o
submulime optim.
Demonstraie. Conform lemei 17.8 orice elemente care nu sunt considerate iniial, deoarece nu
sunt extensii ale mulimii vide , pot uitate denitiv, 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 nal
lema 17.9 implic faptul c problema rmas este una de determinare a unei submulimi optime
n matroidul M
t
care este contracia lui M prin x. Dup ce procedura Greedy atribuie lui A
mulimea x toi ceilali pai pot interpretai ca acionnd n matroidul M
t
= (S
t
, 1
t
) deoarece
B este independent n M
t
dac i numai dac B x este independent n M, pentru orice
mulime B 1
t
. n consecin, operaiile din algoritmul Greedy vor determina o submulime
independent de pondere maxim pentru M
t
i toate operaiile din algoritmul Greedy vor gsi
o submulime independent de pondere maxim pentru M.
17.5. O problem de planicare a activitilor 301
Exerciii
17.4-1 Artai c (S, 1
k
) este un matroid, unde S este o mulime nit, iar 1
k
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, 1) este un matroid, unde
S este mulimea coloanelor lui T i A 1, dac i numai dac n A coloanele sunt liniar
independente.
17.4-3 Artai c dac (S, 1) este un matroid, atunci i (S, 1
t
) este un matroid, unde 1
t
=
A
t
: S S
t
conine mulimi maximale A 1. Aceasta nseamn c mulimile independente
maximale ale lui (S
t
, 1
t
) sunt exact complementarele mulimilor independente maximale ale lui
(S, 1).
17.4-4 Fie S o mulime nit i e S
1
, S
2
, . . . , S
k
o partiie a lui S n submulimi nevide
disjuncte. Denim structura (S, 1) prin condiia ca 1 = A :[ AS
i
[ 1 pentru i = 1, 2, . . . , k.
Artai c (S, 1) este un matroid. Aceasta nseamn c matricea tuturor mulimilor A, care
conine cel mult un element n ecare bloc al partiiei, determin o mulime independent de
matroizi.
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.
17.5. O problem de planicare a activitilor
O problem interesant ce poate rezolvat folosind matroizi este problema planicrii
optime pe un singur procesor a unor activiti care se execut ntr-o unitate de timp. Fiecare
activitate are un termen de nalizare i o penalizare care trebuie pltit dac se depete
termenul. Problema pare complicat dar poate rezolvat ntr-o manier surprinztor de simpl,
folosind un algoritm greedy.
O activitate ntr-o unitate de timp este o sarcin, de exemplu un program care se
execut pe un calculator, care necesit exact o unitate de timp pentru a ndeplinit. Dndu-se
o submulime nit S a unor astfel de activiti, o planicare pentru S este o permutare a
lui S ce specic ordinea n care aceste sarcini trebuie realizate. Prima activitate din planicare
ncepe la momentul 0 i se termin la momentul 1, cea de-a doua ncepe la momentul 1 i se
termin la momentul 2 .a.m.d.
Problema planicrii pe un singur procesor a activitilor ntr-o unitate de timp
cu termen de nalizare i penalizri are urmtoarele date de intrare:
o mulime S = 1, 2, . . . , n de n activiti care se execut ntr-o unitate de timp;
o mulime de n ntregi reprezentnd termenele de nalizare d
1
, d
2
, . . . , d
n
astfel nct
1 d
i
n i se presupune c activitatea i se termin la momentul d
i
;
302 Capitolul 17 Algoritmi greedy
o mulime de n ponderi nenegative de penalizri w
1
, w
2
, . . . , w
n
astfel nct o penalizare
W
i
este utilizat numai dac activitatea i nu se termin la momentul d
i
.
Se cere determinarea unei planicri pentru S care minimizeaz penalizarea total pentru acti-
vitatea neterminat.
Considerm o planicare dat. Spunem c o activitate este prematur n aceast planicare
dac se termin dup termenul de nalizare. n caz contrar activitatea este n timp n planicare.
O planicare arbitrar poate pus ntotdeauna ntr-o form prematur, n care ecare
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 schimbate fr
a afecta faptul c x este prematur i y este ntrziat.
Analog, armm c o planicare arbitrar poate ntotdeauna pus sub forma canonic,
n care activitile premature preced pe cele ntrziate i sunt planicate n ordine nedescresc-
toare a termenelor de terminare. Pentru a realiza acest lucru se pune planicarea 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 planicare cu termenele d
j
< d
i
, interschimbm poziia lui i cu cea a lui
j. Cum activitatea j este prematur, nainte de interschimbare, k + 1 d
j
. Atunci k + 1 < d
i
i astfel activitatea i este tot prematur dup interschimbare. Activitatea j este mutat mai
devreme n planicare, deci ea va de asemenea prematur dup interschimbare.
Deci, cutarea unei planicri optime se reduce la determinarea unei mulimi A de activiti
premature. O dat determinat A, putem crea planicarea 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 planicrii optime.
Spunem c mulimea A de activiti este independent dac exist o planicare pentru
aceste activiti astfel nct nici o activitate nu este ntrziat. Evident, mulimea activitilor
n timp pentru o planicare formeaz o mulime independent de activiti. Fie 1 mulimea
tuturor mulimilor independente de activiti.
Considerm problema determinrii independenei unei mulimi date de activiti A. Pentru
t = 1, 2, . . . n, e N
t
(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 armaii sunt echivalente:
1. A este mulime independent.
2. pentru t = 1, 2, . . . n avem N
t
(A) t.
3. dac activitile din A sunt planicate n ordinea nedescresctoare a timpilor de terminare,
atunci nici o activitate nu este ntrziat.
Demonstraie. Evident, dac exist t astfel nct N
t
(A) > t, atunci nu exist nici o modalitate
de a face o planicare 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 planicm
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 planicare a activitilor 303
Activitate
1 2 3 4 5 6 7
d
i
4 2 4 3 1 4 6
w
i
70 60 50 40 30 20 10
Figura 17.7 O instan a problemei planicrii activitilor ntr-o unitate de timp cu termen de
nalizare i penalizri pe un singur procesor
Problema minimizrii sumei de penalizare a activitilor ntrziate este aceeai cu problema
maximizrii sumei de penalizri ale activitilor premature. Urmtoarea teorem asigur corecti-
tudinea utilizrii algoritmului greedy pentru a determina o mulime independent A de activiti
cu penalizare total maxim.
Teorema 17.12 Dac S este o mulime de activiti ntr-o unitate de timp i 1 este mulimea
tuturor mulimilor independente de activiti, atunci sistemul corespunztor (S, 1) 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 N
t
(B) N
t
(A).
Cum N
n
(B) =[ B [ i N
n
(A) =[ A [, dar [ B [>[ A [ trebuie s avem k < n i N
j
(B) > N
j
(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
A
t
= A x.
Artm acum, folosind proprietatea 2 din lema 17.11, c A
t
trebuie s e independent.
Pentru 1 t k avem N
t
(A
t
) N
t
(B) t, deoarece B este independent. Atunci A
t
este
independent ceea ce ncheie demonstraia faptului c (S, 1) 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 planicare optim avnd
activitile din A ca ind activiti premature. Aceast metod este un algoritm ecient pentru
planicarea activitilor ntr-o unitate de timp cu termen de terminare i penalizri pentru un
singur procesor. Timpul de execuie este O(n
2
) folosind algoritmul Greedy deoarece ecare
din cele O(n) vericri 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 planicrii activitilor ntr-o unitate de
timp cu termene de nalizare 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 nal accept activitatea
7. Planicarea optim nal este
'2, 4, 1, 3, 7, 5, 6`,
care are o penalizare total egal cu w
5
+w
6
= 50.
304 Capitolul 17 Algoritmi greedy
Exerciii
17.5-1 Rezolvai instana problemei planicrii dat n gura 17.7 dar cu ecare penalizare w
i
nlocuit cu 80 w
i
.
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 c
0
, c
1
, . . . , c
k
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.
17-2 Subgrafuri aciclice
a. Fie G = (X, E) un graf neorientat. Folosind deniia unui matroid, artai c (E, 1) este
un matroid, unde A 1 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 M
ve
= 1 dac muchia e este incident vrfului v
i M
ve
= 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, 1)
de la punctul a) este matroid.
c. S presupunem c o pondere nenegativ w(e) este asociat ecrei muchii ntr-un graf
neorientat G = (X, E). Elaborai un algoritm ecient pentru a determina o submulime
aciclic a lui E de pondere total maxim.
d. Fie G = (V, E) un graf orientat oarecare i e (E, 1) denit astfel nct A 1 dac i
numai dac A nu conine cicluri directe. Dai un exemplu de graf orientat G astfel nct
sistemul asociat (E, 1) nu este un matroid. Specicai ce condiie din deniia 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 M
ve
= 1 dac muchia e pleac din vrful v,
M
ve
= 1 dac muchia e intr n vrful v i M
ve
= 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 bibliograce 305
f. n exerciiul 17.4-2 se arm c mulimea mulimilor liniar independente ale coloanelor
oricrei matrice M formeaz un matroid. Explicai pe larg de ce rezultatele punctelor d) i
e) nu sunt n contradicie. De ce nu poate exista o coresponden perfect ntre o mulime
de muchii ca ind aciclic i mulimea coloanelor corespunztoare ale matricei de inciden
ca ind liniar independent.
17-3 Planicarea variaiilor
S considerm urmtorul algoritm pentru rezolvarea problemei din seciunea 17.5 a planicrii
activitilor ntr-o unitate de timp cu termene de nalizare i penalizri. Fie n intervale de timp,
iniial vide, unde un interval de timp i este perioada de timp msurat n uniti ce se termin la
momentul i. Considerm activitile n ordinea monoton descresctoare a penalizrilor. Dac la
considerarea activitii j exist un interval de timp nainte sau cel trziu la termenul de nalizare
d
j
al lui j care este nc liber, se atribuie activitatea j celui mai din urm astfel de interval,
ocupndu-l totodat. Dac nu exist un astfel de interval, activitatea j se atribuie celui mai din
urm interval neocupat.
a. Argumentai faptul c acest algoritm furnizeaz ntotdeauna rspunsul corect.
b. Utilizai mulimea disjunct a pdurilor, prezentat n seciunea 22.3 pentru a implementa
ecient algoritmul. Presupunei c mulimea activitilor de intrare a fost ordonat mono-
ton descresctor dup penalizri. Analizai timpul de execuie pentru aceast implemen-
tare.
Note bibliograce
Material bibliograc referitor la metoda greedy i matroizi poate 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 ind prezentat ntr-un articol al lui Whitney [200].
Demonstraia corectitudinii algoritmului greedy pentru problema selectrii activitilor
urmeaz ideea lui Gavril [80]. Problema planicrii activitilor este studiat n Lawler [132],
Horowitz i Sahni [105] i Brassard i Bratley [33].
Codicarea Human 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 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 .
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 deci T(n)/n.
n seciunea 18.2 se prezint metoda de cotare, n care se determin costul amortizat al e-
crei operaii. Dac exist mai multe tipuri de operaii, ecare 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 ecare operaie, iar la nceput operaiile pot
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 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.
18.1. Metoda de agregare
n metoda de agregare a analizei amortizate, vom arta c, pentru orice n, o secven
de n operaii necesit timpul T(n) n . Drept urmare, n cazul cel mai
defavorabil, costul mediu pe operaie, numit i cost amortizat, va T(n)/n. S remarcm
c acest cost amortizat se aplic ecrei operaii, chiar dac n secven apar mai multe tipuri
de operaii. Celelalte dou metode studiate n acest capitol (metoda de cotare i metoda de
potenial) pot asocia costuri de amortizare diferite la tipuri de operaii diferite.
18.1. Metoda de agregare 307
Figura 18.1 Modul de aciune al lui Scoatere-Multipl-Din-Stiv pe o stiv S, al crei coninut
iniial apare n (a). Scoatere-Multipl-Din-Stiv(S, 4) extrage 4 obiecte din vrful stivei, al crei
coninut devine cel din (b). Urmtoarea operaie este Scoatere-Multipl-Din-Stiv(S, 7), care
conduce la stiva vid - vezi (c) - deoarece n stiv rmseser mai puin de 7 obiecte
.
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, ecare
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 ecare dintre aceti operatori necesit un timp O(1), costul ecruia va 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 = 0 execut
2: Scoate-Din-Stiv(S)
3: k k 1
n gura 18.1 este prezentat un exemplu de Scoatere-Multipl-Din-Stiv.
Care este timpul de execuie pentru operatorul Scoatere-Multipl-Din-Stiv(S, k)
pentru o stiv cu s obiecte? Timpul real de execuie este liniar n numrul de operaii Scoate-
Din-Stiv efectiv executate, deci este sucient s analizm operatorul Scoatere-Multipl-
Din-Stiv n funcie de costul abstract 1 asociat ecruia dintre operatorii Pune-n-Stiv
i Scoate-Din-Stiv. Numrul de iteraii din ciclul pentru este numrul minim min(s, k) al
obiectelor extrase din stiv. La ecare iteraie, n linia 2 are loc un apel Scoate-Din-Stiv.
Ca urmare, costul total pentru Scoatere-Multipl-Din-Stiv este min(s, k), iar timpul de
execuie real este o funcie liniar n acest cost.
S analizm acum o secven de n operatoii Pune-n-Stiv, Scoate-Din-Stiv i
Scoatere-Multipl-Din-Stiv pentru o stiv iniial vid. n cazul cel mai defavorabil, costul
unui operator Scoatere-Multipl-Din-Stiv din secven este O(n) deoarece mrimea stivei
este cel mult n. De aceea, n cazul cel mai defavorabil, timpul este O(n) i, drept urmare,
308 Capitolul 18 Analiza amortizat
costul unei secvene de n operatori este O(n
2
), deoarece pot exista un numr de O(n) operatori
Scoatere-Multipl-Din-Stiv, ecare avnd costul O(n). Dei aceast analiz este corect,
rezultatul O(n
2
) obinut, considernd costul n cazul cel mai defavorabil pentru ecare operator
n parte, poate 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 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 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 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
pentru o secven de n operatori. mprind acest cost total la n, am obinut
costul mediu pe operator, adic tocmai costul amortizat.
Un contor binar pentru incrementare
Pentru nc o exemplicare a metodei de agregare, vom considera un contor binar pe k
bii care i incrementeaz valoarea, plecnd de la 0. Vom folosi un tablou de bii A[0..k 1]
pentru acest contor; lungime[A] = k. Un numr binar x memorat n contor are cifra cea mai
nesemnicativ memorat n A[0], i cea mai semnicativ memorat n A[k 1], astfel nct
x =

k1
i=0
A[i] 2
i
. Iniial x = 0, deci A[i] = 0 pentru orice i = 0, 1, . . . , k 1. Pentru a mri cu
o unitate (modulo 2
k
) valoarea contorului, folosim urmtoarea procedur:
Incrementeaz(A)
1: i 0
2: ct timp i < lungime[A] i A[i] = 1 execut
3: A[i] 0
4: i i + 1
5: dac i < lungime[A] atunci
6: A[i] 1
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 ecrei 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 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 ecrei
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
sucient de bun. O singur execuie a lui Incrementeaz are, n cazul cel mai defavorabil,
18.1. Metoda de agregare 309
Figura 18.2 Conguraia 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 ecare apel al procedurii Incrementeaz. Aa cum se arat n gura 18.2,
A[0] comut la ecare apel al procedurii Incrementeaz. Bitul A[1] comut la ecare dou
incrementri: o secven de n operaii Incrementeaz, pentru un contor iniial egal cu zero, face
ca A[1] s comute de n/2| ori. Similar, bitul A[2] comut la ecare patru Incrementeazri,
deci de n/4| ori. Mai general, pentru i = 0, 1, . . . , lg n|, bitul A[i] comut de

n/2
i

ori ntr-o
secven de n operatori Incrementeaz pentru un contor binar cu valoarea iniial 0. Pentru
i > lg n|, bitul A[i] nu comut niciodat. Numrul de comutri pentru secven este, ca urmare:
|lg n|

i=0

n
2
i

< n

i=0
1
2
i
= 2n,
conform ecuaiei (3.4). Rezult c, pentru o secven de n operatori Incrementeaz pentru
un contor binar cu valoarea iniial zero, timpul, n cazul cel mai defavorabil, este O(n) i, prin
urmare, costul amortizat al ecrei operaii este O(n)/n = O(1).
310 Capitolul 18 Analiza amortizat
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).
18.1-3 Considerm o secven de n operaii ce se execut pe o structur de date. Presupunem
c operaia i are costul i dac i este o putere a lui 2, respectiv, are costul egal cu 1 n caz contrar.
Aplicai o metod de agregare pentru a determina costul de amortizare pe operaie.
18.2. Metoda de cotare
n metoda de cotare a analizei amortizate, atribuim operaiilor diferite, cotri diferite,
unele unele operaii ind supracotate sau subcotate fa de costul real. Valoarea cu care cotm o
operaie se numete costul amortizat. Cnd costul amortizat al unei operaii depete costul
real, diferena este atribuit la anumite obiecte din structura de date drept credit. Acest credit
poate folosit mai trziu pentru a ajuta s pltim pentru operaiile al cror cost amortizat este
mai mic dect costul lor real. Astfel, putem considera costul amortizat al unei operaii ca ind
format din costul real i creditul, care este e depozitat, e folosit. Aici apare deosebirea fa de
metoda de agregare, n care toate operaiile au acelai cost amortizat.
Costurile amortizate ale operaiilor trebuie alese cu grij. Dac dorim ca analiza cu costuri
amortizate s evidenieze c, n cel mai defavorabil caz, costul mediu pe operaie este mic, costul
amortizat total al unei secvene de operaii trebuie s e o margine superioar pentru costul
real total al secvenei. Mai mult, la fel ca n metoda de agregare, aceast relaie trebuie s aib
loc pentru toate secvenele de instruciuni. n acest mod, creditul total asociat structurii de
date trebuie s e, n permanen, nenegativ, deoarece reprezint cantitatea cu care costurile
amortizate totale depesc costurile reale totale. Dac s-ar admite valori negative pentru creditul
total (ca rezultat al subcotrii iniiale a operaiilor, n sperana de a returna acest aconto mai
trziu), atunci costurile amortizate totale suportate la acel moment ar sub costurile totale
reale suportate; pentru secvena de operaii pn la acel moment, costul total amortizat nu va
constitui o margine superioar pentru costul real total. De aceea, trebuie s avem grij ca n
structura de date creditul s nu devin negativ.
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
unde k este argumentul furnizat la apelarea subprogramului Scoatere-Multipl-Din-Stiv,
iar s este mrimea stivei la apelare. Vom ataa urmtoarele costuri amortizate:
Pune-n-Stiv 2,
Scoate-Din-Stiv 0,
Scoatere-Multipl-Din-Stiv 0.
S remarcm c Scoatere-Multipl-Din-Stiv are drept cost amortizat o constant (0), n
timp ce costul real este variabil. Aici toate cele trei costuri amortizate sunt de ordinul O(1), dei,
n general, costurile amortizate ale operaiilor considerate pot s difere asimptotic.
Vom arta n continuare c vom putea plti pentru orice secven de operaii de stiv prin
cotarea costurilor amortizate. Presupunem c vom folosi o hrtie de 1$ pentru ecare unitate
de cost. Pornim cu stiva vid. S ne reamintim de analogia din seciunea 11.1 ntre structura de
date stiv i un vraf de farfurii. Cnd adugm o farfurie n stiv, pltim 1$ pentru costul real al
adugrii n stiv i rmnem cu un credit de 1$ (din cei 2$ cotai) pe care l punem pe farfurie.
La orice moment de timp, pe ecare farfurie din stiv apare creditul de 1$.
Dolarul depus pe farfurie este o plat anticipat pentru costul extragerii ei din stiv. La
execuia unei operaii Scoate-Din-Stiv, cotm operaia cu 0 i pltim costul ei real folosind
creditul depus pe stiv. Pentru a extrage o farfurie, lum dolarul de pe acea farfurie i l folosim
pentru a plti costul real al operaiei. Astfel, cotnd un pic mai mult operaia Pune-n-Stiv,
nu trebuie s cotm cu ceva operaia Scoate-Din-Stiv.
Mai mult, nu trebuie s mai cotm cu ceva operaiile Scoatere-Multipl-Din-Stiv.
Pentru a extrage prima farfurie, lum dolarul aat pe ea i l folosim pentru a plti costul real
al operaiei Scoate-Din-Stiv. Pentru a extrage a doua farfurie, avem din nou la dispoziie un
credit de 1$ pe farfurie pentru a plti operaia Scoate-Din-Stiv i aa mai departe. n acest
mod am cotat (pltit) sucient nainte de a executa operaii Scoatere-Multipl-Din-Stiv.
Cu alte cuvinte, cum ecare farfurie din stiv are pe ea un credit de 1$ i cum stiva conine un
numr nenegativ de farfurii, ne-am asigurat c valoarea creditului este ntotdeauna nenegativ.
Astfel, pentru secven de n operaii Pune-n-Stiv, Scoate-Din-Stiv i Scoatere-
Multipl-Din-Stiv, costul total amortizat este o margine superioar a costului real total.
Cum costul amortizat total este O(n), costul real total are acelai ordin de mrime.
Incrementarea unui contor binar
Ca o a doua ilustrare a metodei de cotare, vom analiza aciunea operaiei Incrementeaz
asupra unui contor binar iniializat cu zero. Aa cum s-a artat mai sus, timpul de execuie al
acestei operaii este proporional cu numrul de bii ce comut; acest numr va folosit drept
cost pentru acest exemplu. Vom folosi, din nou, o hrtie de 1$ pentru a reprezenta ecare unitate
de cost (comutarea unui bit n cazul nostru).
Pentru analiza amortizat vom cota cu 2$, drept cost amortizat, setarea unui bit pe 1. La
setarea unui bit, vom folosi 1$ (din cei 2$) pentru a plti setarea efectiv a bitului i vom plasa
cellalt dolar pe bit, drept credit. n ecare moment, ecrui 1 din contorul binar i s-a asociat un
credit de 1$, astfel nct nu trebuie pltit nimic pentru resetarea bitului pe 0: pltim resetarea
cu dolarul aat pe bit.
Putem determina acum costul amortizat al subprogramului Incrementeaz. Costul resetrii
biilor n cadrul ciclului ct timp este pltit cu dolarii aai pe biii care sunt resetai. Cel mult
un bit este setat, pe linia 6 a procedurii Incrementeaz, i, prin urmare, costul amortizat al
312 Capitolul 18 Analiza amortizat
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 ecare 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.
18.2-2 Reluai exerciiul 18.1-3 folosind metoda de cotare.
18.2-3 S presupunem c dorim nu doar s incrementm contorul, dar s l i resetm la zero
(adic s iniializm toi biii cu 0). Artai cum poate implementat un contor sub forma unui
vector de bii, astfel nct orice secven de n operaii Incrementeaz i Reset s necesite
timpul O(n), presupunnd c iniial contorul este zero. ( Folosii un pointer la cifra cea
mai semnicativ egal cu 1.)
18.3. Metoda de potenial
n loc de a considera efortul pltit la nceput, sub forma unui credit repartizat anumitor
obiecte din structura de date, metoda de potenial a analizei amortizate trateaz acest efort
ca energie potenial sau, pe scurt, potenial. Acesta va folosit pentru a plti urmtoarele
operaii. Potenialul este asociat structurii de date considerat ca un tot, n loc s e repartizat
anumitor obiecte din structura de date.
Descriem, n continuare, cum lucreaz metoda de potenial. Plecm de la o structur de date
iniial D
0
asupra creia se execut n operaii. Pentru ecare i = 1, 2, . . . , n, e c
i
costul real al
operaiei i i e D
i
structura de date obinut din D
i1
dup aplicarea operaiei i. O funcie
de potenial ataeaz ecrei structuri de date D
i
numrul real (D
i
), care este potenialul
asociat structurii de date D
i
. Costul amortizat c
i
al operaiei i pentru funcia de potenial
este denit prin
c
i
= c
i
+ (D
i
) (D
i1
). (18.1)
Prin urmare, costul amortizat al ecrei operaii este costul real plus creterea de potenial
datorat operaiei. Conform ecuaiei (18.1), costul amortizat total al celor n operaii este:
n

i=1
c
i
=
n

i=1
(c
i
+ (D
i
) (D
i1
)) =
n

i=1
c
i
+ (D
n
) (D
0
). (18.2)
A doua relaie rezult din ecuaia (3.7), deoarece (D
i
) telescopeaz.
Dac putem deni o funcie de potenial , astfel nct (D
n
) (D
0
), atunci costul
amortizat total

n
i=1
c
i
este o margine superioar pentru costul real total. n practic, nu tim
ntotdeauna cte operaii vor efectuate. De aceea, dac cerem ca (D
i
) (D
0
) pentru orice
i, atunci garantm, ca n metoda de cotare, c pltim n avans. De multe ori, este convenabil s
18.3. Metoda de potenial 313
denim (D
0
) ca ind 0 i s artm c (D
i
) 0 pentru toi i. (Vezi exerciiul 18.3-1 pentru
a deprinde un mod simplu de tratare a cazurilor n care (D
0
) = 0).
Intuitiv, dac diferena de potenial (D
i
)(D
i1
) a operaiei i este pozitiv, atunci costul
amortizat c
i
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 denite 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. Denim funcia
de potenial pe stiv ca ind numrul de obiecte din stiv. Pentru stiva vid, de la care se
pleac, avem (D
0
) = 0. Deoarece numrul de elemente din stiv nu este niciodat negativ, stiva
D
i
la care se ajunge dup operaia i are un potenial nenegativ i, ca urmare,
(D
i
) 0 = (D
0
).
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
(D
i
) (D
i1
) = (s + 1) s = 1.
Conform ecuaiei (18.1), costul amortizat al operaiei Pune-n-Stiv este
c
i
= c
i
+ (D
i
) (D
i1
) = 1 + 1 = 2.
S presupunem acum c operaia i efectuat pe stiv este Scoatere-Multipl-Din-Stiv(S, k)
i c un numr de k
t
= min(k, s) obiecte sunt extrase din stiv. Costul real al operaiei este k
t
,
iar diferena de potenial este
(D
i
) (D
i1
) = k
t
.
Deci costul amortizat al operaiei Scoatere-Multipl-Din-Stiv este
c
i
= c
i
+ (D
i
) (D
i1
) = k
t
k
t
= 0.
n mod analog, obinem un cost amortizat egal cu 0 pentru o operaie Scoate-Din-Stiv.
Costurile amortizate ale ecreia dintre cele trei operaii este O(1) i, deci, costul amortizat
total al unei secvene de n operaii este O(n). Deoarece tim c (D
i
) (D
0
), costul amortizat
total a n operaii constituie o margine superioar pentru costul real total. Costul celor n operaii,
n cazul cel mai defavorabil, este egal cu O(n).
314 Capitolul 18 Analiza amortizat
Incrementarea contorului binar
Pentru a prezenta nc un exemplu de aplicare a metodei de potenial, vom considera din
nou problema incrementrii unui contor binar. De aceast dat vom deni potenialul contorului
dup i operaii Incrementeaz ca ind b
i
= numrul de cifre 1 din contor dup operaia i.
S calculm acum costul amortizat al operaiei Incrementeaz. S presupunem c cea de
a i-a operaie Incrementeaz reseteaz t
i
bii. Costul real al operaiei este cel mult t
i
+ 1
deoarece, pe lng resetarea a t
i
bii, este setat la 1 cel mult un bit. Numrul de cifre 1 din
contor, dup a i-a operaie Incrementeaz, este egal cu b
i
b
i1
t
i
+ 1, iar diferena de
potenial este
(D
i
) (D
i1
) (b
i1
t
i
+ 1) b
i1
= 1 t
i
.
Drept urmare, costul amortizat este
c
i
= c
i
+ (D
i
) (D
i1
) (t
i
+ 1) + (1 t
i
) = 2.
Contorul pornete de la zero, deci (D
0
) = 0. Cum (D
i
) 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 b
0
de 1, iar dup n operaii Incrementeaz
sunt b
n
de 1, unde 0 b
0
, b
n
k. Putem rescrie ecuaia (18.2) astfel
n

i=1
c
i
=
n

i=1
c
i
(D
n
) + (D
0
). (18.3)
Avem c
i
2 pentru orice 1 i n. Cum (D
0
) = b
0
i (D
n
) = b
n
, costul real total a n
operaii Incrementeaz este
n

i=1
c
i

n

i=1
2 b
n
+b
0
= 2n b
n
+b
0
.
n particular, innd cont de faptul c b
0
k, dac executm cel puin n = (k) operaii
Incrementeaz, costul real total va O(n), indiferent de valoarea iniial a contorului.
Exerciii
18.3-1 Fie o funcie de potenial cu (D
i
) (D
0
) pentru orice i, dar (D
0
) = 0. Artai c
exist o funcie de potenial
t
astfel nct
t
(D
0
) = 0,
t
(D
i
) 0 pentru orice i 1, iar costurile
amortizate corespunztoare lui
t
sunt aceleai ca i costurile amortizate corespunztoare lui .
18.3-2 Reluai exerciiul 18.1-3 folosind pentru analiz o metod de potenial.
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
18.3-4 Care este costul total al execuiei a n operaii Pune-n-Stiv, Scoate-Din-Stiv i
Scoatere-Multipl-Din-Stiv pentru o stiv care conine iniial s
0
obiecte, iar n nal s
n
obiecte?
18.3-5 S considerm un contor care nu pornete de la 0, ci pleac de la un numr a crui
reprezentare n baza 2 conine b de 1. Artai c, pentru execuia a n operaii Incrementeaz
costul este O(n) dac n = (b). (Valoarea b nu trebuie considerat ca ind o constant.)
18.3-6 Artai cum poate implementat o coad folosind dou stive (exerciiul 11.1-6), astfel
nct costul amortizat al ecrei operaii Pune-n-Coad i a ecrei operaii Scoate-Din-
Coad s e O(1).
18.4. Tabele dinamice
n unele aplicaii, nu tim de la nceput cte obiecte vor memorate ntr-un tablou. Alocnd
un anumit spaiu pentru tablou, riscm s descoperim mai trziu c acest spaiu este insucient.
Trebuie s facem o realocare pentru un nou tablou de dimensiuni mai mari i s copiem toate
elementele din tabloul iniial n tabloul nou creat. n mod similar, dac mai multe obiecte au
fost terse dintr-un tablou, poate convenabil s crem un nou tablou, de dimensiuni mai mici,
i s copiem tabloul curent n cel nou creat. n aceast seciune vom studia problema mririi
(expandrii) i micorrii (comprimrii) dinamice a unui tablou. Folosind analiza amortizat
vom arta c, pentru inserare i tergere, costul este O(1), chiar i atunci cnd costul real al
unei operaii este mai mare, atunci cnd are loc o mrire sau o micorare a dimensiunilor. De
asemenea vom arta cum se poate garanta c spaiul nefolosit dintr-un tablou dinamic nu va
depi o subdiviziune constant a spaiului total.
Vom presupune c tabloul dinamic permite operaiile Insereaz-Tablou i terge-
Tablou. Operaia Insereaz-Tablou insereaz n tablou un articol care ocup o singur
locaie, adic spaiul necesar memorrii unui articol. n mod analog, operaia terge-Tablou
poate gndit ca ind ndeprtarea unui articol din tablou, elibernd astfel o locaie. Detaliile
referitoare la structura de date folosit pentru organizarea tabloului nu au aici importan: putem
folosi o stiv (seciunea 11.1), un ansamblu (seciunea 7.1) sau un tabel de dispersie (capitolul
12). Putem, de asemenea, s folosim un vector sau o colecie de vectori pentru a implementa
memorarea obiectelor, aa cum s-a procedat n seciunea 11.
Este convenabil s folosim un concept introdus n analiza dispersiei (capitolul 12). Denim
factorul de ncrcare (T) al unui tablou T nevid ca ind numrul de articole memorate n
tablou, mprit la dimensiunea (numrul de locaii ale) tabloului. Tabloul vid (cu nici un articol)
are dimensiunea 0 i denim factorul su de ncrcare ca ind 1. Dac factorul de ncrcare al unui
tablou dinamic este mrginit inferior de o constant, spaiul nefolosit din tablou nu depete
niciodat o subdiviziune constant a dimensiunii spaiului total.
ncepem prin a analiza un tablou dinamic asupra cruia se execut numai operaii de inserare.
Vom trece apoi la cazul general n care sunt permise att inserri, ct i tergeri.
18.4.1. Expandarea tabloului
Presupunem c pentru alocarea memoriei pentru un tablou se folosete un vector de locaii.
Un tablou este considerat plin dac toate locaiile sale au fost folosite, adic atunci cnd factorul
316 Capitolul 18 Analiza amortizat
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 aarea
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 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 un numr de 2 dim[T] locaii
6: insereaz toate articolele din ref[T] n tablou nou
7: elibereaz ref[T]
8: ref[T] tablou
nou
9: dim[T] 2 dim[T]
10: insereaz x n ref[T]
11: num[T] num[T] + 1
S observm c avem, de fapt, dou proceduri de inserare: procedura Insereaz-Tablou i
inserarea elementar n tablou, realizat n liniile 6 i 10. Putem analiza timpul de execuie al
algoritmului Insereaz-Tablou n funcie de numrul de inserri elementare, atribuind costul 1
ecrei inserri elementare. Vom presupune c timpul de execuie real al lui Insereaz-Tablou
este liniar n funcie de timpul cerut pentru inserarea unui singur articol, astfel nct efortul
suplimentar pentru alocarea unui tablou iniial n linia 2, este constant, iar efortul suplimentar
pentru alocarea i eliberarea de memorie, n liniile 5 i 7, este mai mic dect costul transferrii
articolelor, realizat n linia 6. Vom numi expandare evenimentul care are loc atunci cnd este
executat clauza atunci din liniile 59.
S considerm acum o secven de n operaii Insereaz-Tablou efectuate asupra unui
tablou iniial vid. Care este costul c
i
al operaiei i? Dac mai exist loc n tabloul curent (sau
dac este vorba de prima operaie), atunci c
i
= 1, deoarece trebuie efectuat doar inserarea
elementar din linia 10. Dac tabloul curent este plin i deci are loc o expandare, atunci c
i
= i:
inserarea elementar din linia 10 are costul 1, iar cele i 1 mutri din tabloul curent n cel nou
n unele situaii, ca de exemplu pentru un tabel de dispersie cu adresare liber, e posibil s dorim s considerm
un tablou ca ind 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 ecare 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(n
2
)
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:
c
i
=

i dac i 1 este o putere a lui 2,


1 altfel.
Costul total a n operaii Insereaz-Tablou este prin urmare:
n

i=1
c
i
n +
|lg n|

j=0
2
j
< n + 2n = 3n,
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, ecare 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 ecare
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, ecare articol are
plasat pe el un dolar care va 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 deni 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
(T) = 2 num[T] dim[T] (18.4)
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 num
i
numrul de articole memorate n tablou dup aceast operaie, prin dim
i
dimensiunea
318 Capitolul 18 Analiza amortizat
tabloului dup aceast operaie, iar prin
i
potenialul dup aceast operaie. Iniial avem
num
0
= 0, dim
0
= 0,
0
= 0.
Dac operaia i nu conduce la o expandare, atunci dim
i
= dim
i1
i costul amortizat al
operaiei este
c
i
= c
i
+
i

i1
= 1 + (2 num
i
dim
i
) (2 num
i1
dim
i1
)
= 1 + (2 num
i
dim
i
) (2 (num
i
1) dim
i
) = 3.
Dac operaia i conduce la o expandare, atunci dim
i
/2 = dim
i1
= num
i
1, iar costul amortizat
al operaiei este
c
i
= c
i
+
i

i1
= num
i
+ (2 num
i
dim
i
) (2 num
i1
dim
i1
)
= num
i
+ (2 num
i
(2 num
i
2)) (2 (num
i
1) (num
i
1))
= num
i
+ 2 (num
i
1) = 3.
n gura 18.3 se arat cum variaz valorile num
i
, dim
i
i
i
n funcie de i. Observai modul n
care potenialul este folosit pentru a plti expandarea tabloului.
18.4.2. Expandarea i contractarea tabloului
Pentru a implementa o operaie terge-Tablou este sucient s ndeprtm articolul
specicat din tablou. Totui, uneori este de dorit s contractm tabloul atunci cnd factorul de
ncrcare devine prea mic, pentru ca spaiul nefolosit s nu e exagerat de mare. Contractarea
tabloului este analog expandrii sale: cnd numrul de articole din tablou scade prea mult,
alocm un nou tablou, mai mic, i copiem articolele din vechiul tablou n noul tablou. Spaiul
de memorie ocupat de vechiul tablou poate acum eliberat prin transmiterea sa sistemului de
gestiune a memoriei. Ideal, ar trebui satisfcute ntotdeauna dou proprieti:
factorul de ncrcare al tabloului dinamic s e mrginit inferior de o constant i
costul amortizat al unei operaii asupra tabloului s e mrginit superior de o constant.
Vom presupune c putem msura costul n funcie de inserrile i tergerile elementare.
O strategie natural pentru expandare i contractare este cea de a dubla mrimea tabloului
atunci cnd un articol trebuie introdus ntr-un tablou plin i de a-i njumti dimensiunea
atunci cnd o tergere ar face ca tabloul s devin mai puin plin dect jumtate. Aceast
strategie garanteaz c factorul de ncrcare al tabloului nu scade niciodat sub 1/2, dar, din
pcate, poate conduce la situaia n care costul amortizat al unei operaii s e prea mare. Vom
considera urmtorul scenariu. Efectum n operaii asupra unui tablou T, unde n este o putere
a lui 2. Primele n/2 operaii sunt inserri care, conform unei analize anterioare, cost n total
(n). Dup aceast secven de inserri, num[T] = dim[T] = n/2. Pentru ultimele n/2 operaii,
presupunem c ele se efectueaz n urmtoarea ordine:
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 num
i
de articole
din tablou, numrului dim
i
de locaii din tablou i potenialului
i
= 2 num
i
dim
i
, ecare ind
msurat dup operaia i. Linia subire i corespunde lui num
i
, linia groas i corespunde lui dim
i
, 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 sucient 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 ecreia ind (n). Ca urmare, costul total al celor n
operaii este (n
2
), iar costul amortizat al unei operaii este (n).
Dicultatea legat de aceast strategie este evident: dup o expandare nu se efectueaz
suciente tergeri pentru a putea plti pentru contractare. n mod analog, dup o contractare
nu se efectueaz suciente 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 inserat
ntr-un tablou plin, dar vom njumti dimensiunea tabloului atunci cnd o tergere ar face ca
el s e 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 deni 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 deni 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:
(T) =

2 num[T] dim[T] dac (T) 1/2,


dim[T]/2 num[T] dac (T) < 1/2.
(18.5)
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 sucient 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 sucient 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 c
i
costul real al operaiei i, prin c
i
costul su amortizat relativ la , prin num
i
numrul
de articole memorate n tablou dup operaia i, prin dim
i
mrimea tabloului dup operaia i,
prin
i
factorul de ncrcare al tabloului dup operaia i, iar prin
i
potenialul dup operaia
i. Iniial, num
0
= 0, dim
0
= 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 c
i
al operaiei este cel mult egal cu 3. Dac
i1
<
1/2, tabloul nu poate 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
c
i
= c
i
+
i

i1
= 1 + (dim
i
/2 num
i
) (dim
i1
/2 num
i1
)
= 1 + (dim
i
/2 num
i
) (dim
i
/2 (num
i
1)) = 0.
Dac
i1
< 1/2 dar
i
1/2, atunci
c
i
= c
i
+
i

i1
= 1 + (2 num
i
dim
i
) (dim
i1
/2 num
i1
)
= 1 + (2 (2/num
i1
+ 1) dim
i1
) (dim
i1
/2 num
i1
)
= 3 num
i1

3
2
dim
i1
+ 3 = 3
i1
dim
i1

3
2
dim
i1
+ 3
<
3
2
dim
i1

3
2
dim
i1
+ 3 = 3.
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, num
i
=
num
i1
1. Dac
i1
< 1/2, trebuie s lum n considerare situaia n care are loc o contractare.
Dac aceasta are loc, atunci dim
i
= dim
i1
i costul amortizat al operaiei este
c
i
= c
i
+
i

i1
= 1 + (dim
i
/2 num
i
) (dim
i1
/2 num
i1
)
= 1 + (dim
i
/2 num
i
) (dim
i
/2 (num
i
+ 1)) = 2.
18.4. Tabele dinamice 321
Figura 18.4 Efectul unei secvene de n operaii Insereaz-Tablou i terge-Tablou asupra
numrului num
i
de articole din tablou, numrului dim
i
de locaii din tablou, potenialului

i
=

2 num
i
dim
i
dac
i
1/2,
dim
i
/2 num
i
dac
i
< 1/2,
ecare ind msurat dup operaia i din secven. Linia subire corespunde lui num
i
, linia groas
corespunde lui dim
i
, iar linia punctat corespunde lui
i
. S observm c imediat nainte de expandare,
potenialul a crescut la numrul de articole din tablou i de aceea el este sucient pentru a plti pentru
mutarea tuturor articolelor n noul tablou. Analog, imediat nainte de a avea loc o contractare, potenialul
a crescut la numrul de articole din tablou.
Dac
i1
< 1/2 i operaia i nu implic o contractare, atunci costul real al operaiei este
c
i
= num
i
+ 1, deoarece este ters un articol i sunt mutate num
i
articole. Avem dim
i
/2 =
dim
i1
/4 = num
i
+ 1, iar costul amortizat al operaiei este
c
i
= c
i
+
i

i1
= (num
i
+ 1) + (dim
i
/2 num
i
) (dim
i1
/2 num
i1
)
= (num
i
+ 1) + ((num
i
+ 1) num
i
) ((2 num
i
+ 2) (num
i
+ 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 ecrei 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.
18.4-2 S presupunem c dorim s implementm un tablou de dispersie dinamic, cu adresare
liber. De ce am putea considera tabloul plin dac factorul su de ncrcare atinge o valoare
strict mai mic dect 1? Descriei pe scurt cum trebuie fcut inserarea ntr-un asemenea tablou,
astfel nct valoarea ateptat a costului de amortizare pentru ecare inserare s e O(1). De
322 Capitolul 18 Analiza amortizat
ce valoarea ateptat a costului de amortizare nu este n mod obligatoriu O(1) pentru toate
inserrile?
18.4-3 Artai c, dac operaia i pe un tablou dinamic este terge-Tablou i
i1
1/2,
atunci costul amortizat al operaiei, n raport cu funcia de potenial (18.5), este mrginit
superior de o constant.
18.4-4 S presupunem c, n loc s contractm tabloul prin njumtirea dimensiunii sale
atunci cnd factorul de ncrcare scade sub 1/4, l contractm prin mulirea dimensiunii sale cu
2/3 atunci cnd factorul de ncrcare scade sub 1/3. Folosind funcia de potenial
(T) =[ 2 num[T] dim[T] [,
artai c, pentru o operaie terge-Tablou, costul amortizat care folosete aceast strategie
este mrginit superior de o constant.
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 = 2
k
pentru un anumit k nenegativ.
Aceast permutare interschimb elementele de pe poziiile ale cror reprezentri binare sunt una
inversa celeilalte.
Putem exprima ecare indice a ca o secven de k bii 'a
k1
, a
k2
, . . . , a
0
` unde a =

k1
i=0
a
i
2
i
. Denim
rev
k
('a
k1
, a
k2
, . . . , a
0
`) = 'a
0
, a
1
. . . , a
k1
`;
i, deci,
rev
k
(a) =
k1

i=0
a
ki1
2
i
.
De exemplu, dac n = 16 (adic k = 4), atunci rev
k
(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 rev
k
necesit timpul (k), scriei un algoritm care s realizeze
permutarea pe bii inveri a unui vector de lungime n = 2
k
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 ind o valoare a a contorului cu inversarea
biilor, produce rev
k
(rev
k
(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
b. Presupunem c pe calculatorul cu care lucrm cuvintele sunt memorate ca valori pe k bii
i c o unitate de timp este sucient pentru a executa asupra lor operaii de tipul deplasri
la stnga i la dreapta cu o valoare dat, I i SAU pe bii etc. Scriei o implementare a lui
Incrementeaz-Cu-Inversarea-Biilor care s realizeze o permutare cu inversarea
biilor asupra unui vector cu n elemente n timpul O(n).
c. S presupunem c putem efectua o deplasare la stnga sau la dreapta cu un bit ntr-o
unitate de timp. Mai este posibil s implementm o permutare cu inversarea biilor n
timpul O(n)?
18-2 Varianta dinamic a cutrii binare
Cutarea binar ntr-un vector ordonat necesit timp logaritmic, dar timpul necesitat de
inserarea unui nou element este liniar n dimensiunea vectorului. Putem mbunti timpul
pentru inserare prin memorarea mai multor vectori ordonai.
Mai precis, s presupunem c dorim s implementm Cutare i Insereaz pe o mulime
cu n elemente. Fie k = lg(n+1)| i e 'n
k1
, n
k2
, . . . , n
0
` reprezentarea binar a lui n. Folosim
k vectori ordonai A
0
, A
1
, . . . , A
k1
, unde pentru ecare i = 0, 1, . . . , k 1 lungimea vectorului
A
i
este 2
i
. Fiecare tablou poate doar vid sau plin, dup cum n
i
= 1 sau n
i
= 0. Numrul total
de elemente din cei k vectori va deci

k1
i=0
n
i
2
i
= n. Dei ecare vector n parte este ordonat,
nu exist o dependen anume ntre elementele din vectori diferii.
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 inserat un element nou n aceast structur. Analizai timpii de
execuie pentru cazul cel mai defavorabil, precum i timpul amortizat de execuie.
c. Studiai modul n care poate implementat operaia tergere.
18-3 Arbori amortizai cu ponderi echilibrate
S considerm un arbore de cutare binar obinuit, care are ataat n plus, pentru ecare nod
x, valoarea dim[x] care memoreaz numrul de chei din subarborele de rdcin x. Fie o
constant cu 1/2 < 1. Un nod x se numete -echilibrat dac
dim[st anga[x]] dim[x] i dim[dreapta[x]] dim[x]
ntregul arbore este -echilibrat dac ecare 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
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 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 ecare 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, denim
(x) =[ dim[st anga[x]] dim[dreapta[x]] [
i denim potenialul lui T prin
(T) = c

xT:(x)2
(x),
unde c este o constant sucient de mare, care depinde de .
c. Artai c orice arbore de cutare binar are potenial nenegativ i c un arbore 1/2-
echilibrat are potenialul 0.
d. S presupunem c m uniti de potenial sunt suciente pentru a plti reconstituirea unui
subarbore avnd m noduri. Ct de mare trebuie s e c, n funcie de , pentru ca timpul
amortizat necesar reconstituirii unui subarbore care nu este -echilibrat s e O(1).
e. Artai c, pentru un arbore -echilibrat avnd n noduri, inserarea i tergerea unui nod
-echilibrat necesit un timp amortizat de ordinul O(lg n).
Note bibliograce
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 msurate nu numai prin timpul consumat cu operaiile de cutare
dinamice, ci i prin numrul de accese la disc efectuate. Pentru ecare 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 ecare dintre aceste operaii, n cazul
cel mai defavorabil, n timp O(lg n), unde 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 denite 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
denit pentru heap-urile Fibonacci este asimptotic mai slab dect operaiile similare la diverii
algoritmi specici 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 elemente care sunt grupate n mulimi dinamice. Iniial, ecare element este singur ntr-o
mulime. Operaia Reunete fuzioneaz dou mulimi, iar cererea Gsete-Mulime identic
mulimea care conine un anumit element la un moment dat. Reprezentnd ecare 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, denii 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 ecare
Introducere 327
arbore are ataat, drept cost, un numr real. n arborii dinamici se pot efectua operaiin
vederea arii prinilor, rdcinilor, costurilor arcelor, costului minim al unui drum de la
un nod la o rdcin. Arborii pot manevrai prin tierea de arce, modicarea 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 ecare operaie. O alt implementare, mai sosticat, 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 simplicarea
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 eciente
deoarece consum foarte puin timp i spaiu. Problema 14-1 d un exemplu simplu de
mulime (de arbori) dinamic persistent.
19 B-arbori
Un B-arbore este un arbore echilibrat, destinat cutrii de informaii memorate pe disc
magnetic sau pe alt tip de suport adresabil direct. B-arborii sunt similari cu arborii rou-negru
(capitolul 14), dar ei minimizeaz operaiile de intrare/ieire disc.
Diferena esenial fa de arborii rou-negru este aceea c ecare nod dintr-un B-arbore poate
avea un numr mare de i, pn la ordinul miilor. Astfel, factorul de ramicare poate foarte
mare i este, de regul, determinat doar de caracteristicile unitii de disc utilizate. Similaritatea
cu arborii rou-negru const n faptul c ambii au nlimea O(lg n), unde n este numrul de
noduri, dei nlimea unui B-arbore poate considerabil mai mic din cauza factorului de
ramicare mult mai mare. Din aceast cauz, B-arborii, pot , de asemenea, folosii pentru a
implementa n timp O(lg n) diverse operaii pe mulimi dinamice.
B-arborii sunt o generalizare natural a arborilor binari, dup cum se poate vedea i din
gura 19.1 n care este ilustrat un B-arbore. Dac un nod x al unui B-arbore conine n[x] chei,
atunci x are n[x] +1 i. Cheile nodului x sunt folosite pentru a separa domeniul de chei vizibile
din x n n[x]+1 subdomenii, ecare dintre acestea ind vizibile prin unul dintre ii lui x. Cnd se
caut o cheie ntr-un B-arbore, exist n[x] +1 posibiliti de parcurgere, n funcie de rezultatul
comparrii cu cele n[x] chei memorate n nodul x.
n seciunea 19.1 se d deniia exact a B-arborelui i se demonstreaz c nlimea lui
crete logaritmic cu numrul de noduri. Seciunea 19.2 descrie cutarea i inserarea ntr-un B-
arbore, iar seciunea 19.3 prezint tergerea. nainte de acestea, vom discuta despre structurile
de date, proiectate s lucreze pe disc magnetic i vom evidenia diferenele de proiectare fa de
structurile de acces din memoria intern.
Structuri de date n memoria secundar
Exist o mulime de tehnologii dezvoltate pentru a permite exploatarea ecient a memoriei
unui sistem de calcul. Memoria intern (memoria principal) a unui sistem este compus
din chip-uri de memorie din silicon, ecare dintre ele putnd s pstreze circa un milion de bii de
informaie. Costul acestei tehnologii este mai scump per bit de informaie dect costul similar al
tehnologiei magnetice: discuri sau benzi. Din aceast cauz sistemele de calcul au i o memorie
secundar, rezident de obicei pe disc magnetic. Capacitatea acestui tip de suport depete
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 i. Toate frunzele sunt pe acelai nivel n arbore. Nodurile haurate deschis indic
traseul de cutare a literei R.
Capitolul 19 B-arbori 329
Figura 19.2 Schema unei uniti de disc
cu cteva ordine de mrime capacitatea memoriei principale.
n gura 19.2 este prezentat, schematic, o unitate de disc magnetic clasic. Suprafaa discului
este acoperit cu o pelicul de material magnetizabil. Capul de citire/scriere poate citi/scrie de
pe/pe aceast suprafa n timpul rotaiei acesteia. Braul de citire/scriere poate poziiona capul
la diferite distane de centrul discului. Atunci cnd braul staioneaz, partea din suprafa,
care trece n timpul rotaiei prin faa unui cap de citire/scriere poart numele de pist. Adesea,
informaiile nmagazinate pe o pist sunt mprite ntr-un numr xat de buci de lungime
egal, numite pagini ; de obicei pagina unui disc are lungimea de 2048 octei. Pagina este unitatea
de baz a schimbului dintre disc i memoria intern. Timpul de acces la o pagin const din
timpul necesar poziionrii capului pe pist, urmat de ateptarea trecerii paginii prin faa capului.
Acest timp (de exemplu 20ms) este mult mai mare dect timpul necesar citirii/scrierii respective,
deoarece poziionarea este o activitate mecanic, pe cnd citirea/scrierea este una electronic.
Din aceast cauz, o dat ce poziionarea este corect, citirea/scrierea unei mari cantiti de
informaie de pe pista respectiv se face foarte rapid.
De regul, timpul de citire a unei pagini este mai mare dect timpul necesar examinrii i
prelucrrii complete a informaiilor citite. De aceea, n aceast seciune vom analiza separat cele
dou componente ale timpului de execuie:
numrul de accese la disc;
timpul de calcul al CPU.
Numrul de accese la disc va 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 simplica 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 specici B-arborilor copiaz, de pe disc n memorie,
acele pagini de care este strict nevoie i le scriu napoi pe cele care au fost modicate. 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 continuare, vom descrie, n pseudocod schema cadru de utilizare a discului. Fie x un
pointer la un obiect. Dac obiectul se a n memoria intern, atunci ne vom referi la el n mod
obinuit: cheie[x]. Dac obiectul este momentan pe disc, atunci, mai nti, trebuie s efectum
operaia Citete-Disc(x) pentru aducerea lui x n memoria intern nainte de a-i putea referi
cmpurile. Dac x este n memorie, atunci el nu mai trebuie citit. n mod analog, vom folosi
operaia Scrie-Disc(x) dac s-au efectuat modicri asupra componentelor lui x, pentru a le
salva. Astfel, scenariul clasic de prelucrare a unui obiect este:
1: . . .
2: x un pointer la un obiect
3: Citete-Disc(x)
4: operaii de acces i/sau de modicare a cmpurilor lui x
5: Scrie-Disc(x) se omite dac x nu s-a modicat
6: alte operaii de acces care nu modic cmpul lui x
7: . . .
n ecare moment, sistemul poate pstra n memoria intern numai un numr limitat de
pagini. Algoritmii specici B-arborilor presupun c exist sucient 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 normal ca
un nod n B-arbore s aib lungimea unei pagini disc. De asemenea, numrul de i ai unui nod
este bine s e ct mai mare.
De obicei, factorul de ramicare este ntre 50 i 2000, n funcie de lungimea cheii i de
lungimea unei pagini. Un factor de ramicare mare reduce drastic nlimea arborelui i numrul
de accese la disc pentru accesul la o cheie. De exemplu, n gura 19.3 este prezentat un B-arbore
cu factorul de ramicare 1001 i nlimea 2, care permite memorarea unui miliard de chei. Cu
toate acestea, deoarece nodul rdcin poate pstrat permanent n memorie, sunt necesare
numai accese la disc pentru a gsi orice cheie din acest arbore.
19.1. Deniia B-arborelui
Pentru a simplica lucrurile, vom presupune, ca i la arborii binari i la cei rou-negru, c
informaia adiional asociat unei chei este memorat n acelai loc cu cheia. n practic,
ecrei chei i este ataat un pointer care repereaz informaia adiional ataat cheii. De
asemenea, la B-arbori se obinuiete, tocmai pentru a crete factorul de ramicare, ca, n nodurile
interne s se memoreze numai chei i pointeri spre i, iar informaia adiional (pointer la ea)
s e nregistrat doar n frunze.
Un B-arbore T este un arbore cu rdcin (cu rdcina r ad acin a[T]) care are urmtoarele
proprieti:
1. Fiecare nod x are urmtoarele cmpuri:
a. n[x], numrul curent de chei memorate n x,
b. cele n[x] chei, memorate n ordine nedescresctoare cheie
1
[x] cheie
2
[x] . . .
cheie
n[x]
[x] i
19.1. Deniia B-arborelui 331
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 ecrui nod x indic numrul n[x] de chei din x.
c. valoarea boolean frunz a[x], care este adevrat dac nodul x este frunz i fals
dac nodul este intern.
2. Dac x este un nod intern, el mai conine n[x] + 1 pointeri spre ii lui c
1
[x], c
2
[x], . . .,
c
n[x]+1
[x]. Nodurile frunz nu au i, astfel cmpurile lor c
i
sunt nedenite.
3. Cheile cheie
i
[x] separ domeniile de chei aate n ecare subarbore: dac k
i
este o cheie
oarecare memorat ntr-un subarbore cu rdcina c
i
[x], atunci
k
1
cheie
1
[x] k
2
cheie
2
[x] . . . cheie
n[x]
[x] k
n[x]+1
.
4. Fiecare frunz se a la aceeai adncime, care este nlimea h a arborelui.
5. Exist o limitare inferioar i una superioar a numrului de chei ce pot coninute ntr-un
nod. Aceste margini pot exprimate printr-un ntreg xat 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
ecare nod intern, cu excepia rdcinii, trebuie s aib cel puin t i. 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 i. 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 i, motiv
pentru care i se mai spune 2-3-4 arbore. Cu toate acestea, n practic, se folosesc valori mult
mai mari pentru t.
nlimea unui B-arbore
Numrul de accese la disc cerute de cele mai multe operaii n B-arbore este proporional cu
nlimea B-arborelui. Vom analiza acum cazul cel mai defavorabil pentru nlime.
332 Capitolul 19 B-arbori
Teorema 19.1 Dac n 1, atunci, pentru orice B-arbore T cu n chei de nlime h i gradul
mimim t 2,
h log
t
n + 1
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, 2t
2
noduri pe nivelul 3 .a.m.d, 2t
h1
noduri pe nivelul h.
Figura 19.4 prezint un astfel de arbore pentru h = 3. De aceea, numrul n al cheilor satisface
inegalitatea
n 1 + (t 1)
h

i=1
2t
i1
= 1 + 2(t 1)

t
h
1
t 1

= 2t
h
1,
ceea ce demonstreaz teorema.
Figura 19.4 Un B-arbore de nlime 3 care conine numrul minim posibil de chei. n ecare 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 ind o constant, baza logaritmului la B-arbore poate , 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 gura 19.1 este un B-arbore n conformitate cu
deniia?
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-4 Determinai, n funcie de gradul minim t, o margine superioar minim a numrului de
chei care pot memorate ntr-un B-arbore de nlime h.
19.1-5 Descriei structura de date care rezult cnd ecare nod negru dintr-un arbore rou-
negru absoarbe ul lui rou, ncorpornd ii lui cu el nsui.
19.2. Operaii de baz n B-arbore
n aceast seciune, vom prezenta n detaliu, operaiile Caut-B-Arbore, Creeaz-B-Ar-
bore i Inereaz-B-Arbore. Pentru aceste proceduri facem urmtoarele convenii:
Rdcina B-arborelui se a ntotdeauna n memoria intern, astfel c, pentru ,ea nu este
necesar operaia Citete-Disc. Operaia Scrie-Disc se impune, totui, atunci cnd se
modic rdcina.
Fiecare nod transmis ca parametru trebuie s fost citit cu ajutorul procedurii Citete-
Disc.
Procedurile prezentate sunt toate dintr-o singur trecere, arborele ind 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
ramicare multipl spre nodurile i. Mai exact, la ecare nod intern x, se ia o decizie din n[x] +1
alternative.
Caut-B-Arbore este o generalizare natural a procedurii Caut-Arbore denit 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 ad acin 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 cheie
i
[y] = k.
n caz contrar, returneaz valoarea nil.
Folosind o procedur de cutare liniar, liniile 13 gsesc cel mai mic i pentru care
k cheie
i
[x] dau lui i valoarea n[x] + 1 n caz contrar. Liniile 45 veric dac cheia a fost
descoperit i, n caz armativ, returneaz valoarea corespunztoare. Liniile 610 ori termin
operaia cu insucces (dac x este o frunz), ori reapeleaz recursiv cutarea acestui u n
subarborele corespunztor, dup citirea prealabil a acestuia.
n gura 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 denit 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) = (log
t
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 ecare nod, este O(t) i timpul total CPU este O(th) = O(t log
t
n).
334 Capitolul 19 B-arbori
Crearea unui B-arbore vid
Pentru a construi un B-arbore T, mai nti, se aplic procedura Creeaz-B-Arbore pentru
a crea un nod rdcin vid. Apoi, se apeleaz procedura Inereaz-B-Arbore pentru a aduga
cte o cheie nou. Fiecare dintre aceste dou proceduri folosete o procedur auxiliar Aloc-
Nod, care, n timp O(1), aloc o pagin disc spre a folosit drept nod nou. Presupunem c
nodul creat prin Aloc-Nod nu necesit Citete-Disc deoarece pentru crearea unui nod nou
nu sunt necesare informaii de pe disc. Operaia Creeaz-B-Arbore necesit O(1) accesri de
disc i O(1) timp CPU.
Caut-B-Arbore(x, k)
1: i 1
2: ct timp i n[x] i k > cheie
i
[x] execut
3: i i + 1
4: dac i n[x] i k = cheie
i
[x] atunci
5: returneaz (x, i)
6: dac frunz a[x] atunci
7: returneaz nil
8: altfel
9: Citete-Disc(c
i
[x])
10: returneaz Caut-B-Arbore(c
i
[x], k)
Creeaz-B-Arbore(T)
1: x Aloc-Nod()
2: frunz a[x] adevrat
3: n[x] 0
4: Scrie-Disc(x)
5: r ad acin a[T] x
Divizarea unui nod
Inserarea ntr-un B-arbore este, n mod esenial, mai complicat dect inserarea unei chei ntr-
un arbore binar de cutare. Una dintre operaiile fundamentale folosite n timpul inserrii este
divizarea unui nod plin y (care are 2t1 chei) n dou noduri n jurul cheii mediane cheie
t
[y],
avnd cte t 1 chei ecare. Cheia median se deplaseaz la locul potrivit n nodul printe (care
nainte de deplasare nu trebuie s e plin) spre a repera ecare dintre cei doi subarbori obinui
prin divizarea lui y. Dac nodul y nu are printe, atunci nlimea B-arborelui crete cu unu.
Deci divizarea este cea care provoac creterea nlimii.
Procedura Divide-Fiu-B-Arbore primete ca intrare un nod intern x care
(presupus a n memoria principal), un indice i i un nod y astfel nct y = c
i
[x] este un u
al lui x. Procedura divide nodul y n dou i rearanjeaz x astfel nct acesta va avea nc
un u.
Figura 19.5 ilustreaz acest proces. Nodul plin y este divizat dup cheia lui median S care
este mutat n nodul printe x. Cheile mai mari dect S din y sunt mutate ntr-un nod nou z
care devine un nou u al lui x.
19.2. Operaii de baz n B-arbore 335
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: frunz a[z] frunz a[y]
3: n[z] t 1
4: pentru j 1, t 1 execut
5: cheie
j
[z] cheie
j+t
[y]
6: dac nu frunz a[y] atunci
7: pentru j 1, t execut
8: c
j
[z] c
j+t
[y]
9: n[y] t 1
10: pentru j n[x] + 1, i + 1, 1 execut
11: c
j+1
[x] c
j
[x]
12: c
i+1
[x] z
13: pentru j n[x], i, 1 execut
14: cheie
j+1
[x] cheie
j
[x]
15: cheie
i
[x] cheie
t
[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 u al lui x, este nodul care va divizat. Nodul y are iniial 2t 1 i, dar dup divizare
i mai rmn doar primii t 1 i. Nodul z adopt ultimii t 1 i 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 u 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 modicate. 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 i cele dou jumti ale lui r. nlimea
B-arborelui crete cu 1 cnd rdcina este divizat.
Inserarea unei chei ntr-un B-arbore
Operaia de inserare a unei chei k ntr-un B-arbore de nlime h se execut ntr-o singur
parcurgere, cobornd n arbore, i cere O(h) accese disc. Timpul CPU cerut este O(th) =
O(t log
t
n). Procedura Insereaz-B-Arbore folosete procedura Divide-Fiu-B-Arbore spre
a se asigura c nici un descendent nu va deveni nod plin.
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 acin a[T] s
5: frunz a[s] fals
6: n[s] 0
7: c
1
[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 gura 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 frunz a[x] atunci
3: ct timp i 1 i k < cheie
i
[x] execut
4: cheie
i+1
[x] cheie
i
[x]
5: i i 1
6: cheie
i+1
[x] k
7: n[x] n[x] + 1
8: Scrie-Disc(x)
9: altfel
10: ct timp i 1 i k < cheie
i
[x] execut
11: i i 1
12: i i + 1
13: Citete-Disc(c
i
[x])
14: dac n[c
i
[x]] = 2t 1 atunci
15: Divide-Fiu-B-Arbore(x, i, c
i
[x])
16: dac k > cheie
i
[x] atunci
17: i i + 1
18: Insereaz-B-Arbore-Neplin(c
i
[x], k)
Procedura Insereaz-B-Arbore-Neplin lucreaz dup cum urmeaz. Liniile 38 insereaz
k n x cnd x este un nod frunz. Dac x nu este frunz, atunci k trebuie inserat n frunza
potrivit, ntr-un subarbore al lui x. n acest caz, liniile 912, determin ul lui x de la care
trebuie mers descendent. Linia 14 detecteaz dac apare un nod plin, caz n care linia 15 apeleaz
divizarea, iar n liniile 1617 se alege nodul pe care se coboar n arbore, dintre cei doi i obinui
prin divizare. Trebuie remarcat c, dup incrementarea lui i din linia 17, nu mai trebuie apelat
Citete-Disc(c
i
[x]) deoarece apelul recursiv asigur c ul este deja citit n urma crerii lui
prin Divide-Fiu-B-Arbore. Ca urmare a aciunii liniilor 1417, se garanteaz c nu vor mai
aprea noduri pline. Linia 18 intr n recursivitate pentru a insera k n subarborele potrivit. n
gura 19.7 se ilustreaz cteva dintre cazurile care pot s apar la inserarea n B-arbore.
Numrul de accesri de disc efectuate de Insereaz-B-Arbore este O(h), unde h este
nlimea B-arborelui, deoarece ntre apelurile Insereaz-B-Arbore-Neplin sunt efectuate
numai O(1) accese la disc. Timpul total CPU este O(th) = O(t log
t
n). Deoarece Insereaz-
B-Arbore-Neplin folosete recursivitatea de coad,ea poate transformat ntr-un ciclu ct
timp, ceea ce arat c, n ecare moment, numrul de pagini din memoria intern este O(1).
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 conguraiile din arbore care
preced divizri de noduri i desenai conguraia nal.
19.2-2 Explicai n ce condiii pot (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 modicate 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 RSTUV este divizat n dou noduri coninnd RS i UV , 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
e 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 nal acest B-arbore?
19.2-5 Deoarece nodurile frunz nu conin pointeri la subarbori i, se poate concepe folosirea
n frunze a unei valori t diferite (mai mari) dect la nodurile interne pentru a ocupa mai ecient
19.3. tergerea unei chei dintr-un B-arbore 339
paginile disc. Artai cum se modic procedurile de creare i inserare ntr-un B-arbore n acest
caz.
19.2-6 Presupunem c algoritmul Caut-B-Arbore este implementat folosind, n interiorul
nodurilor, cutarea binar n locul celei liniare. Artai c, prin aceasta, timpul CPU este O(lg n),
independent de t ca funcie de n.
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.
19.3. tergerea unei chei dintr-un B-arbore
Operaia de tergere dintr-un B-arbore este analog celei de inserare, ns este puin mai
complicat. n loc s descriem complet algoritmii necesari, vom schia doar modul de lucru.
Presupunem c procedurii terge-B-Arbore i se cere s tearg cheia k din subarborele de
rdcin x. Procedura trebuie s asigure (recursiv) faptul c numrul de chei din x este cel puin
t. Aceast cerin apare din faptul c, n urma unei tergeri, se diminueaz cu 1 numrul cheilor
dintr-un nod, deci este posibil s nu mai poat avea t chei n el. n acest caz, poate avea loc
un proces de fuziune (invers divizrii), caz n care o cheie coboar ntr-un u nainte de a i se
aplica acestuia (recursiv) procedura de tergere. Dac ntr-un astfel de proces rdcina rmne
fr nici o cheie, deci cu un singur u, atunci se terge rdcina veche, iar unicul u devine
noua rdcin a arborelui, scznd nlimea arborelui cu 1 i pstrnd proprietatea arborelui
cel puin o cheie (doar dac arborele nu este vid).
Figura 19.8 ilustreaz cteva cazuri de tergere de chei dintr-un B-arbore.
1. Dac cheia k este ntr-un nod x care este frunz, atunci se terge cheia k din nodul x.
2. Dac cheia k este n nodul interior x, atunci:
a. Dac ul y care precede cheia k are cel puin t chei, atunci se caut predecesorul k
t
al
cheii k n subarborele de rdcin y. Se terge k
t
i se nlocuiete k din x cu k
t
, dup
care se aplic mai departe, recursiv, aceeai regul. (Gsirea cheii k
t
i tergerea ei se
poate face ntr-un singur pas.)
b. n manier simetric, dac ul z care succede cheia k n nodul x are cel puin t chei,
atunci se caut succesorul k
t
al cheii k n subarborele de rdcin z. Se terge k
t
i
se nlocuiete k din x cu k
t
, dup care se aplic mai departe, recursiv, aceeai regul.
(Gsirea cheii k
t
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 modicate sunt haurate mai deschis.
(a) B-arborele din gura 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 TX
se obine nodul CLPTX; 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 c
i
[x] care indic
subarborele n care se a cheia k, dac aceasta se a n arbore. Dac c
i
[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 ul potrivit al lui x.
a. Dac c
i
[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 c
i
[x], apoi mutarea unei chei n x din
fratele din stnga sau dreapta a lui c
i
[x].
b. Dac c
i
[x] i fraii lui au cte t 1 chei, fuzioneaz c
i
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 log
t
n).
Exerciii
19.3-1 Prezentai rezultatele obinute dup tergerea, n aceast ordine, a cheilor C, P i V din
B-arborele din gura 19.8(f).
19.3-2 Descriei, n pseudocod, procedura terge-B-Arbore.
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
specice 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
O implementare simpl, dar inecient, pstreaz ntreaga stiv pe disc. n memorie se
pstreaz doar un pointer la stiv, care este adresa elementului din vrful stivei. Dac p este
valoarea acestui pointer, m este numrul de cuvinte dintr-o pagin, atunci p/m| este numrul
paginii de pe disc, iar primul element este al p mod m-lea cuvnt din pagin.
Pentru implementarea procedurii Pune-n-Stiv, se incrementeaz pointerul de stiv, se
citete pagina disc corespunztoare, se copiaz coninutul cuvntului n vrful paginii din
vrful stivei, dup care pagina se rescrie pe disc. Operaia Scoate-Din-Stiv este similar:
se decrementeaz pointerul de stiv, se citete pagina corespunztoare, se extrage elementul din
vrful stivei dup care pagina se rescrie pe disc.
Deoarece operaiile cu discul sunt relativ costisitoare, vom folosi numrul de operaii disc ca
msur a ecienei. Vom contoriza timpul CPU i vom cere (m) pentru ecare acces disc la o
pagin de m cuvinte.
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).
S considerm o implementare n care se pstreaz permanent n memoria intern o pagin
a stivei. (Evident, vom ti copia crei pagini disc se a n memorie). Se pot face operaii asupra
stivei numai dac pagina respectiv se a n memorie. Dac este cazul, pagina curent de pe
disc se rescrie i se recitete alta. Dac pagina este deja n memorie, nu se mai acceseaz discul
pentru ea.
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 e O(1/m), iar timpul mediu amortizat CPU s e O(1).
19-2 Fuzionarea i divizarea 2-3-4 arborilor
Operaia de fuzionare necesit dou mulimi dinamice S
t
i S
tt
i un element x, astfel nct,
pentru orice x
t
S
t
i x
tt
S
tt
, avem cheie[x
t
] < cheie[x] < cheie[x
tt
]. n urma operaiei, se
returneaz o mulime S = S
t
x S
tt
. Operaia de divizare este oarecum invers fuziunii:
se d o mulime dinamic S i un element x S i se creeaz o mulime S
t
care conine toate
elementele din Sx cu cheile mai mici dect cheie[x] i o mulime S
tt
cu elementele din Sx
care au cheile mai mari dect cheie[x]. n acest sens vom examina cum se pot implementa aceste
operaii la 2-3-4 arbori. Pentru simplicare, presupunem c toate cheile sunt distincte.
a. Artai cum se ntreine un cmp [x] care, pentru un nod x al unui 2-3-4 arbore,
reprezint nlimea subarborelui de rdcin x. Desigur, soluia nu trebuie s afecteze
timpii asimptotici de execuie ai operaiilor de cutare, inserare i tergere.
Note bibliograce 343
b. Artai cum se implementeaz operaia de fuzionare. Fiind dai 2-3-4 arborii T
t
i T
tt
i o
cheie k, operaia de fuziune trebuie s se execute n timp O([h
t
h
tt
[), unde h
t
i h
tt
sunt
nlimile arborilor T
t
i, respectiv, T
tt
.
c. ntr-un 2-3-4 arbore T, considerm un drum p de la rdcin la o cheie k, mulimea S
t
format din cheile din T mai mici dect k i mulimea S
tt
format din cheile din T mai
mari dect k. Artai c p mparte mulimea S
t
ntr-o mulime de arbori T
t
0
, T
t
1
, . . . T
t
m
i
o mulime de chei k
t
1
, k
t
2
, . . . , k
t
m
, unde, pentru i = 1, 2, . . . , m, avem y < k
t
i
< z, pentru
orice cheie y T
t
i1
i z T
t
i
. Care este relaia dintre nlimile arborilor T
t
i1
i T
t
i
?
Descriei cum mparte p mulimea S
tt
n submulimi de arbori i chei.
d. Artai cum se poate implementa operaia de diviziune n T. Folosii operaia de fuziune
pentru a asambla cheile din S
t
ntr-un singur 2-3-4 arbore T
t
i cheile din S
tt
ntr-un singur
2-3-4 arbore T
tt
. Timpul de execuie trebuie s e O(lg n), unde n este numrul de chei
din T. ( Costurile reunirii ar trebui s telescopeze.)
Note bibliograce
Knuth [123], Aho, Hopcroft i Ullman [4], Sedgewick [175] au tratat diverse aspecte ale
schemelor de arbori echilibrai i B-arbori. O sintez exhaustiv asupra B-arborilor a fost
realizat de Comer [48]. Guibas i Sedgewick [93] au tratat relaiile ntre diversele scheme de
arbori echilibrai, inclusiv arbori rou-negru i 2-3-4 arbori.
n 1970, J. E. Hopcroft a inventat 2-3 arborii, precursori ai B-arborilor i 2-3-4 arborilor, n
care ecare nod intern are doi sau trei i. B-arborii au fost denii de Bayer i McCreight n
1972 [18]; ei nu au explicat sursa alegerii acestui nume.
20 Heap-uri binomiale
Acest capitol i capitolul 21 prezint structuri de date cunoscute sub numele de heap-uri
interclasabile, caracterizate de urmtoarele cinci operaii.
Creeaz-Heap() creeaz i returneaz un heap nou care nu conine elemente.
Insereaz(H, x) insereaz nodul x, a crui a fost iniializat, n heap-ul H.
Minimum(H) returneaz un pointer la nodul cu cea mai mic cheie din H.
Extrage-Min(H) terge nodul cu cheia minim din H i returneaz un pointer la acest nod.
Reunete(H
1
, H
2
) creeaz i returneaz un heap nou care conine toate nodurile heap-urilor
H
1
i H
2
. Heap-urile H
1
i H
2
sunt distruse n urma acestei operaii.
n plus, pe structurile de date din aceste capitole se pot deni i urmtoarele dou operaii.
Descrete-Cheie(H, x, k) atribuie nodului x din heap-ul H valoarea k pentru cheie, valoare
presupus a nu mai mare dect valoarea curent a cheii.
terge(H, x) terge nodul x din heap-ul H.
Tabelul din gura 20.1 arat c heap-urile binare obinuite, folosite, de exemplu, n heapsort
(capitolul 7), suport bine aceste operaii, cu excepia operaiei Reunete. n cazul heap-
urilor binare, pentru ecare operaie, exceptnd Reunete, timpul de execuie n cazul cel mai
defavorabil este O(lg n) (sau mai bun). Dac totui un heap binar trebuie s execute operaia
Reunete aceasta va lent. Prin concatenarea celor dou tablouri care memoreaz heap-urile
binare care se interclaseaz i apoi aplicarea operaiei Reconstituie-Heap, timpul de execuie,
n cazul cel mai defavorabil, pentru operaia Reunete este (n).
n acest capitol vom examina heap-urile binomiale a cror margini pentru timpii de execuie,
n cazurile cele mai defavorabile, sunt prezentate n gura 20.1. n particular, operaia Reunete
pentru interclasarea a dou heap-uri binomiale cu n elemente va de complexitate O(lg n).
n capitolul 21 vom examina heap-urile Fibonacci care pentru anumite operaii au estimri
chiar mai bune a timpilor de execuie. S notm aici c estimrile din gura 20.1 pentru heap-
urile Fibonacci sunt amortizate i nu reprezint margini ale timpilor de execuie, n cazurile cele
mai defavorabile.
n acest capitol vor ignorate operaiile de alocare a nodurilor nainte de o inserare i de
eliberare a nodurilor dup o tergere. Presupunem c de aceste detalii este responsabil codul
care apeleaz operaiile heap-ului.
Heap-urile binare, binomiale i Fibonacci sunt ineciente n raport cu operaia de Cutare;
pentru gsirea unui nod care conine o anumit valoare nu se poate stabili o cale de cutare
direct n aceste structuri. Din acest motiv, operaiile Descrete-Cheie i terge care se
refer la un anumit nod reclam ca parametru de intrare un pointer la nodul respectiv. n cele
mai multe aplicaii aceast cerin nu ridic probleme.
n seciunea 20.1 se denesc heap-urile binomiale, dup ce n prealabil se denesc arborii
binomiali. Se introduce, de asemenea, i o reprezentare particular a heap-urilor binomiale. n
seciunea 20.2 se prezint modul n care se pot implementa operaiile pe heap-uri binomiale
pentru a obine estimrile de timp din gura 20.1.
20.1. Arbori binomiali i heap-uri binomiale 345
Heap binar Heap binomial Heap Fibonacci
(cazul cel mai (cazul cel mai
Procedur defavorabil) defavorabil) (amortizat)
Creeaz-Heap (1) (1) (1)
Insereaz (lg n) O(lg n) (1)
Minimum (1) O(lg n) (1)
Extrage-Min (lg n) (lg n) O(lg n)
Reunete (n) O(lg n) (1)
Descrete-Cheie (lg n) (lg n) (1)
terge (lg n) (lg n) O(lg n)
Figura 20.1 Timpi de execuie a operaiilor pentru trei implementri ale heap-urilor interclasabile.
Numrul elementelor din heap-ul sau heap-urile folosite de o operaie este notat cu n.
20.1. Arbori binomiali i heap-uri binomiale
Deoarece un heap binomial este o colecie de arbori binomiali, aceast seciune ncepe prin
denirea arborilor binomiali i demonstrarea unor proprieti eseniale ale acestora. Vom deni
apoi heap-urile binomiale i vom arta cum pot reprezentate acestea.
20.1.1. Arbori binomiali
Arborele binomial B
k
este un arbore ordonat denit recursiv (a se vedea seciunea 5.5.2).
Dup cum arat gura 20.2(a), arborele binomial B
0
const dintr-un singur nod. Arborele
binomial B
k
const din doi arbori binomiali B
k1
care sunt nlnuii: rdcina unuia dintre
ei este ul situat cel mai n stnga rdcinii celuilalt arbore. Figura 20.2(b) prezint arborii
binomiali de la B
0
la B
4
.
Lema urmtoare conine cteva proprieti ale arborilor binomiali.
Lema 20.1 (Proprieti ale arborilor binomiali) Arborele binomial B
k
are:
1. 2
k
noduri,
2. nlimea k,
3. exact

k
i

noduri, la adncimea i, pentru i = 0, 1, . . . , k,


4. rdcina de grad k, grad mai mare dect a oricrui alt nod; mai mult, dac ii rdcinii
sunt numerotai de la stnga spre dreapta prin k1, k2, . . ., 0, atunci ul i este rdcina
subarborelui B
i
.
Demonstraie. Demonstraia este inductiv n raport cu k. Pasul iniial pentru ecare
proprietate l constituie arborele binomial B
0
. Vericarea proprietilor pentru B
0
este imediat.
Presupunem c lema are loc pentru arborele B
k1
.
1. Arborele binomial B
k
are 2
k1
+ 2
k1
= 2
k
noduri, deoarece el const din dou copii ale
arborelui B
k1
.
346 Capitolul 20 Heap-uri binomiale
Figura 20.2 (a) Deniia recursiv a arborelui binomial B
k
. Triunghiurile reprezint subarborii
rdcinii. (b) Arborii binomiali B
0
pn la B
4
. Este redat i adncimea nodurilor lui B
4
. (c) Un
alt mod de a privi arborele binomial B
k
.
2. innd cont de modul n care sunt nlnuite cele dou copii ale lui B
k1
pentru a forma
B
k
, rezult c adncimea maxim a lui B
k
este cu unu mai mare dect adncimea maxim
a lui B
k1
. Din ipoteza de inducie obinem valoarea (k 1) + 1 = k pentru adncimea
maxim a lui B
k
.
3. Fie D(k, i) numrul nodurilor situate pe nivelurile i al arborelui binomial B
k
. Deoarece B
k
este compus din dou copii nlnuite ale lui B
k1
, un nod de pe nivelul i din B
k1
apare
n B
k
pe nivelele i i i + 1. Altfel spus, numrul nodurilor situate pe nivelul i n B
k
este
egal cu numrul nodurilor de pe nivelul i din B
k1
plus numrul nodurilor de pe nivelul
i 1 din B
k1
. Astfel,
D(k, i) = D(k 1, i) +D(k 1, i 1) =

k 1
i

k 1
i 1

k
i

.
A doua egalitate rezult din ipoteza de inducie, iar egalitatea a treia rezult din exerciiul
6.1-7.
4. Singurul nod cu grad mai mare n B
k
dect n B
k1
este rdcina, care are cu un u mai
mult dect n B
k1
. Deoarece rdcina lui B
k1
are gradul k 1, rdcina lui B
k
are
20.1. Arbori binomiali i heap-uri binomiale 347
gradul k. Din ipoteza de inducie i dup cum ilustreaz gura 20.2(c), ii lui B
k1
(de la
stnga la dreapta) sunt rdcinile arborilor B
k2
, B
k3
, . . ., B
0
. Cnd B
k1
este legat la
B
k1
, ii rdcinii rezultate sunt rdcini pentru B
k1
, B
k2
, . . ., B
0
.
Corolarul 20.2 Gradul maxim al nodurilor unui arbore binomial avnd n noduri este lg n.
Demonstraie. Rezult imediat din proprietile 1 i 4 ale lemei 20.1.
Proprietatea 3 a lemei 20.1 justic termenul de arbore binomial prin faptul c

k
i

sunt
coecienii binomiali. O justicare n plus a acestui termen este oferit de exerciiul 20.1-3.
20.1.2. Heap-uri binomiale
Un heap binomial H este format dintr-o mulime de arbori binomiali care satisfac
urmtoarele proprieti de heap binomial.
1. Fiecare arbore binomial din H satisface proprietatea de ordonare a unui heap: cheia
unui nod este mai mare sau egal dect cheia printelui su.
2. Exist cel mult un arbore binomial n H a crui rdcin are un grad dat.
Conform primei proprieti, rdcina unui arbore cu proprietatea de heap ordonat, conine
cea mai mic cheie din arbore.
Proprietatea a doua implic faptul c un heap binomial H avnd n noduri conine cel mult
lg n| + 1 arbori binomiali. Pentru o justicare a acestei armaii observai c reprezentarea
binar a lui n are lg n|+1 bii, e acetia 'b
|lg n|
, b
|lg n|1
, . . ., b
0
`, astfel nct n =

|lg n|
i=0
b
i
2
i
.
Din proprietatea 1 a lemei 20.1 rezult c arborele binomial B
i
apare n H dac i numai dac
bitul b
i
= 1. Astfel, heap-ul binomial H conine cel mult lg n| + 1 arbori binomiali.
Figura 20.3(a) prezint un heap binomial H avnd 13 noduri. Reprezentarea binar a
numrului 13 este '1101`, iar H conine arborii binomiali cu proprietatea de heap B
3
, B
2
i
B
0
, avnd 8, 4 i respectiv 1 nod, n total ind 13 noduri.
Reprezentarea heap-urilor binomiale
Dup cum ilustreaz i gura 20.3(b), ecare arbore binomial al unui heap binomial este
memorat conform reprezentrii stnga-u, dreapta-frate prezentat n seciunea 11.4. Fiecare
nod are un cmp cheie plus alte informaii specice aplicaiei care folosete heap-ul. n plus,
ecare nod x conine pointerii p[x] spre printele lui, [x] spre ul situat cel mai n stnga
i [x] spre fratele lui x situat imediat n dreapta. Dac nodul x este o rdcin atunci
p[x] = nil. Dac nodul x nu are i atunci [x] = nil, iar dac x este ul situat cel mai n
dreapta, atunci [x] = nil. Fiecare nod conine de asemenea cmpul [x], care reprezint
numrul ilor lui x.
Rezult din gura 20.3 c rdcinile arborilor binomiali coninui de un heap binomial sunt
pstrate ntr-o list nlnuit pe care o vom numi n continuare list de rdcini. La o
traversare a listei de rdcini, gradul rdcinilor formeaz un ir strict cresctor. Din a doua
proprietate de heap binomial, rezult c gradele rdcinilor unui heap binomial avnd n noduri
formeaz o submulime a mulimii 0, 1, . . . , lg n|. Cmpul are semnicaii diferite dup
348 Capitolul 20 Heap-uri binomiale
Figura 20.3 Un heap binomial H avnd n = 13 noduri. (a) Heap-ul const din arborii binomiali
B
0
, B
2
i B
3
, arbori care au 1, 4 i respectiv 8 noduri, n total ind n = 13 noduri. Deoarece ecare
arbore binomial satisface proprietatea de ordonare a unui heap, cheia ecrui nod nu este mai mic dect
cheia printelui su. Este redat de asemenea i lista de rdcini, care este o list nlnuit coninnd
rdcinile n ordine cresctoare a gradelor lor. (b) O reprezentare mai detaliat a heap-ului binomial
H. Fiecare arbore binomial este memorat conform reprezentrii stnga-u, dreapta-frate. Fiecare nod
memoreaz de asemenea i gradul lui.
Figura 20.4 Arborele binomial B
4
cu nodurile etichetate prin secvene binare corespunztoare
parcurgerii n postordine.
cum nodurile sunt rdcini sau nu. Dac x este rdcin atunci [x] refer rdcina urmtoare
n lista de rdcini. (Dac x este ultima rdcin din list atunci, ca de obicei, [x] = nil.)
Un heap binomial dat H este referit prin pointerul [H] spre prima rdcin din lista de
20.2. Operaii pe heap-uri binomiale 349
rdcini a lui H. Dac heap-ul binomial H nu are elemente, atunci [H] = nil.
Exerciii
20.1-1 Presupunem c x este un nod al unui arbore binomial dintr-un heap binomial i c
[x] = nil. Ce relaie exist ntre [ [x]] i [x], dac x nu este o rdcin? Dar
dac x este o rdcin?
20.1-2 Dac x nu este nodul rdcin al unui arbore binomial dintr-un heap binomial, ce relaie
exist ntre [p[x]] i [x]?
20.1-3 Presupunem c etichetm nodurile arborelui binomial B
k
prin secvene binare corespun-
ztoare parcurgerii n postordine a arborelui, conform gurii 20.4. Considerm un nod x de pe
nivelul i etichetat cu l i e j = k i. Artai c eticheta asociat nodului x are j cifre de 1.
Cte iruri binare de lungime k conin exact j cifre binare de 1? Artai c gradul lui x este egal
cu numrul cifrelor 1 situate n dreapta celui mai din dreapta 0 din reprezentarea binar a lui l.
20.2. Operaii pe heap-uri binomiale
n aceast seciune vom arta cum putem efectua operaiile pe heap-uri binomiale respectnd
marginile de timp prezentate n gura 20.1. Vom demonstra numai rezultatele privind marginile
superioare; justicarea rezultatelor referitoare la marginile inferioare cuprins n exerciiul 20.2-
10.
Crearea unui heap binomial nou
Pentru a crea un heap binomial vid, procedura Creeaz-Heap-Binomial va aloca i returna
un obiect H, pentru care [H] = nil. Timpul de execuie este (1).
Gsirea cheii minime
Procedura Heap-Binomial-Min returneaz un pointer la nodul cu cea mai mic cheie dintr-
un heap binomial H avnd n noduri. Aceast implementare presupune c nu exist chei cu
valoarea . (A se vedea Exerciiul 20.2-5.)
Heap-Binomial-Min(H)
1: y nil
2: x [H]
3:
4: ct timp x = nil execut
5: dac [x] < atunci
6: [x]
7: y x
8: x [x]
9: returneaz y
350 Capitolul 20 Heap-uri binomiale
Cheia minim a unui heap binomial se a ntr-o rdcin deoarece este un heap ordonat.
Procedura Heap-Binomial-Min veric toate rdcinile (n numr de cel mult lg n| + 1) i
reine minimul curent n , respectiv un pointer la acest minim n y. Apelat pentru heap-ul
binomial din gura 20.3 procedura va returna un pointer la nodul care conine cheia 1.
Timpul de execuie al procedurii Heap-Binomial-Min este O(lg n) deoarece exist cel mult
lg n| + 1 rdcini vericate.
Reuniunea a dou heap-uri binomiale
Operaia de reuniune a dou heap-uri binomiale este folosit de aproape toate celelalte
operaii rmase. Procedura Heap-Binomial-Reunete nlnuie repetat arborii binomiali care
au rdcini de acelai grad. Procedura urmtoare leag arborele B
k1
avnd nodul rdcin y la
arborele B
k1
avnd nodul rdcin z; mai precis, z va printele lui y. Nodul z devine astfel
rdcina unui arbore B
k
.
Binomial-Legtur(y, z)
1: p[y] z
2: [y] [z]
3: [z] y
4: [z] [z] + 1
Procedura Binomial-Legtur plaseaz nodul y n capul listei nlnuite care conine ii
nodului z ntr-un timp O(1). Reprezentarea stnga-u, dreapta-frate a ecrui arbore binomial
asigur succesul acestei proceduri deoarece ecare arbore binomial are proprietatea de ordonare
a arborelui: ul cel mai din stnga al rdcinii unui arbore B
k
este rdcina unui arbore B
k1
.
Procedura Heap-Binomial-Reunete unete dou heap-uri binomiale H
1
i H
2
i retur-
neaz heap-ul rezultat. Pe parcursul efecturii operaiei, reprezentrile heap-urilor H
1
i H
2
sunt distruse. Procedura folosete pe lng procedura Binomial-Legtur nc o procedur
auxiliar Ansamblu-Binomial-Interclaseaz, care interclaseaz listele de rdcini ale heap-
urilor H
1
i H
2
ntr-o singur list simplu nlnuit ordonat cresctor dup gradul nodurilor.
Procedura Heap-Binomial-Interclaseaz, a crei descriere n pseudocod se cere n exerciiul
20.2-2, este similar procedurii Interclaseaz din seciunea 1.3.1.
Figura 20.5 prezint un exemplu pentru care se petrec toate cele patru cazuri indicate prin
comentarii n procedura Heap-Binomial-Reunete.
Procedura Heap-Binomial-Reunete se desfoar n dou faze. n prima faz se
interclaseaz (prin apelul Heap-Binomial-Interclaseaz) listele de rdcini ale heap-urilor
binomiale H
1
i H
2
ntr-o list simplu nlnuit H care este ordonat cresctor n raport cu
gradul nodurilor rdcin. Lista format poate conine cel mult dou rdcini cu acelai grad.
Astfel, n faza a doua sunt unite toate rdcinile care au acelai grad, astfel nct s nu existe
dou noduri cu acelai grad. Deoarece lista nlnuit H este ordonat dup grad, operaiile de
nlnuire din faza a doua sunt efectuate rapid.
Detaliem cele dou faze ale procedurii. Liniile 13 ncep prin interclasarea celor dou liste ale
heap-urilor binomiale H
1
i H
2
ntr-o singur list de rdcini H. Listele de rdcini ale lui H
1
i
H
2
sunt ordonate strict cresctor dup grad, iar Heap-Binomial-Interclaseaz returneaz
o list de rdcini H, ordonat cresctor dup grad. Dac listele H
1
i H
2
au mpreun m
noduri, atunci timpul de execuie pentru Heap-Binomial-Interclaseaz este O(m), datorat
20.2. Operaii pe heap-uri binomiale 351
examinrii repetate a rdcinilor din capul listelor i adugrii rdcinii avnd gradul mai mic
n lista de rdcini rezultat, eliminnd aceast rdcin din lista dat la intrare.
Heap-Binomial-Reunete(H
1
, H
2
)
1: H Creeaz-Heap-Binomial()
2: [H] Heap-Binomial-Interclaseaz(H
1
, H
2
)
3: elibereaz obiectele H
1
i H
2
dar nu i listele referite de ele
4: dac (H) = nil atunci
5: returneaz H
6: nil
7: x [H]
8: [x]
9: ct timp = nil execut
10: dac ( [x] = [ ])
sau ( [ ] = nil i [frate[ ]] = [x]) atunci
11: x Cazurile 1 i 2
12: x Cazurile 1 i 2
13: altfel
14: dac [x] [ ] atunci
15: [x] [ ] Cazul 3
16: Binomial-Legtur( , x) Cazul 3
17: altfel
18: dac = nil atunci
19: [H] Cazul 4
20: altfel
21: [ ] Cazul 4
22: Binomial-Legtur(x, ) Cazul 4
23: x Cazul 4
24: [x] Cazul 4
25: returneaz H
n continuare procedura Heap-Binomial-Reunete iniializeaz civa pointeri n lista de
rdcini H. Dac heap-urile binomiale date la intrare sunt vide, atunci n liniile 45 se iese din
procedur. ncepnd cu linia 6 ne situm n cazul n care H conine cel puin o rdcin. Din
acest punct se pstreaz trei pointeri n lista de rdcini:
x indic rdcina curent examinat,
indic rdcina precedent lui x n lista de rdcini: [ ] = x, i
indic rdcina urmtoare lui x n list: [x] = .
H poate conine iniial, cel mult dou rdcini cu un grad dat: deoarece H
1
i H
2
sunt
heap-uri binomiale, ele nu au dou rdcini avnd acelai grad. Mai mult, procedura Heap-
Binomial-Interclaseaz ne garanteaz c dac H conine dou rdcini avnd acelai grad,
atunci ele sunt adiacente n lista de rdcini.
n timpul execuiei procedurii Heap-Binomial-Reunete, de fapt, pot exista trei rdcini
avnd acelai grad. Vom vedea imediat cnd se produce aceast situaie. La ecare iteraie a
352 Capitolul 20 Heap-uri binomiale
Figura 20.5 Execuia procedurii Heap-Binomial-Reunete. (a) Heap-urile binomiale H
1
i H
2
. (b)
Heap-ul binomial H este rezultatul operaiei Heap-Binomial-Reunete(H
1
, H
2
). Iniial x este prima
rdcin din lista de rdcini a lui H. Se aplic cazul 3, deoarece att x ct i urm-x au acelai grad 0 i
cheie[x] < cheie[urm-x]. (c) Dup realizarea legturii se aplic cazul 2, deoarece x este prima din cele
trei rdcini cu acelai grad. (d) Dup ce toi pointerii au avansat cu o poziie n lista de rdcini, se
aplic cazul 4 deoarece x este prima din cele dou rdcini cu grad egal. (e) Dup apariia legturii se
aplic cazul 3. (f ) Dup stabilirea unei noi legturi se aplic cazul 1 pentru c x are gradul 3, iar urm-x
are gradul 4. Aceasta este ultima iteraie a ciclului ct timp, deoarece dup deplasarea pointerilor n
lista de rdcini, urm-x = nil.
ciclului ct timp din liniile 924 se decide dac se poate lega x i n funcie de gradul
lor i de gradul lui [ ]. Un invariant al acestui ciclu este faptul c la ecare reluare a
corpului ciclului att x ct i sunt diferii de nil.
Cazul 1, prezentat n gura 20.6(a), se produce atunci cnd grad[x] = [ ], adic x
este rdcina unui arbore B
k
i este rdcina unui arbore B
l
pentru un l > k. Aceast
situaie este tratat n liniile 1112. Deoarece nu trebuie s legm x i , nu rmne dect
s deplasm pointerii n list. Actualizarea pointerului pentru a referi nodul ce urmeaz
noului nod x este efectuat n linia 24, deoarece aceasta este comun tuturor cazurilor.
Cazul 2, prezentat n gura 20.6(b), are loc atunci cnd x este prima rdcin din cele trei
care au acelai grad, adic atunci cnd [x] = [ ] = [ [ ].
Acest caz este tratat similar cu cazul 1: efectum doar o deplasare a pointerilor n list. Testul
din linia 10 este comun cazurilor 1 i 2, la fel cum liniile 1112 trateaz amndou cazurile.
20.2. Operaii pe heap-uri binomiale 353
Cazurile 3 i 4 se produc atunci cnd x este prima rdcin din dou rdcini succesive avnd
acelai grad, adic
[x] = [ ] = [frate[ ]].
Aceste cazuri apar la iteraia urmtoare dup ecare caz, dar unul din ele urmeaz imediat dup
cazul 2. n cazurile 3 i 4 vom nlnui x i . Aceste cazuri difer ntre ele dup cum x sau
au cheia mai mic, fapt ce determin care din noduri va rdcin n procesul de legare
a lor.
n cazul 3, prezentat n gura 20.6(c), [x] [ ], astfel c va legat la
x. Linia 15 terge din lista de rdcini, iar n linia 16 devine ul situat cel mai n
stnga lui x.
n cazul 4, prezentat n gura 20.6(d), cheia mai mic o are , deci x este legat la .
Liniile 1721 terg x din lista de rdcini. Exist dou subcazuri, dup cum x este (linia 19)
sau nu (linia 21) prima rdcin din list. n linia 22, x devine ul situat cel mai n stnga lui
, iar linia 23 actualizeaz x pentru iteraia urmtoare.
Pregtirea iteraiei urmtoare a ciclului ct timp este aceeai pentru ambele cazuri 3 i 4.
x refer un arbore B
k+1
obinut prin legarea a doi arbori B
k
. Dup operaia Heap-Binomial-
Interclaseaz n lista de rdcini existau zero, unul sau doi arbori B
k+1
, deci x este acum
prima rdcin din lista de rdcini pentru un numr de unu, doi sau trei arbori B
k+1
. n cazul
existenei unui singur arbore (x referindu-l pe acesta), la iteraia urmtoare se va produce cazul 1:
354 Capitolul 20 Heap-uri binomiale
Figura 20.6 Cele patru cazuri care se pot produce n Heap-Binomial-Reunete. Etichetele a, b, c
i d servesc aici doar la identicarea rdcinilor; ele nu reprezint gradele sau cheile acestor rdcini.
n ecare din cazuri, x este rdcina unui arbore B
k
i l > k. (a) Cazul 1: grad[x] ,= grad[urm-x].
Pointerii se deplaseaz n lista de rdcini cu o poziie n jos. (b) Cazul 2: grad[x] = grad[urm-x] =
grad[frate[urm-x]]. Din nou, pointerii se deplaseaz n lista de rdcini cu o poziie spre dreapta i
la iteraia urmtoare se execut unul din cazurile 3 sau 4. (c) Cazul 3: grad[x] = grad[urm-x] ,=
grad[frate[urm-x]] i cheie[x] cheie[urm-x]. tergem urm-x din lista de rdcini i l legm de x,
crend astfel un arbore B
k+1
. (d) Cazul 4: grad[x] = grad[urm-x] ,= grad[frate[urm-x]] i cheie[urm-x]
cheie[x]. tergem x din lista de rdcini i l legm la urm-x, crend astfel din nou un arbore B
k+1
.
20.2. Operaii pe heap-uri binomiale 355
[x] = [ ]. Dac x refer primul arbore din doi existeni atunci la iteraia urmtoare
are loc unul din cazurile 3 sau 4. n sfrit, dac x refer primul arbore din trei existeni atunci
la iteraia urmtoare are loc cazul 2.
Timpul de execuie pentru Heap-Binomial-Reunete este O(lg n), unde n este numrul
total de noduri din heap-urile binomiale H
1
i H
2
. Justicm acest rezultat dup cum urmeaz.
Fie n
1
i n
2
numrul nodurilor heap-urilor H
1
, respectiv H
2
astfel nct n = n
1
+ n
2
. Atunci
numrul maxim de rdcini coninute de H
1
i H
2
este lg n
1
| +1, respectiv lg n
2
| +1. Astfel,
imediat dup apelul Heap-Binomial-Interclaseaz, H conine cel mult lg n
1
| + lg n
2
| +
2 2lg n| + 2 = O(lg n) rdcini. Rezult c timpul de execuie pentru Heap-Binomial-
Interclaseaz este O(lg n). Fiecare iteraie a ciclului ct timp se execut ntr-un timp O(1)
i pot exista cel mult lg n
1
| + lg n
2
| + 2 iteraii deoarece de la ecare iteraie e pointerii
avanseaz cu o poziie n lista H, e se elimin o rdcin din lista de rdcini. Astfel, timpul
total de execuie este O(lg n).
Inserarea unui nod
Procedura urmtoare insereaz nodul x n heap-ul binomial H. Se presupune c nodul x este
creat i cmpul cheie[x] este iniializat.
Heap-Binomial-Insereaz(H, x)
1: H
t
Creeaz-Heap-Binomial()
2: p[x] nil
3: [x] nil
4: [x] nil
5: [x] 0
6: [H
t
] x
7: H Heap-Binomial-Reunete(H, H
t
)
Procedura creeaz un heap binomial H
t
cu un nod ntr-un timp O(1) pe care l reunete
apoi cu heap-ul binomial H avnd n noduri ntr-un timp O(lg n). Procedura Heap-Binomial-
Reunete elibereaz spaiul alocat heap-ului binomial temporar H
t
. (O implementare direct
care nu folosete Heap-Binomial-Reunete se cere n exerciiul 20.2-8.)
Extragerea nodului avnd cheia minim
Procedura urmtoare extrage nodul avnd cheia minim din heap-ul binomial H i returneaz
un pointer la nodul extras.
Heap-Binomial-Extrage-Min(H)
1: caut rdcina x cu cheia minim n lista de rdcini i terge x din lista de rdcini a lui H
2: H
t
Creeaz-Heap-Binomial()
3: inverseaz ordinea memorrii ilor lui x n lista nlnuit asociat i atribuie lui [H
t
]
capul listei rezultate
4: H Heap-Binomial-Reunete(H, H
t
)
5: returneaz x
356 Capitolul 20 Heap-uri binomiale
Figura 20.7 Aciunile procedurii Heap-Binomial-Extrage-Min. (a) Un heap binomial H. (b) R-
dcina x avnd cheia minim este eliminat din lista de rdcini a lui H. (c) Lista nlnuit ce conine
ii lui x este inversat, obinndu-se un alt heap binomial H

. (d) Rezultatul reunirii heap-urilor H i


H

.
20.2. Operaii pe heap-uri binomiale 357
Modul de funcionare al procedurii este ilustrat n gura 20.7. Heap-ul binomial H dat ca
parametru de intrare este ilustrat n gura 20.7(a). Figura 20.7(b) prezint situaia obinut
dup linia 1: rdcina x avnd cheia minim a fost eliminat din lista de rdcini a lui H. Dac
x este rdcina unui arbore B
k
, atunci din proprietatea 4 a lemei 20.1 rezult c ii lui x, de la
stnga la dreapta, sunt rdcinile unor arbori B
k1
, B
k2
, . . ., B
0
. n gura 20.7(c) se ilustreaz
faptul c inversnd lista ilor lui x (n linia 3) obinem un heap binomial H
t
care conine toate
nodurile din arborele corespunztor lui x, exceptndu-l pe x. Deoarece n linia 1 arborele lui x
este ters din H, heap-ul binomial rezultat prin reunirea n linia 4 a lui H i H
t
, conform gurii
20.7(d), va conine toate nodurile care existau iniial n H, exceptndu-l desigur pe x. n nal,
n linia 5 se returneaz x.
Heap-Binomial-Extrage-Min se execut ntr-un timp O(lg n) deoarece ecare din liniile
14 se execut ntr-un timp O(lg n).
Descreterea unei chei
Procedura Heap-Binomial-Descrete-Cheie micoreaz valoarea cheii nodului x din
heap-ul binomial H, atribuindu-i valoarea k. Dac k este mai mare dect valoarea curent a
cheii lui x, se semnaleaz o eroare.
Heap-Binomial-Descrete-Cheie(H, x, k)
1: dac k > [x] atunci
2: eroare cheia nou este mai mare dect cheia existent
3: [x] k
4: y x
5: z p[y]
6: ct timp z = nil i [y] < [z] execut
7: interschimb [y] [z]
8: Dac y i z au i alte cmpuri atunci interschimb i aceste cmpuri.
9: y z
10: z p[y]
Aceast procedur descrete o cheie n mod similar cu metoda aplicat pentru un heap binar:
prin ridicarea cheii n heap, dup cum arat gura 20.8. Dup ce procedura se asigur c noua
cheie nu este mai mare dect cea curent i apoi actualizeaz cheia curent a lui x, urmeaz
un proces de cutare n sus, iar y refer iniial nodul x. La ecare iteraie a ciclului ct timp,
n liniile 610, se compar [y] cu cheia printelui z a lui y. Dac y este chiar rdcina sau
cheie[y] cheie[z], atunci arborele binomial este un heap ordonat. n caz contrar nodul y ncalc
proprietatea de ordonare pentru heap, astfel cheile lui y i z se interschimb, mpreun cu alte
informaii, apoi procedura deplaseaz y i z cu un nivel mai sus n arbore i continu iteraiile.
Timpul de execuie Heap-Binomial-Descrete-Cheie este O(lg n). Numrul maxim de
iteraii pentru ciclul ct timp (liniile 610) este lg n| deoarece, din proprietatea 2 a lemei 20.1
rezult c nlimea maxim a lui x este lg n|.
tergerea unei chei
tergerea cheii i a altor informaii asociate unui nod x aparinnd unui heap binomial H
se poate desfura fr dicultate ntr-un timp O(lg n). Implementarea urmtoare presupune c
358 Capitolul 20 Heap-uri binomiale
Figura 20.8 Aciunile procedurii Heap-Binomial-Descrete-Cheie. (a) Situaia nainte de linia
5 la prima iteraie a ciclului ct timp. Cheia nodului y este micorat la 7, valoare mai mic dect
a cheii printelui z a lui y. (b) Cheile celor dou noduri sunt interschimbate; este ilustrat situaia
existent nainte de linia 5 la iteraia a doua. Pointerii y i z au fost mutai cu un nivel mai sus n
arbore, dar nc este nclcat proprietatea de ordonare a heap-ului. (c) Dup o interschimbare i o
deplasare a pointerilor n arbore mai sus cu un nivel, constatm c proprietatea de ordonare a heap-ului
este satisfcut, deci ciclul ct timp se ncheie.
nodurile din heap-ul binomial nu au chei avnd valoarea .
Heap-Binomial-terge(H, x)
1: Heap-Binomial-Descrete-Cheie(H, x, )
2: Heap-Binomial-Extrage-Min(H)
Dup ce n procedura Heap-Binomial-terge se atribuie valorea cheii nodului x,
acesta devine nodul avnd cheia minim n heap-ul binomial. (Exerciiul 20.2-6 trateaz situaia
n care nu poate valoarea unei chei, nici mcar temporar.) Urmeaz apoi ca aceast cheie i
eventual alte informaii asociate s e ridicate pn la o rdcin prin apelul Heap-Binomial-
Descrete-Cheie. Aceast rdcin este apoi eliminat din H prin apelul Heap-Binomial-
Extrage-Min.
Timpul de execuie pentru Heap-Binomial-terge este O(lg n).
Probleme 359
Exerciii
20.2-1 Dai un exemplu de dou heap-uri ecare avnd n elemente, astfel nct Creeaz-
Heap s necesite un timp (n) pentru a concatena tablourile heap-urilor.
20.2-2 Descriei n pseudocod operaia Heap-Binomial-Interclaseaz.
20.2-3 Determinai heap-ul binomial care rezult dup inserarea unui nod avnd cheia 24 n
heap-ul binomial din gura 20.7(d).
20.2-4 Determinai heap-ul binomial care rezult dup tergerea nodului avnd cheia 28 din
heap-ul binomial prezentat n gura 20.8(c).
20.2-5 Explicai de ce procedura Heap-Binomial-Min nu funcioneaz corect n cazul n care
pot exista chei avnd valoarea . Rescriei procedura astfel nct s funcioneze corect i n
aceste cazuri.
20.2-6 Presupunem c nu putem reprezenta valoarea pentru o cheie. Rescriei procedura
Heap-Binomial-terge astfel nct s funcioneze corect n aceast situaie. Timpul de
execuie ar trebui pstrat de asemenea O(lg n).
20.2-7 Examinai relaia ntre inserarea ntr-un heap binomial i incrementarea unui numr
binar i de asemenea, relaia ntre reunirea a dou heap-uri binomiale i adunarea a dou numere
binare.
20.2-8 Lund n considerare exerciiul 20.2-7, rescriei Heap-Binomial-Insereaz pentru a
insera un nod ntr-un heap binomial direct, fr a apela Heap-Binomial-Reunete.
20.2-9 Artai c dac listele de rdcini sunt pstrate n ordine strict descresctoare dup
grad (n locul ordinii strict cresctoare), atunci ecare operaie a heap-urilor binomiale poate
implementat fr a modica timpul de execuie.
20.2-10 Gsii intrri potrivite pentru Heap-Binomial-Extrage-Min, Heap-Binomial-
Descrete-Cheie i Heap-Binomial-terge astfel nct acestea s se execute ntr-un timp
(lg n). Explicai de ce timpii de execuie n cazurile cele mai defavorabile pentru Heap-
Binomial-Insereaz, Heap-Binomial-Min i Heap-Binomial-Reunete sunt

(lg n) i
nu (lg n). (A se vedea problema 2-5.)
Probleme
20-1 Heap-uri 2-3-4
Capitolul 19 a introdus arborii 2-3-4, n care ecare nod intern (nod diferit de rdcin) are doi,
trei sau patru i i toate nodurile frunz sunt la aceeai adncime. n aceast problem vom
implementa heap-uri 2-3-4 pentru care se denesc operaiile pe heap-uri interclasabile.
360 Capitolul 20 Heap-uri binomiale
Heap-urile 2-3-4 difer de arborii 2-3-4 dup cum urmeaz. ntr-un heap 2-3-4 doar nodurile
frunz memoreaz chei, ecare frunz x memornd o singur cheie cheie[x]. Cheile nu sunt
memorate ordonat n frunze; adic, de la stnga spre dreapta cheile pot aprea n orice ordine.
Fiecare nod intern x conine o valoare mic[x] care este egal cu cea mai mic cheie memorat
n frunzele subarborelui cu rdcina x. Rdcina r conine un cmp [r] care reprezint
nlimea arborelui. n sfrit, un heap 2-3-4 va pstrat n memorie, astfel c operaiile de
citire i scriere nu sunt necesare.
Implementai operaiile urmtoare pe heap-uri 2-3-4. Fiecare operaie din lista (a)(e) trebuie
s se execute pe un heap 2-3-4 avnd n elemente ntr-un timp O(lg n). Operaia Reunete
specicat la punctul (f) trebuie s se execute ntr-un timp O(lg n), unde n este numrul de
elemente din heap-urile date ca intrare.
a. Minimum returneaz un pointer la frunza cu cea mai mic cheie.
b. Descrete-Cheie descrete cheia unei frunze date x la o valoare k [x].
c. Insereaz care insereaz frunza x avnd cheia k.
d. terge care terge o frunz dat x.
e. Extrage-Min care extrage frunza avnd cheia cea mai mic.
f. Reunete care reunete dou heap-uri 2-3-4, returnnd un singur heap 2-3-4 i distru-
gnd heap-urile date ca intrare.
20-2 Algoritmul arborelui de acoperire minim folosind heap-uri interclasabile
Capitolul 24 prezint doi algoritmi pentru gsirea unui arbore de acoperire minim pentru un graf
neorientat. Vom vedea cum se pot folosi heap-uri interclasabile pentru a obine nc un algoritm
de determinare a arborelui de acoperire minim.
Fie un graf neorientat G = (V, E) cu o funcia de cost w : E R. Vom numi w(u, v), costul
asociat muchiei (u, v). Dorim s gsim un arbore parial de cost minim pentru G: o submulime
aciclic T E care unete toate vrfurile din V i al crei cost total w(T) este minim, unde
w(T) =

(u,v)T
w(u, v).
AAM-Heap-Interclasabil(G)
1: T
2: pentru ecare vrf v
i
V [G] execut
3: V
i
v
i

4: E
i
(v
i
, v) E[G]
5: ct timp exist mai mult dect o mulime V
i
execut
6: alege oricare din mulimile V
i
7: extrage muchia (u, v) de pondere minim din E
i
8: fr a pierde generalitatea presupunem c u V
i
i v V
j
9: dac i = j atunci
10: T T (u, v)
11: V
i
V
i
V
j
, distrugnd V
j
12: E
i
E
i
E
j
Note bibliograce 361
Procedura precedent, descris n pseudocod, construiete un arbore de acoperire minim T.
Demonstrarea corectitudinii ei se poate face cu metoda descris n seciunea 24.1. Procedura
construiete o partiie V
i
de vrfuri ale lui V i pentru ecare V
i
, o mulime
E
i
(u, v) : u V
i
sau v V
i

de muchii incidente vrfurilor din V


i
.
Descriei cum se poate implementa acest algoritm folosind operaiile pe heap-uri interclasabile
prezentate n gura 20.1. Calculai timpul de execuie pentru implementarea gsit, presupunnd
c operaiile pe heap-uri interclasabile sunt implementate de heap-urile binomiale.
Note bibliograce
Heap-urile binomiale au fost introduse n 1978 de Vuillemin [196]. Brown [36, 37] a studiat
n detaliu proprietile acestora.
21 Heap-uri Fibonacci
Am vzut n capitolul 20 c heap-urile binomiale suport operaiile Insereaz, Minim,
Extrage-Min i Reunete, plus operaiile Descrete-Cheie i terge cu un timp de
execuie, n cazul cel mai defavorabil, de O(lg n). n acest capitol vom examina heap-urile
Fibonacci care suport aceleai operaii i au avantajul c operaiile care nu implic tergerea
unui element, se execut ntr-un timp amortizat O(1).
Heap-urile Fibonacci sunt preferabile, din punct de vedere teoretic, atunci cnd numrul
operaiilor Extrage-Min i terge este relativ mic n raport cu celelalte operaii efectuate.
Aceast situaie se regsete n multe aplicaii. De exemplu, muli algoritmi pentru probleme pe
grafuri apeleaz Descrete-Cheie o singur dat pentru ecare muchie. Pentru grafuri dense,
care au muchii multe, timpul amortizat O(1), pentru ecare apel Descrete-Cheie nseamn
o mbuntire considerabil n raport cu (lg n), timpul, n cazul cel mai defavorabil, pentru
implementrile prin heap-uri binare sau binomiale. Pentru probleme ca i calcularea arborilor de
acoperire minim (capitolul 24) i determinarea drumurilor de lungim minim de surs unic
(capitolul 25), algoritmii actuali cei mai rapizi (asimptotic) folosesc heap-uri Fibonacci.
Totui, din punct de vedere practic, factorii constani i complexitatea programrii heap-urilor
Fibonacci fac ca pentru multe aplicaii s e preferate heap-urile binare obinuite (sau k-are)
n locul celor Fibonacci. Astfel, heap-urile Fibonacci prezint, n special, un interes teoretic.
Descoperirea unei structuri de date mai simpl dar care s aib margini amortizate de timp la
fel ca i heap-urile Fibonacci, ar de o importan practic considerabil.
Un heap Fibonacci, la fel ca i un heap binomial, este format dintr-o colecie de arbori. Heap-
urile Fibonacci se bazeaz de fapt pe heap-uri binomiale. Dac pe un heap Fibonacci nu sunt
invocate niciodat Descrete-Cheie i terge, atunci ecare arbore din heap este asemntor
unui arbore binomial. Heap-urile Fibonacci difer totui de heap-urile binomiale prin faptul c
au o structur mai relaxat, permind astfel o mbuntire asimptotic a marginilor de timp.
ntreinerea structurii poate amnat pn cnd acest lucru se poate efectua convenabil.
Heap-urile Fibonacci se constituie a , la fel ca i tabelele dinamice din seciunea 18.4, un
exemplu bun de structur de date proiectat avnd n vedere o analiz amortizat. Metoda de
potenial din seciunea 18.3 va constitui n cele ce urmeaz suportul intuiiei i analizei operaiilor
pe heap-uri Fibonacci.
Expunerea din acest capitol presupune c ai parcurs capitolul 20 despre heap-uri binomiale.
Specicarea operaiilor este dat n acel capitol, iar tabelul din gura 20.1 prezint i marginile
de timp pentru operaiile pe heap-uri binare, binomiale i Fibonacci. n prezentarea structurii
unui heap Fibonacci ne vom baza pe structura de heap binomial. Vei observa c unele operaii
efectuate pe heap-uri Fibonacci sunt similare cu cele efectuate pe heap-uri binomiale.
La fel ca i heap-urile binomiale, heap-urile Fibonacci nu sunt proiectate pentru a oferi un
suport ecient operaiei Caut; operaiile care se refer la un anumit nod vor necesita astfel un
pointer la acel nod.
Seciunea 21.1 denete heap-urile Fibonacci, discut reprezentarea lor i prezint funcia de
potenial care va folosit n analiza amortizat. Seciunea 21.2 prezint modul de implementare
a operaiilor pe heap-uri interclasabile, astfel nct s obinem marginile de timp prezentate
n gura 20.1. Cele dou operaii rmase, Descrete-Cheie i terge, sunt prezentate n
seciunea 21.3. La nal, seciunea 21.4 ncheie o parte esenial a analizei.
21.1. Structura heap-urilor Fibonacci 363
21.1. Structura heap-urilor Fibonacci
Similar cu un heap binomial, un heap Fibonacci este o colecie de arbori care au proprietatea
de ordonare de heap. Totui, arborii dintr-un heap Fibonacci nu trebuie s e arbori binomiali.
Figura 21.1(a) prezint un exemplu de heap Fibonacci.
Spre deosebire de arborii dintr-un heap binomial, care sunt ordonai, arborii aparinnd unui
heap Fibonacci sunt arbori cu rdcin, dar neordonai. Dup cum prezint gura 21.1(b), ecare
nod x conine un pointer p[x] spre printele lui i un pointer [x] la unul din ii lui. Fiii lui
x sunt nlnuii circular printr-o list dublu nlnuit, numit lista ilor lui x. Fiecare u y
dintr-o list de i are pointerii [y] i [y] care indic fratele stng, respectiv drept al
lui y. Dac nodul y este singurul u, atunci [y] = [y] = y. Ordinea n care apar ii
n lista de i este arbitrar.
Folosirea listelor dublu nlnuite i circulare (a se vedea seciunea 11.2) pentru heap-uri
Fibonacci au dou avantaje. n primul rnd, putem terge un nod dintr-o list dublu nlnuit
i circular ntr-un timp O(1). n al doilea rnd, putem concatena dou liste de acest tip, obinnd
o singur list dublu nlnuit i circular tot ntr-un timp O(1). n descrierea operaiilor pe
heap-uri Fibonacci ne vom referi informal la aceste operaii pe liste, lsnd cititorul s completeze
detaliile lor de implementare.
Fiecare nod va conine nc dou cmpuri utile. Numrul de i din lista ilor nodului x este
memorat n [x]. Cmpul de tip boolean [x] va indica dac nodul x a pierdut un u
dup ultima operaie n care x a fost transformat n ul unui alt nod. Pn n seciunea 21.3 nu
ne vom ngriji de marcarea nodurilor. Nodurile nou create sunt nemarcate, iar un nod x devine
nemarcat atunci cnd este transformat n ul unui alt nod.
Un heap Fibonacci H este referit printr-un pointer [H] al rdcinii arborelui care conine
cheia minim; acest nod este numit nodul minim al heap-ului Fibonacci. Dac un heap
Fibonacci este vid atunci [H] = nil.
Rdcinile tuturor arborilor dintr-un heap Fibonacci sunt nlnuite prin pointerii i
, formnd o list dublu nlnuit i circular, numit list de radcini a heap-ului
Fibonacci. Astfel, pointerul [H] indic acel nod din lista de rdcini care are cheia minim.
Ordinea nodurilor n lista de rdcini este arbitrar.
Un atribut pe care ne vom baza este i numrul nodurilor n[H] al unui heap Fibonacci H.
Funcia de potenial
Dup cum am menionat, vom folosi n analiza complexitii operaiilor pe heap-uri Fibonacci
metoda de potenial din seciunea 18.3. Pentru un heap Fibonacci H, vom indica prin t(H)
numrul rdcinilor din lista de rdcini a lui H, iar prin m(H) numrul nodurilor marcate din
H. Potenialul unui heap Fibonacci este denit prin
(H) = t(H) + 2m(H). (21.1)
De exemplu, potenialul heap-ului Fibonacci din gura 21.1 este 5 + 2 3 = 11. Potenialul unei
mulimi de heap-uri Fibonacci este egal cu suma potenialelor heap-urilor Fibonacci coninute.
Vom presupune c o unitate de potenial corespunde unui volum de calcul constant, cu o
constant sucient de mare care acoper orice calcul necesar care se execut ntr-un timp
constant.
364 Capitolul 21 Heap-uri Fibonacci
Figura 21.1 (a) Un heap Fibonacci constnd din cinci arbori, ce satisfac proprietatea de heap ordonat,
i care este din 14 noduri. Linia punctat indic lista de rdcini. Nodul care conine valoarea 3 este
nodul minim din heap. Nodurile marcate sunt haurate cu negru. Potenialul acestui heap Fibonacci
este 5 + 2 3 = 11. (b) O reprezentare mai complet care arat pointerii p (sgeile orientate n sus),
u (sgeile n jos), i stng i drept (sgeile laterale). Aceste detalii vor omise n celelelalte guri ale
capitolului, deoarece toate informaiile prezentate aici pot determinate din ceea ce apare n partea (a).
Vom presupune c aplicaiile pentru heap-uri Fibonacci nu pornesc de la nici un heap. Astfel,
potenialul iniial este 0 i conform ecuaiei (21.1), potenialul este nenegativ la orice moment
de timp ulterior. Din ecuaia (18.2), o margine superioar a costului amortizat total este i o
margine superioar a costului actual pentru secvena de operaii.
Grad maxim
n seciunile urmtoare ale capitolului vom efectua o analiz amortizat care se va baza pe
cunoaterea unei margini superioare D(n) a gradului maxim al oricrui nod dintr-un arbore
Fibonacci avnd n noduri. Exerciiul 21.2-3 arat c D(n) = lgn| atunci cnd avem doar
operaii de interclasare pe heap-uri. n seciunea 21.3 vom arta c, dac includem i operaiile
Descrete-Cheie i terge, D(n) = O(lg n).
21.2. Operaiile heap-urilor interclasabile
n aceast seciune vom descrie i analiza operaiile heap-urilor interclasabile precum i im-
plementri pe heap-uri Fibonacci. Dac se au n vedere doar aceste operaii Creeaz-Heap,
Insereaz, Minim, Extrage-Min i Reunete ecare heap Fibonacci este o colecie de
arbori binomiali neordonai. Un arbore binomial neordonat este asemntor unui arbore
binomial i se denete de asemenea recursiv. Arborele binomial neordonat U
0
const dintr-un
singur nod, iar un arbore binomial neordonat U
k
const din doi arbori binomiali neordonai U
k1
,
21.2. Operaiile heap-urilor interclasabile 365
rdcina unuia din ei ind ( ) u al rdcinii celuilalt. Proprietile arborilor binomiali
lema 20.1, sunt adevrate i pentru arborii binomiali neordonai, nlocuind ns proprietatea 4
(a se vedea exerciiul 21.2-2) cu:
4. Gradul rdcinii arborelui binomial neordonat U
k
este k, grad mai mare dect al oricrui
alt nod. ntr-o ordine oarecare, descendenii rdcinii sunt rdcinile unor subarbori U
0
,
U
1
, . . ., U
k1
.
Astfel, deoarece un heap Fibonacci avnd n noduri este o colecie de arbori binomiali neordonai,
D(n) = lg n.
Ideea de baz, aplicat la denirea operaiilor heap-urilor interclasabile pe heap-uri Fibonacci
este de a ntrzia prelucrrile ct se poate de mult. Obinerea unor operaii performante poate
n detrimentul altora. Dac numrul arborilor unui heap Fibonacci este mic, atunci nodul
minim necesar operaiei Extrage-Min este determinat ecient. Dar, dup cum s-a vzut i
pentru heap-uri binomiale exerciiul 20.2-10, costul asigurrii unui numr mic de arbori este
ridicat: pentru inserarea unui nod ntr-un heap binomial, sau pentru reuniunea a dou heap-uri
binomiale, timpul de execuie se poate ridica pn la (lg n). Dup cum se va vedea, la inserarea
unui nod nou sau la reuniunea a dou heap-uri nu vom ncerca s consolidm arborii din heap-ul
Fibonacci. Consolidarea va lsat n seama operaiei Extrage-Min, operaie care necesit
gsirea nodului minim.
Crearea unui heap Fibonacci
Pentru a crea un heap Fibonacci vid, procedura Creeaz-Heap-Fib, creeaz i returneaz
un obiect heap Fibonacci H, cu n[H] = 0 i [H] = nil; H nu conine arbori. Deoarece
t(H) = 0 i m(H) = 0, potenialul heap-ului Fibonacci vid este (H) = 0. Costul amortizat al
operaiei Creeaz-Heap-Fib este astfel egal cu costul ei actual O(1).
Inserarea unui nod
Procedura urmtoare insereaz nodul x n heap-ul Fibonacci H, presupunnd c nodul a fost
alocat n prealabil i c [x] a fost de asemenea iniializat.
Heap-Fib-Insereaz(H, x)
1: [x] 0
2: [x] nil
3: [x] nil
4: [x] x
5: [x] x
6: [x] fals
7: concateneaz lista de rdcini care l conine pe x cu lista de rdcini a lui H
8: dac [H] = nil sau [x] < [ [H]] atunci
9: [H] x
10: n[H] n[H] + 1
Dup iniializarea cmpurilor nodului x n liniile 16, fcndu-l circular i dublu nlnuit,
n linia 7 x este adugat listei de rdcini a lui H ntr-un timp actual O(1). Astfel nodul x
devine un arbore cu un singur nod i care are proprietatea de ordonare de heap, deci un arbore
366 Capitolul 21 Heap-uri Fibonacci
Figura 21.2 Inserarea unui nod ntr-un ansaamblu Fibonacci. (a) Un heap Fibonacci H (b) Heap-ul
Fibonacci H dup ce nodul avnd cheia 21 a fost inserat. Nodul devine un arbore cu proprietatea de
heap i este apoi adugat listei de rdcini, devenind fratele stng al rdcinii.
binomial neordonat aparinnd heap-ului Fibonacci. Acest arbore nu are i i nu este marcat. n
continuare n liniile 89 este actualizat, dac este necesar, pointerul la nodul minim din heap-ul
Fibonacci H. n nal, linia 10 incrementeaz n[H] marcnd inserarea unui nod nou. Figura 21.2
prezint inserarea nodului avnd cheia 21 n heap-ul Fibonacci din gura 21.1.
Spre deosebire de Heap-Binomial-Insereaz, Heap-Fib-Insereaz nu consolideaz ar-
borii din heap-ul Fibonacci. Dac procedura Heap-Fib-Insereaz este apelat consecutiv de
k ori atunci se adaug listei de rdcini k arbori cu un singur nod.
Pentru a determina costul amortizat al operaiei Heap-Fib-Insereaz, e H heap-ul
Fibonacci dat ca intrare i H
t
heap-ul Fibonacci rezultat. Atunci t(H
t
) = t(H) + 1 i m(H
t
) =
m(H) i creterea potenialului este
((t(H) + 1) + 2m(H)) (t(h) + 2m(H)) = 1.
Deoarece costul actual este O(1), costul amortizat este O(1) + 1 = O(1).
Gsirea nodului minim
Nodul minim al unui heap Fibonacci H este dat de pointerul [H], de unde costul actual
al operaiei este O(1). Deoarece potenialul lui H nu se schimb, costul amortizat al operaiei
este egal cu costul ei actual O(1).
Reuniunea a dou heap-uri Fibonacci
Procedura urmtoare reunete heap-urile Fibonacci H
1
i H
2
, distrugnd H
1
i H
2
n timpul
desfurrii procesului.
Heap-Fib-Reunete(H
1
, H
2
)
1: H Creeaz-Heap-Fib
2: [H] [H
1
]
3: concateneaz lista de rdcini a lui H
2
cu lista de rdcini a lui H
4: dac ( [H
1
] = nil) sau ( [H
2
] = nil i [H
2
] < [H
2
]) atunci
5: [H] [H
2
]
6: n[H] n[H
1
] +n[H
2
]
7: elibereaz obiectele H
1
i H
2
8: returneaz H
21.2. Operaiile heap-urilor interclasabile 367
Liniile 13 concateneaz listele de rdcini ale lui H
1
i H
2
obinndu-se o list de rdcini
nou H. Liniile 2, 4 i 5 stabilesc nodul minim al lui H, iar linia 6 iniializeaz n[H] cu num-
rul total de noduri. Obiectele H
1
i H
2
sunt dealocate n linia 7, iar linia 8 returneaz heap-ul
Fibonacci H rezultat. Arborii nu sunt consolidai, la fel ca i n procedura Heap-Fib-Insereaz.
Potenialul rmne neschimbat i anume:
(H) ((H
1
) + (H
2
))
= (t(H) + 2m(H)) ((t(H
1
) + 2m(H
1
)) + (t(H
2
) + 2m(H
2
))) = 0,
deoarece t(H) = t(H
1
) +t(H
2
) i m(H) = m(H
1
) +m(H
2
). Costul amortizat al operaiei Heap-
Fib-Reunete este astfel egal cu costul actual O(1).
Extragerea nodului minim
Procesul de extragere al nodului minim este cel mai complicat dintre toate operaiile prezenta-
te n aceast seciune. Consolidarea arborilor din lista de rdcini este efectuat n cadrul acestei
operaii. Urmtorul algoritm scris n pseudocod extrage nodul minim. Algoritmul presupune c
atunci cnd se terge un nod dintr-o list nlnuit, pointerii rmai n list sunt actualizai,
dar pointerii din nodul eliminat sunt lsai neschimbai. n algoritm se folosete o procedur
auxiliar Consolideaz care va prezentat pe scurt.
Heap-Fib-Extrage-Min(H)
1: z [H]
2: dac z = nil atunci
3: pentru ecare u x al lui z execut
4: adaug x la lista de rdcini a lui H
5: p[x] nil
6: terge z din lista de rdcini a lui H
7: dac z = [z] atunci
8: [H] nil
9: altfel
10: [H] [z]
11: Consolideaz(H)
12: n[H] n[H] 1
13: returneaz z
Conform gurii 21.3, procedura Heap-Fib-Extrage-Min rupe legturile ntre nodul rd-
cin minim respectiv ii si i terge nodul minim din lista de rdcini. Apoi consolideaz lista
de rdcini prin nlnuirea rdcinilor de acelai grad, pn cnd rmne cel mult o rdcin
de ecare grad.
Pornim n linia 1 prin reinerea unui pointer z la nodul minim; n nal se va returna acest
pointer. Dac z = nil atunci heap-ul Fibonacci H este vid i prelucarea este ncheiat. n caz
contrar, la fel ca i n procedura Heap-Binomial-Extrage-Min, nodul z este ters din H n
liniile 35 prin transformarea ilor lui z n rddcini) i tergerea lui z din lista de rdcini
(linia 6). Dac z = [z] atunci z fusese singurul nod din lista de rdcini i nu avusese nici
un u, astfel nct, mai nti, trebuie s facem heap-ul H vid, nainte. n caz contrar, stabilim
pointerul [H] n lista de rdcini astfel nct s indice nodul minim rmas (n acest caz,
368 Capitolul 21 Heap-uri Fibonacci
Figura 21.3 Aciunile procedurii Heap-Fib-Extrage-Min. (a) Un heap Fibonacci H. (b) Situaia
obinut dup tergerea nodului minim z din lista de rdcini i adugarea la lista de rdcini a ilor lui
z. (c)(e) Tabloul A i arborii dup primele trei iteraii ale ciclului pentru din liniile 313 ale procedurii
Consolideaz. Lista de rdcini este procesat pornind de la nodul minim i urmnd pointerii dreapta.
Fiecare parte arat valorile lui w i x la sfritul unei iteraii. (f )(h) Iteraia urmtoare a ciclului
pentru, cu valorile lui w i x obinute la sfritul ecrei iteraii a ciclului ct timp din liniile 6
12. Partea (f) arat situaia obinut la prima trecere prin ciclul ct timp. Nodul cu cheia 23 a fost
legat la nodul avnd cheia 7, nod care este indicat acum de x. n partea (g) nodul avnd cheia 17 a
fost legat la nodul avnd cheia 7, spre care nc indic x. n partea (h) nodul avnd cheia 24 a fost
legat la nodul avnd cheia 7. Deoarece A[3] nu indic nici un nod, la sfritul iteraiei ciclului pentru
A[3] va indica rdcina arborelui rezultat. (i)(l) Situaia obinut dup urmtoarele patru iteraii ale
ciclului ct timp. (m) Heap-ul Fibonacci H dup reconstruirea listei de rdcini din tabloul A i dup
determinarea pointerului min[H].
21.2. Operaiile heap-urilor interclasabile 369
dreapta[z]) diferit de z. Figura 21.3(b) prezint heap-ul Fibonacci din gura 21.3(a) dup
executarea instruciunii din linia 9.
Pasul urmtor n care reducem numrul de arbori din heap-ul Fibonacci const n consolida-
rea listei de rdcini a lui H; acesta este efectuat prin apelul Consolideaz(H). Consolidarea
listei de rdcini const din efectuarea repetat a pailor urmtori, pn cnd ecare rdcin
din lista de rdcini are o valoare distinct pentru su.
1. Gsete dou rdcini x i y din lista de rdcini avnd acelai grad i [x] [y].
2. nlnuie y la x: terge y din lista de rdcini i include nodul y printre ii lui x. A-
ceast operaie este efecuat prin procedura Heap-Fib-nlnuie. Cmpul [x] este
incrementat, iar marcajul nodului y, dac exist, este ters.
Procedura Consolideaz folosete un tablou auxiliar A[0..D(n[H])]; dac A[i] = y atunci y
este o rdcin cu grad[y] = i. Aceasta funcioneaz dup cum urmeaz. n liniile 12 se iniiali-
zeaz A atribuind ecrui element valoarea nil. Procesarea ecrui nod w se ncheie cu un nod
x care poate , sau nu, identic cu w. Astfel, elementele tabloului A[ [x]] sunt iniializate cu
x. n ciclul pentru din liniile 313 este examinat ecare nod w din lista de rdcini. Invariantul
la ecare iteraie n ciclul for este c nodul x este rdcina acelui arbore care conine nodul w.
Consolideaz(H)
370 Capitolul 21 Heap-uri Fibonacci
1: pentru i 0, D(n[H]) execut
2: A[i] nil
3: pentru ecare nod w din lista de rdcini a lui H execut
4: x w
5: d [x]
6: ct timp A[d] = nil execut
7: y A[d]
8: dac [x] > [y] atunci
9: interschimb x y
10: Heap-Fib-nlnuie(H, y, x)
11: A[d] nil
12: d d + 1
13: A[d] x
14: [H] nil
15: pentru i 0, D(n[H]) execut
16: dac A[i] = nil atunci
17: adaug A[i] listei de rdcini a lui H
18: dac [H] = nil sau [A[i]] < [ [H]] atunci
19: [H] A[i]
Heap-Fib-nlnuie(H, y, x)
1: terge y din lista de rdcini a lui H
2: nlnuie y ca u al lui x i incrementeaz [x]
3: [x] fals
Ciclul ct timp din liniile 612 are predicatul invariant d = [x] (cu excepia liniei 11 dup
cum vom vedea imediat). La ecare iteraie a ciclului ct timp A[d] indic o anumit rdcin
y. Deoarece d = [x] = [y], vom nlnui x i y. Cel care are cheia mai mic dintre x i
y devine printele celuilalt, n urma operaiei de nlnuire; astfel dac este necesar, pointerii x
i y sunt interschimbai n liniile 89. n continuare y este legat la x prin apelul din linia 10,
Heap-Fib-nlnuie(H, y, x). n urma apelului, [x] este incrementat, iar [y] rmne
d. Deoarece nodul y nu mai este rdcin, pointerul spre el din tabloul A este ters n linia 11.
Deoarece dup apelul Heap-Fib-nlnuie valoarea [x] este incrementat, n linia 12 este
restabilit proprietatea invariantului d = [x]. Ciclul ct timp este executat repetat pn
cnd A[d] = nil, situaie n care nu exist alte rdcini avnd acelai grad ca i x. n linia
13 iniializm A[d] cu x i efectum iteraia urmtoare a ciclului pentru. Figurile 21.3(c)(e)
prezint tabloul A i arborii rezultai dup primele trei iteraii ale ciclului pentru din liniile
313. La iteraia urmtoare a ciclului pentru sunt realizate trei legturi; rezultatele lor se pot
vedea n gurile 21.3(f)(h). Figurile 21.3(i)(l) prezint rezultatele urmtoarelor patru iteraii
ale ciclului pentru.
Rmne s denitivm operaiile ncepute. Dup execuia ciclului pentru din liniile 313,
linia 14 videaz lista de rdcini iar n liniile 1519 aceasta este reconstruit. Heap-ul Fibonacci
rezultat este redat n gura 21.3(m). Dup consolidarea listei de rdcini, operaiile efectuate de
Heap-Fib-Extrage-Min se ncheie cu decrementarea valorii n[H] n linia 11 i returnarea n
linia 12 a unui pointer la nodul ters z.
Observm c dac anterior apelului Heap-Fib-Extrage-Min toi arborii din heap-ul
21.2. Operaiile heap-urilor interclasabile 371
Fibonacci sunt arbori binomiali neordonai, atunci arborii rezultai dup apel sunt de asemenea
binomiali neordonai. Arborii sunt modicai n dou feluri. n primul rnd, n liniile 35 din
Heap-Fib-Extrage-Min, ecare u x al rdcinii z devine o rdcin. Conform exerciiului
21.2-2 ecare arbore nou va un arbore binomial neordonat. n al doilea rnd, arborii sunt
nlnuii prin Heap-Fib-nlnuie doar dac sunt de acelai grad. Deoarece nainte de crearea
legturilor toi arborii sunt binomiali i neordonai, cei doi arbori cu k i au ecare o structur
de tip U
k
. Rezult c arborele obinut va avea o structur U
k+1
.
Acum vom arta c extragerea nodului minim dintr-un heap Fibonacci avnd n noduri are
un cost amortizat O(D(n)). Fie H heap-ul Fibonacci pentru care aplicm operaia Heap-Fib-
Extrage-Min.
Calcularea costului actual al extragerii nodului minim poate fcut dup cum urmeaz. O
contribuie O(D(n)) provine din faptul c nodul minim are cel mult D(n) i care sunt procesai
de Heap-Fib-Extrage-Min i din calcululele efectuate n liniile 12 i 1419 n procedura
Consolideaz. Ne rmne s analizm contribuia din partea ciclului pentru din liniile 313.
Dup apelul procedurii Consolideaz lungimea listei de rdcini este cel mult D(n)+t(H)1,
deoarece const din nodurile iniiale ale listei n numr de t(H), mai puin nodul rdcin extras
i plus numrul ilor nodului extras care pot cel mult D(n). De ecare dat, n ciclul ct
timp din liniile 612 una din rdcini este nlnuit cu alta, astfel calculul total efectuat de
ciclul pentru este cel mult proporional cu D(n) + t(H). Astfel, timpul total de execuie este
O(D(n) +t(H)).
naintea extragerii nodului minim potenialul este t(H) + 2m(H), iar dup extragere acesta
este cel mult egal cu (D(n) + 1) + 2m(H), deoarece rmn cel mult D(n) + 1 rdcini i nu se
marcheaz noduri n timpul efecturii operaiilor. Astfel costul amortizat este cel mult
O(D(n) +t(H)) + ((D(n) + 1) + 2m(H)) (t(H) + 2m(H))
= O(D(n)) +O(t(H)) t(H) = O(D(n)),
deoarece putem scala unitile de potenial pentru a depi constanta ascuns n O(t(H)).
Intuitiv, costul efecturii ecrei legturi se datoreaz reducerii potenialului n urma nln-
uirilor care micoreaz cu unu numrul de rdcini.
Exerciii
21.2-1 Determinai heap-ul Fibonacci rezultat dup apelul Heap-Fib-Extrage-Min asupra
heap-ului Fibonacci din gura 21.3(m).
21.2-2 Artai c lema 20.1 are loc i pentru arbori binomiali neordonai nlocuind ns
proprietatea 4 cu 4.
21.2-3 Artai c dac sunt suportate doar operaiile pe heap-uri interclasabile, atunci gradul
maxim D(n) ntr-un heap Fibonacci avnd n noduri este cel mult lg n|.
21.2-4 Profesorul McGee a descoperit o nou structur de date bazat pe heap-uri Fibonacci.
Un heap McGee are aceeai structur ca i un heap Fibonacci i suport operaiile pe heap-uri
interclasabile. Implementrile operaiilor sunt aceleai, cu meniunea c inserarea i reuniunea
efectueaz ca ultim pas operaia de consolidare. Care sunt timpii de execuie, n cazul cel mai
defavorabil, ai operaiilor pe heap-uri McGee? Este nou structura descoperit de profesor?
372 Capitolul 21 Heap-uri Fibonacci
21.2-5 Argumentai faptul c dac singurele operaii asupra cheilor sunt cele de comparare a
dou chei (ca n acest capitol), atunci nu toate operaiile pe heap-uri interclasabile pot efectuate
ntr-un timp amortizat O(1).
21.3. Descreterea unei chei i tergerea unui nod
n aceast seciune vom arta cum putem descrete cheia unui nod dintr-un heap Fibonacci
ntr-un timp amortizat O(1) i cum putem terge oricare dintre nodurile unui heap Fibonacci
avnd n noduri ntr-un timp amortizat O(D(n)). Aceste operaii nu pstreaz proprietatea c
toi arborii din heap sunt arbori binomiali neordonai. Putem mrgini gradul maxim D(n) prin
O(lg n), aceste valori ind sucient de apropiate. Demonstrarea acestei margini va implica faptul
c procedura Heap-Fib-Extrage-Min i Heap-Fib-terge se execut ntr-un timp amortizat
O(lg n).
Descreterea unei chei
n algoritmul pseudocod descris n continuare pentru Heap-Fib-Descrete-Cheie vom
presupune din nou c tergerea unui nod dintr-o list nlnuit nu modic cmpurile nodului
ters.
Heap-Fib-Descrete-Cheie(H, x, k)
1: dac k > [x] atunci
2: eroare cheia nou este mai mare dect cheia curent
3: [x] k
4: y p[x]
5: dac y = nil i [x] < [y] atunci
6: Taie(H, x, y)
7: Taie-n-Cascad(H, y)
8: dac [x] < [ [H]] atunci
9: [H] x
Taie(H, x, y)
1: terge x din lista de i ai lui y i decrementeaz [y]
2: adaug x la lista de rdcini a lui H
3: p[x] nil
4: [x] fals
Taie-n-Cascad(H, y)
1: z p[y]
2: dac z = nil atunci
3: dac [y] = fals atunci
4: [y] adevrat
5: altfel
6: Taie(H, y, z)
7: Taie-n-Cascad(H, z)
21.3. Descreterea unei chei i tergerea unui nod 373
Heap-Fib-Descrete-Cheie procedeaz dup cum urmeaz. Liniile 13 asigur faptul c
noua cheie nu este mai mare dect cheia curent a lui x i apoi atribuie aceast valoare lui x.
Dac x este o rdcin sau dac [x] [y], unde y este printele lui x, atunci nu sunt
necesare modicri structurale, deoarece proprietatea de heap ordonat nu este nclcat. Aceast
condiie este testat n liniile 45.
Dac este nclcat proprietatea de heap ordonat, se pot petrece multe schimbri. ncepem
prin a tia nodul x n linia 6. Procedura Taie taie legtura dintre x i printele y al lui,
transformndu-l pe x n rdcin.
Folosim cmpul pentru a obine marginile de timp dorite. Acestea ne ajut s obinem
urmtorul efect. Presupunem c x este un nod caracterizat de urmtoarele:
1. x fusese rdcin la un anumit moment,
2. apoi x a fost legat la un alt nod,
3. apoi doi i ai lui x au fost teri prin tiere.
Imediat dup ce i-a pierdut i al doilea u, lui x i se taie legtura cu printele i devine o
nou rdcin. Cmpul [x] este adevrat dac au avut loc paii 1 i 2 i un u al lui x
a fost eliminat. Astfel, ndeplinind pasul 1, procedura Taie terge [x] n linia 4. (Putem
observa acum de ce linia 3 din Heap-Fib-nlnuie terge [y]: nodul y este legat la un
alt nod i astfel este efectuat pasul 2. Data urmtoare cnd se taie un u al lui y, lui [y]
i se atribuie valoarea adevrat.)
nc nu am terminat, deoarece x ar putea al doilea u nlturat al printelui lui y, din
momentul n care y a fost legat de un alt nod. Aadar linia 7 din Heap-Fib-Descrete-Cheie
efectueaz o operaie de tiere n cascad relativ la y. Dac y este o rdcin, atunci testul din
linia 2 a operaiei Taie-n-Cascad are ca efect ieirea din procedur. Dac y nu este marcat,
atunci procedura l marcheaz n linia 4, deoarece primul lui u a fost tocmai tiat, i apelul
se ncheie. Totui, dac y este marcat, nseamn c tocmai i-a pierdut al doilea u; n linia 6,
y este nlturat i Taie-n-Cascad se apeleaz recursiv n linia 7 asupra printelui z al lui
y. Apelul recursiv al procedurii Taie-n-Cascad se desfoar ascendeent n arbore pn se
ntlnete e o rdcin, e un nod nemarcat.
O dat ncheiat procesul de tiere n cascad, liniile 89 ncheie Heap-Fib-Descrete-
Cheie prin actualizarea lui [H], dac este necesar.
Figura 21.4 prezint rezultatul a dou apeluri Heap-Fib-Descrete-Cheie aplicate pentru
heap-ul Fibonacci din gura 21.4(a). Primul apel, redat n gura 21.4(b) nu implic tieri n
cascad. Al doilea apel implic dou tieri n cascad i este redat n gurile 21.4(c)(e).
Vom arta acum c timpul amortizat pentru Heap-Fib-Descrete-Cheie este doar O(1).
ncepem prin determinarea costului actual. Procedura Heap-Fib-Descrete-Cheie necesit
un timp O(1) plus timpul necesar efecturii tierilor n cascad. Presupunem c procedura
Taie-n-Cascad este apelat recursiv de c ori de la o anumit invocare a procedurii Heap-
Fib-Descrete-Cheie. Fiecare apel Taie-n-Cascad necesit un timp O(1) fr a lua n
considerare apelurile recursive. Astfel, timpul actual pentru Heap-Fib-Descrete-Cheie este
O(c) incluznd aici toate apelurile recursive.
n continuare vom calcula modicarea potenialului. Fie H heap-ul Fibonacci nainte de
apelul procedurii Heap-Fib-Descrete-Cheie. Fiecare apel recursiv al procedurii Taie-n-
Cascad, exceptndu-l pe ultimul, nltur un nod marcat i terge marcajul nodului. Dup
374 Capitolul 21 Heap-uri Fibonacci
aceea, exist t(H) + c arbori (t(H) arbori iniiali, c 1 arbori produi de tierea n cascad
i arborele cu rdcina x) i cel mult m(H) c + 2 noduri marcate (c 1 au fost demarcate
prin tierea n cascad, iar la ultimul apel, Taie-n-Cascad marcheaz un nod). De unde,
potenialul se modic cu cel mult
((t(H) +c) + 2(m(H) c + 2)) (t(H) + 2m(H)) = 4 c.
Astfel, costul amortizat pentru Heap-Fib-Descrete-Cheie este cel mult
O(c) + 4 c = O(1),
deoarece putem scala unitatea de potenial astfel nct s dominm constanta ascuns n O(c).
Putem observa acum de ce funcia potenial a fost denit s conin un termen care este de
dou ori mai mare dect nodurile marcate. Atunci cnd un nod marcat y este nlturat la tierea
n cascad, marcajul lui este ters, astfel c potenialul se reduce cu 2. O unitate de potenial
este cheltuit pentru tiere i tergerea marcajului, iar cealalt unitate compenseaz creterea
n uniti de potenial datorat faptului c nodul y a devenit o rdcin.
tergerea unui nod
A terge un nod dintr-un heap Fibonacci avnd n noduri ntr-un timp amortizat O(D(n))
este uor, dup cum arat algoritmul pseudocod urmtor. Presupunem c heap-ul Fibonacci nu
conine chei de valoare .
Heap-Fib-terge(H, x)
1: Heap-Fib-Descrete-Cheie(H, x, )
2: Heap-Fib-Extrage-Min(H)
Procedura Heap-Fib-terge este analog cu Heap-Binomial-terge. Atribuind cheii
nodului x valoarea , nodul x devine nodul minim din heap. Nodul x este ters apoi din heap
prin apelul procedurii Heap-Fib-Extrage-Min. Timpul amortizat pentru Heap-Fib-terge
este suma dintre timpul amortizat O(1) al procedurii Heap-Fib-Descrete-Cheie, respectiv
O(D(n)) al lui Heap-Fib-Extrage-Min.
Exerciii
21.3-1 Presupunem c ntr-un heap Fibonacci o rdcin x este marcat. Explicai cum a
devenit x o rdcin marcat. Justicai c pentru analiz nu are importan acest fapt, chiar
dac nu este o rdcin care a fost nti legat la un alt nod i apoi i-a pierdut ul stng.
21.3-2 Demonstrai timpul amortizat O(1) pentru Heap-Fib-Descrete-Cheie, folosind
metoda agregrii din seciunea 18.1.
21.4. Mrginirea gradului maxim
Pentru a demonstra c timpul amortizat al operaiilor Heap-Fib-Extrage-Min i Heap-
Fib-terge este O(lg n), trebuie s artm c marginea superioar D(n) a gradului oricrui
21.4. Mrginirea gradului maxim 375
Figura 21.4 Dou apeluri ale procedurii Heap-Fib-Descrete-Cheie. (a) Heap-ul Fibonacci iniial.
(b) Nodului avnd cheia 46 i se micoreaz cheia la 15. Nodul devine o rdcin i printele lui (avnd
cheia 24) se marcheaz (anterior fusese nemarcat). (c)(e) Nodului avnd cheia 35 i se micoreaz cheia
la 5. n partea (c), nodul (acum avnd cheia 5) devine o rdcin. Printele lui (avnd cheia 26) este
marcat, urmnd astfel o tiere n cascad. Nodul avnd cheia 26 este nlturat de la printele lui i
devine o rdcin nemarcat (partea (d)). Are loc nc o tiere n cascad, deoarece nodul avnd cheia
24 este de asemenea marcat. Acest nod este nlturat de la printele lui i devine o rdcin nemarcata
(partea (e)). Tierile n cascad se opresc aici deoarece nodul avnd cheia 7 este o rdcin. (Chiar dac
nodul nu ar o rdcin, procesul de tiere s-ar ncheiat, deoarece nodul este nemarcat.) Rezultatul
operaiei Heap-Fib-Descrete-Cheie este redat n partea (e), avnd min[H] indicnd noul nod minim.
nod dintr-un heap Fibonacci avnd n noduri este O(lg n). Conform exerciiului 21.2-3, atunci
cnd toi arborii din heap-ul Fibonacci sunt arbori binomiali neordonai, D(n) = lg n|. Totui,
tierile care se efectueaz n Heap-Fib-Descrete-Cheie pot genera arbori care nu respect
proprietile arborilor binomiali neordonai. n aceast seciune vom arta c prin nlturarea
unui nod de la printele lui, dac acesta pierde doi i, atunci D(n) este O(lg n). Mai precis, vom
arta c D(n) log

n|, unde = (1 +

5)/2.
Ideea de baz a analizei este urmtoarea. Pentru ecare nod x dintr-un heap Fibonacci e
dim(x) numrul nodurilor subarborelui cu rdcina x, incluzndu-l i pe x. (S observm c x nu
trebuie s e n lista de rdcini poate orice nod.) Vom arta c dim(x) depinde exponenial
de [x]. S reinem c [x] este actualizat pentru a exprima cu precizie gradul lui x.
Lema 21.1 Fie x un nod oarecare dintr-un heap Fibonacci i presupunem c grad[x] = k.
Notm cu y
1
, y
2
, . . . , y
k
ii lui x n ordinea n care au fost legai la x, de la cel mai devreme spre
cel mai recent. Atunci, grad[y
1
] 0 i grad[y
i
] i 2 pentru i = 2, 3, . . . , k.
376 Capitolul 21 Heap-uri Fibonacci
Demonstraie. Este evident c [y
1
] 0.
Pentru i 2, s observm c atunci cnd y
i
a fost legat la x, celelalte noduri y
1
, y
2
, . . . , y
i1
erau deja i ai lui x, astfel c [x] i1. Nodul y
i
este legat la x numai dac [x] = [y
i
],
de unde rezult c la acel moment are loc de asemenea [y
i
] i 1. Din acel moment nodul
y
i
poate pierde cel mult un u, deoarece, dac i-ar pierdut ambii i, ar fost tiat legtura
sa cu x. n concluzie, [y
i
] i 2.
Ajungem n sfrit la acea parte a analizei care justic numele heap-uri Fibonacci. S ne
amintim din seciunea 2.2 c pentru k = 0, 1, 2, . . ., al k-lea numr Fibonacci este denit prin
relaia de recuren
F
k
=

0 dac k = 0,
1 dac k = 1,
F
k1
+F
k2
dac k 2.
Lema urmtoare ofer un alt mod de a exprima F
k
.
Lema 21.2 Pentru orice k 0,
F
k+2
= 1 +
k

i=0
F
i
.
Demonstraie. Demonstraia este prin inducie dup k. Dac k = 0,
1 +
0

i=0
F
i
= 1 +F
0
= 1 + 0 = 1 = F
2
.
Presupunnd acum c are loc ipoteza induciei, F
k+1
= 1 +

k1
i=0
F
i
, avem
F
k+2
= F
k
+F
k+1
= F
k
+

1 +
k

i=0
F
i

= 1 +
k

i=0
F
i
.
Lema urmtoare i corolarul ei completeaz analiza. Lema folosete inegalitatea (demonstrat
n exerciiul 2.2-8)
F
k+2

k
,
unde este raportul de aur denit prin ecuaia (2.14) ca ind = (1 +

5)/2 = 1.61803 . . ..
Lema 21.3 Fie x un nod oarecare dintr-un heap Fibonacci i e k = grad[x]. Atunci, dim(x)
F
k+2

k
, unde = (1 +

5)/2.
Demonstraie. Notm cu s
k
valoarea minim posibil pentru dim(z) pentru toate nodurile z
care au proprietatea [z] = k. Evident c, s
0
= 1, s
1
= 2 i s
2
= 3. Numrul s
k
este cel mult
dim(x). Ca i n lema 21.1, notm cu y
1
, y
2
, . . . , y
k
ii lui x n ordinea n care au fost legai la x.
Pentru a calcula o margine inferioar pentru dim(x) adunm unu pentru x i unu pentru primul
u y
1
(pentru care dim(y
1
) 1) i aplicm apoi lema 21.1 pentru ceilali i. Avem astfel
dim(x) s
k
2 +
k

i=2
s
i2
.
Probleme 377
Artm acum, prin inducie n raport cu k, c s
k
F
k+2
, pentru orice k ntreg nenegativ.
Cazurile de baz pentru k = 0 i k = 1 sunt evidente. Pentru pasul inductiv, presupunem c
k 2 i c s
i
F
i+2
, pentru i = 0, 1, . . . , k 1. Avem
s
k
2 +
k

i=2
s
i2
2 +
k

i=2
F
i
= 1 +
k

i=0
F
i
= F
k+2
.
Ultima egalitate rezult din lema 21.2.
Am artat astfel c dim(x) s
k
F
k+2

k
.
Corolarul 21.4 Gradul maxim D(n) al oricrui nod dintr-un heap Fibonacci cu n noduri, este
O(lg n).
Demonstraie. Fie x un nod oarecare al unui heap Fibonacci cu n noduri i e k = [x]. Din
lema 21.3 obinem c n dim(x)
k
. Logaritmnd n baza obinem k log

n. (De fapt
k log

n| deoarece k este ntreg.) Gradul maxim D(n) al oricrui nod este astfel O(lg n).
Exerciii
21.4-1 Profesorul Pinochio arm c nlimea unui heap Fibonacci avnd n noduri este O(lg n).
Demonstrai c presupunerea profesorului este greit descriind pentru orice numr ntreg pozitiv
n o secven de operaii ale heap-urilor Fibonacci care creeaz un heap Fibonacci constnd dintr-
un singur arbore care are cele n noduri nlnuite liniar.
21.4-2 Presupunem c generalizm regula de tiere n cascad a unui nod de la printele lui,
imediat ce acesta i pierde al k-lea u, pentru o constant ntreag k xat. (Regula din seciunea
21.3 folosete k = 2.) Pentru ce valori ale lui k avem D(n) = O(lg n)?
Probleme
21-1 Implementare alternativ pentru tergere
Profesorul Pisano a propus urmtoarea variant pentru procedura Heap-Fib-terge, armnd
c execuia este mai rapid atunci cnd nodul care se terge nu este nodul indicat de [H].
Pisano-terge(H, x)
1: dac x = [H] atunci
2: Heap-Fib-Extrage-Min(H)
3: altfel
4: y p[x]
5: dac y = nil atunci
6: Taie(H, x, y)
7: Taie-n-Cascad(H, y)
8: adaug lista de i ai lui x la lista de rdcini a lui H
9: terge x din lista de rdcini a lui H
378 Capitolul 21 Heap-uri Fibonacci
a. Armaia profesorului privind execuia mai rapid se bazeaz n parte pe presupunerea c
linia 8 poate executat ntr-un timp actual O(1). Ce este greit n aceast presupunere?
b. Dai o margine superioar bun pentru timpul actual al operaiei Pisano-terge n cazul
x = [H]. Marginea gsit ar trebui exprimat n termeni de [x] i numrul c de
apeluri al procedurii Tiere-n-Cascad.
c. Fie H
t
heap-ul Fibonacci rezultat dup apelul Pisano-terge(H, x). Presupunnd c x
nu este o rdcin, estimai o margine pentru potenialul lui H
t
n termeni de [x], c,
t(H) i m(H).
d. Artai c timpul amortizat pentru Pisano-terge nu este asimptotic mai bun dect
pentru Heap-Fib-terge, chiar dac x = [H].
21-2 Alte operaii pe heap-uri Fibonacci
Dorim s mbuntim un heap Fibonacci H prin adugarea a dou operaii fr a schimba
timpul amortizat de execuie al celorlalte operaii pe heap-uri Fibonacci.
a. Dai o implementare ecient a operaiei Heap-Fib-Schimb-Cheie(H, x, k), care schim-
b cheia nodului x atribuindu-i valoarea k. Analizai timpul amortizat de execuie a im-
plementrii gsite pentru cazurile n care k este mai mare, mai mic, sau egal cu [x].
b. Dai o implementare ecient a operaiei Heap-Fib-Trunchiaz(H, r), care terge
min(r, n[H]) noduri din H. Nodurile care se terg pot alese arbitrar. Analizai timpul
amortizat de execuie pentru implementarea gsit. ( Este posibil s e necesar
modicarea structurii de date sau a funciei potenial.)
Note bibliograce
Heap-urile Fibonacci au fost introduse de Fredman i Tarjan [75]. Articolul lor descrie, de
asemenea, aplicarea heap-urilor Fibonacci problemelor de drum minim de surs unic i respectiv
a tuturor perechilor, problemelor de potrivire bipartit ponderat i problemei arborelui de
acoperire minim.
n continuare Driscoll, Gabow, Shrairman i Tarjan [58] au dezvoltat heap-uri relaxate ca
o alternativ la heap-uri Fibonacci. Exist dou tipuri de heap-uri relaxate. Unul din ele ofer
aceleai margini pentru timpul amortizat de execuie ca i heap-urile Fibonacci. Cellalt permite
operaiei Descrete-Cheie, n cazul cel mai defavorabil (nu amortizat) o execuie ntr-un timp
O(1), iar operaiilor Extrage-Min i terge, n cazul cel mai defavorabil, o execuie ntr-un
timp O(lg n). n algoritmi paraleli heap-urile relaxate au de asemenea unele avantaje fa de cele
Fibonacci.
22 Structuri de date pentru mulimi
disjuncte
Unele aplicaii implic gruparea a n elemente distincte ntr-o colecie de mulimi disjuncte.
Pentru o astfel de colecie exist dou operaii importante: cutarea mulimii creia i aparine
un element dat i reuniunea a dou mulimi. Acest capitol propune metode pentru realizarea
unei structuri de date care suport aceste operaii.
n seciunea 22.1 se descriu operaiile caracteristice unei structuri de date mulimi disjuncte i
prezint o aplicaie simpl. n seciunea 22.2, urmrim o implementare simpl pentru mulimile
disjuncte, bazat pe liste nlnuite. O implementare mai ecient folosind arbori cu rdcin
este prezentat n seciunea 22.3. Timpul de execuie, n cazul implementrii bazate pe arbori cu
rdcin, este liniar pentru toate scopurile practice, dar teoretic este supraliniar. n seciunea 22.4
se denete i se analizeaz funcia lui Ackermann i inversa sa, care are o cretere foarte nceat;
aceasta funcie apare n evaluarea timpului de execuie al operaiilor, n cazul implementrii
bazate pe arbori. Se demonstreaz apoi, folosind o analiz amortizat, existena unei margini
superioare mai puin exact pentru timpul de execuie.
22.1. Operaii pe mulimi disjuncte
O structur de date pentru mulimi disjuncte memoreaz o colecie S = S
1
, S
2
, ..., S
k

de mulimi disjuncte dinamice. Fiecare mulime este identicat printr-un reprezentant, care
este unul din elementele mulimii. n anumite aplicaii, nu are importan care membru este fo-
losit ca reprezentant; ne intereseaz doar s-l alegem astfel nct dac cerem reprezentantul unei
mulimi de dou ori, far s modicm mulimea ntre cele dou cereri, s obinem acelai rspuns
de ecare dat. n alte aplicaii poate exista o regul predenit pentru alegerea reprezentantului,
cum ar alegerea celui mai mic element din mulime (presupunnd bineneles c elementele
pot ordonate).
Ca i n celelalte implementri ale mulimilor dinamice pe care le-am studiat, ecare element
al unei mulimi este reprezentat printr-un obiect. Notnd cu x un obiect, denim urmtoarele
operaii.
Formeaz-Mulime(x) creeaz o mulime nou cu un singur element x (care este i reprezen-
tant). Deoarece mulimile sunt disjuncte, cerem ca x s nu e deja n alt mulime.
Reunete(x, y) reunete mulimile dinamice S
x
i S
y
, care conin pe x, respectiv pe y, ntr-o
nou mulime care este reuniunea celor dou mulimi. Se presupune c naintea aplicrii
operaiei cele dou mulimi sunt disjuncte. Reprezentatul mulimii rezultate este un ele-
ment oarecare al reuniunii S
x
S
y
, dei multe implementri ale operaiei Reunete aleg
e reprezentantul lui S
x
, e al lui S
y
, ca reprezentant al noii mulimi. Pentru c noi cerem
ca mulimile din colecie s e disjuncte, distrugem mulimile S
x
i S
y
, tergndu-le din
colecie.
380 Capitolul 22 Structuri de date pentru mulimi disjuncte
Gsete-Mulime(x) returneaz un pointer spre reprezentantul (unic) al mulimii care-l con-
ine pe x.
Pe parcursul acestui capitol, vom analiza timpul de execuie pentru structurile de date mul-
imi disjuncte, n termenii a doi parametri: n, numrul de operaii Formeaz-Mulime i m,
numrul total de operaii Formeaz-Mulime, Reunete i Gsete-Mulime. Deoarece
mulimile sunt disjuncte, ecare operaie Reunete reduce numrul de mulimi cu unu. Astfel
dup n1 operaii Reunete, rmne o singur mulime. Numrul de operaii Reunete este
deci cel mult n 1. Observai de asemenea c numrul total de operaii m include operaiile
Formeaz-Mulime, deci vom avea m n.
O aplicaie a structurilor de date mulimi disjuncte
Una dintre aplicaiile structurilor de date mulimi disjuncte este determinarea componentelor
conexe ale unui graf neorientat (vezi seciunea 5.4). De exemplu, gura 22.1(a) prezint un graf
cu patru componente conexe.
Urmtoarea procedur Componente-Conexe folosete operaiile pe mulimi disjuncte
pentru a determina componentele conexe ale unui graf. Dup ce Componente-Conexe a fost
executat ca un pas de preprocesare, procedura Aceeai-Component rspunde la cereri care
veric dac dou vrfuri sunt n aceeai component conex.
1
(Mulimea de vrfuri a unui graf
G este notat cu V [G] i mulimea muchiilor e notat cu E[G].)
Componente-Conexe(G)
1: pentru ecare vrf v V [G] execut
2: Formeaz-Mulime(v)
3: pentru ecare muchie (u, v) E(G) execut
4: dac Gsete-Mulime(u) = Gsete-Mulime (v) atunci
5: Reunete(u, v)
Aceeai-Component(u, v)
1: dac Gsete-Mulime(u) = Gsete-Mulime(v) atunci
2: returneaz adevrat
3: altfel
4: returneaz fals
Procedura Componente-Conexe plaseaz iniial ecare vrf v ntr-o mulime proprie.
Apoi, pentru ecare muchie (u, v), se reunesc mulimile care conin pe u i pe v. Conform
exerciiului 22.1-2, dup ce toate muchiile sunt procesate, dou vrfuri sunt n aceeai compo-
nent conex dac i numai dac obiectele corespunztoare sunt n aceeai mulime. Prin urmare,
Componente-Conexe calculeaz mulimile astfel nct procedura Aceeai-Component
poate determina dac dou vrfuri sunt n aceeai component conex. Figura 22.1(b) ilustreaz
modul n care Componente-Conexe calculeaz mulimile disjuncte.
Atunci cnd vrfurile unui graf sunt statice nu se schimb n timp componentele conexe pot calculate
mai rapid, folosind cutarea n adncime (exerciiul 23.3-9). Uneori, totui, muchiile sunt adugate dinamic
i avem nevoie s meninem componentele conexe pe msur ce ecare muchie este adugat. n acest caz,
implementarea prezentat aici poate mai ecient dect execuia din nou a cutrii n adncime, pentru ecare
muchie nou.
22.2. Reprezentarea mulimilor disjuncte prin liste nlnuite 381
Figura 22.1 (a) Un graf cu patru componente conexe: a, b, c, d, e, f, g, h, i i j. (b) Colecia
de mulimi disjuncte dup procesarea ecrei muchii.
Exerciii
22.1-1 Presupunem c procedura Componente-Conexe se execut pentru graful neorientat
G = (V, E), unde V = a, b, c, d, e, f, g, h, i, j, k i muchiile din E sunt procesate n urmtoarea
ordine: (d, i), (f, k), (g, i), (b, g), (a, h), (i, j), (d, k), (b, j), (d, f), (g, j), (a, e), (i, d). Scriei vrfurile
din ecare component conex dup ecare iteraie a liniilor 35.
22.1-2 Artai c dup ce toate muchiile sunt procesate de ctre Componente-Conexe, dou
vrfuri sunt n aceeai component conex dac i numai dac ele sunt n aceeai mulime.
22.1-3 De cte ori este apelat procedura Gsete-Mulime n timpul execuiei procedurii
Componente-Conexe pe un graf neorientat G = (V, E) avnd k componente conexe? De cte
ori este apelat procedura Reunete? Exprimai rspunsurile n funcie de [V [, [E[ i k.
22.2. Reprezentarea mulimilor disjuncte prin liste nlnuite
Un mod simplu de a implementa o structur de date mulimi disjuncte este de a reprezenta
ecare mulime printr-o list nlnuit. Reprezentantul unei mulimi se consider a primul
obiect din lista corespunztoare acelei mulimi. Fiecare obiect din lista nlnuit conine un
element al mulimii, un pointer spre un obiect care conine urmtorul element al mulimii i un
pointer napoi spre reprezentant. Figura 22.2(a) prezint dou mulimi. n interiorul ecrei liste
nlnuite, obiectele pot apare n orice ordine (exceptnd faptul c primul obiect din ecare list
382 Capitolul 22 Structuri de date pentru mulimi disjuncte
este reprezentantul ei). Pentru ecare list se va reine un pointer la primul obiect din list i
un pointer spre ultimul obiect din list.
n reprezentarea cu liste nlnuite, att Formeaz-Mulime ct i Gsete-Mulime sunt
operaii simple, care necesit un timp O(1). Pentru a realiza operaia Formeaz-Mulime(x),
vom crea o nou list nlnuit al crei singur obiect este x. Gsete-Mulime(x) returneaz
doar pointerul de la x napoi la reprezentant.
O implementare simpl pentru reuniune
Cea mai simpl implementare pentru operaia Reunete, folosind reprezentarea mulimilor
prin liste nlnuite, ia un timp semnicativ mai mare dect Formeaz-Mulime sau Gsete-
Mulime. Aa cum arat gura 22.2(b), realizm Reunete(x, y) prin adugarea listei lui x la
sfritul listei lui y. Reprezentantul noii mulimi este elementul care a fost iniial reprezentantul
mulimii care l conine pe y. Din pcate trebuie s actualizm pointerul spre reprezentant pentru
ecare obiect originar din lista lui x, operaie care consum un timp liniar n lungimea listei lui
x.
Se ajunge uor la o secven de m operaii care necesit un timp (m
2
). Fie n = m/2|+1 i
q = mn+1 = m/2| i presupunem c avem obiectele x
1
, x
2
, . . . , x
n
. Apoi executm secvena
de m = n + q 1 operaii prezentate n gura 22.3. Este necesar un timp de (n) pentru
realizarea a n operaii Formeaz-Mulime. Deoarece a i-a operaie Reunete actualizeaz i
obiecte, numrul total de obiecte actualizate de ctre toate operaiile Reunete este
q1

i=1
i = (q
2
).
n concluzie, timpul total cheltuit este (n + q
2
), care este (m
2
) deoarece n = (m) i
q = (m). Astfel, n medie, ecare operaie cere un timp (m). Aceasta nseamn c timpul
amortizat de execuie al unei operaii este (m).
O euristic a reuniunii ponderate
Implementarea de mai sus pentru procedura Reunete cere n medie, un timp (m) pentru
un apel, deoarece noi putem aduga o list mai lung la o list mai scurt; trebuie s actualizm
pointerul spre reprezentant pentru ecare obiect al listei lungi. Putem presupune c ecare re-
prezentant include de asemenea i lungimea listei sale (care e uor de reinut) i c la ecare
reuniune se adaug lista mai scurt la lista mai lung. n caz de egalitate adugarea se face
arbitrar. Cu aceast simpl euristic a reuniunii ponderate, o operaie Reunete poate s
necesite totui un timp (m), dac ambele mulimi au (m) elemente. Totui aa cum arat
teorema urmtoare, o secven de m operaii Formeaz-Mulime, Reunete i Gsete-
Mulime, dintre care n sunt operaii Formeaz-Mulime, consum un timp O(m+nlg n).
Teorema 22.1 Folosind reprezentarea cu liste nlnuite pentru mulimile disjuncte i euristica
reuniunii ponderate, o secven de m operaii Formeaz-Mulime, Reunete i Gsete-
Mulime, dintre care n sunt operaii Formeaz-Mulime, consum un timp O(m+nlg n).
Demonstraie. ncepem prin a calcula, pentru ecare obiect dintr-o mulime de mrime n,
o margine superioar pentru numrul de actualizri ale pointerului spre reprezentant al acelui
22.2. Reprezentarea mulimilor disjuncte prin liste nlnuite 383
Figura 22.2 (a) Reprezentrile prin liste nlnuite a dou mulimi. Una conine obiectele b, c, e i h cu
reprezentantul c i cealalt conine obiectele d, f i g, cu f ca reprezentant. Fiecare obiect din list conine
un element al mulimii, un pointer spre urmtorul obiect din list i un pointer napoi spre primul obiect
din list, care este reprezentantul. (b) Rezultatul operaiei Reunete(e, g). Reprezentantul mulimii
rezultate este f.
obiect. Considerm un obiect x x. tim c de ecare dat cnd este actualizat pointerul spre
reprezentant, trebuie ca x s aparin mulimii cu elemente mai puine. Prima dat cnd se
actualizeaz pointerul lui x spre reprezentant, mulimea rezultat are cel puin 2 elemente. Similar,
a doua oar cnd pointerul lui x spre reprezentant este actualizat, mulimea rezultat trebuie s
aib cel puin 4 elemente. Continund aa, observm c pentru orice k n, dup ce pointerul
spre reprezentant al lui x a fost actualizat de lg k| ori, mulimea rezultat are cel puin k
elemente. Deoarece cea mai mare mulime are cel mult n membri, rezult c ecare pointer spre
reprezentant al unui obiect poate modicat de cel mult lg n| ori n toate operaiile Reunete.
Timpul total folosit pentru a actualiza cele n obiecte este deci O(nlg n).
Timpul total pentru executarea ntregii secvene de m operaii se poate calcula uor. Fiecare
operaie Formeaz-Mulime i Gsete-Mulime necesit un timp O(1) i sunt O(m) ope-
raii de acest fel. Astfel, timpul total pentru ntreaga secven de operaii este O(m+nlg n).
Exerciii
22.2-1 Scriei procedurile Formeaz-Mulime, Gsete-Mulime i Reunete, folosind
reprezentarea cu liste nlnuite i euristica reuniunii ponderate. Fiecare obiect x are atributele:
[x] care indic reprezentantul mulimii care l conine pe x, [x] care indic ultimul obiect
din lista nlnuit care l conine pe x i [x] care ne d cardinalul mulimii care l conine
pe x. Considerai c [x] i [x] sunt corecte doar dac x este un reprezentant.
22.2-2 Determinai ce structur de date i ce rspunsuri returneaz operaiile Gsete-
Mulime din urmtorul program. Folosii reprezentarea prin liste nlnuite cu euristica
384 Capitolul 22 Structuri de date pentru mulimi disjuncte
Operaia Numr de obiecte actualizate
Formeaz-Mulime(x
1
) 1
Formeaz-Mulime(x
2
) 1
.
.
.
.
.
.
Formeaz-Mulime(x
n
) 1
Reunete(x
1
, x
2
) 1
Reunete(x
2
, x
3
) 2
Reunete(x
3
, x
4
) 3
.
.
.
.
.
.
Reunete(x
q1
, x
q
) q 1
Figura 22.3 O secven de m operaii care se execut ntr-un timp (m
2
), folosind reprezentarea cu
liste nlnuite i implementarea direct pentru Reunete. Pentru acest exemplu n = ]m/2 + 1 i
q = mn.
reuniunii ponderate.
1: pentru i 1, 16 execut
2: Formeaz-Mulime(x
i
)
3: pentru i 1, 15, 2 execut
4: Reunete(x
i
, x
i+1
)
5: pentru i 1, 13, 4 execut
6: Reunete(x
i
, x
i+2
)
7: Reunete(x
1
, x
5
)
8: Reunete(x
11
, x
13
)
9: Reunete(x
1
, x
10
)
10: Gsete-Mulime(x
2
)
11: Gsete-Mulime(x
9
)
22.2-3 Adaptai demonstraia teoremei 22.1 pentru a obine margini amortizate de timp
O(1) pentru Formeaz-Mulime i Gsete-Mulime i O(lg n) pentru Reunete, folosind
reprezentarea prin liste nlnuite i euristica reuniunii ponderate.
22.2-4 Dai o margine asimptotic ct mai precis pentru timpul de execuie al secvenei de
operaii din gura 22.3, presupunnd o reprezentare prin liste nlnuite i euristica reuniunii
ponderate.
22.3. Pduri de mulimi disjuncte
ntr-o implementare mai rapid a mulimilor disjuncte, reprezentm mulimile prin arbori cu
rdcin, n care ecare nod conine un membru i ecare arbore reprezint o mulime. ntr-o
pdure de mulimi disjuncte, ilustrat n gura 22.4(a), ecare membru indic doar spre
printele lui. Rdcina ecrui arbore conine reprezentantul mulimii, care este propriul su
22.3. Pduri de mulimi disjuncte 385
Figura 22.4 O pdure de mulimi disjuncte. (a) Doi arbori care reprezint cele dou mulimi din gura
22.2. Arborele din stnga reprezint mulimea b, c, e, h cu c ca reprezentant, iar arborele din dreapta
reprezint mulimea d, f, g cu reprezentantul f. (b) Rezultatul operaiei Reunete(e, g).
printe. Dup cum vom vedea, dei algoritmii direci care folosesc aceast reprezentare nu sunt
mai rapizi dect cei care folosesc reprezentarea cu liste nlnuite, prin introducerea a dou
euristici reuniune dup rang i comprimarea drumului putem obine structura de date
mulimi disjuncte cea mai rapid asimptotic, din cele cunoscute.
Vom realiza cele trei operaii pe mulimi disjuncte dup cum urmeaz. Operaia Formeaz-
Mulime creeaz un arbore cu un singur nod. Operaia Gsete-Mulime o executm prin
urmrirea pointerilor spre prini pn cnd gsim rdcina arborelui. Nodurile vizitate pe
drumul spre rdcin constituie drumul de cutare. O operaie Reunete va avea efectul c
rdcina unui arbore va pointa spre rdcina celuilalt arbore, aa cum se arat n gura 22.4(b).
Euristici care mbuntesc timpul de execuie
Pn acum nu am mbuntit implementarea cu liste nlnuite. O secven de n1 operaii
Reunete poate crea un arbore care este un lan liniar de n noduri. Totui, prin folosirea a
dou euristici, putem obine un timp de execuie care este aproape liniar n raport cu numrul
total de operaii m.
Prima euristic, reuniune dup rang, este similar cu euristica reuniune ponderat pe
care am folosit-o la reprezentarea cu liste nlnuite. Ideea este ca rdcina arborelui cu mai
puine noduri s indice spre rdcina arborelui cu mai multe noduri. n loc de a pstra explicit
dimensiunea subarborelui cu rdcin n ecare nod, vom folosi o abordare care uureaz analiza.
Pentru ecare nod vom menine un rang care aproximeaz logaritmul dimensiunii subarborelui
i care este de asemenea o margine superioar a nlimii nodului. Folosind reuniunea dup rang
n timpul operaiei Reunete, rdcina cu rangul cel mai mic va indica spre rdcina cu rang
mai mare.
A doua euristic, comprimarea drumului, este de asemenea foarte simpl i foarte ecient.
Aa cum arat gura 22.5, o folosim n timpul operaiei Gsete-Mulime, pentru ca ecare
nod de pe drumul de cutare s pointeze direct spre rdcin. Comprimarea drumului nu modic
nici un rang.
386 Capitolul 22 Structuri de date pentru mulimi disjuncte
Figura 22.5 Comprimarea drumului n timpul operaiei Gsete-Mulime. Sunt omise sgeile i
buclele. (a) Un arbore care reprezint o mulime, naintea operaiei Gsete-Mulime(a). Triunghiurile
reprezint subarbori ale cror rdcini sunt nodurile aate. Fiecare nod are un pointer spre printele
su. (b) Aceeai mulime dup executarea operaiei Gsete-Mulime(a). Fiecare nod de pe drumul
de cutare pointeaz acum direct spre rdcin.
Algoritmi (n pseudocod) pentru pduri de mulimi disjuncte
Pentru a implementa o pdure de mulimi disjuncte cu euristica reuniunii dup rang, trebuie
s pstrm valorile rangurilor. Pentru ecare nod x, reinem valoarea ntreg [x], care este
o margine superioar a nlimii lui x (numrul de muchii al celui mai lung drum de la x la
o frunz descendent). Atunci cnd Formeaz-Mulime creeaz o mulime cu un element,
rangul iniial al singurului nod n arborele corespunztor este 0. Fiecare operaie Gsete-
Mulime las toate rangurile neschimbate. n urma aplicrii operaiei Reunete pentru doi
arbori, transformm rdcina cu rang mai mare n printe al rdcinii cu rang mai mic. n caz
de egalitate, alegem arbitrar una dintre rdcini i incrementm rangul su.
Vom scrie aceast metod n pseudocod. Reinem printele nodului x n p[x]. Reunete
apeleaz o subrutin, procedura Unete, care are parametrii de intrare pointeri spre dou
rdcini.
Procedura Gsete-Mulime este o metod n dou treceri: face un pas n sus pe drumul
de cutare pentru a gsi rdcina i face al doilea pas n jos pe drumul de cutare pentru a
actualiza ecare nod astfel nct s pointeze direct spre rdcin. Fiecare apel al procedurii
Gsete-Mulime(x) returneaz p[x] n linia 3. Dac x este rdcin, atunci linia 2 nu este
executat i este returnat valoarea p[x] = x. n acest moment recurena coboar. Altfel, linia 2
este executat i apelul recursiv cu parametrul p[x] returneaz un pointer spre rdcin. Linia 2
actualizeaz nodul x astfel nct s indice direct spre rdcin i acest pointer este returnat n
linia 3.
Formeaz-Mulime(x)
1: p[x] x
2: [x] 0
22.3. Pduri de mulimi disjuncte 387
Reunete(x, y)
1: Unete(Gsete-Mulime(x),Gsete-Mulime(y))
Unete(x, y)
1: dac [x] > [y] atunci
2: p[y] x
3: altfel
4: p[x] y
5: dac [x] = [y] atunci
6: [y] [y] + 1
Procedura Gsete-Mulime cu comprimarea drumului este simpl.
Gsete-Mulime(x)
1: dac x = p[x] atunci
2: p[x] Gsete-Mulime(p[x])
3: returneaz p[x]
Efectul euristicilor asupra timpului de execuie
Fiecare euristic separat, att reuniunea dup rang ct i comprimarea drumului, mbun-
teste timpul de execuie al operaiilor pe pduri de mulimi disjuncte i aceast mbuntire
este chiar mai mare atunci cnd sunt folosite mpreun. Numai reuniunea dup rang conduce
la acelai timp de execuie pe care l-am obinut folosind euristica reuniunii ponderate pentru
reprezentarea cu liste nlnuite: implementarea rezultat se execut ntr-un timp O(mlg n) (vezi
exerciiul 22.4-3). Aceast mrginire este strict (vezi exerciiul 22.3-3). Dei nu vom demonstra
acest fapt, dac exist n operaii Formeaz-Mulime (i deci cel mult n1 operaii Reunete)
i f operaii Gsete-Mulime, euristica compresiei drumului, singur, ne d un timp de e-
xecuie, n cazul cel mai defavorabil, de (f log
(1+f/n)
n), dac f n i (n + f lg n) dac
f < n.
Atunci cnd folosim att reuniunea dup rang ct i comprimarea drumului, timpul de
execuie n cazul cel mai defavorabil este O(m(m, n)), unde (m, n) este inversa funciei lui
Ackermann, cu o cretere nceat, denit n seciunea 22.4. Aplicaiile structurii de date
mulimi disjuncte, care pot luate n considerare, satisfac (m, n) 4; astfel putem considera
timpul de execuie ca ind liniar n m, n toate situaiile practice. n seciunea 22.4, construim
o margine mai puin precis de O(mlg

n).
Exerciii
22.3-1 Rezolvai exerciiul 22.2-2, folosind o pdure de mulimi disjuncte cu euristicile reuniune
dup rang i comprimarea drumului.
22.3-2 Scriei o versiune nerecursiv pentru Gsete-Mulime cu comprimarea drumului.
22.3-3 Dai o secven de m operaii Formeaz-Mulime, Reunete i Gsete-Mulime,
dintre care n sunt operaii Formeaz-Mulime, care se execut ntr-un timp (mlg n), dac
se folosete doar reuniunea dup rang.
388 Capitolul 22 Structuri de date pentru mulimi disjuncte
Figura 22.6 Valorile lui A(i, j) pentru valori mici ale lui i i j.
22.3-4 Artai c orice secven de m operaii Formeaz-Mulime, Gsete-Mulime i
Unete, n care toate operaiile Unete apar naintea oricrei operaii Gsete-Mulime, se
execut doar ntr-un timp O(m), dac se folosete att reuniunea dup rang ct i comprimarea
drumului. Ce se ntmpl n aceeai situaie dac se folosete doar euristica comprimrii
drumului?
22.4. Analiza reuniunii dup rang comprimnd drumul
Aa cum am observat n seciunea 22.3, pentru m operaii pe mulimi disjuncte avnd n
elemente, timpul de execuie, n cazul folosirii euristicii combinate reuniune dup rang i com-
primarea drumului, este O(m(m, n)). n aceast seciune vom analiza funcia pentru a vedea
ct de ncet crete. Apoi, vom da o demonstraie pentru o margine superioar mai puin exact
de O(mlg

n), care este puin mai simpl dect demonstraia foarte complex pentru timpul de
execuie O(m(m, n)).
Funcia lui Ackermann i inversa sa
Pentru a nelege funcia lui Ackermann i inversa sa , introducem o notaie pentru expo-
nenierea repetat. Dac i 0 este un numr ntreg, notaia
2
2
.
.
.
2

i
se folosete pentru funcia g(i) denit recursiv astfel
g(i) =

2
1
dac i = 0,
2
2
dac i = 1,
2
g(i1)
dac i > 1.
Parametrul i exprim intuitiv nlimea stivei de 2 care reprezint exponentul. De exemplu
2
2
.
.
.
2

4
= 2
2
2
2
2
= 2
65536
.
22.4. Analiza reuniunii dup rang comprimnd drumul 389
Reamintim deniia funciei lg

n termenii funciilor lg
(i)
denite pentru orice numr ntreg
i 0:
lg
(i)
n =

n dac i = 0,
lg (lg
(i1)
n) dac i > 0 i lg
(i1)
n > 0,
nedenit dac i > 0 i lg
(i1)
n 0 sau lg
(i1)
n este nedenit ;
lg

n = mini 0 : lg
(i)
n 1.
Funcia lg

este n esen inversa exponenierii repetate:


lg

2
2
.
.
.
2

n
= n + 1.
Putem acum s scriem funcia lui Ackermann, care e denit pentru ntregii i, j 1 prin
A(1, j) = 2
j
pentru j 1,
A(i, 1) = A(i 1, 2) pentru i 2,
A(i, j) = A(i 1, A(i, j 1)) pentru i, j 2.
Figura 22.6 conine valorile funciei pentru valori mici ale lui i i j.
Figura 22.7 ilustreaz ntr-un mod sistematic, de ce funcia lui Ackermann are o cretere att
de rapid. Prima linie, exponenial n numrul de coloane j, are deja o cretere rapid. A dou
linie const din submulimea spaiat de coloane 2, 2
2
, 2
2
2
, 2
2
2
2
, . . . din prima linie. Segmentele
dintre liniile adiacente indic acele coloane din linia cu numr mai mic care aparin submulimii
descrise n linia cu numr mai mare. A treia linie const dintr-o submulime de coloane i mai
larg spaiat 2, 2
2
2
, 2
2
.
.
.
2

16
, 2
2
.
.
.
2

2
2
.
.
.
2

16
, . . . din a doua linie i este la rndul ei o submulime
i mai rar de coloane din prima linie . n general spaierea ntre coloanele liniei i 1 care apar
n linia i crete dramatic att n numrul de coloane ct i n numrul de linii. Observai c
A(2, j) = 2
2
.
.
.
2

j
pentru orice numr ntreg j 1. Astfel, pentru i > 2, funcia A(i, j) crete
chiar mai rapid dect 2
2
.
.
.
2

j
.
Denim inversa funciei Ackermann prin
2
(m, n) = mini 1 : A(i, m/n|) > lg n.
Dac xm valoarea lui n, atunci pe msur ce m crete, funcia (m, n) este monoton descresc-
toare. Pentru a nelege aceast proprietate, observai c m/n| este monoton cresctoare pentru
m cresctor; de aici, deoarece n este x, cea mai mic valoare a lui i pentru care A(i, m/n|) este
mai mai mare dect lg n este monoton descresctoare. Aceast proprietate corespunde intuitiv
pdurilor de mulimi disjuncte cu comprimarea drumului: pentru un numr dat de n elemente
distincte, dac numrul de operaii m crete, ne ateptm ca lungimea drumului mediu de cutare
s scad datorit comprimrii drumului. Dac realizm m operaii ntr-un timp O(m(m, n)),
Dei aceast funcie nu este inversa funciei lui Ackermann n sens matematic, totui aceast funcie are
calitile inversei n privina creterii, care este pe att de nceat pe ct de rapid este creterea funciei lui
Ackermann. Motivul pentru care se folosete pragul surprinztor lg n este relevat n demonstraia pentru timpul
de execuie O(m(m, n)), care este n afara scopului acestei cri.
390 Capitolul 22 Structuri de date pentru mulimi disjuncte
Figura 22.7 Creterea exploziv a funciei lui Ackermann. Segmentele dintre liniile i 1 i i indic
intrri din linia i 1 n linia i. Datorit creterii explozive, spaierea orizontal nu poate scalat.
Spaierile orizontale dintre intrrile liniei i 1 apar n linia i mult mrite pe msur ce crete numrul
de linie i coloan. Creterea este chiar mai evident dac urmrim intrrile liniei i de la apariia lor
original n linia 1.
atunci timpul mediu pentru o operaie este O((m, n)), care este monoton descresctor, atunci
cnd m crete.
Pentru a ne ntoarce la armaia c (m, n) 4, n toate cazurile practice, observm mai
nti c valoarea m/n| este cel puin 1, deoarece m n. Pentru c funcia lui Ackermann este
strict cresctoare n ecare argument, m/n| 1 implic A(i, m/n|) A(i, 1) pentru orice
i 1. n particular, A(4, m/n|) A(4, 1). Dar avem de asemenea c
A(4, 1) = A(3, 2) = 2
2
.
.
.
2

16
,
care este cu mult mai mare dect numrul estimat de atomi, din universul observabil (aproximativ
10
80
). Inegalitatea are loc doar pentru valori ale lui n impracticabil de mari, pentru care A(4, 1)
lg n i astfel (m, n) 4, n toate cazurile practice. Observai c diferena de precizie dintre
marginea O(mlg

n) i marginea O(m(m, n)) este foarte mic; lg

65536 = 4 i lg

2
65536
= 5,
deci lg

n 5 n toate cazurile practice.


Proprietile rangurilor
Demonstrm n continuarea acestei seciuni c O(mlg

n) reprezint o margine superioar a


timpului de execuie a operaiilor pe mulimi disjuncte cu reuniune dup rang i comprimarea
drumului. Pentru a demonstra acest lucru, demonstrm mai nti cteva proprieti simple ale
rangurilor.
Lema 22.2 Pentru toate nodurile x, avem [x] [p[x]] cu inegalitate strict dac x =
p[x]. Valoarea [x] iniial este 0 i crete n timp pn ce x = p[x]; dup aceea [x] nu se
mai modic. Valoarea [p[x]] este o funcie monoton cresctoare n timp.
Demonstraie. Demonstraia este o inducie direct dup numrul de operaii, folosind im-
plementrile operaiilor Formeaz-Mulime, Reunete i Gsete-Mulime, care apar n
seciunea 22.3. Este propus spre rezolvare n exerciiul 22.4-1.
22.4. Analiza reuniunii dup rang comprimnd drumul 391
Denim dim(x) ca ind numrul de noduri din arborele cu rdcina x, inclusiv nodul x.
Lema 22.3 Pentru toate rdcinile x de arbori, dim(x) 2
rang[x]
.
Demonstraie. Demonstraia se face prin inducie dup numrul de operaii Unete. Observai
c operaiile Gsete-Mulime nu schimb nici rangul unei rdcini al unui arbore i nici
dimensiunea arborelui su.
: Lema este adevrat nainte de prima operaie Unete, deoarece rangurile sunt iniial
0 i ecare arbore conine cel puin un nod.
: Presupunem c lema este adevrat naintea execuiei operaiei Unete(x, y).
Fie rangul chiar de dinainte de Unete i e rang
t
rangul chiar dup Unete. Denim
similar i dim
t
.
Dac [x] = [y], presupunem fr s pierdem generalitatea c [x] < [y]. Nodul
y este rdcina arborelui format de operaia Unete i
dim(y) = dim(x) + dim(y) 2
rang[x]
+ 2
rang[y]
2
rang[y]
= 2
rang

[y]
.
n afar de nodul y nici un alt nod nu i schimb valorile pentru rang i dimensiune.
Dac [x] = [y], nodul y este din nou rdcina unui nou arbore i
dim(y) = dim(x) + dim(y) 2
rang[x]
+ 2
rang[y]
= 2
rang[y]+1
= 2
rang

[y]
.
Lema 22.4 Pentru orice ntreg r 0 exist cel mult n/2
r
noduri de rang r.
Demonstraie. Fixm o valoare particular pentru r. Presupunem c atunci cnd atribuim un
rang r unui nod x (n linia 2 din Formeaz-Mulime sau n linia 5 din Unete), atam o
etichet x ecrui nod din arborele cu rdcina x. Conform lemei 22.3, cel puin 2
r
noduri sunt
etichetate de ecare dat. Presupunem c rdcina arborelui care conine nodul x se schimb.
Lema 22.2 ne asigur c rangul noii rdcini (sau de fapt, al ecrui strmo al lui x) este cel
puin r + 1. Deoarece atam etichete doar atunci cnd unei rdcini i se atribuie rangul r, nici
un nod din acest arbore nou nu va mai etichetat din nou. Astfel ecare nod este etichetat cel
mult o dat, atunci cnd rdcinii lui i este atribuit rangul r. Pentru c sunt n noduri, sunt cel
mult n noduri etichetate, cu cel puin 2
r
etichete ataate pentru ecare nod de rang r. Dac au
fost mai mult dect n/2
r
noduri de rang r, atunci vor etichetate mai mult dect 2
r
(n/2
r
) = n
noduri de ctre un nod de rang r, ceea ce este o contradicie. Rezult c cel mult n/2
r
noduri
vor avea rangul r.
Corolarul 22.5 Orice nod are rangul cel mult lg n|.
Demonstraie. Dac presupunem c r > lg n, atunci sunt cel mult n/2
r
< 1 noduri cu rangul
r. Deoarece rangurile sunt numere naturale, corolarul este demonstrat.
Demonstrarea marginii de timp
Vom folosi o metod de analiz amortizat (vezi seciunea 18.1) pentru a demonstra marginea
de timp de O(mlg

n). Pentru realizarea analizei amortizate este convenabil s presupunem c se


folosete mai degrab operaia Unete, dect operaia Reunete. Aceasta presupune execuia,
392 Capitolul 22 Structuri de date pentru mulimi disjuncte
dac este necesar, a operaiilor Gsete-Mulime corespunztoare, deoarece parametrii pro-
cedurii Unete sunt pointeri spre dou rdcini. Lema urmtoare arat c i dac numrm
operaiile Gsete-Mulime suplimentare, timpul asimptotic de execuie rmne neschimbat.
Lema 22.6 Presupunem c transformm o secven S
t
de m
t
operaii Formeaz-Mulime,
Reunete i Gsete-Mulime ntr-o secven S de m operaii Formeaz-Mulime,
Unete i Gsete-Mulime prin nlocuirea ecrei operaii Reunete cu dou operaii
Gsete-Mulime urmate de o operaie Unete. Dac secvena S se execut ntr-un timp
O(mlg

n), atunci secvena S


t
se execut ntr-un timp O(m
t
lg

n).
Demonstraie. Deoarece ecare operaie Reunete din secvena S
t
este convertit n trei
operaii n S, avem m
t
m 3m
t
. Pentru c m = O(m
t
), o margine de timp de O(mlg

n)
pentru secvena convertit S implic o margine de timp O(m
t
lg

n) pentru secvena original


S
t
.
n continuare, n aceast seciune, vom presupune c secvena iniial de m
t
operaii Formea-
z-Mulime, Reunete i Gsete-Mulime a fost convertit ntr-o secven de m operaii
Formeaz-Mulime, Unete i Gsete-Mulime. Vom demonstra acum o margine de timp
de O(mlg

n) pentru secvena convertit i vom apela la lema 22.6 pentru a demonstra timpul
de execuie de O(m
t
lg

n) pentru secvena original cu m


t
operaii.
Teorema 22.7 O secven de m operaii Formeaz-Mulime, Unete i Gsete-Muli-
me, dintre care n sunt operaii Formeaz-Mulime, poate executat pe o pdure de mulimi
disjuncte cu reuniune dup rang i cu comprimarea drumului ntr-un timp O(mlg

n), n cazul
cel mai defavorabil.
Demonstraie. Atribuim ponderile corespunztoare costului real pentru ecare operaie pe
mulime i calculm numrul total de ponderi atribuite dup ce ntreaga secven de operaii a
fost executat. Acesta ne va da costul real pentru toate operaiile pe mulime.
Ponderile atribuite pentru operaiile Formeaz-Mulime i Unete sunt simple: o pondere
pe operaie. Pentru c ecare operaie necesit un timp real de O(1), ponderile atribuite sunt
egale cu costurile reale ale operaiilor.
nainte de a evalua ponderile atribuite pentru operaiile Gsete-Mulime, partiionm
rangurile nodurilor n blocuri prin introducerea rangului r n blocul lg

r pentru r =
0, 1, ..., lg n|. (Reamintim c lg n| este rangul maxim.) Deci blocul cu numr maxim este blocul
lg

(lg n) = lg

n 1. Pentru simplicarea notrii, denim pentru numerele ntregi j 1,


B(j) =

1 dac j = 1,
1 dac j = 0,
2 dac j = 1,
2
2
.
.
.
2

j1
dac j 2.
Apoi, pentru j = 0, 1, ..., lg

n 1, al j-lea bloc const din mulimea rangurilor


B(j 1) + 1, B(j 1) + 2, ..., B(j).
Folosim dou tipuri de ponderi pentru o operaie Gsete-Mulime: ponderi bloc i
ponderi drum. Presupunem c Gsete-Mulime ncepe la nodul x
0
i c drumul de cutare
22.4. Analiza reuniunii dup rang comprimnd drumul 393
const din nodurile x
0
, x
1
, ..., x
l
, unde pentru i = 1, 2, . . . , l, nodul x
i
este p[x
i1
] i x
l
(o rdcin)
este p[x
l
]. Pentru j = 0, 1, . . . , lg

n1 atribuim o pondere bloc pentru nod din drum cu


rangul n blocul j. (Observai c din lema 22.2 se deduce c pe orice drum de cutare, nodurile cu
rangul ntr-un anumit bloc dat sunt consecutive.) Atribuim de asemenea o pondere bloc pentru
ul rdcinii, care este x
l1
. Deoarece rangurile sunt strict cresctoare de-a lungul oricrui drum
de cutare, o formulare echivalent stabilete o pondere bloc ecrui nod x
i
astfel nct p[x
i
] = x
l
(x
i
este rdcina sau ul ei) sau lg

[x
i
] < lg

[x
i+1
] (blocul cu rangul lui x
i
difer de
cel al printelui su). Fiecrui nod de pe drumul de cutare cruia nu i stabilim o pondere bloc,
i stabilim o pondere drum.
O dat ce unui nod, altul dect rdcina sau ul ei, i sunt stabilite ponderi bloc, nu-i vor
mai stabilite mai departe ponderi drum. Pentru a vedea motivul s observm c de ecare
dat cnd apare o comprimare de drum, rangul unui nod x
i
pentru care p[x
i
] = x
l
, rmne
acelai, dar noul printe al lui x
i
are rangul strict mai mare dect rangul vechiului printe al
lui x
i
. Diferena dintre rangurile lui x
i
i al printelui su este o funcie monoton cresctoare
n timp. Astfel, diferena dintre lg

[p[x
i
]] i lg

[x
i
] este deasemenea o funcie monoton
cresctoare n timp. O dat ce x
i
i printele lui ajung s aib rangurile n blocuri diferite, vor
avea mereu rangurile n blocuri diferite i astfel lui x
i
nu i se va mai asocia o pondere drum.
Deoarece am atribuit pondere o dat pentru ecare nod vizitat n ecare operaie Gsete-
Mulime, numrul total de ponderi stabilite este numrul total de noduri vizitate n toate
operaiile Gsete-Mulime; acest total reprezint costul real pentru toate operaiile Gsete-
Mulime. Vrem s artm c acest total este O(mlg

n).
Numrul de ponderi bloc este uor de mrginit. Exist cel mult o pondere bloc asociat -
ecrui numr de bloc de pe drumul de cutare dat, plus o pondere bloc pentru ul rdcinii.
Deoarece numerele de bloc aparin intervalului de la 0 la lg

n1, sunt cel mult lg

n+1 ponderi
de bloc pentru ecare operaie Gsete-Mulime. Astfel, sunt cel mult m(lg

n + 1) ponderi
bloc asociate n toate operaiile Gsete-Mulime.
Mrginirea ponderilor drum este mai puin direct. ncepem prin a observa c dac nodului
x
i
i este asociat o pondere drum, atunci p[x
i
] = x
l
naintea comprimrii drumului, deci lui x
i
i se va atribui un printe nou n timpul comprimrii drumului. Mai mult, aa cum am observat
nainte, noul printe al lui x
i
are rangul mai mare dect vechiul printe. Presupunem c rangul
nodului x
i
este n blocul j. De cte ori i se poate atribui lui x
i
un nou printe, i astfel s i se
asocieze o pondere drum, nainte ca s i se atribuie un printe al crui rang este ntr-un bloc
diferit (dup care nu i se va mai asocia vreo pondere drum)? Acest numr este maxim atunci
cnd x
i
are cel mai mic rang din blocul su, i anume B(j 1) + 1 i rangurile prinilor si
succesivi iau valorile B(j 1) +2, B(j 1) +3, ..., B(j). Deoarece sunt B(j) B(j 1) 1 astfel
de ranguri, deducem c unui vrf i se pot asocia cel mult B(j) B(j 1) 1 ponderi drum,
atta timp ct rangul su este n blocul j.
Pasul urmtor n mrginirea ponderilor drum este mrginirea numrului de noduri care au
rangurile n blocul j pentru j 0. (Reamintim c, pe baza lemei 22.2 c un nod nu-i mai
schimb rangul dup ce devine ul altui nod.) Notm cu N(j) numrul de noduri ale cror
ranguri sunt n blocul j. Apoi, din lema 22.4 avem
N(j)
B(j)

r=B(j1)+1
n
2
r
.
394 Capitolul 22 Structuri de date pentru mulimi disjuncte
Pentru j = 0, aceast sum se evalueaz la
N(0) = n/2
0
+n/2
1
= 3n/2 = 3n/2B(0).
Pentru j 1 avem
N(j)
n
2
B(j1)+1
B(j)(B(j1)+1)

r=0
1
2
r
<
n
2
B(j1)+1

r=0
1
2
r
=
n
2
B(j1)
=
n
B(j)
.
Astfel, N(j) n/B(j) pentru orice numr ntreg j 0.
ncheiem mrginirea ponderilor drum prin nsumarea peste blocuri a produsului dintre
numrul maxim de noduri cu rangurile ntr-un bloc i numrul maxim de ponderi drum pentru
un nod din acel bloc. Notnd cu P(n) numrul total de ponderi drum avem
P(n)
lg

n1

j=0
n
B(j)
(B(j) B(j 1) 1)
lg

n1

j=0
n
B(j)
B(j) = nlg

n.
Deci numrul total de ponderi impuse de operaiile Gsete-Mulime este O(m(lg

n +
1) + nlg

n), care este O(mlg

n) deoarece m n. Deoarece avem O(n) operaii Formeaz-


Mulime i Unete, cu cte o pondere ecare, timpul total este O(mlg

n).
Corolarul 22.8 O secven de m operaii Formeaz-Mulime, Reunete i Gsete-
Mulime, dintre care n sunt operaii Formeaz-Mulime, pot executate pe o pdure de
mulimi disjuncte cu reuniune dup rang i comprimarea drumului ntr-un timp O(mlg

n), n
cazul cel mai defavorabil.
Demonstraie. Este imediat din teorema 22.7 i lema 22.6.
Exerciii
22.4-1 Demonstrai lema 22.2.
22.4-2 Ci bii sunt necesari pentru a memora dim(x), pentru ecare nod x? Dar pentru
[x]?
22.4-3 Folosind lema 22.2 i corolarul 22.5, dai o demonstraie simpl pentru timpul de
execuie O(mlg n) pentru operaiile pe o pdure de mulimi disjuncte cu reuniune dup rang,
dar fr comprimarea drumului.
22.4-4 S presupunem c modicm regula de atribuire a ponderilor astfel nct s atribuim
o pondere bloc pentru ultimul nod din drumul de cutare al crui rang este n blocul j pentru
j = 0, 1, ..., lg

n1. Altfel atribuim nodului o pondere drum. Dac un nod este un u al rdcinii
i nu este ultimul nod al unui bloc, i este asociat o pondere drum i nu o pondere bloc. Artai
c pot atribuite (m) ponderi drum unui nod dat ct timp rangul su este n blocul dat j.
Probleme 395
Probleme
22-1 Minim o-line
Problema minimului o-line impune meninerea unei mulimi dinamice T de elemente din
domeniul 1, 2, . . . , n, asupra creia se pot face operaii Insereaz i Extrage-Min. Se
consider o secven S de n apeluri Insereaz i m apeluri Extrage-Min, prin care ecare
cheie din mulimea 1, 2, . . . , n este inserat exact o dat. Dorim s determinm ce cheie
este returnat la ecare apel al operaiei Extrage-Min. Mai exact, dorim s completm un
tablou [1..m], unde [i] este cheia returnat de al i-lea apel Extrage-Min, pentru
i = 1, 2, . . . , m. Problema este o-line n sensul c ne este permis procesarea ntregii secvene
S nainte de determinarea valorii vreunei chei returnate.
a. n urmtorul exemplu al problemei de minim o-line, ecare operaie Insereaz este
reprezentat de un numr i ecare operaie Extrage-Min este reprezentat de litera E:
4, 8, E, 3, E, 9, 2, 6, E, E, E, 1, 7, E, 5.
Completai tabloul cu valorile corecte.
Pentru a dezvolta un algoritm pentru aceast problem, mprim secvena S n subsecvene
omogene. Astfel reprezentm S prin
I
1
, E, I
2
, E, I
3
, . . . , I
m
, E, I
m+1
,
unde ecare E reprezint un singur apel Extrage-Min i ecare I
j
reprezint o secven (posibil
vid) de apeluri Insereaz. La nceput, pentru ecare subsecven I
j
, formm o mulime K
j
care conine cheile inserate prin operaiile corespunztoare; mulimea K
j
este vid dac I
j
este
vid. Apoi executm urmtorul algoritm.
Minim-Off-Line(m, n)
1: pentru i 1, n execut
2: determin j astfel nct i K
j
3: dac j = m+ 1 atunci
4: [j] i
5: e l cea mai mic valoare mai mare dect j pentru care mulimea K
l
exist
6: K
l
K
j
K
l
, distrugnd K
j
7: returneaz
b. Argumentai corectitudinea tabloului , returnat de algoritmul Minim-Off-Line.
c. Descriei cum poate folosit structura de date mulimi disjuncte, pentru a implementa
ecient Minim-Off-Line. Dai o margine ct mai precis pentru timpul de execuie, n
cazul cel mai defavorabil, al implementrii voastre.
22-2 Determinarea adncimii
n problema determinrii adncimii reinem o pdure T = T
j
de arbori cu rdcin
asupra creia se execut trei operaii:
396 Capitolul 22 Structuri de date pentru mulimi disjuncte
Formeaz-Arbore(v) creeaz un arbore al crui singur nod este v.
Gsete-Adncime(v) returneaz adncimea nodului v n arborele care l conine.
Adaug-Subarbore(r, v) face ca nodul r, ce este presupus a rdcina unui arbore, s devin
u al nodului v, care aparine altui arbore dect r, dar nu este obligatoriu rdcina acelui
arbore.
a. Presupunem c folosim o reprezentare a arborilor similar cu cea a pdurilor de mulimi
disjuncte: p[v] este printele nodului v, excepie fcnd rdcina pentru care p[v] =
v. Dac implementm Adaug-Subarbore(r, v) prin setarea p[r] v i Gsete-
Adncime(v) prin parcurgerea drumului de cutare n sus spre rdcin, returnnd
numrul tuturor nodurilor ntlnite, diferite de v, artai c timpul de execuie, n cazul
cel mai defavorabil, al secvenei de m operaii Formeaz-Arbore, Gsete-Adncime
i Adaug-Subarbore este (m
2
).
Putem reduce timpul de execuie, n cazul cel mai defavorabil, folosind euristicile reuniunii dup
rang i comprimrii drumului. Folosim o pdure de mulimi disjuncte o = o
)
, unde ecare
mulime S
i
(care este un arbore) corespunde unui arbore T
i
din pdurea T. Totui, structura
arborelui din mulimea S
i
nu corespunde n mod obligatoriu structurii arborelui T
i
. De fapt,
implementarea lui S
i
nu nregistreaz exact relaiile printe-u, dar ne permite s determinm
adncimea oricrui nod din T
i
.
Ideea de baz este de a menine n ecare nod v o pseudodistan d[v], care este denit
astfel nct suma pseudodistanelor de-a lungul drumului de la v la rdcina mulimii S
i
din care
face parte v, s e egal cu adncimea lui v n T
i
. Aceasta nseamn c, dac drumul de la v la
rdcina sa din S
i
este v
0
, v
1
, . . . , v
k
, unde v
0
= v i v
k
este rdcina lui S
i
, atunci adncimea
lui v n T
i
este

k
j=0
d[v
j
].
b. Dai o implementare pentru Formeaz-Arbore.
c. Artai cum trebuie modicat operaia Gsete-Mulime pentru a implementa proce-
dura Gsete-Adncime. Implementarea trebuie s realizeze comprimarea drumului i
timpul de execuie trebuie s e liniar, relativ la lungimea drumului de cutare. Asigurai-
v c implementarea actualizeaz corect pseudodistanele.
d. Artai cum trebuie modicate procedurile Reunete i Unete pentru a implementa
Adaug-Subarbore(r, v), ce combin mulimile care conin pe r i pe v. Asigurai-v c
implementarea actualizeaz corect pseudodistanele. Observai c rdcina unei mulimi
S
i
nu este n mod necesar rdcina arborelui T
i
corespunztor.
e. Dai o margine ct mai precis pentru timpul de execuie, n cazul cel mai defavorabil,
pentru o secven de m operaii Formeaz-Arbore, Gsete-Adncime i Adaug-
Subarbore, dintre care n sunt operaii Formeaz-Arbore.
22-3 Algoritmul o-line al lui Tarjan pentru calculul celui mai apropiat strmo
Cel mai apropiat strmo a dou noduri u i v, ntr-un arbore cu rdcin T este nodul w
care este strmo al ambelor noduri u i v i are cea mai mare adncime n T. n problema
o-line de determinare a celui mai apropiat strmo, se d un arbore T cu rdcin i
Note bibliograce 397
o mulime arbitrar P = u, v de perechi neordonate de noduri din T; dorim s determinm
cel mai apropiat strmo al ecrei perechi din P.
Pentru a rezolva aceast problem, procedura urmtoare realizeaz o parcurgere a arborelui
T la apelul iniial SCMA( [T]). Presupunem c ecare nod este colorat alb nainte de
parcurgere.
SCMA(u)
1: Formeaz-Mulime(u)
2: [Gsete-Mulime (u)] u
3: pentru ecare u v al lui u din T execut
4: SCMA(v)
5: Reunete(u, v)
6: [Gsete-Mulime(u)] u
7: culoare[u] negru
8: pentru ecare nod v pentru care u, v P execut
9: dac culoare[v]= negru atunci
10: aeaz cel mai apropiat strmo pentru u i v este [Gsete-Mulime(v)]
a. Argumentai de ce linia 10 este executat exact o dat pentru ecare pereche u, v P.
b. Demonstrai c la momentul apelului SCMA(u), numrul de mulimi din structura de
date mulimi disjuncte este egal cu adncimea lui u n T.
c. Demonstrai c procedura SCMA aeaz corect strmoul cel mai apropiat al lui u i v,
pentru ecare pereche u, v P.
d. Analizai timpul de execuie al procedurii SCMA, presupunnd c se folosete implemen-
tarea pentru structura de date mulimi disjuncte din seciunea 22.3.
Note bibliograce
Majoritatea rezultatelor importante legate de structura de date mulimi disjuncte se datorea-
z, mcar n parte, lui R. E. Tarjan. Marginea superioar de O(m(m, n)) a fost dat prima dat
de Tarjan [186, 188]. Marginea superioar O(mlg

n) a fost demonstrat anterior de Hopcroft


i Ullman [4, 103]. Tarjan i van Leeuwen [190] analizeaz variante ale euristicii comprimrii
drumului, incluznd metode cu o singur trecere, care ofer uneori factori constani mai buni
ca performan dect metodele cu dou treceri. Gabow i Tarjan [76] arat c n anumite aplicaii,
operaiile cu mulimi disjuncte pot executate ntr-un timp O(m).
Tarjan [187] arat c este necesar o margine inferioar de timp (m(m, n)) pentru
operaiile pe orice structur de date mulimi disjuncte care satisfac anumite condiii tehnice.
Aceast margine inferioar a fost mai trziu generalizat de ctre Fredman i Saks [74], care
arat c n cazul cel mai defavorabil, trebuie s e accesate (m(m, n)) cuvinte de memorie de
lungime (lg n) bii.
VI Algoritmi de grafuri
Introducere
Grafurile sunt structuri de date foarte rspndite n tiina calculatoarelor, iar algoritmii de
grafuri sunt fundamentali n acest domeniu. Exist sute de probleme de calcul denite n termeni
de grafuri. n aceast parte, ne vom ocupa de cteva dintre cele mai semnicative.
n capitolul 23 se discut modurile de reprezentare a grafurilor pe calculator i se trateaz
civa algoritmi bazai pe cutarea ntr-un graf, folosind cutarea n lime sau cea n adncime.
Sunt prezentate dou aplicaii ale cutrii n adncime: sortarea topologic a unui graf orientat
aciclic i descompunerea unui graf orientat n componentele sale tare conexe.
n capitolul 24 se descrie determinarea unui arbore de acoperire minim al unui graf. Un astfel
de arbore este denit ca ind cea mai ieftin cale de a conecta toate vrfurile atunci cnd
ecare muchie are un cost asociat. Algoritmii de determinare a arborilor minimi de acoperire
sunt exemple foarte bune de algoritmi greedy (vezi capitolul 17).
n capitolele 25 i 26 se trateaz problema determinrii drumurilor minime ntre vrfuri,
cnd ecare muchie are asociat o lungime sau un cost. n capitolul 25 se trateaz determinarea
drumurilor minime de la un nod surs dat la toate celelalte vrfuri, iar n capitolul 26 se trateaz
determinarea drumurilor minime ntre orice pereche de vrfuri.
n nal, n capitolul 27 se discut modul de calculare a unui ux maxim de material ntr-o
reea (graf orientat) avnd specicate sursa de material, destinaia i cantitile de material care
pot traversa ecare muchie orientat (arc). Aceast problem general se regsete sub multe
forme, iar un algoritm bun pentru a calcula uxuri maxime poate folosit pentru rezolvarea
ecient a unei game variate de probleme nrudite.
Pentru evaluarea timpului de execuie al unui algoritm de grafuri pe un graf dat G = (V, E),
de obicei, vom msura dimensiunea intrrii n funcie de numrul de vrfuri [V [ i al numrului
de muchii [E[ al grafului. Rezult c exist doi parametri relevani care descriu dimensiunea
intrrii, i nu unul singur. Vom adopta o convenie de notaie rspndit pentru aceti parametri.
n cadrul notaiei asimptotice (de exemplu, notaia O sau i n cadrul acesteia)
simbolul V nseamn [V [, iar simbolul E nseamn [E[. De exemplu, putem scrie algoritmul
are ordinul de complexitate O(V E), aceasta nsemnnd, de fapt, algoritmul are ordinul de
complexitate O([V [[E[). Aceast notaie permite obinerea unor formule mai lizibile pentru
ordinul de complexitate al algoritmilor, fr riscul unor ambiguiti.
O alt convenie pe care o vom adopta apare n pseudocod. Vom nota mulimea vrfurilor
unui graf G cu V [G] i mulimea muchiilor sale cu E[G]. Cu alte cuvinte, din punctul de vedere
al pseudocodului, mulimea vrfurilor i cea a muchiilor sunt atribute ale unui graf.
23 Algoritmi elementari de grafuri
Acest capitol prezint cteva metode de reprezentare a unui graf precum i unele metode de
cutare ntr-un graf. Cutarea ntr-un graf nseamn parcurgerea, n mod sistematic, a muchiilor
grafului astfel nct s parcurgem vrfurile grafului. Un algoritm de cutare ntr-un graf poate
descoperi multe informaii despre structura grafului respectiv. Muli algoritmi de grafuri ncep
prin a cuta n graful de intrare pentru a obine aceast informaie structural. Ali algoritmi
de grafuri sunt simple ranri ale unor algoritmi de cutare de baz.
n seciunea 23.1 se discut cele mai uzuale dou moduri de reprezentare a grafurilor, ca
structuri de date: liste de adiacen i matrice de adiacen. n seciunea 23.2 este prezentat un
algoritm simplu de cutare n grafuri numit cutarea n lime i se prezint modul de creare
al arborelui de lime. n seciunea 23.3, se prezint cutarea n adncime i se demonstreaz
cteva rezultate consacrate despre ordinea n care cutarea n adncime viziteaz vrfurile. n
seciunea 23.4, se prezint prima aplicaie a cutrii n adncime: sortarea topologic a unui graf
orientat aciclic. O a doua aplicaie a cutrii n adncime, gsirea componentelor tare conexe
ale unui graf orientat, este prezentat n seciunea 23.5.
23.1. Reprezentrile grafurilor
Exist dou moduri standard de reprezentare a unui graf G = (V, E): ca o mulime de
liste de adiacen sau ca o matrice de adiacen. Reprezentarea prin liste de adiacen este, de
obicei, preferat, pentru c ofer un mod compact de reprezentare a grafurilor rare acelea
pentru care [E[ este mult mai mic dect [V [
2
. Majoritatea algoritmilor de grafuri prezentai n
aceast carte presupun c un graf de intrare este reprezentat n forma cu liste de adiacen.
Totui, o reprezentare cu matrice de adiacen poate preferat atunci cnd graful este dens
[E[ este aproximativ egal cu [V [
2
sau atunci cnd trebuie s decidem, rapid, dac exist o
muchie ce conecteaz dou vrfuri date. De exemplu, doi dintre algoritmii de drum minim ntre
toate perechile de vrfuri, presupun c grafurile lor de intrare sunt reprezentate prin matrice de
adiacen.
Reprezentarea prin liste de adiacen a unui graf G = (V, E) const ntr-un tablou
Adj cu [V [ liste, una pentru ecare vrf din V . Pentru ecare u V , lista de adiacen Adj[u]
conine (pointeri la) toate vrfurile v pentru care exist o muchie (u, v) E. Cu alte cuvinte,
Adj[u] este format din totalitatea vrfurilor adiacente lui u n G. De obicei, vrfurile din ecare
list de adiacen sunt memorate ntr-o ordine arbitrar. Figura 23.1(b) ilustreaz o reprezentare
prin liste de adiacen a grafului neorientat din gura 23.1(a). n mod similar, gura 23.2(b)
ilustreaz o reprezentare prin liste de adiacen a grafului orientat din gura 23.2(a).
Dac G este un graf orientat, suma lungimilor tuturor listelor de adiacen este [E[, deoarece
un arc de forma (u, v) este reprezentat prin apariia lui v n Adj[u]. Dac G este un graf
neorientat, suma lungimilor tuturor listelor de adiacen este 2[E[, deoarece, dac (u, v) este
o muchie, atunci u apare n lista de adiacen a lui v i invers. Indiferent dac un graf este
orientat sau nu, reprezentarea prin liste de adiacen are proprietatea dezirabil c dimensiunea
memoriei necesare este O(max(V, E)) = O(V +E).
23.1. Reprezentrile grafurilor 401
Figura 23.1 Dou reprezentri ale unui graf neorientat. (a) Un graf neorientat G avnd cinci vrfuri
i apte muchii. (b) O reprezentare prin liste de adiacen a lui G. (c) Reprezentarea prin matrice de
adiacen a lui G.
Figura 23.2 Dou reprezentri ale unui graf orientat. (a) Un graf orientat G avnd ase vrfuri i opt
muchii. (b) O reprezentare prin liste de adiacen a lui G. (c) Reprezentarea prin matrice de adiacen
a lui G.
Listele de adiacen pot uor adaptate n scopul reprezentrii grafurilor cu costuri,
1
adic acele grafuri n care ecrei muchii i s-a asociat un cost dat, de obicei, de o funcie
de cost w : E R. De exemplu, e G = (V, E) un graf cu costuri avnd funcia de cost w.
Costul w(u, v) al muchiei (u, v) E este memorat pur i simplu mpreun cu vrful v n lista de
adiacen a lui u. Reprezentarea prin liste de adiacen este foarte robust n sensul c poate
modicat pentru a suporta multe alte variante de grafuri.
Un dezavantaj al reprezentrii prin liste de adiacen este acela c nu exist alt cale mai
rapid pentru a determina dac o muchie dat (u, v) aparine grafului, dect cutarea lui v n
lista de adiacen Adj[u]. Acest dezavantaj poate remediat folosind o reprezentare a grafului
prin matrice de adiacen, dar folosind asimptotic mai mult memorie.
Pentru reprezentarea prin matrice de adiacen a unui graf G = (V, E), presupunem
c vrfurile sunt numerotate cu 1, 2, ..., [V [ ntr-un mod arbitrar. Reprezentarea prin matrice de
adiacen a grafului G const ntr-o matrice A = (a
ij
) de dimensiuni [V [ [V [ astfel nct:
a
ij
=

1 dac (i, j) E,
0 altfel.
n gurile 23.1(c) i 23.2(c) sunt prezentate matricele de adiacen ale grafurilor neorientate i
orientate din gurile 23.1(a) i, respectiv, 23.2(a). Necesarul de memorie pentru matricea de
n literatura de specialitate n limba romn se folosete uneori i termenul de graf ponderat n. t.
402 Capitolul 23 Algoritmi elementari de grafuri
adiacen a unui graf este (V
2
) i nu depinde de numrul de muchii ale grafului.
Se poate observa simetria fa de diagonala principal a matricei de adiacen din gura
23.1(c). Se denete transpusa unei matrice A = (a
ij
) ca ind matricea A
T
= (a
T
ij
), dat de
a
T
ij
= a
ji
. Deoarece ntr-un graf neorientat (u, v) i (v, u) reprezint aceeai muchie, matricea
de adiacen A a unui graf neorientat este propria sa transpus: A = A
T
. n anumite aplicaii,
este avantajos s stocm numai elementele situate pe i deasupra diagonalei principale, reducnd
astfel memoria necesar pentru stocarea grafului cu aproape 50 de procente.
La fel ca reprezentarea prin liste de adiacen, reprezentarea prin matrice de adiacen poate
folosit i pentru grafuri cu cost. De exemplu, dac G = (V, E) este un graf cu cost, avnd
costul unei muchii dat de funcia w, costul w(u, v) al muchiei (u, v) E este memorat pur i
simplu ca un element din linia u i coloana v a matricei de adiacen. Dac o muchie nu exist,
elementul corespunztor n matrice poate nil, dei pentru multe probleme este convenabil
folosirea unei valori ca 0 sau .
Dei reprezentarea prin liste de adiacen este asimptotic cel puin la fel de ecient
ca reprezentarea prin matrice de adiacen, simplitatea matricei de adiacen o poate face
preferabil, atunci cnd grafurile au un numr relativ mic de vrfuri. Mai mult, dac graful
este fr costuri, exist un avantaj suplimentar de stocare pentru reprezentarea prin matrice de
adiacen. n locul folosirii unui cuvnt de memorie pentru ecare element din matrice, matricea
de adiacen folosete doar un bit pentru ecare element.
Exerciii
23.1-1 Dat ind o reprezentare prin liste de adiacen a unui graf orientat, ct timp dureaz
calcularea gradului exterior al ecrui vrf? Ct timp dureaz calcularea gradelor interioare?
23.1-2 Dai o reprezentare prin liste de adiacen pentru un arbore binar complet cu 7
vrfuri. Dai o reprezentare prin matrice de adiacen echivalent. Presupunei c vrfurile sunt
numerotate de la 1 la 7 ca ntr-o mulime binar.
23.1-3 Transpusul unui graf orientat G = (V, E) este graful G
T
= (V, E
T
), unde E
T
=
(v, u) V V : (u, v) E. Astfel, G
T
este G cu toate muchiile sale inversate. Descriei civa
algoritmi ecieni pentru calcularea lui G
T
din G, pentru reprezentarea prin liste de adiacen
i prin matrice de adiacen a lui G. Analizai timpii de execuie ai algoritmilor.
23.1-4 Dat ind o reprezentare prin liste de adiacen a unui multigraf G = (V, E), descriei
un algoritm care s ruleze ntr-un timp O(V + E), care s calculeze reprezentarea prin liste de
adiacen a grafului neorientat echivalent G
t
= (V, E
t
), unde n E
t
toate muchiile multiple
ntre dou vrfuri din E sunt nlocuite printr-o singur muchie i toate ciclurile de la un nod la
el nsui sunt anulate.
23.1-5 Ptratul unui graf orientat G = (V, E) este graful G
2
= (V, E
2
) n care (u, w) E
2
dac i numai dac pentru un vrf oarecare v V , att (u, v), ct i (v, w) aparin lui E. Aceasta
nseamn c G
2
conine o muchie ntre u i w dac G conine un drum cu exact dou muchii
ntre u i w. Descriei civa algoritmi ecieni pentru a calcula G
2
din G, folosind reprezentarea
prin liste de adiacen respectiv reprezentarea prin matrice de adiacen a lui G. Analizai timpii
de execuie ai algoritmilor propui.
23.2. Cutarea n lime 403
23.1-6 Cnd se folosete o reprezentare prin matrice de adiacen, cei mai muli algoritmi de
grafuri necesit timpul (V
2
), dar exist i excepii. Artai c, pentru a determina dac un graf
orientat are sau nu o destinaie un vrf cu numrul muchiilor ce intr n el egal cu [V [ 1
i numrul muchiilor ce ies din el egal cu 0 exist un algoritm de timp O(V ), chiar dac se
folosete o reprezentare prin matrice de adiacen.
23.1-7 Matricea de inciden a unui graf orientat G = (V, E) este o matrice B = (b
ij
) de
dimensiuni [V [ [E[ astfel nct
b
ij
=

1 dac muchia j pleac din vrful i,


1 dac muchia j intr n vrful i,
0 altfel.
Artai ce reprezint elementele produsului matriceal BB
T
, unde B
T
este transpusa lui B.
23.2. Cutarea n lime
Cutarea n lime este unul din cei mai simpli algoritmi de cutare ntr-un graf i arhetipul
pentru muli algoritmi de grafuri importani. Algoritmul lui Dijkstra pentru determinarea
drumurilor minime de la un nod surs la toate celelalte (capitolul 25) i algoritmul lui Prim
pentru determinarea arborelui parial de cost minim (seciunea 24.2) folosesc idei similare celor
din algoritmul de cutare n lime.
Dat ind un graf G = (V, E) i un nod surs s, cutarea n lime exploreaz sistematic
muchiile lui G pentru a descoperi ecare nod care este accesibil din s. Algoritmul calculeaz
distana (cel mai mic numr de muchii) de la s la toate aceste vrfuri accesibile. El produce un
arbore de lime cu rdcina s, care conine toate aceste vrfuri accesibile. Pentru ecare vrf
v accesibil din s, calea din arborele de lime de la s la v corespunde unui cel mai scurt drum
de la s la v n G, adic un drum care conie un numr minim de muchii. Algoritmul funcioneaz
att pe grafuri orientate ct i pe grafuri neorientate.
Cutarea n lime este numit astfel pentru c lrgete, uniform, frontiera dintre nodurile
descoperite i cele nedescoperite, pe limea frontierei. Aceasta nseamn c algoritmul descoper
toate vrfurile aate la distana k fa de s nainte de a descoperi vreun vrf la distana k + 1.
Pentru a ine evidena avansrii, cutarea n lime coloreaz ecare nod cu alb, gri sau
negru. Toate vrfurile sunt colorate la nceput cu alb i pot deveni apoi gri sau negre. Un vrf
este descoperit cnd este ntlnit prima dat n timpul unei cutri, moment n care nu mai
este alb. De aceea, vrfurile gri i negre sunt descoperite, dar algoritmul face diferena ntre
ele pentru a sigur c procesul de cutare are loc pe lime. Dac (u, v) E i vrful u este
negru, atunci vrful v este sau gri sau negru, adic toate vrfurile adiacente unui nod negru au
fost descoperite. Vrfurile gri pot avea vrfuri adiacente albe. Acestea reprezint frontiera dintre
vrfurile descoperite i cele nedescoperite.
Algoritmul de cutare n lime construiete un arbore de lime ce conine, iniial, numai
rdcina sa, care este vrful s. Oricnd un vrf alb v este descoperit n cursul parcurgerii listei
de adiacen a unui vrf u deja descoperit, vrful v i muchia (u, v) sunt adugate n arbore. n
acest caz, spunem c u este predecesorul sau printele lui v n arborele de lime. Deoarece
un vrf este descoperit cel mult o dat, el poate avea cel mult un printe. Relaiile de strmo
404 Capitolul 23 Algoritmi elementari de grafuri
i descendent, din arborele de lime, sunt denite relativ la rdcina s n mod obinuit: dac u
se a pe un drum din arbore de la rdcina s la vrful v, atunci u este un strmo al lui v, iar
v este un descendent al lui u.
Procedura de cutare n lime CL, de mai jos, presupune c graful de intrare G = (V, E)
este reprezentat folosind liste de adiacen. Algoritmul ntreine mai multe structuri de date
adiionale pentru ecare vrf din graf. Culoarea ecrui vrf u V este memorat n variabila
color[u], i predecesorul lui u este memorat n variabila [u]. Dac u nu are nici un predecesor
(de exemplu, dac u = s sau u nu a fost descoperit), atunci [u] = nil. Distana de la sursa s la
vrful u, calculat de algoritm, este memorat n d[u]. De asemenea, algoritmul folosete o coad
Q de tipul primul sosit, primul servit (a se vedea seciunea 11.1) pentru a prelucra mulimea de
vrfuri gri.
CL(G, s)
1: pentru ecare vrf u V [G] s execut
2: color[u] alb
3: d[u]
4: [u] nil
5: color[s] gri
6: d[s] 0
7: [s] nil
8: Q s
9: ct timp Q = execut
10: u cap[Q]
11: pentru ecare vrf v Adj[u] execut
12: dac color[v] = alb atunci
13: color[v] gri
14: d[v] d[u] + 1
15: [v] u
16: Pune-n-Coad(Q, v)
17: Scoate-Din-Coad(Q)
18: color[u] negru
Figura 23.3 ilustreaz efectele algoritmului CL pe un graf de test.
Procedura CL lucreaz n felul urmtor: Liniile 14 coloreaz ecare vrf n alb, atribuie lui
d[u] valoarea pentru ecare vrf u i seteaz printele ecrui vrf pe nil. Linia 5 coloreaz
vrful surs s cu gri, deoarece el este considerat descoperit atunci cnd procedura ncepe. Linia
6 iniializeaz d[s] cu 0, iar linia 7 iniializeaz predecesorul sursei cu nil. Linia 8 iniializeaz Q
ca ind o coad ce conine un singur vrf, i anume s. Ulterior, Q conine mulimea vrfurilor gri.
Bucla principal a programului este coninut n liniile 918. Iteraia are loc ct timp mai
exist vrfuri gri, adic vrfuri descoperite a cror list de adiacen nu a fost examinat n
ntregime. Linia 10 determin vrful gri u din capul cozii Q. Bucla pentru, din liniile 1116,
consider ecare vrf v din lista de adiacen a lui u. Dac v este alb, atunci el nu a fost nc
descoperit, i algoritmul l descoper executnd liniile 1316. La nceput, el este colorat cu gri,
iar distana d[v] este iniializat cu d[u] + 1. Apoi, u este nregistrat ca printe al su. n nal,
vrful v este plasat la sfritul cozii Q. Cnd toate vrfurile din lista de adiacen a lui u au fost
examinate, u este scos din Q i colorat cu negru n liniile 1718.
23.2. Cutarea n lime 405
Figura 23.3 Execuia algoritmului CL pe un graf neorientat. Muchiile arborilor sunt prezentate haurat
aa cum sunt produse de CL. mpreun cu ecare vrf u, este prezentat d[u]. Coada Q este prezentat
la nceputul ecrei iteraii a buclei ct timp din liniile 918. Distanele vrfurilor sunt prezentate lng
vrfurile din coad.
Analiz
nainte de a descrie variatele proprieti ale cutrii n lime, vom aborda o problem mai
uoar, i anume, analiza timpului de execuie a acestui algoritm pe un graf de intrare G = (V, E).
Dup iniializare, nici un vrf nu este fcut vreodat alb, i, astfel, testul din linia 12 asigur
faptul c ecare vrf este pus n coad cel mult o dat i, de aceea, acesta va scos din coad
cel mult o dat. Operaiile de punere i de extragere a unui element din coad se fac ntr-un
timp O(1), deci timpul total alocat operaiilor efectuate cu coada este O(V ). Pentru c lista
de adiacen a ecrui vrf este examinat doar atunci cnd vrful este scos din coad, lista
de adiacen a ecrui vrf este examinat cel mult o dat. Deoarece suma lungimilor tuturor
listelor de adiacen este (E), timpul cel mai defavorabil pentru parcurgerea tuturor listelor de
adiacen este O(E). Timpul pentru iniializare este O(V ) i, astfel, timpul total de execuie a
406 Capitolul 23 Algoritmi elementari de grafuri
algoritmului CL este O(V +E). Astfel, cutarea n lime ruleaz ntr-un timp liniar, ce depinde
de mrimea reprezentrii prin liste de adiacen a grafului G.
Drumuri de lungime minim
La nceputul acestei seciuni, am armat c algoritmul de cutare n lime determin
distana de la un nod surs dat, s V , la ecare nod accesibil dintr-un graf G = (V, E).
Denim lungimea celui mai scurt drum (s, v), din s n v, ca ind numrul minim de muchii
ale oricrui drum din vrful s n vrful v, sau dac nu exist nici un drum de la s la v. Un drum
de lungime (s, v), de la s la v, se numete drum de lungime minim
2
de la s la v. nainte de
a demonstra c algoritmul de cutare n lime calculeaz, de fapt, lungimile drumurilor minime,
vom studia o proprietate important a lungimilor drumurilor minime.
Lema 23.1 Fie G = (V, E) un graf orientat sau neorientat, i e s V un vrf arbitrar. Atunci,
pentru orice muchie (u, v) E,
(s, v) (s, u) + 1.
Demonstraie. Dac u este accesibil din s, atunci i v este accesibil din s. n acest caz, cel mai
scurt drum de la s la v nu poate mai lung dect cel mai scurt drum de la s la u, la care se
adaug muchia (u, v), i astfel inegalitatea este adevrat. Dac u nu este accesibil din s, atunci
(s, u) = , i inegalitatea este adevrat.
Dorim s demonstrm c procedura CL calculeaz corect d[v] = (s, v) pentru ecare vrf
v V . Vom demonstra nti c d[v] mrginete superior (s, v).
Lema 23.2 Fie G = (V, E) un graf orientat sau neorientat i s presupunem c CL este rulat
pe G pentru un vrf surs s V dat. Atunci, la terminare, pentru ecare vrf v V , valoarea
d[v] calculat de CL satisface inegalitatea d[v] (s, v).
Demonstraie. Vom folosi inducia dup numrul de plasri ale unui vrf n coada Q. Ipoteza
inductiv este c d[v] (s, v) pentru orice v V . Baza acestei inducii este situaia imediat
urmtoare momentului cnd, n linia 8 din CL, s este plasat n Q. Ipoteza inductiv este
adevrat, pentru c d[s] = 0 = (s, s) i d[v] = (s, v), pentru orice v V s.
Pentru pasul inductiv, vom considera un vrf alb v care este descoperit n timpul parcurgerii
listei vecinilor unui vrf u. Ipoteza inductiv implic faptul c d[u] (s, u). Din atribuirea
efectuat n linia 14 i din lema 23.1, obinem:
d[v] = d[u] + 1 (s, u) + 1 (s, v).
Apoi, vrful v este inserat n coada Q i nu va mai introdus niciodat pentru c este colorat
gri i clauza atunci din liniile 1316 este executat numai pentru vrfurile albe. Astfel valoarea
d[v] nu se mai schimb niciodat i ipoteza inductiv este vericat.
Pentru a demonstra c d[v] = (s, v), trebuie, mai nti, s studiem mai exact cum lucreaz
coada Q n timpul execuiei CL. Urmtoarea lem arat c, n orice moment, exist n coad
cel mult dou valori distincte d.
n capitolele 25 i 26 vom generaliza studiul nostru referitor la drumurile de lungime minim la grafurile cu
costuri, n care ecare muchie are un cost exprimat printr-o valoare real, iar costul unui drum este dat de suma
costurilor muchiilor constituente. Grafurile luate n considerare n prezentul capitol sunt fr costuri.
23.2. Cutarea n lime 407
Lema 23.3 S presupunem c n timpul execuiei lui CL pe un graf G = (V, E), coada Q
conine vrfurile 'v
1
, v
2
, ..., v
r
`, unde v
1
este primul element al lui Q i v
r
este ultimul. Atunci
d[v
r
] d[v
1
] + 1 i d[v
i
] d[v
i+1
] pentru i = 1, 2, ..., r 1.
Demonstraie. Demonstraia se face prin inducie dup numrul de operaii cu coada. Iniial,
cnd coada l conine doar pe s, lema este evident adevrat.
Pentru pasul inductiv, trebuie s demonstrm c lema este adevrat dup ce am scos un
vrf din list, respectiv, am pus unul. Dac vrful v
1
din capul listei este scos din list, noul cap
al listei este v
2
. (n cazul n care coada devine vid, lema este evident adevrat.) Dar atunci,
avem d[v
r
] d[v
1
] +1 d[v
2
] +1, iar inegalitile rmase sunt neafectate. Astfel, lema continu
cu v
2
pe post de cap al listei. Punerea unui vrf n list necesit o examinare mai atent a
codului. n linia 16 a CL, cnd vrful v este pus n list, devenind astfel v
r+1
, capul v
1
al lui Q
este, de fapt, vrful u a crui list de adiacen este examinat n acel moment. Astfel d[v
r+1
] =
d[v] = d[u] + 1 = d[v
1
] + 1. Avem, de asemenea, d[v
r
] d[v
1
] + 1 = d[u] + 1 = d[v] = d[v
r+1
] i
inegalitile rmase sunt neafectate. Astfel lema este adevrat cnd v este pus n coad.
Putem, acum, demonstra c algoritmul de cutare n lime calculeaz corect lungimile celor
mai scurte drumuri.
Teorema 23.4 (Corectitudinea cutrii n lime) Fie G = (V, E) un graf orientat sau
neorientat i s presupunem c CL este rulat pe G pentru un vrf surs s V dat. Atunci, n
timpul execuiei sale, CL descoper ecare vrf v V care este accesibil din nodul surs s i,
dup terminare, d[v] = (s, v) pentru orice v V . Mai mult, pentru orice vrf v = s, accesibil
din s, unul din cele mai scurte drumuri de la s la v este cel mai scurt drum de la s la [v] urmat
de muchia ([v], v).
Demonstraie. ncepem cu cazul n care v nu este accesibil din s. Deoarece lema 23.2 arm
c d[v] (s, v) = , valorii d[v] a vrfului v nu i se poate atribui niciodat o valoare nit n
linia 14. Prin inducie, nu poate exista un prim vrf a crui cmp d s primeasc valoarea n
linia 14. De aceea, linia 14 este executat doar pentru vrfurile cu valori d nite. Astfel, dac v
nu este accesibil, nu este niciodat descoperit.
Partea principal a demonstraiei analizeaz cazul vrfurilor accesibile din s. Fie V
k
mulimea
vrfurilor aate la distana k de s, adic V
k
= v V : (s, v) = k. Demonstraia ncepe cu o
inducie dup k. Presupunem, ca ipotez inductiv, c, pentru ecare vrf v V
k
, exist exact
un moment n timpul execuiei lui CL n care
v este gri,
lui d[v] i se atribuie valoarea k,
dac v = s atunci lui [v] i se atribuie valoarea u, pentru un u V
k1
arbitrar i
v este inserat n coada Q.
Dup cum am observat mai devreme, exist cu siguran cel mult un astfel de moment.
Baza induciei este cazul k = 0. Deoarece s este singurul vrf la distana 0 de s, avem
V
0
= s. n timpul iniializrii, s este colorat cu gri, d[s] primete valoarea 0, iar s este plasat
n Q, deci ipoteza inductiv este adevrat.
Pentru pasul inductiv, observm c, evident, coada Q nu este niciodat vid pn cnd
algoritmul nu se termin i c, o dat ce un vrf u este inserat n coad, nici d[u] nici [u] nu
408 Capitolul 23 Algoritmi elementari de grafuri
se schimb vreodat. De aceea, din lema 23.3, dac vrfurile sunt inserate n coad n timpul
execuiei algoritmului n ordinea v
1
, v
2
, ..., v
r
, atunci irul de distane este cresctor: d[v
i
]
d[v
i+1
] pentru i = 1, 2, ..., r 1.
Acum, s considerm un vrf arbitrar v V
k
, unde k 1. Proprietatea de monotonie,
combinat cu faptul c d[v] k (din lema 23.2) i cu ipoteza inductiv, implic faptul c v
trebuie descoperit, dac este descoperit vreodat, dup ce toate vrfurile din V
k1
sunt puse n
coad.
Deoarece (s, v) = k, exist un drum de k muchii de la s la v, i, astfel, exist un vrf
u V
k1
aa nct (u, v) E. Fr a reduce generalitatea, e u primul astfel de vrf colorat n
gri, care trebuie s existe deoarece, prin inducie, toate vrfurile din V
k1
sunt gri. Codul din
CL pune n coad toate vrfurile gri i de aici u trebuie s apar n cele din urm n postura
de cap al cozii Q n linia 10. Cnd u apare n postura de cap al listei, lista sa de adiacen este
examinat i v este descoperit. (Vrful v nu ar putut descoperit mai devreme deoarece nu
este adiacent vreunui vrf din V
j
pentru j < k 1 altfel, v nu ar putea aparine lui V
k
i,
prin presupunerea anterioar, u este primul vrf descoperit din V
k1
cruia v i este adiacent.
n linia 13 v este colorat n gri, n linia 14 se face atribuirea d[v] = d[u] + 1 = k, n linia 15 lui
[v] i este atribuit valoarea u, iar n linia 16 v este inserat n coad. Deoarece v este un vrf
arbitrar din V
k
, ipoteza inductiv este astfel demonstrat.
Pentru a termina demonstraia teoremei, s observm c dac v V
k
atunci pe baza celor
deja demonstrate, [v] V
k1
. Astfel putem obine un drum de lungime minim de la s la v,
lund un drum de lungime minim de la s la [v] i traversnd apoi muchia ([v], v).
Arbori de lime
Procedura CL construiete un arbore de lime pe msur ce caut n graf, aa cum este
ilustrat n gura 23.3. Arborele este reprezentat de cmpul n ecare vrf. Mai formal, pentru
un graf G = (V, E) cu sursa s, denim subgraful predecesor al lui G ca ind G

= (V

, E

),
unde
V

= v V : [v] = nil s
i
E

= ([v], v) E : v V

s.
Subgraful predecesor G

este un arbore de lime dac mulimea V

este format din vrfurile


accesibile din s i, pentru orice v V

, exist n G

un unic drum simplu de la s la v, care este,


de asemenea, un drum de lungime minim n G de la s la v. Un arbore de lime este de fapt
un arbore, deoarece este conex i [E

[ = [V

[ 1 (vezi teorema 5.2). Muchiile din E

se numesc
muchii de arbore.
Dup ce CL a fost rulat pe un graf G, pentru un vrf surs s, urmtoarea lem arat faptul
c subgraful predecesor este un arbore de lime.
Lema 23.5 Cnd este rulat pe un graf orientat sau neorientat G = (V, E), procedura CL
construiete astfel nct subgraful predecesor G

= (V

, E

) este un arbore de lime.


Demonstraie. n linia 15 din CL se face atribuirea [v] = u, doar dac (u, v) E i (s, v) <
adic dac v este accesibil din s i astfel V

este constituit din vrfurile din V accesibile din


23.2. Cutarea n lime 409
s. Deoarece G

formeaz un arbore, el conine un unic drum de la s la ecare vrf din V

.
Aplicnd inductiv teorema 23.4, tragem concluzia c ecare astfel de drum este un drum de
lungime minim.
Urmtoarea procedur tiprete vrfurile de pe un drum de lungime minim de la s la v,
presupunnd c algoritmul CL a fost deja rulat pentru a calcula arborele de drumuri de lungime
minim.
Tiprete-Cale(G, s, v)
1: dac v = s atunci
2: tiprete s
3: altfel dac [v] = nil atunci
4: tiprete nu exist nici un drum de la s la v
5: altfel
6: Tiprete-Cale(G, s, [v])
7: tiprete v
Aceast procedur ruleaz ntr-un timp liniar ce depinde de numrul de vrfuri din drumul
care este tiprit, deoarece ecare apel recursiv se face pentru un drum mai scurt cu un vrf.
Exerciii
23.2-1 Precizai rezultatul rulrii algoritmului de cutare n lime pe graful orientat din gura
23.2(a) folosind vrful 3 pe post de surs.
23.2-2 Precizai rezultatul rulrii algoritmului de cutare n lime pe graful orientat din gura
23.3 folosind vrful u pe post de surs.
23.2-3 Care este timpul de execuie al CL dac graful su de intrare este reprezentat printr-o
matrice de adiacen i algoritmul este modicat s suporte aceast form de intrare?
23.2-4 Argumentai faptul c, pentru o cutare n lime, valoarea d[u] atribuit unui vrf u
este independent de ordinea n care sunt date vrfurile din ecare list de adiacen.
23.2-5 Dai un exemplu de graf orientat G = (V, E), un vrf surs s V i o mulime de muchii
de arbore E

E astfel nct, pentru ecare vrf v V , drumul unic din E

de la s la v este
un drum de lungime minim n G, i, totui, mulimea de muchii E

nu poate obinut rulnd


CL pe G, indiferent de modul n care sunt aranjate nodurile n ecare list de adiacen.
23.2-6 Elaborai un algoritm ecient pentru a determina dac un graf neorientat este bipartit.
23.2-7 Diametrul unui arbore T = (V, E) este dat de
max
u,vV
(u, v),
adic diametrul este cel mai lung drum dintre toate drumurile de lungime minim din arbore.
Elaborai un algoritm ecient pentru a determina diametrul unui arbore i analizai timpul de
execuie al algoritmului propus.
410 Capitolul 23 Algoritmi elementari de grafuri
23.2-8 Fie G = (V, E) un graf neorientat. Dai un algoritm care s ruleze ntr-un timp O(V +E)
pentru a determina un drum n G care s traverseze ecare muchie din E exact o dat n ecare
direcie. Descriei cum se poate gsi calea de ieire dintr-un labirint, presupunnd c vi se d o
cantitate sucient de bnui.
23.3. Cutarea n adncime
Strategia folosit de cutarea n adncime este, dup cum ne arat i numele, de a cuta mai
adnc n graf oricnd acest lucru este posibil. n cutarea n adncime, muchiile sunt explorate
pornind din vrful v cel mai recent descoperit care mai are nc muchii neexplorate, care pleac
din el. Cnd toate muchiile care pleac din v au fost explorate, cutarea revine pe propriile
urme, pentru a explora muchiile care pleac din vrful din care v a fost descoperit. Aceast
operaie continu pn cnd sunt descoperite toate vrfurile accesibile din vrful surs iniial.
ntregul proces este repetat pn cnd toate vrfurile sunt descoperite.
La fel ca n cazul cutrii n lime, de ecare dat cnd un vrf v este descoperit n
timpul unei examinri a listei de adiacen a unui vrf u, deja descoperit, cutarea n adncime
nregistreaz acest eveniment punndu-l pe u n cmpul predecesorului lui v, [v]. Spre deosebire
de cutarea n lime, unde subgraful predecesor formeaz un arbore, subgraful predecesor produs
de cutarea n adncime poate compus din mai muli arbori, deoarece cutarea poate repetat
pentru surse multiple. De aceea, subgraful predecesor al unei cutri n adncime este denit
ntr-un mod uor diferit fa de acela al unei cutri n lime: vom nota G

= (V, E

), unde
E

= ([v], v) : v V i [v] = nil.


Subgraful predecesor al unei cutri n adncime formeaz o pdure de adncime compus
din mai muli arbori de adncime. Muchiile din E

se numesc muchii de arbore.


Ca n cazul cutrii n lime, vrfurile sunt colorate n timpul cutrii pentru a indica starea
lor. Iniial ecare vrf este alb, pentru ca el s e fcut, apoi, gri cnd este descoperit n timpul
cutrii, i negru cnd este terminat, adic atunci cnd lista lui de adiacen a fost examinat
n ntregime. Aceast tehnic garanteaz faptul c ecare vrf ajunge exact ntr-un arbore de
adncime, astfel nct aceti arbori sunt disjunci.
Pe lng crearea unei pduri de adncime, cutarea n adncime creeaz pentru ecare vrf
i marcaje de timp. Fiecare vrf v are dou astfel de marcaje: primul marcaj de timp d[v]
memoreaz momentul cnd v este descoperit pentru prima oar (i colorat gri), iar al doilea
marcaj f[v] memoreaz momentul cnd cutarea termin de examinat lista de adiacen a lui v
(i l coloreaz pe v n negru). Aceste marcaje de timp sunt folosite n muli algoritmi de grafuri
i sunt, n general, folositoare n argumentarea comportrii cutrii n adncime.
Procedura CA de mai jos memoreaz n d[u] momentul cnd u este descoperit i n f[u]
momentul cnd u este terminat. Aceste marcaje de timp sunt valori ntregi ntre 1 i 2[V [,
deoarece exist un eveniment de descoperire i unul de terminare pentru ecare din cele [V [
vrfuri. Pentru ecare vrf u,
d[u] < f[u]. (23.1)
Vrful u este alb nainte de momentul d[u], gri ntre momentul d[u] i momentul f[u] i negru
dup aceea.
23.3. Cutarea n adncime 411
Urmtorul pseudocod este algoritmul de baz al cutrii n adncime. Graful de intrare G
poate orientat sau neorientat. Variabila timp este o variabil global pe care o folosim pentru
aplicarea marcajelor de timp.
CA(G)
1: pentru ecare vrf u V [G] execut
2: culoare[u] alb
3: [u] nil
4: timp 0
5: pentru ecare vrf u V [G] execut
6: dac culoare[u] = alb atunci
7: CA-Vizit(u)
CA-Vizit(u)
1: culoare[u] gri Vrful alb u tocmai a fost descoperit.
2: d[u] timp timp + 1
3: pentru ecare v Adj[u] execut Exploreaz muchia (u, v).
4: dac culoare[v] =alb atunci
5: [v] u
6: CA-Vizit(v)
7: culoare[u] negru Vrful u este colorat n negru. El este terminat.
8: f[u] timp timp + 1
Figura 23.4 ilustreaz execuia lui CA pe graful prezentat n gura 23.2.
Procedura CA funcioneaz dup cum urmeaz. n liniile 13 se coloreaz toate vrfurile n
alb i se iniializeaz cmpurile ale lor cu nil. n linia 4 contorul de timp global este resetat.
n liniile 57 se veric ecare vrf din V cruia i vine rndul i, cnd este gsit un vrf alb,
el este vizitat folosind CA-Vizit. De ecare dat cnd procedura CA-Vizit(u) este apelat
n linia 7, vrful u devine rdcina unui nou arbore din pdurea de adncime. Cnd CA-Vizit
se termin, ecrui vrf u i-a fost atribuit un timp de descoperire d[u] i un timp de terminare
f[u].
n ecare apel al procedurii CA-Vizit(u), vrful u este iniial alb. n linia 1 vrful u este
colorat n gri, iar n linia 2 se memoreaz timpul de descoperire d[u] incrementnd i salvnd
variabila global timp. n liniile 36 este examinat ecare vrf v, adiacent lui u, care este vizitat
recursiv dac acesta este alb. Pe msur ce ecare vrf v Adj[u] este examinat n linia 3,
spunem c muchia (u, v) este explorat de ctre cutarea n adncime. n nal, dup ce ecare
muchie ce pleac din u a fost explorat, n liniile 78 u este colorat n negru i timpul de terminare
este memorat n f[u].
Care este timpul de execuie al procedurii CA? Buclele din liniile 13 i din liniile 57 ale
procedurii CA necesit un timp (V ), pe lng cel necesar executrii apelurilor ctre CA-
Vizit. Procedura CA-Vizit este apelat exact o dat pentru ecare vrf v V , deoarece
CA-Vizit este invocat numai pentru vrfurile albe i primul lucru pe care l face este s
coloreze ecare vrf n gri. n timpul unei execuii a CA-Vizit(v), bucla din liniile 36 este
executat de [Adj[v][ ori. Deoarece

vV
[Adj[v][ = (E),
412 Capitolul 23 Algoritmi elementari de grafuri
Figura 23.4 Progresul algoritmului de cutare n adncime CA pe un graf orientat. Pe msur ce
muchiile sunt explorate de algoritm, ele sunt prezentate e cu culoarea gri (dac sunt muchii de arbori),
e cu linie punctat (altfel). Muchiile care nu aparin arborilor sunt etichetate cu B, C, F, n funcie
de tipul lor (ele pot muchii napoi, muchii transversale sau muchii nainte). Vrfurilor le sunt aplicate
marcaje de timp, corespunztoare timpului de descoperire, respectiv terminare.
costul total al execuiei liniilor 36 ale CA-Vizit este (E). De aceea, timpul de execuie al
CA-Vizit este (V +E).
Proprietile cutrii n adncime
Cutarea n adncime ofer multe informaii despre structura unui graf. Proprietatea
fundamental a cutrii n adncime este c subgraful su predecesor G

formeaz ntr-adevr o
pdure de arbori, deoarece structura arborilor de adncime oglindete exact structura apelurilor
recursive ale CA-Vizit. Cu alte cuvinte, u = [v] dac i numai dac CA-Vizit(v) a fost
apelat n timpul unei cutri n lista de adiacen a lui u.
O alt proprietate important a cutrii n adncime este c timpii de descoperire i terminare
au o structur de parantez. Dac reprezentm descoperirea unui vrf u printr-o parantez
23.3. Cutarea n adncime 413
deschis (u i terminarea sa printr-o parantez nchis u), atunci istoria descoperirilor i a
terminrilor formeaz o expresie corect, n sensul c parantezele sunt corect mperecheate. De
exemplu, cutarea n adncime din gura 23.5(a) corespunde parantezrii din gura 23.5(b). O
alt cale de a enuna condiia structurii parantezelor este dat n urmtoarea teorem:
Teorema 23.6 (Teorema parantezelor) n orice cutare n adncime a unui graf (orientat
sau neorientat) G = (V, E), pentru orice dou vrfuri u i v, exact una din urmtoarele trei
condiii este adevrat:
intervalele [d[u], f[u]] i [d[v], f[v]] sunt total disjuncte,
intervalul [d[u], f[u]] este coninut, n ntregime, n intervalul [d[v], f[v]], iar u este un
descendent al lui v n arborele de adncime, sau
intervalul [d[v], f[v]] este coninut, n ntregime, n intervalul [d[u], f[u]], iar v este un
descendent al lui u n arborele de adncime.
Demonstraie. ncepem cu cazul n care d[u] < d[v]. n funcie de valoarea de adevr
a inegalitii d[v] < f[u], exist dou subcazuri care trebuie considerate. n primul subcaz
d[v] < f[u], deci v a fost descoperit n timp ce u era nc gri. Aceasta implic faptul c v
este un descendent al lui u. Mai mult, deoarece v a fost descoperit naintea lui u, toate muchiile
care pleac din el sunt explorate, iar v este terminat, nainte ca algoritmul s revin pentru a-l
termina pe u. De aceea, n acest caz, intervalul [d[v], f[v]] este coninut n ntregime n intervalul
[d[u], f[u]]. n cellalt subcaz f[u] < d[v] i inegalitatea (23.1) implic faptul c intervalele
[d[u], f[u]] i [d[v], f[v]] sunt disjuncte.
Cazul n care d[v] < d[u] este similar, inversnd rolurile lui u i v n argumentaia de mai
sus.
Corolarul 23.7 (Interclasarea intervalelor descendenilor) Vrful v este un descendent
normal al lui u n pdurea de adncime pentru un graf G orientat sau neorientat dac i numai
dac d[u] < d[v] < f[v] < f[u].
Demonstraie. Este imediat din teorema 23.6.
Urmtoarea teorem ofer o alt caracterizare important a situaiei n care un vrf este
descendent al unui alt vrf n cadrul pdurii de adncime.
Teorema 23.8 (Teorema drumului alb) ntr-o pdure de adncime a unui graf G = (V, E)
orientat sau neorientat, vrful v este un descendent al vrfului u dac i numai dac la momentul
d[u], cnd cutarea l descoper pe u, vrful v este accesibil din u printr-un drum format n
ntregime din vrfuri albe.
Demonstraie. : S presupunem c v este un descendent al lui u. Fie w un vrf oarecare pe
drumul dintre u i v n arborele de adncime, astfel nct w este un descendent al lui u. Din
corolarul 23.7, d[u] < d[w], i astfel w este alb la momentul d[u].
: S presupunem c vrful v este accesibil din u printr-un drum alctuit din vrfuri albe la
momentul d[u], dar v nu devine un descendent al lui u n arborele de adncime. Fr a pierde
din generalitate, vom presupune c ecare din celelalte vrfuri din drumul respectiv devine
un descendent al lui u. (Altfel, e v cel mai apropiat vrf al lui u de pe drumul respectiv
care nu devine un descendent al lui u.) Fie w predecesorul lui v de pe drum, astfel nct w
414 Capitolul 23 Algoritmi elementari de grafuri
Figura 23.5 Proprietile cutrii n adncime. (a) Rezultatul cutrii n adncime pe un graf
orientat. Vrfurilor li se ataeaz marcaje de timp i tipul muchiilor este indicat ca n gura 23.4. (b)
Intervalele pentru timpii de descoperire i de terminare ai ecrui vrf corespund parantezrii prezentate.
Fiecare dreptunghi acoper intervalul dat de timpii de descoperire i terminare ai vrfului corespunztor.
Muchiile de arbori sunt aate. Dac dou intervale se suprapun, atunci unul este ncadrat n celalalt, iar
vrful corespunztor intervalului mai mic este un descendent al vrfului corespunztor celui mai mare.
(c) Graful din partea (a) redesenat cu muchiile de arbori i muchiile nainte mergnd n jos n cadrul
unei pduri de adncime i toate muchiile napoi mergnd n sus de la un descendent la un strmo.
este un descendent al lui u (w i u pot de fapt unul i acelai vrf) i, din corolarul 23.7,
f[w] f[u]. S observm c v trebuie descoperit dup u, dar nainte ca w s e terminat. De
aceea, d[u] < d[v] < f[w] f[u]. Atunci teorema 23.6 implic faptul c intervalul [d[v], f[v]] este
coninut n ntregime n intervalul [d[u], f[u]]. Din corolarul 23.7, v trebuie s e un descendent
al lui u.
23.3. Cutarea n adncime 415
Clasicarea muchiilor
O alt proprietate interesant a cutrii n adncime este aceea c algoritmul de cutare
poate folosit pentru clasicarea muchiilor grafului de intrare G = (V, E). Aceast clasicare
a muchiilor poate folosit pentru a aa informaii importante despre un graf. De exemplu, n
seciunea urmtoare, vom vedea c un graf orientat este aciclic dac i numai dac o cutare n
adncime nu produce nici o muchie napoi (lema 23.10).
Putem deni patru tipuri de muchii n funcie de pdurea de adncime G

produs de o
cutare n adncime pe G.
1. Muchiile de arbore sunt muchii din pdurea de adncime G

. Muchia (u, v) este o muchie


de arbore dac v a fost descoperit explornd muchia (u, v).
2. Muchiile napoi sunt acele muchii (u, v) care unesc un vrf u cu un strmo v ntr-un
arbore de adncime. Buclele (muchii de la un vrf la el nsui) care pot aprea ntr-un graf
orientat sunt considerate muchii napoi.
3. Muchiile nainte sunt acele muchii (u, v) ce nu sunt muchii de arbore i conecteaz un
vrf u cu un descendent v ntr-un arbore de adncime.
4. Muchiile transversale sunt toate celelalte muchii. Ele pot uni vrfuri din acelai arbore
de adncime, cu condiia ca unul s nu e strmoul celuilalt, sau pot uni vrfuri din arbori,
de adncime, diferii.
n gurile 23.4 i 23.5, muchiile sunt etichetate pentru a indica tipul lor. Figura 23.5(c) arat, de
asemenea, cum graful din gura 23.5(a) poate redesenat astfel nct toate muchiile de arbori
i cele nainte se ndreapt n jos ntr-un arbore de adncime i toate muchiile napoi merg n
sus. Orice graf poate redesenat n aceast manier.
Algoritmul CA poate modicat pentru a clasica muchiile pe msur ce le ntlnete. Ideea
principal este aceea c ecare muchie (u, v) poate clasicat dup culoarea vrfului v care
este atins cnd muchia (u, v) este explorat pentru prima dat (cu excepia faptului c nu se
poate face distincia ntre muchiile nainte i cele transversale):
1. alb indic o muchie de arbore,
2. gri indic o muchie napoi, i
3. negru indic o muchie nainte sau una transversal.
Primul caz este imediat din specicaiile algoritmului. Pentru cel de-al doilea caz, se observ c
vrfurile gri formeaz, ntotdeauna, un lan liniar de descendeni corespunznd stivei de apeluri
active ale procedurii CA-Vizit; numrul de vrfuri gri este cu unu mai mare dect adncimea
din pdurea de adncime a vrfului celui mai recent descoperit. Explorarea ncepe ntotdeauna
din cel mai adnc vrf gri, deci o muchie care ajunge ntr-un alt vrf gri ajunge la un strmo. Al
treilea caz trateaz posibilitatea rmas. Se poate demonstra c o astfel de muchie (u, v) este o
muchie nainte dac d[u] < d[v] i o muchie transversal dac d[u] > d[v]. (Vezi exerciiul 23.3-4.)
ntr-un graf neorientat poate exista o oarecare ambiguitate n clasicarea muchiilor, deoarece
(u, v) i (v, u) reprezint, de fapt, aceeai muchie. n acest caz, muchia este clasicat ca ind
de tip din clasicare ale crui condiii sunt ndeplinite. n mod echivalent (vezi exerciiul
416 Capitolul 23 Algoritmi elementari de grafuri
Figura 23.6 Un graf orientat pentru folosirea n exerciiile 23.3-2 i 23.5-2.
23.3-5), muchia este clasicat n funcie de care din perechile (u, v) i (v, u) apare prima n
cursul execuiei algoritmului.
Vom arta acum c muchiile nainte i cele transversale nu apar niciodat ntr-o cutare n
adncime ntr-un graf neorientat.
Teorema 23.9 ntr-o cutare n adncime ntr-un graf neorientat G, ecare muchie a lui G este
e o muchie de arbore e o muchie napoi.
Demonstraie. Fie (u, v) o muchie arbitrar a lui G i s presupunem, fr a pierde din
generalitate, c d[u] < d[v]. Atunci v trebuie descoperit i terminat nainte ca u s e terminat,
deoarece v este pe lista de adiacen a lui u. Dac muchia (u, v) este explorat prima dat n
direcia de la u la v, atunci (u, v) devine o muchie de arbore. Dac (u, v) este explorat prima
dat n direcia de la v la u, atunci (u, v) este o muchie napoi, deoarece u este nc gri n
momentul cnd muchia este explorat pentru prima oar.
n urmtoarele seciuni vom vedea multe aplicaii ale acestor teoreme.
Exerciii
23.3-1 Desenai un tabel de dimensiuni 3 3 i etichetai liniile i coloanele cu alb, gri i
negru. n ecare poziie (i, j) indicai dac, la vreun moment dat n timpul unei cutri n
adncime a unui graf orientat, poate exista o muchie de la un vrf de culoare i la un vrf de
culoare j. Pentru ecare muchie posibil, indicai de ce tip poate ea. Facei un al doilea astfel
de tabel pentru cutarea n adncime ntr-un graf orientat.
23.3-2 Artai cum funcioneaz cutarea n adncime pe graful din gura 23.6. Presupunei
c bucla pentru din liniile 57 din procedura CA consider vrfurile n ordine alfabetic i c
ecare list de adiacen este ordonat alfabetic. Determinai timpii de descoperire i terminare
pentru ecare vrf i prezentai clasicarea ecrei muchii.
23.3-3 Specicai structura parantezelor determinat de cutarea n adncime prezentat n
gura 23.4.
23.3-4 Artai c muchia (u, v) este
a. o muchie de arbore dac i numai dac d[u] < d[v] < f[v] < f[u],
b. o muchie napoi dac i numai dac d[v] < d[u] < f[u] < f[v] i
23.4. Sortarea topologic 417
c. o muchie transversal dac i numai dac d[v] < f[v] < d[u] < f[u].
23.3-5 Artai c, ntr-un graf neorientat, clasicarea unei muchii (u, v) ca ind o muchie de
arbore sau o muchie napoi, pe baza faptului c muchia (u, v) este ntlnit naintea muchiei
(v, u) n timpul cutrii n adncime, este echivalent cu clasicarea ei n funcie de prioritile
tipurilor n schema de clasicare.
23.3-6 Dai un contraexemplu pentru armaia conform creia, dac ntr-un graf orientat G
exist un drum de la u la v i ntr-o cutare n adncime n G, d[u] < d[v], atunci v este un
descendent al lui u n pdurea de adncime produs.
23.3-7 Modicai pseudocodul pentru cutarea n adncime, astfel nct s tipreasc ecare
muchie ntr-un graf orientat G, mpreun cu tipul acesteia. Artai ce modicri trebuie fcute
(n cazul n care trebuie fcut vreo modicare) dac G este neorientat.
23.3-8 Explicai cum poate ajunge un vrf u al unui graf orientat ntr-un arbore de adncime
ce l conine numai pe u, dei exist n G att muchii care intr n u ct i muchii care ies din u.
23.3-9 Artai c o cutare n adncime, ntr-un graf neorientat G, poate folosit pentru a
determina componentele conexe ale lui G, i c numrul de arbori din pdurea de adncime
este egal cu numrul componentelor conexe ale lui G. Mai exact, artai cum trebuie modicat
algoritmul de cutare n adncime, astfel nct ecare vrf v este etichetat cu o valoare ntreag
cc[v] ntre 1 i k, unde k este numrul de componente conexe ale lui G, astfel nct cc[u] = cc[v]
dac i numai dac u i v sunt n aceeai component conex.
23.3-10 Un graf orientat G = (V, E) este unic conex dac u Y v implic faptul c exist
cel mult un drum simplu de la u la v pentru toate vrfurile u, v V . Elaborai un algoritm
ecient pentru a determina dac un graf orientat este sau nu unic conex.
23.4. Sortarea topologic
Aceast seciune prezint modul n care cutarea n adncime poate folosit pentru a
executa sortri topologice ale unor grafuri orientate aciclice. O sortare topologic a unui graf
orientat aciclic G = (V, E) este o ordonare liniar a tuturor vrfurilor sale astfel nct, dac G
conine o muchie (u, v), atunci u apare naintea lui v n ordonare. (Dac un graf nu este aciclic,
atunci nu este posibil nici o ordonare liniar). O sortare topologic a unui graf poate vzut
ca o ordonare a vrfurilor sale de-a lungul unei linii orizontale, astfel nct toate muchiile sale
orientate merg de la stnga la dreapta. Sortarea topologic este deci diferit de tipul normal de
ordonare studiat n partea a II-a.
Grafurile orientate aciclice sunt folosite n multe aplicaii pentru a indica precedena ntre
evenimente. Figura 23.7 prezint un exemplu care apare cnd profesorul Bumstead se mbrac
dimineaa. Profesorul trebuie s mbrace anumite lucruri naintea altora (de exemplu, ciorapii
naintea pantolor). O muchie orientat (u, v) din graful orientat aciclic din gura 23.7(a) indic
faptul c articolul de mbrcminte u trebuie mbrcat naintea articolului v. De aceea, o sortare
topologic a acestui graf orientat aciclic ne d o ordine pentru mbrcare. Figura 23.7(b) prezint
418 Capitolul 23 Algoritmi elementari de grafuri
Figura 23.7 (a) Profesorul Bumstead i sorteaz topologic mbrcmintea cnd se mbrac. Fiecare
muchie (u, v) nseamn c articolul u trebuie mbrcat naintea articolului v. Timpii de descoperire i
de terminare dintr-o cutare n adncime sunt prezentai alturi de ecare vrf. (b) Acelai graf sortat
topologic. Vrfurile lui sunt aranjate de la stnga la dreapta n ordinea descresctoare a timpului de
terminare. Se observ c toate muchiile orientate merg de la stnga la dreapta.
graful orientat aciclic sortat topologic ca o ordonare a vrfurilor de-a lungul unei linii orizontale,
astfel nct toate muchiile orientate merg de la stnga la dreapta.
Urmtorul algoritm simplu sorteaz topologic un graf orientat aciclic.
Sortare-Topologic(G)
1: apeleaz CA(G) pentru a calcula timpii de terminare f[v] pentru ecare vrf v
2: pe msur ce ecare vrf este terminat, insereaz-l n capul unei liste nlnuite
3: returneaz lista nlnuit de vrfuri
Figura 23.7(b) arat cum vrfurile sortate topologic apar n ordine invers fa de timpii lor de
terminare.
Putem executa o sortare topologic ntr-un timp (V + E), deoarece cutarea n adncime
necesit un timp (V + E), iar inserarea ecruia din cele [V [ vrfuri n capul listei nlnuite
necesit un timp O(1).
Vom demonstra corectitudinea acestui algoritm folosind urmtoarea lem cheie, care
caracterizeaz grafurile orientate aciclice.
Lema 23.10 Un graf orientat G este aciclic dac i numai dac n urma unei cutri n adncime
n G, nu rezult nici o muchie napoi.
Demonstraie. : S presupunem c exist o muchie napoi (u, v). Atunci vrful v este un
strmo al vrfului u n pdurea de adncime. Exist deci n G o cale de la v la u, iar muchia
napoi (u, v) completeaz un ciclu.
: S presupunem c G conine un ciclu c. Vom arta c, n urma unei cutri n adncime,
n G rezult o muchie napoi. Fie v primul vrf descoperit n c, i e (u, v) muchia precedent
n c. La momentul d[v], exist un drum de vrfuri albe de la v la u. Din teorema drumului alb
23.4. Sortarea topologic 419
Figura 23.8 Un graf orientat aciclic pentru sortarea topologic.
rezult c u devine un descendent al lui v n pdurea de adncime. De aceea, (u, v) este o muchie
napoi.
Teorema 23.11 Procedura Sortare-Topologic(G) determin o sortare topologic a unui
graf orientat aciclic G.
Demonstraie. S presupunem c algoritmul CA este rulat pe un graf orientat aciclic G =
(V, E) dat, pentru a determina timpul de terminare pentru vrfurile sale. Este sucient s artm
c, pentru orice pereche de vrfuri distincte u, v V , dac exist o muchie n G de la u la v,
atunci f[v] < f[u]. S considerm o muchie oarecare (u, v) explorat de procedura CA(G). Cnd
aceast muchie este explorat, v nu poate gri deoarece v ar un strmo al lui u i (u, v) ar
o muchie napoi, contrazicnd lema 23.10. De aceea, v trebuie s e alb sau negru. Dac v este
alb, el devine un descendent al lui u i, astfel, f[v] < f[u]. Dac v este negru, atunci de asemenea
f[v] < f[u]. Astfel, pentru orice muchie (u, v) din graful orientat aciclic, avem f[v] < f[u],
demonstrnd teorema.
Exerciii
23.4-1 Artai ordinea vrfurilor produs de procedura Sortare-Topologic atunci cnd
aceasta este rulat pe graful orientat aciclic din gura 23.8, lund n considerare presupunerile
de la exerciiul 23.3-2.
23.4-2 Elaborai un algoritm care determin dac un graf neorientat G = (V, E) dat conine
sau nu un ciclu. Algoritmul propus trebuie s ruleze ntr-un timp O(V ), indiferent de [E[.
23.4-3 Demonstrai sau contrademonstrai c, dac un graf orientat G conine cicluri, atunci,
procedura Sortare-Topologic(G) produce o ordine a vrfurilor care minimizeaz numrul
de muchii rele care sunt n dezacord cu ordinea produs.
23.4-4 O alt cale de a efectua o sortare topologic pe un graf orientat aciclic G = (V, E) este
de a gsi, n mod repetat, un vrf cu gradul interior egal cu 0 care este aat, iar apoi eliminat din
graf mpreun cu toate muchiile care pleac din el. Explicai cum se poate implementa aceast
idee, astfel nct s ruleze ntr-un timp O(V +E). Ce se ntmpl cu acest algoritm dac G are
cicluri?
420 Capitolul 23 Algoritmi elementari de grafuri
23.5. Componente tare conexe
Vom considera acum o aplicaie clasic a cutrii n adncime: descompunerea unui graf
orientat n componentele sale tare conexe. Aceast seciune prezint un mod de a face aceast
descompunere folosind dou cutri n adncime. Muli algoritmi care lucreaz cu grafuri o-
rientate ncep cu o astfel de descompunere. Aceast abordare permite, de multe ori, divizarea
problemei originale n mai multe subprobleme, una pentru ecare component tare conex. Com-
binarea soluiilor subproblemelor urmeaz structura legturilor dintre componentele tare conexe.
Aceast structur poate reprezentat printr-un graf numit graful componentelor, denit n
exerciiul 23.5-4.
S ne reamintim, din capitolul 5, c o component tare conex a unui graf orientat G = (V, E)
este o mulime maximal de vrfuri U V , astfel nct, pentru ecare pereche de vrfuri u i v
din U, avem att u Y v ct i v Y u. Cu alte cuvinte, vrfurile u i v sunt accesibile unul din
cellalt. n gura 23.9 este prezentat un exemplu.
Algoritmul nostru pentru gsirea componentelor tare conexe ale unui graf G = (V, E) folosete
transpusul lui G, care este denit n exerciiul 23.1-3 ca ind graful G
T
= (V, E
T
), unde E
T
=
(u, v) : (v, u) E. Cu alte cuvinte, E
T
este constituit din muchiile din G cu sensurile lor
inversate. Dat ind o reprezentare prin liste de adiacen a lui G, timpul necesar crerii lui
G
T
este O(V + E). Este interesant de observat c G i G
T
au exact aceleai componente tare
conexe: u i v sunt accesibile unul din cellalt n G dac i numai dac sunt accesibile unul din
cellalt n G
T
. Figura 23.9(b) prezint transpusul grafului din gura 23.9(a), cu componentele
tare conexe colorate n gri.
Urmtorul algoritm de timp liniar (adic (V +E)) determin componentele tare conexe ale
unui graf orientat G = (V, E) folosind dou cutri n adncime, una n G i una n G
T
.
Componente-Tare-Conexe(G)
1: apeleaz CA(G) pentru a calcula timpii de terminare f[u] pentru ecare vrf u
2: calculeaz G
T
3: apeleaz CA(G
T
), dar n bucla principal a lui CA, consider vrfurile n ordinea descres-
ctoare a timpilor f[u] (calculai n linia 1)
4: aeaz vrfurile ecrui arbore n pdurea de adncime din pasul 3 ca o component tare
conex separat
Acest algoritm, care arat foarte simplu, pare a nu avea nimic de-a face cu componentele
tare conexe. n ceea ce urmeaz vom clarica misterele alctuirii sale i i vom demonstra corec-
titudinea. ncepem cu dou observaii folositoare.
Lema 23.12 Dac dou vrfuri se a n aceeai component tare conex, atunci nici un drum
ntre ele nu prsete, vreodat, componenta tare conex.
Demonstraie. Fie u i v dou vrfuri din aceeai component tare conex. Din deniia com-
ponentei tare conexe, exist drumuri de la u la v i de la v la u. Fie vrful w de-a lungul unui
drum u Yw Yv, astfel nct w este accesibil din u. Mai mult, deoarece exist un drum v Yu,
tim c u este accesibil din w prin drumul w Y v Y u. De aceea, u i w fac parte din aceeai
component conex. Deoarece w a fost ales n mod arbitrar, teorema este demonstrat.
23.5. Componente tare conexe 421
Figura 23.9 (a) Un graf orientat G. Componentele tare conexe ale lui G sunt prezentate n culoarea
gri. Fiecare vrf este etichetat cu timpii si de descoperire i de terminare. Muchiile de arbore sunt
prezentate n gri. (b). Graful G
T
, transpusul lui G. Este prezentat i arborele de adncime determinat
n linia 3 a algoritmului Componente-Tare-Conexe, cu muchiile de arbore n gri. Fiecare component
tare conex corespunde unui arbore de adncime. Vrfurile b, c, g i h, care sunt prezentate cu culoarea
neagr, sunt strmoii ecrui vrf din componenta lor tare conex; de asemenea, aceste vrfuri sunt
rdcinile arborilor de adncime produi de cutarea n adncime n G
T
. (c) Graful de componente
aciclic G
CTC
obinut prin reducerea ecrei componente tare conexe a lui G la un singur vrf.
Teorema 23.13 n orice cutare n adncime, toate vrfurile din aceeai component tare
conex sunt situate n acelai arbore de adncime.
Demonstraie. Dintre vrfurile din componenta tare conex, e r primul descoperit. Deoarece
r este primul, celelalte vrfuri din componenta tare conex sunt albe n momentul cnd el este
descoperit. Exist drumuri de la r la toate celelalte vrfuri din componenta tare conex; pentru
c aceste drumuri nu prsesc niciodat componenta tare conex (din lema 23.12), toate vrfurile
de pe ele sunt albe. Astfel, din teorema drumului alb, ecare vrf din componenta tare conex
devine un descendent al lui r n componenta tare conex.
n restul acestei seciuni, notaiile d[u] i f[u] se refer la timpii de descoperire i terminare
determinai de prima cutare n adncime din linia 1 a algoritmului Componente-Tare-
Conexe. n mod similar, notaia u Yv se refer la existena unui drum n G i nu n G
T
.
Pentru a demonstra c algoritmul Componente-Tare-Conexe este corect, introducem
noiunea de predecesor (u) al unui vrf u, care este vrful w, accesibil din u, care e terminat
ultimul n cutarea n adncime din linia 1. Cu alte cuvinte,
(u) = acel vrf w pentru care u Yw i f[w] este maximizat.
422 Capitolul 23 Algoritmi elementari de grafuri
S observm c relaia (u) = u este posibil, deoarece u este accesibil din el nsui, i de aici
f[u] f[(u)]. (23.2)
De asemenea, putem demonstra c ((u)) = (u), deoarece, pentru oricare vrfuri u, v V ,
u Yv implic f[(v)] f[(u)], (23.3)
deoarece w : v Y w w : u Y w i predecesorul are timpul de terminare maxim
dintre toate vrfurile accesibile. Deoarece (u) este accesibil din u, formula (23.3) implic faptul
c f[((u))] f[(u)]. Avem, de asemenea, f[(u)] f[((u))], din inegalitatea (23.2).
Astfel, f[((u))] = f[(u))], i astfel obinem ((u)) = (u), deoarece dou vrfuri care sunt
terminate n acelai moment reprezint de fapt acelai vrf.
Dup cum vom vedea, ecare component tare conex are un vrf care este predecesorul
ecrui vrf din componenta tare conex respectiv; acest predecesor este un vrf reprezentativ
pentru acea component tare conex. n cutarea n adncime pe G, el este primul vrf al
componentei tare conexe care este descoperit i este ultimul vrf al acelei componente tare
conexe care este terminat. n cutarea n adncime a lui G
T
, el este rdcina unui arbore de
adncime. Vom demonstra acum aceste proprieti.
Prima teorem justic denumirea lui (u) de predecesor al lui u.
Teorema 23.14 ntr-un graf orientat G = (V, E), predecesorul (u) al oricrui vrf u V din
orice cutare n adncime a lui G este un strmo al lui u.
Demonstraie. Dac (u) = u, teorema este evident adevrat. Dac (u) = u, vom considera
culorile vrfurilor la momentul d[u]. Dac (u) este negru, atunci f[(u)] < f[u], contrazicnd
inegalitatea (23.2). Dac (u) este gri, atunci el este un strmo al lui u, i teorema este
demonstrat.
Astfel ne rmne de demonstrat c (u) nu este alb. Exist dou cazuri, n funcie de culorile
vrfurilor intermediare de pe drumul de la u la (u), dac aceste vrfuri intermediare exist.
1. Dac ecare vrf intermediar este alb, atunci (u) devine un descendent al lui u, din
teorema drumului alb. Dar atunci f[(u)] < f[u], contrazicnd inegalitatea (23.2).
2. Dac vreun vrf intermediar nu este alb, e t ultimul vrf care nu este alb de pe drumul de
la u la (u). Atunci t trebuie s e gri, deoarece nu exist niciodat o muchie de la un vrf
negru la unul alb, iar succesorul lui t este alb. Dar atunci exist un drum de la t la (u)
format din vrfuri albe, i astfel (u) este un descendent al lui t, din teorema drumului alb.
Aceasta implic faptul c f[t] > f[(u)], contrazicnd alegerea lui (u), deoarece exist un
drum de la u la t.
Corolarul 23.15 n orice cutare n adncime ntr-un graf G = (V, E), vrfurile u i (u),
pentru orice u V , fac parte din aceeai component tare conex.
Demonstraie. Avem u Y (u), din deniia predecesorului, i (u) Y u, deoarece (u) este
un strmo al lui u.
Urmtoarea teorem ofer un rezultat mai puternic care face legtura ntre predecesori i
componentele tare conexe.
23.5. Componente tare conexe 423
Teorema 23.16 ntr-un graf orientat G = (V, E), dou vrfuri u, v V fac parte din aceeai
component tare conex dac i numai dac au acelai predecesor ntr-o cutare n adncime n
G.
Demonstraie. : S presupunem c u i v fac parte din aceeai component tare conex.
Fiecare vrf accesibil din u este accesibil din v i invers, deoarece exist drumuri n ambele
direcii ntre u i v. Atunci, din deniia predecesorului, tragem concluzia c (u) = (v).
: S presupunem c (u) = (v). Din corolarul 23.15, u face parte din aceeai component
tare conex ca (u), iar v face parte din aceeai component tare conex ca (v). De aceea, u i
v fac parte din aceeai component conex.
Avnd teorema 23.16 la ndemn, structura algoritmului Componente-Tare-Conexe
poate neleas mai uor. Componentele tare conexe sunt mulimi de vrfuri cu acelai
predecesor. Mai mult, din teorema 23.14 i din teorema parantezelor (teorema 23.6), n timpul
cutrii n adncime n linia 1 a algoritmului Componente-Tare-Conexe un predecesor este
att primul vrf descoperit ct i ultimul vrf terminat din componenta lui tare conex.
Pentru a nelege de ce facem cutarea n adncime n G
T
din linia 3 a algoritmului Com-
ponente-Tare-Conexe, vom considera vrful r cu cel mai mare timp de terminare calculat de
cutarea n adncime din linia 1. Din deniia predecesorului, vrful r trebuie s e un predecesor,
deoarece este propriul su predecesor: este accesibil din el nsui, i nici un alt vrf din graf nu
are un timp de terminare mai mare. Care sunt celelalte vrfuri din componenta tare conex a
lui r? Sunt acele vrfuri care l au pe r drept predecesor acelea din care r este accesibil, dar
nici un vrf cu un timp de terminare mai mare dect f[r] nu este accesibil din ele. Dar timpul
de terminare al lui r este maxim dintre toate vrfurile din G. Din aceast cauz, componenta
tare conex a lui r este constituit din acele vrfuri din care r este accesibil. n mod echivalent,
r r G
T
Astfel, cutarea n
adncime din linia 3 identic toate vrfurile din componenta tare conex a lui r i le face negre.
(O cutare n lime, sau cutare a vrfurilor accesibile, ar putut identica aceast
mulime la fel de uor.)
Dup ce cutarea n adncime din linia 3 este efectuat, identicnd componenta tare conex
a lui r, algoritmul ncepe cu vrful r
t
cu cel mai mare timp de terminare, care nu se a n
componenta tare conex a lui r. Vrful r
t
trebuie s e propriul lui predecesor, deoarece nici
un alt vrf cu un timp de terminare mai mare nu este accesibil din el (altfel, ar fost inclus
n componenta tare conex a lui r). Printr-un raionament similar, orice vrf din care r
t
este
accesibil i care nu este deja negru, trebuie s e n componenta tare conex a lui r
t
. Astfel, pe
msur ce cutarea n adncime din linia 3 continu, algoritmul identic i nnegrete ecare
vrf din componenta tare conex a lui r
t
cutnd din r
t
n G
T
.
Astfel, cutarea n adncime din linia 3 decojete componentele tare conexe una cte
una. Fiecare component este identicat n linia 7 a CA printr-un apel ctre procedura CA-
Vizit cu predecesorul componentei ca argument. Apelurile recursive din cadrul CA-Vizit
nnegresc, n cele din urm, ecare vrf din component. Cnd CA-Vizit revine n CA,
ntreaga component este nnegrit i decojit. Apoi CA gsete vrful cu timpul de terminare
maxim care n-a fost nc nnegrit; acest vrf este predecesorul unei alte componente, i procedeul
continu.
Urmtoarea teorem formalizeaz aceast argumentaie.
424 Capitolul 23 Algoritmi elementari de grafuri
Teorema 23.17 Algoritmul Componente-Tare-Conexe(G) calculeaz corect componentele
tare conexe ale unui graf G.
Demonstraie. Vom argumenta prin inducie, dup numrul de arbori de adncime gsii n
timpul cutrii n adncime a lui G
T
, c vrfurile din ecare arbore formeaz o component
tare conex. Fiecare pas al demonstraiei inductive demonstreaz c un arbore format n timpul
cutrii n adncime a lui G
T
este o component tare conex, presupunnd c toi arborii produi
nainte sunt componente tare conexe. Baza pentru aceast inducie este trivial, din moment ce
pentru primul arbore rezultat nu exist arbori anteriori, i de aici presupunerea este evident
adevrat.
S considerm un arbore de adncime T cu rdcina r rezultat n timpul cutrii n adncime
a lui G
T
. Vom nota cu C(r) mulimea vrfurilor cu strmoul r:
C(r) = v V : (v) = r.
Vom demonstra acum c un vrf u este plasat n T dac i numai dac u C(r).
: Teorema 23.13 implic faptul c ecare vrf din C(r) ajunge n acelai arbore de adncime.
Deoarece r C(r) i r este rdcina lui T, ecare element al lui C(r) ajunge n T.
: Vom arta c orice vrf w, astfel nct f[(w)] > f[r] sau f[(w)] < f[r], nu este plasat
n T, considernd aceste dou cazuri separat. Prin inducie dup numrul de arbori gsii, orice
vrf w, astfel nct f[(w)] > f[r], nu este plasat n arborele T, deoarece, la momentul cnd
r este selectat, w va fost deja pus n arborele cu rdcina (w). Orice vrf w, astfel nct
f[(w)] < f[r], nu poate plasat n T, deoarece o astfel de plasare ar implica w Y r. Astfel,
din formula (23.3) i din proprietatea c r = (r), obinem c f[(w)] f[(r)] = f[r], ceea ce
contrazice f[(w)] < f[r].
De aceea, T conine doar acele vrfuri u pentru care (u) = r. Cu alte cuvinte, T este identic
cu componenta tare conex C(r), ceea ce completeaz demonstraia inductiv.
Exerciii
23.5-1 Cum se schimb numrul componentelor tare conexe ale unui graf dac este adugat o
nou muchie?
23.5-2 Artai cum lucreaz procedura Componente-Tare-Conexe pe graful din gura 23.6.
Mai exact, determinai timpii de terminare calculai n linia 1 i pdurea produs de linia 3.
Presupunei c bucla din liniile 57 a CA consider vrfurile n ordine alfabetic i c listele de
adiacen sunt n ordine alfabetic.
23.5-3 Profesorul Deaver pretinde c algoritmul pentru determinarea componentelor tare
conexe poate simplicat, folosind graful original (n locul celui transpus) n cea de-a doua
cutare n adncime i parcurgnd vrfurile n ordinea a timpilor de terminare. Are
dreptate profesorul?
23.5-4 Notm graful componentelor lui G = (V, E) cu G
CTC
= (V
CTC
, E
CTC
), unde V
CTC
conine un vrf pentru ecare component tare conex a lui G i E
CTC
conine o muchie (u, v)
dac exist o muchie orientat de la un vrf din componenta tare conex a lui G corespunztoare
lui u la un vrf din componenta tare conex a lui G corespunztoare lui v. n gura 23.9(c) este
prezentat un exemplu. Demonstrai c G
CTC
este un graf orientat aciclic.
Probleme 425
23.5-5 Elaborai un algoritm care s ruleze ntr-un timp O(V + E) i care s calculeze graful
componentelor unui graf orientat G = (V, E). Asigurai-v c exist, cel mult, o muchie ntre
dou vrfuri n graful componentelor pe care l determin algoritmul vostru.
23.5-6 Dat ind un graf orientat G = (V, E), explicai cum se poate crea un alt graf G
t
=
(V, E
t
), astfel nct (a) G
t
are aceleai componente tare conexe ca G, (b) G
t
are acelai graf al
componentelor ca G, i (c) E
t
este ct mai mic posibil. Elaborai un algoritm rapid pentru
determinarea lui G
t
.
23.5-7 Un graf orientat G = (V, E) se numete semiconex dac, pentru toate perechile de
vrfuri u, v V , avem u Yv sau v Yu. Elaborai un algoritm ecient pentru a determina dac
G este sau nu semiconex. Demonstrai c algoritmul vostru este corect i analizai timpul su
de execuie.
Probleme
23-1 Clasicarea muchiilor n funcie de cutarea n lime
O pdure de adncime clasic muchiile unui graf n muchii de arbore, napoi, nainte i
transversale. Un arbore de lime poate folosit, de asemenea, pentru a clasica muchiile
accesibile din sursa cutrii n aceleai patru categorii.
a. Demonstrai c ntr-o cutare n lime ntr-un graf neorientat, urmtoarele proprieti
sunt adevrate:
1. Nu exist muchii napoi sau muchii nainte.
2. Pentru orice muchie (u, v), avem d[v] = d[u] + 1.
3. Pentru orice muchie transversal (u, v), avem d[v] = d[u] sau d[v] = d[u] + 1.
b. Demonstrai c ntr-o cutare n lime ntr-un graf orientat, urmtoarele proprieti sunt
adevrate:
1. Nu exist muchii nainte.
2. Pentru orice muchie de arbore (u, v), avem d[v] = d[u] + 1.
3. Pentru orice muchie transversal (u, v), avem d[v] d[u] + 1.
4. Pentru orice muchie napoi (u, v), avem 0 d[v] < d[u].
23-2 Puncte de articulaie, puni i componente biconexe
Fie G = (V, E) un graf neorientat, conex. Un punct de articulaie al lui G este un vrf a
crui eliminare face ca G s-i piard proprietatea de conexitate. O punte este o muchie a crei
eliminare face ca G s-i piard proprietatea de conexitate. O component biconex a lui G
este o mulime maximal de muchii, astfel nct oricare dou muchii fac parte dintr-un ciclu
simplu comun. Figura 23.10 ilustreaz aceste deniii. Putem determina puncte de articulaie,
puni i componente biconexe folosind cutarea n adncime. Fie G

= (V, E

) un arbore de
adncime al lui G.
a. Demonstrai c rdcina lui G

este un punct de articulaie al lui G dac i numai dac


are cel puin doi descendeni n G

.
426 Capitolul 23 Algoritmi elementari de grafuri
Figura 23.10 Punctele de articulaie, punile i componentele biconexe ale unui graf neorientat, conex,
pentru a folosite n problema 23-2. Punctele de articulaie sunt vrfurile de culoare neagr, punile
sunt muchiile de culoare gri nchis, iar componentele biconexe sunt muchiile din zonele de culoare gri
deschis, mpreun cu care este prezentat i o numerotare a lor.
b. Fie v un vrf al lui G

care nu este rdcina acestuia. Demonstrai c v este un punct de


articulaie al lui G dac i numai dac v are un descendent s, astfel nct nu exist nici o
muchie napoi de la s sau orice descendent al lui s la un strmo nedegenerat al lui v.
c. Fie
jos[v] = min

d[v],
d[w] : (u, w) este o muchie napoi pentru un descendent
oarecare u al lui v.
Artai cum se poate calcula jos[v] pentru toate vrfurile v V ntr-un timp O(E).
d. Artai cum se pot determina toate punctele de articulaie ntr-un timp O(E).
e. Demonstrai c o muchie a lui G este o punte dac i numai dac nu face parte dintr-un
ciclu simplu al lui G.
f. Artai cum se pot determina toate punile lui G ntr-un timp O(E).
g. Demonstrai urmtoarea armaie: Componentele biconexe ale lui G partiioneaz muchiile
lui G care nu sunt puni.
h. Elaborai un algoritm care s ruleze ntr-un timp O(E) care s eticheteze ecare muchie e
a lui G cu un numr pozitiv cb[e] astfel nct cb[e] = cb[e
t
] dac i numai dac e i e
t
fac
parte din aceeai component biconex.
23-3 Tur Euler
Un tur Euler al unui graf orientat, conex G = (V, E) este un ciclu care traverseaz ecare
muchie a lui G exact o dat, dei s-ar putea ca un vrf s e vizitat de mai multe ori.
a. Artai c G are un tur Euler dac i numai dac grad-interior(v)=grad-exterior(v) pentru
orice vrf v V .
b. Elaborai un algoritm care s ruleze ntr-un timp O(E) i care s determine un tur Euler
al lui G dac el exist. ( unii ciclurile cu muchii disjuncte.)
Note bibliograce 427
Note bibliograce
Even [65] i Tarjan [188] constituie referine excelente pentru algoritmi de grafuri.
Cutarea n lime a fost descoperit de ctre Moore [150] n contextul cutrii de drumuri
n labirinturi. Lee [134] a descoperit, n mod independent, acelai algoritm n contextul stabilirii
traseelor relor de pe plcile de circuite.
Hopcroft i Tarjan [102] au argumentat folosirea reprezentrii prin liste de adiacen n
defavoarea reprezentrii prin matrice de adiacen, pentru grafurile rare, i au fost primii care au
recunoscut importana algoritmic a cutrii n adncime. Cutarea n adncime a fost folosit
pe scar larg ncepnd cu sfritul anilor 50, n special n programele din domeniul inteligenei
articiale.
Tarjan [185] a elaborat un algoritm liniar pentru determinarea componentelor tare conexe.
Algoritmul pentru componentele tare conexe din seciunea 23.5 este adaptat din Aho, Hopcroft
i Ullman [5], care l atribuie lui S. R. Kosaraju i M. Sharir. Knuth [121] a fost primul care a
dat un algoritm liniar pentru sortarea topologic.
24 Arbori de acoperire minimi
n proiectarea circuitelor electronice, este de multe ori necesar s facem pinii mai multor
componente echivaleni electronic, conectndu-i mpreun. Pentru interconectarea unei mulimi
de n pini, putem folosi un aranjament de n1 re, ecare conectnd doi pini. Dintre toate aceste
aranjamente, cel care folosete cantitatea cea mai mic de r este de obicei cel mai dezirabil.
Putem modela aceast problem a conectrii folosind un graf neorientat, conex G = (V, E),
unde V este mulimea pinilor, iar E este mulimea interconectrilor posibile ntre perechile de
pini, i, pentru ecare pereche de pini (u, v) E, avem un cost w(u, v) specicnd cantitatea
de r necesar pentru conectarea lui u i v. Dorim, apoi, s gsim o submulime aciclic T E
care conecteaz toate vrfurile i al crei cost total
w(T) =

(u,v)T
w(u, v)
este minimizat. Deoarece mulimea T este aciclic i conecteaz toate vrfurile, ea trebuie s
formeze un arbore, pe care l vom numi arbore de acoperire
1
deoarece acoper graful G.
Problema determinrii arborelui T o vom numi problema arborelui de acoperire minim.
2
Figura 24.1 prezint un exemplu de graf conex mpreun cu arborele su minim de acoperire.
n acest capitol vom examina doi algoritmi pentru rezolvarea problemei arborelui parial
de acoperire minim: algoritmul lui Kruskal i algoritmul lui Prim. Fiecare poate determinat
uor s ruleze ntr-un timp de ordinul O(E lg V ) folosind heap-uri binare obinuite. Folosind
heap-uri Fibonacci, algoritmul lui Prim poate optimizat pentru a rula ntr-un timp de ordinul
O(E +V lg V ), care este o mbuntire dac [V [ este mult mai mic dect [E[.
Cei doi algoritmi ilustreaz, de asemenea, o metod euristic pentru optimizare, numit
strategia greedy. La ecare pas al algoritmului, trebuie fcut una dintre alegerile posibile.
Strategia greedy susine faptul c trebuie fcut alegerea care este cea mai bun la momentul
dat. n general, o astfel de strategie nu garanteaz obinerea unei soluii optime global pentru o
anumit problem. Totui, pentru problema arborelui de acoperire minim, putem demonstra c
anumite strategii greedy produc un arbore de acoperire de cost minim. Strategiile greedy sunt
discutate pe larg n capitolul 17. Dei prezentul capitol poate citit independent de capitolul 17,
metodele greedy prezentate n acest capitol sunt aplicaii clasice ale noiunilor teoretice introduse
acolo.
Seciunea 24.1 introduce un algoritm generic de arbore de acoperire minim, care dezvolt
arborele de acoperire adugnd o muchie o dat. Seciunea 24.2 prezint dou moduri de imple-
mentare a algoritmului generic. Primul algoritm, datorat lui Kruskal, este similar cu algoritmul
de componente conexe din seciunea 22.1. Cel de-al doilea algoritm, datorat lui Prim, este similar
cu algoritmul lui Dijkstra pentru drumuri de lungime minim (seciunea 25.2).
n literatura de specialitate n limba romn se folosete uneori i termenul de arbore parial n. t.
Expresia arbore de acoperire minim este o form prescurtat pentru arbore de acoperire de cost minim.
De exemplu, nu minimizm numrul de muchii din T, deoarece toi arborii de acoperire au exact |V | 1 muchii,
conform teoremei 5.2.
24.1. Dezvoltarea unui arbore de acoperire minim 429
Figura 24.1 Un arbore de acoperire minim pentru un graf conex. Sunt prezentate costurile muchiilor,
iar muchiile arborelui de acoperire minim sunt haurate cu gri. Costul total al arborelui prezentat este
37. Arborele nu este unic: dac eliminm muchia (b, c) i o nlocuim cu muchia (a, h), obinem un alt
arbore de acoperire de cost 37.
24.1. Dezvoltarea unui arbore de acoperire minim
S presupunem c avem un graf neorientat, conex G = (V, E) cu o funcie de cost w :
E R i dorim s gsim un arbore de acoperire minim pentru G. Cei doi algoritmi, pe care
i prezentm n acest capitol, folosesc o abordare greedy a problemei, dei difer prin modul n
care implementeaz aceast abordare.
Aceast strategie greedy este implementat de urmtorul algoritm generic, care dezvolt
arborele de acoperire minim adugnd o muchie o dat. Algoritmul folosete o mulime A care
este ntotdeauna o submulime a unui arbore de acoperire minim. La ecare pas este determinat
o muchie (u, v), care poate adugat la A, respectnd proprietatea de mai sus, n sensul c
A(u, v) este, de asemenea, o submulime a unui arbore de acoperire minim. Numim o astfel
de muchie o muchie sigur pentru A, deoarece poate adugat, n siguran, mulimii A,
respectnd proprietatea de mai sus.
AAM-Generic(G, w)
1: A
2: ct timp A nu formeaz un arbore de acoperire execut
3: gsete o muchie (u, v) care este sigur pentru A
4: A A (u, v)
5: returneaz A
Observai c, dup linia 1, mulimea A satisface, ntr-un mod trivial, condiia ca ea s e
o submulime a arborelui de acoperire minim. Bucla din liniile 24 menine condiia. De aceea,
cnd mulimea A este returnat n linia 5, ea trebuie s e un arbore minim de acoperire. Partea
mai dicil este, desigur, gsirea unei muchii sigure n linia 3. Una trebuie s existe, deoarece,
atunci cnd linia 3 este executat, condiia dicteaz faptul c exist un arbore de acoperire
minim T, astfel nct A T, i, dac exist o muchie (u, v) T, astfel nct (u, v) / A, atunci
(u, v) este sigur pentru A.
n ceea ce urmeaz, vom da o regul (teorema 24.1) pentru a recunoate muchiile sigure. Ur-
mtoarea seciune descrie doi algoritmi care folosesc aceast regul pentru a gsi ecient muchiile
sigure.
n primul rnd, avem nevoie de cteva deniii. O tietur (S, V S) a unui graf neorientat
430 Capitolul 24 Arbori de acoperire minimi
Figura 24.2 Dou moduri de a privi o tietur (S, V S) a grafului din gura 24.1. (a) Vrfurile din
mulimea S sunt colorate cu negru, iar cele din V S cu alb. Muchiile care traverseaz tietura sunt cele
care unesc vrfurile albe cu cele negre. Muchia (d, c) este unica muchie uoar care traverseaz tietura.
O submulime de muchii A este haurat cu gri. Observai c tietura (S, V S) respect mulimea
A, deoarece nici o muchie din A nu traverseaz tietura. (b) Acelai graf cu vrfurile din mulimea S
dispuse pe partea stng i cele din mulimea V S n dreapta. O muchie traverseaz tietura dac
unete un vrf din stnga cu un vrf din dreapta.
G = (V, E) este o partiie a lui V . Figura 24.2 ilustreaz aceast noiune. Spunem c o muchie
(u, v) E traverseaz tietura (S, V S) dac unul din punctele sale terminale este n S, i
cellalt n V S. Spunem c o tietur respect mulimea de muchii A dac nici o muchie din
A nu traverseaz tietura. O muchie este o muchie uoar care traverseaz o tietur dac are
costul minim dintre toate muchiile care traverseaz tietura. Observai c pot exista mai multe
muchii uoare care traverseaz o tietur n cazul n care ele au costuri egale. Generaliznd,
spunem c o muchie este o muchie uoar care satisface o proprietate dat dac are costul
minim dintre toate muchiile care satisfac acea proprietate.
Regula noastr pentru recunoaterea muchiilor sigure este dat de urmtoarea teorem.
Teorema 24.1 Fie G = (V, E) un graf neorientat, conex cu o funcie de cost w cu valori reale,
denit pe E. Fie A o submulime a lui E care este inclus ntr-un arbore de acoperire minim al
lui G, e (S, V S) orice tietur a lui G care respect mulimea A i e (u, v) o muchie uoar
care traveseaz tietura (S, V S). Atunci muchia (u, v) este sigur pentru A.
Demonstraie. Fie T un arbore minim de acoperire care include mulimea A. S presupunem
c T nu conine muchia uoar (u, v), deoarece, dac o conine, demonstraia este gata. Vom
construi un alt arbore minim de acoperire T
t
care include mulimea A(u, v) folosind o tehnic
de tiere i lipire, artnd astfel c (u, v) este o muchie sigur pentru A.
24.1. Dezvoltarea unui arbore de acoperire minim 431
Figura 24.3 Demonstraia teoremei 24.1. Vrfurile din S sunt negre, iar cele din V S sunt albe.
Muchiile din arborele de acoperire minim T sunt prezentate, ns muchiile din graful G nu. Muchiile
din A sunt haurate cu gri, iar (u, v) este o muchie uoar care traverseaz tietura (S, V S). Muchia
(x, y) este o muchie pe drumul unic p, de la u la v, din arborele T. Un arbore minim de acoperire T

care conine (u, v) este format eliminnd muchia (x, y) din T i adugnd muchia (u, v).
Muchia (u, v) formeaz un ciclu cu muchiile de pe drumul p, de la u la v, din arborele T,
dup cum se vede n gura 24.3. Deoarece u i v se a n pri opuse ale tieturii (S, V S),
exist, cel puin, o muchie din T pe drumul p, care traverseaz, de asemenea, tietura. Fie (x, y)
orice astfel de muchie. Muchia (x, y) nu se a n A pentru c tietura respect mulimea A.
Deoarece (x, y) se a pe unicul drum de la u la v din arborele T, eliminarea lui (x, y) l rupe pe
T n dou componente. Adugarea muchiei (u, v) le reconecteaz pentru a forma un nou arbore
de acoperire T
t
= T (x, y) (u, v).
Vom arta, acum, c T
t
este un arbore de acoperire minim. Deoarece (u, v) este o muchie
uoar care traverseaz (S, V S) i (x, y) traverseaz, de asemenea, aceast tietur, rezult
c w(u, v) w(x, y). De aceea,
w(T
t
) = w(T) w(x, y) +w(u, v) w(T).
Dar T este un arbore de acoperire minim, astfel nct w(T) w(T
t
); astfel, T
t
este, de asemenea,
un arbore de acoperire minim.
Mai rmne de artat c (u, v) este, ntr-adevr, o muchie sigur pentru A. Avem A T
t
,
deoarece A T i (x, y) / A. Astfel, A (u, v) T
t
. n concluzie, deoarece T
t
este un arbore
minim de acoperire, (u, v) este o muchie sigur pentru A.
Teorema 24.1 ne ajut s nelegem, mai bine, modul de lucru al algoritmului AAM-Generic
pe un graf conex G = (V, E). Cnd algoritmul ncepe, mulimea A este ntotdeauna aciclic.
Altfel, un arbore de acoperire minim care l include pe A ar conine un ciclu, ceea ce este o
contradicie. n orice moment al execuiei algoritmului, graful G
A
= (V, A) este o pdure i
ecare din componentele conexe ale lui G
A
este un arbore. (Unii arbori pot conine doar un
singur vrf, cum se ntmpl n momentul n care algoritmul ncepe: A este vid i pdurea
conine [V [ arbori, cte unul pentru ecare vrf.) Mai mult, orice muchie (u, v) sigur pentru A
unete componentele distincte ale lui G
A
, deoarece mulimea A (u, v) trebuie s e aciclic.
432 Capitolul 24 Arbori de acoperire minimi
Bucla din liniile 24 ale algoritmului AAM-Generic este executat de [V [ 1 ori deoarece
ecare din cele [V [ 1 muchii ale arborelui minim de acoperire este determinat succesiv. Iniial,
cnd A = , exist [V [ arbori n G
A
i ecare iteraie reduce acest numr cu 1. Cnd pdurea
conine doar un singur arbore, algoritmul se termin.
Cei doi algoritmi din seciunea 24.2 folosesc urmtorul corolar la terorema 24.1.
Corolarul 24.2 Fie G = (V, E) un graf neorientat conex, cu o funcie de cost w avnd valori
reale, denit pe E. Fie A o submulime a lui E care este inclus ntr-un arbore minim de
acoperire al lui G, i e C o component conex (arbore) din pdurea G
A
= (V, A). Dac (u, v)
este o muchie uoar care unete componenta C cu o alt component din G
A
, atunci (u, v) este
sigur pentru A.
Demonstraie. Tietura (C, V C) respect mulimea A, i, de aceea, (u, v) este o muchie
uoar pentru aceast tietur.
Exerciii
24.1-1 Fie (u, v) o muchie de cost minim dintr-un graf G. Demonstrai c (u, v) aparine unui
arbore minim de acoperire al lui G.
24.1-2 Profesorul Sabatier formuleaz urmtoarea reciproc a teoremei 24.1: e G = (V, E)
un graf neorientat, conex cu o funcie de cost w avnd valori reale, denit pe E. Fie A o
submulime a lui E care este inclus ntr-un arbore minim de acoperire oarecare al lui G, e
(S, V S) orice tietur a lui G care respect mulimea A i e (u, v) o muchie sigur pentru
A care traverseaz (S, V S). Atunci (u, v) este o muchie uoar pentru tietura respectiv.
Artai, dnd un contraexemplu, c aceast reciproc nu este adevrat.
24.1-3 Artai c, dac o muchie (u, v) este coninut ntr-un arbore minim de acoperire, atunci
ea este o muchie uoar care traverseaz o tietur oarecare a grafului.
24.1-4 Dai un exemplu simplu de graf, astfel nct mulimea tuturor muchiilor uoare care
traverseaz o tietur oarecare din graf nu formeaz un arbore minim de acoperire.
24.1-5 Fie e o muchie de cost maxim dintr-un ciclu al grafului G = (V, E). Demonstrai c
exist un arbore minim de acoperire al lui G
t
= (V, E e) care este, de asemenea, un arbore
minim de acoperire pentru G.
24.1-6 Artai c un graf are un arbore minim de acoperire unic dac, pentru ecare tietur a
grafului, exist o unic muchie uoar care traverseaz tietura. Artai, dnd un contraexemplu,
c reciproca nu este adevrat.
24.1-7 Argumentai faptul c, dac toate costurile muchiilor unui graf sunt pozitive, atunci
orice submulime de muchii care conecteaz toate vrfurile i are un cost total minim este un
arbore. Dai un exemplu pentru a arta c aceeai concluzie nu este adevrat dac acceptm i
costuri negative.
24.1-8 Fie T un arbore minim de acoperire al unui graf G i e L lista ordonat a costurilor
muchiilor din T. Artai c, pentru orice alt arbore minim de acoperire T
t
al lui G, lista L este,
de asemenea, lista ordonat a costurilor muchiilor lui T
t
.
24.2. Algoritmii lui Kruskal i Prim 433
24.1-9 Fie T un arbore minim de acoperire al unui graf G = (V, E) i e V
t
o submulime a lui
V . Fie T
t
subgraful lui T indus de V
t
i e G
t
subgraful lui G indus de V
t
. Artai c, dac T
t
este conex, atunci T
t
este un arbore minim de acoperire al lui G
t
.
24.2. Algoritmii lui Kruskal i Prim
Cei doi algoritmi pentru determinarea unui arbore de acoperire minim descrii n aceast
seciune sunt ranri ale algoritmului generic. Fiecare folosete o regul specic pentru
determinarea unei muchii sigure din linia 3 a algoritmului AAM-Generic. n algoritmul lui
Kruskal, mulimea A este o pdure. Muchia sigur adugat la A este, ntotdeauna, o muchie
de cost minim din graf care unete dou componente distincte. n algoritmul lui Prim, mulimea
A formeaz un singur arbore. Muchia sigur adugat la A este, ntotdeauna, o muchie de cost
minim care unete arborele cu un vrf care nu se a n el.
Algoritmul lui Kruskal
Algoritmul lui Kruskal se bazeaz, direct, pe algoritmul generic pentru determinarea unui
arbore minim de acoperire, prezentat n seciunea 24.1. Algoritmul gsete o muchie sigur,
pentru a o aduga la pdurea dezvoltat, cutnd muchia (u, v) de cost minim dintre toate
muchiile care unesc doi arbori din pdurea respectiv. Fie C
1
i C
2
cei doi arbori care sunt unii
de muchia (u, v). Deoarece (u, v) trebuie s e o muchie uoar care unete pe C
1
cu un alt
arbore, corolarul 24.2 implic faptul c (u, v) este o muchie sigur pentru C
1
. Algoritmul lui
Kruskal este un algoritm greedy pentru c la ecare pas adaug pdurii o muchie cu cel mai mic
cost posibil.
Aceast implementare a algoritmului lui Kruskal se aseamn cu cea a algoritmului pentru
calcularea componentelor conexe din seciunea 22.1. Este folosit o structur de date pentru
mulimi disjuncte pentru reprezentarea mai multor mulimi de elemente disjuncte. Fiecare
mulime conine vrfurile unui arbore din pdurea curent. Funcia Gsete-Mulime(u)
returneaz un element reprezentativ din mulimea care l conine pe u. Astfel, putem determina
dac dou vrfuri u i v aparin aceluiai arbore testnd dac Gsete-Mulime(u) este egal
cu Gsete-Mulime(v). Combinarea arborilor este realizat de procedura Unete.
AAM-Kruskal(G, w)
1: A .
2: pentru ecare vrf v V [G] execut
3: Formeaz-Mulime(v)
4: sorteaz muchiile din E n ordinea cresctoare a costului w
5: pentru ecare muchie (u, v) E, n ordinea cresctoare a costului execut
6: dac Gsete-Mulime(u) =Gsete-Mulime(v) atunci
7: A A (u, v)
8: Unete(u, v)
9: returneaz A
Modul de lucru al algoritmului lui Kruskal este prezentat n gura 24.4. Liniile 13
iniializeaz mulimea A cu mulimea vid i creeaz [V [ arbori, unul pentru ecare vrf. Muchiile
434 Capitolul 24 Arbori de acoperire minimi
Figura 24.4 Execuia algoritmului lui Kruskal pe graful din gura 24.1. Muchiile haurate aparin
pdurii A care este dezvoltat. Muchiile sunt luate n considerare n ordinea cresctoare a costurilor. O
sgeat arat muchia care este luat n considerare la ecare pas al algoritmului. Dac muchia unete
doi arbori distinci din pdure, ea este adugat la pdure, unind astfel cei doi arbori.
24.2. Algoritmii lui Kruskal i Prim 435
din E sunt ordonate cresctor dup cost, n linia 4. Bucla pentru din liniile 58 veric, pentru
ecare muchie (u, v), dac punctele terminale u i v aparin aceluiai arbore. Dac fac parte din
acelai arbore, atunci muchia (u, v) nu poate adugat la pdure fr a se forma un ciclu i
ea este abandonat. Altfel, cele dou vrfuri aparin unor arbori diferii, i muchia (u, v) este
adugat la A n linia 7, vrfurile din cei doi arbori ind reunite n linia 8.
Timpul de execuie al algoritmului lui Kruskal pentru un graf G = (V, E) depinde de im-
plementarea structurilor de date pentru mulimi disjuncte. Vom presupune c se folosete im-
plementarea de pdure cu mulimi distincte, din seciunea 22.3, cu tehnicile euristice de uniune
dup rang i de comprimare a drumului, deoarece este cea mai rapid implementare cunoscut,
din punct de vedere asimptotic. Iniializarea se face ntr-un timp de ordinul O(V ), iar timpul
necesar pentru sortarea muchiilor n linia 4 este de ordinul O(E lg E). Exist O(E) operaii pe
pdurea cu mulimi distincte, care necesit un timp total de ordinul O(E (E, V )), unde este
inversa funciei lui Ackermann denit n seciunea 22.4. Deoarece (E, V ) = O(lg E), timpul
total de execuie pentru algoritmul lui Kruskal este de ordinul O(E lg E).
Algoritmul lui Prim
La fel ca algoritmul lui Kruskal, algoritmul lui Prim este un caz particular al algoritmului
generic pentru determinarea unui arbore de acoperire minim prezentat n seciunea 24.1. Modul
de operare al algoritmului lui Prim se aseamn foarte mult cu modul de operare al algoritmului
lui Dijkstra pentru determinarea drumurilor de lungime minim dintr-un graf. (Vezi seciunea
25.2.) Algoritmul lui Prim are proprietatea c muchiile din mulimea A formeaz ntotdeauna
un singur arbore. Conform gurii 24.5, arborele pornete dintr-un vrf arbitrar r i crete pn
cnd acoper toate vrfurile din V . La ecare pas, se adaug arborelui o muchie uoar care
unete mulimea A cu un vrf izolat din G
A
= (V, A). Din corolarul 24.2, aceast regul adaug
numai muchii care sunt sigure pentru A. De aceea, cnd algoritmul se termin, muchiile din A
formeaz un arbore minim de acoperire. Aceasta este o strategie greedy, deoarece arborelui i
este adugat, la ecare pas, o muchie care adaug cel mai mic cost la costul total al arborelui.
Cheia implementrii eciente a algoritmului lui Prim este s procedm n aa fel nct s
e uor s selectm o nou muchie pentru a adugat la arborele format de muchiile din
A. n pseudocodul de mai jos, graful conex G i rdcina r a arborelui minim de acoperire,
436 Capitolul 24 Arbori de acoperire minimi
care urmeaz a dezvoltat, sunt privite ca date de intrare pentru algoritm. n timpul execuiei
algoritmului, toate vrfurile care sunt n arbore se a ntr-o coad de prioritate Q bazat
pe un cmp . Pentru ecare vrf v, cheie[v] este costul minim al oricrei muchii care l
unete pe v cu un vrf din arbore. Prin convenie, cheie[v] = dac nu exist nici o astfel de
muchie. Cmpul [v] reine printele lui v din arbore. n timpul algoritmului, mulimea A din
algoritmul AAM-Generic este pstrat implicit ca
A = (v, [v]) : v V r Q.
Cnd algoritmul se termin, coada de prioritate Q este vid. Arborele minim de acoperire A al
lui G este astfel
A = (v, [v]) : v V r.
Modul de lucru al algoritmului lui Prim este prezentat n gura 24.5. n liniile 14 se inii-
alizeaz coada de prioritate Q, astfel nct aceasta s conin toate vrfurile i se iniializeaz
cmpul cheie al ecrui vrf cu , excepie facnd rdcina r, al crei cmp cheie este iniializat
cu 0. n linia 5 se iniializeaz [r] cu nil, deoarece rdcina r nu are nici un printe. Pe parcursul
algoritmului, mulimea V Q conine vrfurile arborelui curent. n linia 7 este identicat un
vrf u Q incident unei muchii uoare care traverseaz tietura (V Q, Q) (cu excepia primei
iteraii, n care u = r datorit liniei 4). Eliminarea lui u din mulimea Q l adaug pe acesta
mulimii V Q a vrfurilor din arbore. n liniile 811 se actualizeaz cmpurile cheie i ale
ecrui vrf v adiacent lui u, dar care nu se a n arbore. Actualizarea respect condiiile
cheie[v] = w(v, [v]), i (v, [v]) s e o muchie uoar care l unete pe v cu un vrf din arbore.
AAM-Prim(G, w, r)
1: Q V [G]
2: pentru ecare u Q execut
3: cheie[u]
4: cheie[r] 0
5: [r] nil
6: ct timp Q = execut
7: u Extrage-Min(Q)
8: pentru ecare v Adj[u] execut
9: dac v Q i w(u, v) < cheie[v] atunci
10: [v] u
11: cheie[v] w(u, v)
Performana algoritmului lui Prim depinde de modul n care implementm coada de prioritate
Q. Dac Q este implementat folosind heap-uri binare (vezi capitolul 7), putem folosi procedura
Construiete-Heap pentru a executa iniializarea din liniile 14 ntr-un timp de ordinul O(V ).
Bucla este executat de [V [ ori i, deoarece ecare procedur Extrage-Min are nevoie de un
timp de ordinul O(lg V ), timpul total pentru toate apelurile ctre Extrage-Min este O(V lg V ).
Bucla pentru din liniile 811 este executat n total de O(E) ori, deoarece suma tuturor listelor
de adiacen este 2[E[. n cadrul buclei pentru, testul pentru apartenena la Q din linia 9 poate
implementat ntr-un timp constant, pstrnd un bit pentru ecare vrf, care ne spune dac
vrful respectiv se a n Q sau nu, i reactualiznd bitul cnd vrful este eliminat din Q.
Atribuirea din linia 11 implic o procedur explicit Micoreaz-Cheie asupra heap-ului,
care poate implementat n cadrul unui heap binar ntr-un timp de ordinul O(lg V ). Astfel,
24.2. Algoritmii lui Kruskal i Prim 437
Figura 24.5 Execuia algoritmului lui Prim pe graful din gura 24.1. Vrful rdcin este a. Muchiile
haurate cu gri fac parte din arborele care este dezvoltat, iar vrfurile din arbore au culoarea neagr.
La ecare pas al algoritmului, vrfurile din arbore determin o tietur a grafului, i o muchie uoar
care traverseaz tietura este adugat arborelui. n pasul al doilea, de exemplu, algoritmul are de ales
ntre a aduga arborelui e muchia (b, c), e muchia (a, h), deoarece ambele sunt muchii uoare care
traverseaz tietura.
438 Capitolul 24 Arbori de acoperire minimi
timpul total necesar pentru algoritmul lui Prim este O(V lg V + E lg V ) = O(E lg V ), care este
acelai, din punct de vedere asimptotic, cu cel al algoritmului lui Kruskal.
Totui, timpul asimptotic de execuie al algoritmului lui Prim poate mbuntit, folosind
heap-uri Fibonacci. n capitolul 21 se arat c dac [V [ elemente sunt organizate n heap-uri
Fibonacci, putem efectua o operaie Extrage-Min ntr-un timp amortizat O(lg V ) i o operaie
Micoreaz-Cheie (pentru a implementa linia 11) ntr-un timp amortizat O(1). De aceea, dac
folosim un ansambu Fibonacci pentru a implementa coada de prioritate Q, timpul de rulare al
algoritmului lui Prim se mbuntete ajungnd la O(E +V lg V ).
Exerciii
24.2-1 Algoritmul lui Kruskal poate returna arbori minimi de acoperire diferii pentru acelai
graf de intrare G, n funcie de modul n care muchiile avnd costuri egale sunt aranjate atunci
cnd ele sunt ordonate. Artai c, pentru ecare arbore minim de acoperire T al unui graf G,
exist o ordonare a muchiilor lui G, astfel nct algoritmul lui Kruskal returneaz T.
24.2-2 S presupunem c graful G = (V, E) este reprezentat printr-o matrice de adiacen. Dai
o implementare simpl a algoritmului lui Prim pentru acest caz care ruleaz n timpul O(V
2
).
24.2-3 Este implementarea folosind heap-uri Fibonacci mai rapid asimptotic dect reprezen-
tarea folosind heap-uri binare pentru un graf rar G = (V, E), unde [E[ = (V )? Dar n cazul
unui graf dens, unde [E[ = (V
2
)? n ce relaie trebuie s e [E[ i [V [ pentru ca implementarea
folosind heap-uri Fibonacci s e mai rapid dect implementarea folosind heap-uri binare?
24.2-4 S presupunem c toate muchiile dintr-un graf au costurile reprezentate prin numere
ntregi cuprinse ntre 1 i [V [. Ct de rapid poate deveni algoritmul lui Kruskal? Dar n cazul n
care costurile muchiilor sunt ntregi ntre 1 i W, unde W este o constant dat?
24.2-5 Presupunei c toate muchiile dintr-un graf au costurile reprezentate prin numere ntregi
cuprinse ntre 1 i [V [. Ct de rapid poate deveni algoritmul lui Prim? Dar n cazul n care
costurile muchiilor sunt ntregi ntre 1 i W, unde W este o constant dat?
24.2-6 Descriei un algoritm ecient care, dat ind un graf neorientat G, determin un arbore
de acoperire al lui G n care costul maxim al unei muchii este minim dintre toi arborii de
acoperire ai lui G.
24.2-7 S presupunem c ntr-un graf costurile muchiilor sunt uniform distribuite de-a lungul
intervalului semideschis [0, 1). Care algoritm poate deveni mai rapid, al lui Kruskal sau al lui
Prim?
24.2-8 S presupunem c un graf G are un arbore minim de acoperire deja calculat. Ct
de rapid poate actualizat arborele minim de acoperire dac lui G i se adaug un nou vrf i
muchii incidente?
Probleme
24-1 Al doilea arbore de acoperire minim
Probleme 439
Fie G = (V, E) un graf conex, neorientat cu funcia de cost w : E R, i presupunei c
[E[ [V [.
a. Fie T un arbore minim de acoperire al lui G. Demonstrai c exist muchiile (u, v) T i
(x, y) / T, astfel nct T (u, v) (x, y) este un al doilea arbore minim de acoperire
al lui G.
b. Fie T un arbore de acoperire al lui G i, pentru oricare dou vrfuri u, v V , e max[u, v]
muchia de cost maxim pe drumul unic de la u la v din arborele T. Descriei un algoritm
care s ruleze ntr-un timp de ordinul O(V
2
) care, dat ind T, calculeaz max[u, v] pentru
toate vrfurile u, v V .
c. Elaborai algoritmul care calculeaz cel de-al doilea arbore de acoperire minim al lui G.
24-2 Arbore de acoperire minim n grafuri rare
Pentru un graf conex foarte rar G = (V, E), putem mbunti timpul de execuie O(E+V lg V )
al algoritmului lui Prim cu heap-uri Fibonacci preprocesnd graful G pentru a micora numrul
de vrfuri naintea rulrii algoritmului lui Prim.
AAM-Reducere(G, T)
1: pentru ecare v V [G] execut
2: marcaj[v] fals
3: Construiete-Mulime(v)
4: pentru ecare u V [G] execut
5: dac marcaj[u] =fals atunci
6: alege v Adj[u] astfel nct w[u, v] este minimizat
7: Unire(u, v)
8: T T orig[u, v]
9: marcaj[u] marcaj[v] adevrat
10: V [G
t
] Gsete-Mulime(v) : v V [G]
11: E[G
t
]
12: pentru ecare (x, y) E[G] execut
13: u Gsete-Mulime(x)
14: v Gsete-Mulime(y)
15: dac (u, v) / E[G
t
] atunci
16: E[G
t
] E[G
t
] (u, v)
17: orig[u, v] orig[x, y]
18: w[u, v] w[x, y]
19: altfel dac w[x, y] < w[u, v] atunci
20: orig[u, v] orig[x, y]
21: w[u, v] w[x, y]
22: construiete listele de adiacen Adj pentru G
t
23: returneaz G
t
i T
Procedura AAM-Reducere primete ca argument de intrare un graf cu costuri G i
returneaz o versiune contractat a lui G, avnd adugate cteva muchii la arborele minim de
acoperire T curent. Iniial, pentru ecare muchie (u, v) E, presupunem c orig[u, v] = (u, v)
i c w[u, v] este costul muchiei.
440 Capitolul 24 Arbori de acoperire minimi
a. Fie T mulimea de muchii returnat de AAM-Reducere i e T
t
un arbore minim de
acoperire G
t
returnat de procedur. Demonstrai c T orig[x, y] : (x, y) T
t
este un
arbore minim de acoperire al lui G.
b. Argumentai c [V [G
t
][ [V [/2.
c. Artai cum se poate implementa AAM-Reducere, astfel nct s ruleze n timpul O(E).
( Folosii structuri de date simple.)
d. S presupunem c rulm k faze ale AAM-Reducere, folosind graful produs de una din
faze ca intrare pentru urmtoarea i acumulnd muchiile n T. Argumentai faptul c
timpul total de rulare al celor k faze este O(kE).
e. S presupunem c, dup ce rulm k faze ale algoritmului AAM-Reducere, rulm
algoritmul lui Prim pe graful produs de ultima faz. Artai cum trebuie ales k pentru
ca timpul total de execuie s e O(E lg lg V ). Argumentai c alegerea lui k minimizeaz
timpul de rulare asimptotic total.
f. Pentru ce valori ale lui [E[ (relativ la [V [) este mai rapid asimptotic algoritmul lui Prim
cu preprocesare dect algoritmul lui Prim fr preprocesare?
Note bibliograce
Tarjan [188] analizeaz problema arborelui de acoperire minim i ofer un material avansat
excelent. Un istoric al problemei arborelui de acoperire minim a fost scris de ctre Graham i
Hell [92].
Tarjan atribuie prima problem a arborelui minim de acoperire unei lucrri din 1926 a lui
O. Bor uvka. Algoritmul lui Kruskal a fost anunat de ctre Kruskal [131] n 1956. Algoritmul
cunoscut, de obicei, sub numele de algoritmul lui Prim a fost ntr-adevr inventat de ctre Prim
[163], dar a fost, de asemenea, inventat mai nainte de ctre V. Jarnk n 1930.
Motivul pentru care algoritmii greedy sunt efectivi n determinarea arborilor minimi de
acoperire este c mulimea arborilor unui graf formeaz un matroid grac. (Vezi seciunea 17.4.)
Cel mai rapid algoritm pentru determinarea unui arbore minim de acoperire n cazul cnd
[E[ = (V lg V ) este algoritmul lui Prim implementat cu heap-uri Fibonacci. Pentru grafuri mai
rare, Fredman i Tarjan [75] dau un algoritm care ruleaz n timpul O(E lg ([E[, [V [)), unde
([E[, [V [) = mini : lg
(i)
[V [ [E[/[V [. Faptul c [E[ [V [ implic faptul c algoritmul lor
ruleaz n timpul O(E lg

V ).
25 Drumuri minime de surs unic
S presupunem c un automobilist dorete s gseasc cel mai scurt drum de la Chicago la
Boston, utiliznd o hart rutier a Statelor Unite pe care sunt indicate distanele ntre ecare
dou intersecii adiacente.
Un mod posibil de rezolvare a acestei probleme este de a enumera toate drumurile de la
Chicago la Boston i, pe baza lungimilor drumurilor, de a selecta unul din cele de lungime mi-
nim. Este uor de vzut, chiar i n cazul n care sunt considerate numai drumurile care nu
conin cicluri, c numrul variantelor este enorm, i n plus, majoritatea lor nu pot luate n
considerare. De exemplu, un drum de la Chicago la Boston via Houston este evident o soluie
de neacceptat, deoarece Houston se a la distana de 1000 de mile de oraele considerate.
n acest capitol i n capitolul 26, vom arta cum poate rezolvat aceast problem n
mod ecient. ntr-o problem de drum minim, este dat un graf orientat cu costuri G =
(V, E), funcia de cost w : E R asociind ecrei muchii cte un cost exprimat printr-un
numr real. Costul unui drum p = 'v
0
, v
1
, ..., v
k
` este suma costurilor corespunztoare muchiilor
componente:
w(p) =
k

i=1
w(v
i1
, v
i
).
Costul unui drum minim (costul optim) de la u la v se denete prin:
(u, v) =

minw(p) : u
p
Yv dac exist drum de la u la v,
altfel.
Un drum minim de la u la v este orice drum p cu proprietatea w(p) = (u, v).
n cazul exemplului Chicago-Boston, putem modela harta rutier printr-un graf: vrfurile
reprezint punctele de intersecie, muchiile i costurile acestora reprezint segmentele de drum,
respectiv distanele ntre intersecii. Scopul pe care ni-l propunem este de a gsi drumul minim
ntre o intersecie din Chicago (de exemplu Clark Street cu Addison Avenue) i o intersecie dat
din Boston (Brookline Avenue cu Yawkey Way).
Costurile muchiilor trebuie interpretate mai curnd ca metrice dect ca distane, ele
ind utilizate frecvent pentru a reprezenta timpul, costul, penaliti sau alte mrimi care se
acumuleaz liniar de-a lungul unui drum i pe care, de regul, dorim s le minimizm.
Algoritmul de cutare n lime prezentat n seciunea 23.2 este un algoritm pentru deter-
minarea drumurilor minime n grafuri fr costuri, adic, grafuri ale cror muchii sunt considerate
avnd costul egal cu unitatea. Deoarece multe dintre conceptele utilizate n cadrul descrierii al-
goritmului de cutare n lime vor considerate i n studiul drumurilor minime n grafuri cu
costuri, sftuim cititorul ca nainte de a continua lectura acestui capitol, s revada seciunea
23.3.
Variante
n acest capitol ne vom concentra pe problema drumurilor minime de surs unic:
ind dat un graf G = (V, E), dorim s gsim pentru un vrf surs s V dat, cte un drum
442 Capitolul 25 Drumuri minime de surs unic
minim de la s la ecare vrf v V . Pe baza unui algoritm care rezolv aceast problem, pot
rezolvate o serie de probleme reductibile la aceasta, dintre care menionm urmtoarele variante.
Problema drumurilor minime de destinaie unic: S se determine pentru ecare vrf
v V , cte un drum minim de la v la un vrf destinaie t prestabilit. Inversnd orientarea
ecrei muchii a grafului, problema se reduce la o problem de determinare a drumurilor
minime de surs unic.
Problema drumurilor minime de surs i destinaie unic: S se determine un drum
minim de la u la v pentru u i v date. Dac rezolvm problema drumurilor minime de
surs unic pentru vrful u atunci rezolvm i aceast problem. Mai mult dect att,
nu se cunosc algoritmi pentru rezolvarea acestei probleme care s e asimptotic mai rapizi
dect cel mai bun algoritm pentru determinarea drumurilor minime de surs unic, n cazul
cel mai defavorabil.
Problema drumurilor minime pentru surse i destinaii multiple: Pentru ecare pere-
che de vrfuri u i v, s se determine cte un drum minim de la u la v. Problema poate
rezolvat, de exemplu, prin aplicarea algoritmului pentru surs unic, pentru ecare vrf
al grafului. n mod obinuit, aceast problem poate rezolvat mai ecient i structura ei
este interesant prin ea nsi. n cadrul capitolului 26, problema drumurilor minime ntre
perechile de vrfuri ale unui graf va reluat i analizat n detaliu.
Muchii de cost negativ
n cazul algoritmului pentru determinarea drumurilor minime de surs unic, anumite muchii
ale grafului pot avea asociate costuri negative. Dac graful G = (V, E) nu conine cicluri accesibile
din vrful surs s i care s e de cost negativ, atunci pentru orice v V , costul optim (s, v)
este bine denit, chiar dac este de valoare negativ. Dac ns exist cel puin un ciclu de cost
negativ accesibil din s, costurile optimale nu sunt bine denite. ntr-adevr nici un drum de la
s la un vrf component al ciclului nu poate un drum minim deoarece ntotdeauna se poate
construi un drum mai scurt i anume de-a lungul drumului considerat urmat de o traversare a
ciclului de cost negativ. n cazul n care exist cel puin un drum de la s la v care s conin un
ciclu de cost negativ, prin deniie (s, v) = .
n gura 25.1 este ilustrat efectul costurilor negative asupra costurilor drumurilor minime.
Deoarece exist un singur drum de la s la a (i anume drumul 's, a`), (s, a) = w(s, a) = 3. De
asemenea, exist un singur drum de la s la b i deci (s, b) = w(s, a) +w(a, b) = 3 +(4) = 1.
Evident, exist o innitate de drumuri de la s la c: 's, c`, 's, c, d, c`, 's, c, d, c, d, c` etc. Deoarece
ciclul 'c, d, c` are costul 6+(3) = 3 > 0, drumul minim de la s la c este 's, c` de cost (s, c) = 5.
De asemenea, drumul minim de la s la d este 's, c, d` de cost (s, d) = w(s, c) + w(c, d) = 11.
n mod analog, exist o innitate de drumuri de la s la e: 's, e`, 's, e, f, e`, 's, e, f, e, f, e` etc.
Evident ciclul 'e, f, e` este de cost 3 + (6) = 3 < 0 dar nu exist un drum minim de la s la e
deoarece prin traversarea repetat a ciclului de cost negativ 'e, f, e` rezult drumuri de la s la e
de costuri negative orict de mari i deci (s, e) = . Acelai argument justic (s, f) = .
Deoarece g este accesibil din f, exist drumuri de la s la g de costuri negative orict de mari,
deci (s, g) = . Vrfurile h, i i j compun de asemenea un ciclu avnd cost negativ. Deoarece
nc nici unul dintre aceste vrfuri nu este accesibil din s, rezult (s, h) = (s, i) = (s, j) = .
Capitolul 25 Drumuri minime de surs unic 443
Figura 25.1 Costuri negative ntr-un graf orientat. Pe ecare vrf este scris costul drumului minim
dintre acesta i sursa s. Deoarece vrfurile e i f formeaz un ciclu de cost negativ accesibil din s, ele au
costurile pentru drumul minim egale cu . Deoarece vrful g este accesibil dintr-un vrf pentru care
costul drumului minim este , i acesta are costul drumului minim egal cu . Vrfuri ca h, i, i j
nu sunt accesibile din s, i de aceea costurile lor pentru drumul minim sunt egale cu , dei fac parte
dintr-un ciclu avnd cost negativ.
O serie de algoritmi pentru determinarea drumurilor, cum este de exemplu algoritmul
Dijkstra, impun ca toate costurile muchiilor grafului de intrare s e nenegative, ca n cazul
exemplului cu harta rutier. Ali algoritmi, cum este de exemplu algoritmul Bellman-Ford,
accept ca graful de intrare s aib muchii cu costuri negative i produc rspunsuri corecte
n cazul n care nici un ciclu de cost negativ nu este accesibil din vrful surs considerat. n mod
obinuit, aceti algoritmi detecteaz i semnaleaz prezena ciclurilor de costuri negative.
Reprezentarea drumurilor minime
Frecvent, dorim s determinm nu numai costurile optimale, dar i vrfurile care compun un
drum minim. Pentru reprezentarea unui drum minim vom utiliza o reprezentare similar celei
considerate n cazul arborilor de lime n seciunea 23.2. Fiind dat un graf G = (V, E), se reine
pentru ecare vrf v V un predecesor [v] care este e un alt vrf, e nil. Algoritmii pentru
determinarea drumurilor minime prezentai n cadrul acestui capitol determin astfel nct
pentru orice vrf v, lanul de predecesori care ncepe cu v s corespund unei traversri n ordine
invers a unui drum minim de la s la v. Astfel, pentru orice vrf v, pentru care [v] = nil,
procedura Tiprete-Drum(G, s, v) din seciunea 23.2 poate utilizat pentru tiprirea unui
drum minim de la s la v.
Pe durata execuiei unui algoritm pentru determinarea drumurilor minime, valorile lui
nu indic n mod necesar drumurile minime. Ca i n cazul cutrii n lime, vom considera
subgraful predecesor G

= (V

, E

) indus de valorile lui , unde V

este mulimea vrfurilor


din G avnd proprietatea c au predecesor diferit de nil, reunit cu mulimea constnd din
vrful surs s:
V

= v V : [v] = NIL s
444 Capitolul 25 Drumuri minime de surs unic
Mulimea de muchii orientate E

este mulimea de muchii indus de valorile lui pentru vrfurile


din V

:
E

= ([v], v) E : v V

` s
Vom demonstra c valorile determinate de algoritmii ce vor prezentai n acest capitol
asigur ca la terminare, G

s e un arbore al drumurilor minime n sensul c este un arbore


cu rdcin coninnd cte un drum minim de la sursa s la ecare vrf al grafului care este
accesibil din s. Un arbore al drumurilor minime este similar arborelui de lime din seciunea
23.2, cu diferena c el conine cte un drum minim calculat n termenii costurilor muchiilor i
nu a numrului de muchii. Mai exact, e G = (V, E) un graf orientat cu costuri, avnd funcia de
cost w : E R; presupunem c G nu conine cicluri de cost negativ accesibile din vrful surs
s, deci drumurile minime sunt bine denite. Un arbore al drumurilor minime de rdacin s
este un subgraf orientat G
t
= (V
t
, E
t
), unde V
t
V , E
t
E astfel nct urmtoarele condiii
sunt ndeplinite:
1. V
t
este mulimea vrfurilor accesibile din s n G,
2. G
t
este un arbore orientat cu rdcin, avnd rdcina s,
3. pentru orice v V
t
unicul drum de la s la v n G
t
este un drum minim de la s la v n G.
Drumurile minime nu sunt n mod necesar unice i n consecin exist mai muli arbori de
drumuri minime. De exemplu, n gura 25.2 este prezentat un graf orientat cu costuri i doi
arbori de drumuri minime avnd aceeai rdcin.
Prezentarea general a capitolului
Algoritmii pentru determinarea drumurilor minime de surs unic prezentai n cadrul acestui
capitol sunt bazai pe o tehnic cunoscut sub numele de relaxare. n cadrul seciunii 25.1 sunt
demonstrate o serie de proprieti generale ale algoritmilor de determinare a drumurilor minime
i sunt stabilite concluzii relativ la algoritmii bazai pe relaxare. Algoritmul Dijkstra pentru re-
zolvarea problemei drumurilor minime de surs unic, n cazul n care toate muchiile au costuri
nenegative, este prezentat n seciunea 25.2. Seciunea 25.3 prezint algoritmul Bellman-Ford
utilizat n cazul mai general n care muchiile pot avea i costuri negative. Algoritmul Bellman-
Ford permite detectarea existenei unui ciclu de cost negativ, accesibil din vrful surs. n cadrul
seciunii 25.4 este prezentat un algoritm de timp liniar pentru determinarea drumurilor minime
de surs unic ntr-un graf aciclic orientat. n seciunea 25.5 este demonstrat modul n care
algoritmul Bellman-Ford poate utilizat pentru rezolvarea unui caz special de programare
liniar.
Analiza noastr impune adoptarea unor convenii de calcul n care unul sau ambii operanzi
sunt . Vom presupune c pentru orice numr real a = , avem a + = +a = . De
asemenea, pentru ca argumentele utilizate n demonstraii s e valabile i n cazul existenei
ciclurilor de cost negativ, presupunem c pentru orice numr real a = , avem a + () =
() +a = ().
25.1. Drumuri minime i relaxare 445
Figura 25.2 (a) Un graf orientat cu costuri mpreun cu costurile drumurilor minime de la sursa s.
(b) Muchiile haurate formeaz un arbore de drumuri minime avnd drept rdcin sursa s. (c) Un alt
arbore de drumuri minime avnd aceeai rdcin.
25.1. Drumuri minime i relaxare
Pentru nelegerea algoritmilor de determinare a drumurilor minime de surs unic, este util
nelegerea tehnicilor pe care acetia le utilizeaz i a proprietile drumurilor minime care sunt
exploatate de aceste tehnici. Tehnica principal utilizat de algoritmii descrii n cadrul acestui
capitol este relaxarea, metod care revine la decrementarea repetat a unei margini superioare
pentru determinarea costului corespunztor unui drum minim pentru ecare vrf, pn cnd
marginea superioar devine egal cu costul unui drum optimal. n cadrul acestei seciuni vom
analiza modul n care opereaz relaxarea i vom demonstra formal mai multe proprieti pe care
aceasta le conserv.
Apreciem c la prima lectur a acestui capitol demonstraiile teoremelor pot eventual omise
este sucient reinerea doar a enunurilor i n continuare s e abordai algoritmii prezentai
n seciunea 25.2 i 25.3. Atragem atenia ns asupra importanei rezultatului stabilit de lema
25.7, deoarece acesta este esenial n nelegerea algoritmilor pentru determinarea drumurilor
minime prezentai n cadrul acestui capitol. De asemenea, sugerm cititorului c la prima lectur
pot ignorate lemele referitoare la subgraful predecesor i arborii de drumuri minime (lemele
25.8 i 25.9); n schimb ar trebui s-i concentreze atenia asupra lemelor care se refer la costurile
drumurilor minime.
Structura optimal a unui drum minim
De regul, algoritmii pentru determinarea drumurilor minime exploateaz proprietatea c
un drum minim ntre dou vrfuri conine alte subdrumuri optimale. Aceast proprietate de
optimalitate substructural este o caracteristic att a programrii dinamice (capitolul 16) ct
i a metodei greedy (capitolul 17). n fapt, algoritmul Dijkstra este un algoritm greedy, iar
algoritmul Floyd-Warshall pentru determinarea drumurilor minime pentru toate perechile de
vrfuri (vezi capitolul 26) este un algoritm de programare dinamic. Urmtoarea lem i corolarul
ei stabilesc mai precis proprietatea de optimalitate substructural a drumurilor minime.
Lema 25.1 (Subdrumurile unui drum minim sunt drumuri optimale) Fiind dat un
graf orientat cu costuri G = (V, E) cu funcia de cost w : E R, e p = 'v
1
, v
2
, ..., v
k
` un
drum minim de la vrful v
1
la vrful v
k
i pentru orice i i j astfel nct 1 i j k e
446 Capitolul 25 Drumuri minime de surs unic
p
ij
= 'v
i
, v
i+1
, ..., v
j
` subdrumul lui p de la vrful v
i
la vrful v
j
. Atunci, p
ij
este un drum minim
de la v
i
la v
j
.
Demonstraie. Dac descompunem drumul p n v
1
p
1i
Y v
i
p
ij
Y v
j
p
jk
Y v
k
, atunci w(p) = w(p
1i
) +
w(p
ij
) +w(p
jk
). Presupunem acum c exist un drum p
t
ij
de la v
i
la v
j
de cost w(p
t
ij
) < w(p
ij
).
Atunci, v
1
p
1i
Y v
i
p

ij
Y v
j
p
jk
Y v
k
este un drum de la v
1
la v
k
al crui cost w(p
1i
) + w(p
t
ij
) + w(p
jk
)
este strict mai mic dect w(p) ceea ce contrazice presupunerea c p este un drum minim de la
v
1
la v
k
.
n cadrul cutrii n lime (seciunea 23.2), rezultatul stabilit de lema 23.1 este o proprietate
simpl a celor mai scurte distane n grafuri fr costuri. Corolarul urmtor al lemei 25.1
generalizeaz aceast proprietate n cazul grafurilor cu costuri.
Corolarul 25.2 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R.
Presupunem c un drum minim p de la sursa s la vrful v poate descompus n s
p

Y u v
pentru un anume vrf u i un drum p
t
. Atunci, costul unui drum minim de la s la v este
(s, v) = (s, u) +w(u, v).
Demonstraie. Conform lemei 25.1, subdrumul p
t
este un drum minim de la sursa s la vrful
u. Rezult
(s, v) = w(p) = w(p
t
) +w(u, v) = (s, u) +w(u, v).
Urmtoarea lem stabilete o proprietate simpl, dar util, a costurilor drumurilor minime.
Lema 25.3 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R i vrful
surs s. Atunci, pentru toate muchiile (u, v) E avem (s, v) (s, u) +w(u, v).
Demonstraie. Un drum minim p de la sursa s la vrful v are costul mai mic sau egal cu costul
oricrui alt drum de la s la v. n particular, costul drumului p este mai mic sau egal cu costul
oricrui drum de la sursa s la vrful u i care conine muchia (u, v).
Relaxare
Algoritmii prezentai n cadrul acestui capitol utilizeaz tehnica de relaxare. Pentru ecare
vrf v V pstrm un atribut d[v], reprezentnd o margine superioar a costului unui drum
minim de la sursa s la v. Numim d[v] o estimare a drumului minim. Estimrile drumurilor
minime i predecesorii sunt iniializai prin urmtoarea procedur:
Iniializeaz-Surs-Unic(G, s)
1: pentru ecare vrf v V [G] execut
2: d[v]
3: [v] nil
4: d[s] 0
Dup iniializare [v] =nil pentru orice v V, d[v] = 0 pentru v = s i d[v] = pentru
v V s.
25.1. Drumuri minime i relaxare 447
Figura 25.3 Relaxarea unei muchii (u, v) cu costul w(u, v) = 2. mpreun cu ecare vrf este prezentat
i estimarea pentru drumul minim. (a) Deoarece, nainte de relaxare, d[v] > d[u] +w(u, v), valoarea lui
d[v] descrete. (b) Aici, nainte de pasul de relaxare, d[v] d[u] + w(u, v), i deci valoarea lui d[v] nu
este modicat de relaxare
n procesul de relaxare
1
a unei muchii (u, v) se veric dac drumul minim la v, determinat
pn la acel moment, poate mbuntit pe baza vrfului u i, dac da, atunci se reactualizeaz
d[v] i [v]. Un pas de relaxare poate determina descreterea valorii estimrii drumului minim
d[v] i reactualizarea cmpului [v] ce conine predecesorul vrfului v. Pseudocodul urmtor
realizeaz un pas de relaxare pe muchia (u, v).
Relaxeaz(u, v, w)
1: dac d[v] > d[u]+w(u, v) atunci
2: d[v] d[u] +w(u, v)
3: [v] u
n gura 25.3 sunt prezentate dou exemple de relaxare a unei muchii, n unul dintre exemple
estimarea drumului minim descrete, n cel de al doilea nici o estimare nu este modicat.
Fiecare algoritm din cadrul acestui capitol apeleaz Iniializeaz-Surs-Unic dup care
trece la relaxarea repetat a muchiilor. Mai mult dect att, relaxarea este unica modalitate prin
care estimrile drumurilor minime i predecesorii sunt modicai. Algoritmii din acest capitol
difer n ceea ce privete numrul relaxrilor efectuate i ordinea n care muchiile sunt relaxate. n
algoritmul Dijkstra i n algoritmul pentru determinarea drumurilor minime n grafurile aciclice
orientate, ecare muchie este relaxat o singur dat. n cazul algoritmului Bellman-Ford, ecare
muchie este relaxat de mai multe ori.
Proprieti ale operaiei de relaxare
Corectitudinea algoritmilor din acest capitol depinde de o serie de proprieti ale relaxrii
care sunt prezentate n cadrul urmtoarelor leme. Majoritatea lemelor se refer la rezultatele
efecturii unei secvene de pai de relaxare asupra muchiilor unui graf orientat cu costuri,
iniializat prin Iniializeaz-Surs-Unic. Cu excepia lemei 25.9, aceste leme sunt aplicabile
oricrei secvene de pai de relaxare, nu numai acelora care produc valorile drumurilor minime.
Poate prea ciudat faptul c termenul de relaxare este utilizat pentru a desemna o operaie care determin
decrementarea unei margini superioare. Utilizarea termenului este justicat de considerente de ordin istoric.
Rezultatul unui pas de relaxare poate vzut ca o relaxare a restriciei d[v] d[u] +w(u, v) care, prin lema 25.3,
trebuie satisfacut dac d[u] = (s, u) i d[v] = (s, v). Cu alte cuvinte, dac d[v] d[u] +w(u, v) atunci nu exist
presiune pentru satisfacerea acestei restricii, deci restricia poate relaxat.
448 Capitolul 25 Drumuri minime de surs unic
Lema 25.4 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R i e
(u, v) E. Atunci, dup relaxarea muchiei (u, v) prin executarea procedurii Relaxeaz(u, v, w),
rezult d[v] d[u] +w(u, v).
Demonstraie. Dac naintea relaxrii muchiei (u, v) avem d[v] > d[u] + w(u, v), atunci prin
relaxare rezult d[v] = d[u] + w(u, v). Dac naintea aplicrii relaxrii d[v] d[u] + w(u, v),
atunci nici d[v] i nici d[u] nu se modic, deci, n continuare, dup aplicarea relaxrii avem
d[v] d[u] +w(u, v).
Lema 25.5 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R. Fie s V
un vrf surs i presupunem c graful este iniializat prin Iniializeaz-Surs-Unic(G, s).
Atunci, d[v] (s, v) pentru orice v V i relaia se pstreaz pentru orice secven de pai de
relaxare efectuai asupra muchiilor lui G. Mai mult dect att, o dat ce d[v] i atinge marginea
inferioar (s, v), valoarea lui nu se mai modic.
Demonstraie. Relaia d[v] (s, v) este cu certitudine ndeplinit dup iniializare deoarece
d[s] = 0 (s, s) (a se observa c (s, s) este dac s se a pe un ciclu de cost negativ i
este egal cu 0 altfel) i d[v] = implic d[v] (s, v) pentru orice v V s. Vom demonstra
prin reducere la absurd c relaia se menine pentru orice secven de pai de relaxare. Fie v
primul vrf pentru care un pas de relaxare a muchiei (u, v) determin d[v] < (s, v). Atunci,
dup relaxarea muchiei (u, v) obinem
d[u] +w(u, v) = d[v] < (s, v) (s, u) +w(u, v) (prin lema 25.3),
ceea ce implic d[u] < (s, u). Deoarece, ns, relaxarea muchiei (u, v) nu modic d[u], aceast
inegalitate ar trebuit s e adevrat nainte de relaxarea muchiei, ceea ce contrazice alegerea
lui v ca ind primul vrf pentru care d[v] < (s, v). Rezult astfel c relaia d[v] (s, v) se
pstreaz pentru orice v V .
Pentru a vedea c valoarea lui d[v] nu se mai modic o dat ce d[v] = (s, v), s observm
c dac i-a atins marginea inferioar, deoarece am demonstrat c d[v] (s, v), rezult c d[v]
nu mai poate descrete i, de asemenea, d[v] nu poate nici s creasc, indc paii de relaxare
nu determin incrementarea valorilor lui d.
Corolarul 25.6 Presupunem c, n graful orientat cu costuri G = (V, E), avnd funcia de
cost w : E R, nu exist drum de la vrful surs s V la un vrf dat v V . Atunci, dup
iniializarea grafului prin Iniializeaz-Surs-Unic(G, s), avem d[v] = (s, v) i egalitatea
se pstreaz pentru orice secven de pai de relaxare asupra muchiilor lui G.
Demonstraie. Prin lema 25.5, avem = (s, v) d[v], atunci d[v] = = (s, v).
Urmtoarea lem joac un rol important n demonstrarea corectitudinii algoritmilor pentru
determinarea drumurilor minime care vor prezentai n continuare n acest capitol. Ea va furniza
condiii suciente pentru ca estimarea unui drum minim, obinut prin relaxare, s convearg la
costul unui drum minim.
Lema 25.7 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R. Fie
s V un vrf surs i s Yu v un drum minim n G pentru u, v V . Presupunem c G este
iniializat cu Iniializeaz-Surs-Unic(G, s) dup care este efectuat o secven de pai de
relaxare care include apelul procedurii Relaxeaz(u, v, w) asupra muchiilor lui G. Dac d[u] =
(s, u) la un moment care precede acest apel, atunci d[v] = (s, v) la orice moment ulterior
acestui apel.
25.1. Drumuri minime i relaxare 449
Demonstraie. Prin lema 25.5, dac d[u] = (s, u) la un moment dat nainte ca muchia (u, v)
s e relaxat, atunci egalitatea se pstreaz n continuare. n particular, dup relaxarea muchiei
(u, v) avem,
d[v] d[u] +w(u, v) (prin lema 25.4)
= (s, u) +w(u, v)
= (s, v) (prin corolarul 25.2).
Prin lema 25.5, (s, v) este un minorant pentru d[v], deci d[v] = (s, v) i egalitatea se va
menine la toate momentele ulterioare.
Arbori de drumuri minime
Pn n acest moment, am demonstrat c relaxarea determin c estimrile drumurilor
minime descresc monoton la costurile adevrate corespunztoare drumurilor minime. De
asemenea, vom arta c, dac o secven de relaxri a determinat costurile drumurilor minime,
subgraful predecesorilor G

indus de valorile rezultate este un arbore al drumurilor minime


pentru G. Pentru nceput, urmtoarea lem stabilete c subgraful predecesorilor este un arbore
avnd drept rdcin vrful surs considerat.
Lema 25.8 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R i s V
vrful surs. Presupunem c G nu are cicluri de cost negativ care s poat atinse din s. n
aceste condiii, dup ce graful a fost iniializat prin Iniializeaz-Surs-Unic(G, s), graful
predecesorilor G

este un arbore cu rdcin avnd rdcina s pentru orice secven de pai de


relaxare aplicat muchiilor lui G.
Demonstraie. La momentul iniial singurul vrf din G

este vrful surs, deci armaia


formulat este evident adevrat. Fie G

graful predecesorilor rezultat dup efectuarea unei


secvene de pai de relaxare. Demonstrm prin reducere la absurd c G

este graf aciclic. S


presupunem c un anumit pas de relaxare determin apariia unui ciclu n graful G

, e acesta
c = 'v
0
, v
1
, ..., v
k
`, v
k
= v
0
. Atunci, [v
i
] = v
i1
pentru i = 1, 2, ..., k, i fr restrngerea
generalitii putem presupune c acest ciclu a rezultat n G

prin relaxarea muchiei (v


k1
, v
k
).
Armm c toate vrfurile ciclului c pot atinse din vrful surs s. De ce? Fiecare vrf al
ciclului c, n momentul n care i-a fost atribuit o valoare diferit de nil a valorii , are de
asemenea asociat i o estimare a unui drum minim. Prin lema 25.5, ecare vrf al ciclului c are
costul unui drum minim nit, din care rezult c vrful este accesibil din s.
S examinm acum estimrile drumurilor minime ale vrfurilor din c existente naintea
efecturii apelului Relaxeaz(v
k1
, v
k
, w) i s artm c c este un ciclu de cost negativ,
fapt care va contrazice presupunerea c G nu conine cicluri de cost negativ care s poat
atinse din vrful surs. nainte de efectuarea apelului, avem [v
i
] = v
i1
pentru i = 1, 2, ..., k1.
Rezult c pentru i = 1, 2, ..., k 1 ultima reactualizare a valorii d[v
i
] a fost prin atribuirea
d[v
i
] d[v
i1
] + w(v
i
, v
i1
). Dac din acest moment d[v
i1
] a fost modicat, atunci noua
valoare va mai mic, deci imediat naintea efecturii apelului Relaxeaz(v
k1
, v
k
, w) avem
d[v
i
] d[v
i1
] +w(v
i1
, v
i
) pentru orice i = 1, 2, . . . , k 1. (25.1)
Deoarece [v
k
] a fost modicat prin apel, nainte de apel avem inegalitatea strict
d[v
k
] > d[v
k1
] +w(v
k1
, v
k
).
450 Capitolul 25 Drumuri minime de surs unic
Figura 25.4 Ilustrarea unicitii drumului n G

de la sursa s la vrful v. Dac ar exista dou drumuri


p
1
(s Y u Y x z Y v) i p
2
(s Y u Y y z Y v), unde x ,= y, atunci [z] = x i [z] = y ceea ce
conduce la o contradicie.
Prin nsumarea acestei inegaliti stricte cu cele k1 inegaliti (25.1), obinem suma estimrilor
drumurilor minime de-a lungul ciclului c:
k

i=1
d[v
i
] >
k

i=1
(d[v
i1
] +w(v
i1
, v
i
)) =
k

i=1
d[v
i1
] +
k

i=1
w(v
i1
, v
i
).
Dar,
k

i=1
d[v
i
] =
k

i=1
d[v
i1
],
deoarece ecare vrf din ciclul c apare exact o dat n ecare dintre cele dou sume. Aceasta
implic
0 >
k

i=1
w(v
i1
, v
i
).
Astfel suma costurilor de-a lungul ciclului c este negativ, ceea ce reprezint o contradicie.
Rezult astfel c G

este un graf orientat, aciclic. Pentru a arta c el este un arbore cu


rdcin avnd rdcina s, este sucient (vezi exerciiul 5.5-3) s artm c, pentru ecare vrf
v V

, exist un drum unic de la s la v n G

.
Trebuie s artm mai nti c pentru orice vrf din V

exist un drum de la s ctre acel


vrf. Mulimea V

este format din vrfurile care au valori diferite de nil i din vrful s. Ideea
este de a demonstra prin inducie c exist un drum de la s ctre toate vrfurile din V

. Detaliile
sunt lsate pe seama cititorului, n exerciiul 25.1-6.
Pentru completarea demonstraiei lemei, trebuie artat c pentru orice vrf v V

, exist
cel mult un drum de la s la v n graful G

. S presupunem contrariul. Cu alte cuvinte, s


presupunem c exist dou drumuri simple de la s la un anume vrf v : p
1
, care poate
descompus n s Y u Y x z Y v i p
2
care poate descompus n s Y u Y y z Y v
unde x = y. (Vezi gura 25.4). n acest caz, rezult [z] = x i [z] = y ceea ce conduce la
contradicia x = y. n consecin, exist un singur drum n G

de la s la v, deci G

este un
arbore al drumurilor minime de rdcin s.
Acum putem demonstra c, dac dup efectuarea unei secvene de pai de relaxare, tuturor
vrfurilor le-au fost asociate adevratele costuri corespunztoare drumurile minime, atunci
subgraful predecesorilor G

este un arbore al drumurilor minime.


Lema 25.9 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R i s V
vrful surs. Presupunem c G nu are cicluri de cost negativ care s poat atinse din s. S
25.1. Drumuri minime i relaxare 451
efectum apelul Iniializeaz-Surs-Unic(G, s) i s presupunem n continuare c a fost
efectuat o secven de pai de relaxare asupra muchiilor lui G care determin d[v] = (s, v)
pentru orice v V . Atunci subgraful predecesorilor G

este un arbore al drumurilor minime de


rdcin s.
Demonstraie. Trebuie s demonstrm c cele trei proprieti ale arborilor drumurilor minime
sunt ndeplinite de ctre G

. Pentru demonstrarea primei proprieti, trebuie s artam c V

este mulimea vrfurilor care pot atinse din s. Prin deniie, un cost (s, v) al unui drum
minim este nit, dac i numai dac v poate atins din s i deci vrfurile care pot atinse din s
sunt exact vrfurile care au valori d nite. Dar unui vrf v V s i-a fost atribuit o valoare
nit pentru cmpul d[v] dac i numai dac [v] = nil. Rezult c vrfurile din V

sunt exact
vrfurile care pot atinse din s.
Cea de a doua proprietate rezult direct din lema 25.8. Mai rmne de demonstrat ultima
proprietate a arborilor drumurilor minime i anume: pentru orice v V

, unicul drum elementar


s
p
Yv n G

este un drum minim de la s la v n G. Fie p = 'v


0
, v
1
, ..., v
k
`, unde v
0
= s i v
k
= v.
Pentru i = 1, 2, ..., k , avem simultan relaiile d[v
i
] = (s, v
i
) i d[v
i
] d[v
i1
] + w(v
i1
, v
i
) din
care rezult w(v
i1
, v
i
) (s, v
i
) (s, v
i1
). Prin nsumarea costurilor de-a lungul drumului p
obinem
w(p) =
k

i=1
w(v
i1
, v
i
)
k

i=1
((s, v
i
) (s, v
i1
)) = (s, v
k
) (s, v
0
) = (s, v
k
).
Obinem astfel w(p) (s, v
k
). Deoarece (s, v
k
) este o margine inferioar pentru costul oricrui
drum de la s la v
k
, rezult c w(p) = (s, v
k
) i deci p este un drum minim de la s la v = v
k
.
Exerciii
25.1-1 Obinei doi arbori ai drumurilor minime pentru graful orientat din gura 25.2 distinci
de arborii deja ilustrai.
25.1-2 Dai un exemplu de graf orientat cu costuri G = (V, E) avnd funcia de cost w : E R
i sursa s astfel nct G s satisfac urmtoarea proprietate: pentru orice muchie (u, v) E,
exist un arbore al drumurilor minime de rdcin s care conine (u, v) i exist un arbore al
drumurilor minime de rdcin s care nu conine (u, v).
25.1-3 Extindei demonstraia lemei 25.3 astfel nct s includ i cazurile n care costurile
drumurilor minime sunt sau .
25.1-4 Fie G = (V, E) un graf orientat cu costuri, cu vrful surs s i presupunem c G este
iniializat prin Iniializeaz-Surs-Unic(G, s). Demonstrai c dac o secven de pai de
relaxare determin ca [s] s e diferit de nil, atunci G conine un ciclu de cost negativ.
25.1-5 Fie G = (V, E) un graf orientat cu costuri, care nu conine muchii de cost negativ. Fie
s V vrful surs i denim [v] n mod obinuit i anume [v] este predecesor al lui v pe un
drum minim de la sursa s la v V s dac v poate atins din s i nil n caz contrar. Dai
un exemplu de astfel de graf G i o atribuire a valorilor care s produc un ciclu n G

. (Prin
lema 25.8, o astfel de atribuire nu poate realizat pe baza unei secvene de pai de relaxare).
452 Capitolul 25 Drumuri minime de surs unic
25.1-6 Fie G = (V, E) un graf orientat cu costuri cu funcia de cost w : E R i care nu
are cicluri de cost negativ. Fie s V vrful surs i presupunem c G este iniializat prin
Iniializeaz-Surs-Unic(G, s). Demonstrai c pentru orice vrf v V

, exist drum de la
s la v n G

i c aceast proprietate se pstreaz pentru orice secven de pai de relaxare.


25.1-7 Fie G = (V, E) un graf orientat cu costuri, care nu conine nici un ciclu de cost negativ,
accesibil din vrful surs s. Fie s vrful surs, i s presupunem c G a fost iniializat de procedura
Iniializeaz-Surs-Unic(G, s). Artai c exist un ir de [V [ 1 pai de relaxare care
produce d[v] = (s, v) pentru orice v V .
25.1-8 Fie G un graf orientat cu costuri oarecare i cu un ciclu de cost negativ accesibil din
vrful surs s. Artai c ntotdeauna se poate construi un ir innit de relaxri ale muchiilor
lui G astfel nct ecare relaxare face ca estimarea drumului minim s se schimbe.
25.2. Algoritmul Dijkstra
Algoritmul Dijkstra rezolv problema drumurilor minime de surs unic ntr-un graf orientat
cu costuri G = (V, E) pentru care toate costurile muchiilor sunt nenegative. n cadrul acestei
seciuni vom presupune c w(u, v) 0 pentru ecare muchie (u, v) E.
Dijkstra(G, w, s)
1: Iniializeaz-Surs-Unic(G, s)
2: S
3: Q V [G]
4: ct timp Q = execut
5: u Extrage-Min(Q)
6: S S

u
7: pentru ecare vrf v Adj[u] execut
8: Relaxeaz(u, v, w)
Algoritmul Dijkstra opereaz prin meninerea unei mulimi S de vrfuri pentru care costurile
nale corespunztoare drumurilor minime de la sursa s au fost deja determinate, respectiv pentru
toate vrfurile v S avem d[v] = (s, v). Algoritmul itereaz selectarea unui vrf u V S
pentru care estimarea drumului minim este minim, introduce u n S i relaxeaz muchiile
divergente din u. n implementarea care va prezentat se va menine o coad de prioriti
Q coninnd toate vrfurile din V S indexate prin valorile d corespunztoare. Implementarea
presupune c graful G este reprezentat prin liste de adiacen.
Algoritmul Dijkstra relaxeaz muchiile n modul prezentat n gura 25.5. Linia 1 realizeaz
iniializarea obinuit a valorilor d i , iar linia 2 iniializeaz mulimea S cu mulimea vid. n
continuare, coada de prioriti Q este iniializat n linia 3 pentru a conine toate vrfurile din
V S = V = V . La ecare iteraie a buclei ct timp din liniile 48, este extras cte un vrf
u din Q = V S i introdus n mulimea S. (La prima iteraie a acestei bucle u = s). Astfel,
vrful u are cea mai mic estimare a drumului minim dintre vrfurile din V S. n continuare,
liniile 78 relaxeaz ecare muchie (u, v) divergent din u i reactualizeaz estimarea d[v] i
predecesorul [v] n cazul n care drumul minim ctre v poate ameliorat prin trecerea prin u.
25.2. Algoritmul Dijkstra 453
Figura 25.5 Evoluia algoritmului Dijkstra. Vrful surs este vrful cel mai din stnga. Estimrile
drumurilor minime sunt indicate n interiorul vrfurilor, muchiile haurate reprezint valorile predece-
sorilor: dac muchia (u, v) este haurat, atunci [v] = u. Vrfurile marcate cu neagru aparin mulimii
S iar vrfurile marcate cu alb aparin cozii de prioriti Q = V S. (a) Conguraia existent imediat
naintea primei iteraii a buclei ct timp din liniile 48. Vrful haurat are valoarea d minim i este
vrful selectat ca vrf u n linia 5. (b)-(f ) Conguraia rezultat dup ecare iteraie a buclei ct timp.
Vrful haurat este selectat ca vrf u la linia 5 a iteraiei urmtoare. Valorile d i prezentate n (f)
sunt valorile nale.
Trebuie observat c nici un vrf nu mai este introdus n Q dup linia 3 i c ecare vrf este
extras din Q i inserat n S o singur dat, deci bucla ct timp din liniile 48 efectueaz [V [
iteraii.
Deoarece algoritmul Dijkstra alege ntotdeauna cel mai uor sau apropiat vrf din V S
pentru a-l introduce n S, spunem c el utilizeaz o strategie de tip greedy. Strategiile greedy
sunt prezentate detaliat n capitolul 17, dar considerm c este posibil nelegerea algoritmului
Dijkstra chiar dac acest capitol nu a fost lecturat. n general strategiile greedy nu asigur
obinerea soluiei optimale, dar aa dup cum va demonstrat de teorema urmtoare i corolarul
acesteia, algoritmul Dijkstra determin ntr-adevr drumurile minime. Cheia demonstraiei este
de a arta c n momentul la care vrful u este introdus n mulimea S avem d[u] = (s, u)
pentru toate vrfurile u V.
Teorema 25.10 (Corectitudinea algoritmului Dijkstra) Dac algoritmul Dijkstra este a-
plicat unui graf orientat, cu costuri G = (V, E) cu funcie de cost nenegativ w i vrf surs s,
atunci la terminare d[u] = (s, u) pentru toate vrfurile u V.
Demonstraie. Vom demonstra prin reducere la absurd c pentru ecare vrf u V , n
momentul la care u este introdus n mulimea S, d[u] = (s, u) i egalitatea se menine la
toate momentele de timp ulterioare.
Presupunem c u este primul vrf pentru care d[u] = (s, u) n momentul la care el este
454 Capitolul 25 Drumuri minime de surs unic
Figura 25.6 Demonstraia teoremei 25.10. nainte ca vrful u s e introdus n S, mulimea S este
nevid. Un drum minim p de la vrful surs s la vrful u poate descompus n s
p
1
Y x y
p
2
Y u, unde
y este primul vrf al drumului care nu aparine mulimii S i x S precede y. Vrfurile x i y sunt
distincte, dar este posibil s avem s = x sau y = u. Este posibil ca drumul p
2
s reintre n mulimea S
dup cum este posibil ca el s nu mai reintre n aceast mulime.
introdus n mulimea S. S examinm conguraia existent la nceputul iteraiei din bucla ct
timp care determin introducerea vrfului u n S i prin examinarea unui drum minim de la s
la u s obinem concluzia d[u] = (s, u). Deoarece s este primul vrf care este introdus n S, i
d[s] = (s, s) = 0, n acest moment, rezult u = s. Deoarece u = s, avem S = n momentul la
care u este introdus n S. n mod necesar exist un drum de la s la u, deoarece n caz contrar,
prin corolarul 25.6 am avea d[u] = (s, u) = ceea ce ar contrazice ipoteza d[u] = (s, u).
Deoarece exist cel puin un drum de la s la u, exist i un drum minim p de la s la u. Drumul
p conecteaz un vrf s din S cu un vrf u din V S. Fie y primul vrf de-a lungul lui p astfel
nct y V S i e x V predecesorul lui y. Atunci, aa cum rezult din gura 25.6, drumul
p poate descompus ca s
p
1
Yx y
p
2
Yu.
Armm c d[y] = (s, y) n momentul la care u este introdus n S. Pentru a demonstra
aceast armaie, observm c x S. Deoarece u este primul vrf pentru care d[u] = (s, u) n
momentul la care el este introdus n S, rezult d[x] = (s, x) n momentul la care x este introdus
n S. Muchia (x, y) a fost ns relaxat n acest moment, deci armaia rezult pe baza lemei
25.7.
Acum putem deriva o contradicie care s conduc la justicarea concluziei formulate n
teorem. Deoarece y precede u pe un drum minim de la s la u i toate costurile muchiilor sunt
nenegative (n particular i cele care compun drumul p
2
), avem (s, y) (s, u) i deci
d[y] = (s, y) (s, u) d[u] (prin lema 25.5). (25.2)
Dar, deoarece ambele vrfuri u i y se aau deja n V S n momentul la care u a fost selectat
n linia 5, avem d[u] d[y]. Astfel, ambele inegaliti din (25.2) sunt de fapt egaliti, deci
d[y] = (s, y) = (s, u) = d[u].
n consecin, d[u] = (s, u) ceea ce contrazice alegerea vrfului u. n concluzie, n momentul n
care ecare vrf u V este inserat n mulimea S, avem d[u] = (s, u) i conform lemei 25.5
egalitatea se menine la toate momentele ulterioare de timp.
25.2. Algoritmul Dijkstra 455
Corolarul 25.11 Dac algoritmul Dijkstra este aplicat unui graf orientat cu costuri G = (V, E)
cu funcie de cost nenegativ w i vrf surs s, atunci la terminare subgraful predecesorilor G

este un arbore al drumurilor minime de rdcin s.


Demonstraie. Rezult direct din teorema 25.10 i lema 25.9.
Analiz
Ct de rapid este algoritmul Dijkstra? S considerm mai nti cazul n care reprezentm
coada de prioriti Q = V S printr-un tablou de tip list. n cazul unei astfel de implementri,
ecare operaie Extrage-Min necesit un timp O(V ) i cum sunt [V [ operaii, timpul total
necesar pentru Extrage-Min este O(V
2
). Fiecare vrf v V este inserat n mulimea S o
singur dat, deci pe durata evoluiei algoritmului, ecare muchie din lista de adiacen Adj[v]
este examinat de asemenea o singur dat n cadrul buclei pentru din liniile 78. Deoarece
numrul total de muchii n listele de adiacen este [E[, vor n total [E[ iteraii pentru aceast
bucl pentru, ecare operaie necesitnd timp O(1). Timpul total de execuie al algoritmului
este astfel O(V
2
+E) = O(V
2
).
Dac graful este rar, atunci este preferabil implementarea listei de prioriti Q ca heap
binar. Algoritmul rezultat este uneori referit ca algoritmul Dijkstra modicat. n acest caz,
ecare operaie Extrage-Min necesit timp O(lg V ). Ca i n varianta iniial sunt [V [ astfel de
operaii. Timpul necesar generrii heap-ului binar este O(V ). Atribuirile d[v] d[u] +w(u, v) n
Relaxeaz sunt realizate prin apelul Decrete-Cheie(Q, v, d[u] +w(u, v)) care necesit timp
O(lg V ) (vezi exerciiul 7.5-4) i sunt cel mult [E[ astfel de operaii. Astfel, timpul de execuie
este O((V + E) lg V ), care devine O(E lg V ) n cazul n care toate vrfurile pot atinse din
vrful surs. De fapt, putem obine un timp de execuie O(V lg V +E) implementnd coada de
prioriti Q prin intermediul unui heap Fibonacci (vezi capitolul 21). Costul amortizat al ecreia
dintre cele [V [ operaii Extrage-Min este O(lg V ) i ecare dintre cele [E[ apeluri Descrete-
Cheie necesit numai O(1) timp amortizat. Din punct de vedere istoric, dezvoltarea heap-urilor
Fibonacci a fost motivat de observaia c n algoritmul Dijkstra modicat sunt n general mai
multe apeluri Descrete-Cheie dect apeluri Extrage-Min, deci orice metod de reducere
a timpului amortizat a ecrei operaii Descrete-Cheie la o(lg V ) fr s creasc timpul
amortizat corespunzator unui apel Extrage-Min ar determina o implementare asimptotic mai
rapid.
Algoritmul Dijkstra prezint similitudini att cu cutarea n lime (vezi seciunea 23.2) ct i
cu algoritmul lui Prim pentru determinarea arborelui parial minim (vezi seciunea 24.2). El este
similar cu algoritmul de cutare n lime, deoarece mulimea de vrfuri S corespunde mulimii
de vrfuri negre utilizate n cutarea n lime; exact aa cum vrfurile din S au costurile nale
corespunztoare drumurilor minime, vrfurilor negre din cazul cutrii n lime le corespund
distanele corecte ale cutrii n lime. Algoritmul Dijkstra este similar cu algoritmul Prim
deoarece ambii algoritmi utilizeaz cozi de prioriti pentru gsirea celui mai uor vrf din
complementara unei mulimi date (mulimea S n algoritmul Dijkstra i arborele generat de
algoritmul Prim), insereaz acest vrf ntr-o anumit mulime i ajusteaz n mod corespunztor
costurile vrfurilor rezidente n continuare n complementara mulimii.
456 Capitolul 25 Drumuri minime de surs unic
Exerciii
25.2-1 Aplicai algoritmul Dijkstra grafului orientat prezentat n gura 25.2, mai nti cu s ca
vrf surs i apoi considernd vrf surs pe y. n stilul prezentat n gura 25.5, indicai valorile
d i i vrfurile din mulimea S dup ecare iteraie a buclei ct timp.
25.2-2 Dai un exemplu de graf orientat avnd muchii de costuri negative pentru care algoritmul
Dijkstra produce rezultate incorecte. De ce nu mai funcioneaz demonstraia teoremei 25.10 n
cazul n care sunt acceptate muchii de costuri negative?
25.2-3 S presupunem c modicm linia 4 din algoritmul Dijkstra n modul urmtor:
4: ct timp[Q[ > 1
Aceast modicare determin ca bucla ct timp s aib [V [ 1 iteraii n loc de [V [. Este
acest algoritm corect?
25.2-4 Presupunem c G = (V, E) este un graf orientat astfel nct ecrei muchii (u, v) E i
este asociat o valoare r(u, v), numr real n domeniul 0 r(u, v) 1 reprezentnd abilitatea
unui canal de comunicaie de la vrful u la vrful v. Considerm valoarea r(u, v) ca ind pro-
babilitatea de a nu se defecta canalul de la vrful u la vrful v. Mai presupunem c aceste
probabiliti sunt independente. Propunei un algoritm ecient pentru determinarea celui mai
sigur drum ntre dou vrfuri.
25.2-5 Fie G = (V, E) graf orientat cu costuri cu funcia de cost w : E 0, 1, ..., W 1
pentru W numr ntreg nenegativ dat. Modicai algoritmul Dijkstra astfel nct s determine
drumurile minime de surs s unic n timp O(WV +E).
25.2-6 Modicai algoritmul pe care l-ai propus pentru rezolvarea exerciiului 25.2-5 astfel nct
timpul de execuie s e O((V + E) lg W). ( Cte estimri distincte pentru drumurile
minime pot exista n timp pentru punctele din V S ?)
25.3. Algoritmul Bellman-Ford
Algoritmul Bellman-Ford rezolv problema drumurilor minime de surs unic n cazul
mai general n care costurile muchiilor pot negative. Fiind dat un graf orientat cu costuri
G = (V, E) cu vrful surs s i funcia de cost w : E R, algoritmul Bellman-Ford returneaz o
valoare boolean indicnd dac exist sau nu un ciclu de cost negativ accesibil din vrful surs
considerat. n cazul n care un astfel de ciclu exist, algoritmul semnaleaz c nu exist soluie,
respectiv dac nu exist un astfel de ciclu, algoritmul produce drumurile minime i costurile
corespunztoare lor.
Ca i algoritmul Dijkstra, algoritmul Bellman-Ford utilizeaz tehnica de relaxare, procednd
la descreterea estimrii d[v] a drumului minim de la surs s la ecare vrf v V pn cnd
este obinut costul adevrat (s, v) corespunztor unui drum minim. Algoritmul returneaz
adevrat dac i numai dac nu conine cicluri de cost negativ accesibile din surs.
n gura 25.7 este prezentat modul n care opereaz algoritmul Bellman-Ford pe un graf
cu 5 vrfuri. Dup efectuarea iniializrii, algoritmul efectueaz [V [ 1 treceri prin muchiile
25.3. Algoritmul Bellman-Ford 457
grafului. Fiecare trecere este o iteraie a buclei pentru din liniile 24 i efectueaz relaxarea
ecrei muchii cte o singur dat. Figurile 25.7(b)-(e) prezint starea algoritmului dup ecare
dintre cele patru treceri prin mulimea muchiilor. Dup efectuarea a [V [ 1 treceri, liniile 58
veric existena unui ciclu de cost negativ i returneaz valoarea boolean corespunztoare.
(Vom vedea puin mai trziu de ce aceast vericare este operant.)
Bellman-Ford(G, w, s)
1: Iniializeaz-Surs-Unic(G, s)
2: pentru i 1, [V [G][ 1 execut
3: pentru ecare muchie (u, v) E[G] execut
4: Relaxeaz(u, v, w)
5: pentru ecare muchie (u, v) E[G] execut
6: dac d[v] > d[u] +w(u, v) atunci
7: returneaz fals
8: returneaz adevrat
Algoritmul Bellman-Ford este de complexitate temporal O(V E) deoarece iniializarea din
linia 1 necesit timp (V ), ecare dintre cele [V [ 1 treceri prin mulimea muchiilor iniiate de
liniile 24 necesit un timp O(E), iar bucla pentru din liniile 57 se realizeaz tot n timpul
O(E).
Pentru demonstrarea corectitudinii algoritmului Bellman-Ford ncepem prin a arta c dac
nu exist cicluri de cost negativ, atunci algoritmul determin costurile corecte corespunztoare
drumurilor minime pentru toate vrfurile care pot atinse din surs. Demonstraia lemei
urmtoare aduce argumentul de ordin intuitiv pe care este bazat acest algoritm.
Lema 25.12 Fie G = (V, E) un graf orientat cu costuri cu vrful surs s i funcia de cost
w : E R i presupunem c G nu conine cicluri de cost negativ care s poat atini din s.
n aceste condiii, la terminarea calculului iniiat de Bellman-Ford avem d[v] = (s, v) pentru
toate vrfurile v accesibile din s.
Demonstraie. Fie v un vrf care poate atins din s i e p = 'v
0
, v
1
, ..., v
k
` un drum minim
de la s la v, unde v
0
= s i v
k
= v. Drumul p este simplu, deci k [V [ 1. Demonstrm prin
inducie c pentru a i-a trecere prin muchiile lui G, i = 0, 1, ..., k, avem d[v
i
] = (s, v
i
) i aceast
egalitate se pstreaz la toate momentele de timp ulterioare. Deoarece numrul total de treceri
este [V [ 1, stabilirea acestei proprieti este sucient pentru demonstraie. Dup iniializare
avem d[v
0
] = (s, v
0
) = 0 i prin lema 25.5, egalitatea se menine n continuare. Pentru demon-
strarea pasului inductiv, presupunem c dup cea de a (i 1)-a trecere, d[v
i1
] = (s, v
i1
).
Muchia (v
i1
, v
i
) este relaxat la cea de a i-a trecere, deci prin lema 25.7 rezult d[v
i
] = (s, v
i
)
dup cea de a ia trecere i la toate momentele de timp ulterioare, ceea ce ncheie demonstraia.
Corolarul 25.13 Fie G = (V, E) un graf orientat cu costuri, cu vrful surs s i funcia de cost
w : E R. Atunci, pentru ecare vrf v V , exist drum de la s la v dac i numai dac prin
aplicarea algoritmului Bellman-Ford asupra grafului G, la terminare avem d[v] < .
Demonstraie. Demonstraia este similar cu cea a lemei 25.12 i este propus spre rezolvare
n exerciiul 25.3-2.
Teorema 25.14 (Corectitudinea algoritmului Bellman-Ford) Presupunem c algoritmul
Bellman-Ford este aplicat grafului orientat G = (V, E) cu vrful surs s i funcia de cost
458 Capitolul 25 Drumuri minime de surs unic
Figura 25.7 Evoluia determinat de algoritmul Bellman-Ford. Sursa este vrful z. Valorile d sunt
indicate n interiorul vrfurilor, iar muchiile haurate indic valorile . n acest exemplu, la ecare trecere
muchiile sunt relaxate n ordine lexicograc: (u, v), (u, x), (u, y), (v, u), (x, v), (x, y), (y, v), (y, z), (z, u),
(z, x). (a) Starea imediat anterioar primei treceri prin mulimea muchiilor. (b)-(e) Starea dup ecare
dintre trecerile consecutive prin mulimea muchiilor. Valorile d i din (e) sunt valorile nale. Pentru
acest exemplu, algoritmul Bellman-Ford returneaz adevrat.
w : E R. Dac G nu conine cicluri de cost negativ, accesibile din s, atunci algoritmul retur-
neaz adevrat i avem d[v] = (s, v) pentru toate vrfurile v V , iar subgraful predecesorilor
G

este un arbore al drumurilor minime cu rdcin s. Dac G conine cel puin un ciclu de
cost negativ, accesibil din s, atunci algoritmul returneaz fals.
Demonstraie. Presupunem c graful G nu conine cicluri de cost negativ care pot atini din
sursa s. Demonstrm mai nti c la terminare d[v] = (s, v) pentru toate vrfurile v V. Dac
vrful v este accesibil din s, atunci armaia formulat rezult pe baza lemei 25.12. Dac v nu
este accesibil din s, atunci armaia rezult din corolarul 25.6. Rezult c armaia formulat
este demonstrat pentru toate vrfurile grafului. Lema 25.9, mpreun cu aceast proprietate,
implic faptul c G

este un arbore al drumurilor minime. S folosim acum aceast proprietate


pentru a demonstra c Bellman-Ford returneaz adevrat. La terminare, avem pentru toate
muchiile (u, v) E,
d[v] = (s, v)
(s, u) +w(u, v)(prin lema 25.3)
= d[u] +w(u, v),
i ca atare niciunul din testele din linia 6 nu va determina ca Bellman-Ford s returneze fals,
deci va returnat adevrat.
25.3. Algoritmul Bellman-Ford 459
Reciproc, s presupunem c graful G conine un ciclu c = 'v
0
, v
1
, ..., v
k
` de cost negativ,
accesibil din sursa s, unde v
0
= v
k
. Atunci
k

i=1
w(v
i1
, v
i
) < 0. (25.3)
S presupunem prin absurd c algoritmul Bellman-Ford returneaz adevrat. Atunci d[v
i
]
d[v
i1
] +w(v
i1
, v
i
) pentru i = 1, 2, ..., k. nsumnd aceste relaii de-a lungul ciclului c obinem
k

i=1
d[v
i
]
k

i=1
d[v
i1
] +
k

i=1
w(v
i1
, v
i
).
Ca i n cazul demonstraiei lemei 25.8, ecare vrf din c apare exact o singur dat n ecare
dintre cele dou sume, deci
k

i=1
d[v
i
] =
k

i=1
d[v
i1
].
Deoarece prin corolarul 25.13, d[v
i
] este nit pentru i = 1, 2, ..., k, rezult
0
k

i=1
w(v
i1
, v
i
),
ceea ce contrazice inegalitatea (25.3). n concluzie, algoritmul Bellman-Ford returneaz
adevrat dac graful G nu conine cicluri de cost negativ, accesibile din surs s i fals n
caz contrar.
Exerciii
25.3-1 Aplicai algoritmul Bellman-Ford grafului orientat reprezentat n gura 25.7, utiliznd
vrful y ca vrf surs. S se relaxeze muchiile n ordine lexicograc la ecare trecere i s se
aeze valorile d i dup ecare trecere. n continuare, modicai costul muchiei (y, v) astfel
nct noul cost s e egal cu 4 i aplicai din nou algoritmul, utiliznd vrful z ca vrf surs.
25.3-2 Demonstrai corolarul 25.13.
25.3-3 Fiind dat un graf G = (V, E) orientat, cu costuri, care nu conine cicluri de cost negativ,
e m valoarea maxim peste toate perechile de vrfuri u, v V a numrului minim de muchii
care compun un drum minim de la u la v. (Un drum minim se refer la cost i nu la numrul
de muchii.) Propunei o modicare simpl a algoritmului Bellman-Ford pentru calculul valorii
m n m+ 1 treceri.
25.3-4 Modicai algoritmul Bellman-Ford astfel nct s atribuie ca valoare pentru d[v]
tuturor vrfurilor v cu proprietatea c exist un ciclu de cost negativ pe cel puin un drum de
la surs la v.
25.3-5 Fie G = (V, E) un graf orientat cu costuri, cu funcia de cost w : E R. Obinei un
algoritm de timp O(V E) pentru determinarea valorii

(v) = min
uV
(u, v), pentru ecare
vrf v V .
460 Capitolul 25 Drumuri minime de surs unic
25.3-6 Presupunem c graful orientat cu costuri G = (V, E) are un ciclu de cost negativ.
Propunei un algoritm ecient pentru listarea vrfurilor unui astfel de ciclu. Demonstrai
corectitudinea algoritmului propus.
25.4. Drumuri minime de surs unic n grafuri orientate
aciclice
Prin relaxarea muchiilor unui graf orientat aciclic cu costuri G = (V, E), putem determina
drumurile minime de surs unic n timp (V + E). Drumurile minime sunt ntotdeauna bine
denite ntr-un astfel de graf datorit faptului c acesta nu poate avea cicluri de cost negativ,
chiar dac graful conine muchii de cost negativ.
Algoritmul ncepe prin sortarea topologic a grafului (vezi seciunea 23.4) pentru impunerea
unei ordini liniare a vrfurilor. Dac exist un drum de la vrful u la vrful v atunci u precede
v n ordinea topologic. n continuare, se efectueaz o singur trecere peste vrfurile sortate
topologic i pe msur ce ecare vrf este procesat, sunt relaxate toate muchiile divergente din
acel vrf.
GOA-Drumuri-minime(G, w, s)
1: sorteaz n ordine topologic vrfurile din G
2: Iniializeaz-Surs-Unic(G, s)
3: pentru ecare vrf u n ordinea dat de sortarea topologic execut
4: pentru ecare vrf v Adj[u] execut
5: Relaxeaz(u, v, w)
Un exemplu de aplicare a acestui algoritm este prezentat n gura 25.8.
Timpul de execuie al acestui algoritm este determinat de linia 1 i de bucla pentru din
liniile 35. Conform demonstraiei din seciunea 23.4, sortarea topologic poate realizat n
timp (V + E). n bucla pentru din liniile 35, ca i n algoritmul Dijkstra, este efectuat o
singur iteraie pentru ecare vrf. Pentru ecare vrf, ecare muchie divergent din acel vrf
este examinat o singur dat. Spre deosebire de algoritmul Dijkstra, nu exist nici o coad de
prioriti i, astfel, pentru ecare muchie este necesar un timp O(1). n concluzie, timpul total
necesar este (V +E), deci algoritmul este liniar n dimensiunea unei reprezentri prin lista de
adiacen a grafului.
Urmtoarea teorem stabilete c procedura GOA-Drumuri-minime determin corect
drumurile minime.
Teorema 25.15 Dac graful orientat cu costuri G = (V, E) i de surs s nu are cicluri, atunci
la terminarea procedurii GOA-Drumuri-minime, d[v] = (s, v) pentru toate vrfurile v V i
subgraful predecesorilor G

este un arbore al drumurilor minime.


Demonstraie. ncepem prin a demonstra c la terminare d[v] = (s, v) pentru toate vrfurile
v V . Dac v nu este accesibil din s, atunci pe baza corolarului 25.6 rezult d[v] = (s, v) = .
S presupunem c v este accesibil din s deci exist un drum minim p = 'v
0
, v
1
, ..., v
k
` unde
v
0
= s i v
k
= v. Deoarece vrfurile sunt procesate n ordine topologic, muchiile lui p vor
procesate n ordinea (v
0
, v
1
), (v
1
, v
2
), ..., (v
k1
, v
k
). Utiliznd un argument de tip inductiv i
25.4. Drumuri minime de surs unic n grafuri orientate aciclice 461
Figura 25.8 Aplicarea algoritmului pentru determinarea drumurilor minime ale unui graf aciclic
orientat. Vrfurile sunt sortate topologic de la stnga la dreapta. Vrful surs este s. Valorile d sunt
indicate n interiorul vrfurilor, iar muchiile haurate reprezint valorile . (a) Starea existent nainte
de prima iteraie a buclei pentru din liniile 35. (b)-(g) Strile rezultate dup ecare iteraie a buclei
pentru din liniile 35. Vrful marcat la ecare iteraie a fost utilizat ca vrf u la iteraia respectiv.
Valorile nale sunt prezentate n (g).
utiliznd lema 25.7 (similar demonstraiei lemei 25.12) obinem la terminare, d[v
i
] = (s, v
i
)
pentru i = 0, 1, ..., k. n nal, pe baza lemei 25.9, rezult c G

este un arbore al drumurilor


minime.
O aplicaie interesant a acestui algoritm este n determinarea drumurilor critice n analiza
gracelor PERT
2
. Muchiile reprezint lucrrile ce trebuie efectuate, iar costurile exprim
timpii necesari efecturii diferitelor lucrri. Dac muchia (u, v) intr n vrful v i muchia (v, x)
iese din vrful v, atunci efectuarea lucrrii (u, v) trebuie realizat naintea lucrrii (v, x). Un
drum n acest graf orientat aciclic reprezint o anumit secven de lucrri i ordinea n care
ele trebuie efectuate. Un drum critic este un drum n acest graf orientat aciclic,
PERT este un acronim pentru program evaluation and review technique
462 Capitolul 25 Drumuri minime de surs unic
reprezentnd timpul maxim necesar efecturii unei secvene de lucrri ntr-o anumit ordine.
Costul unui drum critic este o margine inferioar a timpului total necesar efecturii tuturor
lucrrilor. Putem determina un drum critic e
asociind muchiilor costurile rezultate prin amplicarea cu (1) a costurilor iniiale i
aplicnd GOA-Drumuri-minime sau
aplicnd GOA-Drumuri-minime n care nlocuim cu n linia 2 a procedurii
Iniializeaz-Surs-Unic i > prin < n procedura Relaxeaz.
Exerciii
25.4-1 Aplicai algoritmul GOA-Drumuri-minime grafului orientat prezentat n gura 25.8
utiliznd ca surs vrful r.
25.4-2 Presupunem c modicm linia 3 din GOA-Drumuri-minime n modul urmtor:
3: pentru primele [V [ 1 vrfuri luate n ordine topologic
Demonstrai c procedura rezultat este de asemenea corect.
25.4-3 Analiza PERT prezentat mai sus este destul de neintuitiv. Ar mult mai natural ca
vrfurile s reprezinte lucrrile, iar muchiile restriciile asupra ordinii n care acestea trebuie s
e efectuate, adic muchia (u, v) indic faptul c lucrarea u trebuie efectuat naintea lucrrii
v. n acest caz costurile nu vor mai asociate muchiilor, ci vor asociate vrfurilor. Modicai
procedura GOA-Drumuri-Minime astfel nct s determine n timp liniar un cel mai lung drum
ntr-un graf orientat aciclic cu vrfurile avnd costuri date.
25.4-4 Propunei un algoritm ecient pentru calculul numrului total de drumuri ntr-un graf
orientat i aciclic. Analizai algoritmul propus i comentai asupra aspectelor de ordin practic.
25.5. Constrngeri cu diferene i drumurile minime
n cadrul unei probleme de programare liniar, n general, dorim s optimizm o funcie
liniar supus unor constrngeri formulate matematic prin intermediul unui sistem de inecuaii
liniare. n cadrul acestei seciuni vom investiga un caz special de programare liniar care poate
redus la determinarea drumurilor minime de surs unic. Problema determinrii drumurilor
minime de surs unic, astfel rezultat, poate rezolvat utiliznd algoritmul Bellman-Ford,
obinnd astfel soluia problemei de programare liniar considerat.
Programare liniar
ntr-o problem general de programare liniar sunt date o matrice A de dimensiune mn,
un vector b de dimensiune m i un vector c de dimensiune n. Se dorete determinarea unui vector
x cu n componente care maximizeaz funcia obiectiv

n
i=1
c
i
x
i
supus la m constrngeri date
de Ax b.
25.5. Constrngeri cu diferene i drumurile minime 463
Multitudinea problemelor care pot formulate ca programe liniare justic interesul deosebit
acordat obinerii de algoritmi pentru programarea liniar. n practic, algoritmul simplex
3
rezolv rapid programe liniare, dar pot imaginate date de intrare pentru care algoritmul
s necesite timp de execuie exponenial. Programele liniare generale pot rezolvate n timp
polinomial e prin algoritmul elipsoidului, care ns n practic se dovedete a destul de
lent, e prin algoritmul Karmarkar care, n mod frecvent, n practic, este competitiv cu
metoda simplex.
Datorit dezvoltrilor de ordin matematic, necesare pentru nelegerea i analiza acestor
algoritmi, n cadrul seciunii de fa nu vor prezentai algoritmii de programare liniar
generali. Totui, din mai multe motive este important nelegerea elementelor eseniale n cadrul
abordrilor pe baza tehnicilor de programare liniar. n primul rnd, dac se cunoate ca o
anumit problem poate identicat ca o problem de programare liniar de tip polinomial,
rezult c exist un algoritm de complexitate temporal polinomial pentru rezolvarea acestei
probleme. n al doilea rnd, exist o serie de cazuri speciale de probleme de programare liniar
pentru care sunt cunoscui algoritmi mai rapizi. De exemplu, conform consideraiilor care
urmeaz s e efectuate n cadrul acestei seciuni, problema drumurilor minime de surs unic
este un caz special de programare liniar. Din clasa problemelor ce pot identicate ca probleme
de programare liniar menionm problema drumului minim de extremiti date (exerciiul 25.5-
4) i problema uxului maxim (exerciiul 27.1-8).
n anumite cazuri, de fapt, nu ne intereseaz funcia obiectiv i dorim doar s determinm
o soluie admisibil oarecare, adic orice vector x care veric sistemul Ax b sau s
demonstrm c nu exist soluii admisibile. n cele ce urmeaz ne vom concentra pe o astfel
de problem de admisibilitate.
Sisteme de constrngeri cu diferene
ntr-un sistem de constrngeri cu diferene, ecare linie a matricei A are toate
componentele egale cu 0, cu excepia a dou componente, una dintre ele egal cu 1 i cealalt
egal cu 1. n acest fel, constrngerile reprezentate de sistemul Ax b revin la m constrngeri
cu diferene asupra a n necunoscute, ecare constrngere ind o inegalitate de expresie
x
j
x
i
b
k
unde 1 i, j n i 1 k m.
De exemplu, s considerm problema determinrii unui vector 5-dimensional x = (x
i
) astfel
nct s satisfac
Algoritmul simplex determin o soluie optimal a unei probleme de programare liniar prin examinarea unei
secvene de puncte n regiunea admisibil submulimea spaiului n-dimensional, soluie a sistemului Ax b.
Algoritmul se bazeaz pe faptul c o soluie care maximizeaz funcia obiectiv n regiunea admisibil este plasat
ntr-un punct extrem sau col al regiunii admisibile. Algoritmul simplex determin trecerea de la un vrf la
altul al regiunii admisibile pn cnd nu se mai realizeaz nici o ameliorare a funciei obiectiv. Un simplex este
nchiderea convex (vezi seciunea 35.3) a d + 1 puncte n spaiul d-dimensional (de exemplu, triunghiul n plan
sau tetraedrul n spaiul cu 3 dimensiuni). Conform cu Dantzig [53], operaia de deplasare de la un vrf la altul
poate vzut ca o operaie pe un simplex derivat dintr-o interpretare dual a problemei de programare liniar
ceea ce justic termenul de metoda simplex.
464 Capitolul 25 Drumuri minime de surs unic

1 1 0 0 0
1 0 0 0 1
0 1 0 0 1
1 0 1 0 0
1 0 0 1 0
0 0 1 1 0
0 0 1 0 1
0 0 0 1 1

x
1
x
2
x
3
x
4
x
5

0
1
1
5
4
1
3
3

Aceast problem este echivalent cu problema determinrii valorilor x


i
, i = 1, 2, ..., 5 astfel nct
urmtoarele 8 constrngeri cu diferene s e ndeplinite,
x
1
x
2
0,
x
1
x
5
1,
x
2
x
5
1,
x
3
x
1
5,
x
4
x
1
4,
x
4
x
3
1,
x
5
x
3
3,
x
5
x
4
3.
(25.4)
Deoarece x = (5, 3, 0, 1, 4) veric ecare dintre inegalitile precedente, rezult c x
este o soluie a acestei probleme. De fapt, problema admite mai mult de o singur soluie; de
exemplu x
t
=(0, 2, 5, 4, 1) este de asemenea soluie a acestei probleme. Se observ c ntre aceste
dou soluii exist o anumit legtur i anume ecare componenta a lui x
t
este suma dintre
componenta pereche din x i numrul 5 i acest fapt nu este o simpl coinciden.
Lema 25.16 Fie x = (x
1
, x
2
, ..., x
n
) o soluie a sistemului de constrngeri cu diferene Ax b
i d o constant arbitrar. Atunci x +d = (x
1
+d, x
2
+d, ..., x
n
+d) este de asemenea o soluie
a sistemului Ax b.
Demonstraie. Pentru ecare x
i
i x
j
avem (x
j
+d) (x
i
+d) = x
j
x
i
. Deci, dac x satisface
sistemul Ax b atunci i x +d l satisface.
Sistemele de constrngeri cu diferene apar n cadrul multor aplicaii practice. De exemplu,
necunoscutele x
i
pot reprezenta momentele de timp la care survin anumite evenimente. Fiecare
constrngere poate exprima faptul c un eveniment nu poate aprea mult mai trziu dect un
alt eveniment. Posibil ca evenimentele s corespund lucrrilor ce trebuie executate pe durata
construciei unei cldiri. Dac spatul fundaiei cldirii ncepe n momentul x
1
i necesit 3
zile i turnatul betonului pentru fundaie ncepe n momentul x
2
, atunci poate formulat
constrngerea x
2
x
1
+ 3 ceea ce poate scris n mod echivalent x
1
x
2
3. Cu alte
cuvinte, constrngerea relativ n momentele nceperii celor dou aciuni poate exprimat ca
o constrngere cu diferene.
Grafuri de constrngere
Este preferabil interpretarea sistemului de constrngeri cu diferene i din punctul de vedere
al teoriei grafurilor. Ideea este c ntr-un sistem de constrngeri cu diferene Ax b, matricea A
25.5. Constrngeri cu diferene i drumurile minime 465
Figura 25.9 Graful constrngerilor corespunztor sistemului de constrngeri cu diferene (25.4).
Valoarea (v
0
, v
i
) este reprezentat n ecare vrf v
i
.O soluie admisibil a sistemului este x =
(5, 3, 0, 1, 4).
avnd dimensiunea nm poate interpretat ca matricea de inciden (vezi exerciiul 23.1-7) a
unui graf avnd n vrfuri i m muchii. Fiecare vrf v
i
al grafului, i = 1, 2, ..., n corespunde uneia
dintre cele n variabile necunoscute x
i
i ecare muchie orientat corespunde uneia dintre cele m
inegaliti n care sunt implicate dou necunoscute.
Exprimat n termeni formali, unui sistem de constrngeri cu diferene Ax b, i se ataeaz
graful constrngerilor, un graf orientat cu costuri G = (V, E) unde
V = v
0
, v
1
, ..., v
n

i
E = (v
i
, v
j
) : x
j
x
i
b
k
este o constrngere (v
0
, v
1
), (v
0
, v
2
), (v
0
, v
3
), ..., (v
0
, v
n
).
Vrful suplimentar v
0
este introdus, conform discuiei urmtoare, pentru a garanta c orice alt
vrf este accesibil din v
0
. Astfel, mulimea de vrfuri V const din cte un vrf v
i
pentru ecare
necunoscut x
i
i vrful suplimentar v
0
. Mulimea de muchii E conine cte o muchie pentru
ecare constrngere cu diferene i n plus cte o muchie (v
0
, v
i
) pentru ecare necunoscut x
i
.
Dac x
j
x
i
b
k
este o constrngere cu diferene, atunci costul muchiei (v
i
, v
j
) este w(v
i
, v
j
) =
b
k
. Costul ecrei muchii divergente din v
0
este egal cu 0. n gura 25.9 este reprezentat graful
constrngerilor pentru sistemul de constrngeri cu diferene (25.4).
Urmtoarea teorem stabilete c o soluie a sistemului de constrngeri cu diferene poate
obinut prin determinarea costurilor drumurilor minime n graful constrngerilor ataat.
Teorema 25.17 Fie dat un sistem de constrngeri cu diferene Ax b i e G = (V, E) graful
constrngerilor ataat. Dac G nu conine cicluri de cost negativ, atunci
x = ((v
0
, v
1
), (v
0
, v
2
), (v
0
, v
3
), ..., (v
0
, v
n
)) (25.5)
este o soluie admisibil a sistemului. Dac G conine cicluri de cost negativ, atunci sistemul nu
are soluii admisibile.
466 Capitolul 25 Drumuri minime de surs unic
Demonstraie. Demonstrm mai nti c, dac graful constrngerilor nu conine cicluri de
cost negativ, atunci x denit de (25.5) este o soluie admisibil. Fie o muchie arbitrar
(v
i
, v
j
) E. Prin lema 25.3, (v
0
, v
j
) (v
0
, v
i
) +w(v
i
, v
j
), sau echivalent, (v
0
, v
j
) (v
0
, v
i
)
w(v
i
, v
j
). Rezult c pentru x
i
= (v
0
, v
i
) i x
j
= (v
0
, v
j
) constrngerea x
j
x
i
w(v
i
, v
j
)
corespunztoare muchiei (v
i
, v
j
) este satisfcut.
S demonstrm acum c dac graful constrngerilor are cicluri de cost negativ, atunci sistemul
de constrngeri cu diferene nu are soluie. Fr restrngerea generalitii putem presupune c
ciclul de cost negativ este c = 'v
1
, v
2
, ..., v
k
`, unde v
1
= v
k
. (Vrful v
0
nu poate aparine ciclului
c deoarece nu exist muchii care intr n acest vrf.) Atunci, ciclul c corespunde urmtoarelor
constrngeri cu diferene:
x
2
x
1
w(v
1
, v
2
),
x
2
x
2
w(v
2
, v
3
),
.
.
.
x
k
x
k1
w(v
k1
, v
k
),
x
1
x
k
w(v
k
, v
1
).
Deoarece orice soluie x trebuie s satisfac ecare dintre aceste k inegaliti, orice soluie
va satisface i inegalitatea rezultat prin nsumarea acestora. Deorece n membrul stng ecare
necunoscut x
i
este o dat adunat i o dat sczut, prin nsumare, membrul stng este egal
cu 0. Prin nsumarea membrilor drepi rezult w(c) deci obinem 0 w(c). Deoarece c este un
ciclu de cost negativ w(c) < 0, deci orice soluie trebuie s satisfac 0 w(c) < 0 ceea ce este
imposibil.
Rezolvarea sistemelor de constrngeri cu diferene
Teorema 25.17 permite aplicarea algoritmului Bellman-Ford pentru rezolvarea sistemelor de
constrngeri cu diferene. Deoarece vrful surs v
0
este conectat cu ecare dintre celelalte vrfuri
din graful constrngerilor, rezult c orice ciclu de cost negativ este accesibil din v
0
. Astfel, dac
algoritmul Bellman-Ford returneaz adevrat, atunci costurile unui drum minim determin o
soluie admisibil a sistemului. De exemplu, n gura 25.9 costurile unui drum minim determin
soluia x = (5, 3, 0, 1, 4) i prin lema 25.16, x = (d 5, d 3, d, d 1, d 4) este de
asemenea o soluie, pentru orice constant d. Dac algoritmul Bellman-Ford returneaz fals,
atunci sistemul de constrngeri cu diferene nu are soluie admisibil.
Graful constrngerilor ataat unui sistem de constrngeri cu diferene cu m constrngeri i n
necunoscute are n + 1 vrfuri i n + m muchii. Rezult c pe baza algoritmului Bellman-Ford,
sistemul poate rezolvat n timp O((n +1)(n +m)) = O(n
2
+nm). Exerciiul 25.5-5 v cere s
demonstrai c n realitate acest algoritm se execut n timp O(nm) chiar dac m este mult mai
mic dect n.
25.5. Constrngeri cu diferene i drumurile minime 467
Exerciii
25.5-1 Determinai o soluie admisibil sau decidei c nu exist soluie pentru urmtorul sistem
de constrngeri cu diferene:
x
1
x
2
1,
x
1
x
4
4,
x
2
x
3
2,
x
2
x
5
7,
x
2
x
6
5,
x
3
x
6
10,
x
4
x
2
2,
x
5
x
1
1,
x
5
x
4
3,
x
6
x
3
8.
25.5-2 Determinai o soluie admisibil sau decidei c nu exist soluie pentru urmtorul sistem
de constrngeri cu diferene:
x
1
x
2
4,
x
1
x
5
5,
x
2
x
4
6,
x
3
x
2
1,
x
4
x
1
3,
x
4
x
3
5,
x
4
x
5
10,
x
5
x
3
4,
x
5
x
4
8.
25.5-3 Este posibil ca toate drumurile minime de la vrful v
0
ntr-un graf de constrngeri s e
pozitive? Justicai.
25.5-4 Exprimai problema drumului minim de extremiti date ca un program liniar.
25.5-5 Artai cum poate modicat algoritmul Bellman-Ford, astfel nct, aplicat pentru
rezolvarea unui sistem de constrngeri cu diferene de m inegaliti i n necunoscute, s se
execute n timp O(mn).
25.5-6 Artai cum poate rezolvat un sistem de constrngeri cu diferene pe baza algoritmului
Bellman-Ford aplicat unui graf care nu are vrful suplimentar v
0
.
25.5-7 Fie Ax b un sistem de m constrngeri cu diferene asupra n necunoscute. Artai
c algoritmul Bellman-Ford, aplicat grafului constrngerilor maximizeaz

n
i=1
x
i
pe domeniul
Ax b, x
i
0, pentru orice x
i
.
25.5-8 Artai c algoritmul Bellman-Ford aplicat grafului constrngerilor ataat sistemului
de constrngeri cu diferene Ax b, minimizeaz (maxx
i
minx
i
) pe domeniul Ax b.
Explicai utilitatea acestei proprieti n cazul n care algoritmul este aplicat pentru planicarea
lucrrilor n construcii.
468 Capitolul 25 Drumuri minime de surs unic
25.5-9 Presupunem c ecare linie a matricei A a programului liniar Ax b corespunde unei
constrngeri cu diferene, de o singur variabil, n forma x
i
b
k
sau n forma x
i
b
k
.
Artai c algoritmul Bellman-Ford poate adaptat pentru rezolvarea acestui tip de sistem de
constrngeri.
25.5-10 S presupunem c vrem s adugm i constrngeri de tip egalitate x
i
= x
j
+ b
k
la
un sistem de constrngeri cu diferene. Artai cum poate adaptat algoritmul Bellman-Ford
pentru rezolvarea acestui tip de constrngeri.
25.5-11 Propunei un algoritm ecient pentru rezolvarea unui sistem de constrngeri cu
diferene Ax b unde toate componentele vectorului b sunt numere reale i toate valorile x
i
trebuie s e numere ntregi.
25.5-12 Propunei un algoritm ecient pentru rezolvarea unui sistem de constrngeri cu di-
ferene Ax b unde toate componentele vectorului b sunt numere reale i o parte, dar nu n
mod necesar toate, dintre valorile x
i
trebuie s e numere ntregi.
Probleme
25-1 Varianta Yen a algoritmului Bellman-Ford
S presupunem c, la ecare trecere a algoritmului Bellman-Ford, relaxarea muchiilor este
realizat n ordinea descris n continuare. nainte de prima trecere, atribuim o ordine liniar
arbitrar v
1
, v
2
, ..., v
]V ]
vrfurilor grafului de intrare G = (V, E). n continuare, partiionm
mulimea de muchii E n E
f
E
b
unde E
f
= (v
i
, v
j
) E : i < j i E
b
=(v
i
v
j
) E : i > j.
Denim G
f
= (V, E
f
) i G
b
= (V, E
b
).
a. Demonstrai c G
f
este graf aciclic cu ordinea topologic 'v
1
, v
2
, ..., v
]V ]
` i G
b
este aciclic
cu ordinea topologic 'v
]V ]
, v
]V ]1
, ..., v
1
`.
S presupunem c dorim s implementm ecare trecere a algoritmului Bellman-Ford n modul
urmtor. Vizitm vrfurile n ordinea v
1
, v
2
, ..., v
]V ]
, relaxnd muchiile mulimii E
f
. Apoi vizitm
ecare vrf n ordinea v
]V ]
, v
]V ]1
, . . . , v
1
, relaxnd ecare muchie a mulimii E
b
care pleac din
vrf.
b. Demonstrai pentru schema descris, c dac G nu conine cicluri de cost negativ accesibile
din vrful surs s, atunci dup numai [V [/2| treceri prin mulimea muchiilor, avem d[v] =
(s, v) pentru orice vrf v V .
c. Cum se modic, n acest caz, timpul de execuie al algoritmului Bellman-Ford?
25-2 Imbricarea cutiilor
Spunem c o cutie d-dimensional, avnd dimensiunile (x
1
, x
2
, ..., x
d
) este imbricat ntr-o a
doua cutie de dimensiuni (y
1
, y
2
, ..., y
d
) dac exist o permutare a mulimii 1, 2, ..., d astfel
nct, x
(1)
< y
1
, x
(2)
< y
2
, ..., x
(d)
< y
d
.
a. Justicai c relaia de imbricare este tranzitiv.
Probleme 469
b. Propunei o metod ecient pentru a decide dac o cutie d-dimensional este imbricat
sau nu ntr-o a dou cutie.
c. Presupunem c este dat o mulime de cutii d-dimensionale, B
1
, B
2
, ..., B
n
. Descriei un
algoritm ecient pentru determinarea celei mai lungi secvene de cutii B
i
1
, B
i
2
, ..., B
i
k

cu proprietatea c B
i
j
este imbricat n B
i
j+1
pentru j = 1, 2, ..., k 1. Evaluai timpul de
execuie al algoritmului propus n termenii valorilor n i d.
25-3 Arbitraj
Prin arbitraj nelegem utilizarea discrepanelor existente ntre ratele de schimb pentru transfor-
marea unei uniti dintr-un anumit tip de valut n una sau mai multe uniti de acelai tip. De
exemplu, s presupunem c 1 dolar american poate cumpra 0, 7 lire englezeti; 1 lir englezeasc
poate cumpra 9, 5 franci francezi i 1 franc francez poate cumpra 0, 16 dolari americani. Atunci,
prin conversia descris, cu 1 dolar american se pot cumpra 0, 7 9, 5 0, 16 = 1, 064 dolari
americani, deci se obine un prot de 6, 4 procente.
Presupunem c sunt date n tipuri de valut c
1
, c
2
, ..., c
n
i un tabel R de dimensiune n n
a ratelor de schimb astfel nct o unitate din tipul c
i
poate cumpra R[i, j] uniti din tipul c
j
a. Propunei un algoritm ecient pentru a decide dac exist sau nu o secven 'c
i
1
, c
i
2
, ..., c
i
k
`
astfel nct
R[i
1
, i
2
] R[i
2
, i
3
] R[i
k1
, i
k
] R[i
k
, i
1
] > 1.
Analizai timpul de execuie al algoritmului propus.
b. S se propuna un algoritm ecient pentru tiprirea unei astfel de secvene n cazul n care
exist. Analizai timpul de execuie al algoritmului propus.
25-4 Algoritmul de scalare Gabow pentru drumurile minime de surs unic
Un algoritm de scalare rezolv o problem prin considerarea n momentul iniial numai a bitului
de ordin maxim din ecare dat de intrare relevant (cum este, de exemplu, costul unei muchii).
Soluia iniial este ranat prin luarea n considerare a bitului de ordin imediat urmtor, n
continuare procesul ind iterat, la ecare etap ind efectuat o nou ranare a soluiei, pn
cnd toi biii sunt utilizai i s-a calculat soluia corect.
n aceast problem, ne intereseaz un algoritm pentru determinarea drumurilor minime de
surs unic prin scalarea costurilor muchiilor. Presupunem c avem un graf orientat G = (V, E),
ale crui muchii au drept costuri numere ntregi nenegative w. Fie W = max
(u,v)E
w(u, v).
Ne propunem s obinem un algoritm cu timpul de execuie O(E lg W). Presupunem c toate
vrfurile pot atinse din surs.
Algoritmul elimin, unul cte unul, biii din reprezentarea binar corespunztoare costurilor
muchiilor, ncepnd cu bitul cel mai semnicativ i terminnd cu cel mai puin semnicativ.
Mai exact, e k = lg(W + 1)| numrul de bii din reprezentarea binar a lui W i pentru
i = 1, 2, ..., k, e w
i
(u, v) = w(u, v)/2
ki
|. Cu alte cuvinte, w
i
(u, v) este versiunea scalat cu
un factor negativ a lui w(u, v) dac i este cel mai semnicativ bit al lui w(u, v). (Rezult astfel,
w
k
(u, v) = w(u, v) pentru toate muchiile (u, v) E.) De exemplu, dac k = 5 i w(u, v) = 25,
a crui reprezentare binar este '11001`, atunci w
3
(u, v) = '110` = 6. De asemenea, dac k = 5
i w(u, v) = '00100` = 4, atunci w
3
(u, v) = '001` = 1. Denim
i
(u, v) costul unui drum minim
de la vrful u la vrful v utiliznd funcia de cost w
i
. Rezult c pentru toate vrfurile u, v V,
470 Capitolul 25 Drumuri minime de surs unic

k
(u, v) = (u, v). Pentru vrful surs s dat, algoritmul de scalare calculeaz mai nti costurile
drumurilor minime
1
(s, v), pentru orice v V , n continuare calculeaz
2
(s, v), pentru orice
v V i aa mai departe pn se ajunge la
k
(s, v), pentru orice v V . Vom presupune n cele
ce urmeaz c [E[ [V [ 1 i vom demonstra c evaluarea lui
i
pe baza lui
i1
necesit un
timp O(E), deci acest algoritm se execut ntr-un timp O(kE) = O(E lg W).
a. S presupunem c pentru toate vrfurile v V avem (s, v) [E[. Demonstrai c timpul
necesar pentru calculul valorilor (s, v) pentru orice v V, este O(E).
b. Demonstrai c putem calcula
1
(s, v) pentru orice v V, ntr-un timp O(E). Ne
preocupm n continuare de calculul lui
i
pe baza lui
i1
.
c. Demonstrai c pentru i = 2, 3, ..., k, sau w
i
(u, v) = 2w
i1
(u, v) sau w
i
(u, v) =
2w
i1
(u, v) + 1. Demonstrai c pentru orice v V ,
2
i1
(s, v)
i
(s, v) 2
i1
(s, v) +[V [ 1.
d. Pentru i = 2, 3, ..., k i ecare muchie (u, v) E, denim
w
i
(u, v) = w
i
(u, v) + 2
i1
(s, u) 2
i1
(s, v).
Demonstrai c pentru i = 2, 3, ..., k i pentru toate vrfurile u, v V , w
i
(u, v) este un
numr ntreg nenegativ.
e. Fie

i
(s, v) costul drumului minim de la s la v n cazul utilizrii funciei de cost w
i
.
Demonstrai c pentru i = 2, 3, ..., k i pentru toate vrfurile v V ,

i
(s, v) =

i
(s, v) + 2
i1
(s, v)
i c

i
(s, v) [E[.
f. Artai modul n care valorile
i
(s, v) se pot calcula pe baza valorilor
i1
(s, v) pentru
toate vrfurile v V , n timp O(E) i obinei c valorile (s, v) pentru orice v V pot
calculate n timp O(E lg W).
25-5 Algoritmul Karp pentru determinarea ciclului de cost mediu minim
Fie G = (V, E) un graf orientat avnd funcia de cost w : E R i e n = [V [. Costul mediu
al unui ciclu c = 'e
1
, e
2
, ..., e
k
` format din muchii din E este denit prin
(c) =
1
k
k

i=1
w(e
i
).
Fie

= min
c
(c) unde minimul este considerat peste mulimea tuturor ciclurilor orientate din
G. Spunem c ciclul c este un ciclu de cost mediu minim, dac (c) =

. n cadrul acestei
probleme ne intereseaz obinerea unui algoritm ecient pentru calculul lui

.
Putem presupune, fr restrngerea generalitii, c orice vrf v V este accesibil dintr-un
vrf surs s V . Fie (s, v) costul unui drum minim de la s la v i e
k
(s, v) costul unui drum
minim de la s la v constnd din exact k muchii. Dac nu exist nici un drum de la s la v constnd
din exact k muchii, atunci
k
(s, v) = .
Note bibliograce 471
a. Artai c dac

= 0, atunci G nu conine cicluri de cost negativ i pentru toate vrfurile


v V , (s, v) = min
0kn1

k
(s, v).
b. Artai c dac

= 0, atunci, pentru toate vrfurile v V ,


max
0kn1

n
(s, v)
k
(s, v)
n k
0.
( Utilizai ambele proprieti de la punctul (a).)
c. Fie c un ciclu de cost 0 i e u, v dou vrfuri din c. Fie x costul drumului de la u la v de-a
lungul ciclului. Demonstrai c (s, v) = (s, u) +x. ( Costul drumului de la v la
u de-a lungul ciclului este x .)
d. Artai c dac

= 0, atunci exist un vrf v pe ciclul de cost mediu minim, astfel nct


max
0kn1

n
(s, v)
k
(s, v)
n k
= 0.
( Artai c un drum minim ctre orice vrf aat pe ciclul de cost mediu minim
poate extins de-a lungul ciclului pentru a rezulta un drum minim la urmtorul vrf n
acest ciclu.)
e. Artai c dac

= 0, atunci
min
vV
max
0kn1

n
(s, v)
k
(s, v)
n k
= 0.
f. Artai c dac adunm o constant t la costul ecrei muchii din G, atunci valoarea lui

este incrementat cu t. Utiliznd aceast proprietate demonstrai c

= min
vV
max
0kn1

n
(s, v)
k
(s, v)
n k
.
g. Propunei un algoritm de timp O(V E) pentru calculul lui

.
Note bibliograce
Algoritmul Dijkstra [55] a aprut n 1959, dar n varianta iniial nu a fost menionat coada
de prioriti. Algoritmul Bellman-Ford este bazat pe doi algoritmi distinci i anume Bellman
[22] i Ford [71]. Bellman descrie relaia dintre drumurile minime i constrngerile cu diferene.
Lawler [132] descrie algoritmul n timp liniar pentru drumurile minime ntr-un graf orientat
aciclic pe care l consider n general cunoscut.
Cnd costurile muchiilor sunt numere ntregi relativ mici, rezolvarea problemei drumurilor
minime de surs unic poate realizat pe baza unor algoritmi mai ecieni. Ahuja, Mehlhorn,
Orlin i Tarjan [6] au propus un algoritm de complexitate temporal O(E + V

lg W) pentru
grafuri avnd costurile muchiilor numere nenegative, unde W este valoarea maxim a costurilor
472 Capitolul 25 Drumuri minime de surs unic
muchiilor grafului. De asemenea, ei au propus un algoritm uor de programat de timp O(E +
V lg W). Pentru grafuri avnd costurile muchiilor numere nenegative, algoritmul propus de ctre
Gabow i Tarjan [77] se execut ntr-un timp O(

V E lg(V W)) unde W este valoarea maxim


a costurilor muchiilor grafului.
Papadimitriou i Steiglitz [154] prezint consideraii interesante asupra metodei simplex
i algoritmul elipsoidului ca i asupra mai multor algoritmi corelai cu programarea liniar.
Algoritmul simplex pentru programarea liniar a fost inventat de G. Danzig n 1947. Diferitele
variante ale algoritmului simplex sunt i astzi cele mai frecvent utilizate metode pentru
rezolvarea problemelor de programare liniar. Algoritmul elipsoidului este datorat lui L. G.
Khachian care l-a introdus n 1979 i este bazat pe o lucrare mai veche publicat de N. Z. Shor,
D. B. Judin i A. S. Nemirovskii. Algoritmul Karmarkar este descris n [115].
26 Drumuri minime ntre toate perechile
de vrfuri
n acest capitol vom studia problema determinrii drumurilor minime dintre toate perechile de
vrfuri ale unui graf. Aceast problem poate aprea dac dorim s crem un tabel al distanelor
dintre toate perechile de orae care sunt desenate pe o hart. La fel ca n capitolul 25, se d un
graf orientat, cu costuri G = (V, E), cu o funcie de cost w : E R, care pune n coresponden
arcele cu anumite costuri care sunt valori reale. Dorim s gsim, pentru ecare pereche de vrfuri
u, v V , un drum de cost minim de la u la v, unde costul drumului este suma costurilor arcelor
care formeaz acel drum. De obicei, dorim ca ieirea s apar sub forma unui tabel: elementul
din linia u i coloana v ar trebui s conin costul drumului minim de la u la v.
Putem rezolva problema determinrii drumurilor minime ntre toate perechile de vrfuri,
rulnd, pentru ecare vrf din [V [, un algoritm de gsire a drumului minim de la acel vrf la
toate celelalte. Dac toate costurile arcelor sunt nenegative, putem folosi algoritmul lui Dijkstra.
Dac folosim implementarea unei cozi de prioritate sub form de vector, timpul de execuie este
O(V
3
+ V E) = O(V
3
). Implementarea cozii de prioritate, folosind heap-uri binare, duce la un
timp de execuie de ordinul O(V E lg V ), ceea ce reprezint o mbuntire dac graful este rar.
Dac implementm coada de prioritate folosind un heap Fibonacci, atunci timpul de execuie va
O(V
2
lg V +V E).
Dac sunt permise arce avnd costuri negative nu mai putem folosi algoritmul lui Dijkstra.
n locul acestuia, putem folosi algoritmul Bellman-Ford pentru ecare vrf. Timpul de execuie
rezultat este O(V
2
E), adic O(V
4
) pe un graf dens. n acest capitol vom vedea cum putem
implementa algoritmi mai ecieni. De asemenea, vom cerceta relaia dintre problema drumurilor
minime ntre toate perechile de vrfuri i nmulirea matricelor i i vom cerceta structura
algebric.
Spre deosebire de algoritmii de drum minim de surs unic care folosesc reprezentarea grafului
ca list de adiacen, majoritatea algoritmilor din acest capitol vor folosi reprezentarea prin
matrice de adiacen. (Algoritmul lui Johnson pentru grafuri rare folosete liste de adiacen.)
Intrarea este o matrice W, de dimensiune nn, reprezentnd costurile arcelor unui graf orientat
G = (V, E) avnd n vrfuri. Adic W = (w
ij
) unde
w
ij
=

0 dac i = j,
costul arcului(i, j) dac i = j i (i, j) E,
dac i = j i (i, j) / E.
(26.1)
Sunt permise arce cu costuri negative, dar, pentru moment, presupunem c graful de intrare nu
conine cicluri de cost negativ.
Ieirea sub form de tabel a algoritmilor de gsire a drumurilor minime ntre toate perechile
de vrfuri este o matrice D = (d
ij
) de dimensiuni n n, ale crei elemente reprezint costul
drumului minim de la i la j. Aceasta nseamn c, dac notm cu (i, j) costul minim al drumului
de la i la j (la fel ca n capitolul 25), atunci, la nal, vom avea d
ij
= (i, j).
Pentru a rezolva problema gsirii drumurilor de cost minim ntre toate perechile de vrfuri,
trebuie s calculm, pe lng costurile drumurilor minime, i matricea predecesorilor =
(
ij
), unde
ij
este nil n cazul n care i = j sau nu exist drum de la i la j. n celelalte
474 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
cazuri, elementul
ij
este predecesorul lui j ntr-un drum minim de la i. La fel cum subgraful
predecesorilor G

din capitolul 25 este un arbore al drumurilor minime, subgraful produs de a


i-a linie a matricei ar trebui s e un arbore al drumurilor minime cu rdcina i. Pentru ecare
vrf i V , denim subgraful predecesorilor al lui G pentru vrful i ca G
,i
= (V
,i
, E
,i
),
unde
V
,i
= j V :
ij
= nil i i E
,i
= (
ij
, j) : j V
,i
i
ij
= nil.
Dac G
,i
este un arbore de drumuri minime, atunci urmtoarea procedur, care este o versiune
modicat a procedurii Tiprete-Drum din capitolul 23, tiprete un drum minim de la vrful
i la vrful j.
Tiprete-Drumurile-Minime-Dintre-Toate-Perechile(, i, j)
1: dac i = j atunci
2: tiprete i
3: altfel
4: dac
ij
=nil atunci
5: tiprete Nu exist drum de la i la j
6: altfel
7: Tiprete-Drumurile-Minime-Dintre-Toate-Perechile (, i,
ij
)
8: tiprete j
Pentru a scoate n eviden trsturile eseniale ale algoritmilor, pentru toate perechile din
acest capitol, nu vom studia detaliat crearea i proprietile matricei predecesorilor aa cum am
fcut pentru subgrafurile predecesorilor din capitolul 25. Elementele de baz sunt acoperite de
cteva dintre exerciii.
Rezumatul capitolului
n seciunea 26.1 este prezentat un algoritm de programare dinamic, bazat pe nmulirea
matricelor pentru a rezolva problema gsirii drumurilor minime dintre toate perechile de drumuri.
Folosind tehnica ridicrii repetate la ptrat, acest algoritm poate fcut s ruleze n timp
(V
3
lg V ). Un alt algoritm de programare dinamic, algoritmul Floyd-Warshall, ruleaz n timp
(V
3
). n seciunea 26.2 se acoper, de asemenea, problema gsirii nchiderii tranzitive a unui
graf orientat care are legtur cu problema gsirii drumurilor minime dintre toate perechile de
vrfuri. Algoritmul lui Johnson este prezentat n seciunea 26.3. Spre deosebire de ali algoritmi
prezentai n acest capitol, algoritmul lui Johnson folosete reprezentarea grafurilor ca liste de
adiacen. Acest algoritm rezolv problema n timp O(V
2
lg V + V E), ceea ce l face ecient
pentru grafuri mari, rare. n nal, n seciunea 26.4 vom studia o structur algebric numit
semiinel nchis care permite multor algoritmi de drum minim s e aplicai ca gazde pentru
alte probleme pentru toate perechile care nu implic drumuri minime.
nainte de a merge mai departe, trebuie s stabilim cteva convenii pentru reprezentarea
prin matrice de adiacen. n primul rnd, vom presupune c graful de intrare G = (V, E) are n
vrfuri, deci n = [V [. n al doilea rnd, vom nota matricele cu majuscul: W, D, i elementele lor
cu litere mici i indici inferiori: w
ij
, d
ij
. Unele matrice pot avea indici superiori ntre paranteze
pentru a indica iteraiile: D
(m)
= (d
(m)
ij
). Pentru o matrice A de dimensiuni nn, vom presupune
c atributul linii[A] conine valoarea n.
26.1. Drumuri minime i nmulirea matricelor 475
26.1. Drumuri minime i nmulirea matricelor
n aceast seciune este prezentat un algoritm de programare dinamic pentru problema
drumurilor minime dintre toate perechile de vrfuri pe un graf orientat G = (V, E). Fiecare bucl
major a programului dinamic va apela o operaie care este similar nmulirii matricelor, astfel
nct acest algoritm va arta ca o nmulire repetat de matrice. Vom ncepe prin proiectarea unui
algoritm n timp (V
4
) pentru problema drumurilor minime dintre toate perechile de vrfuri i
vom mbunti acest algoritm, astfel nct s ruleze n timp (V
3
lg V ).
nainte de a merge mai departe, s recapitulm paii din capitolul 16 pentru dezvoltarea unui
algoritm de programare dinamic.
1. Se caracterizeaz structura unei soluii optime.
2. Se denete recursiv valoarea unei soluii optime.
3. Se calculeaz valoarea soluiei optime ntr-o manier bottom-up.
(Al patrulea pas, obinerea unei soluii optime din informaiile deja calculate, este tratat n
cadrul exerciiilor.)
Structura unui drum minim
ncepem prin a caracteriza structura unei soluii optime. Pentru problema drumurilor
minime pentru toate perechile dintr-un graf G = (V, E), am demonstrat (lema 25.1) c toate
subdrumurile unui drum minim sunt drumuri minime. S presupunem c graful este reprezentat
printr-o matrice de adiacen W = (w
ij
). S considerm un drum minim p de la vrful i la
vrful j i s presupunem c p conine cel mult m arce. Presupunnd c nu exist cicluri de cost
negativ, m este nit. Dac i = j, atunci p are costul 0 i nu conine nici un arc. Dac vrfurile i i
j sunt distincte, atunci descompunem drumul p n i
p

Yk j, unde drumul p
t
conine, acum, cel
mult m1 arce. Mai mult, conform lemei 25.1, p
t
este un drum minim de la i la k. n concluzie,
datorit corolarului 25.2, avem (i, j) = (i, k) +w
kj
.
O soluie recursiv pentru problema drumurilor minime dintre toate
perechile
Fie d
(m)
ij
costul minim al drumului de la i la j care conine cel mult m arce. Cnd m = 0,
exist un drum minim de la i la j care nu conine nici o muchie, dac i numai dac i = j. n
concluzie,
d
(0)
ij
=

0 dac i = j,
dac i = j.
Pentru m 1, calculm d
(m)
ij
ca ind minimul dintre d
(m1)
ij
(costul celui mai scurt drum de la
i la j care conine cel mult m1 arce) i costul minim al oricrui drum de la i la j care conine
476 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
cel mult m arce i este obinut lund n considerare toi predecesorii k ai lui j. Deci putem deni
recursiv
d
(m)
ij
= min

d
(m1)
ij
, min
1kn

d
(m1)
ik
+w
kj

= min
1kn

d
(m1)
ik
+w
kj

. (26.2)
Ultima egalitate rezult din faptul c w
jj
= 0 oricare ar j.
Care sunt costurile (i, j) ale drumurilor minime? Dac graful nu conine nici un ciclu de
cost negativ, atunci toate drumurile minime sunt elementare i conin, cel mult, n 1 arce. Un
drum de la vrful i la vrful j cu mai mult de n 1 arce nu poate avea un cost mai mic dect
cel mai scurt drum de la i la j. n concluzie, valorile costurilor drumurilor minime sunt date de:
(i, j) = d
(n1)
ij
= d
(n)
ij
= d
(n+1)
ij
= . (26.3)
Determinarea ascendent a costurilor drumurilor minime
Considernd ca intrare matricea W = (w
ij
), vom determina o serie de matrice D
(1)
, D
(2)
,
. . ., D
(n1)
, unde, pentru m = 1, 2, . . . , n 1, avem D
(m)
=

d
(m)
ij

. Matricea nal D
(n1)
va
conine costurile drumurilor minime. Observai c, deoarece d
(1)
ij
= w
ij
pentru toate vrfurile
i, j V , avem D
(1)
= W.
Esena algoritmului const n urmtoarea procedur care, dndu-se matricele D
(m1)
i W,
returneaz matricea D
(m)
. Cu alte cuvinte, extinde drumurile minime determinate anterior cu
nc un arc.
Extinde-Drumuri-Minime(D, W)
1: n linii[D]
2: e D
t
= (d
t
ij
) o matrice de dimensiuni n n
3: pentru i 1, n execut
4: pentru j 1, n execut
5: d
t
ij

6: pentru k 1, n execut
7: d
t
ij
min(d
t
ij
, d
ik
+w
kj
)
8: returneaz D
t
Procedura determin matricea D
t
= (d
t
ij
) pe care o returneaz la sfrit. Acest lucru este
realizat calculnd ecuaia (26.2) pentru orice i i j, folosind D pentru D
(m1)
i D
t
pentru
D
(m)
. (Procedura este scris fr indici superiori pentru ca matricele de intrare i de ieire s
e independente de m.) Timpul de execuie al procedurii este (n
3
) datorit celor trei bucle
pentru imbricate.
Putem observa, acum, legtura cu nmulirea matricelor. S presupunem c dorim s calculm
produsul C = A B a dou matrice A i B de dimensiuni nn. Atunci, pentru i, j = 1, 2, . . . , n,
vom calcula
c
ij
=
n

k=1
a
ik
b
kj
. (26.4)
Observai c, dac n ecuaia (26.2) vom face substituiile
d
(m1)
a, w b, d
(m)
c, min +, +
26.1. Drumuri minime i nmulirea matricelor 477
vom obine ecuaia (26.4). Ca urmare, dac efectum aceste schimbri n Extinde-Drumuri-
Minime i nlocuim(elementul neutru pentru min) cu 0 (elementul neutru pentru +), obinem,
direct procedura n timp (n
3
) pentru nmulirea matricelor.
nmulire-Matrice(A, B)
1: n linii[A]
2: e C o matrice de dimensiuni n n
3: pentru i 1, n execut
4: pentru j 1, n execut
5: c
ij
0
6: pentru k 1, n execut
7: c
ij
c
ij
+a
ik
b
kj
8: returneaz C
ntorcndu-ne la problema drumurilor minime ntre toate perechile, determinm costurile
drumurilor minime extinznd drumurile minime arc cu arc. Notnd cu A B matricea produs
returnat de Extinde-Drumuri-Minime(A, B), determinm irul de n 1 matrice
D
(1)
= D
(0)
W = W,
D
(2)
= D
(1)
W = W
2
,
D
(3)
= D
(2)
W = W
3
,
.
.
.
D
(n1)
= D
(n2)
W = W
n1
.
Dup cum am artat anterior, matricea D
(n1)
= W
n1
conine costurile drumurilor minime.
Urmtoarea procedur determin acest ir n timp (n
4
).
Drumuri-Minime-ntre-Toate-Perechile-Lent(W)
1: n linii[W]
2: D
(1)
W
3: pentru m 2, n 1 execut
4: D
(m)
Extinde-Drumuri-Minime(D
(m1)
, W)
5: returneaz D
(n1)
n gura 26.1 se poate vedea un graf i matricele D
(m)
determinate de procedura Drumuri-
Minime-ntre-Toate-Perechile-Lent.
mbuntirea timpului de execuie
Scopul nostru nu este determinarea matricelor D
(m)
: ne intereseaz numai matricea
D
(n1)
. S ne reamintim c, n absena ciclurilor cu cost negativ, ecuaia (26.3) implic
D
(m)
= D
(n1)
pentru toate numerele ntregi m n 1. Putem determina D
(n1)
cu ajutorul
a numai lg(n 1)| produse de matrice determinnd irul:
478 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
D
(1)
=

0 3 8 4
0 1 7
4 0
2 5 0
6 0

D
(2)
=

0 3 8 2 4
3 0 4 1 7
4 0 5 11
2 1 5 0 2
8 1 6 0

D
(3)
=

0 3 3 2 4
3 0 4 1 4
7 4 0 5 1
2 1 5 0 2
8 5 1 6 0

D
(4)
=

0 1 3 2 4
3 0 4 1 1
7 4 0 5 3
2 1 5 0 2
8 5 1 6 0

Figura 26.1 Un graf orientat i irul de matrice D


(m)
determinat de Drumuri-Minime-ntre-Toate-
Perechile-Lent. Cititorul poate verica faptul c D
(5)
= D
(4)
W este egal cu D
(4)
, deci D
(m)
= D
(4)
pentru orice m 4.
D
(1)
= W,
D
(2)
= W
2
= W W,
D
(4)
= W
4
= W
2
W
2
,
D
(8)
= W
8
= W
4
W
4
,
.
.
.
D
(2
lg(n1)
)
= W
2
lg(n1)
= W
2
lg(n1)1
W
2
lg(n1)1
.
Deoarece 2
|lg(n1)|
n 1, produsul nal D
(2
lg(n1)
)
este egal cu D
(n1)
.
Urmtoarea procedur determin irul anterior de matrice folosind o tehnic numit ridicare
repetat la ptrat.
Drumuri-Minime-ntre-Toate-Perechile-Mai-Rapid(W)
1: n linii[W]
2: D
(1)
W
3: m 1
4: ct timp n 1 > m execut
5: D
(2m)
Extinde-Drumuri-Minime(D
(m)
, D
(m)
)
26.1. Drumuri minime i nmulirea matricelor 479
Figura 26.2 Un graf orientat cu costuri pentru exerciiile 26.1-1, 26.2-1 i 26.3-1.
6: m 2m
7: returneaz D
(m)
La ecare iteraie a buclei ct timp din liniile 46, calculm D
(2m)
=

D
(m)

2
, ncepnd cu
m = 1. La sfritul ecrei iteraii, dublm valoarea lui m. n ultima iteraie este determinat
D
(n1)
calculndu-se, de fapt, D
(2m)
pentru un anumit n1 2m < 2n2. Din ecuaia (26.3),
rezult c D
(2m)
= D
(n1)
. La urmtoarea testare a condiiei din linia 4, m a fost dublat, deci
vom avea n 1 m, aadar condiia nu va adevrat i procedura va returna ultima matrice
determinat.
Timpul de execuie al procedurii Drumuri-Minime-ntre-Toate-Perechile-Mai-Rapid
este (n
3
lg n) deoarece ecare dintre cele lg(n 1)| nmuliri de matrice are nevoie de un
timp (n
3
). Observai c avem un cod scurt care nu conine structuri de date complicate, deci
constanta ascuns n notaia este mic.
Exerciii
26.1-1 Executai algoritmul Drumuri-Minime-ntre-Toate-Perechile-Lent pe graful o-
rientat cu costuri din gura 26.2 artnd care sunt matricele care rezult pentru ecare iteraie
a buclei respective. Realizai acelai lucru pentru algoritmul algoritmului Drumuri-Minime-
ntre-Toate-Perechile-Mai-Rapid.
26.1-2 De ce este nevoie ca w
ii
s e egal cu 0 pentru orice 1 i n?
26.1-3 Crei matrice din nmulirea obinuit a matricelor i corespunde matricea
D
(0)
=

0
0
0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0

folosit n algoritmii de drum minim.


26.1-4 Artai cum poate exprimat problema drumului minim de la un vrf la restul
vrfurilor cu ajutorul unui produs de matrice i un vector. Descriei modul n care calculul
acestui produs corespunde unui algoritm de genul Bellman-Ford (vezi 25.3).
480 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
26.1-5 S presupunem c dorim s determinm i vrfurile care compun drumurile minime n
algoritmii din aceast seciune. Artai modul n care se determin, n timp O(n
3
), matricea
predecesorilor cu ajutorul matricei D a costurilor drumurilor minime.
26.1-6 Vrfurile care compun drumurile minime pot determinate n acelai timp cu costurile
drumurilor minime. Denim
(m)
ij
ca ind predecesorul vrfului j pe oricare drum de cost minim
de la i la j care conine cel mult m arce. Modicai Extinde-Drumuri-Minime i Drumuri-
Minime-ntre-Toate-Perechile-Lent pentru a determina matricele
(1)
,
(2)
, . . . ,
(n1)
pe msur ce sunt determinate matricele D
(1)
, D
(2)
, . . . , D
(n1)
.
26.1-7 Procedura Drumuri-Minime-ntre-Toate-Perechile-Mai-Rapid, aa cum a fost
scris, necesit stocarea a lg(n1)| matrice, ecare avnd n
2
elemente, deci spaiul necesar de
memorie este (n
2
lg n). Modicai procedura pentru ca ea s necesite numai un spaiu (n
2
)
folosind doar dou matrice de dimensiuni n n.
26.1-8 Modicai Drumuri-Minime-ntre-Toate-Perechile-Mai-Rapid pentru a detecta
prezena unui ciclu de cost negativ.
26.1-9 Dai un algoritm ecient pentru a gsi, ntr-un graf, lungimea (numrul de muchii) unui
ciclu de lungime minim al crui cost este negativ.
26.2. Algoritmul Floyd-Warshall
n aceast seciune vom folosi o formulare diferit a programrii dinamice pentru a rezolva
problema drumului minim ntre toate perechile pe un graf orientat G = (V, E). Algoritmul
rezultat, cunoscut sub numele de algoritmul Floyd-Warshall, se execut n timp (V
3
). Ca
i anterior, pot aprea arce cu costuri negative, dar vom presupune c nu exist cicluri de cost
negativ. La fel ca n seciunea 26.1, vom urma paii programrii dinamice pentru a dezvolta
algoritmul. Dup ce vom studia algoritmul rezultat, vom prezenta o metod similar pentru a
gsi nchiderea tranzitiv a unui graf orientat.
Structura unui drum minim
n algoritmul Floyd-Warshall folosim o caracterizare diferit a structurii unui drum minim
fa de cea folosit n algoritmii de drum minim bazai pe nmulirea matricelor. Algoritmul ia
n considerare vrfurile intermediare ale unui drum minim, unde un vrf intermediar al unui
drum elementar p = 'v
1
, v
2
, . . . , v
l
` este oricare vrf p diferit de v
1
i de v
l
, adic orice vrf din
mulimea v
2
, v
3
, . . . , v
l1
.
Algoritmul Floyd-Warshall este bazat pe urmtoarea observaie. Fie V = 1, 2, . . . , n
mulimea vrfurilor lui G. Considerm submulimea 1, 2, . . . , k pentru un anumit k. Pentru
oricare pereche de vrfuri i, j V , considerm toate drumurile de la i la j ale cror vrfuri
intermediare fac parte din mulimea 1, 2, . . . , k. Fie p drumul de cost minim dintre aceste
drumuri. (Drumul p este elementar deoarece presupunem c G nu conine cicluri de cost negativ.)
Algoritmul Floyd-Warshall exploateaz o relaie ntre drumul p i drumul minim de la i la j cu
toate vrfurile intermediare n mulimea 1, 2, . . . , k1. Relaia depinde de statutul lui k: acesta
poate sau nu un vrf intermediar al lui p.
26.2. Algoritmul Floyd-Warshall 481
Figura 26.3 Drumul p este un drum minim de la vrful i la vrful j i k este vrful intermediar al
lui p cu numrul cel mai mare. Drumul p
1
, poriunea din drumul p de la vrful i la vrful k, are toate
vrfurile intermediare n mulimea 1, 2, . . . , k 1. Aceasta este valabil i pentru drumul p
2
de la vrful
k la vrful j.
Dac k nu este un vrf intermediar al drumului p, atunci toate vrfurile intermediare ale
drumului p fac parte din mulimea 1, 2, . . . , k1. Ca urmare, un drum minim de la vrful
i la vrful j cu toate vrfurile intermediare n mulimea 1, 2, . . . , k 1 este, de asemenea,
un drum minim de la i la j cu toate vrfurile intermediare n mulimea 1, 2, . . . , k.
Dac k este un vrf intermediar al drumului p, atunci vom mpri p n i
p
1
Y k
p
2
Y j dup
cum se poate vedea n gura 26.3. Din lema 25.1 rezult c p
1
este drumul minim de la i
la k cu toate vrfurile intermediare n mulimea 1, 2, . . . , k. De fapt, vrful k nu este un
vrf intermediar al drumului p
1
, deci p
1
este un drum minim de la i la k cu toate vrfurile
intermediare n mulimea 1, 2, . . . , k1. n mod similar, artm c p
2
este un drum minim
de la vrful k la vrful j cu toate vrfurile intermediare n mulimea 1, 2, . . . , k 1.
O soluie recursiv la problema drumurilor minime ntre toate perechile
de vrfuri
Bazndu-ne pe observaia anterioar, denim o formulare recursiv a estimrilor drumului
minim fa de cea din seciunea 26.1. Fie d
(k)
ij
costul drumului minim de la vrful i la vrful j,
cu toate vrfurile intermediare n mulimea 1, 2, . . . , k. Cnd k = 0, un drum de la vrful i la
vrful j, cu nici un vrf intermediar al crui numr este mai mare dect 0, nu are, de fapt, nici
un vrf intermediar. n concluzie, acest drum conine cel mult un arc, deci d
(0)
ij
= w
ij
. O deniie
recursiv este dat de:
d
(k)
ij
=

w
ij
dac k = 0,
min

d
(k1)
ij
, d
(k1)
ik
+d
(k1)
kj

dac k 1.
(26.5)
Matricea D
(n)
=

d
(n)
ij

conine rspunsul nal, d


(n)
ij
= (i, j) pentru orice i, j V , deoarece
toate vrfurile intermediare se a n mulimea 1, 2, . . . , n.
Determinarea ascendent a costurilor drumurilor minime
Urmtoarea procedur ascendent este bazat pe recurena (26.5) i poate folosit pentru
a determina valorile d
(k)
ij
n ordinea valorilor cresctoare k. Intrarea ei este o matrice W de
482 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
dimensiuni n n denit aa cum se arat n ecuaia (26.1). Procedura returneaz matricea
D
(n)
a costurilor drumurilor minime.
Floyd-Warshall(W)
1: n linii[W]
2: D
(0)
W
3: pentru k 1, n execut
4: pentru i 1, n execut
5: pentru j 1, n execut
6: d
(k)
ij
min

d
(k1)
ij
, d
(k1)
ik
+d
(k1)
kj

7: returneaz D
(n)
n gura 26.4 sunt prezentate matricele D
(k)
determinate de algoritmul Floyd-Warshall, aplicat
grafului din gura 26.1.
Timpul de execuie al algoritmului Floyd-Warshall este determinat de cele trei cicluri pentru
imbricate din liniile 36. Fiecare execuie a liniei 6 necesit un timp O(1), deci algoritmul se
execut n timp (n
3
). La fel ca n cazul ultimului algoritm din seciunea 26.1, codul este scurt,
fr structuri de date complicate, deci constanta ascuns n notaia este mic. n concluzie,
algoritmul Floyd-Warshall este destul de practic, chiar dac grafurile de intrare au dimensiune
medie.
Construirea unui drum minim
Exist o varietate de metode diferite pentru construirea drumurilor minime n algoritmul
Floyd-Warshall. O modalitate este de a determina matricea D a costurilor drumurilor minime i
de a construi, apoi, matricea a predecesorilor cu ajutorul matricei D. Aceast metod poate
implementat, astfel nct s ruleze n timp O(n
3
) (exerciiul 26.1-5). Dndu-se matricea a
predecesorilor, procedura Tiprete-Drumurile-Minime-Dintre-Toate-Perechile poate
folosit pentru a tipri vrfurile unui drum minim dat.
Putem determina matricea n timp real la fel cum algoritmul Floyd-Warshall determin
matricea D
(k)
. Mai exact, determinm un ir de matrice
(0)
,
(1)
, . . . ,
(n)
, unde =
(n)
i

(k)
ij
este denit ca ind predecesorul vrfului j n drumul minim de la vrful i cu toi predecesorii
n mulimea 1, 2, . . . , k.
Putem da o formul recursiv pentru
(k)
ij
. Cnd k = 0, un drum minim de la i la j nu are
nici un vrf intermediar. Deci

(0)
ij
=

nil dac i = j sau w


ij
= ,
i dac i = j sau w
ij
< .
(26.6)
Pentru k 1, dac lum n considerare drumul i Y k Y j, atunci predecesorul lui j pe care
l alegem este acelai cu predecesorul lui j pe care l alegem pe un drum minim de la k cu
toate vrfurile intermediare n mulimea 1, 2, . . . , k 1. Altfel, alegem acelai predecesor al lui
j pe care l-am ales ntr-un drum minim de la i, cu toate vrfurile intermediare din mulimea
1, 2, . . . , k 1. Mai exact, pentru k 1,

(k)
ij
=


(k1)
ij
dac d
(k1)
ij
d
(k1)
ik
+d
(k1)
kj
,

(k1)
kj
dac d
(k1)
ij
> d
(k1)
ik
+d
(k1)
kj
.
(26.7)
26.2. Algoritmul Floyd-Warshall 483
D
(0)
=

0 3 8 4
0 1 7
4 0
2 5 0
6 0

(0)
=

nil 1 1 nil 1
nil nil nil 2 2
nil 3 nil nil nil
4 nil 4 nil nil
nil nil nil 5 nil

D
(1)
=

0 3 8 4
0 1 7
4 0
2 5 5 0 2
6 0

(1)
=

nil 1 1 nil 1
nil nil nil 2 2
nil 3 nil nil nil
4 1 4 nil 1
nil nil nil 5 nil

D
(2)
=

0 3 8 4 4
0 1 7
4 0 5 11
2 5 5 0 2
6 0

(2)
=

nil 1 1 2 1
nil nil nil 2 2
nil 3 nil 2 2
4 1 4 nil 1
nil nil nil 5 nil

D
(3)
=

0 3 8 4 4
0 1 7
4 0 5 11
2 1 5 0 2
6 0

(3)
=

nil 1 1 2 1
nil nil nil 2 2
nil 3 nil 2 2
4 3 4 nil 1
nil nil nil 5 nil

D
(4)
=

0 3 1 4 4
3 0 4 1 1
7 4 0 5 3
2 1 5 0 2
8 5 1 6 0

(4)
=

nil 1 4 2 1
4 nil 4 2 1
4 3 nil 2 1
4 3 4 nil 1
4 3 4 5 nil

D
(5)
=

0 1 3 4 4
3 0 4 1 1
7 4 0 5 3
2 1 5 0 2
8 5 1 6 0

(5)
=

nil 3 4 5 1
4 nil 4 2 1
4 3 nil 2 1
4 3 4 nil 1
4 3 4 5 nil

Figura 26.4 irurile de matrice D


(k)
i
(k)
determinat de algoritmul Floyd-Warshall pentru graful
din gura 26.1.
Lsm includerea determinrii matricei
(k)
n cadrul procedurii Floyd-Warshall pe
seama exerciiului 26.2-3. n gura 26.4 se arat irul
(k)
pe care algoritmul rezultat l determin
pentru graful din gura 26.1. Exerciiul v cere, de asemenea, s demonstrai c subgraful G
,i
al predecesorilor este un arbore de drumuri minime cu rdcina i. Un alt mod de a reconstitui
drumurile minime se cere n exerciiul 26.2-6.
484 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
nchiderea tranzitiv a unui graf orientat
Dndu-se un graf orientat G = (V, E) cu mulimea vrfurilor V = 1, 2, . . . , n, am putea
dori s am dac n G exist un drum de la i la j pentru toate perechile i, j V . nchiderea
tranzitiv a lui G este denit ca ind graful G

= (V, E

), unde
E

= (i, j) : exist un drum de la vrful i la vrful j n G.


O modalitate de a determina nchiderea tranzitiv a unui graf n timp (n
3
) este de a atribui
costul 1 tuturor muchiilor din E i a rula algoritmul Floyd-Warshall. Dac exist un drum de la
vrful i la vrful j, obinem d
ij
< n. n caz contrar, obinem d
ij
= .
Exist o alt modalitate similar de a determina nchiderea tranzitiv a lui G n timp (n
3
)
care, n practic, poate economisi timp i spaiu. Aceast metod implic nlocuirea operaiilor
logice (I logic) i (SAU logic) cu operaiile aritmetice min i + n algoritmul Floyd-Warshall.
Pentru i, j, k = 1, 2, . . . , n denim t
(k)
ij
ca ind 1, dac n graful G exist un drum de la vrful i la
vrful j cu toate vrfurile intermediare n mulimea 1, 2, . . . , k, i 0 n caz contrar. Construim
nchiderea tranzitiv G

= (V, E

) adugnd arcul (i, j) la E

dac i numai dac t


(n)
ij
= 1. O
deniie recursiv pentru t
(k)
ij
, analog recurenei (26.5), este
t
(0)
ij
=

0 dac i = j i (i, j) / E,
1 dac i = j sau (i, j) E,
i pentru k 1,
t
(k)
ij
= t
(k1)
ij

t
(k1)
ik
t
(k1)
kj

. (26.8)
La fel ca n cazul algoritmului Floyd-Warshall, determinm matricele T
(k)
=

t
(k)
ij

n ordinea
cresctoare a lui k.
nchidere-Tranzitiv(G)
1: n [V [G][
2: pentru i 1, n execut
3: pentru j 1, n execut
4: dac i = j sau (i, j) E[G] atunci
5: t
(0)
ij
1
6: altfel
7: t
(0)
ij
0
8: pentru k 1, n execut
9: pentru i 1, n execut
10: pentru j 1, n execut
11: t
(k)
ij
t
(k1)
ij

t
(k1)
ik
t
(k1)
kj

12: returneaz T
(n)
n gura 26.5 este prezentat matricea T
(k)
determinat de procedura nchidere-Tran-
zitiv pe un graf dat. La fel ca n algoritmul Floyd-Warshall, timpul de execuie pentru
procedura nchidere-Tranzitiv este (n
3
). Pe unele calculatoare operaiile logice cu valori
de dimensiune un bit sunt executate mai rapid dect operaiile cu date de dimensiune un cuvnt.
26.2. Algoritmul Floyd-Warshall 485
T
(0)
=

1 0 0 0
0 1 1 1
0 1 1 0
1 0 1 1

T
(1)
=

1 0 0 0
0 1 1 1
0 1 1 0
1 0 1 1

T
(2)
=

1 0 0 0
0 1 1 1
0 1 1 1
1 0 1 1

T
(3)
=

1 0 0 0
0 1 1 1
0 1 1 1
1 1 1 1

T
(4)
=

1 0 0 0
1 1 1 1
1 1 1 1
1 1 1 1

Figura 26.5 Un graf orientat i matricea T


(k)
calculat folosind algoritmul nchiderii tranzitive.
Mai mult, deoarece algoritmul direct de determinare a nchiderii tranzitive folosete numai valori
logice i nu valori ntregi, spaiul de memorie necesar este mai mic dect spaiul necesar n cazul
algoritmului Floyd-Warshall cu un factor corespunztor mrimii unui cuvnt de memorie.
n seciunea 26.4 vom vedea c aceast coresponden ntre Floyd-Warshall i nchidere-
Tranzitiv este mai mult dect o simpl coinciden. Ambii algoritmi se bazeaz pe o structur
algebric numit semiinel nchis.
Exerciii
26.2-1 Executai algoritmul Floyd-Warshall pe graful orientat cu costuri din gura 26.2.
Precizai care este matricea D
(k)
care rezult dup ecare iteraie a buclei exterioare.
26.2-2 Dup cum am artat anterior, algoritmul Floyd-Warshall necesit un spaiu (n
3
)
deoarece calculm d
(k)
ij
pentru i, j, k = 1, 2, . . . , n. Artai c urmtoarea procedur, care pur
i simplu renun la indicii superiori, este corect, deci este necesar doar un spaiu (n
2
).
Floyd-Warshall(W)
1: n linii[W]
2: D W
3: pentru k 1, n execut
4: pentru i 1, n execut
5: pentru j 1, n execut
6: d
ij
min(d
ij
, d
ik
+d
kj
)
7: returneaz D
26.2-3 Modicai procedura Floyd-Warshall incluznd determinarea matricelor
(k)
n
conformitate cu ecuaiile (26.6) i (26.7). Demonstrai riguros c, pentru orice i V , graful
486 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
G
,i
al predecesorilor este un arbore de drumuri minime cu rdcina i. ( Pentru a
arta c G
,i
este aciclic artai, mai nti, c
(k)
ij
= l implic d
(k)
ij
d
(k1)
il
+ w
lj
. Adaptai
apoi demonstraia lemei 25.8.)
26.2-4 S presupunem c modicm felul n care este tratat egalitatea n ecuaia (26.7):

(k)
ij
=


(k1)
ij
dac d
(k1)
ij
< d
(k1)
ik
+d
(k1)
kj
,

(k1)
kj
dac d
(k1)
ij
d
(k1)
ik
+d
(k1)
kj
.
Este corect aceast deniie alternativ a matricei a predecesorilor?
26.2-5 Cum poate folosit ieirea algoritmului Floyd-Warshall pentru a detecta prezena
unui ciclu de cost negativ?
26.2-6 O alt modalitate de a reconstitui drumurile minime, n cazul algoritmului Floyd-
Warshall, este folosirea valorilor
(k)
ij
pentru i, j, k = 1, 2, . . . , n, unde
(k)
ij
este vrful intermediar
din drumul de la i la j, numerotat cu cel mai mare numr. Dai o deniie recursiv pentru
(k)
ij
,
modicai procedura Floyd-Warshall pentru a determina valorile
(k)
ij
i rescriei Tiprete-
Drumurile-Minime-ntre-Toate-Perechile pentru a avea ca intrare matricea =

(n)
ij

.
n ce msur seamn matricea cu tabelul s din problema nmulirii lanului de matrice din
seciunea 16.1?
26.2-7 Dai un algoritm de timp O(V E) pentru determinarea nchiderii tranzitive a unui graf
orientat G = (V, E).
26.2-8 S presupunem c nchiderea tranzitiv a unui graf orientat aciclic poate determinat
ntr-un timp f([V [, [E[), unde f este monoton cresctoare care depinde [V [ i [E[. Demonstrai
c timpul necesar determinrii nchiderii tranzitive G

= (V, E

) a unui graf orientat obinuit


G = (V, E) este f([V [, [E[) +O(V +E

).
26.3. Algoritmul lui Johnson pentru grafuri rare
Algoritmul lui Johnson gsete drumurile minime ntre toate perechile de vrfuri, de timp
O(V
2
lg V + V E); deci este asimptotic, mai bun i dect ridicarea repetat la ptrat, i dect
algoritmul Floyd-Warshall pentru grafuri rare. Algoritmul returneaz o matrice a costurilor
drumurilor minime pentru toate perechile de vrfuri sau un mesaj care indic faptul c exist
cicluri de costuri negative. Algoritmul lui Johnson folosete ca subrutine att algoritmul lui
Dijkstra ct i algoritmul Bellman-Ford care sunt descrise n capitolul 25.
Algoritmul lui Johnson folosete o tehnic de schimbare a costurilor care funcioneaz
dup cum urmeaz. Dac toate arcele grafului G = (V, E) au costuri w nenegative, putem gsi
drumurile minime dintre toate perechile de vrfuri, executnd algoritmul lui Dijkstra pentru
ecare vrf: cu ajutorul cozii de prioritate implementate cu un heap Fibonacci, timpul de execuie
al acestui algoritm este O(V
2
lg V + V E). Dac G are arce cu costuri negative determinm o
nou mulime de arce care au costuri nenegative, mulime care ne permite s folosim aceeai
metod. Noua mulime w trebuie s satisfac dou proprieti importante.
26.3. Algoritmul lui Johnson pentru grafuri rare 487
1. Pentru toate perechile de vrfuri u, v V , un drum minim de la u la v, folosind funcia de
cost w este, de asemenea, un drum minim de la u la v folosind funcia de cost w.
2. Pentru toate arcele (u, v), noul cost w(u, v) este nenegativ.
Dup cum vom vedea foarte curnd, preprocesarea lui G pentru a determina funcia de cost w
poate efectuat ntr-un timp O(V E).
Meninerea drumurilor minime prin schimbarea costurilor
Dup cum arat urmtoarea lem, este destul de uor s facem o schimbare a costurilor
care s respecte prima dintre proprietile anterioare. Notm prin costurile drumurilor minime
determinate pentru funcia de cost w i prin

costurile drumurilor minime determinate pentru
funcia de cost w.
Lema 26.1 (Schimbarea costurilor nu schimb drumurile minime) Dndu-se un graf
orientat cu costuri G = (V, E) a crui funcie de cost este w : E R, e h : V R o
funcie care pune n coresponden vrfurile cu numere reale. Pentru ecare arc (u, v) E),
denim
w(u, v) = w(u, v) +h(u) h(v). (26.9)
Fie p = 'v
0
, v
1
, . . . , v
k
` un drum de la vrful v
0
la vrful v
k
. Atunci w(p) = (v
0
, v
k
) dac i
numai dac w(p) =

(v
0
, v
k
). De asemenea, G are cicluri de cost negativ folosind funcia w dac
i numai dac are un ciclu de cost negativ, folosind funcia w.
Demonstraie. ncepem prin a arta c
w(p) = w(p) +h(v
0
) h(v
k
). (26.10)
Avem
w(p) =
k

i=1
w(v
i1
, v
i
) =
k

i=1
(w(v
i1
, v
i
) +h(v
i1
) h(v
i
))
=
k

i=1
w(v
i1
, v
i
) +h(v
0
) h(v
k
) = w(p) +h(v
0
) h(v
k
).
A treia egalitate rezult n urma efecturii sumei din cea de-a doua egalitate.
Artm acum prin reducere la absurd c w(p) = (v
0
, v
k
) implic w(p) =

(v
0
, v
k
). S
presupunem c exist un drum mai scurt p
t
de la v
0
la v
k
folosind funcia de cost w. Atunci
w(p
t
) < w(p). Din ecuaia (26.10) rezult c
w(p
t
) +h(v
0
) h(v
k
) = w(p
t
) < w(p) = w(p) +h(v
0
) h(v
k
),
ceea ce implic w(p
t
) < w(p). ns aceasta contrazice ipoteza c p este drumul minim de la u la
v folosind w. Demonstraia reciprocei este similar.
n nal, artm c G are cicluri de cost negativ folosind funcia de cost w dac i numai dac G
are cicluri de cost negativ folosind funcia de cost w. S considerm orice ciclu c = 'v
0
, v
1
, . . . , v
k
`,
unde v
0
= v
k
. Din ecuaia (26.10) rezult c
w(c) = w(c) +h(v
0
) h(v
k
) = w(c),
deci c are cost negativ folosind w dac i numai dac are cost negativ folosind w.
488 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
Obinerea costurilor nenegative prin schimbarea costurilor
Urmtorul scop este s ne asigurm c este respectat a doua proprietate: vrem ca w(u, v) s
e nenegativ pentru toate arcele (u, v) E. Dndu-se un graf orientat cu costuri G = (V, E) cu
funcia de cost w : E R, construim un nou graf G
t
= (V
t
, E
t
), unde V
t
= V s pentru un
vrf nou s / V i E
t
= E (s, v) : s V . Extindem funcia de cost w, astfel nct w(s, v) = 0
oricare ar v V . Observai c, deoarece s nu are nici o muchie care intr n el, nu exist
drumuri minime n G
t
care l conin pe s n afar de cele care pornesc din s. Mai mult, G
t
nu
are cicluri de cost negativ dac i numai dac G nu are cicluri de cost negativ. n gura 26.6(a)
este prezentat graful G
t
corespunztor grafului G din gura 26.1.
S presupunem acum c G i G
t
nu au cicluri de cost negativ. Denim h(v) = (s, v) pentru
orice v V
t
. Din lema 25.3 rezult c h(v) h(u) + w(u, v) pentru toate arcele (u, v) E
t
.
n concluzie, dac denim noile costuri w n concordan cu ecuaia (26.9), avem w(u, v) =
w(u, v) + h(u) h(v) 0, i cea de-a doua proprietate este satisfcut. n gura 26.6(b) este
prezentat graful G
t
din gura 26.6(a) cu muchiile avnd costuri schimbate.
Determinarea drumurilor minime ntre toate perechile de vrfuri
Algoritmul lui Johnson pentru determinarea drumurilor minime dintre toate perechile de
vrfuri folosete algoritmul Bellman-Ford (seciunea 25.3) i algoritmul lui Dijkstra (seciunea
25.2) ca subrutine. Algoritmul presupune c muchiile sunt pstrate n liste de adiacen.
Algoritmul returneaz obinuita matrice D = d
ij
de dimensiuni [V [ [V [, unde d
ij
= (i, j)
sau un mesaj corespunztor pentru cazul n care graful conine cicluri de cost negativ. (Pentru
ca indicii matricei D s aib sens, presupunem c vrfurile sunt numerotate de la 1 la [V [.)
Johnson(G)
1: determin G
t
, unde V [G
t
] = V [G] s i E[G
t
] = E[G] (s, v) : v V [G]
2: dac Bellman-Ford(G,w,s)=fals atunci
3: tiprete Graful de intrare conine cel puin un ciclu de cost negativ
4: altfel
5: pentru ecare vrf v V [G
t
] execut
6: mulimea h(v) primete valoarea (s, v) determinat de algoritmul Bellman-Ford
7: pentru ecare arc (u, v) E[G
t
] execut
8: w(u, v) w(u, v) +h(u) h(v)
9: pentru ecare vrf u V [G] execut
10: execut Dijkstra(G, w, u) pentru a determina

(u, v) pentru orice v V [G]
11: pentru ecare vrf v V [G] execut
12: d
uv


(u, v) +h(v) h(u)
13: returneaz D
Acest cod efectueaz aciunile specicate anterior. Linia 1 determin G
t
. Linia 2 execut
algoritmul Bellman-Ford pe G
t
cu funcia de cost w. Dac G
t
, deci i G, conine un ciclu de
cost negativ, linia 3 raporteaz problema aprut. n liniile 411, se presupune c G
t
nu conine
cicluri de cost negativ. Liniile 46 atribuie lui h(v) costul (u, v) al drumului minim determinat
de algoritmul Belmann-Ford pentru toate vrfurile v V
t
. Liniile 78 determin noile costuri
w. Pentru ecare pereche de vrfuri u, v V , bucla pentru din liniile 912 determin costul

(u, v), apelnd algoritmul lui Dijkstra pentru ecare vrf din V . Linia 12 stocheaz, n matrice,
26.3. Algoritmul lui Johnson pentru grafuri rare 489
Figura 26.6 Algoritmul lui Johnson de determinare a drumurilor minime ntre toate perechile de
vrfuri, executat pe graful din gura 26.1. (a) Graful G

cu funcia original w. Noul vrf s este negru.


Pentru ecare vrf v, avem h(v) = (s, v). (b) Costul ecrui arc (u, v) este schimbat folosind funcia
de cost w(u, v) = w(u, v) +h(u) h(v). (c)-(g) Rezultatul executrii algoritmului lui Dijkstra pe ecare
vrf al lui G folosind funcia de cost w. n ecare seciune, vrful surs u este negru. n interiorul ecrui
vrf v sunt scrise valorile

(u, v) i (u, v) separate printr-un slash. Valoarea d
uv
= (u, v) este egal cu

(u, v) +h(v) h(u).


490 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
elementul d
uv
corespunztor din matricea D, costul corect, al drumului minim calculat (u, v)
folosind ecuaia (26.10). n nal, linia 13 returneaz matricea D completat. n gura 26.6 este
ilustrat execuia algoritmului lui Johnson.
Se poate observa destul de uor c timpul de execuie al algoritmului lui Johnson este
O(V
2
lg V + V E) dac n algoritmul lui Dijkstra implementm coada de prioritate cu ajutorul
unui heap Fibonacci. Implementarea mai simpl folosind un heap binar duce la un timp de
execuie O(V E lg V ), deci algoritmul este, asimptotic, mai rapid dect algoritmul Floyd-Warshall
dac graful este rar.
Exerciii
26.3-1 Folosii algoritmul lui Johnson pentru a gsi drumurile minime dintre toate perechile de
vrfuri n graful din gura 26.2. Specicai care sunt valorile lui h i w determinate de algoritm.
26.3-2 Care este scopul adugrii noului vrf s la V pentru a obine V
t
?
26.3-3 S presupunem c w(u, v) 0 pentru toate arcele (u, v) E. Care este legtura dintre
funciile de cost w i w?
26.4. O modalitate general pentru rezolvarea problemelor
de drum n grafuri orientate
n aceast seciune vom studia semiinelele nchise, o structur algebric ce duce la o
modalitate general de a rezolva problemele de drum n grafuri orientate. ncepem prin a deni
semiinelele nchise i a discuta legtura lor cu determinarea drumurilor orientate. Vom arta apoi
cteva exemple de semiinele nchise i un algoritm generic pentru determinarea informaiilor
referitoare la drumurile ntre toate perechile. Att algoritmul Floyd-Warshall ct i algoritmul de
determinare a nchiderii tranzitive din seciunea 26.2 sunt instane ale acestui algoritm generic.
Deniia semiinelelor nchise
Un semiinel nchis este un tuplu (S, , , 0, 1) unde S este mulimea elementelor,
(operatorul de nsumare) i (operatorul de extindere) sunt operaii binare peste S,
i 0 i 1 sunt elemente din S care satisfac urmtoarele 8 proprieti:
1. (S, , 0) este un monoid:
S este nchis fa de : a b S pentru orice a, b S.
este asociativ: a (b c) = (a b) c pentru orice a, b, c S.
0 este un element neutru pentru : a 0 = 0 a = a pentru orice a S.
De asemenea, (S, , 1) este un monoid.
2. 0 este un anihilator: a 0 = 0 a = 0, pentru orice a S.
3. este comutativ: a b = b a, pentru orice a, b S.
26.4. O modalitate general pentru rezolvarea problemelor de drum n grafuri orientate 491
4. este idempotent: a a = a pentru orice a S.
5. este distributiv fa de : a(b c) = (ab) (ac) i (b c) a = (b a) (c a)
pentru orice a, b, c S
6. Dac a
1
, a
2
, a
3
, . . . este un ir numrabil de elemente din S, atunci elementul a
1
a
2

a
3
, este bine denit i face parte din S.
7. Asociativitatea, comutativitatea i idempotena se aplic pentru nsumri innite. (Deci
orice nsumare innit poate rescris ca o nsumare innit n cadrul creia ecare termen
apare numai o dat i ordinea evalurii este arbitrar.)
8. este distributiv fa de nsumarea innit: a (b
1
b
2
b
3
) = (a b
1
) (a
b
2
) (a b
3
) i (a
1
a
2
a
3
) b = (a
1
b) (a
2
b) (a
3
b) .
O determinare a drumurilor n grafuri orientate
Cu toate c proprietile semiinelelor nchise par abstracte, ele pot puse n legtur cu
drumurile n grafuri orientate. S presupunem c se d un graf orientat G = (V, E) i o funcie
de etichetare : V V S care pune n coresponden toate perechile ordonate de vrfuri cu
elemente din S. Eticheta arcului (u, v) E este notat prin (u, v). Deoarece este denit
peste domeniul V V , eticheta (u, v) are, de obicei, valoarea 0 dac (u, v) nu este un arc de-al
lui G (vom vedea imediat motivul acestei alegeri).
Folosim operatorul asociativ de extindere pentru a extinde noiunea de etichete pentru
drumuri. Eticheta drumului p = 'v
1
, v
2
, . . . , v
k
` este
(p) = (v
1
, v
2
) (v
2
, v
3
) (v
k1
, v
k
).
Elementul neutru 1 fa de va eticheta drumului vid.
Ca un exemplu pentru o aplicaie a semiinelelor nchise, vom folosi drumuri minime pentru
grafuri cu arce de costuri nenegative. Codomeniul S este R
0
, unde R
0
este mulimea
numerelor reale nenegative i (i, j) = w
ij
pentru orice i, j V . Operatorul de extindere
corespunde operatorului aritmetic +, deci eticheta drumului p = 'v
1
, v
2
, . . . , v
k
` este
(p) = (v
1
, v
2
) (v
2
, v
3
) (v
k1
, v
k
) = w
v
1
,v
2
+w
v
2
,v
3
+ +w
v
k1
,v
k
= w(p).
Nu este surprinztor faptul c rolul lui 1, elementul neutru pentru , este luat de 0, elementul
neutru pentru +. Notm drumul vid prin ; eticheta lui este () = w() = 0 = 1.
Deoarece operaia de extindere este asociativ, putem deni eticheta concatenrii a dou
drumuri ntr-un mod natural. Dndu-se drumurile p
1
= 'v
1
, v
2
, . . . , v
k
` i p
2
= 'v
k
, v
k+1
, . . . , v
l
`
concatenarea lor este
p
1
p
2
= 'v
1
, v
2
, . . . , v
k
, v
k+1
, . . . v
l
`,
i eticheta concatenrii lor este
(p
1
p
2
) = (v
1
, v
2
)(v
2
, v
3
) (v
k1
, v
k
)(v
k
, v
k+1
)(v
k+1
, v
k+2
) (v
l1
, v
l
)
= ((v
1
, v
2
) (v
2
, v
3
) (v
k1
, v
k
)) ((v
k
, v
k+1
) (v
k+1
, v
k+2
) (v
l1
, v
l
))
= (p
1
) (p
2
).
492 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
Operatorul de nsumare , care este att comutativ ct i asociativ, este folosit pentru a
nsuma etichetele drumurilor. Aceasta nseamn c valoarea (p
1
) (p
2
) d o nsumare a
etichetelor drumurilor p
1
i p
2
, nsumare a crei semantic este specic aplicaiei.
Scopul nostru este de a determina, pentru toate perechile de vrfuri i, j V , nsumarea
tuturor etichetelor drumurilor de la i la j:
l
ij
=

i
p
Yj
(p) (26.11)
Avem nevoie de comutativitatea i asociativitatea lui pentru ca ordinea n care sunt nsumate
drumurile s nu conteze. Deoarece folosim anihilatorul 0 ca etichet a unei perechi ordonate
(u, v), care nu este arc n graf, orice drum care ncearc s treac printr-un arc absent va avea
eticheta 0.
Pentru drumurile minime, folosim min ca operator de nsumare . Elementul neutru pentru
min este , i este, ntr-adevr, un anihilator pentru +: a + = + a = pentru orice
a R
0
. Arcele absente vor avea costul i, dac oricare arc al unui drum va avea costul
, drumul va avea acelai cost.
Dorim ca operatorul de nsumare s e idempotent, deoarece, din ecuaia (26.11), observm
c ar trebui s nsumeze etichetele unei mulimi de drumuri. Dac p este un drum, atunci
p p = p; dac nsumm drumul p cu el nsui, eticheta rezultat ar trebui s e eticheta
lui p: (p) (p) = (p).
Deoarece considerm i drumuri care s-ar putea s nu e elementare, mulimea etichetelor
drumurilor dintr-un graf poate innit, dar numrabil. (Fiecare drum, elementar sau nu,
conine un numr nit de arce.) n concluzie, operatorul ar trebui s poat aplicat pentru
o mulime innit, dar numrabil, de etichete ale drumurilor. Aceasta nseamn c, dac
a
1
, a
2
, a
3
, . . . este un ir numrabil de elemente din codomeniul S, atunci eticheta a
1
a
2
a
3

ar trebui s e bine denit i s fac parte din S. Nu ar trebui s conteze ordinea n care nsumm
etichetele drumurilor, deci asociativitatea i comutativitatea ar trebui s e respectate pentru
nsumri innite. Mai mult, dac nsumm aceeai etichet de drum a de un numr innit de ori,
rezultatul ar trebui s e a, deci idempotena ar trebui respectat i pentru nsumri innite.
ntorcndu-ne la exemplul drumurilor minime, vrem s tim dac min este aplicabil la un ir
innit de valori din R
0
. De exemplu, este bine denit valoarea min

k=1
1/k? Rspunsul
este armativ dac ne gndim la operatorul min ca returnnd cel mai mare minorant (inmul)
al argumentelor sale, caz n care obinem min

k=1
1/k = 0.
Pentru a determina etichete ale unor drumuri divergente avem nevoie de distributivitatea
operatorului de extindere fa de operatorul de nsumare . Dup cum se arat n gura 26.7,
presupunem c avem drumurile u
p
1
Y v, v
p
1
Y x i v
p
3
Y y. Cu ajutorul distributivitii, putem
nsuma etichetele drumurilor p
1
p
2
i p
1
p
3
calculnd e ((p
1
) (p
2
)) ((p
1
) (p
3
)) sau
(p
1
) ((p
2
) (p
3
)).
Deoarece pot exista un numr innit, dar numrabil de drumuri ntr-un graf, ar trebui s
e distributiv att fa de nsumri innite, ct i fa de nsumri nite. n gura 26.8 pot
vzute drumurile u
p
1
Y v i v
p
2
Y x precum i ciclul v
c
Y v. Trebuie s putem nsuma drumurile
p
1
p
2
, p
1
cp
2
, p
1
ccp
2
, . . .. Distributivitatea lui fa de nsumri innite, dar numrabile,
ne dau
((p
1
) (p
2
)) ((p
1
) (c) (p
2
)) ((p
1
) (c) (c) (p
2
))
= (p
1
) ((p
2
) ((c) (p
2
)) ((c) (c) (p
2
)) )
= (p
1
) (1 (c) ((c) (c)) ((c) (c) (c)) ) (p
2
).
26.4. O modalitate general pentru rezolvarea problemelor de drum n grafuri orientate 493
Figura 26.7 Folosirea distributivitii lui fa de . Pentru a nsuma etichetele drumurilor p
1
p
2
i p
1
p
3
, putem calcula e ((p
1
) (p
2
)) ((p
1
) (p
3
)), e (p
1
) ((p
2
) (p
3
)).
Figura 26.8 Distributivitatea lui fa de nsumri innite, dar numrabile, ale lui . Datorit ciclului
c, pot exista un numr innit, dar numrabil, de drumuri de la vrful v la vrful x. Trebuie s putem
nsuma drumurile p
1
p
2
, p
1
c p
2
, p
1
c c p
2
, . . ..
Trebuie s folosim o notaie special pentru eticheta unui ciclu care poate traversat de un
anumit numr de ori. S presupunem c avem un ciclu c cu eticheta (c) = a. Putem traversa
c de zero ori, eticheta ind, n acest caz, () = 1. Dac traversm ciclul o dat, eticheta va
(c) = a, dac l traversm de dou ori, eticheta va (c) (c) = a a, i aa mai departe.
Eticheta pe care o obinem nsumnd un numr innt de traversri ale ciclului c este nchiderea
lui a, denit prin
a

= 1 a (a a) (a a a) (a a a a) .
n concluzie, pentru gura 26.8, vrem s calculm (p
1
) ((c))

(p
2
).
Pentru exemplul drumurilor minime, pentru orice numr real nenegativ din mulimea a
R

,
a

=

min
k=0
ka = 0.
Interpretarea acestei proprieti este aceea c, deoarece toate ciclurile au costuri nenegative, nici
un drum minim nu trebuie s traverseze un ciclu ntreg.
Exemple de semiinele nchise
Am vzut deja un exemplu de semiinel, S
1
= (R
0
, min, +, , 0), pe care l-am folosit
pentru drumuri minime cu arce de costuri nenegative. (Dup cum am amintit anterior, operatorul
min returneaz, de fapt, cel mai mare minorant al argumentelor sale. Am artat, de asemenea,
c a

= 0 pentru orice a R
0
.
Am susinut c, chiar dac exist arce de cost negativ, algoritmul Floyd-Warshall determin
costurile drumurilor minime atta timp ct nu exist cicluri de cost negativ. Adugnd operatorul
de nchidere potrivit i extinznd codomeniul etichetelor la R, + putem gsi un semiinel
494 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
nchis care s trateze ciclurile de cost negativ. Folosind min pentru i + pentru , cititorul
poate verica faptul c nchiderea lui a R , + este
a

0 dac a 0,
dac a < 0.
Al doilea caz (a < 0) modeleaz situaia n care putem traversa un ciclu de cost negativ de
un numr innit de ori pentru a obine costul pentru orice drum care conine cicluri. n
concluzie, semiinelul nchis care trebuie folosit pentru algoritmul Floyd-Warshall cu arce de cost
negativ este S
2
= (R , +, min, +, +, 0). (Vezi exerciiul 26.4-3.)
Pentru nchiderea tranzitiv, folosim semiinelul nchis S
3
= (0, 1, , , 0, 1), unde (i, j) = 1
dac (i, j) E, i (i, j) = 0 n caz contrar. Aici avem 0

= 1

= 1.
Un algoritm de programare dinamic pentru determinarea etichetelor
drumurilor orientate
S presupunem c se d un graf orientat G = (V, E) cu funcia de etichetare : V V S.
Vrfurile sunt numerotate de la 1 la n. Pentru ecare pereche de vrfuri i, j V , vrem s
calculm ecuaia (26.11)
l
ij
=

i
p
Yj
(p),
care este rezultatul nsumrii tuturor drumurilor de la i la j, folosind operatorul de nsumare .
Pentru drumurile minime, vrem s calculm
l
ij
= (i, j) = min
i
p
Yj
w(p).
Exist un algoritm de programare dinamic pentru rezolvarea acestei probleme i acesta
seamn foarte mult cu algoritmul Floyd-Warshall i cu algoritmul de determinare a nchiderii
tranzitive. Fie Q
(k)
ij
mulimea drumurilor de la vrful i la vrful j cu toate vrfurile intermediare
n mulimea 1, 2, . . . , k. Denim
l
(k)
ij
=

pQ
(k)
ij
(p).
Observai analogia cu deniia lui d
(k)
ij
din algoritmul Floyd-Warshall i cu t
(k)
ij
din algoritmul
de determinare a nchiderii tranzitive. Putem deni recursiv l
(k)
ij
prin
l
(k)
ij
= l
(k1)
ij

l
(k1)
ik
(l
(k1)
kk
)

l
(k1)
kj

. (26.12)
Recurena (26.12) seamn cu recurenele (26.5) i (26.8), dar conine un nou factor: (l
(k1)
kk
)

.
Acest factor reprezint nsumarea tuturor ciclurilor care trec prin vrful k i au toate celelalte
vrfuri n mulimea 1, 2, . . . , k 1. (Cnd presupunem, n algoritmul Floyd-Warshall, c nu
exist cicluri de cost negativ, (c
(k1)
kk
)

este 0, corespunztor lui 1, costul unui ciclu vid.) n cadrul


algoritmului de determinare a nchiderii tranzitive, drumul vid de la k la k ne d (t
(k1)
kk
)

=
26.4. O modalitate general pentru rezolvarea problemelor de drum n grafuri orientate 495
1 = 1. Deci, pentru ecare dintre aceti doi algoritmi, putem ignora factorul (l
(k1)
kk
)

deoarece
reprezint elementul neutru pentru . Baza deniiei recursive este
l
(0)
ij
=

(i, j) dac i = j,
1 (i, j) dac i = j,
pe care o putem vedea dup cum urmeaz. Eticheta unui drum care conine un singur arc 'i, j`
este, simplu, (i, j) (care este egal cu 0 dac (i, j) nu este o muchie din E). Dac i = j, atunci
1 este eticheta drumului vid de la i la i.
Algoritmul de programare dinamic determin valorile l
(k)
ij
n ordinea cresctoare a lui k. El
returneaz matricea L
(n)
=

l
(n)
ij

.
Calculeaz-nsumri(, V )
1: n [V [
2: pentru i 1, n execut
3: pentru j 1, n execut
4: dac i = j atunci
5: l
(0)
ij
1 (i, j)
6: altfel
7: l
(0)
ij
(i, j)
8: pentru k 1, n execut
9: pentru i 1, n execut
10: pentru j 1, n execut
11: l
(k)
ij
l
(k1)
ij

l
(k1)
ik
(l
(k1)
kk
)

l
(k1)
kj

12: returneaz L
(n)
Timpul de execuie al acestui algoritm depinde de timpul necesar calculrii lui , i

. Dac
T

, T

i T reprezint aceti timpi, atunci timpul de execuie al algoritmului Calculeaz-


nsumri este (n
3
(T

+ T

+ T)) ceea ce reprezint (n


3
) dac toate aceste trei operaii
necesit un timp O(1).
Exerciii
26.4-1 Vericai c S
1
= (R
0
, min, +, , 0) i S
3
= (0, 1, , , 0, 1) sunt semiinele
nchise.
26.4-2 Vericai c S
2
= (R , +, min, +, +, 0) este un semiinel nchis. Care este
valoarea lui a + () pentru a R? Dar a lui () + (+)?
26.4-3 Rescriei procedura Calculeaz-nsumri pentru a folosi semiinelul nchis S
2
astfel
nct s implementeze algoritmul Floyd-Warshall. Care ar trebui s e valoarea lui +?
26.4-4 Este tuplul S
4
= (R, +, , 0, 1) un semiinel nchis?
26.4-5 Putem folosi un semiinel nchis arbitrar pentru algoritmul lui Dijkstra? Dar pentru
algoritmul Bellman-Ford? Dar pentru procedura Drumuri-Minime-ntre-Toate-Perechile-
Mai-Rapid?
496 Capitolul 26 Drumuri minime ntre toate perechile de vrfuri
26.4-6 O rm de transport dorete s trimit din Castroville la Boston un camion ncrcat
pn la refuz cu anumite articole. Fiecare osea din Statele Unite are o anumit limit pentru
camioanele care pot folosi acea osea. Modelai aceast problem pe un graf orientat G = (V, E)
i un semiinel nchis adecvat i dai un algoritm ecient pentru rezolvarea ei.
Probleme
26-1 nchiderea tranzitiv a unui graf dinamic
S presupunem c dorim s meninem nchiderea tranzitiv a unui graf orientat G = (V, E) n
timp ce inserm noi arce n E. Mai precis, dup ce a fost inserat un arc, vrem s actualizm
nchiderea tranzitiv a arcelor inserate pn n acel moment. S presupunem c, iniial, graful
G nu are nici un arc i c nchiderea tranzitiv este reprezentat de o matrice boolean.
a. Artai modul n care nchiderea tranzitiv G

= (V, E

) a unui graf G = (V, E) poate


actualizat n timp O(V
2
) cnd n G se adaug un arc nou.
b. Dai un exemplu de graf G i de o muchie e, astfel nct s e nevoie de un timp (V
2
)
pentru actualizarea nchiderii tranzitive dup inserarea lui e n G.
c. Descriei un algoritm ecient pentru actualizarea nchiderii tranzitive pe msur ce noi
arce sunt adugate grafului. Pentru orice secven de n inserri, algoritmul ar trebui s se
execute ntr-un timp total

n
i=1
t
i
= O(V
3
), unde t
i
este timpul necesar pentru actualizarea
nchiderii tranzitive cnd al i-lea arc este inserat. Demonstrai c algoritmul atinge aceast
limit de timp.
26-2 Drumuri minime n grafuri -dense
Un graf G = (V, E) este -dens dac [E[ = (V
1+
) pentru o anumit constant din domeniul
0 < 1. Folosind un heap d-ar (vezi problema 7-2) n algoritmii de drumuri minime pe grafuri
-dense, putem obine timpi de execuie la fel de buni ca n cazul algoritmilor bazai pe heap-uri
Fibonacci fr s folosim o structur de date att de complicat.
a. Care este timpul de execuie asimptotic pentru Insereaz, Extrage-Min i Descrete-
Cheie ca funcie de d i de numrul n al elementelor din heap-ul d-ar? Care sunt aceti
timpi de execuie dac alegem d = (n

) pentru o anumit constant 0 < 1?


Comparai costul amortizat al acestor operaii folosind un heap Fibonacci cu timpii de
execuie determinai anterior.
b. Artai modul n care pot determinate, n timp O(E), drumuri minime de la o singur
surs pe un graf orientat G = (V, E) -dens fr arce de cost negativ. ( Alegei d
ca ind o funcie de .)
c. Artai modul n care poate rezolvat, n timp O(V E), problema drumurilor minime pe
un graf orientat G = (V, E) -dens fr arce de cost negativ.
d. Artai modul n care poate rezolvat, n timp O(V E), problema drumurilor minime
ntre toate perechile de vrfuri pe un graf orientat G = (V, E) - dens care poate avea arce
de cost negativ, dar nu are nici un ciclu de cost negativ.
Note bibliograce 497
26-3 Arbore parial minim ca semiinel nchis
Fie G = (V, E) un graf neorientat conex cu funcia de cost w : E R. Fie V = 1, 2, . . . , n
mulimea vrfurilor, unde n = [V [ i s presupunem c toate costurile w(i, j) ale muchiilor sunt
unice. Fie T unicul arbore parial minim (vezi exerciiul 24.1-6) al grafului G. n cadrul acestei
probleme, vom determina T folosind un semiinel nchis dup cum au sugerat B. M. Maggs i S.
A. Plotkin. Determinm, mai nti, pentru ecare pereche de vrfuri i, j V , costul minimax
m
ij
= min
i
p
Yj
max
muchii e din p
w(e).
a. Justicai, pe scurt, armaia c S = (R , , min, max, , ) este un semiinel
nchis.
Deoarece S este un semiinel nchis, putem folosi procedura Calculeaz-nsumri pentru a
determina costurile minimax m
ij
n graful G. Fie m
(k)
ij
costul minimax peste toate drumurile de
la i la j cu toate vrfurile intermediare n mulimea 1, 2, . . . , k.
b. Dai o recuren pentru m
(k)
ij
, unde k 0.
c. Fie T
m
= (i, j) E : w(i, j) = m
ij
. Demonstrai c muchiile din T
m
formeaz un arbore
parial al lui G.
d. Artai c T
m
= T. ( Luai n considerare efectul adugrii la T a unei muchii
(i, j) i al eliminrii unei muchii de pe un alt drum de la i la j. De asemenea, luai n
considerare efectul eliminrii unei muchii (i, j) din T i nlocuirii ei cu o alt muchie.)
Note bibliograce
Lawler [132] trateaz foarte bine problema drumurilor minime ntre toate perechile de vrfuri,
cu toate c nu analizeaz soluiile pentru grafuri rare. El atribuie folclorului algoritmul de
nmulire a matricelor. Algoritmul Floyd-Warshall este datorat lui Floyd [68] care s-a bazat
pe o teorem a lui Warshall [198] care descrie modul n care poate determinat nchiderea
tranzitiv pe matrice booleene. Structura algebric a semiinelului nchis apare n Aho, Hopcroft
i Ullman [4]. Algoritmul lui Johnson este preluat din [114].
27 Flux maxim
Aa cum se poate modela o hart rutier printr-un graf orientat pentru a aa cel mai scurt
drum de la un punct la un altul, graful orientat poate considerat ca o reea de transport care
d rspunsuri la ntrebri referitoare la uxuri materiale. S ne imaginm o situaie n care un
material este transportat ntr-un sistem de la surs, unde este produs, la destinaie, unde este
consumat. La surs se produce materialul ntr-un ritm constant, iar la destinaia se consum
n acelai ritm. Intuitiv, uxul materialului, n orice punct al sistemului, este ritmul n care
materialul se deplaseaz. Reelele de transport pot modela scurgerea lichidului n sisteme cu
evi, deplasarea pieselor pe benzi rulante, scurgerea curentului prin reele electrice, deplasare
informaiilor prin reele de comunicaii, i multe altele.
Fiecare arc n reeaua de transport poate considerat drept conduct pentru material. Fiecare
conduct are o capacitate dat, care este de fapt ritmul maxim cu care lichidul se poate deplasa
n conduct. De exemplu, printr-o eav pot curge cel mult 2000 litri de ap pe or, sau pe un
r conductor un curent electric de maximum 20 amperi. Vrfurile (nodurile) sunt jonciunile
conductelor i n afara vrfului surs i destinaie, materialul nu se poate acumula n nici un
vrf. Altfel spus, cantitatea de material care intr ntr-un vrf trebuie s e egal cu cea care
iese din vrf. Aceast proprietate se numete conservarea uxului i este identic cu legea lui
Kircho n cazul curentului electric.
Problema uxului maxim este cea mai simpl problem legat de reele de transport, care cere
s se determine cantitatea maxim de material care poate transportat de la surs la destinaie
innd cont de restriciile de capacitate. Dup cum vom vedea n acest capitol, problema se poate
rezolva prin algoritmi ecieni. Mai mult, tehnicile de baz ale acestor algoritmi pot adaptate
la rezolvarea altor tipuri de probleme n reele de transport.
Acest capitol prezint dou metode generale pentru rezolvarea problemei uxului maxim.
Seciunea 27.1 prezint formalizarea noiuniilor de reea de transport i ux n reea, denind
formal i problema uxului maxim. Seciunea 27.2 descrie metoda clasic a lui Ford-Fulkerson
pentru gsirea uxului maxim. O aplicaie a acestei metode este cea de gsire a cuplajului maxim
ntr-un graf bipartit neorientat care se prezint n seciunea 27.3. Seciunea 27.4 se ocup de
metoda preux, care este cea mai rapid metod referitoare la probleme de ux. n seciunea 27.5
se trateaz o implementare particular a algoritmului preux, care are complexitatea O(V
3
). Cu
toate c acesta nu este cel mai rapid algoritm cunoscut, el ilustreaz bine unele tehnici folosite
n algoritmi care asimptotic sunt cei mai rapizi i are o comportare rezonabil n practic.
27.1. Reele de transport
n aceast seciune vom da o deniie cu ajutorul grafurilor a reelelor de transport, vom
discuta proprietile lor i vom deni problema uxului maxim. Vom introduce i unele notaii
utile.
27.1. Reele de transport 499
Figura 27.1 (a) O reea G = (V, E) pentru problema de transport al rmei Lucky Puck Company.
Fabrica de pucuri din Vancouver este sursa s, iar depozitul din Winnipeg destinaia t. Pucurile sunt
transportate prin localitile intermediare, dar numai c(u, v) lzi pe zi pot transportate din localitatea
u n localiatatea v. Fiecare arc este marcat cu valoarea capacitii respective. (b) Un ux f n G de
valoare [f[ = 19. Numai uxurile de reea pozitive sunt marcate pe arce. Dac f(u, v) > 0 atunci arcul
(u, v) se marcheaz cu f(u, v)/c(u, v). (Aici notaia / se folosete pentru a separa cele dou valori
uxul i capacitatea , i nicidecum nu nseamn mprire.) Dac f(u, v) 0 atunci arcul (u, v) este
marcat numai cu capacitate.
Reele de transport i uxuri
O reea de transport G = (V, E) este un graf orientat n care ecrui arc (u, v) E i este
asociat o capacitate nenegativ c(u, v) 0. Dac (u, v) E vom considera c c(u, v) = 0.
Vom distinge dou vrfuri n reea: un vrf surs s i un vrf destinaie t. Vom presupune
c ecare vrf se gsete pe cel puin un drum de la surs la destinaie. Adic, pentru orice vrf
v V exist un drum s Y v Y t. Graful este deci conex i [E[ [V [ 1. Figura 27.1 prezint
un exemplu de reea de transport.
Acum suntempregtii s dm o deniie mai formal a uxului. Fie G = (V, E) o reea de
transport cu o funcie de capacitate c. Fie s vrful surs i t vrful destinaie. Fluxul n G este
o funcie f : V V R cu valori reale care satisface urmtoarele trei condiii:
Restricie de capacitate: Pentru orice u, v V avem f(u, v) c(u, v).
Antisimetrie: Pentru orice u, v V avem f(u, v) = f(v, u).
Conservarea uxului: Pentru orice u V s, t avem

vV
f(u, v) = 0.
Cantitatea f(u, v) care poate pozitiv sau negativ se numete uxul net de la vrful u la
vrful v, sau pur i simplu uxul pe arcul (u, v). Valoarea uxului f se denete ca:
[f[ =

vV
f(s, v), (27.1)
adic uxul total care pleac din vrful surs. (Aici prin semnul [ [ se noteaz valoarea uxului
i nu valoarea absolut sau cardinalul unei mulimi.) Fiind dat o reea de transport G cu sursa
s i destinaia t, problema uxului maxim cere gsirea unui ux de valoare maxim de la s
la t.
500 Capitolul 27 Flux maxim
nainte de a vedea un exemplu de problem de reea de transport, s studiem pe scurt cele
trei proprieti ale uxului. Restricia de capacitate impune pur i simplu ca uxul de la un vrf
la altul s nu depeasc valoarea capacitii date. Antisimetria impune ca uxul de la un vrf u
la un vrf v s e egal cu opusul uxului de la vrful v la u. Astfel, uxul de la un vrf la el nsui
este egal cu 0, deoarece pentru orice u V avem f(u, u) = f(u, u), care implic f(u, u) = 0.
Proprietatea de conservare a uxului cere ca uxul total ce pleac dintr-un vrf diferit de surs
i destinaie s e egal cu 0. Plecnd de la antisimetrie, putem rescrie proprietatea de conservare
a uxului ca

uV
f(u, v)
pentru orice v V s, t. Adic, n ecare vrf uxul total este egal cu 0.
S observm c uxul ntre vrfurile u i v care nu sunt legate prin nici un arc nu poate
dect zero. Dac (u, v) E i (v, u) E atunci c(u, v) = c(v, u) = 0. i atunci, din cauza
restriciei de capacitate avem f(u, v) 0 i f(v, u) 0. Dar, deoarece f(u, v) = f(v, u) din
cauza antisimetriei, rezult c f(u, v) = f(v, u) = 0. Deci, existena uxului nenul ntre vrfurile
u i v implic (u, v) E sau (v, u) E sau ambele.
Ultima noastr observaie, privind proprietile uxului, se refer la uxuri pozitive. Fluxul
pozitiv care intr n vrful v se denete ca

uV
f(u,v)>0
f(u, v). (27.2)
Se poate deni n mod asemntor i uxul pozitiv care pleac dintr-un vrf. O interpretare
a conservrii uxului poate urmtoarea: uxul pozitiv care intr ntr-un vrf trebuie s e egal
cu uxul pozitiv care iese din vrf.
Un exemplu de reea de transport
O reea de transport poate modela problema de transport din gura 27.1. Firma Lucky Puck
Company are o fabric (sursa s) n oraul Vancouver care fabric pucuri pentru hockei pe ghea,
i are un depozit (destinaia t) n oraul Winnipeg unde le stocheaz. Firma nchiriaz spaiu
n camioane de la o alt rm pentru a transporta pucurile de la fabric la depozit. Pentru
c spaiul este limitat, rma poate transporta zilnic ntre oricare dou localiti u i v numai
c(u, v) lzi de pucuri (gura 27.1(a)). Firma Lucky Puck Company nu poate controla nici rutele
de transport i nici capacitile, deci nu poate modica reeaua dat n gura 27.1(a). Scopul
rmei este de a determina numrul maxim de lzi p care pot transportate zilnic la depozit
pentru a fabric exact cantitatea respectiv, deoarece la fabric nu au spaiu pentru depozitare.
Ritmul cu care se deplaseaz pucurile de-alungul rutelor este un ux. Pucurile sunt transmise
din fabric cu un ritm de p lzi pe zi, i p lzi trebuie s ajung la depozit n ecare zi. Firma
Lucky Puck Company nu se ocup de timpul de deplasare a pucurilor prin reea, ei asigur
doar ca p lzi s prseasc zilnic fabrica i p lzi s ajung la depozit. Restricia de capacitate
impune ca uxul f(u, v) de la oraul u la oraul v s nu depeasc c(u, v) lzi pe zi. Ritmul
cu care ajung lzile ntr-un ora intermediar trebuie s e identic cu ritmul cu care ele prsesc
oraul respectiv, altfel s-ar ngrmdi. Deci, conservarea uxului este respectat. Astfel, uxul
maxim n reea determin numrul maxim p de lzi transportate zilnic.
27.1. Reele de transport 501
Figura 27.2 Anulare. (a) Vrfurile v
1
i v
2
cu c(v
1
, v
2
) = 10 i c(v
2
, v
1
) = 4. (b) Indicarea faptului
c se transport 8 lzi pe zi de la v
1
la v
2
. (c) Se mai transport 3 lzi pe zi de la v
2
la v
1
. (d) Prin
anularea uxului care merge n direcie opus se poate reprezenta situaia din (c) prin numai uxuri
pozitive ntr-o singur direcie. (e) Alte 7 lzi care sunt transportate de la v
2
la v
1
.
Figura 27.1(b) ilustreaz un ux posibil n reeaua care modeleaz transportul lzilor. Pentru
oricare dou vrfuri u i v, uxul f(u, v) corespunde numrul lzilor care pot transportate ntr-
o zi de la u la v. Dac f(u, v) este 0 sau negativ, atunci nu exist transport de la u la v. n gura
27.1(b) sunt marcate cu dou valori (ux/capacitate) doar arcele cu ux pozitiv.
Relaia dintre ux i transport se poate nelege mai bine dac ne concentrm atenia asupra
transportului ntre dou vrfuri. Figura 27.2(a) ne arat subgraful indus de vrfurile v
1
i v
2
din
reeaua de transport din gura 27.1. Dac rma Lucky Puck transport 8 lzi pe zi de la v
1
la
v
2
rezultatul este artat n gura 27.2(b): uxul de la v
1
la v
2
este de 8 lzi pe zi. Din cauza
antisimetriei se poate spune c uxul n direcie opus, adic de la v
2
la v
1
, este 8 lzi pe zi,
chiar dac nu se transport nimic de la v
2
la v
1
. n general, uxul de la v
1
la v
2
este exprimat prin
numrul de lzi transportate zilnic de la v
1
la v
2
din care se scade numrul de lzi transportate
de la v
2
la v
1
. Convenia noastr este de a reprezenta numai uxuri pozitive, deoarece ele indic
un transport real, astfel n gur apare numai valoarea 8, fr valoarea corespunztoare 8.
S mai adugm un transport de 3 lzi pe zi de la v
2
la v
1
. O reprezentare natural a acestei
situaii se gsete n gura 27.2(c). Apare acum o situaie n care avem transport n ambele
direcii. Se transport zilnic 8 lzi de la v
1
la v
2
i 3 lzi de la v
2
la v
1
. Fluxul de la v
1
la v
2
este
acum de 8 3 = 5 lzi pe zi, iar uxul de la v
2
la v
1
este de 3 8 = 5 lzi.
Situaia, datorit rezultatului, este echivalent cu cea artat n gura 27.2(d), unde sunt
transportate 5 lzi de la v
1
la v
2
, i nimic de la v
2
la v
1
. De fapt, 3 lzi pe zi de la v
2
la v
1
sunt
anulate de 3 lzi din 8 transportate de la v
1
la v
2
. n ambele situaii, uxul de la v
1
la v
2
este
de 5 lzi pe zi, dar n gura (d) sunt artate numai transporturile ntr-o singur direcie.
n general, anulrile ne permit s reprezentm transportul ntre dou vrfuri printr-un ux
pozitiv de-alungul a cel mult unuia dintre cele dou arce. Dac exist ux zero sau negativ de la
un vrf la altul, nu se face nici un transport n direcia respectiv. Astfel, dac exist transport
n ambele direcii ntre dou vrfuri, prin procesul de anulare situaia poate transformat ntr-
una echivalent n care exist transport numai ntr-o singur direcie: direcia uxului pozitiv.
Restricia de capacitate nu este nclcat n aceast situaie, deoarece uxul ntre cele dou
vrfuri rmn aceeai.
Continund cu exemplul nostru, s determinm efectul transportrii a nc 7 lzi pe zi de la
v
2
la v
1
. Figura 27.2(e) ne arat rezultatul, innd cont de convenia de reprezentare numai a
uxului pozitiv. Fluxul de la v
1
la v
2
devine 57 = 2, iar uxul de la v
2
la v
1
devine 75 = 2.
Deoarece uxul de la v
2
la v
1
este pozitiv, el reprezint un transport de 2 lzi pe zi de la v
2
la
502 Capitolul 27 Flux maxim
Figura 27.3 Transformarea unei probleme de ux maxim cu mai multe surse i destinaii ntr-o
problem de ux maxim cu o singur surs i destinaie. (a) O reea de transport cu cinci surse S =
s
1
, s
2
, s
3
, s
4
, s
5
i trei destinaii T = t
1
, t
2
, t
3
. (b) O reea de transport echivalent care are o singur
surs i o singur destinaie. Adugm o surs nou s

care este legat cu ecare surs original printr-un


arc de capacitate . De asemena, adugm o nou destinaie t

i arce avnd capacitatea , de la


ecare destinaie iniial la cea nou.
v
1
. Fluxul de la v
1
la v
2
este 2 lzi pe zi, i, deoarece uxul nu este pozitiv, nu se realizeaz
nici un transport n aceast direcie. Sau, putem considera c 5 lzi din cele 7 lzi adiionale pe
zi de la v
2
la v
1
sunt anulate de cele 5 lzi de la v
1
la v
2
, ceea ce ne conduce la un transport de
2 lzi pe zi de la v
2
la v
1
.
Reele cu mai multe surse i destinaii
O problem de ux maxim poate avea mai multe surse i mai multe destinaii n loc de exact
una din ecare. De exemplu, rma Lucky Puck poate avea o mulime de m fabrici s
1
, s
2
, . . . , s
m

i o mulime de n depozite t
1
, t
2
, . . . , t
n
cum se arat n gura 27.3. Din fericire, aceast
problem nu este mai grea dect cea iniial.
Problema gsirii unui ux maxim ntr-o reea de transport cu mai multe surse i destinaii o
vom putea reduce la problema de ux maxim ntr-o reea cu o singur surs i destinaie. Figura
27.3(b) ilustreaz transformarea reelei de transport cu mai multe surse i destinaii din gura
27.3(a) ntr-una cu o singur surs i destinaie. Adugm o surs nou (supersurs) s i arcele
orientate (s, s
i
) cu capacitatea c(s, s
i
) = pentru ecare i = 1, 2, . . . , m. De asemena, se adaug
o nou destinaie (superdestinaie) t i arcele orientate (t
i
, t) cu capacitatea c(t
i
, t) = pentru
ecare i = 1, 2, . . . , n. Intuitiv, oricrui ux n reeaua din (a) i corespunde un ux n reeaua
din (b) i viceversa. Sursa s produce cantitatea cerut de sursele s
i
, iar destinaia t consum
cantitatea cerut de destinaiile t
i
. Exerciiul 27.1-3 cere demonstrarea formal a echivalenei de
mai sus.
27.1. Reele de transport 503
Cteva egaliti referitoare la ux
Ne vom ocupa n continuare de unele funcii (asemntoare funciei f) care au ca argumente
dou vrfuri din reeaua de transport. Vom folosi, n acest capitol, o notaie de nsumare
implicit n care oricare din argumentele funciei (chiar i ambele) pot de vrfuri,
cu interpretarea c valoarea respectiv este suma tuturor valorilor funciei pe toate perechile de
elemente posibile din cele dou mulimi argumente. De exemplu, dac X i Y sunt mulimi de
vrfuri, atunci
f(X, Y ) =

xX

yY
f(x, y).
Ca un alt exemplu, se poate exprima cu ajutorul acestei notaii restricia de conservare a uxului
n felul urmtor: f(u, V ) = 0 pentru orice u V s, t. Pentru o scriere mai simpl vom omite
acoladele cnd mulimea are un singur element (cum am i fcut-o n exemplul anterior). n
formula f(s, V s) = f(s, V ), de exemplu, termenul V s nseamn V s.
Aceast notaie simplic formulele n care intervin uxuri. Lema urmtoare, a crei
demonstraie este lsat ca exerciiu (vezi exerciiul 27.1-4), cuprinde majoritatea identitilor
care intervin n probleme de ux i folosesc notaia de nsumare implicit.
Lema 27.1 Fie G = (V, E) o reea de transport i f un ux n G. Atunci, pentru X V , avem
f(X, X) = 0.
Pentru X, Y V , avem f(X, Y ) = f(Y, X).
Pentru X, Y, Z V , cu X Y = , avem f(X Y, Z) = f(X, Z) + f(Y, Z) i f(Z, X Y ) =
f(Z, X) +f(Z, Y ).
Ca exemplu de folosire a notaiei de nsumare implicit s demonstrm c valoarea uxului
este egal cu uxul total ce ajunge n vrful destinaie, adic
[f[ = f(V, t). (27.3)
Se vede intuitiv c aceast formul este adevrat. Toate vrfurile diferite de surs i de destinaie
au un ux 0 prin conservarea uxului i astfel vrful destinaie este singurul care poate avea un
ux diferit de 0 pentru a echivala uxul diferit de 0 al sursei. O demonstraie formal este
urmtoarea:
[f[ = f(s, V ) (pe baza deniiei)
= f(V, V ) f(V s, V ) (pe baza lemei 27.1)
= f(V, V s) (pe baza lemei 27.1)
= f(V, t) +f(V, V s t) (pe baza lemei 27.1)
= f(V, t) (pe baza legii de conservare a uxului)
Acest rezultat va genrealizat mai trziu (lema 27.5).
Exerciii
27.1-1 Date ind vrfurile u i v ntr-o reea de transport, avnd capacitile c(u, v) = 5 i
c(v, u) = 8, s presupunem c avem un ux egal cu 3 uniti de la u la v i un ux egal cu 4
uniti de la v la u. Care este uxul de la u la v? Desenai situaia n stilul gurii 27.2.
504 Capitolul 27 Flux maxim
27.1-2 Vericai toate cele trei proprieti pentru uxul f din gura 27.1(b).
27.1-3 Extindei proprietile uxului pentru cazul reelei cu mai multe surse i destinaii.
Artai c orice ux ntr-o reea de transport cu mai multe surse i destinaii corespunde unui
ux cu aceeai valoare ntr-o reea cu o singur surs i o singur destinaie, prin adugarea unei
supersurse i a unei superdestinaii.
27.1-4 Demonstrai lema 27.1
27.1-5 Fie reeaua de transport G = (V, E) din gura 27.1(b). Gsii o pereche de submulimi
X, Y V pentru care f(X, Y ) = f(V X, Y ). Apoi, gsii o pereche de submulimi X, Y V
pentru care f(X, Y ) = f(V X, Y ).
27.1-6 Fiind dat o reea de transport G = (V, E) e f
1
i f
2
dou funcii din V V n R.
Fluxul sum f
1
+f
2
este funcia din V V n R denit prin
(f
1
+f
2
)(u, v) = f
1
(u, v) +f
2
(u, v) (27.4)
pentru orice u, v V . Dac f
1
i f
2
sunt uxuri n G, care dintre cele trei proprieti ale uxului
trebuie s e satisfcut de f
1
+f
2
i care poate nclcat?
27.1-7 Fie f un ux ntr-o reea de transport, i e un numr real. Produsul scalar de ux
f este o funcie din V V n R denit prin
(f)(u, v) = f(u, v).
Demonstrai c uxurile ntr-o reea de transport formeaz o mulime convex, artnd c dac
f
1
i f
2
sunt uxuri, atunci i f
1
+ (1 )f
2
este ux pentru orice pentru care 0 1.
27.1-8 Formulai problema uxului maxim sub forma unei probleme de programare liniar.
27.1-9 Modelul de reea de transport prezentat n aceast seciune permite lucrul cu uxuri
cu un singur tip de produs. O reea de transport multiprodus permite lucrul cu uxuri cu
p produse ntre o mulime de p vrfuri surs S = s
1
, s
2
, . . . , s
p
i o mulime de p vrfuri
destinaie T = t
1
, t
2
, . . . , t
p
. Fluxul celui de al i-lea produs de la u la v se noteaz prin
f
i
(u, v). Pentru produsul al i-lea singura surs este s
i
i singura destinaie este t
i
. Proprietatea de
conservare este valabil independent pentru ecare produs n parte: uxul pentru ecare produs
este zero n ecare vrf diferit de sursa i destinaia produsului respectiv. Suma uxurilor de la
u la v pentru toate produsele nu poate depi valoarea de capacitate c(u, v), uxurile pentru
diferitele produse interacioneaz numai n acest sens. Valoarea uxului pentru ecare produs
este uxul n vrful surs pentru produsul respectiv. Valoarea uxului total este suma valorilor
pentru cele p uxuri. Demonstrai c exist un algoritm polinomial care rezolv problema gsirii
valorii uxului total maxim ntr-o reea de transport multiprodus prin formularea problemei ca
o problem de programare liniar.
27.2. Metoda lui Ford-Fulkerson 505
27.2. Metoda lui Ford-Fulkerson
Aceast seciune prezint metoda lui Ford-Fulkerson pentru rezolvarea problemei de ux
maxim. Vorbim mai degrab de metod dect de algoritm deoarece ea cuprinde mai multe
implementri cu diferii timpi de execuie. Metoda lui Ford-Fulkerson se bazeaz pe trei idei
importante, care depesc cadrul metodei i sunt utilizate i n multe alte probleme legate
de uxuri: reele reziduale, drumuri de ameliorare i tieturi. Aceste idei sunt eseniale n
demonstrarea teoremei de ux maximtietur minim (teorema 27.7), care caracterizeaz
valoarea uxului maxim cu ajutorul tieturilor n reele de transport. La sfritul acestei seciuni
vom prezenta o implementare a metodei lui Ford-Fulkerson i vom analiza timpul ei de execuie.
Metoda lui Ford-Fulkerson este iterativ. Vom ncepe cu un ux f(u, v) = 0 pentru orice
u, v V , ca un ux iniial de valoare 0. La ecare pas al iteraiei vom mri valoarea uxului prin
gsirea unui drum de ameliorare, care este un drum de-alungul cruia se poate mri uxul, deci
i valoarea lui. Vom repeta aceti pai pn cnd nu se mai gsete nici un drum de ameliorare.
Teorema de ux maximtietur minim va demonstra c n acest caz obinem uxul maxim.
Metoda-Ford-Fulkerson
1: e f uxul identic 0
2: ct timp exist un drum p de ameliorare execut
3: mrete uxul f de-a lungul drumului p
4: returneaz f
Reele reziduale
Dac se d o reea de transport i un ux, se poate spune intuitiv c reeaua rezidual const
din arcele care admit ux mai mare. Mai formal, s presupunem c avem o reea de transport
G = (V, U) cu sursa s i destinaia t. Fie f un ux n G i s considerm o pereche de vrfuri
u, v V . Cantitatea de ux care poate transportat de la u la v, fr a depi
capacitatea c(u, v), este capacitatea rezidual a arcului (u, v) denit prin
c
f
(u, v) = c(u, v) f(u, v). (27.5)
De exemplu, dac c(u, v) = 16 i f(u, v) = 11 vom putea transporta n plus c
f
(u, v) = 5 uniti de
produs fr a depi capacitatea dat a arcului (u, v). Dac uxul f(u, v) este negativ, capacitatea
rezidual c
f
(u, v) este mai mare dact capacitatea c(u, v). De exemplu, dac c(u, v) = 16 i
f(u, v) = 4, atunci capacitatea rezidual c
f
(u, v) este egal cu 20. Vom putea interpreta aceast
situaie n felul urmtor. Exist un ux de 4 uniti de la v la u, care poate anulat prin 4
uniti de ux de la u la v. Apoi, se pot transporta alte 16 uniti de la u la v fr a nclca
restricia de capacitate pe arcul (u, v). Deci am transportat 20 uniti, pornind de la un ux
f(u, v) = 4, fr a depi capacitatea arcului.
Fiind dat o reea de transport G = (V, E) i un ux f, reeaua rezidual a lui G indus
de f este G
f
= (V, E
f
), unde
E
f
= (u, v) V V : c
f
(u, v) > 0.
506 Capitolul 27 Flux maxim
Figura 27.4 (a) Reeaua de transport G i uxul f din gura 27.1(b) (b) Reeaua rezidual G
f
cu
drumul de ameliorare p haurat; capacitatea lui rezidual este c
f
(p) = c(v
2
, v
3
) = 4. (c) Fluxul n G
care rezult prin mrirea uxului de-a lungul drumului p avnd capacitatea rezidual 4. (d) Reeaua
rezidual indus de uxul din (c).
Deci, ecare arc al reelei reziduale, sau arc rezidual , admite o cretere de ux strict pozitiv. n
gura 27.4(a) relum reeaua G i uxul f din gura 27.1(b), iar gura 27.4(b) ne arat reeaua
rezidual G
f
.
S observm c (u, v) poate un arc rezidual n E
f
chiar dac el nu este arc n E. Altfel
spus, se poate ntmpla ca E
f
E. Reeaua rezidual din gura 27.4(b) include arce de acest
fel care nu apar n reeaua iniial, cum ar de exemplu arcele (v
1
, s) i (v
2
, v
3
). Un astfel de arc
(u, v) poate s apar n G
f
numai dac (v, u) E i exist ux pozitiv de la v la u. Deoarece
uxul f(u, v) de la u la v este negativ, c
f
(u, v) = c(u, v) f(u, v) este pozitiv i (u, v) E
f
.
Deoarece arcul (u, v) poate s apar n reeaua rezidual numai dac cel puin unul din arcele
(u, v) i (v, u) apar n reeaua original, avem [E
f
[ 2[E[.
S observm c nsi reeaua rezidual G
f
este o reea de transport cu funcia de capacitate
c
f
. Lema urmtoare ne arat legtura dintr-un ux din reeaua rezidual i uxul din reeaua
original.
Lema 27.2 Fie G = (V, E) o reea cu vrful surs s, respectiv vrful destinaie t i e f un
ux n G. Fie G
f
reeaua rezidual indus de uxul f i e f
t
un ux n G
f
. Atunci uxul sum
f +f
t
denit prin formula (27.4) este un ux n G cu valoarea [f +f
t
[ = [f[ +[f
t
[.
Demonstraie. Trebuie s vericm c antisimetria, restricia de capacitate i proprietatea de
conservare sunt vericate. Pentru a arta antisimetria, s observm c pentru orice u, v V
avem
(f +f
t
)(u, v) = f(u, v) +f
t
(u, v) = f(v, u) f
t
(v, u)
= (f(u, v) +f
t
(v, u)) = (f +f
t
)(v, u).
27.2. Metoda lui Ford-Fulkerson 507
Pentru restricia de capacitate s observm c f
t
(u, v) c
f
(u, v) pentru orice u, v V . innd
cont de formula (27.5) avem
(f +f
t
)(u, v) = f(u, v) +f
t
(u, v) f(u, v) + (c(u, v) f(u, v)) = c(u, v).
Pentru proprietatea de conservare avem, pentru orice u V s, t

vV
(f +f
t
)(u, v) =

vV
f(u, v) +f
t
(u, v)) =

vV
f(u, v) +

vV
f
t
(u, v) = 0 + 0 = 0.
n nal avem
[f +f
t
[ =

vV
(f +f
t
)(s, v) =

vV
(f(s, v) +f
t
(s, v)
=

vV
f(s, v) +

vV
f
t
(s, v) = [f[ +[f
t
[.
Drumuri de ameliorare
Dndu-se o reea de transport G = (V, E) i un ux f, un drum de ameliorare p este un
drum simplu de la s la t n reeaua rezidual G
f
. Dup deniia reelei reziduale, ecare arc
(u, v) pe un drum de ameliorare admite un ux pozitiv adiional, fr s ncalce restricia de
capacitate.
Drumul haurat n gura 27.4(b) este un drum de ameliorare. Tratnd reeaua rezidual G
f
din gur ca o reea de transport, vom putea transporta 4 uniti de ux adiional pe ecare arc
de-a lungul acestui drum de ameliorare, fr a nclca restricia de capacitate, pentru c cea mai
mic capacitate rezidual pe acest drum este c
f
(v
2
, v
3
) = 4. Vom numi capacitate rezidual a
lui p cantitatea maxim a uxului care se poate transporta de-a lungul drumului de ameliorare
p, dat de formula
c
f
(p) = minc
f
(u, v) : (u, v) este pe drumul p.
Lema urmtoare, a crei demonstraie este lsat ca un exerciiu (vezi exerciiul 27.2-7), funda-
menteaz cele de mai sus.
Lema 27.3 Fie G = (V, E) o reea de transport, f un ux n G i p un drum de ameliorare n
G
f
. Denim funcia f
p
: V V R prin
f
p
(u, v) =

c
f
(p) dac (u, v) este pe drumul p,
c
f
(p) dac (v, u) este pe drumul p,
0 altfel.
(27.6)
Atunci f
p
este un ux n G
f
cu valoarea [f
p
[ = c
f
(p) > 0.
Corolarul urmtor ne arat c dac adunm f
p
la f obinem un alt ux n G a crei valoare
este mai aproape de valoarea maxim. n gura 27.4(c) se vede rezultatul adunrii lui f
p
din
gura 27.4(b) la uxul f din gura 27.4(a).
508 Capitolul 27 Flux maxim
Figura 27.5 O tietur (S, T) n reeaua de transport din gura 27.1(b), unde S = s, v
1
, v
2
i T =
v
3
, v
4
, t. Vrfurile din S sunt negre, iar cele din T sunt albe. Fluxul tieturii (S, T) este f(S, T) = 19,
iar capacitatea tieturii c(S, T) = 26.
Corolarul 27.4 Fie G = (V, E) o reea de transport, f un ux n G i p un drum de ameliorare
n G
f
. Fie funcia f
p
denit ca n formula (27.6). Denim funcia f
t
: V V R, f
t
= f +f
p
.
Atunci f
t
este un ux n G cu valoarea [f
t
[ = [f[ +[f
p
[ > [f[.
Demonstraie. Demonstraia este imediat pe baza lemelor 27.2 i 27.3.
Tieturi n reele de transport
Metoda lui Ford-Fulkerson mrete uxul n mod repetat de-a lungul drumurilor de amelio-
rare pn cnd ajungem la un ux maxim. Teorema de ux maximtietur minim, pe care o
vom demonstra pe scurt, ne exprim faptul c un ux este maxim dac i numai dac n reeaua
lui rezidual nu exist nici un drum de ameliorare. Pentru a demonstra aceast teorem trebuie
s discutm mai nainte noiunea de tietur ntr-o reea de transport.
O tietur (S, T) a unei reele de transport G = (V, E) este o partiie a mulimii V n
mulimile S i T = V S astfel nct s S i t T. (Aceast deniie seamn cu deniia
tieturii folosit pentru arborele parial minim n capitolul 24, exceptnd faptul c aici avem
o tietur ntr-un graf orientat i nu neorientat ca acolo, i c aici neaprat trebuie ca s S i
t T.) Dac f este un ux, atunci uxul tieturii (S, T) este denit ca ind egal cu f(S, T).
De asemenea capacitatea tieturii (S, T) este c(S, T). O tietur minim este acea tietur
care are cea mai mic capacitate dintre toate tieturile reelei.
n gura 27.5 se poate vedea tietura (s, v
1
v
2
, v
3
, v
4
, t) al reelei de transport din gura
27.1(b). Fluxul prin aceast tietur este
f(v
1
, v
3
) +f(v
2
, v
3
) +f(v
2
, v
4
) = 12 + (4) + 11 = 19,
iar capacitatea ei este
c(v
1
, v
3
) +c(v
2
, v
4
) = 12 + 14 = 26.
S observm c uxul unei tieturi poate avea i uxuri negative ntre vrfuri, dar capacitatea
unei tieturi este compus numai din valori nenegative.
Dup lema urmtoare valoarea unui ux ntr-o reea este egal cu uxul oricrei tieturi.
27.2. Metoda lui Ford-Fulkerson 509
Lema 27.5 Fie f un ux ntr-o reea de transport G cu vrful surs s i vrful destinaie t, i
e (S, T) o tietur n G. Atunci uxul prin tietura (S, T) este f(S, T) = [f[.
Demonstraie. Din lema 27.1 rezult
f(S, T) = f(S, V ) f(S, S) = f(S, V ) = f(s, V ) +f(S s, V ) = f(s, V ) = [f[.
Un corolar imediat al lemei 27.5 este rezultatul deja demonstrat formula (27.3) i anume
c valoarea uxului este uxul n vrful surs.
O alt consecin al lemei 27.5, exprimat n corolarul urmtor, ne spune cum se poate folosi
capacitatea tieturii pentru mrginirea valorii uxului.
Corolarul 27.6 Valoarea oricrui ux f ntr-o reea G este mrginit superior de capacitatea
oricrei tieturi n G.
Demonstraie. Fie (S, T) o tietur a reelei G i f un ux oarecare n G. Pe baza lemei 27.5
i folosind resctricia de capacitate, avem:
[f[ = f(S, T) =

uS

vT
f(u, v)

uS

vT
c(u, v) = c(S, T).
Avem acum toate informaiile pentru a demonstra importanta teorem de ux maxim-tietur
minim.
Teorema 27.7 (Teorema de ux maxim-tietur minim) Dac f este un ux n reea-
ua G = (V, E) cu vrful surs s i vrful destinaie t, atunci urmtoarele condiii sunt echivalente:
1. f este un ux maxim n G.
2. Reeaua rezidual G
f
nu conine nici un drum de ameliorare.
3. Exist o tietur (S, T) n G pentru care [f[ = c(S, T).
Demonstraie. (1) (2): S presupunem prin absurd c f este un ux maxim n G i totui G
f
are un drum p de ameliorare. Atunci, conform corolarului 27.4 suma f +f
p
, unde f
p
este dat de
formula (27.6) este un ux n G cu valoare strict mai mare dect [f[, contrazicnd presupunerea
c f este un ux maxim.
(2) (3): S presupunem c G
f
nu are nici un drum de ameliorare, adic n G
f
nu exist
drum de la s la t. S denim mulimile S i T n felul urmtor:
S = v V : exist drum de la s la v n G
f

i T = V S. Partiia (S, T) este o tietur: avem, evident, s S i t S, pentru c nu exist


drum de la s la t n G
f
. Pentru orice pereche de vrfuri u i v astfel nct u S i v T, avem
f(u, v) = c(u, v), deoarece altfel am avea (u, v) E
f
i deci v S. Conform lemei 27.5 avem
atunci [f[ = f(S, T) = c(S, T).
(3) (1): Din corolarul 27.6 avem [f[ c(S, T) pentru orice tietur (S, T). Condiia
[f[ = c(S, T) implic atunci c f este un ux maxim.
510 Capitolul 27 Flux maxim
Algoritmul de baz al lui Ford-Fulkerson
n ecare iteraie a metodei lui Ford-Fulkerson cutm un drum oarecare de ameliorare p i
mrim uxul f de-a lungul drumului p cu capacitatea rezidual c
f
(p). Urmtoarea implementare
a metodei calculeaz uxul maxim n graful G = (V, E), actualiznd uxul f[u, v] ntre oricare
dou vrfuri care sunt legate printr-un arc.
1
Dac u i v nu sunt legate printr-un arc n nici o
direcie, presupunem c f[u, v] = 0. Presupunem c valoarea capacitii ntre vrfurile u i v
este dat de funcia c(u, v) calculabil n timp constant i c c(u, v) = 0 dac (u, v) E. (ntr-
o implementare obinuit valorile c(u, v) sunt pstrate n cmpurile unei liste de adiacen.)
Capacitatea rezidual se calculeaz conform formulei (27.5). n descrierea algoritmului, c
f
(p)
este variabila care pstreaz capacitatea rezidual a drumului p.
Ford-Fulkerson(G, s, t)
1: pentru ecare arc (u, v) E[G] execut
2: f[u, v] 0
3: f[v, u] 0
4: ct timp exist un drum p de la s la t n reeaua rezidual G
f
execut
5: c
f
(p) minc
f
(u, v): (u, v) este pe drumul p }
6: pentru ecare arc (u, v) din p execut
7: f[u, v] f[u, v] +c
f
(p)
8: f[v, u] f[v, u]
Acest algoritm Ford-Fulkerson pur i simplu detaliaz pseudocodul Metoda-Ford-
Fulkerson descris la nceputul seciunii. Figura 27.6 ilustreaz rezultatul ecrei iteraii la
o execuie a algoritmului. Liniile 13 iniializeaz uxul f cu valoarea 0. Ciclul ct timp din
liniile 48 gsete pe rnd cte un drum de ameliorare p n G
f
i mrete uxul f de-a lungul
lui p cu valoarea capacitii reziduale c
f
(p). Cnd nu mai exist drum de ameliorare atunci f
este un ux maxim.
Analiza algoritmului Ford-Fulkerson
Timpul de execuie a algoritmului Ford-Fulkerson depinde de modul de determinare (n
linia 4) a drumului de ameliorare p. Dac drumul este ales ntr-un mod nepotrivit, se poate
ntmpla c algoritmul nu se oprete: valoarea uxului crete succesiv, dar nu converge ctre
valoarea maxim. Dac ns drumul de ameliorare se alege folosind un algoritm de cutare n
lime (seciunea 23.2) atunci timpul de execuie a algoritmului este polinomial. nainte de a
demonstra acest lucru vom da o margine superioar n cazul n care drumul este ales arbitrar i
toate capacitile sunt ntregi.
n practic problemele de ux maxim apar de obicei cu capaciti care sunt numere ntregi.
Dac capacitile sunt numere raionale, cu o scalare potrivit, ele pot transformate n numere
ntregi. Cu aceast presupunere, o implementare direct a algoritmului Ford-Fulkerson are un
timp de execuie O(E[f

[), unde f

este uxul maxim obinut de algoritm. Timpul de execuie al


liniilor 13 este (E). Ciclul ct timp din liniile 48 este executat de cel mult [f

[ ori, deoarece
valoarea uxului crete la ecare pas cu cel puin o unitate.
Folosim paranteze drepte, cnd este de vorba de o variabil de program (a crei valoare se modic) i
paranteze rotunde cnd este vorba de funcie.
27.2. Metoda lui Ford-Fulkerson 511
Figura 27.6 Execuia algoritmului de baz al lui Ford-Fulkerson. (a)(d) Iteraii succesive ale ciclului
ct timp. n partea stng se a reelele reziduale G
f
din linia 4 al algoritmului; drumurile de ame-
liorare p sunt haurate. n partea dreapt se gsesc noile uxuri f, rezultate prin adunarea lui f
p
la f.
Reeaua rezidual din (a) este reeaua de intrare G. (e) Reeaua rezidual la ultimul test al ciclului ct
timp. Aceast reea nu mai are nici un drum de ameliorare, deci uxul f de la (d) este un ux maxim.
512 Capitolul 27 Flux maxim
Figura 27.7 (a) O reea de transport pentru care algoritmul Ford-Fulkerson are un timp de execuie
(E[f

[), unde f

este uxul maxim, aici [f

[ = 2.000.000. Se arat i un drum de ameliorare cu


capacitatea rezidual egal cu 1. (b) Reeaua rezidual obinut cu un alt drum de ameliorare avnd
capacitatea rezidual egal cu 1. (c) Reeaua rezidual obinut.
Ciclul ct timp poate executat ecient dac structura de date folosit la implemen-
tarea reelei G = (V, E) se gestioneaz ecient. S presupunem c pstrm o structur de date
corespunztoare unui graf orientat G
t
= (V, E
t
), unde E
t
= (u, v) : (u, v) E sau (v, u) E.
Arcele din G sunt arce i n G
t
, deci este uor s se gestioneze capacitile i uxurile ntr-o
astfel de structur. Dndu-se un ux f n G, arcele n reeaua rezidual G
f
costau din toate
arcele (u, v) din G
t
pentru care c(u, v) f[u, v] = 0. Timpul de gsire a unui drum n reeaua
rezidual este deci O(E
t
) = O(E), indiferent dac folosim cutare n adncime sau n lime.
Fiecare iteraie a ciclului ct timp se execut n O(E) uniti de timp, timpul total de execuie
a algoritmului Ford-Fulkerson este deci O(E[f

[).
Cnd capacitile sunt numere ntregi i valoarea optimal [f

[ a uxului este mic, timpul de


execuie a algoritmului lui Ford-Fulkerson este bun. Figura 27.7(a) ne arat ce se poate ntmpla
chiar ntr-o reea simpl, dac valoarea [f

[ este mare. Un ux maxim n acest caz are valoarea


2.000.000. Pe drumul s u t sunt transportate 1.000.000 uniti, iar pe drumul s v t
alte 1.000.000 uniti. Dac primul drum de ameliorare ales de algoritmul Ford-Fulkerson
este drumul s u v t, cum se arat n gura 27.7(a), valoarea uxului dup prima iteraie
este 1. Reeaua rezidual corespunztoare este dat n gura 27.7(b). Dac n iteraia a 2-a
drumul de ameliorare ales este cel s v u t, aa cum se arat n gura 27.7(b) atunci
valoarea uxului va 2. Figura 27.7(c) ne arat reeaua rezidual rezultat. n continuare vom
putea alege alternativ drumurile s u v t respectiv s v u t. Vom avea astfel
2.000.000 de iteraii, uxul crescnd la ecare, cu cte o unitate.
2
Performana algoritmului Ford-Fulkerson poate mbuntit dac implementm
cutarea drumului de ameliorare p printr-o cutare n lime, adic dac drumul de amelio-
rare conine cele mai arce de la s la t ( , considernd c ecare arc are
ponderea 1). Vom numi aceast implementare a metodei lui Ford-Fulkerson ca ind algoritmul
lui Edmonds-Karp. Vom demonstra n continuare c timpul de execuie al algoritmului lui
Edmonds-Karp este O(V E
2
).
Analiza algoritmului depinde de distana dintre vrfuri n reeaua rezidual G
f
. Lema ur-
mtoare folosete notaia
f
(u, v) pentru cea mai scurt distan de la vrful u la vrful v n G
f
,
unde ecare arc are ponderea 1.
Lema 27.8 Dac algoritmul lui Edmonds-Karp se folosete pentru o reea de transport G =
(V, E) care are sursa s i destinaia t, atunci pentru orice vrf v V s, t distana
f
(s, v) n
Problema se poate rezolva n numai dou iteraii, dac se aleg drumurile s u t i s v t (n.t.).
27.2. Metoda lui Ford-Fulkerson 513
reeaua rezidual G
f
crete monoton cu ecare ameliorare.
Demonstraie. Presupunem prin absurd c pentru unele vrfuri v V s, t exist mrire
de ux pentru care
f
(s, v) descrete. Fie f uxul nainte de mrire i f
t
dup. Atunci, conform
presupunerii, avem

f
(s, v) <
f
(s, v).
Vom putea presupune, fr a pierde din generalitate, c
f
(s, v)
f
(s, u) pentru orice vrf
u V s, t pentru care
f
(s, u) <
f
(u, v). Sau, ceea ce este acelai lucru, vom putea spune
c

f
(s, u) <
f
(s, v) implic
f
(s, u)
f
(s, u). (27.7)
S considerm acum un drum de lungime minim (un cel mai scurt drum) p
t
n G
f
de forma
s Yu v, unde u precede vrful v. Trebuie s avem
f
(s, u) =
f
(s, v) 1 pe baza corolarului
25.2, deoarece (u, v) este un arc pe drumul p
t
, care este un drum de lungime minim de la s la
v. Dar atunci din (27.7) avem

f
(s, u)
f
(s, u).
Cu aceste vrfuri v i u considerm uxul f de la u la v nainte de mrire a uxului n G
f
.
Dac f[u, v] < c(u, v) avem

f
(s, v)
f
(s, u) + 1 (pe baza lemei 25.3)

f
(s, u) + 1 =
f
(s, v),
ceea ce contrazice presupunerea c mrirea uxului descrete distana de la s la v.
Deci trebuie s avem f[u, v] = c(u, v), ceea ce nseamn c (u, v) E
f
. Atunci drumul de
ameliorare p, ales n G
f
pentru a produce G
f
trebuie s conin arcul (v, u) v
u, deoarece (u, v) E
f
(din ipotez) i tocmai am demonstrat c (u, v) E
f
. Deci, pe drumul
de ameliorare p transportm ux pe arcul (u, v) i v apare naintea lui u pe drumul p.
Deoarece p este un drum de lumgime minim de la s la t, toate subdrumurile lui (vezi lema 25.1)
sunt de lungime minim, i deci vom avea
f
(s, u) =
f
(s, v) + 1. Deci

f
(s, v) =
f
(s, u) 1
f
(s, u) 1 =
f
(s, v) 2 <
f
(s, v),
ceea ce contrazice ipoteza noastr iniial.
Urmtoarea teorem ne d o margine superioar pentru numrul de iteraii n algoritmul lui
Ednmonds-Karp.
Teorema 27.9 Dac algoritmul lui Edmonds-Karp este aplicat pentru reeaua de transport
G = (V, E) cu vrful surs s i destinaie t, atunci uxul se mrete de cel mult O(V E) ori.
Demonstraie. Vom spune c un arc (u, v) n reeaua rezidual G
f
este un arc critic pe drumul
de ameliorare p dac capacitatea rezidual a drumului p este egal cu capacitatea rezidual a
arcului (u, v), adic c
f
(p) = c
f
(u, v). Dup mrirea uxului de-a lungul drumului de ameliorarea
toate arcele critice dispar din reeaua rezidual. Mai mult, pe orice drum de ameliorarea trebuie
s existe cel puin un arc critic.
514 Capitolul 27 Flux maxim
Fie u i v dou vrfuri din V legate printr-un arc din E. De cte ori poate critic acest arc
(u, v) n timpul execuiei algoritmului lui Edmonds-Karp? Pentru c drumul de ameliorare este
un drum de lungime minim, cnd arcul (u, v) este critic de prima dat, avem egalitatea

f
(s, v) =
f
(s, u) + 1.
O dat ce uxul este mrit, arcul (u, v) dispare din reeaua rezidual. El nu poate s reapar pe
un alt drum de ameliorare dect dac uxul pe arcul (u, v) descrete, ceea ce se poate ntmpla
numai dac (v, u) apare pe un drum de ameliorare. Dac f
t
este uxul n G, atunci n acest caz

f
(s, u) =
f
(s, v) + 1.
Deoarece
f
(s, v)
f
(s, v) conform lemei 27.8 avem

f
(s, u) =
f
(s, v) + 1
f
(s, v) + 1 =
f
(s, u) + 2.
n consecint, din momentul n care arcul (u, v) devine critic pn n momentul cnd a doua
oar devine critic, distana lui u de la vrful surs crete cu cel puin 2. Iniial, distana lui u
de la surs este cel puin 0, i n momentul cnd nu mai poate atins din surs (dac acest
lucru se ntmpl vreodat) distana lui va cel mult [V [ 2. Deci, arcul (u, v) poate deveni
critic de cel mult O(V ) ori. Deoarece exist O(E) perechi de vrfuri care por legate prin arce
n graful rezidual, numrul total de arce critice n timpul execuiei algoritmului lui Edmonds-
Karp este O(V E). Deoarece ecare drum de ameliorare are cel puin un arc critic, teorema este
demonstrat.
Deoarece ecare iteraie n algoritmul Ford-Fulkerson poate implementat n O(E)
uniti de timp, cnd drumul de ameliorare este gsit prin cutare n lime, timpul total de
execuie al algoritmului lui Edmonds-Karp este O(V E
2
). Algoritmul din seciunea 27.4 ne va
da o metod cu timpul de execuie O(V
2
E), care va baza algoritmului din seciunea 27.5 cu
timpul de execuie O(V
3
).
Exerciii
27.2-1 Ct este uxul ce trece prin tietura (s, v
2
, v
4
, v
1
, v
3
, t) din gura 27.1(b)? Ct este
capacitatea acestei tieturi?
27.2-2 Care sunt paii algoritmului lui Edmonds-Karp aplicat pentru reeaua din gura 27.1(a)?
27.2-3 Care este tietura minim corespunztoare uxului din gura 27.6? Care dou dintre
drumurile de ameliorare care apar din exemplu micoreaz uxul pe vreun arc?
27.2-4 Demonstrai c pentru orice pereche de vrfuri u i v, i pentru orice funcie de capacitate
c i funcie ux f avem c
f
(u, v) +c
f
(v, u) = c(u, v) +c(v, u).
27.2-5 Dup construcia din seciunea 27.1 o reea cu mai multe surse i destinaii se poate
transforma ntr-o reea echivalent cu o surs unic i destinaie unic, adugnd arce avnd
capacitate innit. Demonstrai c orice ux n reeaua rezultat are o valoare nit dac arcele
n reeaua original au capaciti nite.
27.3. Cuplaj bipartit maxim 515
27.2-6 S presupunem c ntr-o problem de ux cu surse multiple i destinaii multiple, ecare
surs s
i
produce p
i
uniti de ux, adic f(s
i
, V ) = p
i
. S presupunem de asemenea c ecare
destinaie t
j
consum exact q
j
uniti de ux, adic f(V, t
j
) = q
j
, unde

i
p
i
=

j
q
j
. Artai
cum se poate transforma problema determinrii uxului f cu aceste condiii suplimentare ntr-o
problem de ux ntr-o reea cu o surs unic i destinaie unic.
27.2-7 Demonstrai lema 27.3.
27.2-8 Artai c uxul maxim ntr-o reea G = (V, E) totdeauna poate gsit printr-o secven
de cel mult [E[ drumuri de ameliorare. ( Determinai drumurile obinerea uxului
maxim.)
27.2-9 Conexiunea de muchii ntr-un graf neorientat este numrul minim k de muchii care
trebuie eliminate pentru ca graful s devin neconex. De exemplu, conexiunea de muchii a unui
arbore este 1, iar conexiunea de muchii a unui ciclu este 2. Artai cum poate determinat
conexiunea de muchii a unui graf neorientat G = (V, E) aplicnd un algoritm de ux maxim pe
cel mult [V [ reele de transport, ecare avnd O(V ) vrfuri i O(E) muchii.
27.2-10 Presupunem c o reea de transport G = (V, E) are muchii simetrice, cu alte cuvinte
(u, v) E dac i numai dac (v, u) E). Artai c algoritmul lui Edmonds-Karp se termin
dup cel mult [V [[E[/4 iteraii. ( Vericai pentru orice arc (u, v) cum se schimb
valorile (s, u) i (v, t) ntre dou momente cnd arcul este critic.)
27.3. Cuplaj bipartit maxim
Anumite probleme de combinatoric pot considerate ca ind probleme de ux maxim.
Problema de ux maxim cu surse multiple i destinaii multiple din seciunea 27.1 este un astfel
de exemplu. Exist i alte probleme de combinatoric care, la prima vedere, nu par s aibe prea
multe lucruri n comun cu reele de transport, dar, de fapt, pot reduse la probleme de ux
maxim. Acest paragraf prezint o astfel de problem: gsirea unui cuplaj maxim ntr-un graf
bipartit (vezi seciunea 5.4). Pentru a rezolva aceast problem, vom folosi o proprietate de
integralitate a metodei Ford-Fulkerson. De asemenea, vom vedea cum metoda Ford-Fulkerson
poate folosit pentru a rezolva problema unui cuplaj bipartit maxim pentru un graf G = (V, E)
ntr-un timp O(V E).
Problema cuplajului bipartit maxim
Fiind dat un graf neorientat G = (V, E), un cuplaj este o submulime de muchii M E
astfel nct pentru toate vrfurile v V , exist cel mult o muchie n M incident n v. Spunem
c un vrf v V este cuplat de cuplajul M dac exist o muchie n M incident n v; altfel,
spunem c v este neconectat. Un cuplaj maxim este un cuplaj de cardinalitate maxim,
adic, un cuplaj M astfel nct pentru orice alt cuplaj M
t
, avem [M[ [M
t
[. n acest paragraf,
ne vom ndrepta atenia asupra gsirii cuplajelor maxime n grafe bipartite. Vom presupune c
mulimea de vrfuri poate partiionat n V = L R, unde L i R sunt disjuncte i toate
muchiile din E sunt ntre L i R. Presupunem, de asemenea, c nu exist vrfuri izolate n V .
Figura 27.8 ilustreaz noiunea de cuplaj.
516 Capitolul 27 Flux maxim
Figura 27.8 Un graf bipartit G = (V, E) cu partiia vrfurilor V = LR. (a) Un cuplaj de cardinalitate
2. (b) Un cuplaj maxim de cardinalitate 3.
Problema gsirii unui cuplaj maxim ntr-un graf bipartit are multe aplicaii practice. De
exemplu, putem considera conectarea unei mulimi de L maini cu o mulime de R task-uri care
trebuie executate simultan. Vom considera c prezena muchiei (u, v) n E semnic faptul c
o anumit main u L este capabil s execute task-ul v R. Un cuplaj maxim va asigura
funcionarea a ct mai multor maini posibile.
Determinarea cuplajului bipartit maxim
Putem folosi metoda Ford-Fulkerson pentru a determina cuplajul maxim ntr-un graf
neorientat bipartit G = (V, E), ntr-un timp polinomial n [V [ i [E[. Soluia const n a construi
o reea de transport n care uxurile reprezint cuplaje, conform gurii 27.9. Vom deni reeaua
de transport corespunztoare G
t
= (V
t
, E
t
) pentru un graf bipartit G astfel. Vom alege sursa
s i destinaia t ca ind noi vrfuri care nu sunt n V i vom construi V
t
= V s, t. Dac
partiia vrfurilor n G este V = L R, atunci arcele orientate ale lui G
t
sunt date de:
E
t
= (s, u) : u L (u, v) : u L, v R i (u, v) E (v, t) : v R .
Pentru a completa construcia, vom atribui ecrei muchii din E
t
capacitatea unitate.
Teorema urmtoare exprim faptul c un cuplaj n G corespunde n mod direct unui ux din
reeaua de transport a lui G
t
. Spunem c un ux f dintr-o reea de transport G = (V, E) este
de valoare ntreag dac f(u, v) este un numr ntreg pentru orice (u, v) V V .
Lema 27.10 Fie G = (V, E) un graf bipartit cu partiia vrfurilor V = LR i e G
t
= (V
t
, E
t
)
reeaua de transport corespunztoare acestui graf. Dac M este un cuplaj n G, atunci exist un
ux f de valoare ntreag n G
t
cu valoarea [f[ = [M[. Reciproc, dac f este un ux de valoare
ntreag n G
t
, atunci exist un cuplaj M n G de cardinalitate [M[ = [f[.
Demonstraie. Vom arta prima dat c un cuplaj M n G corespunde unui ux de valoare
ntreag n G
t
. Denim f astfel. Dac (u, v) M atunci f(s, u) = f(u, v) = f(v, t) = 1 i
f(u, s) = f(v, u) = f(t, v) = 1. Pentru toate celelalte arce (u, v) E
t
, vom deni f(u, v) = 0.
27.3. Cuplaj bipartit maxim 517
Figura 27.9 Reeaua de transport corespunztoare unui graf bipartit. (a) Graful bipartit G = (V, E)
cu partiia vrfurilor V = L R din gura 27.8. Un cuplaj maxim este ilustrat prin muchii ngroate.
(b) Reeaua de transport G

corespunztoare, cu un ux maxim evideniat. Fiecare arc are capacitatea


unitate. Arcele ngroate au un ux egal cu 1 i toate celelalte arce nu transport nici un ux. Arcele
ngroate de la L la R corespund celor dintr-un cuplaj maxim al unui graf bipartit.
Intuitiv, ecare muchie (u, v) M corespunde unei uniti de ux n G
t
care traverseaz
drumul s u v t. Mai mult, drumurile determinate de muchii din M conin vrfuri diferite,
exceptnd s i t. Pentru a verica faptul c ntr-adevr f satisface simetria oblic, constrngerile
de capacitate i conservarea uxului, trebuie doar s observm c f poate obinut prin mrirea
uxului de-a lungul ecrui astfel de drum. Fluxul net de-a lungul tieturii Ls, Rt este
egal cu [M[; astfel, conform lemei 27.5, valoarea uxului este [f[ = [M[.
Pentru a demonstra reciproca, e f un ux de valoare ntreag n G
t
i e
M = (u, v) : u L, v R i f(u, v) > 0.
Fiecare vrf u L are o singur muchie incident, e ea (s, u) i capacitatea ei este 1. Astfel,
ecare vrf u L are cel mult o unitate de ux net pozitiv care intr n el. Deoarece f este de
valoare ntreag, pentru ecare u L, o unitate de ux net pozitiv intr n u dac i numai
dac exist exact un vrf v R astfel nct f(u, v) = 1. Deci, exist cel mult o muchie care iese
din ecare vrf u L care transport ux net pozitiv. O argumentare similar poate fcut
pentru ecare vrf v R. Prin urmare, mulimea M denit n enunul teoremei este un cuplaj.
Pentru a arta c [M[ = [f[, s observm c pentru ecare vrf u L conectat, avem
f(s, u) = 1 i pentru ecare muchie (u, v) E M avem f(u, v) = 0. n consecin, folosind
lema 27.1, simetria oblic i faptul c nu exist nici o muchie de la un vrf din L la t, obinem:
[M[ = f(L, R) = f(L, V
t
) f(L, L) f(L, s) f(L, t) = 0 0 +f(s, L) 0 = f(s, V
t
) = [f[.
Intuitiv putem spune c un cuplaj maxim ntr-un graf bipartit G corespunde unui ux maxim
n reeaua de transport G
t
corespunztoare. Deci, putem calcula un cuplaj maxim n G printr-
un algoritm de ux maxim n G
t
. Singurul dezavantaj al acestei abordri este c algoritmul de
ux maxim poate produce ca rezultat un ux n G
t
care conine valori care nu sunt ntregi.
Urmtoarea teorem asigur faptul c dac folosim metoda Ford-Fulkerson evitm aceast
dicultate.
518 Capitolul 27 Flux maxim
Teorema 27.11 (Teorema de integralitate) Dac funcia de capacitate c ia numai valori
ntregi, atunci uxul maxim f produs de metoda Ford-Fulkerson are proprietatea c [f[ este de
valoare ntreag. n plus, pentru toate vrfurile u i v, valoarea f(u, v) este un numr ntreg.
Demonstraie. Demonstraia se face prin inducie dup numrul de iteraii. O lsm pe seama
cititorului n exerciiul 27.3-2.
Putem acum demonstra urmtorul corolar al lemei 27.10.
Corolarul 27.12 Cardinalitatea unui cuplaj maxim ntr-un graf bipartit G este valoarea
uxului maxim din reeaua de transport G
t
corespunztoare.
Demonstraie. Folosim noiunile din lema 27.10. Presupunem c M este un cuplaj maxim n
G i c uxul f corespunztor n G
t
nu este maxim. Atunci, exist un ux maxim f
t
n G
t
astfel
nct [f
t
[ > [f[. Deoarece capacitile din G
t
sunt valori ntregi, conform teoremei 27.11 putem
presupune c f
t
este de valoare ntreag. Prin urmare, f
t
corespunde unui cuplaj M
t
n G cu
cardinalitatea [M
t
[ = [f
t
[ > [f[ = [M[, contrazicnd maximalitatea lui M. Similar, putem arta
c dac f este un ux maxim n G
t
, atunci cuplajul corespunztor este un cuplaj maxim n G.
n concluzie, ind dat un graf G neorientat bipartit, putem determina un cuplaj maxim
prin construcia reelei de transport G
t
, apoi prin aplicarea metodei Ford-Fulkerson i obinnd,
n mod direct, un cuplaj maxim M dintr-un ux maxim f de valoare ntreag determinat.
Deoarece orice cuplaj ntr-un graf bipartit are cardinalitatea cel mult min(L, R) = O(V ), rezult
c valoarea uxului maxim n G
t
este O(V ). Prin urmare, putem determina un cuplaj maxim
ntr-un graf bipartit ntr-un timp O(V E).
Exerciii
27.3-1 Executai algoritmul Ford-Fulkerson pe reeaua de transport din gura 27.9(b) i
ilustrai reeaua obinut dup ecare mrire a uxului. Numerotai vrfurile din L de sus
n jos de la 1 la 5 i n R de sus n jos de la 6 la 9. Pentru ecare iteraie, alegei drumul mrit
care este cel mai mic n ordine lexicograc.
27.3-2 Demonstrai teorema 27.11.
27.3-3 Fie G = (V, E) un graf bipartit cu partiia vrfurilor V = L R i e G
t
reeaua de
transport corespunztoare. Determinai o margine superioar pentru lungimea oricrui drum
mrit gsit n G
t
n timpul execuiei lui Ford-Fulkerson.
27.3-4 Un cuplaj perfect este un cuplaj n care ecare vrf este cuplat. Fie G = (V, E) un
graf neorientat bipartit cu partiia vrfurilor V = LR, unde [L[ = [R[. Pentru oricare X V ,
denim vecintatea lui X ca ind
N(X) = y V : (x, y) E pentru x X,
adic mulimea de vrfuri adiacente cu un anumit membru al lui X. Demonstrai teorema lui
Hall : exist un cuplaj perfect n G dac i numai dac [A[ [N(A)[ pentru ecare submulime
A L.
27.4. Algoritmi de preux 519
27.3-5 Un graf bipartit G = (V, E), n care V = L R, este d-regular dac ecare vrf
v V are exact gradul d. n oricare graf bipartit d-regular avem [L[ = [R[. Demonstrai c
orice graf bipartit d-regular are un cuplaj de cardinalitate [L[, argumentnd faptul c o tietur
minim a reelei de transport corespunztoare are capacitatea [L[.
27.4. Algoritmi de preux
n acest paragraf vom prezenta abordarea prin preux a calculului uxurilor maxime. Cei
mai rapizi algoritmi de ux maxim pn la ora actual sunt algoritmii de preux, cu ajutorul
crora se pot rezolva ecient i alte probleme de ux, cum ar problema uxului de cost minim.
n acest paragraf vom introduce algoritmul generic de ux maxim al lui Goldberg, care are o
implementare simpl ce se execut ntr-un timp O(V
2
E), mbuntind astfel limita de O(V E
2
)
al algoritmului Edmonds-Karp. Seciunea 27.5 raneaz algoritmul generic pentru a obine un
alt algoritm de preux cu timp de execuie O(V
3
).
Algoritmii de preux lucreaz ntr-o manier mai localizat dect metoda Ford-Fulkerson.
n loc s examineze ntreaga reea rezultat G = (V, E) pentru a determina drumul mrit,
algoritmii de preux acioneaz asupra unui singur vrf la un moment dat, examinnd doar vecinii
vrfului din reeaua rezultat. Mai mult, spre deosebire de metoda Ford-Fulkerson, algoritmii
de preux nu pstreaz proprietatea de conservare a uxului de-a lungul execuiei lor. Totui,
aceti algoritmi gestioneaz un preux, care este o funcie f : V V R care satisface simetria
oblic, constrngerile de capacitate i urmtoarea relaxare a conservrii uxului: f(V, u) 0
pentru toare vrfurile u V s. Aceast condiie semnic faptul c uxul net n oricare vrf
diferit de surs este nenegativ. Numim exces de ux n u uxul net n vrful u dat de
e(u) = f(V, u). (27.8)
Spunem c un vrf u V s, t este cu exces de ux dac e(u) > 0.
Vom ncepe acest paragraf prin a descrie intuitiv metoda de preux. Vom studia apoi cele
dou operaii implicate n aceast metod: pomparea preuxului i ridicarea unui vrf. n
nal, vom prezenta algoritmul generic de preux i vom analiza corectitudinea i timpul su de
execuie.
Intuiia
Intuiia din spatele metodei de preux este, probabil, mai bine neleas n termenii uxurilor
de uide: considerm o reea de transport G = (V, E) ca ind un sistem de evi interconectate
de capaciti date. Aplicnd aceast analogie metodei Ford-Fulkerson, putem spune c ecare
drum mrit n reea produce o scurgere adiional de uid, fr puncte de ramicare, care curge
de la surs spre destinaie. Metoda Ford-Fulkerson adaug iterativ mai multe scurgeri de ux
pn cnd nu se mai pot aduga alte scurgeri.
Algoritmul generic de preux are o intuiie oarecum diferit. Ca i mai nainte, arcele orientate
corespund unor evi. Vrfurile, care sunt mbinri de evi, au dou proprieti interesante. Prima,
pentru a gestiona excesul de ux, const n faptul c ecare vrf are o eav pentru scurgere
ntr-un rezervor arbitrar sucient de mare care poate nmagazina uid. A doua ne spune c,
520 Capitolul 27 Flux maxim
ecare vrf, de fapt, rezervorul corespunztor i toate mbinrile sale cu alte evi se a pe o
platform a crei nlime crete proporional cu execuia algoritmului.
nlimile vrfurilor determin modul n care este pompat uxul: vom pompa uxul doar de
sus n jos, adic, de la un vrf mai nalt spre un vrf mai jos. Poate exista un ux net pozitiv de la
un vrf mai jos spre un vrf mai sus, dar operaiile care pompeaz uxul vor mpinge doar de sus
n jos. nlimea sursei este xat la [V [, iar nlimea destinaiei este 0. Toate celelalte nlimi
ale vrfurilor sunt iniial 0 i cresc n timp. La nceput, algoritmul trimite ct mai mult ux
posibil de la surs spre destinaie. Cantitatea trimis este exact cea necesar pentru a umple
ecare eav ce pleac de la surs la ntreaga capacitate; de fapt, trimite capacitatea tietuii
(s, V s). n momentul n care uxul intr pentru prima dat ntr-un vrf intermediar, el este
colectat n rezervorul vrfului. De acolo este, eventual, pompat n jos.
Este posibil ca singurele evi care pleac din vrful u i nu sunt nc saturate cu ux s e
conectate cu vrfuri situate pe acelai nivel ca i u sau pe un nivel mai sus dect u. n acest
caz, pentru a goli vrful u de excesul de ux, trebuie s-i mrim nlimea operaie numit
ridicarea vrfului u. nlimea sa este mrit cu o unitate fa de nlimea celui mai jos dintre
vecinii si, cu care este conectat printr-o eav nesaturat. Prin urmare, dup ce un vrf a fost
ridicat, exist cel puin o eav de ieire prin care poate pompat mai mult ux.
n nal, toate uxurile care au putut trece prin destinaie au ajuns la ea. Nu mai pot ajunge
alte uxuri, pentru c evile satisfac constrngerile de capacitate; cantitatea de ux de-a lungul
oricrei tieturi este n continuare limitat de capacitatea tieturii. Pentru a transforma preuxul
ntr-un ux valid, algoritmul trimite apoi excesul colectat n rezervoarele vrfurilor cu exces
de ux napoi la surs, continund s ridice vrfurile deasupra nlimii xate [V [ a sursei.
(Transportul excesului napoi la surs este realizat, de fapt, prin anularea uxurilor care au
generat excesul). Dup cum vom vedea, n momentul n care toate rezervoarele au fost golite,
preuxul nu numai c este un ux valid, el este totodat i un ux maxim.
Operaiile de baz
Din prezentarea anterioar observm c exist dou operaii de baz care se execut ntr-un
algoritm de preux: pomparea excesului de ux dintr-un vrf ctre unul din vecinii si i ridicarea
unui vrf. Aplicabilitatea acestor operaii depinde de nlimile vrfurilor, pe care le vom deni
acum formal.
Fie G = (V, E) o reea de transport cu sursa s i destinaia t i e f un preux n G. O
funcie h : V N este o funcie de nlime dac h(s) = [V [, h(t) = 0 i
h(u) h(v) + 1
pentru ecare muchie rezultat (u, v) E
f
. Obinem urmtoarea lem.
Lema 27.13 Fie G = (V, E) o reea de transport, e f un preux n G i e h o funcie de
nlime pe V . Pentru oricare dou vrfuri u, v V , dac h(u) > h(v) + 1, atunci (u, v) nu este
o muchie n graful rezultat.
Operaia de baz Pompeaz(u, v) poate aplicat dac u este un vrf cu exces de ux,
c
f
(u, v) > 0 i h(u) = h(v) + 1. Pseudocodul urmtor actualizeaz preuxul f ntr-o reea
G = (V, E). Se presupune c sunt date capacitile printr-o funcie c constant n timp i c
27.4. Algoritmi de preux 521
ind date c i f, capacitile rezultate se pot calcula n timp constant. Excesul de ux stocat
n vrful u este gestionat de e[u], iar nlimea lui u este dat de h[u]. Expresia d
f
(u, v) este o
variabil temporar care memoreaz cantitatea de ux care poate pompat de la u la v.
Pompeaz(u, v)
1: Precondiii: u este excedentar, c
f
[u, v] > 0 i h[u] = h[v] + 1.
2: Aciune: pompeaz d
f
(u, v) = min(e[u], c
f
(u, v)) uniti de ux de la u la v
3: d
f
(u, v) min(e[u], c
f
(u, v))
4: f[u, v] f[u, v] +d
f
(u, v)
5: f[v, u] f[u, v]
6: e[u] e[u] d
f
(u, v))
7: e[v] e[v] +d
f
(u, v))
Algoritmul Pompeaz opereaz n felul urmtor: se presupune c vrful u are un exces
pozitiv e[u] i capacitatea rezultat a lui (u, v) este pozitiv. Astfel, putem transporta pn la
d
f
(u, v) = min(e[u], c
f
(u, v)) uniti de ux de la u la v fr a cauza o valoare negativ pentru
e[u] i fr a depi valoarea pentru capacitatea c(u, v). Aceast valoare este calculat n linia 3.
Fluxul este mutat de la u la v, actualiznd valoarea lui f n liniile 45 i valoarea lui e n liniile
67. Prin urmare, dac f este un preux naintea apelului procedurii Pompeaz, va rmne un
preux i dup aceea.
Dup cum se observ, codul algoritmului Pompeaz nu depinde n nici un moment de
nlimile lui u i v, dar interzicem apelul ei dac condiia h[u] = h[v] + 1 nu este satisfcut.
Astfel, excesul de ux este pompat de sus n jos la o diferen de nlime egal cu 1. Conform
lemei 27.13 nu exist muchii rezultate ntre dou vrfuri cu diferen ntre nlimi mai mare
dect 1 i, deci, nu se obine nici un beneciu permind uxului s e pompat de sus n jos la
o diferen de nlime mai mare dect 1.
Operaia Pompeaz(u, v) o vom numi pompare de la u la v. Dac o operaie de pompare
este aplicat unei muchii (u, v) care pleac dintr-un vrf u, putem spune i c operaia de pompare
este aplicat lui u. O pompare saturat este cea prin care muchia (u, v) devine saturat (n
continuare c
f
(u, v) = 0), altfel este o pompare nesaturat. Dac o muchie nu este saturat
atunci nu va aprea n reeaua rezultat.
Operaia de baz Ridic(u) se aplic dac u are exces de ux (este excedentar) i dac
c
f
(u, v) > 0 implic h[u] h[v] pentru toate vrfurile v. Cu alte cuvinte, putem ridica un vrf
excedentar dac pentru ecare vrf v pentru care exist o capacitate rezultat de la u la v, uxul
nu poate pompat de la u la v, deoarece v este situat mai jos dect u. (S reamintim c, pe
baza deniiei, sursa s i destinaia t nu pot excedentare i, deci, s i t nu pot ridicate.)
Ridic(u)
1: Precondiii: u este excedentar i pentru orice v V , (u, v) E
f
implic h[u] h[v].
2: Aciune: Mrete nlimea lui u.
3: h[u] 1 + minh[v] : (u, v) E
f

Cnd apelm operaia Ridic(u), spunem c vrful u este ridicat. Este important s
menionm c atunci cnd u este ridicat, E
f
trebuie s conin cel puin o muchie care
iese din u, astfel ca minimul calculat n codul procedurii s corespund unei mulimi nevide.
Aceast observaie este dedus din precondiia ca u s e excedentar. Deoarece e[u] > 0, avem
522 Capitolul 27 Flux maxim
e[u] = f[V, u] > 0 i, deci, trebuie s existe cel puin un vrf v astfel nct f[v, u] > 0. Dar atunci
c
f
(u, v) = c(u, v) f[u, v] = c(u, v) +f[v, u] > 0,
ceea ce implic (u, v) E
f
. Astfel, operaia Ridic(u) i atribuie lui u cea mai mare nlime
permis de constrngerile funciilor de nlime.
Algoritmul generic
Algoritmul generic de preux folosete urmtoarea subrutin pentru a crea preuxul iniial
ntr-o reea de transport.
Iniializeaz-Preflux(G, s)
1: pentru ecare vrf u V [G] execut
2: h[u] 0
3: e[u] 0
4: pentru ecare muchie (u, v) E[G] execut
5: f[u, v] 0
6: f[v, u] 0
7: h[s] V [G]
8: pentru ecare vrf u Adj[s] execut
9: f[s, u] c(s, u)
10: f[u, s] c(s, u)
11: e[u] c(s, u)
Iniializeaz-Preflux creeaz un preux iniial f denit de:
f[u, v] =

c(u, v) dac u = s,
c(v, u) dac v = s,
0 altfel.
Aceasta nseamn c ecare muchie care pleac din vrful surs este umplut la ntreaga
capacitate i toate celelalte muchii nu transport ux. Pentru ecare vrf adiacent sursei avem
iniial e[v] = c(s, v). De asemenea, algoritmul generic ncepe cu o funcie de nlime iniial
dat de
h[u] =

[V [ dac u = s,
0 altfel.
Aceasta este o funcie de nlime pentru c singurele muchii (u, v) pentru care h[u] > h[v] +1
sunt cele pentru care u = s i aceste muchii sunt saturate, ceea ce nseamn c nu vor n reeua
rezultat.
Urmtorul algoritm tipizeaz metoda de preux.
Preflux-Generic(G)
1: Iniializeaz-Preflux(G, s)
2: ct timp exist o operaie de pompare sau de ridicare ce se poate aplica execut
3: selecteaz o operaie de pompare sau de ridicare ce se poate aplica i execut-o
27.4. Algoritmi de preux 523
Dup iniializarea uxului, algoritmul generic aplic repetat, n orice ordine, operaiile de
baz ori de cte ori acest lucru este posibil. Urmtoarea lem precizeaz faptul c att timp ct
exist un vrf cu exces de ux, se poate aplica cel puin una din cele dou operaii de baz.
Lema 27.14 (Un vrf excedentar poate pompat sau ridicat) Fie G = (V, E) o reea
de transport cu sursa s i destinaia t, e f un preux i e h o funcie arbitrar de nlime
pentru f. Dac u este un vrf excedentar oarecare, atunci i se poate aplica e o operaie de
pompare, e una de ridicare.
Demonstraie. Pentru orice muchie rezultat (u, v) avem h(u) h(v) + 1 deoarece h este o
funcie de nlime. Dac lui u nu i se poate aplica o operaie de pompare atunci pentru toate
muchiile rezultate (u, v) trebuie s avem h(u) < h(v) + 1, ceea ce implic h(u) h(v). Prin
urmare, lui u i se poate aplica o operaie de ridicare.
Corectitudinea metodei de preux
Pentru a arta c algoritmul generic de preux rezolv problema uxului maxim, vom
demonstra mai nti c dac se termin, preuxul f este uxul maxim. Apoi, vom demonstra c
se termin. Vom ncepe cu unele observaii relative la funcia de nlime h.
Lema 27.15 (nlimile vrfurilor nu scad niciodat) n timpul execuiei algoritmului
Preflux-Generic asupra unei reele de transport G = (V, E), nlimile h[u], pentru ecare
vrf u V , nu scad niciodat. Mai mult, ori de cte ori se aplic o operaie de ridicare asupra
unui vrf u, nlimea sa h[u] crete cu cel puin 1.
Demonstraie. Deoarece nlimile vrfurilor se modic doar n timpul operaiilor de ridicare,
este sucient s demonstrm a doua armaie a lemei. Dac vrful este ridicat, atunci pentru
toate vrfurile v astfel nct (u, v) E
f
, avem h[u] h[v]; aceasta implic h[u] < 1 +minh[v] :
(u, v) E
f
i deci operaia trebuie s mreasc h[u].
Lema 27.16 Fie G = (V, E) o reea de transport cu sursa s i destinaia t. n timpul execuiei
algoritmului Preflux-Generic asupra lui G, atributul h este gestionat ca o funcie de nlime.
Demonstraie. Demonstraia se face prin inducie dup numrul de operaii de baz executate.
Dup cum am observat deja, iniial, h este o funcie de nlime.
Cerem ca dac h este o funcie de nlime, atunci operaia Ridic(u) s pstreze h ca
funcie de nlime. Dac studiem muchia rezultat (u, v) E
f
care pleac din u, atunci operaia
Ridic(u) asigur c h[u] h[v] +1 dup aplicarea ei. S studiem acum muchia rezultat (w, u)
care intr n vrful u. Conform lemei 27.15, h[w] h[u]+1 naintea aplicrii operaiei Ridic(u),
implic h[w] < h[u] + 1 dup aplicarea ei. Deci, operaia Ridic(u) pstreaz h ca funcie de
nlime.
S considerm acum operaia Pompeaz(u, v). Aceast operaie poate aduga muchia (v, u)
la E
f
sau poate elimina (u, v) din E
f
. n primul caz, avem h[v] = h[u] 1 i astfel h rmne o
funcie de nlime. n al doilea caz, eliminarea muchiei (u, v) din reeaua rezultat conduce la
eliminarea constrngerilor corespunztoare i, din nou, h rmne o funcie de nlime.
Urmtoarea lem prezint o proprietate important a funciilor de nlime.
524 Capitolul 27 Flux maxim
Lema 27.17 Fie G = (V, E) o reea de transport cu sursa s i destinaia t, e f un preux n
G i e h o funcie arbitrar de nlime pe V . Atunci, nu exist nici un drum de la sursa s la
destinaia t n reeaua rezultat G
f
.
Demonstraie. Vom folosi metoda reducerii la absurd. Pentru aceasta, presupunem c exist un
drum p = 'v
0
, v
1
, ..., v
k
` de la s la t n G
f
, unde v
0
= s i v
k
= t. Fr a pierde din generalitate,
putem presupune c p este un drum elementar i deci k < [V [. Pentru i = 0, 1, ..., k 1, muchia
(v
i
, v
i+1
) E
f
. Deoarece h este o funcie de nlime, avem h(v
i
) h(v
i+1
) + 1, pentru i =
0, 1, ..., k 1. Combinnd aceste inegaliti de-a lungul drumului p obinem h(s) h(t) +k. Dar,
deoarece h(t) = 0, avem h(s) k < [V [, ceea ce contrazice cerina ca h(s) = [V [ pentru o funcie
de nlime.
Suntem acum pregtii s artm c dac algoritmul generic de preux se termin, atunci
preuxul pe care l calculeaz este un ux maxim.
Teorema 27.18 (Corectitudinea algoritmului generic preux) Dac execuia algorit-
mului Preflux-Generic se termin, pentru o reea de transport G = (V, E) avnd sursa s
i destinaia t, atunci preuxul f calculat este un ux maxim pentru G.
Demonstraie. Dac algoritmul generic se termin, atunci ecare vrf din V s, t trebuie s
aibe un exces nul, datorit lemelor 27.14 i 27.16 i invariantului c f este tot timpul un preux,
deci nu exist vrfuri excedentare. Prin urmare, f este un ux. Deoarece h este o funcie de
nlime, conform lemei 27.17, nu exist nici un drum de la s la t n reeua rezultat G
f
.Conform
teoremei ux maxim-tietur minim, rezult c f este un ux maxim.
Analiza metodei de preux
Pentru a arta c ntr-adevr algoritmul generic de preux se termin, vom stabili o limit
pentru numrul de operaii pe care le execut. Fiecare dintre cele trei tipuri de operaii ridicri,
pompri saturate i pompri nesaturate este mrginit separat. Cunoscnd aceste limite, este
uor s construim un algoritm care se execut ntr-un timp O(V
2
E). naintea nceperii analizei,
vom demonstra o lem important.
Lema 27.19 Fie G = (V, E) o reea de transport cu sursa s i destinaia t i e f un preux
n G. Atunci, pentru orice vrf excedentar u, exist un drum elementar de la u la s n reeaua
rezultat G
f
.
Demonstraie. Folosim metoda reducerii la absurd. Fie U = v : exist un drum elementar de
la u la v n G
f
i presupunem c s U. Fie

U = V U.
Presupunem c pentru ecare pereche de vrfuri v U i w

U avem f(w, v) 0. De ce?
Dac f(w, v) > 0, atunci f(v, w) < 0, ceea ce implic c
f
(v, w) = c(v, w) f(v, w) > 0. Prin
urmare, exist o muchie (v, w) E
f
i un drum elementar de forma u Yv w n G
f
, ceea ce
contrazice alegerea noastr relativ la w.
Astfel, trebuie s avem f(

U, U) 0, deoarece ecare termen din aceast sum este nepozitiv.


Astfel, din formula (27.8) i lema 27.1, putem deduce c
e(U) = f(V, U) = f(

U, U) +f(U, U) = f(

U, U) 0.
27.4. Algoritmi de preux 525
Excesele sunt nenegative pentru toate vrfurile din V s; deoarece am presupus c U
V s, trebuie s avem e(v) = 0 pentru toate vrfurile v U. n particular, e(u) = 0, ceea ce
contrazice presupunerea c u este excedentar.
Urmtoarea lem mrginete nlimea vrfurilor i corolarul ei stabilete o margine pentru
numrul total de operaii de ridicare care sunt executate.
Lema 27.20 Fie G = (V, E) o reea de transport cu sursa s i destinaia t. n orice moment, n
timpul execuiei lui Preflux-Generic asupra lui G, avem h[u] 2[V [1 pentru toate vrfurile
u V .
Demonstraie. nlimile sursei s i destinaiei t nu se modic niciodat deoarece aceste
vrfuri sunt prin deniie neexcedentare. Deci, ntotdeauna vom avea h[s] = [V [ i h[t] = 0.
Datorit faptului c un vrf este ridicat doar atunci cnd este excedentar, putem considera
orice vrf excedentar u V s, t. Conform lemei 27.19, exist un drum elementar p de la u la s
n G
f
. Fie p = 'v
0
, v
1
, ..., v
k
`, unde v
0
= u, v
k
= s i k [V [ 1, deoarece p este elementar. Avem
(v
i
, v
i+1
) E
f
, pentru i = 0, 1, ..., k 1 i, prin urmare, conform lemei 27.16, h[v
i
] h[v
i+1
+1.
Dezvoltnd aceste inegaliti peste drumul p obinem h[u] = h[v
0
] h[v
k
]+k h[s]+([V [1) =
2[V [ 1.
Corolarul 27.21 (Limita pentru operaii de ridicare) Fie G = (V, E) o reea de trans-
port cu sursa s i destinaia t. Atunci, n timpul execuiei algoritmului Preflux-Generic
asupra lui G, numrul de operaii de ridicare este cel mult 2[V [ 1 pentru un vrf i cel mult
(2[V [ 1)([V [ 2) < 2[V [
2
n total.
Demonstraie. Doar vrfurile din V s, t, n numr de [V [ 2, pot ridicate. Fie u
V s, t. Operaia Ridic(u) mrete h[u]. Valoarea h[u] este iniial 0 i, conform lemei 27.20,
crete pn la cel mult 2[V [ 1. Deci, ecare vrf u V s, t este ridicat de cel mult 2[V [ 1
ori i numrul total de operaii de ridicare executate este cel mult (2[V [ 1)([V [ 2) < 2[V [
2
.
Lema 27.20 ne ajut s mrginim i numrul de pompri saturate.
Lema 27.22 (Limita pentru pompri saturate) n timpul execuiei algoritmului Pre-
flux-Generic asupra oricrei reele de transport G = (V, E), numrul de pompri saturate
este cel mult 2[V [[E[.
Demonstraie. Pentru orice pereche de vrfuri u, v V , lum n considerare pomprile saturate
de la u la v i de la v la u. Dac astfel de pompri exist, cel puin una dintre (u, v) i (v, u)
este o muchie n E. S presupunem c a aprut o pompare saturat de la u la v. Pentru ca s e
posibil s apar alt pompare de la u la v, algoritmul trebuie mai nti s pompeze uxul de la
v la u, ceea ce nu este posibil dect dup ce h[v] crete cu cel puin 2. Asemntor, h[u] trebuie
s creasc cu cel puin 2 ntre dou pompri saturate de la v la u.
Considerm secvena A de numere ntregi date de h[u] +h[v] pentru ecare pompare saturat
care apare ntre vrfurile u i v. Dorim s mrginim lungimea acestei secvene. Cnd apare pri-
ma pompare n oricare dintre direcii ntre u i v, trebuie s avem h[u] + h[v] 1; deci pri-
mul ntreg din A este cel puin 1. Cnd apare ultima astfel de pompare, avem h[u] + h[v]
(2[V [ 1) +(2[V [ 2) = 4[V [ 3, conform lemei 27.20; prin urmare, ultimul ntreg din A este cel
mult 4[V [ 3. innd cont de argumentaia din paragraful anterior, n A pot aprea cel mult toi
526 Capitolul 27 Flux maxim
ceilali ntregi. n concluzie, numrul de ntregi din A este cel mult ((4[V [3)1)/2+1 = 2[V [1.
(Adugm 1 pentru a siguri c ambele capete ale secvenei sunt numrate.) Numrul total
de pompri saturate ntre vrfurile u i v este cel mult 2[V [ 1. nmulind cu numrul total de
muchii, obinem c numrul total de pompri saturate poate cel mult (2[V [1)[E[ < 2[V [[E[.
Urmtoarea lem stabilete o margine pentru numrul de pompri nesaturate din algoritmul
generic de preux.
Lema 27.23 (Limita pentru pompri nesaturate) n timpul execuiei algoritmului Pre-
flux-Generic asupra oricrei reele de transport G = (V, E), numrul de pompri nesaturate
este cel mult 4[V [
2
([V [ +[E[).
Demonstraie. Denim o funcie de potenial =

vX
h[v]], unde X V este o mulime
de vrfuri excedentare. Iniial, = 0. Se observ c ridicarea unui vrf u mrete cu cel
mult 2[V [, deoarece mulimea peste care se face nsumarea este aceeai i u nu poate ridicat
mai mult dect nlimea sa maxim posibil, care, conform lemei 27.20, este cel mult 2[V [. De
asemenea, o pompare saturat de la vrful u la vrful v mrete cu cel mult 2[V [, deoarece
nlimile nu se modic i doar vrful v, a crui nlime este cel mult 2[V [, poate, eventual,
deveni excedentar. n ne, s observm c o pompare nesaturat de la u la v micoreaz cu cel
puin 1, deoarece u nu mai este excedentar dup pompare, v devine excedentar dup pompare
chiar dac nu era naintea operaiei, iar h[v] h[u] = 1.
Deci, pe parcursul algoritmului, numrul total de creteri n este constrns de corolarul
27.21 i lema 27.22, la valoarea (2[V [)(2[V [
2
) + (2[V [)(2[V [[E[) = 4[V [
2
([V [ + [E[). Deoarece
0, rezult c numrul total de descreteri i deci numrul total de pompri nesaturate este
cel mult 4[V [
2
([V [ +[E[).
Suntem acum capabili s realizm analiza procedurii Preflux-Generic i a oricrui algo-
ritm care se bazeaz pe metoda de preux.
Teorema 27.24 n timpul execuiei algoritmului Preflux-Generic asupra oricrei reele de
transport G = (V, E), numrul de operaii de baz este O(V
2
E).
Demonstraie. Pe baza corolarului 27.21 i a lemelor 27.22 i 27.23, demonstraia este
imediat.
Corolarul 27.25 Exist o implementare a algoritmului generic de preux care se execut ntr-
un timp O(V
2
E) pentru orice reea de transport G = (V, E).
Demonstraie. Cerina exerciiului 27.4-1 este s demonstrai cum se poate implementa algo-
ritmul generic cu limite de O(V ) pentru operaia de ridicare i O(1) pentru pompare. n aceste
condiii, demonstraia corolarului este imediat.
Exerciii
27.4-1 Artai cum se poate implementa algoritmul generic de preux, folosind un timp O(V )
pentru operaia de ridicare i O(1) pentru pompare, pentru a obine un timp total de O(V
2
E).
27.4-2 Artai c algoritmul generic de preux necesit un timp total de doar O(V E) pentru
a executa toate cele O(V
2
) operaii de ridicare.
27.5. Algoritmul mutare-n-fa 527
27.4-3 Presupunnd c a fost determinat un ux maxim ntr-o reea de transport G = (V, E)
folosind algoritmul de preux, construii un algoritm rapid pentru a determina o tietur minim
n G.
27.4-4 Construii un algoritm de preux pentru a determina un cuplaj maxim ntr-un graf
bipartit. Analizai acest algoritm.
27.4-5 Presupunnd c toate capacitile muchiilor dintr-o reea de transport G = (V, E) sunt
din mulimea 1, 2, ..., k, analizai timpul de execuie al algoritmului generic de preux n funcie
de [V [, [E[ i k. ( : De cte ori se pot aplica pompri nesaturate asupra ecrei muchii
nainte ca ea s devin saturat?)
27.4-6 Artai c linia 7 din algoritmul Iniializeaz-Preflux poate modicat astfel:
h[s] [V [G][ 2
fr a afecta corectitudinea, respectiv performana n cazul asimptotic pentru algoritmul generic
de preux.
27.4-7 Fie
f
(u, v) distana (numrul de muchii) de la u la v n reeaua rezultat G
f
. Artai
c Preflux-Generic respect proprietatea: h[u] < [V [ implic h[u]
f
(u, t) i h[u] [V [
implic h[u] [V [
f
(u, s).
27.4-8 La fel ca n exerciiu anterior,
f
(u, v) noteaz distana de la u la v n reeaua rezultat
G
f
. Artai cum se poate modica algoritmul generic de preux pentru a satisface urmtoarea
proprietate: h[u] < [V [ implic h[u] =
f
(u, t) i h[u] [V [ implic h[u] [V [ =
f
(u, s). Timpul
total necesar ca implementarea s satisfac aceast cerin trebuie s e O(V E).
27.4-9 Artai c numrul de pompri nesaturate executate de algoritmul Preflux-Generic
pentru o reea de transport G = (V, E) este cel mult 4[V [
2
[E[ pentru [V [ 4.
27.5. Algoritmul mutare-n-fa
Metoda preuxului permite aplicarea operaiilor de baz n absolut orice ordine. Se poate
rezolva totui problema uxului maxim mai repede dect marginea O

V
2
E

dat de corolarul
27.25 prin alegerea atent a ordinii i administrarea ecient a structurii de date corespunztoare
reelei. Vom examina acum algoritmul m , care este un algoritm de preux de
complexitate temporal O

V
3

, care este asimptotic cel puin la fel de bun ca i O(V


2
E).
Algoritmul mutare-n-fa gestioneaz o list a vrfurilor reelei. Algoritmul parcurge lista
ncepnd din fa, selectnd repetat un vrf u la care apare depire i apoi descrcndu-l, adic
realiznd operaiile de pompare i ridicare pn cnd u nu mai are un exces pozitiv. Indiferent
care vrf este ridicat, el este mutat n capul listei (de aici i numele de mutare-n-fa) dup
care algoritmul reia parcurgerea listei.
Corectitudinea i analiza algoritmului mutare-n-fa depind de noiunea de muchii admisi-
bile: acele muchii din reeaua rezidual prin care poate pompat uxul. Dup demonstrarea
unor proprieti despre reeaua muchiilor admisibile, vom investiga operaia de descrcare i
apoi vom prezenta analiza algoritmului mutare-n-fa.
528 Capitolul 27 Flux maxim
Muchii i reele admisibile
Dac G = (V, E) este o reea de transport cu sursa s i destinaia t, f este un preux n
G, iar h este funcia de nlime, atunci spunem c (u, v) este o muchie admisibil dac
c
f
(u, v) > 0 i h(u) = h(v) + 1. n caz contrar (u, v) este inadmisibil. Reeaua admisibil
este G
f,h
= (V, E
f,h
), unde E
f,h
este mulimea muchiilor admisibile.
Reeaua admisibil const din acele muchii prin care poate pompat uxul. Lema urmtoare
demonstreaz c aceast reea este un graf orientat aciclic.
Lema 27.26 (Reeaua admisibil este aciclic) Dac G = (V, E) este o reea de trans-
port, f este un preux din G i h este funcia de nlime pe G, atunci reeaua admisibil
G
f,h
= (V, E
f,h
) este aciclic.
Demonstraie. Demonstraia se va face prin reducere la absurd. Se presupune c G
f,h
conine
un ciclu p = 'v
0
, v
1
, . . . , v
k
`, unde v
0
= v
k
si k > 0. ntruct ecare muchie din p este admisibil,
avem h(v
i
1) = h(v
i
) + 1 pentru i = 1, 2, . . . , k. nsumnd de-a lungul ciclului obinem
k

i=1
h(v
i
1) =
k

i=1
(h(v
i
) + 1) =
k

i=1
h(v
i
) +k.
Deoarece ecare vrf din ciclul p apare o dat n ecare sum, rezult c 0 = k, ceea ce
constituie o contradicie.
Urmtoarele dou leme arat modul n care operaiile de ridicare i pompare schimb reeaua
admisibil.
Lema 27.27 Fie G = (V, E) o reea de transport, f un preux n G i h o funcie de nlime.
Dac la un vrf u apare depire i (u, v) este o muchie admisibil, atunci se aplic Pompea-
z(u, v). Operaia nu produce nici o muchie admisibil nou, dar poate transforma muchia (u, v)
ntr-una inadmisibil.
Demonstraie. Din deniia unei muchii admisibile rezult c uxul poate pompat de la u
la v. ntruct u este de depire, se aplic operaia Pompeaz(u, v). Singura muchie rezidual
nou care poate creat prin pomparea uxului de la u la v este muchia (v, u). ntruct h(v) =
h(u) 1, muchia (v, u) nu poate deveni admisibil. Dac operaia este de pompare saturat,
atunci c
f
(u, v) = 0 dup care (u, v) devine inadmisibil.
Lema 27.28 Fie G = (V, E) o reea de transport, f un preux din G i h o funcie de nlime.
Dac un vrf u este de depire i nu exist muchii admisibile ce pleac din u, atunci se aplic
Ridic(u). Dup o operaia de ridicare exist cel puin o muchie admisibil ce pleac din u, dar
nici o muchie admisibil ce intr n u.
Demonstraie. Dac u este de depire, conform lemei 27.14 i se aplic o operaie e de
pompare, e de ridicare. Dac nu exist muchii admisibile ce pleac din u, nu poate pompat
nici un ux dinspre u i se aplic operaia Ridic(u). Dup operaia de ridicare avem h[u] = 1+
minh[v] : (u, v) E
f
. Astfel, dac v este un vrf care realizeaz minimul n aceast mulime,
muchia (u, v) devine admisibil. Deci, dup ridicare exist cel puin o muchie admisibil ce pleac
din u.
27.5. Algoritmul mutare-n-fa 529
Pentru a arta c nici o muchie admisibil nu intr n u dup o operaie de ridicare, s
presupunem c exist un vrf v, astfel nct (v, u) s e admisibil. Atunci h[v] = h[u] +1 dup
ridicare i deci, h[v] > h[u] +1 imediat naintea ridicrii. Dar din lema 27.13 rezult c nu exist
nici o muchie rezidual ntre vrfuri a cror nlime difer cu mai mult de 1. Mai mult, ridicarea
unui vrf nu schimb reeaua rezidual. Astfel (v, u) nu este n reeaua rezidual i deci nu poate
n reeaua admisibil.
Liste de adiacen
Muchiile dintr-un algoritm mutare-n-fa sunt organizate n liste de adiacen. Fiind dat
o reea de transport G = (V, E), lista de adiacen N[u] pentru vrful u V este o list simplu
nlnuit a vrfurilor adiacente lui u n G. Astfel, vrful v apare n lista N[u] dac (u, v) E sau
dac (v, u) E. Lista de adiacen N[u] conine exact acele vrfuri v pentru care poate exista o
muchie rezidual (u, v). Primul vrf din N[u] este indicat de cap[N[u]]. Vrful ce urmeaz lui v
n lista de adiacen este indicat de [v]; acest pointer este nil dac v este ultimul
vrf n lista de adiacen.
Algoritmul mutare-n-fa cicleaz prin ecare list de adiacen ntr-o ordine arbitrar xat
de execuia algoritmului. Pentru ecare vrf u, cmpul actual[u] indic vrful curent luat n
considerare din N[u]. La nceput actual[u] este iniializat cu cap[N[u]].
Descrcarea unui vrf de depire
Un vrf de depire este descrcat prin pomparea ntregului su exces de ux prin muchiile
admisibile spre vrfurile adiacente, ridicnd u ct este necesar pentru a obine ca muchiile ce
pleac din u s devin admisibile. Pseudocodul este prezentat n continuare.
Descarc(u)
1: ct timp e [u] > 0 execut
2: v actual[u]
3: dac v =nil atunci
4: Ridic(u)
5: actual[u] cap[N[u]]
6: altfel
7: dac c
f
(u, v) > 0 i h[u] = h[v] + 1 atunci
8: Pompeaz(u, v)
9: altfel
10: actual[u] [v]
Figura 27.10 prezint parcurgerea ctorva iteraii ale ciclului ct timp din liniile 110 care
se execut ct timp vrful u are un exces pozitiv. Fiecare iteraie realizeaz exact una dintre cele
trei aciuni, depinznd de vrful actual v din lista de adiacen N[u].
1. Dac v este nil, atunci am trecut de ultimul element din N[u]. Linia 4 ridic vrful u i
atunci linia 5 reseteaz vrful adiacent actual al lui u pentru a primul din N[u]. (Lema
27.29 arm c n aceast situaie se aplic operaia de ridicare.)
2. Dac v nu este nil i (u, v) este o muchie admisibil (determinat de testul din linia 7),
atunci linia 8 pompeaz o parte (posibil i integral) din excesul lui u spre vrful v.
530 Capitolul 27 Flux maxim
Figura 27.10 Descrcarea unui vrf. Necesit 15 iteraii ale ciclului ct timp din Descarc pentru
a pompa tot excesul de ux din vrful y. Doar vecinii lui y i muchiile care intr n y sunt desenate. n
ecare component, numrul din interiorul ecrui vrf este excesul su de la nceputul ecrei iteraii
desenate n componenta respectiv i ecare vrf este desenat la nlimea componentei sale. La dreapta
este lista de adiacen N[y] la nceputul ecrei iteraii, cu numrul iteraiei sus. Vrful adiacent haurat
este actual[y]. (a) Iniial sunt de pompat 19 uniti de ux din y, iar actual[y] = s. Iteraiile 1, 2 i
3 doar l avanseaz pe actual[y], ntruct nu exist muchii admisibile ce pleac din y. n iteraia 4
actual[y] =nil (reprezentat haurat) i astfel y este ridicat, iar actual[y] este resetat la capul listei de
adiacen. (b) Dup ridicare vrful y are nlimea 1. n iteraiile 5, 6, muchiile (y, s) i (y, x) sunt
gsite a inadmisibile, dar 8 uniti de ux n exces sunt pompate din y n z n iteraia 7. Din cauza
pomprii, actual[y] nu este avansat n aceast iteraie. (c) Deoarece pomparea din iteraia 7 a saturat
muchia (y, z) ea este gsit inadmisibil n saturaia 8. n iteraia 9 actual[y] =nil i astfel vrful y este
din nou ridicat, iar actual[y] resetat. (d) n iteraia 10, (y, s) este inadmisibil, dar n iteraia 11 sunt
pompate 5 uniti de ux n exces din y n x. (e) Deoarece actual[y] nu a fost avansat n iteraia 11,
iteraia 12 gsete (y, x) inadmisibil. Iteraia 13 gsete (y, z) inadmisibil, iar iteraia 14 ridic vrful
y i reseteaz actual[y]. (f ) Iteraia 15 mpinge 6 uniti de ux n exces din y n s. (g) Vrful y nu mai
are exces de ux i Descarc se ncheie. n acest exemplu Descarc ncepe i se termin cu pointerul
curent la capul listei de adiacen, dar n general nu este cazul.
27.5. Algoritmul mutare-n-fa 531
3. Dac v nu este nil, dar (u, v) este inadmisibil, atunci linia 10 avanseaz actual[u] cu o
poziie mai departe n lista de adiacen N[u].
De remarcat c dac algoritmul Descarc este apelat pentru un vrf de depire u, atunci
ultima aciune realizat de Descarc trebuie s e o pompare din u. De ce? Procedura se
termin numai cnd e[u] devine zero i nici operaia de ridicare, nici avansarea pointerului
actual[u] nu afecteaz valoarea lui e[u].
Trebuie s ne asigurm de faptul c atunci cnd Pompeaz sau Ridic este apelat de ctre
Descarc, operaia se aplic. Urmtoarea lem va dovedi acest lucru.
532 Capitolul 27 Flux maxim
Lema 27.29 Dac Descarc apeleaz Pompeaz(u, v) n linia 8, atunci o operaie de pom-
pare se aplic lui (u, v). Dac Descarc apeleaz Ridic(u) n linia 4, atunci lui u i se aplic
o operaie de ridicare.
Demonstraie. Testele din liniile 1 i 7 asigur c o operaie de pompare apare numai dac
operaia se aplic, ceea ce demonstreaz prima armaie din lem.
Pentru a demonstra a doua armaie, conform testului din linia 1 i lemei 27.28, e nevoie
s artm doar c toate muchiile care pleac din u sunt inadmisibile. Se observ c pe msur
ce Descarc(u) este apelat repetat, pointerul actual[u] se mic n josul listei N[u]. Fiecare
trecere ncepe la capul lui N[u] i se termin cu actual[u] =nil, moment n care u este ridicat
i ncepe o nou trecere. Pentru ca pointerul actual[u] s avanseze dincolo de un vrf v N[u]
n timpul unei treceri, muchia (u, v) trebuie s e considerat inadmisibil de ctre testul din
linia 7. Astfel, n momentul n care trecerea se termin, ecare muchie plecnd din u a fost
determinat ca ind inadmisibil la un moment dat n timpul trecerii. Observaia cheie este
c la sfritul trecerii, ecare muchie care pleac din u este nc inadmisibil. De ce? Conform
lemei 27.27 a pomprii, nu pot crea nici o muchie admisibil, lsnd una singur ce pleac din u.
Astfel, orice muchie admisibil trebuie s e nti creat printr-o operaie de ridicare. Dar vrful
u nu este ridicat n timpul trecerii i din lema 27.28 nici un alt vrf v care este ridicat n timpul
trecerii nu are muchii admisibile ce intr n el. Astfel, la sfritul ecrei treceri toate muchiile
care pleac din u rmn inadmisibile, deci lema este demonstrat.
Algoritmul mutare-n-fa
n algoritmul mutare-n-fa gestionm o list nlnuit L, format din toate vrfurile din
V s, t. O proprietate cheie este c vrfurile din L sunt sortate topologic conform reelei
admisibile. (Amintim din lema 27.26 c reeaua admisibil este un graf orientat aciclic.)
Pseudocodul pentru algoritmul mutare-n-fa presupune c listele de adiacen N[u] au fost
deja create pentru ecare vrf u. El presupune i c [u] indic spre vrful care urmeaz lui
u n lista L i c [u] =nil dac u este ultimul vrf din list.
Mut-n-Fa(G, s, t)
1: Iniializeaz-Preflux(G, s)
2: L V [G] s, t, n orice ordine
3: pentru ecare vrf u V [G] s, t execut
4: actual[u] cap[N[u]]
5: u cap[L]
6: ct timp u =nil execut
7: h[u]
8: Descarc(u)
9: dac h[u] > atunci
10: mut u n capul listei L
11: u [u]
Algoritmul mutare-n-fa lucreaz dup cum urmeaz. Linia 1 iniializeaz preuxul i nl-
imile la aceleai valori la fel ca i algoritmul generic de preux. Linia 2 iniializeaz lista L astfel
nct s conin toate vrfurile poteniale de depire, n orice ordine. Liniile 34 iniializeaz
pointerul curent al ecrui vrf u spre primul vrf din lista de adiacen a lui u.
27.5. Algoritmul mutare-n-fa 533
Dup cum se arat n gura 27.11, ciclul ct timp din liniile 611 parcurge lista L, descr-
cnd vrfuri. Linia 5 ne asigur c parcurgerea ncepe cu primul vrf din list. De ecare dat
de-a lungul ciclului este descrcat un vrf u n linia 8. Dac u a fost ridicat de ctre procedu-
ra Descarc, linia 10 l mut n capul listei L. Aceast determinare este fcut prin salvarea
nlimii lui u n variabila nainte de operaia de descrcare (linia 7) i compa-
rarea acestei nlimi salvate cu nlimea lui u de dup aceea (linia 9). Linia 11 utilizeaz vrful
urmtor lui u din lista L pentru a face urmtoarea iterare a ciclului ct timp. Dac u a fost
mutat n capul listei, vrful folosit n urmtoarea iteraie este cel ce urmeaz lui u n noua sa
poziie din list.
Pentru a arta c Mut-n-fa calculeaz un ux maxim, vom arta c el este o
implementare a algoritmului generic de preux. Mai nti, se observ c el realizeaz numai
operaie de pompare i ridicare cnd ele se aplic, ntruct lema 27.29 garanteaz c Descarc
le realizeaz numai cnd ele se aplic. Rmne de artat c atunci cnd Mut-n-fa se
termin, nu se aplic nici o operaie de baz. Se observ c dac u ajunge la sfritul lui L,
ecare vrf din L (cu posibila excepie a primului vrf, care poate avea exces) trebuie descrcat
fr a produce o ridicare. Lema 27.30, pe care o vom demonstra imediat, arm c lista L este
gestionat ca o sortare topologic a reelei admisibile. Astfel, o operaie de pompare are ca efect
micarea uxului n exces spre vrfuri mai n josul listei (sau spre s sau t). Dac pointerul u
ajunge la sfritul listei, excesul ecrui vrf este 0 i nici una din operaiile de baz nu se aplic.
Lema 27.30 Dac executm Mut-n-fa pe o reea de transport G = (V, E) cu sursa s i
destinaia t, atunci ecare iteraie a ciclului ct timp din liniile 611 menine invariant faptul
c L este o sortare topologic a vrfurilor din reeaua admisibil G
f,h
= (V, E
f,h
).
Demonstraie. Imediat dup ce Iniializeaz-Preflux a fost executat, h[s] = [V [ i h[v] = 0
pentru oricare v V s. ntruct [V [ 2 (deoarece el l conine cel puin pe s i t), nici o
muchie nu poate admisibil. Astfel E
f,h
= i orice ordonare a lui V s, t este o sortare
topologic a lui G
f,h
.
Vom demonstra acum c invariantul este meninut prin ecare iteraie a ciclului ct timp.
Reeaua admisibil este schimbat numai prin operaii de pompare i ridicare. Conform lemei
27.27 operaiile de pompare produc numai muchii inadmisibile. Astfel, muchii admisibile pot
create numai prin operaii de ridicare. Dup ce un vrf este ridicat, totui, lema 27.28 arm c
nu exist muchii admisibile ce intr n u, dar pot exist muchii admisibile ce pleac din u. Astfel,
prin deplasarea lui u n capul listei L, algoritmul asigur c orice muchie admisibil plecnd din
u satisface ordonarea sortrii topologice.
Analiz
Vom arta acum c timpul de execuie a algoritmului Mut-n-fa este O(V
3
) pe orice
reea de transport G = (V, E). ntruct algoritmul este o implementare a algoritmului de preux,
vom folosi corolarul 27.21, care furnizeaz o margine O(V ) pentru numrul de operaii de
ridicare executate pentru ecare vrf i o margine O(V
2
) pentru numrul total de ridicri. n
plus, exerciiul 7.4-2 furnizeaz o margine O(V E) pentru timpul total consumat cu efectuarea
operaiilor de ridicare, iar lema 27.22 furnizeaz o margine O(V E) pentru numrul total de
operaii de pompare saturate.
534 Capitolul 27 Flux maxim
Figura 27.11 Aciunea algoritmului Mut-n-fa. (a) O reea de transport imediat nainte de prima
iteraie a ciclului ct timp. Iniial 26 de uniti de ux prsesc sursa s. La dreapta este dat lista
iniial, L = 'x, y, z) cu u = x. Sub ecare vrf din lista L este lista sa de adiacen, cu vecinul curent
colorat cu negru. Vrful x este descrcat. El este ridicat la nlimea 1, sunt pompate spre y 5 uniti
de ux, iar cele 7 uniti rmase n exces sunt pompate spre destinaia t. Deoarece x este ridicat, el
este mutat n capul lui L, care n cazul acesta nu schimb structura lui L. (b) Urmtorul vrf care este
descrcat este y deoarece el urmeaz n L dup x. Figura 27.10 arat aciunea detaliat a descrcrii
lui y n aceast situaie. Deoarece y este ridicat, el este mutat n capul lui L. (c) Vrful x i urmeaz
acum lui y n L i astfel el este din nou descrcat, pompnd toate cele 5 uniti de ux n exces spre
t. Deoarece vrful x nu este ridicat n aceast operaie de descrcare, el rmne pe loc n lista L. (d)
ntruct vrful z urmeaz dup vrful x n L, el este descrcat. El este ridicat la nlimea 1 i toate cele
8 uniti de ux n exces sunt pompate spre t. Deoarece z este ridicat, el este mutat n capul listei L.
(e) Vrful y i urmeaz acum lui z n L i de aceea el este din nou descrcat. Deoarece y nu are exces,
Descarc se ntoarce imediat i y rmne pe loc n L. Vrful x este apoi descrcat. Deoarece nici el nu
are exces, Descarc se ntoarce din nou i x rmne pe loc n L. Mut-n-fa a atins sfritul listei
L i se termin. Nu mai exist vrfuri cu depire i preuxul este un ux maxim.
27.5. Algoritmul mutare-n-fa 535
Teorema 27.31 Timpul de execuie al algoritmului Mut-n-fa pe orice reea de transport
G = (V, E) este O(V
3
).
Demonstraie. S considerm o faz a algoritmului mutare-n-fa ca ind durata dintre dou
operaii consecutive de ridicare. Exist O(V
2
) faze, deoarece sunt O(V
2
) operaii de ridicare.
Fiecare faz const din cel mult [V [ apelri ale procedurii Descarc, dup cum urmeaz. Dac
Descarc nu realizeaz o operaie de ridicare, urmtorul apel al procedurii Descarc este mai
n josul listei L i lungimea lui L este mai mic dect [V [. Dac Descarc realizeaz o ridicare,
urmtoarea apelare a lui Descarc aparine unei faze diferite. Deoarece ecare faz conine
cel mult [V [ apelri ale lui Descarc i sunt O(V
2
) faze, numrul de apeluri ale procedurii
Descarc n linia 8 din procedura Mut-n-fa este O(V
3
). Astfel, lucrul total realizat de
ciclul ct timp n Mut-n-fa, excluznd cel realizat n Descarc, este cel mult O(V
3
).
Trebuie acum s evalum volumul de calcul realizat de Descarc n timpul execuiei
algoritmului. Fiecare iteraie a ciclului ct timp din Descarc realizeaz una dintre trei aciuni.
Vom analiza volumul total de calcul realizat de ecare dintre aceste aciuni.
ncepem cu operaiile de ridicare (liniile 45). Exerciiul 27.4-2 furnizeaz o margine a
timpului O(V E) pentru toate cele O(V
2
) ridicri care sunt executate.
S presupunem acum c aciunea actualizeaz pointerul actual[u] din linia 8. Aceast aciune
se produce de O(grad(u)) ori de cte ori un vrf u este ridicat i de O(V grad (u)) ori global
pentru acel vrf. Deci, pentru toate vrfurile, volumul total de calcul necesar pentru avansarea
pointerilor n lista de adiacen este O(V E) conform lemei strngerii de mn (exercitiul 5.4-1).
Al treilea tip de aciune realizat de Descarc este o operaie de pompare (linia 7). tim deja
c numrul total de operaii de pompare saturate este O(V E). Se observ c dac este executat
o pompare nesaturat, Descarc se termin imediat, ntruct pomparea reduce excesul la 0.
Astfel, exist cel mult o pompare nesaturant pentru ecare apel al procedurii Descarc. Dup
cum am observat, Descarc este apelat de O(V
3
) ori i astfel timpul total consumat realiznd
pompri nesaturate este O(V
3
).
Timpul de execuie al algoritmului Mut-n-fa este deci O(V
3
+V E), care este O(V
3
).
536 Capitolul 27 Flux maxim
Exerciii
27.5-1 Ilustrai execuia algoritmului Mut-n-fa n stilul gurii 27.11 pentru reeaua
de transport din gura 27.1(a). Presupunei c ordinea iniial a vrfurilor n lista L este
'v
1
, v
2
, v
3
, v
4
` i c listele de adiacen sunt
N[v
1
] = 's, v
2
, v
3
` ,
N[v
2
] = 's, v
1
, v
3
, v
4
` ,
N[v
3
] = 'v
1
, v
2
, v
4
, t` ,
N[v
4
] = 'v
2
, v
3
, t` .
27.5-2 Dorim s implementm un algoritm de preux n care gestionm o structur de tip
coad de vrfuri de depire. Algoritmul descarc repetat vrful din capul cozii i oricare vrfuri,
care nu sunt de depire nainte de descrcare, dar sunt de depire dup aceea, sunt plasate
la sfritul cozii. Dup ce vrful din capul cozii este descrcat, el este eliminat. Cnd coada se
golete, algoritmul se termin. Artai c acest algoritm poate implementat s calculeze un
ux maxim n timpul O(V
3
).
27.5-3 Artai c algoritmul generic funcioneaz i dac Ridic actualizeaz h[u] calculnd
simplu h[u] h[u] + 1. Cum afecteaz aceast schimbare analiza lui Mut-n-fa?
27.5-4 Demonstrai c dac descrcm ntotdeauna un cel mai nalt vrf de depire, metoda
preuxului poate fcut s se execute n timpul O(V
3
).
Probleme
27-1 Problema evadrii
O reea n n este un graf neorientat format din n linii i n coloane de vrfuri, conform gurii
27.12. Notm vrful din al i-lea rnd i a j-a coloan prin (i, j). Toate vrfurile dintr-o reea au
exact patru vecini, cu excepia vrfurilor marginale, care sunt punctele (i, j) pentru care i = 1,
i = n, j = 1 sau j = n.
Fiind date m n
2
puncte de plecare (x
1
, y
1
), (x
2
, y
2
),. . . , (x
m
, y
m
) pe reea, problema
evadrii const n a determina dac exist sau nu drumuri disjuncte compuse din cte m vrfuri
din punctele de plecare spre oricare m puncte diferite de pe frontier. De exemplu, reeaua din
gura 27.12(a) are o evadare, dar reeaua din gura 27.12(b) nu are nici una.
a. S considerm o reea de transport n care vrfurile, la fel ca i muchiile, au asociate
capaciti. Adic uxul pozitiv al reelei care intr n orice vrf dat este constrns la o
capacitate. Artai c determinarea uxului maxim ntr-o reea cu muchii i vrfuri avnd
asociate capaciti poate redus la o problem obinuit de ux maxim pe o reea de
transport de mrime comparabil.
b. Descriei un algoritm ecient pentru rezolvarea problemei evadrii i analizai timpul su
de execuie.
Probleme 537
Figura 27.12 Reele pentru problema evadrii. Punctele de plecare sunt negre, iar celelalte vrfuri
ale reelei sunt albe. (a) O reea cu o evadare, schiat prin drumuri nnegrite. (b) O reea fr nici o
evadare.
27-2 Acoperire cu drumuri minime
O acoperire cu drumuri a unui graf orientat G = (V, E) este o mulime P de drumuri disjuncte
astfel nct ecare vrf din V este inclus n exact un drum din P. Drumurile pot ncepe i se pot
termina oriunde i pot avea orice lungime, inclusiv 0. O acoperire cu drumuri minime a lui
G este o acoperire de drumuri ce conine ct mai puine drumuri posibile.
a. Realizai un algoritm ecient pentru gsirea unei acoperiri cu drumuri minime a unui graf
orientat aciclic G = (V, E). ( Presupunnd c V = 1, 2, . . . , n, construii un
graf G
t
= (V
t
, E
t
), pentru care
V
t
= x
0
, x
1
, . . . , x
n
y
0
, y
1
, . . . , y
n
,
E
t
= (x
0
, x
i
) : i V (y
i
, y
0
) : i V (x
i
, y
j
) : (i, j) E ,
i aplicai un algoritm de ux maxim.)
b. Funcioneaz algoritmul creat i pe grafuri orientate care conin cicluri? Argumentai.
27-3 Experimentele navetei spaiale
Profesorul Spock este consultant la NASA, unde se planic o serie de zboruri ale navetei spaiale
i trebuie s se decid ce experimente comerciale s realizeze i ce instrumente s aib la bord
ecare zbor. Pentru ecare zbor, NASA ia n considerare o mulime E = E
1
, E
2
, . . . , E
m
de
experimente, iar sponsorul experimentului comercial E
j
a fost de acord s plteasc p
j
dolari
pentru rezultatele acestui experiment. Experimentele utilizeaz o mulime I = I
1
, I
2
, . . . , I
n

de instrumente; ecare experiment E


j
necesit toate instrumentele dintr-o submulime R
j
I.
Costul transportrii instrumentului I
k
este c
k
dolari. Rolul profesorului este de a gsi un algoritm
ecient care s determine ce experimente s se realizeze i care instrumente s e transportate
de un anumit zbor, cu scopul de a mri venitul net la maximum, care este venitul total rezultat
din experimente minus costul total al instrumentelor transportate.
S considerm urmtoarea reea G. Reeaua conine un vrf surs s, vrfurile I
1
, I
2
, . . . , I
n
,
vrfurile E
1
, E
2
, . . . , E
m
i un vrf de destinaie t. Pentru k = 1, 2 . . . , n, exist o muchie (s, I
k
)
de capacitate c
k
, iar pentru j = 1, 2, . . . , m exist o muchie (E
j
, t) de capacitate p
j
. Pentru
538 Capitolul 27 Flux maxim
k = 1, 2 . . . , n i j = 1, 2, . . . , m, dac I
k
R
j
, atunci exist o muchie (I
k
, E
j
) de capacitate
innit.
a. Artai c dac E
j
T pentru o tietur de capacitate nit (S, T) a lui G, atunci I
k
T
pentru orice I
k
R
j
.
b. Artai cum se determin ctigul net maxim a lui NASA pe baza capacitii tieturii
minime a lui G i valorilor date p
j
.
c. Construii un algoritm ecient pentru a determina care experimente s e realizate i care
instrumente s e transportate. Analizai timpul de execuie al algoritmului construit n
termenii m, n i r =

m
j=1
[R
j
[.
27-4 Actualizarea uxului maxim
Fie G = (V, E) o reea de transport cu sursa s, destinaia t i capaciti numere ntregi. S
presupunem c este dat un ux maxim n G.
a. Presupunem c se mrete cu 1 capacitatea unei singure muchii (u, v) E. Realizai un
algoritm cu timp de execuie O(V +E) pentru a actualiza uxul maxim.
b. Presupunem c se micoreaz cu 1 capacitatea unei singure muchii (u, v) E. Realizai
un algoritm cu timp de execuie O(V +E) pentru a actualiza uxul maxim.
27-5 Fluxul maxim prin scalare
Fie G = (V, E) o reea de transport cu sursa s, destinaia t i o capacitate numr intreg c (u, v)
pe ecare muchie (u, v) E. Fie C = max
(u,v)E
c (u, v).
a. Artai c o taietur minim a lui G are cel mult capacitatea C [E[ .
b. Pentru un numr dat K, artai c un drum de ameliorare de capacitate cel puin egal
cu K poate gsit n timp O(E), dac exist un astfel de drum.
Urmtoarea modicare a algoritmului Metoda-Ford-Fulkerson poate utilizat s cal-
culeze un ux maxim n G.
Flux-Maxim-Prin-Scalare(G, s, t)
1: C max
(u,v)E
c (u, v)
2: iniializeaz uxul f cu 0
3: K 2
|lg C|
4: ct timp K 1 execut
5: ct timp exist un drum de ameliorare p de capacitate cel puin K execut
6: mrete uxul f de-a lungul lui p
7: K K/2
8: returneaz f
c. Argumentai c Flux-Maxim-prin-Scalare returneaz uxul maxim.
d. Artai c valoarea capacitii reziduale a unei tieturi minime a grafului rezidual G
f
este
cel mult 2K[E[ de ecare dat cnd este executat linia 4.
Note bibliograce 539
e. Argumentai c ciclul interior ct timp din liniile 56 este executat de O(E) ori pentru
ecare valoare a lui K.
f. Demonstrai c Flux-Maxim-prin-Scalare poate implementat s se execute n timpul
O

E
2
lg C

.
27-6 Fluxul maxim cu restricii de capacitate superioar i inferioar
S presupunem c ecare muchie (u, v) dintr-o reea de transport G = (V, E) nu are numai o
margine superioar c(u, v) pentru uxul de la u la v, ci i o margine inferioar b(u, v). Adic
orice ux f n reea trebuie s satisfac b(u, v) f(u, v) c(u, v). Este posibil ca ntr-o astfel
de reea s nu existe nici un ux.
a. Demonstrai c dac f este un ux n G, atunci [f[ c (S, T) b (T, S) pentru orice
tietur (S, T) a lui G.
b. Demonstrai c valoarea unui ux maxim n reea, dac exist, este valoarea minim a lui
c (S, T) b (T, S) pe toate tieturile (S, T) din reea.
Fie G = (V, E) o reea de transport cu funciile de capacitate superioar i inferioar c
i b i e s i t sursa i respectiv destinaia lui G. Construii reeaua obinuit de ux
G
t
= (V
t
, E
t
) cu funcia de capacitate superioar c
t
, sursa s
t
i destinaia t
t
dup cum
urmeaz:
V
t
= V s
t
, t
t
,
E
t
= E (s
t
, v) : v V (u, t
t
) : u V (s, t) , (t, s) .
Atribuim capaciti muchiilor dup cum urmeaz. Pentru ecare muchie (u, v) E
atribuim c
t
(u, v) = c(u, v) b(u, v). Pentru ecare vrf u V , atribuim c
t
(s
t
, u) = b(V, u)
i c
t
(u, t
t
) = b(u, V ). De asemenea, vom avea i c
t
(s, t) = c
t
(t, s) = .
c. Demonstrai c exist un ux n G dac i numai dac exist un ux maxim n G
t
, astfel
nct toate muchiile ctre destinaia t
t
sunt saturate.
d. Realizai un algoritm care s gseasc un ux maxim ntr-o reea cu capacitate superioar
i inferioar sau demonstrai c nu exist nici un ux. Analizai timpul de execuie al
algoritmului construit.
Note bibliograce
Referine bune pentru reele de transport i algoritmi relativ la reele de transport sunt Even
[65], Lawler [132], Papadimitriou i Steiglitz [154] i Tarjan [188]. Goldberg, Tardos i Tarjan
[83] realizeaz o bun analiz a algoritmilor pentru probleme cu reele de ux.
Metoda Ford-Fulkerson se datoreaz lui Ford i Fulkerson [71], care au construit multe
probleme n domeniul reelelor de transport, inclusiv problemele uxului maxim i a cuplajului
bipartit. Multe din implementrile mai vechi ale metodei Ford-Fulkerson au gsit drumul de
ameliorare folosind cutarea n lime; Edmonds i Karp [63] au demonstrat c aceast strategie
540 Capitolul 27 Flux maxim
duce la un algoritm n timp polinomial. Karzanov [119] a dezvoltat ideea preuxurilor. Metoda
preuxului se datoreaz lui Goldberg [82]. Cel mai rapid algoritm de preux la ora actual este
realizat de Goldberg i Tarjan [85], care au atins timpul de execuie O

V E lg

V
2
/E

. Cel mai
bun algoritm n prezent pentru cuplajul bipartit maxim, descoperit de Hopcroft i Karp [101],
se execut n timpul O

V E

.
VII Capitole speciale
Introducere
n aceast parte, sunt prezentate probleme speciale de algoritmi care extind i completeaz
materialul tratat pn acum n carte. Astfel, unele capitole introduc modele noi de calcul, cum
ar circuite combinatoriale i calculatoare paralele, altele acoper domenii speciale, cum ar
geometria computaional sau teoria numerelor. Ultimele dou capitole pun n discuie cteva
dintre limitele cunoscute ale proiectrii algoritmilor ecieni i introduc tehnici care trateaz
aceste limite.
n capitolul 28, se prezint primul nostru model de calcul paralel: reelele de comparare.
ntr-o formulare mai puin precis, se poate spune c o reea de comparare este un algoritm care
ne permite s efectum mai multe comparaii simultan. n acest capitol, se arat cum se poate
realiza o astfel de reea de comparare, care sorteaz n numere n O(lg
2
n) uniti de timp.
n capitolul 29, se introduce un alt model de calcul paralel: circuite combinatoriale. n acest
capitol se arat cum se pot aduna dou numere de cte n bii n O(lg n) uniti de timp, cu
ajutorul unui circuit combinatorial. Deasemenea acelai model ne arat cum se nmulesc dou
numere de cte n bii n O(lg n) uniti de timp.
n capitolul 30, se introduce un model general de calcul paralel, numit model PRAM.
Capitolul prezint tehnicile paralele de baz, incluznd saltul de pointeri, calculul prexului
i tehnica turului Euler. Majoritatea tehnicilor sunt ilustrate pe structuri de date simple,
incluznd liste i arbori. Capitolul trateaz, de asemenea, problemele generale ale calculului
paralel, incluznd att eciena lucrului cu memorie partajat ct i a accesului concurent la
acesta. Se demonstreaz teorema lui Brent, care ne arat cum poate simulat, ecient, un circuit
combinatorial de un calculator paralel. Capitolul se termin cu un algoritm aleator ecient pentru
list ranking i cu un algoritm deterministic cu o ecien remarcabil pentru ruperea simetriei
ntr-o list.
n capitolul 31, se studiaz eciena algoritmilor de calcul matriceal. Se ncepe cu algoritmul
lui Strassen, care poate nmuli dou matrice de dimeniune n n n O(n
2,81
) uniti de timp.
Se prezint apoi dou metode generale descompunerea LU i descompunerea LUP pentru
rezolvarea sistemelor de ecuaii liniare, prin metoda de eliminare a lui Gauss n O(n
3
) uniti
de timp. Se va arta c metoda lui Strassen poate conduce la algoritmi mai rapizi, pentru
rezolvarea sistemelor liniare, i, de asemenea, c inversarea matricilor i produsul matricilor se
pot realiza la fel de repede asimptotic. La sfritul capitolului, se arat cum se poate obine o
soluie aproximativ cu ajutorul metodei celor mai mici ptrate, atunci cnd sistemul de ecuaii
nu are soluie exact.
n capitolul 32, se studiaz operaiile cu polinoame, i prezint cum, o bine cunoscut
metod pentru prelucrarea semnalelor transformata Fourier rapid (TFR) poate utilizat
la nmulirea a dou polinoame de grad n n O(nlg n) uniti de timp. Se studiaz, de asemenea,
implementrile eciente ale metodei TFR, inclusiv un circuit paralel.
n capitolul 33, se prezint algoritmi din teoria numerelor. Dup o scurt trecere n revist a
rezultatelor teoriei elementare a numerelor, se prezint algoritmul lui Euclid pentru calculul celui
mai mare divizor comun. Apoi, sunt prezentate metode de rezolvare a sistemelor de congruene
liniare i metode de ridicare la putere modulo n. Se prezint, apoi, un rezultat interesant al
teoriei numerelor: criptosistemul RSA cu cheie public. Acest criptosistem nu numai c permite
cifrarea textelor, dar este capabil s realizeze i semnturi digitale. Capitolul trateaz, apoi,
testul aleator de primalitate de tip Miller-Rabin, care poate utilizat pentru a obine, ntr-un
Introducere 543
mod ecient, numere prime mari cerin esenial n sistemul RSA. La sfritul capitolului, se
prezint algoritmul euristic rho al lui Pollard pentru factorizarea ntregilor i toat problematica
factorizrii ntregilor.
n capitolul 34, se studiaz problema gsirii tuturor apariiilor unei secvene de caractere ntr-
un text, problem frecvent n editarea textelor. Se ncepe cu o abordare elegant datorat lui
Rabin i Carp. Apoi, dup examinarea unei soluii eciente bazat pe automate nite, se trece la
prezentarea algoritmului Knuth-Morris-Pratt, care gsete soluia ecient printr-o preprocesare
inteligent a secvenei ale crei apariii se caut. Capitolul se ncheie cu prezentarea algoritmului
euristic Boyer-Moore pentru rezolvarea acestei probleme.
Tema capitolului 35 este geometria computaional. Dup discutarea problemelor de baz
ale geometriei computaionale, se prezint o metod de baleiere cu ajutorul creia se poate
determina, ecient, dac o mulime de segmente de linii conine sau nu, segmente care se
intersecteaz. Puterea algoritmului de baleiere este ilustrat i de doi algoritmi ecieni
elaborai de Graham i Jarvis pentru gsirea nfurtorii convexe a unei mulimi de puncte.
La sfritul capitolului, se prezint un algoritm ecient pentru gsirea perechii de puncte cele
mai apropiate dintr-o mulime de puncte n plan.
Capitolul 36 este dedicat problemelor NP-complete. Multe probleme computaionale sunt
NP-complete i, deci, nu se cunosc algoritmi polinomiali pentru rezolvarea lor. Sunt prezentate
tehnici pentru a aa dac o problem este NP-complet sau nu. Multe probleme clasice sunt NP-
complete: determinarea dac un graf conine un ciclu hamiltonian, determinarea dac o formul
boolean este satisabil, i determinarea dac ntr-o mulime de numere exist o submulime
astfel nct suma elementelor submulimii s e egal cu o valoare dat. n acest capitol se
demonstreaz, de asemenea, c faimoasa problem a comis-voiajorului este NP-complet.
n capitolul 37, se arat cum pot utilizai ntr-un mod ecient algoritmii de aproximare,
pentru a gsi soluii aproape optime. Pentru multe probleme NP-complete exist soluii
aproximative (aproape optime), relativ uor de obinut. Pentru alte probleme, chiar cei mai buni
algoritmi de aproximare cunoscui au randament din ce n ce mai sczut o dat cu creterea
dimensiunilor datelor problemei. Sunt i probleme la care, cu ct timpul de rezolvare crete,
obinem soluii aproximative din ce n mai bune. Capitolul de fa ilustreaz astfel de posibiliti
pentru problema mulimii exterior stabile, a comis-voiajorului, a acoperirii cu mulimi i a
submulimilor de sum dat.
28 Reele de sortare
n partea a II-a a crii, am studiat algoritmii de sortare pentru calculatoare seriale (RAM
adic random access machine) care permit executarea, la un moment dat, numai a unei singure
operaii. n acest capitol, vom investiga algoritmii de sortare bazai pe modelul de calcul al
reelelor de comparare, n care se pot efectua simultan mai multe operaii de comparare.
Reelele de comparare difer de calculatoarele RAM n dou aspecte eseniale. n primul
rnd, ele pot efectua numai comparaii. Astfel, un algoritm cum ar sortarea prin numrare
(vezi seciunea 9.2) nu se poate realiza cu ajutorul reelelor de comparare. n al doilea rnd, spre
deosebire de calculatoarele RAM, unde operaiile sunt efectuate secvenial adic una dupa
alta , n reele de comparare operaiile pot efectuate simultan, adic n paralel. Aa cum
vom vedea mai trziu, aceast caracteristic ne permite realizarea unor reele de comparare care
sorteaz n valori ntr-un timp subliniar.
n seciunea 28.1, denim reelele de comparare i reelele de sortare. Vom da, de asemenea, o
deniie natural a timpului de execuie n cazul reelelor de comparare, n funcie de adncimea
reelei. n seciunea 28.2, se demonstreaz principiul zero-unu, care ne va uura mult analiza
corectitudinii reelelor de sortare.
Reeaua ecient de sortare pe care o vom proiecta, este, de fapt, o variant paralel a
algoritmului de sortare prin interclasare, studiat n seciunea 1.3.1. Construcia reelei se va
realiza n trei pai. Seciunea 28.3 prezint proiectarea aa-numitului algoritm de sortare bitonic,
care va celula de baz n construcia reelei de sortare. Modicm acest algoritm n seciunea
28.4 ca s poat interclasa dou secvene ordonate ntr-o singur secven ordonat. n nal, n
seciunea 28.5, vom asambla aceste reele de interclasare ntr-o reea de sortare, care sorteaz n
elemente n O(lg
2
n) uniti de timp.
28.1. Reele de comparare
Reelele de sortare sunt reele de comparare care, ntotdeauna, i sorteaz datele se intrare,
deci are sens s ncepem discuia noastr cu reelele de comparare i caracteristicile lor. O reea
de comparare este compus numai din re i comparatori. Un comparator, cum este prezentat
n gura 28.1(a), este un aparat cu dou intrri, x i y, i dou ieiri, x
t
i y
t
, care realizeaz
urmtoarea funcie:
x
t
= min(x, y),
y
t
= max(x, y).
n loc de reprezentarea unui comparator, dat n gura 28.1(a), vom folosi una mai simpl,
adoptnd convenia ca, n loc de comparator, s desenm, pur i simplu, o bar vertical, ca n
gura 28.1(b). Intrrile se a n partea stng, ieirile n partea dreapt cu precizarea c, la
ieire, valoarea mai mic se a n partea de sus, iar cea mai mare n partea de jos. Comparatorul
poate privit ca un aparat care sorteaz cele dou intrri ale sale.
28.1. Reele de comparare 545
Figura 28.1 (a) Un comparator cu dou intrri, x i y, i dou ieiri, x

i y

. (b) Acelai comparator


desenat ca o simpl bar vertical. Intrri: x = 7, y = 3, ieiri: x

= 3, y

= 7.
Vom presupune c ecare comparator opereaz n O(1) uniti de timp. Cu alte cuvinte,
presupunem c timpul scurs de la apariia intrrilor x i y pn la producerea ieirilor x
t
i y
t
este constant.
Un r transmite informaii dintr-un loc ntr-altul. Firele de ieire ale unui comparator pot
legate la intrrile unui alt comparator, n rest, rele sunt sau re de intrare n reea, sau re
de ieire din reea. n tot acest capitol, presupunem c o reea de comparare conine n re de
intrare, notate cu a
1
, a
2
, . . . , a
n
, prin care datele de sortat intr n reea, i n re de ieire,
notate cu b
1
, b
2
, . . . , b
n
, prin care sunt furnizate datele rezultat. De asemena se poate vorbi de
secvena de intrare 'a
1
, a
2
, . . . , a
n
` i de secvena de ieire 'b
1
, b
2
, . . . , b
n
` care sunt valorile
ataate relor de intrare, respectiv de ieire. Deci nu facem deosebire ntre re i valorile relor,
ceea ce nu va conduce ns la nici o confuzie.
n gura 28.2 se poate vedea o reea de comparare, const dintr-o mulime de comparatori
interconectai prin re. Reprezentm o reea de comparare cu n intrri prin n linii orizontale,
dintre care unele sunt unite prin bare verticale, reprezentnd comparatorii. S remarcm c
o linie este un singur r, ci mai degrab o secven de re distincte, care leag diferii
comparatori. De exemplu, linia de sus, n gura 28.2, reprezint trei re: rul de intrare a
1
,
care este legat la o intrare a comparatorului A; rul care leag ieirea de sus a comparatorului
A cu o intrare a comparatorului C; i, n ne, rul de ieire b
1
, care reprezint ieirea de sus
a comparatorului C. Fiecare intrare a unui comparator este legat la un r care, e este unul
din cele n re de intrare a
1
, a
2
, . . . , a
n
ale reelei de comparare, e este conectat la una dintre
ieirele unui alt comparator. n mod similar, ecare ieire a unui comparator este legat la un
r care, e este unul din cele n re de ieire b
1
, b
2
, . . . , b
n
ale reelei, e este conectat la una
dintre intrrile unui alt comparator. Cerina principal, la interconectarea comparatorilor, este
ca graful interconexiunilor s e aciclic: respectiv, dac pornim de la ieirea unui comparator
i ajungem la intrarea unui alt comparator, trecnd prin alte ieiri i intrri, nu putem ajunge
niciodat napoi de unde am pornit i nu putem trece niciodat prin acelai comparator de dou
ori. Astfel se poate desena o reea de comparare, ca n gura 28.2, cu intrrile la stnga i ieirele
la dreapta, datele micndu-se de la stnga la dreapta.
Fiecare comparator produce valoarea sa de ieire n momentul n care are la dispoziie ambele
intrri. n gura 28.2(a), de exemplu, presupunem c, n momentul 0, apare la intrare secvena
'9, 5, 2, 6`. n momentul 0, numai comparatorii A i B dispun de intrarea lor. Presupunnd c
ecare comparator necesit o unitate de timp pentru producerea ieirii, comparatorii A i B
produc ieirile lor n momentul 1; rezultatul se poate vedea n gura 28.2(b)). S observm c
ieirile comparatorilor A i B sunt produse n paralel. n momentul 1, comparatorii C, D au la
dispoziie intrrile lor, dar E nc nu. Un moment mai trziu, aceti comparatori produc ieirile
lor, cum se vede n gura 28.2(c). Comparatorii C i D lucreaz, de asemenea, n paralel. Ieirea
de sus a comparatorului C i cea de jos a comparatorului D sunt conectate la ieirile b
1
, respectiv,
546 Capitolul 28 Reele de sortare
Figura 28.2 (a) O reea de comparare cu 4 intrri i 4 ieiri, care este de fapt o reea de sortare. La
momentul 0, datele de intrare sunt scrise pe cele patru re de intrare. (b) n momentul 1, datele scrise
pe re sunt ieirile comparatorilor A i B, care se gsesc la adncimea 1. (c) n momentul 2, datele
scrise pe re sunt ieirile comparatorilor C i D, care sunt la adncimea 2. Firele de ieire b
1
i b
4
au
deja valorile lor nale, pe cnd rele b
2
i b
3
nc nu. (d) n momentul 3, datele scrise pe re sunt ieirile
comparatorului E de adncime 3. Pe rele de ieire b
2
i b
3
se a deja valorile lor nale.
b
4
ale reelei de comparare, i, ca atare, acestea au valoarea lor nal n momentul 2. ntre timp
comparatorul E, avnd la dispoziie intrrile lui, produce n momentul 3 ieirile corespunztoare,
cum se poate vedea n gura 28.2(d). Aceste valori vor ieirile b
2
i b
3
ale reelei de comparare
i, astfel, se obine secvena complet de ieire '2, 5, 6, 9`.
Presupunnd c ecare comparator, pentru a produce ieirile sale, are nevoie de o unitate
de timp, se poate deni timpul de execuie al reelei de comparare ca ind timpul necesar
producerii tuturor ieirilor din momentul n care datele iniiale sunt pe rele de intrare. Acest
timp, este de fapt, numrul maxim de comparatori prin care o valoare de la un r de intrare
trebuie s treac ca s ajung la un r de ieire. Mai precis, se poate deni adncimea unui
r dup cum urmeaz. Un r de intrare al unei reele de comparare are adncimea 0. Dac
un comparator are dou re de intrare cu adncimea d
x
, respectiv, d
y
, atunci rele sale de
ieire au adncimea max(d
x
, d
y
) + 1. Pentru c ntr-o reea de comparare nu exist cicluri,
adncimea ecrui r este precis denit, i vom deni adncimea unui comparator ca ind egal
cu adncimea relor sale de ieire. Figura 28.2 ilustreaz adncimea comparatorilor. Adncimea
unei reele de comparare este adncimea maxim a unui r de ieire sau, altfel spus, adncimea
maxim a unui comparator din reea. De exemplu, reeaua de comparare din gura 28.2 are
adncimea 3, deoarece comparatorul E are adncimea 3. Dac ecare comparator are nevoie
de o unitate de timp pentru producerea ieirilor, i intrrile unei reele de comparare apar n
28.1. Reele de comparare 547
Figura 28.3 O reea de sortare bazat pe metode de sortare prin inserare pentru a folosit n
exerciiul 28.1-6.
momentul 0, reeaua de comparare cu adncimea d are nevoie de d uniti de timp pentru
a produce toate ieirile sale. Adncimea unei reele de comparare este, deci, egal cu timpul
necesar producerii tuturor valorilor pe toate rele de ieire.
O reea de sortare este o reea de comparare care produce, la ieire, secvene monoton
cresctoare (adic, b
1
b
2
. . . b
n
) pentru secven de intrare. Evident, nu orice reea
de comparare este i reea de sortare, dar reeaua din gura 28.2 este. Pentru a demonstra de ce
este aa, s observm c, dup o unitate de timp, minimul celor patru valori va e la ieirea de
sus a comparatorului A, e la ieirea de sus a comparatorului B. Dup 2 uniti de timp, acest
minim va la ieirea de sus a comparatorului C. Un argument similar ne arat c maximul celor
patru valori, dup 2 uniti de timp, ajunge la ieirea de jos a comparatorului D. Comparatorul
E asigur ca cele dou valori de mijloc s ajung n poziia lor corect, dup momentul 3.
O reea de comparare seamn cu o procedur n care se specic cum se fac comparrile,
dar nu seamn cu o procedur n care dimensiunea ei (numrul comparatorilor) depinde de
numrul intrrilor i ieirilor. De aceea vom descrie familii de reele de comparare. n acest
capitol vom dezvolta o familie Sortator, a reelelor de sortare eciente. n cadrul unei familii
o anumit reea va denumit dup numele familiei i numrul relor de intrare (care ce este
egal cu numrul relor de ieire). De exemplu, o reea cu n intrri i n ieiri n famila Sortator
se va numi Sortator[n].
Exerciii
28.1-1 Artai ce valori apar pe toate rele reelei din gura 28.2 dac la intrare se d secvena
'9, 6, 5, 2`.
28.1-2 Fie n o putere a lui 2. Artai cum se poate construi o reea de comparare cu n intrri
i n ieiri de adncime lg n, n care ieirea de sus s conin totdeaunea valoarea minim, iar
ieirea de jos totdeaunea valoarea maxim.
28.1-3 Profesorul Nielsen arm c, dac inserm un comparator oriunde ntr-o reea de sortare,
reeaua obinut va sorta corect orice secven de intrare. Artai c, insernd un comparator
n reeaua din gura 28.2, profesorul greete, pentru c reeaua obinut nu mai sorteaz corect
orice permutare a intrrii.
28.1-4 Artai c orice reea de sortare cu n intrri are adncimea cel puin lg n.
548 Capitolul 28 Reele de sortare
28.1-5 Artai c numrul de comparri n orice reea de sortare este (nlg n).
28.1-6 Demonstrai c reeaua de comparare din gura 28.3 este, de fapt, o reea de sortare.
S se arate n ce msur structura acestei reele seamn cu cea a algoritmului de sortare prin
inserare (seciunea 1.1).
28.1-7 O reea de comparare cu n intrri i c comparatori se poate reprezenta printr-o list
de c perechi de numere ntregi de la 1 la n. Dac dou perechi au un numr n comun, ordinea
comparatorilor respectivi n reea se poate determina prin ordinea perechilor n list. Pornind
de la aceast reprezentare, descriei un algoritm (secvenial) de complexitate O(n + c) pentru
determinarea adncimii reelei de comparare.
28.1-8 S presupunem c, pe lng comparatorii standard, folosim i comparatori inversai,
adic comparatori la care valoarea minim apare pe rul de jos, i cea maxim pe rul de
sus. Artai cum se poate converti o reea de sortare care folosete c comparatori standard i
inversai ntr-o reea de sortare care folosete numai c comparatori standard. Artai c metoda
de conversie gsit este corect.
28.2. Principiul zero-unu
Principiul zero-unu exprim faptul c, dac o reea de sortare funcioneaz corect pentru
intrri din mulimea 0, 1, atunci, funcioneaz corect pentru orice numere de intrare. (Numerele
de intrare pot numere ntregi, reale, sau, n general, orice numere dintr-o mulime ordonat
liniar.) Principiul zero-unu ne permite ca, la construcia reelelor de sortare i a altor reele de
comparare, s ne concentrm atenia numai asupra operaiilor care se execut cu numerele 0 i
1. Dup ce am construit o reea care sorteaz corect orice secven de 0 i 1, pe baza principiului
zero-unu, putem arma c ea sorteaz, corect, orice secven de intrare.
Demonstraia principiului zero-unu se bazeaz pe noiunea de funcie monoton cresctoare
(seciunea 2.2).
Lema 28.1 Dac o reea de comparare transform secvena de intrare a = 'a
1
, a
2
, . . . , a
n
`
n secvena de ieire b = 'b
1
, b
2
, . . . , b
n
`, atunci, pentru orice funcie f monoton cresctoare,
reeaua va transforma secvena de intrare f(a) = 'f(a
1
), f(a
2
), . . . , f(a
n
)` n secvena de ieire
f(b) = 'f(b
1
), f(b
2
), . . . , f(b
n
)`.
Demonstraie. La nceput vom demonstra c dac f este o funcie monoton cresctoare, atunci
un singur comparator cu intrrile f(x) i f(y) ne va da ca rezultat f(min(x, y)) i f(max(x, y)).
Dup aceasta, lema se va demonstra folosind inducia matematic.
Pentru a demonstra armaia de mai sus, s considerm un comparator cu intrrile x i y.
Ieirea de sus a comparatorului va produce min(x, y), iar cea de jos max(x, y). S presupunem
acum c aplicm, la intrare, valorile f(x) i f(y), cum se arat n gura 28.4. Se obine
astfel la ieirea de sus a comparatorului valoarea min(f(x), f(y)), iar la ieirea de jos valoarea
max(f(x), f(y)). Deoarece funcia f este monoton cresctoare, x y implic f(x) f(y). Prin
urmare, obinem urmtoarele:
min(f(x), f(y)) = f(min(x, y)), max(f(x), f(y)) = f(max(x, y)).
28.2. Principiul zero-unu 549
Figura 28.4 Operaia de comparare folosit n demonstrarea lemei 28.1. Funcia f este monoton
cresctoare.
Figura 28.5 (a) Reeaua de sortare din gura 28.2 cu secvena de intrare '9, 5, 2, 6). (b) Aceeai reea
de sortare cnd se aplic la intrare funcia monoton cresctoare f(x) = f(]x/2). Valoarea pe ecare r
este egal cu valoarea lui f aplicat pe valoarea rului corespunztor din reeaua (a).
Deci, comparatorul produce valorile f(min(x, y)) i f(max(x, y)) dac intrrile sunt f(x) i f(y),
i armaia este demonstrat.
Aplicnd inducia matematic pentru adncimea unui r oarecare dintr-o reea de comparare,
se poate demonstra o armaie mai tare dect cea a lemei: dac valoarea unui r este a
i
cnd
secvena de intrare este a, atunci, valoarea ei va f(a
i
) cnd intrarea este secvena f(a). Deoarece
aceast armaie este adevrat i pentru rele de ieire, demonstrnd-o, demonstrm i lema.
La nceput, s considerm un r de adncime 0, adic un r de intrare a
i
. Armaia, n
acest caz, este trivial: dac f(a) este secvena de intrare, atunci valoarea pe rul respectiv este
f(a
i
). S considerm acum pentru pasul inductiv un r de adncime d (d 1). Acest r este
ieirea unui comparator de adncime d, ale crui re de intrare sunt de adncime strict mai
mic de d. Din ipoteza induciei rezult c dac valorile de intrare ale comparatorului sunt a
i
i a
j
cnd intrarea reelei este secvena a, atunci valorile de intrare vor f(a
i
) i f(a
j
) cnd
secvena de intrare este f(a). Conform armaiei anterioare, pe rele de ieire ale comparatorului
apar valorile f(min(a
i
, a
j
)) i f(max(a
i
, a
j
)). Deoarece atunci cnd secvena de intrare este a,
pe aceste re apar valorile min(a
i
, a
j
), respectiv max(a
i
, a
j
), lema este demonstrat.
Figura 28.5 exemplic aplicarea lemei. Ca reea de sortare se folosete cea din gura 28.2,
la care se aplic la intrare funcia monoton cresctoare f(x) = x/2|. Valoarea pe ecare r este
valoarea aplicrii funciei f pe acelai r n reeaua din gura 28.2.
Dac reeaua de comparare este o reea de sortare, lema 28.1 ne permite demonstrarea
urmtorului rezultat remarcabil.
Teorema 28.2 (Principiul zero-unu) Dac o reea de comparare cu n intrri sorteaz corect
toate cele 2
n
secvene formate numai din 0-uri i 1-uri, atunci va sorta corect orice secven de
n elemente.
Demonstraie. Demontrm prin reducere la absurd. S presupunem c reeaua sorteaz corect
toate secvenele formate numai din 0-uri i 1-uri, dar exist o secven de valori arbitrare pe
care nu o sorteaz corect. Adic, exist o secven de intrare 'a
1
, a
2
, . . . , a
n
` astfel nct pentru
550 Capitolul 28 Reele de sortare
Figura 28.6 O reea de sortare pentru sortarea a 4 numere.
valorile a
i
i a
j
avem a
i
< a
j
, i totui reeaua l plaseaz pe a
j
naintea lui a
i
n secvena de
ieire. S denim urmtoarea funcie f monoton cresctoare:
f(x) =

0, dac x a
i
,
1, dac x > a
i
.
Dac n secvena de intrare 'a
1
, a
2
, . . ., a
n
` elementul a
j
este naintea lui a
i
, atunci, pe baza
lemei 28.1, reeaua plaseaz, n secvena de ieire 'f(a
1
), f(a
2
), . . ., f(a
n
)` pe f(a
j
) naintea lui
f(a
i
). Dar, deoarece f(a
j
) = 1 i f(a
i
) = 0, obinem contradicia c reeaua nu sorteaz corect
secvena 'f(a
1
), f(a
2
), . . . , f(a
n
)` format numai din 0-uri i 1-uri.
Exerciii
28.2-1 Demonstrai c, dac se aplic o funcie monoton cresctoare unei secvene sortate, se
obine tot o secven sortat.
28.2-2 Demonstrai c o reea de comparare cu n intrri sorteaz corect secvena de intrare
'n, n1, . . . , 1` numai dac sorteaz corect cele n1 secvene '1, 0, 0, . . . , 0, 0`, '1, 1, 0, . . . , 0, 0`,
. . . , '1, 1, 1 . . . , 1, 0`.
28.2-3 Folosii principiul zero-unu pentru a demonstra c reeaua de comparare din gura 28.6
este o reea de sortare.
28.2-4 Enunai i demonstrai un principiu analog principiului zero-unu pentru modelul
arborelui de decizie. ( Atenie la folosirea corect a egalitii.)
28.2-5 Demonstrai c o reea de sortare cu n intrri trebuie s conin cel puin un comparator
ntre liniile i i (i + 1) pentru orice i = 1, 2, . . . , n 1.
28.3. O reea de sortare a secvenelor bitone
n construirea unei reele eciente de sortare, primul pas este realizarea unei reele de compa-
rare care sorteaz orice secven biton, secven care crete monoton, apoi descrete monoton,
sau poate redus la o astfel de secven prin permutri circulare. De exemplu, secvenele
'1, 4, 6, 8, 3, 2`, '6, 9, 4, 2, 3, 5` i '9, 8, 3, 2, 4, 6` sunt secvene bitone. Secvenele bitone formate
numai din 0-uri i 1-uri au o structur foarte simpl. Ele au forma 0
i
1
j
0
k
sau 1
i
0
j
1
k
pentru
anumite i, j, k 0. De remarcat c secvenele monoton cresctoare sau monoton descresctoare
sunt i ele secvene bitone.
28.3. O reea de sortare a secvenelor bitone 551
Figura 28.7 Reeaua de comparare Semi-Nivelator[8]. Se vd diferitele intrri i ieiri de 0-uri i
1-uri. Un semi-nivelator asigur c n jumtatea de sus a ieirii elementele nu sunt mai mari dect
elementele din jumtatea de jos. Mai mult, ambele jumti sunt bitone, i cel puin una din ele este
constant.
Un sortator bitonic, care va construit n continuare, este o reea de comparare care sorteaz
secvene bitone formate numai din 0-uri i 1-uri. Exerciiul 28.3-6 cere demonstrarea faptului c
un sortator bitonic sorteaz corect secvene bitone de numere arbitrare.
Semi-nivelatorul
Sortatorul bitonic este compus din aa-numite semi-nivelatoare. Fiecare semi-nivelator este
o reea de comparare de adncime 1, n care linia de intrare i se compar cu linia i +n/2 pentru
i = 1, 2, . . . , n/2. (Presupunem c n este par.) Figura 28.7 ne arat un semi-nivelator cu 8 intrri
i 8 ieiri: Semi-Nivelator[8].
Cnd intrarea unui semi-nivelator este o secven biton format numai din 0-uri i 1-uri,
semi-nivelatorul produce o secven n care valorile mai mici sunt n jumtatea de sus, iar valorile
mai mari n jumtatea de jos. De fapt, cel puin una din cele dou jumti este constant, adic
conine numai sau 0-uri, sau numai 1-uri, de aici i numele de semi-nivelator. (De remarcat
c orice secven constant este biton.) Urmtoarea lem demonstreaz aceast proprietate a
semi-nivelatoarelor.
Lema 28.3 Dac intrarea unui semi-nivelator este o secven biton format numai din 0-uri i
1-uri, atunci secvena de ieire are urmtoarele proprieti: ambele jumti (att cea de sus ct
i cea de jos) sunt bitone, ecare element din jumtatea de sus este mai mic sau egal cu ecare
element din jumtatea de jos, cel puin una din cele dou jumti este constant.
Demonstraie. Reeaua de comparare Semi-Nivelator[n] compar intrrile i i i+n/2 pentru
i = 1, 2, . . . , n/2. Fr a pierde din generalitate, se poate presupune c intrarea are forma
00 . . . 011 . . . 100 . . . 0. (Cazul cnd intrarea este de forma 11 . . . 100 . . . 011 . . . 1 este simetric.)
Exist trei cazuri posibile depinznd de blocul de 0-uri sau 1-uri consecutive n care se a
elementul de mijloc n/2. Cazul n care acest element de mijloc se a n blocul de 1-uri, se
mparte n dou subcazuri. Cele patru cazuri sunt artate n gura 28.8. n toate cazurile lema
este adevrat.
552 Capitolul 28 Reele de sortare
Sortatorul bitonic
Combinnd recursiv semi-nivelatoare ca n gura 28.9, se poate construi un sortator bi-
tonic, care este o reea care poate sorta secvene bitone. Prima parte a unui Sortator-
Bitonic[n] este un Semi-Nivelator[n], care, dup lema 28.3, produce dou secvene bitone
avnd dimensiunea jumtate din cea iniial, astfel nct ecare element din jumtatea de sus
este mai mic sau egal cu orice element din jumtatea de jos. Astfel, se poate completa sortarea
folosind dou copii ale lui Sortator-Bitonic[n/2] pentru a sorta recursiv cele dou jumti. n
gura 28.9(a) se poate vedea, explicit, recurena, iar n gura 28.9(b) sunt evideniate apelurile
recursive consecutive, unde se pot vedea semi-nivelatoarele din ce n ce mai mici, care rezolv
sortarea. Adncimea D(n) a reelei Sortator-Bitonic[n] este dat de formula recursiv:
D(n) =

0 dac n = 1,
D(n/2) + 1 dac n = 2
k
i k 1,
a crei soluii este D(n) = lg n.
Astfel o secven biton de elemente 0 i 1 se poate sorta cu ajutorul unei reele Sortator-
Bitonic care are adncimea lg n. Pe baza unui principiu analog cu principiul zero-unu prezentat
n exerciiul 28.3-6, rezult c aceast reea poate sorta secvene bitone de numere arbitrare.
Exerciii
28.3-1 Cte secvene bitone de lungime n formate numai din 0-uri i 1-uri exist?
28.3-2 Demonstrai c reeaua Sortator-Bitonic[n], unde n este o putere a lui 2, conine
(nlg n) comparatori.
28.3-3 Descriei cum se poate construi un sortator bitonic de adncime O(lg n), cnd n nu este
o putere a lui 2.
28.3-4 Dac intrarea unui semi-nivelator este o secven biton de numere arbitrare, demons-
trai c ieirea satisface urmtoarele proprieti: att jumtatea de sus, ct i cea de jos sunt
bitone i ecare element din jumtatea de sus este mai mic sau egal cu orice element din jumtatea
de jos.
28.3-5 Se consider dou secvene de 0-uri i 1-uri. Demonstrai c, dac ecare element dintr-o
secven este mai mic sau egal cu orice element din cealalt secven, atunci una din cele dou
secvene este constant.
28.3-6 Demonstrai urmtorul principiu pentru reelele de sortare biton analog principiului
zero-unu: o reea de comparare, care sorteaz corect orice secven biton de elemente 0 i 1,
sorteaz corect orice secven biton de numere arbitrare.
28.4. Reeaua de interclasare
Reeaua noastr de sortare va realizat din reele de interclasare care sunt reele capa-
bile s interclaseze dou secvene de intrare sortate ntr-una de ieire sortat. Modicm reeaua
28.4. Reeaua de interclasare 553
Figura 28.8 Comparrile posibile n reeaua Semi-Nivelator[n]. Presupunem c secvena de intrare
este biton cu elemente 0 i 1, i fr a pierde din generalitate presupunem c aceast secven este
de forma 00 . . . 011 . . . 100 . . . 0. Subsecvenele formate numai din 0-uri sunt desenate n alb, iar cele
formate numai din 1-uri n gri. Cele n elemente sunt divizate n dou i elementele i i i + n/2 sunt
comparate (i = 1, 2, . . . , n/2). (a)(b) Cazurile n care divizarea este la mijlocul secvenei de 1-uri.
(c)(d) Cazurile n care divizarea este la mijlocul secvenei de 0-uri. n toate cazurile, ecare element
din jumtatea de sus este mai mic sau egal cu orice element din jumtatea de jos. Ambele jumti sunt
bitone i cel puin una din cele dou jumti este constant.
Sortator-Bitonic[n] pentru a obine o reea Interclasor[n]. Ca i n cazul sortatorului
bitonic, vom demostra corectitudinea reelei de interclasare pentru secvene de intrare formate
numai din 0-uri i 1-uri. n exerciiul 28.4-1 se cere extinderea demonstraiei pentru secvene
554 Capitolul 28 Reele de sortare
Figura 28.9 Reeaua de comparare Sortator-Bitonic[n] pentru n = 8. (a) Construcia recursiv:
Semi-Nivelator[n] urmat de dou copii ale lui Sortator-Bitonic[n/2] care lucreaz n paralel. (b)
Reeaua dup desfurarea apelurilor recursive. Semi-nivelatoarele sunt haurate. Pe re sunt trecute ca
exemple elemente 0 i 1.
arbitrare.
Reeaua de interclasare se bazeaz pe urmtoarea observaie. Dac avem dou secvene
sortate, inversm ordinea elementelor din cea de a doua i le concatenm, obinnd astfel o
secven biton. De exemplu, ind date secvenele sortate X = 00000111 i Y = 00001111,
dup inversarea lui Y , obinem Y
R
= 11110000. Concatennd X cu Y
R
se obine secvena
0000011111110000, care evident este o secven biton. Deci, pentru a interclasa dou secvene
de intrare X i Y , este sucient o sortare biton pe secvena concatenat X cu Y
R
.
Se poate realiza reeaua Interclasor[n] prin modicarea primului semi-nivelator din
Sortator-Bitonic[n]. Esenial este de a inversa, implicit, a doua jumtate a intrrii. Fiind
date dou secvene de intrare sortate 'a
1
, a
2
, . . . , a
n/2
` i 'a
n/2+1
, a
n/2+2
, . . ., a
n
` care trebuie
interclasate, ne intereseaz efectul sortrii bitone a secvenei 'a
1
, a
2
, . . ., a
n/2
, a
n
, a
n1
, . . .,
a
n/2+1
`. Deoarece semi-nivelatorul reelei Sortator-Bitonic[n] compar intrrile i i (n/2+i)
pentru i = 1, 2, . . ., n/2, proiectm prima etap a reelei de interclasare astfel nct s compare
intrrile i i ni+1. Figura 28.10 ilustreaz corespondena. Singura subtilitate este c elementele
de ieire n partea de jos a primei etape a reelei Sortator[n] sunt comparate n ordine invers
fa de semi-nivelatorul iniial. Deoarece inversa unei secvene bitone este tot biton, att partea
de sus ct i cea de jos a ieirii primei etape a reelei de interclasare satisfac condiiile lemei 28.3,
i, astfel, att partea de sus ct i partea de jos pot sortate n paralel pentru a produce ieirea
sortat a reelei de interclasare.
Reeaua de interclasare rezultat este ilustrat n gura 28.11. Numai prima etap a
reelei Interclasor[n] difer de Sortator-Bitonic[n]. n consecin, adncimea reelei
Interclasor[n] este lg n, adic aceeai ca la Sortator-Bitonic[n].
Exerciii
28.4-1 Demonstrai un principiu anolog principiului zero-unu pentru reele de interclasare. Mai
precis, artai c, dac o reea de comparare poate interclasa dou secvene monoton cresctoare
formate numai din 0-uri i 1-uri, atunci poate interclasa orice alte dou secvene monoton
28.5. Reeaua de sortare 555
Figura 28.10 Compararea primei etape a reelei Interclasor[n] cu cea a reelei Semi-Nive-
lator[n] pentru n = 8. (a) Prima etap a lui Interclasor[n] transform cele dou secvene
monotone de intrare 'a
1
, a
2
, . . . , a
n/2
) i 'a
n/2+1
, a
n/2+2
, . . . , a
n
) n secvene bitone 'b
1
, b
2
, . . . , b
n/2
)
i 'b
n/2+1
, b
n/2+2
, . . . , b
n
). (b) Operaiile echivalente ale reelei Semi-Nivelator[n]. Secvena biton de
intrare 'a
1
, a
2
, . . . , a
n/21
, a
n/2
, a
n
, a
n1
, . . . , a
n/2+2
, a
n/2+1
) este transformat n dou secvene bitone
'b
1
, b
2
, . . . , b
n/2
) i 'b
n
, b
n1
, . . . , b
n/2+1
).
cresctoare de numere arbitrare.
28.4-2 Cte secvene de intrare diferite, formate numai din 0-uri i 1-uri, trebuie aplicate la
intrarea unei reele de comparare pentru a verica dac este o reea de interclasare?
28.4-3 Demonstrai c o reea oarecare, care poate interclasa un element cu n 1 elemente
sortate, pentru a produce o secven sortat cu n elemente, trebuie s aib adncimea cel puin
lg n.
28.4-4 Se consider o reea de interclasare cu intrrile a
1
, a
2
, . . . , a
n
, unde n este o putere a
lui 2 i n care cele dou secvene, care trebuie sortate, sunt 'a
1
, a
3
, . . . , a
n1
` i 'a
2
, a
4
, . . . , a
n
`.
Demonstrai c n astfel de reele de interclasare numrul comparatorilor este (nlg n). De ce
este interesant aceast margine inferioar? ( S se partiioneze comparatorii n trei
mulimi.)
28.4-5 Demonstrai c orice reea de interclasare, indiferent de ordinea intrrilor, necesit
(nlg n) comparatori.
28.5. Reeaua de sortare
Avem acum la dispoziie toate elementele necesare realizrii unei reele care poate sorta orice
secven de intrare. Reeaua de sortare Sortator[n] folosete reeaua de interclasare pentru a
implementa o versiune paralel a algoritumului de sortare prin interclasare din seciunea 1.3.1.
Construirea i modul de funcionare ale reelei de sortare sunt ilustrate n gura 28.12.
Figura 28.12(a) ilustreaz construirea recursiv a reelei Sortator[n]. Cele n elemente de
intrare sunt sortate recursiv de dou copii ale reelei Sortator[n/2], care sorteaz ecare
556 Capitolul 28 Reele de sortare
Figura 28.11 O reea care interclaseaz dou secvene de intrare sortate ntr-o singur secven de
ieire sortat. Reeaua Interclasor[n] poate privit ca o reea Sortator-Bitonic[n] n care primul
semi-nivelator este modicat astfel nct s compare intrrile i i n i +1 pentru i = 1, 2, . . . , n/2. Aici
n = 8. (a) Prima parte a reelei este urmat de dou copii paralele ale reelei Sortator-Bitonic[n/2].
(b) Aceeai reea dup desfurarea apelului recursiv. Pe re sunt trecute exemple de valori zero-unu,
iar etapele sunt haurate.
n/2 elemente n paralel. Cele dou secvene sunt, pe urm, interclasate de Interclasor[n].
Condiia de oprire este n = 1, cnd se poate folosi un singur r pentru a sorta o secven de
1 element, deoarece aceast secven este deja sortat. Figura 28.12(b) ilustreaz rezultatul
desfurrii apelului recursiv, iar gura 28.12(c) ilustreaz reeaua obinut prin nlocuirea
modulelor Interclasor din gura 28.12(b) cu reelele de interclasare corespunztoare.
Datele n reeaua Sortator[n] trec prin lg n etape. Fiecare intrare individual n reea este
o secven de lungime 1 deja sortat. Prima etap a reelei Sortator[n] este format din n/2
copii de reele Interclasor[2], care sorteaz n paralel secvene de lungime 1 pentru a obine
secvene de lungime 2. A doua etap este format din n/4 copii ale reelei Interclasor[4],
care interclaseaz perechi de secvene de lungime 2 pentru a obine secvene de lungime 4. n
general, pentru k = 1, 2, . . . , lg n, etapa k este format din n/2
k
copii ale reelei Interclasor[2
k
]
care interclaseaz perechi de secvene de lungime 2
k1
pentru a obine secvene de lungime 2
k
.
n etapa nal, se obine o singur secven sortat din toate elementele de intrare. Se poate
demonstra prin inducie c aceast reea de sortare sorteaz secvenele zero-unu, i, astfel, pe
baza principiului zero-unu (teorema 28.2), sorteaz secvene de valori arbitrare.
Adncimea unei reele de sortare poate studiat recursiv. Adncimea D(n) a reelei
Sortator[n] este adncimea D(n/2) a reelei Sortator[n/2] (exist dou copii ale lui
Sortator[n/2], dar ele lucreaz n paralel) plus adncimea lg n a reelei Interclasor[n]. Deci,
adncimea reelei Sortator[n] este dat de formula de recuren:
D(n) =

0 dac n = 1,
D(n/2) + lg n dac n = 2
k
i k 1,
a crei soluie este D(n) = (lg
2
n). Deci, n numere pot sortate n paralel n O(lg
2
n) uniti
de timp.
28.5. Reeaua de sortare 557
Figura 28.12 Reeaua de sortare Sortator[n] construit prin combinarea recursiv a reelelor
de interclasare. (a) Construirea recursiv. (b) Desfurarea recursiv. (c) nlocuirea modulelor
Interclasor cu reelele de interclasare corespunztoare. S-a indicat adncimea ecrui comparator
i s-au folosit exemple de valori 0 i 1 pe re.
Exerciii
28.5-1 Ci comparatori exist n Sortator[n]?
28.5-2 Demonstrai c adncimea reelei Sortator[n] este exact (lg n)(lg n + 1)/2.
28.5-3 Presupunem c modicm un comparator astfel nct s primeasc la intrare dou
secvene sortate, de cte k elemente ecare, i s furnizeze la ieirea max cele mai mari k
elemente, i la ieirea min cele mai mici k elemente. Artai c o reea de sortare cu n intrri,
care are astfel de comparatori modicai, poate sorta nk numere, n ipoteza c ecare intrare a
reelei este o list sortat de lungime k.
28.5-4 Se dau 2n elemente 'a
1
, a
2
, . . . , a
2n
`, pe care dorim s le partiionm n n cele mai mari
i n cele mai mici elemente. Artai c acest lucru se poate face n timp constant dup ce am
sortat separat secvenele 'a
1
, a
2
, . . . , a
n
` i 'a
n+1
, a
n+2
, . . . , a
2n
`.
558 Capitolul 28 Reele de sortare
Figura 28.13 O reea de sortare par-impar cu 8 intrri.
28.5-5 Fie S(k) adncimea unei reele de sortare cu k intrri, iar M(k) adncimea unei reele
de interclasare cu 2k intrri. S presupunem c avem de sortat o secven de n numere i tim
c ecare element este ntr-o poziie care difer n cel mult k poziii de poziia lui corect n
secvena sortat. Artai c se pot sorta n numere cu adncimea S(k) + 2M(k).
28.5-6 Elementele unei matrice de mm pot ordonate prin repetarea de k ori a urmtoarei
proceduri:
1. Se sorteaz monoton cresctor elementele ecrei linii impare.
2. Se sorteaz monoton descresctor elementele ecrei linii pare.
3. Se sorteaz monoton cresctor elementele ecrei coloane.
Ct este numrul de iteraii k pentru ca procedura de mai sus s sorteze elementele matricei i
cum arat matricea?
Probleme
28-1 Reele de sortare de transpoziii
O reea de comparare este o reea de transpoziii dac ecare comparator conecteaz linii
adiacente, ca n reeaua din gura 28.3.
a. Demonstrai c o reea de transpoziii cu n intrri care sorteaz are (n
2
) comparatori.
b. Demonstrai c o reea de transpoziii cu n intrri este o reea de sortare dac, i nu-
mai dac, sorteaz secvena 'n, n 1, . . . , 1` . ( S se foloseasc un argument
asemntor celui din lema 28.1.)
O reea de sortare par-impar cu n intrri 'a
1
, a
2
, . . . , a
n
` are n niveluri de comparatori.
Figura 28.13 ilustreaz o reea de transpoziii par-impar cu 8 intrri. Conform gurii, pentru
i = 1, 2, . . . , n i d = 1, 2, . . . , n linia i este conectat la linia j = i+(1)
i+d
printr-un comparator
cu adncimea d, dac 1 j n.
c. Demonstrai c familia reelelor de sortare par-impar este de fapt o familie de reele de
sortare.
Probleme 559
Figura 28.14 Reea de permutri. (a) Reeaua de permutri P
2
compus dintr-un singur comutator,
care are dou poziii, ca n gur. (b) Construcia recursiv a reelei P
8
compus din 8 comutatori i
dou reele P
4
. Comutatorii reelei P
4
sunt setai pentru a realiza permutarea = '4, 7, 3, 5, 1, 6, 8, 2).
28-2 Reeaua de interclasare par-impar a lui Batcher
n seciunea 28.4 am vzut cum se poate construi o reea de interclasare pornind de la sortare
biton. n aceast problem vom construi o reea de interclasare par-impar. Presupunem
c n este o putere a lui 2, i dorim s interclasm secvenele sortate de pe liniile 'a
1
, a
2
, . . . , a
n
` cu
cele de pe liniile 'a
n+1
, a
n+2
, . . . , a
2n
`. Construim recursiv dou reele de interclasare par-impar
care interclaseaz subsecvenele sortate n paralel. Prima reea interclaseaz secvena de pe
liniile 'a
1
, a
3
, . . . , a
n1
` cu secvena de pe liniile 'a
n+1
, a
n+3
, . . . , a
2n1
` (elementele impare). A
doua reea interclaseaz elementele 'a
2
, a
4
, . . . , a
n
` cu elementele 'a
n+2
, a
n+4
, . . . , a
2n
` (elemente
parele). Pentru a interclasa cele dou secvene sortate punem cte un comparator ntre a
2i1
i
a
2i
pentru i = 1, 2, . . . , n.
a. Desenai o reea de interclasare cu 2n intrri pentru n = 4.
b. Folosii principiul zero-unu pentru a demonstra c o reea de interclasare par-impar cu
2n intrri este de fapt o reea de sortare.
c. Ct este adncimea unei reele de interclasare par-impar cu 2n intrri?
28-3 Reele de permutri
O reea de permutri cu n intrri i n ieiri are comutatori care permit conectarea intrrilor
cu ieirile dup toate permutrile lui n! Figura 28.14(a) arat o reea de permutri P
2
cu 2
intrri 2 ieiri care are un singur comutator care permite ca intrrile s e legate cu ieirile direct
sau n cruce.
560 Capitolul 28 Reele de sortare
a. Artai c, dac nlocuim, ntr-o reea de sortare, ecare comparator cu cte un comutator
de tipul celui din gura 28.14(a), atunci reeaua devine o reea de permutare. Adic, pentru
orice permutare exist un mod de a lega intrarea i cu ieirea (i).
Figura 28.14(b) ilustreaz construcia recursiv a unei reele de permutri P
8
cu 8 intrri i 8
ieiri, care folosete dou copii ale lui P
4
i 8 comutatori. Comutatorii sunt setai pentru a realiza
permutarea = '(1), (2), . . . , (8)` = '4, 7, 3, 5, 1, 6, 8, 2` i vor solicita (recursiv) ca partea de
sus a lui P
4
s realizeze '4, 2, 3, 1`, iar partea de jos '2, 3, 1, 4`.
b. Artai cum se poate realiza permutarea '5, 3, 4, 6, 1, 8, 2, 7` cu P
8
, trasnd poziionarea
comutatorilor i permutrile realizate de cele dou P
4
. Fie n o putere a lui 2. S se deneasc
recursiv P
n
cu ajutorul a dou reele P
n/2
, asemntor cazului P
8
.
c. Scriei un algoritm (RAM obinuit), de complexitate O(n), care poziioneaz cei n
comutatori care sunt legai la intrrile i ieirile lui P
n
i specic permutrile ecrei
P
n/2
pentru a realiza permutarea cerut a celor n elemente. Demonstrai c algoritmul
descris este corect.
d. Ct este adncimea i dimensiunea reelei P
n
? Ct dureaz pe o main RAM obinuit
calculul tuturor poziionrilor comutatorilor, incluznd i pe cele din P
n/2
?
e. Pentru n > 2 artai c orice reea de permutri nu numai P
n
pentru realizarea
permutrilor, necesit dou poziionri distincte ale comutatorilor.
Note bibliograce
Knuth [123] discut, pe larg, reelele de sortare i descrie istoricul lor. Se pare c reelele de
sortare au fost discutate prima dat de P. N. Armstrong, R. J. Nelson i D. J. OConnor n 1954.
La nceputul anilor 1960, K. E. Batcher a descoperit prima reea capabil s interclaseze dou
secvene de n numere n O(lg n) uniti de timp. El a utilizat interclasarea de tip par-impar
(problema 28-2), i, de asemenea, a demonstrat cum poate utilizat aceast tehnic pentru a
sorta n numere n O(lg
2
n) uniti de timp. Nu peste mult timp, tot el a descoperit un algoritm
de sortare biton de adncime O(lg n), similar celui din seciunea 28.3. Knuth atribuie principiul
zero-unu lui W. G. Bouricius (1954), cel care a demonstrat acest principiu pentru arbori de
decizie.
Mult timp a fost o problem deschis, dac exist o reea de sortare de adncime O(lg n).
n 1983, la aceast ntrebare, s-a dat un rspuns pozitiv, dar nu tocmai satisfctor. Reeaua
de sortare AKS (numit dup autorii ei Ajtai, Komls i Szemerdi [8]) poate sorta n numere,
avnd adncimea O(lg n) i folosind O(nlg n) comparatori. Dar constantele ascunse n O-notaia
sunt foarte mari (multe, multe mii), i deci metoda, practic, nu poate folosit.
29 Circuite aritmetice
Orice model actual de calculator presupune c operaiile aritmetice de baz: adunare, scdere,
nmulire i mprire se pot executa n timp constant. Aceast ipotez este rezonabil deoarece
operaiile efectuate pe o main obinuit solicit consumuri de resurse (costuri) similare. Cnd
se proiecteaz circuitele pentru aceste operaii se constat c performanele lor depind de
dimensiunea (numrul de cifre binare ale) operanzilor. De exemplu, se tie c dou numere
naturale de cte n cifre zecimale se adun n (n) pai (dei profesorii de obicei nu pun n
eviden acest numr de pai).
n acest capitol sunt prezentate circuite care execut operaii aritmetice. Cu procese seriale,
cel mai bun timp asimptotic pentru astfel de operaii pe n bii este de (n). Cu circuite care
opereaz n paralel, se obin desigur rezultate mai bune. n cele ce urmeaz, vom prezenta circuite
rapide pentru adunare i nmulire. (Scderea este, n esen, la fel cu adunarea, iar mprirea
va tratat n problema 29-1. Vom presupune c toate datele de intrare sunt numere binare de
cte n bii.
n seciunea 29.1 prezentm circuite combinaionale. Vom constata c adncimea acestor
circuite corespunde cu timpul lor de execuie. Sumatorul complet, care este un bloc de baz
n cele mai multe circuite prezentate n acest capitol, constituie primul exemplu de circuit
combinaional. n seciunea 29.2 sunt prezentate dou circuite combinaionale pentru adunare:
sumator cu transport propagat, care lucreaz n timp (n), i sumator cu transport anticipat,
care lucreaz ntr-un timp de numai O(lg n). Se mai prezint sumatorul cu transport salvat, care
reduce problema nsumrii a trei numere la problema nsumrii a dou numere n timp (1).
n seciunea 29.3 sunt prezentate dou circuite combinaionale de nmulire: multiplicatorul
matriceal care lucreaz ntr-un timp (n) i multiplicatorul arborescent Wallace, care necesit
un timp (lg n). n sfrit, seciunea 29.4 prezint circuitele cu un registru de memorare a
elementelor de ceas i arat cum se poate reduce hardware-ul necesar reutiliznd circuitele
combinaionale.
29.1. Circuite combinaionale
Similar cu ceea ce s-a prezentat n capitolul 28, circuitele combinaionale opereaz n paralel:
multe elemente pot calculate simultan, ntr-un singur pas. n aceast seciune vom deni
circuitele combinaionale i vom investiga modul n care circuitele mari pot realizate din
circuite poart elementare.
Elemente combinaionale
n calculatoarele reale, circuitele aritmetice sunt fabricate din elemente combinaionale co-
nectate ntre ele prin re. Un element combinaional este orice element de circuit care are un
numr constant de intrri i ieiri i efectueaz o funcie bine denit. Unele dintre elementele
denite sunt elemente combinaionale booleene, intrrile i ieirile lor ind din mulimea
0, 1, 0 reprezentnd fals i 1 reprezentnd adevrat.
562 Capitolul 29 Circuite aritmetice
Figura 29.1 ase pori logice de baz, cu intrrile i ieirile binare. Sub ecare poart este prezentat
tabelul de adevr care i descrie funcionarea. (a) Poarta NOT. (b) Poarta AND. (c) Poarta OR. (d)
Poarta XOR (SAU-exclusiv). (e) Poarta NAND (NOT-AND). (f ) Poarta NOR (NOT-OR).
Un element combinaional care calculeaz valoarea unei funcii booleene simple este numit
poart logic. n gura 29.1 sunt prezentate cele patru pori logice care vor folosite n acest
capitol: poarta NOT (sau inversor), poarta AND, poarta OR i poarta XOR. (Mai sunt
prezentate porile NAND i NOR, folosite n unele exerciii.) Poarta NOT primete o singur
intrare binar x, cu una dintre valorile 0 sau 1, i produce ieirea binar z care este opus
intrrii. Fiecare dintre celelalte pori primete cte dou intrri x i y i produce, la ieire, o
valoare binar z.
Modul de operare al ecrei pori i al ecrui element combinaional poate descris printr-
un tabel de adevr, ilustrat n gura 29.1 sub ecare poart. Un astfel de tabel de adevr
produce ieirea pentru ecare combinaie de intrri posibile. De exemplu, tabelul de adevr
pentru funcia XOR arat c intrarea x = 0 i y = 1 produce ieirea z = 1; calculeaz deci SAU
exclusiv ntre cele dou valori. Prin simbolul vom nota funcia NOT, prin funcia AND,
prin funcia OR, iar prin funcia XOR. Astfel, spre exemplu, 0 1 = 1.
Elementele combinaionale din circuitele reale nu opereaz instantaneu. O dat xate valorile
de intrare ale elementelor, acestea devin instalate (devin stabile): aceasta nseamn c ele stau
n aceast stare un timp sucient de ndelungat, deci se garanteaz c valoarea de ieire este
stabil un anumit timp. Vom numi acest timp coad de propagare. n acest capitol vom
presupune c toate elementele combinaionale au ateptarea de propagare constant.
Circuite combinaionale
Un circuit combinaional const dintr-una sau mai multe elemente combinaionale inter-
conectate ntr-o manier aciclic. nterconectrile sunt numite re. Un r poate s conecteze
29.1. Circuite combinaionale 563
ieirea unui element la intrarea unui alt element combinaional. Astfel, ecare r este o ieire a
unui singur element, dar poate intrare pentru unul sau mai multe elemente. Numrul de ieiri
ale unui r poart numele de evantai de ieire. Dac la un r nu se conecteaz nici un element
de ieire, atunci circuitul se cheam circuit de intrare, de la care sunt acceptate intrri din
surse exterioare. n mod similar, dac la un r nu este conectat nici un element de intrare, atunci
rul este numit circuit de ieire, care furnizeaz rezultate pentru destinaii exterioare. Este,
de asemenea, posibil ca un r interior s furnizeze, prin evantai, intrare spre exterior. Circuitele
combinaionale nu conin cicluri i nici nu au memorie (cum ar regitrii descrii n seciunea
29.4).
Sumatoare complete
n gura 29.2 este prezentat un circuit combinaional care realizeaz adunare complet
pentru o poziie. Intrarea este compus din trei bii: x, y i z, iar ieirea este compus din doi
bii: s i c, n concordan cu urmtorul tabel de adevr:
x y z c s
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1
Ieirea s constituie bitul de paritate pentru intrri (cifra curent a sumei):
s = paritate(x, y, z) = x y z, (29.1)
iar ieirea c este ieirea de majoritate (cifra de transport la rangul urmtor):
c = majoritate(x, y, z) = (x y) (y z) (x z). (29.2)
(n general, funciile de paritate i majoritate pot avea la intrare un numr oarecare de bii.
Paritatea este 1 dac i numai dac numrul de bii 1 este impar, iar majoritatea este 1 dac i
numai dac mai mult de jumtate din bii au valoarea 1.) Biii c i s, luai mpreun, realizeaz
suma biilor x, y, z. De exemplu, dac x = 1, y = 0, z = 1, atunci 'c, s` = '10`,
1
care este
reprezentarea n binar a numrului 2, adic suma biilor x, y, z.
Fiecare dintre intrrile x, y, z are un evantai de ieire egal cu 3. Cnd operaia executat de
un element combinaional este una comutativ i asociativ (aa cum sunt AND, OR i XOR),
vom numi intrrile lui evantai de intrare. Astfel, evantaiul de intrare al ecrei pori din
gura 29.2 este 2, prin urmare putem nlocui porile XOR A i E printr-o singur poart XOR
cu evantai de intrare 3. De asemenea, porile F i G pot nlocuite printr-o singur poart OR
cu trei intrri.
Pentru a constata modul de funcionare al sumatorului complet, vom presupune c ecare
poart opereaz ntr-o unitate de timp. n gura 29.2(a) se arat setul de intrri care sunt stabile
la momentul 0. Doar porile AD au, la intrare, aceste mrimi; dup aceea, produc n paralel, la
Pentru claritate, omitem virgulele dintre elementele irului, atunci cnd acestea sunt bii.
564 Capitolul 29 Circuite aritmetice
Figura 29.2 Un circuit sumator complet. (a) La momentul 0, intrrile apar la cele trei re de intrare.
(b) La momentul 1, apar valorile la ieirile din porile AD care au adncimea 1. (c) La momentul 2
apar valorile la ieirile porilor E i F de adncime 2. (d) La momentul 3 produce ieire poarta G i se
realizeaz ieirile circuitului.
momentul 1, valorile din gura 29.2(b). Porile E i F, dar nu i G, au la momentul 1, intrarea
stabil i produc, la momentul 2, valorile din gura 29.2(c). Ieirea din poarta E este bitul s,
deci ieirea s este gata la momentul 2. Pentru ieirea c, mai este nevoie de aciunea porii G care
creeaz, la momentul 3, valoarea lui c, aa cum se vede n gura 29.2(d).
Adncimea circuitului
n acelai mod n care s-au comparat reelele n capitolul 28, msurm coada de propagare
a circuitului combinaional n funcie de cel mai mare numr de circuite combinaionale aate
pe un drum de la intrri la ieiri. Astfel, adncimea unui circuit este numrul de circuite
aate pe cea mai lung ramur care compune circuitul. Ea corespunde timpului de execuie n
29.1. Circuite combinaionale 565
cazul cel mai defavorabil. Adncimea rului de intrare este 0. Dac un circuit combinaional are
elementele de intrare x
1
, x
2
, . . . , x
n
de adncimi d
1
, d
2
, . . . , d
n
, atunci adncimea ieirii lui este
maxd
1
, d
2
, . . . , d
n
+1. (Adncimea unui circuit combinaional este dat de maximul adncimilor
ieirilor lui). Deoarece sunt interzise ciclurile n circuitele combinaionale, acest mod de denire
este corect.
Dac ecare element combinaional are un timp constant de calcul al ieirii, atunci coada de
propagare este proporional cu adncimea lui. n gura 29.2 sunt prezentate adncimile ecrei
pori a sumatorului complet. Deoarece poarta cu cea mai mare adncime este G, circuitul complet
are adncimea 3, proporional cu timpul cel mai defavorabil de calcul al acestei funcii.
Uneori, un circuit combinaional poate s calculeze ntr-un timp mai bun dect adncimea
lui. Presupunem c un subcircuit AND ateapt prima linie n adncime, dar a doua intrare n
AND are valoarea 0. Ieirea din poarta AND d, automat, ieirea 0, independent de valoarea
intrrii ateptate. Evident c nu se poate conta ntotdeauna pe o astfel de situaie, motiv pentru
care este rezonabil s utilizm adncimea ca msur a timpului de execuie.
Dimensiune circuit
Noiunea de dimensiune este o alt msur folosit, pe lng adncimea circuitului pe care,
de regul, dorim s-o minimizm n proiectarea circuitelor. Ea reprezint numrul de elemente
combinaionale coninute n circuit. De exemplu, sumatorul din gura 29.2 are dimensiunea 7
deoarece folosete 7 pori.
Aceast msur se folosete rar la circuite mici. Deoarece un sumator are un numr constant
de intrri i de ieiri i calculeaz o funcie bine denit, acesta corespunde deniiei circuitului
combinaional. Astfel de circuite pot considerate ca avnd toate dimensiunea 1. De fapt,
conform acestei deniii, element combinaional are dimensiunea 1.
Noiunea este aplicat familiilor de circuite care calculeaz mai multe funcii similare. Ne
referim, de exemplu, la situaii cnd avem circuite sumatoare care adun numere de cte n bii.
Aici nu vorbim despre un singur circuit, ci despre familii de circuite, cte unul pentru ecare
poziie binar calculat.
n acest context, denirea dimensiunii capt un sens practic. Este, astfel, permis denirea
elementelor de circuit convenabile fr a afecta dimensiunea cu mai mult de un factor constant.
n practic, noiunea de dimensiune este mai complicat, n ea ind nglobate att numrul de
elemente, ct i cerinele tehnice ce se impun la integrarea elementelor ntr-un circuit zic.
Exerciii
29.1-1 Schimbai, n gura 29.2, intrarea y la 1. Prezentai valorile ce apar pe ecare r.
29.1-2 Artai cum se poate construi un circuit de paritate cu n intrri folosind n 1 pori
XOR i adncimea lg n|.
29.1-3 Artai c orice element combinaional poate construit cu un numr constant de pori
AND, OR i NOT. ( : Implementai tabelul de adevr al elementului.)
29.1-4 Artai c orice funcie boolean poate construit numai cu pori NAND.
29.1-5 Construii un circuit combinaional care efectueaz funcia sau-exclusiv, folosind numai
patru pori NAND cu cte dou intrri.
566 Capitolul 29 Circuite aritmetice
Figura 29.3 Suma a dou numere de cte 8 bii, a = '01011110) i b = '11010101) d suma lor pe 9
bii s = '100110011). Fiecare bit c
i
este bit de transport. Fiecare coloan de bii reprezint, de sus n
jos pentru ecare i, biii c
i
, a
i
, b
i
, s
i
. Transportul iniial c
0
este ntotdeauna 0.
29.1-6 Fie C un circuit combinaional cu n intrri, n ieiri i adncimea d. Dac se conecteaz
dou copii ale lui C, ieirile unuia conectndu-se direct la intrrile celuilalt, care este adncimea
maxim a tandemului celor dou circuite? Dar adncimea minim?
29.2. Circuite de sumare
Acum vom trata problema adunrii numerelor reprezentate binar. Vom prezenta, n acest,
scop trei circuite combinaionale. Primul este sumatorul cu transport propagat, care poate s
adune dou numere de cte n bii n timp (n) i utiliznd un circuit avnd o dimensiune (n).
Al doilea este sumatorul cu transport anticipat, de dimensiune (n) care adun n timp O(lg n).
Al treilea este un circuit cu transport salvat, care, n timp O(1), poate reduce suma a trei numere
de cte n bii la suma unui numr de n bii i a unuia de n + 1 bii. Circuitul are dimensiunea
(n).
29.2.1. Sumator cu transport propagat
Vom ncepe cu cea mai cunoscut metod de adunare a numerelor binare. Presupunem c
numrul nenegativ a este reprezentat n binar printr-o secven de n bii 'a
n1
, a
n2
, . . . , a
0
`,
unde n lg(a + 1)| i
a =
n1

i=0
a
i
2
i
.
Fiind date dou numere de cte n bii a = 'a
n1
, a
n2
, . . . , a
0
`, b = 'b
n1
, b
n2
, . . . , b
0
`, dorim
s obinem o sum pe n +1 bii s = 's
n
, s
n1
, . . . , s
0
`. n gura 29.3 este prezentat un astfel de
exemplu de adunare a dou numere de cte 8 bii. Adunarea se efectueaz de la dreapta spre
stnga, ecare transport ind propagat din coloana i n coloana i +1, pentru i = 0, 1, . . . , n 1.
n poziia i, se adun a
i
cu b
i
i cu transportul de intrare c
i
. Rezultatele sunt bitul sum
s
i
i transportul de ieire c
i+1
, acesta din urm devenind transport de intrare pentru poziia
i + 1. Transportul iniial este c
0
= 0, iar bitul sum s
n
este transportul de ieire c
n
.
Se observ (vezi ecuaia (29.1)) c bitul sum s
i
reprezint paritatea biilor a
i
, b
i
i c
i
. n
plus, transportul de ieire c
i+1
reprezint majoritatea din a
i
, b
i
i c
i
(vezi ecuaia (29.2)). Astfel,
ecare etap a adunrii poate efectuat cu un sumator complet.
Un sumator cu transport propagat, pe n bii este format prin legarea n cascad a n
sumatori complei FA
0
, FA
1
, . . . , FA
n1
, (FA - Full Addition) legnd transportul de ieire c
i+1
29.2. Circuite de sumare 567
Figura 29.4 Un sumator pe 8 bii cu transport propagat care efectueaz suma din gura 29.3. Bitul
de transport c
0
este iniializat cu 0, iar propagarea transporturilor se face de la dreapta la stnga.
din FA
i
cu intrarea de transport din FA
i+1
. n gura 29.4 este prezentat un sumator de 8 bii
cu transport propagat. Bitul de transport este propagat de la dreapta spre stnga. Bitul c
0
este xat hard la 0, semnicaia lui ind aceea c, iniial, nu exist transport. Cei n +1 bii ai
numrului de ieire sunt s = 's
n
, s
n1
, . . . , s
0
`, unde s
n
este egal cu c
n
, transportul de ieire din
FA
n
.
Deoarece biii de transport se propag de la stnga spre dreapta prin cei n sumatori complei,
timpul cerut de un sumator cu transport propagat este (n). Mai exact, sumatorul complet FA
i
este la adncimea i+1 n circuit. Deoarece FA
n1
este cel mai adnc sumator complet, adncimea
circuitului cu transport propagat este n. Dimensiunea circuitului este (n) deoarece conine n
elemente combinaionale.
29.2.2. Sumator cu transport anticipat
Sumatorul cu transport propagat cere un timp (n) deoarece biii de transport se propag
prin ntregul circuit. Transportul anticipat scurteaz acest timp prin accelerarea calculului trans-
porturilor dup o schem arborescent. Un astfel de sumator poate efectua suma n timp O(lg n).
Observaia cheie este aceea c, la sumatorul cu transport propagat, pentru i 1, sumatorul
complet FA
i
are dou intrri respectiv pe a
i
i b
i
pregtite cu mult timp nainte ca transportul c
i
s e gata. Aceast observaie permite exploatarea anticipat a informaiei pariale deja prezente.
De exemplu, e a
i1
= b
i1
. Deoarece transportul c
i
este funcia majoritate, vom avea
c
i
= a
i1
= b
i1
c
i1
. Dac a
i1
= b
i1
= 0, atunci transportul este
distrus, deci c
i
= 0 fr s se mai atepte sosirea lui c
i1
. La fel, dac a
i1
= b
i1
= 1, atunci
transportul este generat, deci c
i
= 1 fr s se mai atepte sosirea lui c
i1
.
Dac a
i1
= b
i1
, atunci transportul c
i
va depinde de c
i1
. Mai exact, c
i
= c
i1
deoarece
transportul c
i1
decide votul pentru bitul majoritar care l determin pe c
i
. n acest caz,
transportul este propagat deoarece transportul de ieire coincide cu cel de intrare.
n gura 29.5 se rezum aceste relaii n termenii strii transportului, unde k nseamn
distrugerea transportului, g nseamn generarea lui, iar p nseamn propagarea lui.
S considerm un ansamblu format din succesiunea a doi sumatori complei: FA
i1
urmat
de FA
i
. Transportul de intrare n ansamblu este c
i1
, iar transportul de ieire din ansamblu este
c
i+1
. S vedem n ce constau operaiile de distrugere, generare i de propagare a transportului
pentru acest ansamblu. Operaia de distrugere are loc e dac FA
i
distruge transportul, e
dac FA
i1
l distruge, i FA
i
l propag. n mod analog, operaia de generare are loc dac FA
i
genereaz transportul sau dac FA
i1
l genereaz, i FA
i
l propag. Operaia de propagare
568 Capitolul 29 Circuite aritmetice
Figura 29.5 Starea bitului transport de ieire c
i
i a strii de transport n funcie de intrrile
a
i1
, b
i1
, c
i1
din sumatorul complet FA
i1
.
Figura 29.6 Starea transportului la combinarea sumatorilor complei FA
i1
i FA
i
date de starea
transportului operatorului peste mulimea k,p,g.
c
i+1
= c
i1
are loc dac ambii sumatori propag transportul. Tabelul din gura 29.6 rezum
starea transportului pentru acest ansamblu. Este vorba de tabela operatorului de stare a
transportului peste domeniul k,p,g. Asociativitatea este o proprietate important a
operatorului; vericarea acestei proprieti se cere n exerciiul 29.2-2.
Operatorul de stare poate folosit pentru a exprima ecare bit de transport c
i
n funcie de
intrrile lui. S denim x
0
= k i
x
i
=

k dac a
i1
= b
i1
= 0,
p dac a
i1
= b
i1
,
g dac a
i1
= b
i1
= 0,
(29.3)
pentru i = 1, 2, . . . , n. Astfel, pentru i = 1, 2, . . . , n, valoarea lui x
i
este starea transportului din
gura 29.5.
Transportul de ieire c
i
din sumatorul complet FA
i1
poate s depind de starea transpor-
turilor din sumatoarele FA
j
pentru j = 0, 1, . . . , i 1. S denim y
0
= x
0
= k i
y
i
= y
i1
x
i
= x
0
x
1
. . . x
i
(29.4)
pentru i = 1, 2, . . . , n. Ne putem imagina c y
i
este un prex al expresiei x
0
x
1
. . . x
n
; vom
numi procesul de calcul al valorilor y
0
, y
1
, . . . y
i
calcul de prex. (Capitolul 30 prezint aceste
calcule de prexe, ntr-un context paralel mai general.) n gura 29.7 se arat c valorile x
i
i
y
i
corespund adunrii binare din gura 29.3. Lema urmtoare exprim semnicaia valorilor y
i
pentu sumatorul cu transport anticipat.
Lema 29.1 Fie x
0
, x
1
, . . . , x
n
i y
0
, y
1
, . . . , y
n
denite conform ecuaiilor (29.3) i (29.4). Pentru
i = 0, 1, . . . , n, sunt valabile urmtoarele armaii:
1. y
i
= k implic c
i
= 0,
29.2. Circuite de sumare 569
Figura 29.7 Valorile x
i
i y
i
, pentru i = 0, 1, . . . , 8 care corespund valorilor a
i
, b
i
, c
i
din adunarea
binar din gura 29.3. Fiecare valoare x
i
este haurat mpreun cu valorile lui a
i1
i b
i1
de care
depind.
2. y
i
= g implic c
i
= 1,
3. y
i
= p nu apare.
Demonstraie. Demonstraia este fcut prin inducie dup i. Iniial, i = 0. Avem, prin
deniie, y
0
= x
0
= k i c
0
= 0. Presupunem c lema este valabil pentru i 1. n funcie
de valorile lui y
i
, se disting trei cazuri.
1. Dac y
i
= k, deoarece y
i
= y
i1
x
i
, denirea operatorului din gura 29.6 implic ori c
x
i
= k, ori c x
i
= p i y
i1
= k. Dac x
i
= k, atunci ecuaia (29.3) implic a
i1
= b
i1
= 0
i, astfel, c
i
= majoritate(a
i1
, b
i1
, c
i1
) = 0. Dac x
i
= p i y
i1
= k atunci a
i1
= b
i1
,
i, din ipoteza de inducie, c
i1
= 0. Astfel, majoritate(a
i1
, b
i1
, c
i1
) = 0 de unde rezult
c c
i
= 0.
2. Dac y
i
= g, atunci ori avem x
i
= g, ori avem x
i
= p i y
i1
= g. Dac x
i
= g atunci
a
i1
= b
i1
= 1, ceea ce implic c
i
= 1. Dac x
i
= p i y
i1
= g, atunci a
i1
= b
i1
i, din
ipoteza de inducie, avem c c
i1
= 1, ceea ce implic c
i
= 1.
3. Dac y
i
= p, atunci, din gura 29.6 rezult c y
i1
= p, ceea ce contrazice ipoteza de
inducie.
Lema 29.1 arat c se poate determina ecare bit de transport c
i
calculnd ecare stare de
transport y
i
. O dat ce s-au calculat toi biii de transport, se poate calcula ntreaga sum n
timp (1) prin calcularea n paralel a biilor sum s
i
= paritate(a
i
, b
i
, c
i
) pentru i = 0, 1, . . . , n
(evident, a
n
= b
n
= 0). Astfel, problema adunrii rapide a dou numere se reduce la calculul
prexelor de stare a transporturilor y
0
, y
1
, . . . , y
n
.
Calculul prexelor de stare a transporturilor cu un circuit paralel
Folosind un circuit paralel pentru calculul strilor transporturilor y
0
, y
1
, . . . , y
n
, sumatorul
va mult mai rapid dect cel cu transport propagat. Vom prezenta un circuit paralel de calcul al
prexelor cu adncimea O(lg n). Circuitul are dimensiunea (n), ceea ce nseamn c, asimptotic,
are aceeai ncrctur hardware ca i sumatorul cu transport propagat.
nainte de construcia circuitului, vom introduce o notaie care ne va ajuta s nelegem cum
opereaz circuitul. Pentru numerele ntregi i i j din domeniul 0 i j n, denim
[i, j] = x
i
x
i+1
. . . x
j
570 Capitolul 29 Circuite aritmetice
Figura 29.8 Organizarea unui circuit paralel pentru calculul de prex. Nodul prezentat este rdcin
pentru subarborele care are ca frunze valorile de intrare de la x
i
la x
k
. Subarborele stng conine intrrile
de la x
i
la x
j1
, iar subarborele drept pe cele de la x
j
la x
k
. Nodul const din dou elemente care
opereaz la momente diferite de timp. Un element calculeaz [i, k] [i, j 1] [j, k], iar cellalt element
calculeaz [0, j 1] [0, i 1] [i, j 1]. Pe re sunt artate valorile calculate.
Astfel, pentru i = 0, 1, . . . , n, avem [i, i] = x
i
, deoarece operatorul este idempotent. Pentru i,
j, k astfel nct 0 i < j k n, avem:
[i, k] = [i, j 1] [j, k], (29.5)
deoarece operatorul este asociativ. Cu aceast notaie, scopul calculului de prex este s se
calculeze y
i
= [0, i] pentru i = 0, 1, . . . , n.
Pentru construcia circuitului, se utilizeaz numai elemente combinaionale care evalueaz
operatorul . n gura 29.8 se arat cum se combin o pereche de elemente pentru a forma
noduri interne ntr-un arbore binar complet. n gura 29.9 se ilustreaz circuitul paralel de
prex pentru n = 8. Trebuie remarcat faptul c, dei rele apar n circuit sub forma unui
arbore, circuitul nsui nu este un arbore, ci un circuit combinaional pur. Intrrile x
1
, x
2
, . . . , x
n
sunt asociate frunzelor, iar x
0
este n rdcin. Ieirile y
0
, y
1
, . . . , y
n1
sunt obinute n frunze,
iar ieirea y
n
se obine n rdcin. (Pentru o nelegere mai uoar, n calculul prexelor din
gurile 29.8 i 29.9 din aceast seciune indicii variabilelor cresc de la stnga la dreapta, n loc
s creasc de la dreapta spre stnga, ca n celelalte guri.)
De obicei, cele dou elemente din ecare nod acioneaz la momente diferite i au adncimi
diferite n circuit. Aa cum se vede n gura 29.8, dac subarborele cu rdcina ntr-un nod
dat are intrarea x
i
, x
i+1
, . . . , x
k
, subarborele lui stng are intrarea x
i
, x
i+1
, . . . , x
j1
, cel drept
x
j
, x
j+1
, . . . , x
k
, atunci nodul trebuie s produc, pentru prinii si, produsul [i, k] al tuturor
intrrilor acoperite de subarborele su. Deoarece putem presupune inductiv c ii stng i drept
ai nodului calculeaz produsele [i, j 1] i [j, k], nodul utilizeaz unul dintre cele dou elemente
29.2. Circuite de sumare 571
Figura 29.9 Un circuit paralel de prex pentru n = 8. (a) Structura complet a circuitului cu valorile
de transport pe ecare r. (b) Acelai circuit cu valorile corespunztoare din gurile 29.3 i 29.7.
pentru a calcula [i, k] [i, j 1] [j, k].
La un timp oarecare dup prima faz a calculului, nodul primete de la printele lui producia
[0, i1] cu toate intrrile din stnga lui x
i
calculate. Apoi nodul calculeaz valorile pentru ii lui.
Pentru ul stng, cel mai din stnga u al lui este tot x
i
, motiv pentru care i trimite neschimbate
valorile [0, i 1]. Pentru ul din dreapta cel mai din stnga u este x
j
, deci acestuia i transmite
valorile [0, j 1]. Deoarece nodul primete valorile [0, i 1] de la printele lui i valorile [i, j 1]
de la ul lui stng, el calculeaz doar [0, j 1] [0, i 1] [i, j 1] i le trimite la ul drept.
n gura 29.9 sunt prezentate rezultatele circuitului, inclusiv marginile care ajung la rdcin.
Valoarea x
0
= [0, 0] este furnizat ca intrare la rdcin, iar pentru a calcula valoarea y
n
=
572 Capitolul 29 Circuite aritmetice
Figura 29.10 Construcia unui sumator cu transport anticipat de n bii, prezentat pentru n = 8. El
const din n+1 cutii KPG
i
, i = 0, 1, . . . , n. Fiecare cutie KPG
i
are intrrile externe a
i
, b
i
cu a
n
, b
n
xai
la 0 i calculeaz starea x
i+1
a transportului. Valoarea este introdus ntr-un circuit prex paralel care,
la rndul lui, returneaz prexul calculat y
i
. Apoi, ecare cutie KPG
i
primete la intrare valoarea y
i
, o
interpreteaz ca transport de intrare c
i
, dup care produce, la ieire, bitul sum s
i
= paritate(a
i
, b
i
, c
i
).
Valorile binare indicate pe sgei coincid cu cele din gura 29.3 i 29.9.
[0, n] = [0, 0] [1, n] se folosesc, n general, unul sau mai multe elemente .
Dac n este o putere a lui 2, atunci circuitul paralel de prex folosete 2n 1 elemente .
El consum doar un timp O(lg n) pentru a calcula cele n+1 prexe deoarece calculul merge sus
i jos n arbore. Exerciiul 29.2-5 studiaz, n detaliu, adncimea circuitului.
Sumator complet cu transport anticipat
Dup ce am prezentat circuitul paralel prex, putem completa descrierea sumatorului complet
cu transport anticipat. Figura 29.10 prezint construcia. Un sumator cu transport anticipat
de n bii const din n + 1 cutii KPG (denumire preluat de la mulimea k,p,g peste
care opereaz ), ecare avnd dimensiunea (1) i un circuit paralel de prex cu intrrile
x
0
, x
1
, . . . , x
n
(x
0
este xat hard la k) i ieirile y
0
, y
1
, . . . , y
n
. Cutia KPG
i
primete intrrile
externe a
i
i b
i
i produce bitul sum s
i
. (Biii de intrare a
n
, b
n
sunt 0.) Fiind date a
i1
, b
i1
,
cutia KPG
i1
calculeaz x
i
k,p,g conform ecuaiei (29.3) i trimite valorarea obinut la
intrarea x
i
a circuitului prex paralel (valoarea x
n+1
este ignorat). Toate calculele pentru x
i
sunt efectuate consumnd un timp (1). Dup o ateptare de O(lg n), circuitul prex paralel
produce ieirea y
0
, y
1
, . . . , y
n
. Conform lemei 29.1, y
i
este e k, e g, dar niciodat p. Fiecare
valoare y
i
indic transportul de intrare n sumatorul complet FA
i
a sumatorului cu transport
propagat: y
i
= k implic c
i
= 0 i y
i
= g implic c
i
= 1. Valoarea y
i
indic, pentru KPG
i
,
transportul de intrare c
i
n timp constant, iar bitul sum s
i
= paritate(a
i
, b
i
, c
i
) este produs, de
asemenea, n timp constant. Astfel, sumatorul cu transport anticipat opereaz n timp O(lg n)
i are dimensiunea (n).
29.2.3. Sumator cu transport salvat
Sumatorul cu transport anticipat adun dou numere de cte n bii n timp O(lg n). S-ar
putea s par surprinztor, dar adunarea a trei numere de cte n bii necesit, n plus, numai
29.2. Circuite de sumare 573
Figura 29.11 (a) Adunare cu salvare transport. Fiind date trei numere de cte n bii x, y i z, se
obine un numr u de n bii i un numr v de n + 1 bii, astfel nct x + y + z = u + v. A i-a pereche
haurat este obinut n funcie de x
i
, y
i
i z
i
. ((b)) Un sumator cu transport salvat, pe 8 bii. Fiecare
sumator complet FA
i
primete, la intrare, x
i
, y
i
i z
i
i obine, la ieire, bitul sum u
i
i transportul de
ieire v
i+1
. Bitul v
0
= 0.
un timp constant. Astfel se reduce problema adunrii a trei numere la adunarea a numai dou
numere.
Fiind date trei numere de cte n bii x = 'x
n1
, x
n2
, . . . , x
0
`, y = 'y
n1
, y
n2
, . . . , y
0
` i
z = 'z
n1
, z
n2
, . . . , z
0
`, un sumator cu transport salvat obine un numr de n bii u =
'u
n1
, u
n2
, . . . , u
0
` si un numr de n + 1 bii v = 'v
n
, v
n1
, . . . , v
0
`, astfel nct
u +v = x +y +z.
Aa cum se vede n gura 29.11(a), calculul rezult din:
u
i
= paritate(x
i
, y
i
, z
i
),
v
i+1
= majoritate(x
i
, y
i
, z
i
),
pentru i = 0, 1, . . . , n 1. Bitul v
0
este egal ntotdeauna cu 0.
Sumatorul din gura 29.11(b) const din n sumatori complei FA
0
, FA
1
, . . . , FA
n1
. Pentru
i = 0, 1, . . . , n 1, sumatorul complet are intrrile x
i
, y
i
i z
i
. Bitul sum de ieire al lui FA
i
este u
i
, iar transportul de ieire al lui FA
i
este v
i+1
. Bitul v
0
= 0.
Deoarece calculele celor 2n+1 bii de ieire sunt independente, ele pot efectuate n paralel.
Astfel, sumatorul cu transport salvat opereaz n timp (1) i are dimensiunea (n). De aceea,
pentru suma a trei numere de cte n bii efectuat de sumatorul cu transport salvat, este necesar
un timp de (1) pentru a ajunge la suma a dou numere. Apoi, un sumator cu transport
anticipat, n timp O(lg n) adun cele dou numere. Aceast metod nu este mai bun asimptotic
574 Capitolul 29 Circuite aritmetice
dect cea cu transport anticipat, dar este mai rapid n practic. Mai mult, aa cum se va vedea
n seciunea 29.3, acest algoritm este nucleul unui algoritm rapid de multiplicare.
Exerciii
29.2-1 Fie a = '01111111`, b = '00000001` i n = 8. Determinai biii de sum i transport
a ieirilor din sumatorii complei la aplicarea sumatorului cu transport propagat. Gsii strile
de transport x
0
, x
1
, . . . , x
8
corespunztoare lui a i b, apoi etichetai ecare r al circuitului de
calcul prex din gura 29.9 cu aceste valori. Determinai rezultatele de ieire y
0
, y
1
, . . . , y
8
.
29.2-2 Demostrai c operatorul dat n gura 29.5 este asociativ.
29.2-3 Exemplicai cum se poate construi un circuit prex paralel care lucreaz n timp O(lg n)
atunci cnd n nu este o putere exact a lui 2, desennd un circuit prex paralel pentru n = 11.
Caracterizai performanele unui astfel de circuit (cnd arborele lui binar este unul oarecare).
29.2-4 Prezentai, la nivel de pori, construcia unei cutii KPG
i
. Presupunei c ecare ieire
x
i
este reprezentat prin '00` dac x
i
= k, prin '11` dac x
i
= g, prin '01` sau '10` dac x
i
= p.
De asemenea, presupunei c ecare intrare y
i
este reprezentat prin 0 dac y
i
= k, respectiv
prin 1 dac y
i
= g.
29.2-5 Etichetai ecare r din circuitul prex din gura 29.9(a) cu adncimea lui. Un drum
critic ntr-un circuit este drumul cu cel mai mare numr de elemente combinaionale dintre
toate drumurile de la intrare la ieire. Identicai drumul critic din gura 29.9(a) i artai c
lungimea lui este O(lg n). Artai c unele noduri au elemente care opereaz n timp (lg n).
Exist noduri ale cror elemente opereaz simultan?
29.2-6 Fie o diagram bloc recursiv de tipul circuitului din gura 29.12, pentru orice numr
n care este o putere a lui 2. Artai c aceast diagram bloc este un circuit care efectueaz un
calcul de prex. Artai c adncimea circuitului este (lg n), iar dimensiunea lui este (nlg n).
29.2-7 Care este evantaiul maxim de ieire pentru rele dintr-un sumator cu transport
anticipat? Artai c suma se poate calcula n timp O(lg n) cu un circuit de dimensiune (n)
dac se impune restricia ca porile s aib un evantai de ieire de O(1).
29.2-8 Un circuit nalt are n intrri binare i m = lg(n + 1)| ieiri. Interpretat ca numr
binar, ieirea reprezint numrul de cifre 1 din intrare. De exemplu, dac intrarea este '10011110`,
ieirea este '101`, ceea ce arat c, n intrare, exist 5 cifre 1. Descriei un circuit nalt de
adncime O(lg n) i de dimensiune (n).
29.2-9 Artai c o adunare pe n bii poate realizat cu un circuit combinaional de
adncime 4 i dimensiunea polinomial n n, dac pentru porile AND i OR sunt permise
evantaie de intrare de orice mrime. ( : Realizai adncimea 3).
29.2-10 Presupunem c, folosind un sumator cu transport propagat, se nsumeaz dou
numere aleatoare de cte n bii, unde ecare bit, independent de ceilali poate primi, cu aceeai
probabilitate, valoarea 0 sau 1. Artai c, cu o probabilitate de cel puin 1 1/n, nu se
propag transport mai departe dect O(lg n) stri consecutive. Cu alte cuvinte, dei adncimea
sumatorului cu transport propagat este (n), pentru dou numere oarecare, ieirea se obine, n
cele mai multe cazuri, n timp de maximum O(lg n).
29.3. Circuite multiplicatoare 575
Figura 29.12 Un circuit prex, folosit n exerciiul 29.2-6.
29.3. Circuite multiplicatoare
Algoritmul clasic de nmulire din gura 29.13 poate calcula produsul de 2n bii p = 'p
2n1
,
p
2n2
, . . ., p
0
` a dou numere de cte n bii a = 'a
n1
, a
n2
, . . . , a
0
` i b = 'b
n1
, b
n2
, . . .,
p
0
`. Se examineaz ecare bit al lui b, de la b
0
la b
n1
. Pentru ecare bit b
i
avnd valoarea 1, se
adun la produs a deplasat la stnga cu i poziii. Pentru ecare bit b
i
cu valoarea 0, se adun
la produs 0. Astfel, notnd m
(i)
= a b
i
2
i
, se calculeaz:
p = a b =
n1

i=0
m
(i)
.
Fiecare termen m
(i)
este numit produs parial . Exist n produse pariale avnd bii n poziiile
de la 0 la 2n 2 care se nsumeaz. Transportul de ieire de la bitul cel mai semnicativ se
constituie n bitul nal din poziia 2n 1.
n aceast seciune vom examina dou circuite pentru nmulirea a dou numere de cte n bii.
Multiplicatorul matriceal opereaz n timp (n) i are dimensiunea de (n
2
). Multiplicatorul
arbore-Wallace are dimensiunea tot (n
2
), dar el opereaz doar n timp (lg n). Ambele circuite
se bazeaz pe algoritmul clasic de nmulire.
29.3.1. Multiplicator matriceal
Un multiplicator matriceal const, conceptual, din trei pri. n prima parte sunt calculate
produsele pariale. Partea a doua nsumeaz produsele pariale, n acest scop folosind sumatoare
cu transport salvat. Partea a treia adun cele dou numere obinute de sumatoarele cu transport
salvat folosind e sumator cu transport propagat, e sumator cu transport anticipat.
576 Capitolul 29 Circuite aritmetice
Figura 29.13 Metoda clasic de nmulire a lui a = '1110) cu b = '1101) i obinerea rezultatului
p = '10110110). Vom calcula suma

n1
i=0
m
(i)
, unde m
(i)
= a b
i
2
i
i n = 4. Fiecare termen m
(i)
este
format prin deplasarea lui a, (dac b
i
= 1) sau a lui 0 (dac b
i
= 0), cu i poziii la stnga. Biii care nu
se vd sunt 0, indiferent de valorile lui a i b.
n gura 29.14 este prezentat un multiplicator matriceal pentru dou numere a =
'a
n1
, a
n2
, . . . , a
0
` i b = 'b
n1
, b
n2
, . . . , b
0
`. Valorile a
j
sunt propagate vertical, iar valorile
b
i
sunt propagate orizontal. Fiecare bit de intrare se distribuie la n pori AND pentru a
forma produsele pariale. Sumatoarele complete, organizate ca sumatoare cu transport salvat,
nsumeaz produsele pariale. Biii de ordin minim din produsul nal dau ieirea spre dreapta,
iar cei de ordin maxim sunt obinui la ieirile orizontale din partea de jos de la ultimul sumator
cu transport salvat.
S examinm mai atent construcia multiplicatorului matriceal. Fiind date la intrare dou
numere a = 'a
n1
, a
n2
, . . . , a
0
` i b = 'b
n1
, b
n2
, . . . , b
0
`, biii produselor pariale se calculeaz
uor. Astfel, pentru ecare i, j = 0, 1, . . . , n 1, avem
m
(i)
j+i
= a
j
b
i
.
Deoarece valorile produselor de cte un bit se calculeaz direct printr-o poart AND, toi biii
produselor pariale (cu excepia celor care se tie c vor 0 i nu trebuie calculai) pot calculai
ntr-un singur pas, folosind n
2
pori AND.
n gura 29.15 se prezint modul n care sunt executate nsumrile cu salvri de transporturi
la nsumarea produselor pariale ale produsului din gura 29.13. Execuia ncepe cu nsumarea
produselor pariale m
(0)
, m
(1)
i 0, producnd numerele de cte n+1 bii u
(1)
i v
(1)
. (Numrul
v
(1)
are n + 1 bii i nu n + 2, deoarece primii n + 1 bii din m
(0)
i din 0 sunt 0.) Mai departe,
m
(0)
+m
(1)
= u
(1)
+v
(1)
. Apoi, sumatorul cu transport salvat adun u
(1)
, v
(1)
i m
(2)
, producnd
dou numere de cte n+2 bii i anume pe u
(2)
i v
(2)
. (i aici, v
(2)
are numai n+2 bii deoarece
att u
(1)
n+2
ct i v
(1)
n+2
sunt 0.) Apoi, avem m
(0)
+m
(1)
+m
(2)
= u
(2)
+v
(2)
. nmulirea continu
nsumnd cu transport salvat valorile u
(i1)
, v
(i1)
i m
(i)
, pentru i = 2, 3, . . . , n1. Rezultatul
const din dou numere u
(n1)
i v
(n1)
a cte 2n 1 bii, unde:
u
(n1)
+v
(n1)
=
n1

i=0
m
(i)
= p.
De fapt, adunrile cu transport salvat din gura 29.15 opereaz puin mai mult dect strictul
necesar. Se observ c, pentru i = 1, 2, . . . , n 1 i j = 0, 1, . . . , i 1, avem m
(i)
j
= 0 deoarece
29.3. Circuite multiplicatoare 577
Figura 29.14 Un multiplicator matriceal care calculeaz produsul p = 'p
2n1
, p
2n2
, . . . , p
0
) a dou
numere a = 'a
n1
, a
n2
, . . . , a
0
) i b = 'b
n1
, b
n2
, . . . , b
0
), artate aici pentru n = 4. Fiecare poart
AND G
(i)
j
calculeaz bitul produs parial m
(i)
j
. Fiecare linie de sumare complet constituie un sumator
cu salvare transport. Cei n bii de rang minim ai produsului sunt m
(0)
0
, iar biii u se vd n coloana cea
mai din dreapta a sumatoarelor complete. Cei n bii de rang maxim ai produsului sunt formai prin
adunarea biilor lui u i v din linia de jos a sumatoarelor complete. Se observ valorile biilor de intrare
a = '1110) i b = '1101), precum i ai produsului p = '10110110), n concordan cu gurile 29.13 i
29.15.
578 Capitolul 29 Circuite aritmetice
Figura 29.15 Evaluarea sumelor de produse pariale prin adunri repetate cu transport salvat. Pentru
acest exemplu, a = '1110) i b = '1101). Biii n locul crora este spaiu sunt 0 indiferent de valorile lui a
i b. Se evalueaz, mai nti, m
(0)
+m
(1)
+0 = u
(1)
+v
(1)
, apoi se evalueaz u
(1)
+v
(1)
+m
(2)
= u
(2)
+v
(2)
,
apoi u
(2)
+v
(2)
+m
(3)
= u
(3)
+v
(3)
i, n nal, p = m
(0)
+m
(1)
+m
(2)
+m
(3)
= u
(3)
+v
(3)
. Se vede c
p
0
= m
(0)
0
i p
i
= u
(i)
i
pentru i = 1, 2, . . . , n 1.
s-au fcut deplasri ale produselor pariale. Se observ, de asemenea, c v
(i)
j
= 0, pentru i =
1, 2, . . . , n 1 i j = 0, 1, . . . , i, i + n, i + n + 1, . . . , 2n 1 (vezi exerciiul 29.3-1). Din aceast
cauz, ecare adunare cu transport salvat opereaz doar pe n 1 bii.
S urmrim corespondena dintre multiplicatorul matriceal i schema de adunri repetate cu
salvare transport. Fiecare poart AND este etichetat prin G
(i)
j
pentru indicii i i j din domeniile
0 i n 1 i 0 j 2n 2. Poarta G
(i)
j
produce m
(i)
j
, adic cel de-al j-lea bit din cel de-
al i-lea produs parial. Pentru i = 0, 1, . . . , n 1, porile AND din linia i calculeaz cei mai
semnicativi n bii din produsul parial m
(i)
, adic 'm
(i)
n+i1
, m
(i)
n+i2
, . . . , m
(i)
i
`.
Cu excepia sumatorilor complei din linia de sus (adic pentru i = 2, 3, . . . , n 1), ecare
sumator complet FA
(i)
j
are trei bii de intrare: m
(i)
j
, u
(i1)
j
i v
(i1)
j
i produce, la ieire, doi
bii: u
(i)
j
i v
(i)
j+1
. (S reinem c n coloana cea mai din stnga a sumatorilor complei, u
(i1)
i+n1
=
m
(i)
i+n1
.) Fiecare FA
(i)
j
din linia de sus are intrrile: m
(0)
j
, m
(1)
j
i 0 i produce biii de ieire
u
(1)
j
, v
(1)
j+1
.
n nal, s examinm ieirile multiplicatorului matriceal. Aa cum s-a observat mai sus,
v
(n1)
j
= 0 pentru j = 0, 1, . . . , n 1. Astfel, p
j
= u
(n1)
j
pentru j = 0, 1, . . . , n 1. Mai mult,
deoarece m
(1)
0
= 0, avem u
(1)
0
= m
(0)
0
; deoarece cei mai nesemnicativi i bii din ecare m
(i)
i
v
(i1)
sunt 0, avem u
(i)
j
= u
(i1)
j
pentru i = 2, 3, . . . , n1 i j = 0, 1, . . . , i 1. Astfel, p
0
= m
(0)
0
i, prin inducie, rezult c p
i
= u
(i)
i
pentru i = 1, 2, . . . , n1. Biii produs 'p
2n1
, p
2n2
, . . . , p
n
`
se obin dintr-un sumator de n bii care adun ieirile din ultima linie a sumatorului complet:
'p
2n1
, p
2n2
, . . . , p
n
` = 'u
(n1)
2n2
, u
(n1)
2n3
, . . . , u
(n1)
n
` +'v
(n1)
2n2
, v
(n1)
2n3
, . . . , v
(n1)
n
`.
29.3. Circuite multiplicatoare 579
Analiz
ntr-un multiplicator matriceal datele evolueaz din stnga sus spre dreapta jos. El consum
(n) uniti de timp pentru a calcula biii produs de ordin mic 'p
n1
, p
n2
, . . . , p
0
` i consum
(n) uniti de timp pentru adunarea lor complet. Dac sumatorul este cu transport propagat,
el consum nc (n) uniti de timp pentru biii produs de ordin mare 'p
2n1
, p
2n2
, . . . , p
n
`.
Dac sumatorul este cu transport anticipat, consum numai (lg n) uniti de timp, deci timpul
total rmne (n).
Exist n
2
pori AND i n
2
n sumatori complei n multiplicatorul matriceal. Sumatorul
pentru biii de ieire de ordin nalt contribuie cu nc alte (n) pori. Astfel, multiplicatorul
matriceal are dimensiunea de (n
2
).
29.3.2. Multiplicatori arbore Wallace
Un arbore Wallace este un circuit care reduce problema adunrii a n numere de n bii la
problema adunrii a dou numere a cte (n) bii. El realizeaz acest lucru folosind n paralel
n/3| sumatori cu salvare transport spre a converti suma a n numere la suma a 2n/3| numere.
Apoi construiete recursiv un arbore Wallace pe cele 2n/3| numere rezultate. n acest mod, se
reduce progresiv mulimea de numere pn cnd se ajunge doar la dou numere. Efectund, n
paralel, mai multe adunri cu salvare de transport, arborii Wallace permit ca numerele de n bii
s e nmulite n (lg n) uniti de timp folosind un circuit de dimensiune (n
2
).
n gura 29.16 este prezentat un arbore Wallace
2
care adun opt produse pariale m
(0)
,
m
(1)
, . . . , m
(7)
. Produsul parial m
(i)
conine n + i bii. Fiecare linie conine un numr cu toi
biii lui, nu doar un singur bit. n dreptul ecrei linii, se specic pe ci bii se reprezint
numrul de pe linia respectiv (vezi exerciiul 29.3-3). Sumatorul cu transport anticipat din
partea de jos adun un numr de 2n 1 bii cu un numr de 2n bii i calculeaz produsul de
2n bii.
Analiz
Timpul cerut de un arbore Wallace depinde de adncimea sumatoarelor cu transport salvat.
La ecare nivel din arbore, ecare grup de trei numere este redus la dou numere, ca n cazul lui
m
(6)
i m
(7)
de pe primul nivel. Astfel, adncimea maxim D(n) a unui sumator cu transport
salvat cu n intrri ntr-un arbore Wallace, este dat de urmtoarea formul de recuren:
D(n) =

0 dac n 2,
1 dac n = 3,
D(2n/3|) + 1 dacn 4,
care are soluia D(n) = (lg n), pe baza cazului 2 din teorema master 4.1. Fiecare sumator
cu transport salvat cere un timp (1). Toate cele n produse pariale pot formate n paralel,
consumndu-se (1) uniti de timp. (Primii i 1 bii nesemnicativi de intrare ai lui m
(i)
,
pentru i = 1, 2, . . . , n 1 sunt xai implicit pe 0). Sumatorul cu transport anticipat consum
O(lg n) uniti de timp. Astfel, ntregul multiplicator a dou numere de cte n bii consum
(lg n) uniti de timp.
Dup cum se poate observa din gur, un arbore Wallace nu este cu adevrat un arbore, ci mai degrab un
graf aciclic orientat. Denumirea este istoric i se pstreaz nc n literatura de specialitate.
580 Capitolul 29 Circuite aritmetice
Figura 29.16 Un arbore Wallace care adun, pentru n = 8, produsele pariale m
(0)
, m
(1)
, . . . , m
(7)
.
Fiecare linie indic un numr avnd numrul de bii indicat lng linie. Ieirea din stnga a ecrui
sumator cu transport salvat reprezint biii sumei, iar ieirea din dreapta reprezint transporturile.
Un multiplicator arbore Wallace pentru dou numere de cte n bii are dimensiunea (n
2
),
dup cum se va vedea imediat. Vom delimita, mai nti, dimensiunile circuitelor sumatoare cu
transport salvat. Se obine uor o margine inferioar de (n
2
), deoarece exist n/3| sumatoare
cu transport salvat de adncime 1 i ecare const din cel puin n sumatoare complete. Pentru
a se obine marginea superioar de O(n
2
), se va observa c produsul nal are 2n bii, ecare
sumator cu transport salvat din arborele Wallace conine cel mult 2n sumatoare complete. Este
necesar s artm c, de fapt, exist numai O(n) sumatoare complete. Fie C(n) numrul de
sumatoare cu salvare transport avnd n numere la intrare. Are loc formula de recuren:
C(n)

1 dac n = 3,
C(2n/3|) +n/3| dac n 4,
care are ca soluie C(n) = (n), dac se consider cazul 3 al teoremei master. Se obine,
astfel, o margine asimptotic strns de dimensiune (n
2
) pentru sumatoarele cu transport
salvat din multiplicatorul arbore Wallace. Circuitele necesare pentru cele n produse pariale
au dimensiunea (n
2
), iar sumatorul cu transport anticipat de la sfrit are dimensiunea (n).
Astfel, dimensiunea multiplicatorului este (n
2
).
Astfel, multiplicatorul bazat pe arborele Wallace este asimptotic mai rapid dect multiplica-
torul matriceal. Dei au aceeai dimensiune asimptotic, aspectul de implementare al arborelui
Wallace nu este la fel de obinuit ca cel al multiplicatorului matriceal, nici aa de dens (n
29.4. Circuite cu ceas 581
sensul c are spaii mai largi ntre elemente). n practic, se utilizeaz, de multe ori, o soluie de
compromis. Ideea este aceea c se folosesc, n paralel, dou sumatoare matriceale: unul adun
jumtate din produsele pariale, iar cellalt adun cealalt jumtate. ntrzierea de propagare
este numai jumtate din cea produs de un singur tablou care adun toate cele n produse
pariale. Dou sumatoare cu transport salvat reduc ieirea de 4 numere produse de tablouri la
2 numere, i un sumator cu transport anticipat adun apoi cele dou numere pentru a calcula
produsul. Coada total de propagare este mai mic dect jumtate din cea a unui multiplicator
matriceal complet, plus un termen suplimentar de O(lg n).
Exerciii
29.3-1 Artai c, ntr-un multiplicator matriceal, avem v
(i)
j
= 0, pentru i = 1, 2, . . . , n 1 i
j = 0, 1, . . . , i, i +n, i +n + 1, . . . , 2n 1.
29.3-2 Artai c, n multiplicatorul matriceal din gura 29.14, sumatoarele complete din linia
de sus, cu excepia unuia, nu sunt toate necesare. Pentru aceasta, se impun o serie de schimbri
n conexiuni.
29.3-3 Presupunem c un sumator cu transport salvat are intrrile x, y i z i produce ieirile s
i c avnd, respectiv, cte n
x
, n
y
, n
z
, n
s
i n
c
bii. De asemenea, fr a pierde din generalitate,
presupunem c n
x
n
y
n
z
. Artai atunci c n
s
= n
z
i c
n
c
=

n
z
dac n
y
< n
z
,
n
z
+ 1 dac n
y
= n
z
.
29.3-4 Artai c nmulirea poate realizat n timp O(lg n) i dimensiunea O(n
2
) numai dac
impunem restricia ca porile s aib evantai de intrare O(1).
29.3-5 Descriei un circuit ecient care calculeaz ctul mpririi la 3 a unui numr binar x
divizibil cu 3. ( n binar, 0.010101 . . . = 0.01 1.01 1.0001 .
29.3-6 Un deplasator ciclic este un circuit care are dou intrri x = 'x
n1
, x
n2
, . . . , x
0
`
i s = 's
m1
, s
m2
, . . . , s
0
`, unde m = lg n|. Ieirea lui y = 'y
n1
, y
n2
, . . . , y
0
` este y
i
=
x
i+smod n
, pentru i = 0, 1, . . . , n 1. Altfel spus, acest deplasator rotete biii lui x cu s poziii.
Descriei un deplasator ciclic ecient. n termenii nmulirii modulo, ce funcie implementeaz
un deplasator ciclic?
29.4. Circuite cu ceas
Elementele de circuite combinaionale pot folosite de mai multe ori n timpul calculelor. Prin
introducerea elementelor de ceas n circuite, aceste elemente combinaionale pot reutilizate.
De cele mai multe ori, circuitele cu ceas sunt mai mici dect circuitele combinaionale construite
pentru aceeai funcie.
Aceast seciune investigheaz circuitele cu ceas folosite pentru adunare i nmulire. ncepem
cu un circuit cu ceas de dimensiune (1), numit sumator bit-serial, care adun dou numere de
cte n bii n timp (n). Apoi vom studia multiplicatorii matriceali liniari. Vom prezenta un
multiplicator matriceal liniar de dimensiune (n) care poate nmuli dou numere de cte n bii
ntr-un timp (n).
582 Capitolul 29 Circuite aritmetice
Figura 29.17 Operarea ntr-un sumator bit-serial. n timpul celui de-al i-lea ciclu de ceas, i =
0, 1, . . . , n, sumatorul complet FA primete intrrile a
i
i b
i
, iar bitul de transport c
i
din registru.
Sumatorul complet produce bitul sum s
i
, iar bitul de transport c
i+1
, este memorat napoi n registru,
spre a utilizat n tactul urmtor. Registrul este iniializat cu c
0
= 0. (a)-(e) indic strile din cele 5
faze pentru adunarea numerelor a = '1011) i b = '1001), rezultatul ind s = '10100).
29.4.1. Sumator bit-serial
Introducem circuitul cu ceas revenind la problema adunrii a dou numere de cte n bii.
n gura 29.17 se arat cum se poate utiliza un singur sumator complet pentru a produce o
sum de n + 1 bii s = 's
n
, s
n1
, . . . , s
0
` a dou numere de cte n bii a = 'a
n1
, a
n2
, . . . , a
0
`
i b = 'b
n1
, b
n2
, . . . , b
0
`. Mediul extern prezint perechile de bii de intrare la ecare tact:
nti, a
0
i b
0
, apoi, a
1
i b
1
.a.m.d. Dei se dorete transportul unui bit la poziia urmtoare,
nu se pot furniza toate transporturile deodat. Este o chestiune de timp: transportul de intrare
la poziia c
i
trebuie s intre n sumatorul complet la momentul n care sunt nsumate intrrile
a
i
, b
i
. Absena acestei intrri, la timpul potrivit, conduce, evident, la un rezultat eronat.
Aa cum rezult din gura 29.17, soluia este de a folosi un sumator cu circuit de ceas
sau circuit secvenial , care conine circuite combinaionale i unul sau mai muli regitri
(elemente de memorare cu ceas). Circuitele combinaionale au intrri e din mediul extern, e
din regitrii de ieire. Ele furnizeaz ieiri e spre mediul extern, e n regitri. Ca i la circuitele
combinaionale, se interzice includerea, n circuitele cu ceas, a circuitelor combinaionale care
conin cicluri.
Fiecare registru dintr-un circuit cu ceas este controlat printr-un semnal periodic, numit tact
de ceas. De ecare dat cnd ceasul pulseaz, sau d un tact, registrul ncarc i memoreaz
n el noua intrare. Intervalul de timp dintre dou semnale (tacte de ceas) constituie perioada
de ceas (frecvena de ceas). ntr-un circuit global de ceas, toi regitrii sunt coordonai de
acelai ceas.
S examinm, puin mai n detaliu, operaiile cu un registru. Privim ecare tact ca un puls
momentan. La un anumit tact, registrul citete valoarea de intrare prezentat i
o memoreaz. Aceast valoare memorat apare ca ieire a registrului, atunci cnd este mutat
ntr-un alt registru la urmtorul tact. Cu alte cuvinte, valoarea de intrare dintr-un registru la
29.4. Circuite cu ceas 583
un moment dat apare la ieire la urmtorul tact de ceas.
Acum s examinm circuitul din gura 29.17, pe care l numim sumator bit-serial . Pentru
ca ieirile sumatorilor s e corecte, se cere ca intervalul dintre tacte s e cel puin tot att de
lung ca lungimea cozii de propagare, astfel nct s se poat efectua calculul la ecare etap n
parte. n timpul perioadei 0, aa cum se vede n gura 29.17(a), mediul extern aplic intrrile
a
0
i b
0
la dou dintre intrrile sumatorului. Presupunem c, n registru, se a valoarea 0.
Transportul iniial este, astfel, c
0
= 0. Mai trziu, n acest tact se genereaz ieirea s
0
i noul
transport c
1
. Bitul de ieire este preluat n mediul extern unde va salvat ca parte a sumei
s. Firul transportorului sumatorului complet alimenteaz registrul, astfel nct c
1
este citit n
registru la urmtorul tact de ceas. La nceputul perioadei 1, (gura 29.17(b)) sosesc din exterior
a
1
i b
1
, se citete transportul c
1
din registru, dup care se produce ieirea s
1
i noul transport
c
2
, care se depune n registru. Bitul sum s
1
este neglijat, iar bitul c
2
intr n registru. Acest
ciclu continu pn la momentul n ilustrat n gura 29.17(e), n care registrul conine c
n
. Mediul
extern transmite a
n
= b
n
= 0 i, astfel, s
n
= c
n
.
Analiz
Pentru a determina timpul total t cerut de un circuit global de ceas, este necesar s se
cunoasc numrul de perioade de timp p i durata d a ecrei perioade, deci avem t = pd. Este
necesar ca perioada d s e sucient de mare pentru a se permite execuia ecrui tact. Desigur,
n funcie de intrri, calculul se poate desfura mai repede, ns d trebuie s e proporional cu
adncimea circuitului combinaional.
S vedem, acum, ct dureaz sumatorul bit-serial pentru numere de n bii. Fiecare tact de
ceas are timpul (1) deoarece adncimea este (1). Deoarece se cere producerea a n + 1 bii,
timpul total se adun, deci (n + 1)(1) = (n).
Dimensiunea sumatorului bit-serial (numrul de elemente combinaionale plus numrul de
regitri) este (1).
Adunarea cu transport propagat n comparaie cu adunarea cu bit serial
Se observ c sumatorul cu transport propagat apare ca o dublare a sumatorului bit-serial
cu regitrii nlocuii cu conexiuni directe la elementele combinaionale corespunztoare. Deci
sumatorul cu transport propagat este, de fapt, un fel de reprezentare spaial a sumatorului bit-
serial. Cel de-al i-lea sumator complet corespunde tactului i al execuiei sumatorului bit-serial.
n general, orice circuit cu ceas poate nlocuit cu unul combinaional echivalent avnd
ntrzierea de timp asimptotic egal cu primul, cu condiia s cunoatem dinainte numrul de
tacte executate de circuitul cu ceas. Exist, evident, o serie de diferene. Circuitul cu ceas folosete
mai puine elemente combinaionale (mai puine cu un factor de (n) n cazul unui sumator
bit serial comparat cu un sumator cu transport propagat.) n schimb, circuitul combinaional
are avantajul unei pri de control mai puin complicate nu este nevoie de un circuit cu ceas
sau un circuit extern sincronizat pentru a transmite bii de intrare sau pentru a memora bii
de sum. Mai mult, circuitele combinaionale sunt puin mai rapide dect cele cu ceas, deci mai
eciente n practic. Ctigul de timp provine din faptul c nu se ateapt dup stabilizare n
ecare tact.
584 Capitolul 29 Circuite aritmetice
Figura 29.18 nmulirea lui 19 cu 29 folosind algoritmul ranului rus. O linie din coloana lui a se
obine prin njumtirea, prin lips, a numrului din linia precedent, iar o intrare din coloana lui b se
obine prin dublarea numrului din linia precedent. Adunm elementele din liniile corespunztoare ale
coloanei b cu elemente avnd pe linia respectiv valori impare din coloana a (haurate). Suma obinut
este produsul cutat. (a) Numerele scrise n zecimal. (b) Aceleai numere n binar.
29.4.2. Multiplicatori liniari
Multiplicatorii combinaionali din seciunea 29.3 necesit dimensiuni de (n
2
) pentru a
nmuli dou numere de cte n bii. Vom prezenta doi algoritmi n care circuitele se pot reprezenta
liniar, nu sub forma unui tablou bidimensional de circuite. Ca i la multiplicatorul matriceal,
timpul de execuie este (n).
Multiplicatorii liniari implementeaz algoritmul ranului rus (numit aa pentru faptul
c nite vestici care au vizitat Rusia n secolul 19, au gsit acest algoritm foarte rspndit aici).
Algoritmul este ilustrat n gura 29.18(a). Fiind date dou numere a i b, se formeaz dou
coloane de numere avnd, n antetul tabelului, numerele a i b. n ecare linie din coloana a se
trece jumtatea, prin lips, a numrului din linia precedent. n ecare linie din coloana b se
trece dublul numrului din linia precedent. Completarea tabelului se face linie cu linie pn
cnd n coloana a se obine valoarea 1. n acest moment, sunt nsumate liniile din b care au n a
valori impare, obinndu-se valoarea produsului a b.
Algoritmul ranului rus apare, la prima vedere, cel puin ciudat, dac nu remarcabil. Dac
ns urmrim gura 29.18(b), se constat c este vorba de nmulirea clasic scris n baza 2
(denmulitul deplasat se adun cnd cifra curent a nmulitorului este 1, adic atunci cnd
(dup deplasare) este numr impar.)
O implementare lent a multiplicatorului liniar
n gura 29.19(a) este prezentat o implementare a algoritmului ranului rus pentru dou
numere de cte n bii. Se folosete un circuit cu ceas constnd dintr-un tablou liniar de 2n celule.
Fiecare celul conine trei regitri. Unul dintre regitri conine un bit din intrarea a, alt registru
conine un bit din intrarea b, iar al treilea un bit al produsului p. Indicii superiori noteaz valorile
din celule naintea ecrui pas al algoritmului. De exemplu, valoarea bitului a
i
naintea pasului
j este a
(j)
i
i denete numrul a
(j)
= 'a
(j)
2n1
, a
(j)
2n2
, . . . , a
(j)
0
`.
Algoritmul execut o secven de n pai, numerotai 0, 1, . . . , n 1, unde ecare pas este
29.4. Circuite cu ceas 585
executat ntr-un tact. Algoritmul pstreaz invariantul, indiferent de pasul j:
a
(j)
b
(j)
+p
(j)
= a b (29.6)
(vezi exerciiul 29.4-2). Iniial, a
(0)
= a, b
(0)
= b i p
(0)
= 0. Pasul j const din urmtoarele
calcule:
1. Dac a
(j)
este impar (adic a
(j)
0
= 1), atunci adun b la p: p
(j+1)
b
(j)
+p
(j)
. (Adunarea
este efectuat de un sumator cu transport propagat care determin lungimea tabloului;
bitul de transport se propag de la dreapta la stnga.) Dac a
(j)
este par, atunci p este
modicat la pasul urmtor: p
(j+1)
p
(j)
.
2. Deplaseaz a spre dreapta cu o poziie:
a
(j+1)
i

a
(j)
i+1
dac 0 i 2n 2,
0 dac i = 2n 1.
3. Deplaseaz b spre stnga cu o poziie:
b
(j+1)
i

b
(j)
i1
dac 1 i 2n 1,
0 dac i = 0.
Dup execuia celor n pai, s-au calculat toi biii lui a; atunci a
(n)
= 0. Invariantul (29.6)
implic p
(n)
= a b.
S analizm acest algoritm. Presupunnd c informaiile se propag n toate celulele simultan,
avem n pai. Fiecare pas consum, n cel mai defavorabil caz, un timp de (n) deoarece
adncimea sumatorului cu transport propagat este (n). O perioad de ceas este (n). Fiecare
deplasare se execut n (1) uniti de timp. Din aceste considerente, algoritmul consum un
timp (n
2
). Deoarece ecare celul are dimensiune constant, dimensiunea multiplicatorului
liniar este (n).
O implementare liniar rapid
Folosind sumatori cu transport salvat n loc de sumatori cu transport propagat, timpul
ecrui pas scade la (1), obinnd astfel s scad timpul total la (n). Aa cum reiese din
gura 29.19(b), o dat cu ecare intrare a unui bit din intrarea a, intr un bit i n intrarea b.
Fiecare celul conine doi bii n plus, u, v, care sunt ieirile de salvare a transporturilor. Folosind
o reprezentare pentru transport salvat la nsumrile produselor, invariantul se pstreaz la ecare
pas j,
a
(j)
b
(j)
+u
(j)
+v
(j)
= a b (29.7)
(vezi exerciiul 29.4-2). Fiecare pas deplaseaz a i b la fel ca la algoritmul liniar lent, astfel nct
putem combina ecuaiile (29.6) i (29.7) de unde rezult c u
(j)
+ v
(j)
= p
(j)
. Aadar, biii u i
v conin aceeai informaie ca i p n algoritmul lent.
Al j-lea pas din implementare efectueaz adunarea cu salvare transport pentru u i v, unde
operanzii depind de faptul c a este par sau nu. Dac a
(j)
0
= 1, atunci se calculeaz:
u
(j+1)
i
paritate(b
(j)
i
, u
(j)
i
, v
(j)
i
), pentru i = 0, 1, . . . , 2n 1
586 Capitolul 29 Circuite aritmetice
Figura 29.19 Doi multiplicatori liniari care implementeaz algoritmul ranului rus, ambii nmulesc
a = 19 = '10011) cu b = 29 = '11101) i n = 5. Este prezentat situaia la nceputul ecrui pas j, iar
biii semnicativi din a
(j)
b
(j)
ai pasului sunt haurai. (a) Implementarea lent necesit un timp (n
2
).
Deoarece a
(5)
= 0, avem p
(5)
= ab. Sunt efectuai n pai. n ecare, este aplicat un sumator cu transport
propagat. Tactul este proporional cu lungimea tabloului, respectiv (n), conducnd la un timp total
de (n
2
). ((b) Implementarea rapid necesit doar timp (n), deoarece prin folosirea sumatorului cu
transport salvat o nsumare necesit doar un timp (1). Sunt necesari, n total, 2n 1 = 9 pai. Dup
prezentarea ultimului pas, adunrile repetate ale transporturilor din u i v produc u
(9)
= a b.
29.4. Circuite cu ceas 587
i
v
(j+1)
i

majoritate(b
(j)
i1
, u
(j)
i1
, v
(j)
i1
) dac 1 i 2n 1,
0 dac i = 0.
n caz contrar, dac a
(j)
0
= 0, calculm
u
(j+1)
i
paritate(0, u
(j)
i
, v
(j)
i
), pentru i = 0, 1, . . . , 2n 1
i
v
(j+1)
i

majoritate(0, u
(j)
i1
, v
(j)
i1
) dac 1 i 2n 1,
0 dac i = 0.
Dup actualizarea lui u i a lui v, n pasul j, se deplaseaz a la dreapta i b la stnga n aceeai
manier ca la algoritmul lent.
Implementarea rapid efectueaz, n total, 2n 1 pai. Pentru j n, avem a
(j)
= 0 i
invariantul (29.7) implic u
(j)
+ v
(j)
= a b. O dat ce a
(j)
= 0, toi paii viitori servesc numai
pentru a aduna transporturile salvate la u i v. Exerciiul 29.4-3 arat c v
(2n1)
= 0, deci
u
(2n1)
= a b.
Timpul total, n cel mai defavorabil caz, este (n) deoarece ecare din cei 2n1 pai consum
un timp (1). Deoarece ecare celul consum timp constant, timpul total rmne (n).
Exerciii
29.4-1 Fie a = '101101`, b = '011110` i n = 6. Artai, pentru a, b dai, cum opereaz
algoritmul ranului rus, att n binar, ct i n zecimal.
29.4-2 Demonstrai valabilitatea invarianilor (29.6) i (29.7) pentru multiplicatorii liniari.
29.4-3 Artai c v
(2n1)
= 0 n multiplicatorul liniar rapid.
29.4-4 Descriei cum reprezint multiplicatorul matriceal din seciunea 29.3.1 calculul nestra-
ticat al multiplicatorului liniar rapid.
29.4-5 Considerm un ux de date 'x
1
, x
2
, . . .` care sosete la un circuit cu ceas cu o rat de o
valoare pe tact. Pentru o valoare xat n, circuitul trebuie s calculeze valoarea:
y
t
= max
tn+1it
x
i
pentru t = n, n + 1, . . .. Astfel, y
t
este valoare maxim dintre cele mai recente n valori sosite
la circuit. Dai un circuit cu dimensiunea O(n) care, n ecare tact cu intrarea x
t
, calculeaz
valoarea de ieire y
t
n timp O(1). Circuitul poate utiliza regitri i elemente combinaionale care
calculeaz maximul dintre dou intrri.
29.4-6 Rezolvai din nou exerciiul 29.4-5 folosind numai O(lg n) elemente de tip maximum.
588 Capitolul 29 Circuite aritmetice
Probleme
29-1 Circuite de mprire
Pornind de la tehnica numit iteraie Newton, se poate construi un circuit de mprire folosind
circuite de scdere i de nmulire. Problema se rezolv plecnd de la problema nrudit de
calculare a inversului, obinnd astfel un circuit de mprire pornind de la un circuit adiional
de nmulire.
Ideea este de a calcula o secven y
0
, y
1
, y
2
, . . . de aproximare a inversului unui numr x
folosind formula:
y
i+1
2y
i
xy
2
i
.
Presupunem c este dat un numr binar fracionar x avnd n cifre dup virgul i 1/2 x 1.
Deoarece inversul poate avea o innitate de zecimale, vom calcula cele mai semnicative n cifre
ale lui.
a. Presupunem c [y
i
1/x[ , pentru un > 0 xat. Artai c [y
i+1
1/x[
2
.
b. Dai o aproximaie y
0
, astfel nct y
k
s satisfac relaia [y
k
1/x[ 2
2
k
, pentru orice
k 0. Ct de mare trebuie s e k astfel nct aproximaia y
k
s e potrivit, inclusiv
pentru cea mai puin semnicativ dintre cele n zecimale?
c. Descriei un circuit combinaional care, dac i se d o intrare x de n bii, aproximeaz 1/x
n timp O(lg
2
n). Care este dimensiunea acestui circuit? ( Cu puin isteime, se
poate nvinge limitarea dimensiunii la (n
2
lg n).)
29-2 Formule booleene pentru funcii simetrice
O funcie de n variabile f(x
1
, x
2
, . . . , x
n
) este simetric dac
f(x
1
, x
2
, . . . , x
n
) = f(x
(1)
, x
(2)
, . . . , x
(n)
)
pentru ecare permutare a mulimii 1, 2, . . . , n. n aceast problem presupunem c exist o
formul boolean ce reprezint pe f i a crei lungime este polinomial n n. (Pentru scopul
nostru, o formul boolean este un ir care cuprinde variabilele x
1
, x
2
, . . . , x
n
, paranteze i
operatorii booleeni , i .) Ideea de rezolvare este de a converti un circuit boolean de adncime
logaritmic ntr-o formul boolean de lungime polinomial. Presupunem c sunt folosite cte
dou circuite poart AND, OR, NOT.
a. ncepem construind o funcie simetric simpl: funcia majoritate generalizat pe n
intrri boolene, denit prin:
majoritate
n
(x
1
, x
2
, . . . , x
n
) =

1 dac x
1
+x
2
+. . . +x
n
> n/2,
0 altfel.
Descriei un circuit de adncime O(lg n) pentru funcia majoritate
n
. ( Construii
un arbore de sumatori.)
Note bibliograce 589
b. Presupunem c f este o funcie boolean oarecare de n variabile x
1
, x
2
, . . . , x
n
. Pesupunem
c exist un circuit C de adncime d care l calculeaz pe f. Artai cum se construiete,
pentru C, o formul boolean de lungime O(2
d
). Deducei c exist pentru majoritate
n
o
formul de dimensiune polinomial.
c. Artai c orice funcie boolean simetric f(x
1
, x
2
, . . . , x
n
) poate exprimat ca o funcie
de

n
i=1
x
i
.
d. Artai c orice funcie simetric de n intrri booleene poate calculat de ctre un circuit
combinaional de adncime O(lg n).
e. Artai c orice funcie boolean de n variabile booleene poate reprezentat printr-o
formul de dimensiune polinomial n n.
Note bibliograce
Cele mai multe cri de aritmetic i calculatoare se concentreaz mai mult pe aspectele
practice ale implementrii circuitelor dect pe o teorie algoritmic. Savage [173] este unul
dintre puinii care a cercetat aspecte algoritmice n acest domeniu. Recomandm crile de
aritmetica calculatoarelor, orientate hardware, ale lui Cavanagh [39] i Hwang [108]. n ceea ce
privete proiectarea circuitelor logice, combinaionale i secveniale, recomandm cartea lui Hill
i Peterson [96], i, n combinaie cu teoria limbajelor formale, cea a lui Kohavi [126].
Primele urme istorice ale algoritmicii aritmetice le ntlnim la Aiken i Hopper [7]. Algoritmii
de nsumare cu transport propagat sunt tot aa de vechi ca i abacul, care are cel puin 5000 de
ani. Primul calculator mecanic care a implementat acest tip de sumator este cel al lui B. Pascal
n 1642. S. Morland n 1666 i, independent de el, G. W. Leibnitz n 1671 au creat maini de
multiplicat prin adunri succesive. nmulirea folosind algoritmul ranului rus se pare c este
mai veche dect folosirea ei n Rusia secolului 19. Dup Knuth [122], metoda a fost folosit de
matematicienii egipteni nc nainte de 1800 .Hr.
Utilizarea strii irurilor de transport: distrugere, generare, propagare, a fost aplicat la
primul calculator construit la Harvard n jurul anului 1940 [180]. Una dintre primele implementri
ale sumatorului cu transport anticipat este descris de Weinberger i Smith [199], dar metoda
lor de anticipare cere pori foarte mari. Ofman [152] demonstreaz c numerele de n bii pot
nsumate, folosind un sumator cu transport anticipat, n timp O(lg n) i folosind pori de
dimensiune constant.
Ideea folosirii adunrii cu transport salvat pentru accelerarea nmulirii, aparine autorilor
Estrin, Gilchrist i Pomerene [64]. Atrubin [13] descrie un multiplicator liniar de lungime innit
ce poate folosit pentru nmulirea numerelor orict de mari. Multiplacatorul produce cel de-al
n-lea bit al produsului imediat ce primete al n-lea bit al intrrii. Multiplicatorul arbore Wallace
este atribuit lui Wallace [197], ns ideea lui a fost descoperit independent i de Ofman [152].
Algoritmii de mprire sunt datorai lui Newton, care, nc n jurul anului 1665, a inventat
ceea ce se cheam metoda iterativ a lui Newton. Problema 29-1 folosete aceast metod pentru
a construi un circuit de mprire cu adncimea (lg
2
n). Justicarea acestei metode a fost dat
de Beame, Cook i Hoover [19], care au artat c mprirea pe n bii poate efectuat, de fapt,
cu adncimea de (lg n).
30 Algoritmi pentru calculatoare paralele
Datorit creterii numrului calculatoarelor cu procesare paralel, a crescut i interesul
pentru algoritmii paraleli: algoritmi care efectueaz mai multe operaii n acelai timp. Studiul
algoritmilor paraleli a devenit, la ora actual, un nou domeniu de cercetare, de sine stttor.
ntr-adevr, au fost dezvoltai algoritmi paraleli pentru multe probleme care au fost rezolvate
folosind algoritmi seriali obinuii. n acest capitol vom descrie civa algoritmi paraleli simpli
care ilustreaz probleme i tehnici fundamentale.
Pentru a studia algoritmii paraleli, trebuie s alegem un model adecvat pentru calculul paralel.
Maina cu acces aleator, sau RAM (engl. Random-Acces Machine), folosit n cea mai mare parte
a acestei lucrri, este o main serial i nu una paralel. Modelele paralele pe care le-am studiat
reele de sortare (capitolul 28) i circuitele (capitolul 29) sunt prea restrictive pentru a
cerceta, de exemplu, algoritmi pe structuri de date.
Algoritmii paraleli, din acest capitol, sunt prezentai n termenii unui model teoretic cunoscut:
maina paralel cu acces aleator (engl. Parallel Random-Acces Machine), sau PRAM (se pronun
PE-ram). Muli algoritmi paraleli pentru iruri, liste, arbori sau grafuri pot foarte uor descrii
folosind modelul PRAM. Cu toate c acest model ignor multe aspecte importante ale mainilor
paralele reale, atributele eseniale ale algoritmilor paraleli tind s nu e limitai de modelele
pentru care au fost proiectai. Dac un algoritm PRAM este mai bun dect un alt algoritm
PRAM, este puin probabil ca performanele relative ale acestor algoritmi s se schimbe n
mod substanial cnd ambii algoritmi sunt adaptai execuiei pe un calculator real cu procesare
paralel.
Modelul PRAM
n gura 30.1 este prezentat arhitectura de baz a unei maini paralele cu acces aleator
(PRAM). Exist p procesoare (seriale) obinuite P
0
, P
1
, . . . , P
p1
care au ca spaiu de stocare
o memorie global partajat. Toate aceste procesoare pot citi sau scrie n aceast memorie n
paralel (n acelai timp). De asemenea, procesoarele pot efectua diferite operaii aritmetice i
logice n paralel.
Ipoteza de baz n privina performanelor algoritmilor PRAM este aceea c timpul de
execuie poate msurat prin numrul accesrilor paralele la memorie efectuate de algoritm.
Aceast ipotez reprezint o generalizare direct a modelelor RAM obinuite, n care numrul
accesrilor este, asimptotic, la fel de bun ca orice alt modalitate de a msura timpul de
execuie. Aceast ipotez simpl ne va foarte folositoare n cercetarea algoritmilor paraleli,
chiar i atunci cnd calculatoarele reale cu procesare paralel nu pot executa accesri paralele la
memoria global ntr-o unitate de timp: timpul necesar unei accesri crete o dat cu numrul
procesoarelor din calculator.
Cu toate acestea, pentru algoritmii paraleli care acceseaz datele ntr-un anume fel, poate
justicat ipoteza efecturii operaiilor cu memoria n unitatea de timp. Mainile paralele
reale au, de obicei, o reea de comunicaie care poate simula aceast memorie global. Accesarea
datelor prin intermediul acestei reele este o operaie relativ lent n comparaie cu alte operaii
cum ar cele aritmetice. De aceea, numrnd accesrile paralele la memorie efectuate de doi
algoritmi paraleli, obinem, de fapt, o estimare destul de exact a performanelor lor relative.
Capitolul 30 Algoritmi pentru calculatoare paralele 591
Figura 30.1 Arhitectura de baz a mainii paralele cu acces aleator. Exist p procesoare P
0
,
P
1
, . . ., P
p1
conectate la o memorie partajat. Fiecare procesor poate accesa un cuvnt arbitrar
al memoriei partajate n unitatea de timp.
Motivul principal pentru care mainile reale ncalc aceast abstractizare a unitii de timp, este
acela c anumite modele de accesare a memoriei sunt mai rapide dect altele. Totui, ca o prim
aproximare, ipoteza unitii de timp pentru modelele PRAM este destul de rezonabil.
Timpul de execuie al unui algoritm paralel depinde att de numrul procesoarelor care
execut acel algoritm ct i de dimensiunea datelor de intrare. De aceea, n general, va trebui s
lum n considerare att timpul ct i numrul de procesoare cnd analizm algoritmii PRAM;
aceasta este o mare deosebire fa de algoritmii seriali a cror analiz se concentra mai ales
asupra timpului. De obicei, exist o legtur ntre numrul de procesoare folosite de un algoritm
i timpul su de execuie. Acest subiect va discutat n seciunea 30.3.
Accesarea concurent i accesarea exclusiv
Un algoritm cu citire concurent este un algoritm PRAM n timpul execuiei cruia mai
multe procesoare pot citi, n acelai timp, din aceeai locaie a memoriei partajate. Un algoritm
cu citire exclusiv este un algoritm PRAM n timpul execuiei cruia dou procesoare nu pot
citi, din aceeai locaie de memorie, n acelai timp. Facem o distincie similar pentru algoritmii
n cadrul execuiei crora dou procesoare pot sau nu s scrie n aceeai locaie de memorie n
acelai timp, mprind algoritmii PRAM n algoritmi cu scriere concurent i algoritmi cu
scriere exclusiv. Abrevierile folosite, de obicei, pentru tipurile de algoritmi pe care i vom
ntlni sunt:
EREW: citire exclusiv i scriere exclusiv
CREW: citire concurent i scriere exclusiv
ERCW: citire exclusiv i scriere concurent
CRCW: citire concurent i scriere concurent
Aceste prescurtri provin din limba englez i, de obicei, nu sunt pronunate ntr-un singur
cuvnt ci ca secvene de litere. Literele E, C, R i W provin de la cuvintele , ,
, care se traduc prin , , , respectiv .
592 Capitolul 30 Algoritmi pentru calculatoare paralele
Dintre aceste tipuri de algoritmi, extremele EREW i CRCW sunt cele mai populare. O
main care suport numai algoritmi EREW este numit EREW PRAM, iar una care suport
i algoritmi CRCW poart denumirea de CRCW PRAM. Este evident c o main CRCW
PRAM poate executa algoritmi EREW, dar o main EREW PRAM nu poate suporta, direct,
accesrile concurente ale memoriei necesare unui algoritm CRCW. Hardware-ul necesar unei
maini EREW PRAM este rapid deoarece nu este foarte complex, neind necesar tratarea unor
conicte cauzate de scrieri i citiri simultane. O main CRCW PRAM necesit suport hardware
suplimentar pentru ca ipoteza unitii de timp s dea o msur acceptabil a performanelor
algoritmului. Totui, aceast main ofer un model de programare care este mai direct dect
cel oferit de mainile EREW PRAM.
Dintre celelalte dou tipuri de algoritmi CREW i ERCW literatura de specialitate a
acordat mai mult atenie tipului CREW. Totui, din punct de vedere practic, suportul pentru
scrierea concurent nu este mai dicil de realizat dect suportul pentru citirea concurent. n
general, n acest capitol vom trata algoritmii ca ind de tip CRCW dac vor conine citiri sau
scrieri concurente, fr a mai face alte distincii. Vom discuta diferite aspecte ale acestei distincii
n seciunea 30.2.
Cnd mai multe procesoare scriu n aceeai locaie n timpul execuiei unui algoritm CRCW,
efectul scrierii paralele nu este bine denit fr clasicri suplimentare. n acest capitol, vom
folosi modelul CRCW-comun: cnd mai multe procesoare scriu n aceeai locaie, ele trebuie
s scrie aceeai valoare (comun). n literatura de specialitate, sunt prezentate mai multe tipuri
alternative de maini PRAM care trateaz aceast problem pornind de la alte ipoteze. Alte
posibiliti sunt:
CRCW-arbitrar: stocheaz o valoare arbitrar dintre cele care se ncearc a scrise
CRCW-prioritar: stocheaz valoarea pe care ncearc s o scrie procesorul cu indicele
cel mai mic
CRCW-combinat: stocheaz o valoare obinut printr-o combinaie specicat a valorilor
care se ncearc a scrise
n cazul ultimului tip, combinaia specicat este, de obicei, o funcie asociativ i comutativ
cum ar adunarea (se stocheaz suma valorilor care se ncearc a scrise) sau maximul (se
stocheaz maximul valorilor care se ncearc a scrise).
Sincronizare i control
Algoritmii PRAM trebuie s e bine sincronizai pentru a lucra corect. Cum este obinut
aceast sincronizare? De asemenea, deseori, procesoarele care execut algoritmi PRAM trebuie
s detecteze condiii de terminare sau de ciclare care depind de starea tuturor procesoarelor.
Cum este implementat aceast funcie de control?
Nu vom discuta detaliat aceste probleme. Multe calculatoare reale cu procesare paralel
conin o reea de control care conecteaz procesoarele i care ajut la condiiile de terminare
i sincronizare. De obicei, reeaua de control poate implementa aceste funcii n acelai timp n
care o reea de rutaj poate implementa referine la memoria global.
Pentru scopurile noastre, este sucient s presupunem c aceste procesoare sunt foarte
bine sincronizate. La un moment dat, indicele instruciunii executate este acelai pentru toate
30.1. Saltul de pointer 593
procesoarele. Nici un procesor nu avanseaz n timp ce altele execut instruciuni care se a
nainte n cod. n timpul prezentrii primului algoritm paralel, vom puncta momentele n care
presupunem c procesoarele sunt sincronizate.
Pentru a detecta terminarea unei instruciuni paralele de ciclare care depinde de starea
tuturor procesoarelor, vom presupune c o condiie de terminare paralel poate testat n
reeaua de control n timp O(1). Unele modele EREW PRAM prezentate n literatura de
specialitate nu iau n considerare aceast ipotez i timpul (logaritmic) necesar testrii condiiei
de ciclare trebuie inclus n timpul total de execuie (vezi exerciiul 30.1-8). Dup cum vom
vedea n seciunea 30.2, mainile CRCW PRAM nu au nevoie de o reea de control pentru a
testa terminarea: ele pot detecta terminarea unei instruciuni paralele de ciclare n timp O(1)
cu ajutorul scrierilor concurente.
Rezumatul capitolului
n seciunea 30.1, vom introduce tehnica saltului de pointer care ofer o modalitate rapid
de a manipula liste n paralel. Vom arta cum saltul de pointer poate folosit pentru a realiza
calcule de prexe pe liste i cum unii algoritmi rapizi cu liste pot adaptai pentru lucrul cu
arbori. n seciunea 30.2, vom discuta puterea relativ a algoritmilor CRCW i EREW i vom
arta c accesarea concurent a memoriei ofer o putere mai mare de execuie.
n seciunea 30.3, va prezentat teorema lui Brent care arat cum mainile PRAM pot
simula ecient circuitele combinaionale. n aceast seciune, vom discuta problema important
a ecienei muncii i vom prezenta condiiile care trebuie ndeplinite pentru ca un algoritm
PRAM care folosete p procesoare (algoritm PRAM p-procesor) s poat transformat ntr-un
algoritm PRAM p
t
-procesor pentru orice p
t
< p. n seciunea 30.4, se va relua problema realizrii
calculelor de prexe ntr-o list nlnuit i va prezentat modul n care un algoritm probabilist
poate efectua ecient calculul. n nal, n seciunea 30.5, se va arta cum poate repartizat
simetria n paralel, folosind un algoritm determinist. Timpul de execuie va unul mult mai bun
dect cel logaritmic.
Algoritmii paraleli prezentai n acest capitol au fost preluai, n special, din domeniul teoriei
grafurilor. Ei reprezint numai o mic selecie a algoritmilor paraleli cunoscui n prezent. Totui,
tehnicile introduse n acest capitol sunt destul de reprezentative pentru tehnicile folosite pentru
algoritmii probabiliti din alte domenii ale informaticii.
30.1. Saltul de pointer
Printre cei mai importani algoritmi PRAM, se a cei care implic pointeri. n aceast
seciune, vom investiga o tehnic puternic numit salt de pointer care duce la algoritmi rapizi
pentru operaiile cu liste. Mai exact, vom introduce un algoritm care ruleaz n timp O(lg n) i
care determin distana fa de captul listei pentru ecare obiect dintr-o list cu n obiecte. Vom
modica, apoi, acest algoritm pentru a realiza un calcul paralel al prexului pentru o list cu
n obiecte n timp O(lg n). n nal, vom cerceta o metod care permite ca mai multe probleme
cu arbori s e convertite n probleme cu liste care vor putea rezolvate cu ajutorul saltului de
pointer. Toi algoritmii din aceast seciune sunt algoritmi EREW, nici o accesare concurent la
memoria global neind necesar.
594 Capitolul 30 Algoritmi pentru calculatoare paralele
Figura 30.2 Determinarea distanei de la ecare obiect al unei liste cu n obiecte pn la captul
listei n timp O(lg n) folosind saltul de pointer. (a) O list nlnuit reprezentat ntr-o main
PRAM cu valorile d iniializate. La sfritul algoritmului, ecare valoare d va pstra distana de la
obiectul corespunztor la captul listei. Pentru ecare obiect, procesorul responsabil de acel obiect
apare deasupra. (b)-(d) Pointerii i valorile d dup ecare iteraie a buclei ct timp n algoritmul
Rang-List.
30.1.1. Determinarea rangului obiectelor unei liste
Primul nostru algoritm paralel opereaz cu liste. Vom putea stoca o list ntr-o main
PRAM la fel cum am stocat o list ntr-o main RAM obinuit. Totui, pentru a opera n
paralel cu obiectele listei, este convenabil s atribuim ecrui obiect un procesor responsabil.
Vom presupune c numrul obiectelor din list nu depete numrul procesoarelor disponibile,
i c al i-lea procesor este responsabil de al i-lea obiect. De exemplu, n gura 30.2(a) este
prezentat o list nlnuit constnd dintr-un ir de obiecte '3, 4, 6, 1, 0, 5`. Deoarece exist
cte un procesor pentru ecare obiect al listei, operaiile efectuate de ctre un procesor asupra
obiectului corespunztor pot realizate n timp O(1).
S presupunem c se d o list simplu nlnuit L cu n obiecte i dorim s determinm,
pentru ecare obiect din L, distana pn la captul listei. Mai exact, dac este cmpul
pointerului, vom dori s calculm o valoare d[i] pentru ecare obiect i al listei, astfel nct
d[i] =

0 dac urm[i] = nil,


d[urm[i]] + 1 dac urm[i] = nil.
Vom numi problema determinrii valorilor d problema determinrii rangului elementelor
unei liste.
O soluie a problemei determinrii rangului elementelor unei liste este de a propaga, pur i
simplu, distana de la captul listei. Aceast metod necesit un timp (n) deoarece al k-lea
obiect din captul listei trebuie s atepte ca cele k 1 obiecte care l urmeaz s-i determine
distanele pn la capt nainte de a-i putea determina propria distan. Aceast soluie este,
n esen, un algoritm serial.
O soluie paralel ecient, necesitnd doar un timp O(lg n), este dat de algoritmul Rang-
List(L).
n gura 30.2 este ilustrat modul n care algoritmul determin distanele. Fiecare seciune
a gurii arat starea listei naintea unei iteraii a buclei ct timp n liniile 610. n seciunea
(a) este prezentat lista, imediat dup iniializare. La prima iteraie, primele 5 obiecte ale listei
30.1. Saltul de pointer 595
nu vor avea pointeri nil, deci liniile 910 vor executate de procesoarele corespunztoare lor.
Rezultatul apare n seciunea (b) a gurii. La a doua iteraie, numai primele 4 obiecte nu au
pointeri nil: rezultatul acestei iteraii este prezentat n seciunea (c). La a treia iteraie, nu se
efectueaz dect operaii asupra primelor dou obiecte, i rezultatul nal n care toate obiectele
au pointer nil este prezentat n seciunea (d).
Rang-List(L)
1: pentru ecare procesor i, n paralel execut
2: dac urm[i] = nil atunci
3: d[i] 0
4: altfel
5: d[i] 1
6: ct timp exist un obiect i astfel nct urm[i] = nil execut
7: pentru ecare procesor i, n paralel execut
8: dac urm[i] = nil atunci
9: d[i] d[i] +d[urm[i]]
10: urm[i] urm[urm[i]]
Ideea implementat n linia 10, n care efectum atribuirea urm[i] urm[urm[i]] pentru toi
pointerii urm[i] care nu au valoarea nil, este numit saltul de pointer. Cmpurile pointer sunt
schimbate prin saltul de pointer, deci este distrus structura listei. Dac structura listei trebuie
pstrat, atunci construim copii ale pointerilor urm; apoi, vom folosi copiile pentru a calcula
distanele.
Corectitudinea
Algoritmului Rang-List respect proprietatea c, la nceputul ecrei iteraii a buclei ct
timp din liniile 610, pentru ecare obiect i, dac adunm valorile d ale sublistei al crei vrf
este i, obinem distana corect de la i la captul listei originale L. De exemplu, n gura 30.2(b),
sublista al crei vrf este obiectul 3 este '3, 6, 0`, valorile d corespunztoare celor trei obiecte din
list, 2, 2 i 1 avnd suma 5, adic exact distana fa de sfritul listei. Motivul pentru care
algoritmul respect aceast proprietate este acela c, atunci cnd ecare obiect se lipete de
succesorul su din list, valoarea d a succesorului este adunat la valoarea d a obiectului curent.
Observai c, pentru ca algoritmul saltului de pointer s lucreze corect, accesrile simultane
la memorie trebuie s e sincronizate. Fiecare execuie a liniei 10 poate actualiza civa pointeri
urm. Ne bazm pe faptul c toate citirile din memorie din partea dreapt a atribuirii (citirea
urm[urm[i]]) au loc naintea oricrei scrieri n memorie (scrierea urm[i]) din partea stng.
Motivul pentru care algoritmul Rang-List este un algoritm EREW este acela c ecare
procesor este responsabil pentru cel mult un obiect i ecare citire i scriere din liniile 28
este exclusiv, la fel ca i scrierile din liniile 9 i 10. Se observ c saltul de pointer respect
proprietatea c, pentru oricare dou obiecte distincte i i j, avem e urm[i] = urm[j], e
urm[i] = urm[j] = nil. Aceast proprietate este, cu siguran, adevrat pentru lista iniial i
este pstrat prin execuia liniei 10. Deoarece toate valorile urm care nu au valoarea nil sunt
distincte, toate citirile din linia 10 sunt exclusive.
Trebuie s presupunem c este efectuat o anume sincronizare n linia 9 pentru ca toate
citirile s e exclusive. Mai exact, este nevoie ca toate procesoarele i s citeasc, mai nti, d[i]
i, apoi, d[urm[i]]. Dac un obiect i are valoarea urm[i] = nil i exist un alt obiect j care
596 Capitolul 30 Algoritmi pentru calculatoare paralele
refer i (adic urm[j] = i), atunci, cu aceast sincronizare, prima citire va furniza valoarea d[i]
pentru procesorul i, i a doua va furniza aceeai valoare d[i] pentru procesorul j. n concluzie,
Rang-List este un algoritm EREW.
De aici nainte vom ignora astfel de detalii de sincronizare i vom presupune c mainile
PRAM i mediile de programare n pseudocod acioneaz ntr-o manier sincronizat, toate
procesoarele executnd citiri i scrieri n acelai timp.
Analiz
Vom arta acum c, dac exist n obiecte n lista L, atunci Rang-List este executat ntr-
un timp O(lg n). Deoarece iniializrile necesit un timp O(1) i ecare iteraie a buclei ct timp
necesit un timp O(1), este sucient s artm c exist exact lg n| iteraii. Observaia cheie
este c ecare pas al saltului de pointer transform ecare list n dou liste ntreptrunse, una
format din obiectele de rang par i cealalt format din obiectele de rang impar. Deci ecare
pas al saltului de pointer dubleaz numrul listelor i njumtete lungimile lor. n concluzie,
la sfritul celor lg n| iteraii, toate listele vor formate dintr-un singur obiect.
Presupunem c testul de terminare din linia 6 are nevoie de un timp O(1) datorit reelei de
control din maina EREW PRAM. Exerciiul 30.1-8 v cere s descriei o implementare EREW
a algoritmului Rang-List care realizeaz explicit testul de terminare. Acest algoritm va trebui
s se execute ntr-un timp O(lg n).
Pe lng timpul de execuie n paralel, exist o alt msur interesant a performanei unui
algoritm paralel. Denim efortul depus de un algoritm paralel ca ind produsul dintre timpul
de execuie i numrul de procesoare de care are nevoie respectivul algoritm. Intuitiv, efortul
este dat de numrul de operaii pe care le efectueaz o main RAM serial cnd simuleaz
algoritmul paralel.
Procedura Rang-List depune un efort (nlg n) deoarece necesit n procesoare i un timp
de execuie (lg n). Un algoritm serial direct, pentru problema determinrii rangului obiectelor
unei liste, ruleaz ntr-un timp (n), ceea ce arat c Rang-List depune un efort mai mare
dect este necesar, dar acest efort este mai mare doar cu un factor logaritmic.
Spunem c un algoritm PRAM A este ecient ca efort fa de un alt algoritm (serial sau
paralel) B, care rezolv aceeai problem, dac efortul depus de A nu este dect cu un factor
constant mai mare dect efortul depus de B. Putem spune mai simplu c un algoritm PRAM
A este ecient ca efort dac este ecient ca efort fa de cel mai bun algoritm scris pentru o
main RAM. Deoarece cel mai bun algoritm serial pentru determinarea rangului obiectelor unei
liste ruleaz n timp (n) pe o main serial RAM, Rang-List nu este ecient ca efort. n
seciunea 30.4 vom prezenta un algoritm paralel ecient ca efort pentru determinarea rangului
obiectelor unei liste.
30.1.2. Determinarea prexului obiectelor unei liste
Tehnica saltului de pointer poate extins mult peste determinarea rangului obiectelor unei
liste. n seciunea 29.2.2 se arat modul n care, n contextul circuitelor aritmetice, un calcul
al prexului poate folosit pentru a realiza, rapid, adunarea binar. Vom cerceta cum poate
folosit saltul de pointer pentru calculul prexului. Algoritmul nostru EREW ruleaz n timp
O(lg n) pe o list cu n obiecte.
30.1. Saltul de pointer 597
Un calcul al prexului este denit n termenii unui operator binar asociativ . Calculul
are, ca intrare, un ir 'x
1
, x
2
, . . . , x
n
` i produce, la ieire, un ir 'y
1
, y
2
, . . . , y
n
`, astfel nct
y
1
= x
1
i y
k
= y
k1
x
k
= x
1
x
2
x
k
pentru k = 2, 3, . . . , n. Cu alte cuvinte, y
k
este
obinut nmulind primele k elemente ale irului x
k
de aici termenul prex. (Deniia din
capitolul 29 indexeaz irurile ncepnd cu 0, n timp ce aceast deniie le indexeaz ncepnd
cu 1 o diferen neesenial.)
Pentru exemplicarea calculului prexului, s presupunem c ecare element al unei liste cu
n obiecte are valoarea 1, i e adunarea obinuit. Deoarece al k-lea element al listei conine
valoarea x
k
= 1, pentru k = 1, 2, . . . , n, un calcul al prexului produce y
k
= k, indicele celui de-al
k-lea element. Deci o alt modalitate de a determina rangul obiectelor unei liste este inversarea
listei (care poate realizat ntr-un timp O(1)), calculul prexului i scderea unei uniti din
ecare valoare calculat.
Artm, acum, modul n care un algoritm EREW poate calcula, n paralel, prexele ntr-un
timp O(lg n) pe o list cu n obiecte. Fie notaia
[i, j] = x
i
x
i+1
x
j
pentru numerele ntregi i i j din domeniul 1 i j n. Atunci [k, k] = x
k
, pentru k =
1, 2, . . . , n, i
[i, k] = [i, j] [j + 1, k]
pentru 1 i j < k n. Conform acestei notaii, scopul unui calcul al prexului este acela de
a calcula y
k
= [1, k] pentru k = 1, 2, . . . , n.
Cnd realizm un calcul de prex pe o list, dorim ca ordinea irului de intrare 'x
1
, x
2
, . . . , x
n
`
s e determinat de modul n care sunt nlnuite obiectele n list i nu de indicele obiectelor
n irul din memorie n care sunt stocate obiectele. (Exerciiul 30.1-2 v solicit un algoritm
care s calculeze prexul pentru iruri.) Urmtorul algoritm EREW ncepe cu o valoare x[i]
pentru ecare obiect i al listei L. Dac obiectul i este al k-lea obiect de la nceputul listei, atunci
x[i] = x
k
este al k-lea element al irului de intrare. Deci calculul paralel al prexului produce
y[i] = y
k
= [1, k].
Prefix-List
1: pentru ecare procesor i, n paralel execut
2: y[i] x[i]
3: ct timp exist un obiect i astfel nct urm[i] = nil execut
4: pentru ecare procesor i, n paralel execut
5: dac urm[i] = nil atunci
6: y[urm[i]] y[i] y[urm[i]]
7: urm[i] urm[urm[i]]
Pseudocodul i gura 30.3 ilustreaz similitudinea dintre acest algoritm i Rang-List.
Singura diferen este iniializarea i actualizarea valorilor y. n Rang-List, procesorul i ac-
tualizeaz d[i] propria sa valoare d n timp ce n Prefix-List, procesorul i actualizeaz
y[urm[i]] valoarea y a unui alt procesor. Observai c Prefix-List este un algoritm EREW
din acelai motiv ca i algoritmul Rang-List: saltul de pointer respect proprietatea c pentru
obiecte distincte i i j, e urm[i] = urm[j], e urm[i] = urm[j] = nil.
n gura 30.3 este prezentat starea listei naintea ecrei iteraii a buclei ct timp. Pro-
cedura respect proprietatea c, la sfritul celei de-a t-a execuie a buclei ct timp, al k-lea
598 Capitolul 30 Algoritmi pentru calculatoare paralele
Figura 30.3 Algoritmul paralel pentru determinarea prexelor obiectelor unei liste, Prefix-List, pe
o list nlnuit. (a) Valoarea iniial y a celui de-al k-lea obiect din list este [k, k]. Pointerul urm
al celui de-al k-lea obiect indic spre al k + 1-lea sau are valoarea nil pentru ultimul obiect. (b)-(d)
Valorile y i urm naintea ecrui test din linia 3. Rspunsul nal apare n partea (d) n care valoarea
y pentru al k-lea obiect este [1, k] pentru orice k.
procesor stocheaz [max(1, k 2
t
+ 1), k], pentru k = 1, 2, . . . , n. La prima iteraie, al k-lea
obiect din list indic iniial spre al (k + 1)-lea obiect, cu excepia ultimului obiect, care are un
pointer nil. n linia 6, al k-lea obiect, pentru k = 1, 2, . . . , n1, va extrage valoarea [k +1, k +1]
de la succesorul su. Apoi, va efectua operaia [k, k] [k + 1, k + 1] care duce la rezultatul
[k, k + 1] care va stocat n urmtorul obiect. Se efectueaz salturi de pointer pentru pointerii
urm ca i n cazul algoritmului Rang-List i rezultatul primei iteraii apare n gura 30.3(b).
n mod similar, putem vedea a doua iteraie. Pentru k = 1, 2, . . . , n 2, al k-lea obiect extrage
valoarea [k + 1, k + 2] de la succesorul su i apoi stocheaz, n urmtorul obiect, valoarea
[k 1, k] [k + 1, k + 2] = [k 1, k + 2]. Rezultatul este artat n gura 30.3(c). La a treia i
ultima iteraie, numai primele dou obiecte ale listei nu au pointeri cu valoarea nil i extrag
valori din succesorii lor, afali n listele corespunztoare. Rezultatul nal apare n gura 30.3(d).
Observaia cheie care face algoritmul Prefix-List s funcioneze corect este c, la ecare pas,
dac efectum un calcul al prexului pe ecare din listele existente, ecare obiect obine valoarea
sa corect.
Deoarece ambii algoritmi folosesc acelai mecanism al saltului de pointer, analiza pentru
Prefix-List este aceeai ca i Rang-List: timpul de execuie este O(lg n) pe o main
EREW PRAM i efortul total depus este (nlg n).
30.1.3. Tehnica ciclului eulerian
n aceast seciune, vom introduce tehnica ciclului eulerian i vom arta modul n care aceasta
poate aplicat pentru problema calculrii adncimii ecrui nod ntr-un arbore binar cu n
noduri. Un pas cheie n acest algoritm EREW care se execut ntr-un timp O(lg n) este calculul
paralel al prexului.
Pentru a stoca un arbore binar ntr-o main PRAM, folosim o reprezentare simpl a arborelui
binar de genul celei prezentate n seciunea 11.4. Fiecare nod i are cmpurile tata[i], st anga[i]
i dreapta[i] care indic spre nodul tat al nodului i, respectiv, spre ul stng i spre ul
drept. S presupunem c ecare nod este identicat printr-un ntreg nenegativ. Din motive
care vor evidente curnd, asociem nu unul, ci trei procesoare pentru ecare nod i le vom numi
30.1. Saltul de pointer 599
procesoarele A, B i C ale nodului respectiv. Ar trebui s putem crea uor o coresponden ntre
un nod i cele trei procesoare ale sale; de exemplu, nodul i ar putea asociat cu procesoarele 3i,
3i + 1 i 3i + 2.
Calculul adncimii ecrui nod al unui arbore cu n noduri necesit un timp O(n) pe o main
RAM serial. Un algoritm paralel simplu pentru calculul adncimilor propag o und n jos de
la rdcina arborelui. Unda ajunge la toate nodurile care au aceeai adncime n acelai moment,
deci, incrementnd un contor, vom putea determina adncimea ecrui nod. Acest algoritm este
ecient pentru un arbore binar complet deoarece ruleaz ntr-un timp proporional cu nlimea
arborelui. nlimea arborelui poate ns avea valoarea n 1, caz n care algoritmul va necesita
un timp (n) nu este mai bun dect algoritmul serial. Totui, folosind tehnica ciclului eulerian,
putem calcula adncimile nodurilor n timp O(lg n) pe o main EREW PRAM, indiferent care
este nlimea arborelui.
Un ciclu eulerian ntr-un graf este un ciclu care traverseaz ecare muchie exact o dat,
cu toate c poate vizita un vrf de mai multe ori. Problema 23-3 v cerea s demonstrai c
un graf conex orientat conine un ciclu eulerian dac i numai dac, pentru toate vrfurile v,
gradul interior al lui v este egal cu gradul exterior al lui v. Deoarece ecare muchie (u, v) a unui
graf neorientat este pus n coresponden cu dou arce (u, v) i (v, u) din versiunea orientat a
grafului, versiunea orientat a oricrui graf conex neorientat i deci a oricrui arbore neorientat
are un ciclu eulerian.
Pentru a calcula adncimea nodurilor dintr-un arbore binar T, determinm, mai nti, un
ciclu eulerian al versiunii orientate a lui T (vzut ca un graf neorientat). Ciclul corespunde unei
parcurgeri a arborelui i este reprezentat n gura 30.4(a) printr-o list nlnuit care traverseaz
nodurile arborelui. Structura acesteia poate descris dup cum urmeaz:
Procesorul A al unui nod indic spre procesorul A al ului su stng dac acesta exist
sau spre propriul procesor B dac ul stng nu exist.
Procesorul B al unui nod indic spre procesorul A al ului su drept dac acesta exist
sau spre propriul procesor C dac ul drept nu exist.
Procesorul C al unui nod indic spre procesorul B al printelui su dac este un u stng
i spre procesorul C al printelui dac este un u drept. Procesorul C al rdcinii va avea
valoarea nil.
Deci, capul listei nlnuite formate de ciclul eulerian este procesorul A al rdcinii i coada
este procesorul C al rdcinii. Dndu-se pointerii care compun arborele original, un ciclu eulerian
poate construit n timp O(1).
Dup ce avem lista nlnuit reprezentnd ciclul eulerian al lui T, vom plasa un 1 n ecare
procesor A, un 0 n ecare procesor B i un 1 n ecare procesor C, dup cum se arat n gura
30.4(a). Efectum, apoi, un calcul paralel al prexului folosind adunarea obinuit ca operaie
asociativ aa cum am fcut i n seciunea 30.1.2. n gura 30.4(b) este prezentat rezultatul
calculului paralel al prexului.
Dup efectuarea calculului paralel al prexului, adncimea ecrui nod va pstrat n
procesorul C al nodului. De ce? Numerele sunt plasate n procesoarele A, B i C astfel nct
efectul vizitrii unui subarbore s e adunarea unui 0 la valoarea sumei de rulare. Procesorul A
al ecrui nod i contribuie cu 1 la suma de rulare n subarborele stng al lui i reectnd faptul c
adncimea ului stng al lui i este cu 1 mai mare dect adncimea lui i. Procesorul B contribuie
600 Capitolul 30 Algoritmi pentru calculatoare paralele
Figura 30.4 Folosirea tehnicii ciclului eulerian pentru calculul adncimii ecrui nod dintr-un arbore
binar (a) Ciclul eulerian este o list corespunztoare unei parcurgeri a arborelui. Fiecare procesor conine
un numr folosit de un calcul paralel al prexului pentru a calcula adncimile nodurilor. (b) Rezultatul
calculului paralel al prexului pe lista nlnuit de la (a). Procesorul C al ecrui nod (haurat cu
negru) conine adncimea nodului. (Putei verica rezultatul acestui calcul al prexului calculndu-l
serial.)
30.2. Algoritmi CRCW i algoritmi EREW 601
cu 0 deoarece adncimea ului stng al lui i este egal cu adncimea ului drept al aceluiai
nod i. Procesorul C contribuie cu 1 pentru ca, din perspectiva printelui lui i, ntreaga vizit
a subarborelui a crui rdcin este i s nu aib efect asupra sumei de rulare.
Lista reprezentnd ciclul eulerian poate determinat n timp O(1). Lista are 3n obiecte,
deci calculul paralel al prexului necesit un timp O(lg n). n concluzie, timpul total pentru
a determina adncimile tuturor nodurilor este O(lg n). Deoarece nu sunt necesare accesri
concurente ale memoriei, algoritmul prezentat este un algoritm EREW.
Exerciii
30.1-1 Dai un algoritm EREW n timp O(lg n) pentru a decide, pentru ecare obiect dintr-o
list cu n obiecte, dac este obiectul din mijloc (al n/2|-lea).
30.1-2 Dai un algoritm EREW n timp O(lg n) pentru a efectua calculul prexului pentru un
vector x[1..n]. Nu folosii pointeri, ci efectuai direct calculele de indice.
30.1-3 S presupunem c ecare obiect dintr-o list L cu n obiecte este colorat e cu rou, e
cu albastru. Dai un algoritm EREW ecient pentru a forma dou liste care s conin obiectele
din L: una format din obiectele albastre i cealalt din cele roii.
30.1-4 O main EREW PRAM are n obiecte distribuite ntre cteva liste circulare disjuncte.
Dai un algoritm ecient care determin arbitrar un obiect reprezentativ pentru ecare list i
comunic ecrui obiect din list, identitatea reprezentatului. Presupunem c ecare procesor
i cunoate propriul indice unic.
30.1-5 Dai un algoritm EREW care s se execute n timp O(lg n) pentru a calcula dimensiunile
subarborilor care au ca rdcin cele n noduri ale unui arbore binar. ( Luai diferena
a dou valori ntr-o sum de rulare de-a lungul unui ciclu eulerian.)
30.1-6 Dai un algoritm EREW ecient pentru determinarea numerotrii n preordine, inordine
i postordine a unui arbore binar arbitrar.
30.1-7 Extindei tehnica ciclului eulerian de la arbori binari la arbori de sortare cu grade
arbitrare ale nodurilor. Mai precis, descriei o reprezentare pentru arborii de sortare care permite
aplicarea tehnicii ciclului eulerian. Dai un algoritm EREW pentru a calcula adncimile nodurilor
unui arbore de sortare cu n noduri ntr-un timp O(lg n).
30.1-8 Descriei o implementare EREW n timp O(lg n) pentru Rang-List care efectueaz
explicit condiia de terminare a buclei. ( mbinai testul cu corpul buclei.)
30.2. Algoritmi CRCW i algoritmi EREW
Discuiile cu privire la oportunitatea de a oferi posibilitatea accesrii concurente a memoriei
sunt foarte aprinse. Unii arm c mecanismele hardware care suport algoritmii CRCW sunt
prea costisitoare i sunt folosite prea rar pentru ca dezvoltarea lor s e justicat. Alii se
plng c mainile EREW PRAM furnizeaz un model de programare prea restrictiv. Probabil
602 Capitolul 30 Algoritmi pentru calculatoare paralele
c adevrul este undeva la mijloc i, de aceea, au fost propuse diferite modele de compromis.
Cu toate acestea, este instructiv s examinm ce avantaje algoritmice sunt oferite de accesrile
concurente la memorie.
n aceast seciune vom arta c exist probleme n care un algoritm CRCW depete
performanele celui mai bun algoritm EREW posibil. Pentru problema gsirii identitilor
rdcinilor arborilor dintr-o pdure, citirile concurente permit descrierea unui algoritm mai rapid.
Pentru problema gsirii elementului maxim dintr-un vector, scrierile concurente permit descrierea
unui algoritm mai rapid.
O problem n care sunt folositoare citirile concurente
Fie o pdure de arbori binari n care ecare nod i are un pointer tata[i] care indic spre
printele su i dorim ca, pentru ecare nod, s se determine identitatea rdcinii arborelui din
care face parte nodul. Asociind procesorul i cu ecare nod i din pdurea F, urmtorul algoritm
de salt de pointer stocheaz identitatea rdcinii arborelui ecrui nod i n r ad acin a[i].
Gsete-Rdcini
1: pentru ecare procesor i, n paralel execut
2: dac tata[i] = nil atunci
3: r ad acin a[i] i
4: ct timp exist un nod i astfel nct tata[i] = nil execut
5: pentru ecare procesor i, n paralel execut
6: dac tata[i] = nil atunci
7: dac tata[tata[i]] = nil atunci
8: r ad acin a[i] r ad acin a[tata[i]]
9: tata[i] tata[tata[i]]
n gura 30.5 sunt ilustrate operaiile efectuate de acest algoritm. Dup iniializrile efectuate
n liniile 13, prezentate n gura 30.5(a), singurele noduri care pot identica rdcinile cores-
punztoare sunt chiar rdcinile. Bucla ct timp din liniile 49 execut saltul de pointer i
completeaz cmpurile r ad acin a. n gurile 30.5(b)-(d) se prezint starea pdurii dup prima,
a doua i a treia iteraie a buclei. Dup cum putei vedea, algoritmul respect proprietatea
c, dac tata[i] = nil, atunci cmpului r ad acin a[i] i se va atribui identitatea nodului rdcin
corespunztor.
Armm c Gsete-Rdcini este un algoritm CRCW care ruleaz n timp O(lg d), unde
d este adncimea arborelui cu cea mai mare adncime din pdure. Singurele scrieri au loc n
liniile 3, 8, i 9 i acestea sunt exclusive, n ecare dintre ele procesorul i scriind numai n nodul
i. Totui, citirile din liniile 89 sunt concurente deoarece mai multe noduri pot avea pointeri
spre acelai nod. De exemplu, n gura 30.5(b) se observ c, n timpul celei de-a doua iteraii
a buclei ct timp, r ad acin a[4] i tata[4] sunt citite de procesoarele 18, 2 i 7.
Timpul de execuie al algoritmului Gsete-Rdcini este O(lg d), n principal din acelai
motiv ca i Rang-List: lungimea ecrui drum este njumtit la ecare iteraie. n gura
30.5 este prezentat, pe larg, aceast caracteristic.
Ct de rapid pot n noduri dintr-o pdure s determine rdcinile arborilor binari din care
fac parte folosind doar citiri exclusive? O demonstraie simpl arat c este nevoie de un timp
(lg n). Observaia cheie este aceea c, atunci cnd citirile sunt exclusive, ecare pas al mainii
PRAM permite unei anumite informaii s e copiat n cel mult o alt locaie de memorie,
30.2. Algoritmi CRCW i algoritmi EREW 603
Figura 30.5 Gsirea rdcinilor ntr-o pdure de arbori binari pe o main CREW PRAM. Indicele
nodurilor sunt scrise lng noduri, iar cmpurile r ad acin a apar n interiorul nodurilor. Legturile re-
prezint pointerii tata. (a)-(d) Starea arborilor din pdure de ecare dat cnd se execut linia 4 a
algoritmului Gsete-Rdcini. Observai c lungimile drumurilor sunt njumtite la ecare iteraie.
deci numrul locaiilor care pot conine o anumit informaie se poate cel mult dubla la ecare
pas. Lund n considerare un singur arbore, iniial identitatea rdcinii este stocat n cel mult
o locaie de memorie. Dup primul pas cel mult dou locaii pot conine identitatea rdcinii,
dup k pai cel mult 2
k1
locaii pot conine identitatea rdcinii. Dac dimensiunea arborelui
este (n) avem nevoie ca (n) locaii s conin identitatea rdcinii cnd execuia algoritmului
se termin, deci sunt necesari, n total, (lg n).
Ori de cte ori adncimea d a arborelui cu adncime maxim din pdure este 2
o(lg n)
,
algoritmul CREW Gsete-Rdcini depete asimptotic performanele oricrui algoritm
EREW. Mai exact, pentru orice pdure cu n noduri al crei arbore de adncime maxim este un
arbore binar echilibrat cu (n) noduri, d = O(lg n), caz n care Gsete-Rdcini se execut
n timp O(lg lg n). Orice algoritm EREW pentru aceast problem se execut n timp (lg n),
adic este, asimptotic, mai lent. Deci citirile concurente ajut n rezolvarea acestei probleme. n
exerciiul 30.2-1 este prezentat un scenariu mai simplu n care citirile concurente sunt folositoare.
604 Capitolul 30 Algoritmi pentru calculatoare paralele
O problem n care sunt folositoare scrierile concurente
Pentru a demonstra c, din punct de vedere al performanei, scrierile concurente ofer un
avantaj fa de scrierile exclusive, cercetm problema cutrii elementului maxim dintr-un ir
de numere reale. Vom vedea c orice algoritm EREW pentru aceast problem are nevoie de
un timp (lg n) i c nici un algoritm CREW nu are performane superioare. Problema poate
rezolvat n timp O(1), folosind un algoritm CRCW-comun n care, dac mai multe procesoare
scriu n aceeai locaie, toate vor scrie aceeai valoare.
Algoritmul CRCW care gsete maximul dintre cele n elemente ale unui vector presupune c
vectorul de intrare este A[0..n1]. Algoritmul folosete n
2
procesoare, ecare procesor comparnd
A[i] i A[j] pentru diferite valori i i j din intervalul 0 i, j n1. De fapt, algoritmul efectueaz
o matrice de comparaii, deci putem vedea ecare dintre cele n
2
procesoare ca avnd nu numai
un indice unidimensional n maina PRAM, ci i un indice bidimensional (i, j).
Maxim-Rapid
1: n lungime[A]
2: pentru i 0, n 1, n paralel execut
3: m[i] adevrat
4: pentru i 0, n 1 i j 0, n 1, n paralel execut
5: dac A[i] < A[j] atunci
6: m[i] fals
7: pentru i 0, n 1, n paralel execut
8: dac m[i] = adevrat atunci
9: max A[i]
10: returneaz max
n linia 1 se determin dimensiunea vectorului A; linia trebuie executat numai pe un singur
procesor, s zicem procesorul 0. Folosim un vector m[0..n1], unde procesorul i este responsabil
de m[i]. Vrem ca m[i] =adevrat dac, i numai dac, A[i] este valoarea maxim din vectorul A.
ncepem (liniile 23) presupunnd c ecare element al vectorului poate maximul i ne bazm
pe comparaiile din linia 5 pentru a determina care elemente ale vectorului nu sunt maxime.
n gura 30.6 este prezentat restul algoritmului. n ciclul din liniile 46 vericm ecare
pereche ordonat de elemente din irul A. Pentru ecare pereche A[i] i A[j] n linia 5, se veric
dac A[i] < A[j]. Dac rezultatul acestei comparri este adevrat, tim c A[i] nu poate
maximul, i n linia 6 se seteaz m[i] fals pentru a memora acest fapt. Cteva perechi (i, j)
pot scrie n m[i] simultan, dar toate scriu aceeai valoare: fals.
Deci, dup execuia liniei 6, m[i] = adevrat pentru exact acei indici i pentru care valoarea
A[i] este maxim. Apoi, n liniile 79 se stocheaz valoarea maxim n variabila max, care
este returnat n linia 10. Mai multe procesoare pot scrie n locaia de memorie corespunztoare
variabilei max, dar, dac acest lucru se ntmpl, toate scriu aceeai valoare aa cum cere modelul
CRCW-comun.
Deoarece toate cele trei bucle ale algoritmului sunt executate n paralel, Maxim-Rapid,
se execut n timp O(1). Bineneles, algoritmul nu este ecient ca efort deoarece necesit n
2
procesoare i problema gsirii numrului maxim dintr-un ir poate rezolvat ntr-un timp (n)
de un algoritm serial. Totui, putem ajunge mai aproape de un algoritm ecient ca efort, aa
cum vi se cere s artai n exerciiul 30.2-6
ntr-un anumit sens, cheia spre Maxim-Rapid este c o main CRCW PRAM poate s
30.2. Algoritmi CRCW i algoritmi EREW 605
Figura 30.6 Gsirea maximului a n valori n timp O(1) de ctre algoritmul CRCW Maxim-Rapid.
Pentru ecare pereche ordonat de elemente din vectorul de intrare A = '5, 6, 9, 2, 9), rezultatul
comparaiei A[i] < A[j] este notat n matrice abreviind T pentru adevrat i F pentru fals. Pentru
ecare linie care conine o valoare adevrat, elementul corespunztor din m este setat pe fals.
Elementele din m care conin valoarea adevrat corespund elementelor cu valoarea maxim din A.
n acest caz, valoarea 9 este atribuit variabilei max.
efectueze un I logic ntre n variabile, ntr-un timp O(1) folosind n procesoare. (Deoarece aceast
posibilitate este valabil pentru modelul CRCW-comun, ea este valabil i pentru modelele
CRCW PRAM mai puternice.) Codul efectueaz, de fapt, mai multe I-uri n acelai timp,
calculnd pentru i = 0, 1, . . . , n 1,
m[i] =
n1

j=0
(A[i] A[j]),
formul care poate dedus din legile lui DeMorgan (5.2). Aceast capacitate puternic poate
folosit i n alte moduri. De exemplu, capacitatea unei maini CRCW PRAM de a efectua un
I n timp O(1) elimin nevoia ca o reea separat, de control, s testeze dac toate procesoarele
au terminat iteraia unui ciclu, aa cum am presupus pentru algoritmii EREW. Decizia de a
termina un ciclu depinde de rezultatul unei operaii I logic ntre dorinele tuturor procesoarelor
de a ncheia ciclul.
Modelul EREW nu dispune de aceast puternic facilitate I. Orice algoritm care determin
maximul a n elemente are nevoie de un timp (lg n). Demonstraia este, conceptual, similar
cu demonstraia care folosete limita inferioar pentru gsirea rdcinii unui arbore binar. n
acea demonstraie am cercetat cte noduri vor cunoate identitatea rdcinii i am artat c,
la ecare pas, acest numr este cel mult dublat. Pentru problema determinrii maximului a n
elemente, considerm numrul elementelor care cred c pot maximul. Intuitiv, la ecare pas
al unui algoritm EREW PRAM acest numr se poate, cel mult, njumti, ceea ce duce la o
limit inferioar (lg n).
Este remarcabil c limita inferioar (lg n) este meninut chiar dac permitem citiri
concurente, adic este meninut i pentru algoritmii CREW. Cook, Dwork, i Reischuk [50]
arat, de fapt, c orice algoritm CREW, pentru gsirea maximului a n elemente, trebuie s
se execute n (lg n) chiar dac numrul procesoarelor i spaiul de memorie sunt nelimitate.
Limita lor inferioar este meninut i pentru calculul unui I ntre n valori logice.
606 Capitolul 30 Algoritmi pentru calculatoare paralele
Simularea unui algoritm CRCW cu ajutorul unui algoritm EREW
tim, acum, c algoritmii CRCW pot rezolva unele probleme mai rapid dect algoritmii
EREW. Mai mult, orice algoritm EREW poate executat pe o main CRCW PRAM. Deci
modelul CRCW este mai puternic dect modelul EREW. Dar cu ct este mai puternic? n
seciunea 30.3, vom arta c o main EREW PRAM cu p procesoare poate sorta p numere n
timp O(lg p). Folosim acum acest rezultat pentru a furniza o limit superioar teoretic a puterii
unei maini CRCW PRAM fa de o main EREW PRAM.
Teorema 30.1 Un algoritm CRCW care are la dispoziie p procesoare nu poate mai rapid
dect de, cel mult, O(lg p) ori dect cel mai bun algoritm EREW care are la dispoziie tot p
procesoare i rezolv aceeai problem.
Demonstraie. Demonstraia se face prin simulare. Simulm ecare pas al algoritmului CRCW
printr-un calcul EREW n timp O(lg p). Deoarece puterea de procesare a ambelor maini este
aceeai, nu trebuie s ne concentrm dect pe accesrile de memorie. Vom prezenta numai
demonstraia pentru simularea scrierilor concurente. Implementarea citirilor concurente este
lsat pe seama cititorului (exerciiul 30.2-8).
Cele p procesoare ale mainii EREW PRAM simuleaz o scriere concurent a algoritmului
CRCW folosind un vector auxiliar A de dimensiune p. Aceast idee este ilustrat n gura 30.7.
Cnd procesoarele CRCW P
i
, pentru i = 0, 1, . . . , p 1, doresc s scrie o dat x
i
n locaia l
i
,
ecare procesor EREW P
i
corespunztor scrie perechea ordonat (l
i
, x
i
) n locaia A[i]. Aceste
scrieri sunt exclusive deoarece ecare procesor scrie ntr-o locaie de memorie distinct. Apoi,
irul A este ordonat dup prima coordonat a perechii ordonate n timp O(lg p), ceea ce determin
ca toate datele care trebuie scrise n aceeai locaie s e aduse una lng cealalt la ieire.
Fiecare procesor EREW P
i
, pentru i = 1, 2, . . . , p 1, cerceteaz, acum, A[i] = (l
j
, x
j
) i
A[i 1] = (l
k
, x
k
), unde j i k sunt valori din domeniul 0 j, k p 1. Dac l
j
= l
k
sau
i = 0, atunci procesorul P
i
pentru i = 0, 1, . . . , p 1, scrie data x
j
n locaia l
j
din memoria
global. n caz contrar, procesorul nu execut nimic. Deoarece vectorul A este ordonat dup
prima coordonat, numai unul dintre procesoare reuete s scrie la o locaie dat, deci scrierile
sunt exclusive. n concluzie, acest proces implementeaz ecare pas al scrierilor concurente n
modelul CRCW-comun n timp O(lg p).
Alte modele pentru scrierea concurent pot , de asemenea, simulate. (Vezi exerciiul 30.2-9.)
Ca urmare a acestui fapt, apare ntrebarea ce model este preferabil CRCW sau EREW
i dac rspunsul este CRCW, care dintre modelele CRCW. Adepii modelului CRCW arm
c acesta este mai uor de programat dect modelul EREW i c algoritmii CRCW sunt mai
rapizi. Criticii arm c hardware-ul care implementeaz operaiile concurente cu memoria este
mai lent dect hardware-ul care implementeaz operaiile exclusive cu memoria, i deci timpul
de execuie mai rapid al algoritmilor CRCW este ctiv. n realitate, spun criticii, nu putem
determina maximul a n valori n timp O(1).
Alii spun c mainile PRAM e CRCW, e EREW nu reprezint un model potrivit, c
procesoarele trebuie interconectate printr-o reea de comunicaie, i c reeaua de comunicaie
ar trebui s fac parte din model. Procesoarele ar trebui s poat comunica numai cu vecinii lor
din reea.
Este destul de clar c problema modelului paralel potrivit nu i va gsi, prea uor, o rezolvare
n favoarea vreunui model. Totui, un fapt important, de care trebuie s ne dm seama, este c
aceste modele sunt numai att: modele. Pentru o situaie real, diferite modele pot aplicate n
30.2. Algoritmi CRCW i algoritmi EREW 607
Figura 30.7 Simularea scrierilor concurente pe o main EREW PRAM. (a) Un pas al algoritmului
CRCW-comun n care 6 procesoare efectueaz scrieri concurente n memoria global. (b) Simularea
pasului pe o main EREW PRAM. La nceput, perechile ordonate care conin locaiile i datele sunt
scrise ntr-un vector A care este apoi sortat. Comparnd elementele adiacente ale vectorului, ne asigurm
c numai prima dintre un grup de scrieri identice n memoria global, este implementat. n acest caz
procesoarele P
0
, P
2
i P
5
realizeaz scrierile.
anumite proporii. Gradul n care un anumit model se potrivete cu situaia tehnic este gradul
n care analizele algoritmice, folosind respectivul model, vor prezice fenomenele din lumea real.
Este important s studiem diferite modele paralele i diferii algoritmi paraleli pentru c, pe
msur ce domeniul calculului paralel se va extinde, probabil se va lmuri care paradigme ale
calculului paralel sunt mai potrivite pentru implementare.
608 Capitolul 30 Algoritmi pentru calculatoare paralele
Exerciii
30.2-1 S presupunem c tim c o pdure de arbori binari const dintr-un singur arbore cu n
noduri. Artai c, lund n considerare aceast ipotez, o implementare CREW a algoritmului
Gsete-Rdcini poate rula n timp O(1), independent de adncimea arborelui. Demonstrai
c orice algoritm EREW are nevoie de un timp (lg n).
30.2-2 Dai un algoritm EREW pentru Gsete-Rdcini care se execut n timp O(lg n) pe
o pdure cu n noduri.
30.2-3 Dai un algoritm CRCW care are la dispoziie n procesoare i care calculeaz un SAU
ntre n valori logice n timp O(1).
30.2-4 Descriei un algoritm CRCW ecient pentru a nmuli dou matrice logice de dimensiuni
n n folosind n
3
procesoare.
30.2-5 Descriei un algoritm EREW n timp O(lg n) pentru a nmuli dou matrice de numere
reale folosind n
3
procesoare. Exist un algoritm CRCW-comun mai rapid? Exist un algoritm
mai rapid ntr-unul din modelele CRCW mai puternice?
30.2-6 Demonstrai c, pentru orice constant > 0, exist un algoritm CRCW n timp O(1)
care, folosind O(n
1+
) procesoare, determin elementul maxim al unui vector cu n elemente.
30.2-7 Artai cum pot interclasai doi vectori, ecare format din n elemente, n timp O(1)
folosind un algoritm CRCW-prioritar. Descriei modul n care acest algoritm se poate folosi
pentru a sorta n timp O(lg n). Este algoritmul pe care l-ai propus ecient ca efort?
30.2-8 Completai demonstraia teoremei 30.1 descriind modul n care o citire concurent pe
o main CRCW PRAM avnd p procesoare este implementat n timp O(lg p) pe o main
EREW PRAM avnd p procesoare.
30.2-9 Artai cum o main EREW PRAM cu p procesoare poate implementa un algoritm
pentru CRCW-combinat PRAM cu o pierdere de performan de numai O(lg p). (
Folosii un calcul paralel al prexului.)
30.3. Teorema lui Brent i eciena efortului
Teorema lui Brent arat cum putem simula ecient un circuit combinaional printr-un PRAM.
Folosind aceast teorem, putem adapta modelului PRAM multe rezultate pentru reele de
sortare din capitolul 28 i foarte multe rezultate pentru circuite aritmetice din capitolul 29.
Cititorii nefamiliarizai cu circuitele combinaionale pot s revad seciunea 29.1.
Un circuit combinaional este o reea aciclic de elemente combinaionale. Fiecare
element combinaional are una sau mai multe intrri i, n aceast seciune, vom presupune c
ecare element are exact o ieire. (Elementele combinaionale cu k > 1 ieiri pot considerate
ca ind k elemente separate). Numrul intrrilor este evantaiul de intrare al elementului, iar
numrul ieirilor sale este evantaiul de ieire. n general, n aceast seciune, presupunem c
30.3. Teorema lui Brent i eciena efortului 609
orice element combinaional din circuit are o intrare mrginit (O(1)). Un element poate avea,
totui, o ieire nemrginit.
Dimensiunea unui circuit combinaional este numrul elementelor combinaionale pe care
le conine. Numrul elementelor combinaionale de pe un cel mai lung drum de la o intrare a
circuitului pn la o ieire a unui element combinaional este adncimea elementului. Adn-
cimea ntregului circuit este adncimea maxim a oricrui element al su.
Teorema 30.2 (Teorema lui Brent) Orice circuit combinaional de adncime d i dimensi-
une n cu intrarea mrginit poate simulat printr-un algoritm CREW cu p procesoare ntr-un
timp O(n/p +d).
Demonstraie. Memorm intrrile circuitului combinaional n memoria global a PRAM-ului
i rezervm o locaie de memorie pentru ecare element combinaional din circuit pentru a
pstra valoarea sa de ieire, atunci cnd aceasta este calculat. Astfel, un element combinaional
dat poate simulat printr-un singur procesor PRAM ntr-un timp O(1), dup cum se arat n
continuare. Procesorul citete, pur i simplu, valorile de intrare pentru un element din valorile
din memorie, care corespund intrrilor circuitului sau ieirilor elementului care l alimenteaz,
simulnd astfel rele din circuit. Acesta calculeaz apoi funcia elementului combinaional i
scrie rezultatul n memorie, la poziia corespunztoare. Deoarece numrul de intrri ale ecrui
element din circuit este mrginit, ecare funcie poate calculat ntr-un timp O(1).
De aceea, sarcina noastr este de a gsi o planicare pentru cele p procesoare ale PRAM-ului,
astfel nct toate elementele combinaionale s e simulate ntr-un timp O(n/p +d). Principala
dicultate este c un element nu poate simulat pn cnd nu sunt calculate ieirile oricrui
element care l alimenteaz. Sunt folosite citiri concurente ori de cte ori mai multe elemente
combinaionale ce sunt simulate n paralel au nevoie de aceeai valoare.
Deoarece toate elementele de la adncimea 1 depind doar de intrrile circuitului, ele sunt
singurele care pot simulate inial. Dup ce acestea au fost simulate, putem simula toate
elementele de la adncimea 2 i aa mai departe, pn cnd terminm cu toate elementele de la
adncimea d. Ideea principal este c, dac au fost simulate toate elementele de la adncimea
1 pn la adncimea i, putem simula orice submulime de elemente de la adncimea i + 1, n
paralel, din moment ce calculele necesare nu depind unul de altul.
De aceea, strategia de planicare este destul de naiv. Simulm toate elementele de la
adncimea i, nainte de a ncepe s le simulm pe cele de la adncimea i + 1. n cadrul unei
adncimi i date, simulm p elemente o dat. Figura 30.8 ilustreaz o astfel de strategie pentru
p = 2.
Vom analiza acum aceast strategie de simulare. Pentru i = 1, 2, . . . , d, e n
i
numrul ele-
mentelor de la adncimea i din circuit. Astfel,
d

i=1
n
i
= n.
S considerm cele n
i
elemente combinaionale de la adncimea i. Grupndu-le n n
i
/p| grupuri,
unde primele n
i
/p| grupuri au cte p elemente ecare, iar elementele rmase, dac exist,
se a n ultimul grup, PRAM-ul poate simula calculele efectuate de ctre aceste elemente
combinaionale ntr-un timp O(n
i
/p|). Timpul total pentru simulare este atunci de ordinul
d

i=1

n
i
p

i=1

n
i
p
+ 1

=
n
p
+d.
610 Capitolul 30 Algoritmi pentru calculatoare paralele
Figura 30.8 Teorema lui Brent. Circuitul combinaional de dimensiune 15 i adncime 5 este simulat
printr-un PRAM CREW n 9 15/2 + 5 pai. Simularea se efectueaz de sus n jos, de-a lungul
circuitului. Grupurile haurate de elemente ale circuitului indic elementele simulate n acelai moment,
i ecare grup este etichetat cu un numr corespunzator momentului cnd elementele sale sunt simulate.
Teorema lui Brent poate extins la simulri EREW atunci cnd un circuit combinaional
are un numr de ieiri de ordinul O(1) pentru ecare element combinaional.
Corolarul 30.3 Orice circuit combinaional de adncime d i dimensiune n, avnd numrul de
intrri i ieiri mrginit, poate simulat pe un PRAM EREW cu p procesoare ntr-un timp
O(n/p +d).
Demonstraie. Vom efectua o simulare similar celei din demonstraia teoremei lui Brent.
Singura diferen const n simularea relor, unde teorema 30.2 necesit citiri concurente. Pentru
simularea EREW, dup ce ieirea unui element combinaional este calculat, ea nu este citit
direct de ctre procesoarele, care au nevoie de valoarea sa. n loc de aceasta, valoarea ieirii este
copiat de ctre procesorul ce simuleaz elementul n intrrile de dimensiune O(1) care au nevoie
de ea. Procesoarele care au nevoie de valoare, o pot citi fr a crea interferene ntre ele.
Aceast strategie de simulare EREW nu funcioneaz pentru elemente cu numr de ieiri
30.3. Teorema lui Brent i eciena efortului 611
nemrginit, deoarece, la ecare pas, copierea poate consuma un timp mai mare dect cel constant.
Astfel, pentru circuite care au elemente cu numr de ieiri nemrginit, avem nevoie de puterea
citirilor concurente. (Cazul numrului de intrri nemrginit poate , uneori, tratat printr-o
simulare CRCW dac elementele combinaionale sunt destul de simple. Vedei exerciiul 30.3-1.)
Corolarul 30.3 ne ofer un algoritm de sortare EREW rapid. Dup cum s-a explicat n notele
bibliograce ale capitolului 28, reeaua de sortare AKS poate sorta n numere ntr-o adncime
O(lg n) folosind O(nlg n) comparatori. Deoarece comparatorii au numrul de intrri limitat,
exist un algoritm EREW pentru sortarea a n numere ntr-un timp O(lg n) folosind n procesoare.
(Am folosit acest rezultat n teorema 30.1 pentru a demonstra c un PRAM EREW poate
simula un PRAM CRCW cu o ncetinire logaritmic, n cel mai defavorabil caz.) Din nefericire,
constantele ascunse de ctre notaia O sunt att de mari, nct acest algoritm de sortare nu
prezint dect un interes teoretic. Totui, au fost descoperii algoritmi de sortare EREW mai
practici, n mod notabil algoritmul de sortare prin interclasare paralel, datorat lui Cole [46].
Acum, s presupunem c avem un algoritm PRAM care folosete cel mult p procesoare, dar
avem un PRAM cu numai p
t
< p procesoare. Am dori s putem executa algoritmul pentru p
procesoare pe PRAM-ul mai mic cu numai p
t
procesoare ntr-o manier ecient. Folosind ideea
din demonstraia teoremei lui Brent, putem da o condiie pentru a stabili cnd este posibil acest
lucru.
Teorema 30.4 Dac un algoritm PRAM A pentru p procesoare se execut ntr-un timp t,
atunci, pentru orice p
t
< p, exist un algoritm PRAM A
t
pentru p
t
procesoare care se execut
ntr-un timp O(pt/p
t
).
Demonstraie. S presupunem c paii algoritmului Asunt numerotai cu 1, 2, . . . , t. Algoritmul
A
t
simuleaz execuia ecrui pas i = 1, 2, . . . , t ntr-un timp O(p/p
t
|). Exist t pai i, astfel,
ntreaga simulare consum un timp O(p/p
t
|t) = O(pt/p
t
) din moment ce p
t
< p.
Efortul efectuat de algoritmul A este pt, iar efortul efectuat de algoritmul A
t
este (pt/p
t
)p
t
=
pt. De aceea, simularea este ecient ca efort. Prin urmare, dac algoritmul A este el nsui
ecient ca efort, atunci i algoritmul A
t
este ecient.
De aceea, atunci cnd dezvoltm algoritmi ecieni ca efort pentru o problem, nu trebuie s
crem un algoritm nou pentru ecare numr diferit de procesoare. De exemplu, s presupunem
c putem demonstra o limit inferioar strns t a timpului de execuie al oricrui algoritm
paralel, indiferent pentru cte procesoare, pentru a rezolva o problem dat, i s presupunem,
n continuare, c cel mai bun algoritm serial pentru acea problem efectueaz efortul w. Atunci,
nu trebuie dect s dezvoltm un algoritm ecient ca efort pentru problema care folosete p =
(w/t) procesoare pentru a obine algoritmi ecieni ca efort pentru orice numr de procesoare
pentru care un algoritm ecient ca efort este posibil. Pentru p
t
= o(p), teorema 30.4 garanteaz
c exist un algoritm ecient. Pentru p
t
= (p), nu exist nici un algoritm ecient deoarece,
dac t este o limit inferioar a timpului pentru orice algoritm paralel, p
t
t = (pt) = (w).
Exerciii
30.3-1 Demonstrai un rezultat analog teoremei lui Brent pentru o simulare CRCW a unor
circuite combinaionale booleene, avnd pori I i SAU cu un numr nelimitat de intrri.
( Considerai c dimensiunea este numrul total de intrri la porile din circuit.)
612 Capitolul 30 Algoritmi pentru calculatoare paralele
30.3-2 Demonstrai c un calcul paralel al prexelor, efectuat pe n valori memorate ntr-un
tablou de memorie, poate implementat ntr-un timp O(lg n) pe un PRAM EREW folosind
O(n/ lg n) procesoare. De ce acest rezultat nu poate extins automat la o list de n valori?
30.3-3 Artai cum se poate nmuli o matrice A de dimensiuni n n cu un vector b
de dimensiune n ntr-un timp O(lg n) cu ajutorul unui algoritm EREW ecient. (
Construii un circuit combinaional pentru problem.)
30.3-4 Dai un algoritm CRCW care folosete n
2
procesoare pentru a nmuli dou matrice de
dimensiuni n n. Algoritmul trebuie s e ecient ca efort n raport cu timpul obinuit (n
3
)
necesar algoritmului serial de nmulire a matricelor. Putei realiza algoritmul EREW?
30.3-5 Unele modele paralele permit procesoarelor s devin inactive, astfel nct numrul
procesoarelor care funcioneaz variaz la ecare pas. Se denete efortul, n acest model, ca ind
numrul total de pai executai n timpul unui algoritm de ctre procesoarele active. Demonstrai
c orice algoritm CRCW care efectueaz un efort w i ruleaz ntr-un timp t poate rulat pe
un PRAM EREW ntr-un timp O((w/p + t) lg p). ( Partea dicil este planicarea
procesoarelor active ce se efectueaz calculul.)
30.4. Calculul paralel de prex, ecient ca efort
n seciunea 30.1.2, am examinat un algoritm EREW Listeaz-Rang de timp O(lg n) care
poate executa un calcul de prex asupra unei liste nlnuite de n obiecte. Algoritmul folosete
n procesoare i efectueaz un efort (nlg n). Deoarece putem executa uor un calcul de prex
ntr-un timp (n) pe un calculator serial, Listeaz-Rang nu este ecient.
Aceast seciune prezint un algoritm EREW paralel, aleator, de calculare a prexului care
este ecient ca efort. Algoritmul folosete (n/ lg n) procesoare, i se execut, cu o mare probabi-
litate, ntr-un timp O(lg n). Astfel, foarte probabil, el este ecient ca efort. Mai mult, cu ajutorul
teoremei 30.4, putem construi imediat, pe baza acestui algoritm, algoritmi ecieni pentru orice
numr de procesoare p = O(n/ lg n).
Calcul paralel, recursiv, de prex
Algoritmul paralel, recursiv, pentru calcularea prexului Listare-Aleatoare-de-Prefix
lucrez pe o list nlnuit de n obiecte, folosind p = (n/ lg n) procesoare. n timpul execuiei
algoritmului, ecare procesor este responsabil pentru n/p = (lg n) din obiectele din lista
original. Obiectele sunt repartizate procesoarelor n mod arbitrar (nu neaprat n secvene
contigue) nainte ca apelurile recursive s aib loc, iar posesorii obiectelor nu se schimb
niciodat. Pentru uurin, presupunem c lista este dublu nlnuit deoarece crearea legturilor
duble pentru o singur list necesit un timp O(1).
Ideea algoritmului Listare-Aleatoare-de-Prefix este s eliminm o parte din obiectele
din list, s efectum, apoi, un calcul recursiv de prex asupra listei rezultate, i pe urm s o
dezvoltm, reunind-o cu obiectele eliminate, pentru a obine un calcul de prex al listei originale.
Figura 30.9 ilustreaz procesul recursiv, iar gura 30.10 ilustreaz cum se desfoar apelurile
recursive. Vom demonstra puin mai trziu c ecare pas al recursivitii satisface urmtoarele
proprieti:
30.4. Calculul paralel de prex, ecient ca efort 613
Figura 30.9 Algoritmul paralel, recursiv, aleator i ecient ca efort Listare-Aleatoare-de-Prefix
pentru efectuarea unui calcul de prex pentru o list nlnuit de n = 9 obiecte. (a)-(b) O mulime de
obiecte neadiacente (desenate cu negru) sunt selectate pentru a eliminate. Valoarea din ecare obiect
negru este folosit pentru recalcularea valorii din urmtorul obiect din list, iar apoi obiectul negru
este eliminat, ind unit cu obiectul urmtor. Algoritmul este apelat recursiv pentru calcularea unui
prex paralel pentru lista contractat. (c)-(d) Valorile rezultate reprezint valorile nale corecte pentru
obiectele din lista contractat. Obiectele eliminate sunt, apoi, reintroduse n list i ecare folosete
valoarea obiectului precedent pentru a-i calcula valoarea sa nal.
1. Cel mult un obiect, dintre cele care aparin unui procesor dat, este selectat pentru eliminare.
2. Niciodat, nu sunt selectate, pentru eliminare, dou obiecte adiacente.
nainte de a arta cum putem selecta obiecte care satisfac aceste proprieti, s examinm
mai detaliat modul n care se efectueaz calculul de prex. S presupunem c, la ecare pas
al recursivitii, al k-lea obiect din list este selectat pentru eliminare. Acest obiect conine
valoarea [k, k], care este adus de cel de-al (k + 1)-lea obiect din list. (Situaiile limit, de
exemplu cea de aici, cnd k se a la sfritul listei, pot tratate direct i nu sunt descrise.)
Al (k + 1)-lea obiect, care memoreaz valoarea [k + 1, k + 1], este apoi calculat i va conine
[k, k + 1] = [k, k] [k + 1, k + 1]. Al k-lea obiect este eliminat, apoi, din list, ind unit cu
obiectul urmtor.
Apoi, procedura Listare-Aleatoare-de-Prefix se autoapeleaz pentru a executa un
calcul de prex pentru lista contractat. (Apelurile recursive se termin atunci cnd lista este
vid.) Observaia cheie este c, atunci cnd se revine din apelul recursiv, ecare obiect din lista
contractat conine valoarea corect de care are nevoie pentru calculul paralel de prex pentru
lista iniial. Tot ce rmne de fcut este s reinserm n list obiectele eliminate anterior, cum
este, de exemplu, al k-lea obiect, i s recalculam valorile lor.
Dup ce al k-lea obiect este reintrodus n list, valoarea nal a prexului su poate
614 Capitolul 30 Algoritmi pentru calculatoare paralele
calculat folosind valoarea din cel de-al (k 1)-lea obiect. Dup apelul recursiv, al (k 1)-lea
obiect conine [1, k1] i, astfel, al k-lea obiect care conine nc valoarea [k, k] nu are nevoie
dect de valoarea [1, k 1] i s calculeze [1, k] = [1, k 1] [k, k].
Datorit proprietii 1, ecare obiect selectat dispune de un procesor distinct pentru a efectua
operaiile necesare pentru eliminarea sau reintroducea obiectului n list. Proprietatea 2 asigur
faptul c nu apare nici o confuzie ntre procesoare, atunci cnd se elimin i se reintroduc
obiecte (vezi exerciiul 30.4-1). mpreun, cele dou proprieti asigur faptul c ecare pas al
recursivitii poate implementat ntr-un mod EREW ntr-un timp O(1).
Selectarea obiectelor pentru eliminare
Cum selecteaz procedura Listare-Aleatoare-de-Prefix obiectele pe care le elimin? Ea
trebuie s satisfac cele dou proprieti enunate mai sus i, n lpus, dorim ca timpul necesar
selectrii obiectelor s e scurt (i, preferabil, constant). Mai mult, dorim s e selectate ct mai
multe obiecte posibil.
Urmtoarea metod de selectare aleatoare satisface aceste condiii. Obiectele sunt selectate
prin programarea ecrui procesor astfel nct el s execute urmtorii pai:
1. Procesorul alege un obiect i, care nu a fost selectat anterior, dintre cele pe care le deine.
2. Apoi, procesorul d cu banul, alegnd valorile cap sau ban cu aceeai probabilitate.
3. Dac a ales cap, procesorul marcheaz obiectul i ca selectat, dac urm[i] nu a fost ales
de ctre un alt procesor a crui moned este, de asemenea, cap.
Aceast metod aleatoare necesit doar un timp O(1) pentru a selecta obiecte pentru eliminare,
i nu necesit accesri concurente de memorie.
Trebuie s demonstrm c aceast procedur satisface cele dou proprieti de mai sus. Faptul
c proprietatea 1 este adevarat se vede foarte uor deoarece doar un singur obiect este ales de
ctre un procesor pentru o posibil selectare. Pentru a arta c proprietatea 2 este adevrat,
s presupunem contrariul, i anume c dou obiecte consecutive, i i urm[i], sunt selectate.
Aceast situaie apare doar dac ambele obiecte au fost alese de ctre procesoarele lor i ambele
procesoare au obinut cap la aruncarea monezii. Dar obiectul i nu este selectat dac procesorul
responsabil pentru urm[i] a obinut cap, ceea ce este o contradicie.
Analiz
Deoarece ecare pas recursiv al algoritmului Listare-Aleatoare-de-Prefix se execut
ntr-un timp O(1), pentru a analiza algoritmul, nu trebuie dect s determinm de ci pai are
acesta nevoie pentru a elimina toate obiectele din lista iniial. La ecare pas, un procesor are o
probabilitate de cel puin 1/4 de a elimina obiectul i pe care l alege. De ce? Pentru c, atunci
cnd se arunc moneda, rezult cap cu o probabilitate de cel puin 1/2, iar probabilitatea ca e
s nu aleag urm[1], e s l aleag i s obin ban, atunci cnd se arunc moneda, este de cel
puin 1/2. Din moment ce aceste dou aruncri de moned sunt dou evenimente independente,
putem nmuli probabilitile lor, obinnd o probabilitate de cel puin 1/4 ca un procesor s
elimine obiectul pe care l alege. Deoarece ecare procesor deine (lg n) obiecte, timpul ateptat
n care un procesor i elimin toate obiectele sale este (lg n).
30.4. Calculul paralel de prex, ecient ca efort 615
Figura 30.10 Etapele recursive ale algoritmului Listare-Aleatoare-de-Prefix, prezentate pentru
n = 9 obiecte originale. n ecare etap, obiectele desenate cu negru sunt eliminate. Procedura se
autoapeleaz pn cnd lista devine vid, iar, apoi, obiectele eliminate sunt reintroduse n list.
616 Capitolul 30 Algoritmi pentru calculatoare paralele
Din nefericire, aceast analiz simpl nu demonstreaz c timpul ateptat de execuie
al algoritmului Listare-Aleatoare-de-Prefix este (lg n). De exemplu, dac majoritatea
procesoarelor i elimin obiectele lor repede i cteva procesoare i elimin obiectele mult mai
ncet, timpul mediu n care un procesor i elimin obiectele poate s e tot (lg n), dar timpul
de execuie al algoritmului ar putea mare.
Timpul de execuie ateptat al procedurii Listare-Aleatoare-de-Prefix este, ntr-adevr,
(lg n), dei analiza simpl de mai sus nu demonstreaz riguros acest lucru. Vom folosi un
argument cu probabilitate mare pentru a demonstra, cu o probabilitate de cel puin 1 1/n, c
toate obiectele sunt eliminate n cel mult c lg n pai recursivi, unde c este o constant. Exerciiile
30.4-4 i 30.4-5 v cer s generalizai aceast argumentaie, pentru a demonstra limita de (lg n)
a timpului de execuie ateptat.
Argumentul nostru de mare probabilitate se bazeaz pe observaia c experimentul unui
procesor dat de eliminare a obiectelor pe care le alege poate privit ca un ir de ncercri
Bernoulli (vezi capitolul 6). Experimentul are succes dac obiectul este selectat pentru eliminare
i eueaz, n caz contrar. Deoarece suntem interesai s artm c probabilitatea de a obine
foarte puine succese este mic, putem presupune c succesele apar cu o probabilitate de exact
1/4, n loc de a aprea cu o probabilitate de cel puin 1/4. (Vezi exerciiile 6.4-8 i 6.4-9 pentru
o justicare formal a unor presupuneri similare.)
Pentru a simplica i mai mult analiza, presupunem c exist exact n/ lg n procesoare, ecare
avnd lg n obiecte. Efectum c lg n ncercri, unde c este o constant ce va determinat ulterior,
i ne intereseaz evenimentul cnd apar mai puin de lg n succese. Fie X variabila aleatoare care
memoreaz numrul total de succese. Din corolarul 6.3, probabilitatea ca un procesor s elimine
mai puin de lg n obiecte n c lg n ncercri este cel mult
PrX < lg n

c lg n
lg n

3
4

c lg nlg n

ec lg n
lg n

lg n

3
4

(c1) lg n
=

ec

3
4

c1

lg n

1
4

lg n
= 1/n
2
,
ct vreme c 20. (A doua linie rezult din inegalitatea (6.9).) Astfel, probabilitatea ca obiectele
aparinnd unui procesor dat s nu e toate eliminate dup c lg n pai este de cel mult 1/n
2
.
Acum, dorim s determinm o limit pentru probabilitatea c nu toate obiectele aparinnd
tuturor procesoarelor au fost eliminate dup c lg n pai. Din inegalitatea lui Boole (6.22), aceast
probabilitate este mai mic sau egal cu suma probabilitilor c ecare procesor nu i-a eliminat
obiectele. Deoarece exist n/ lg n procesoare i ecare procesor are o probabilitate de cel mult
1/n
2
de a nu-i elimina toate obiectele, probabilitatea ca un procesor oarecare s nu-i terminat
toate obiectele este cel mult
n
lg n

1
n
2

1
n
Am demonstrat astfel, cu o probabilitate de cel puin 1 1/n, c ecare obiect este eliminat
dup O(lg n) apeluri recursive. Deoarece ecare apel recusiv consum un timp O(1), Listare-
Aleatoare-de-Prefix se execut, cu o mare probabilitate, ntr-un timp O(lg n).
Constanta c 20 din timpul de execuie c lg n poate prea un pic prea mare pentru ca
algoritmul s e practic. De fapt, aceast constant este mai mult un artefact al analizei dect
o reectare a performanei algoritmului. n practic, algoritmul este, de obicei, rapid. Factorii
30.5. ntreruperi deterministe de simetrie 617
constani din analiz sunt mari deoarece evenimentul cnd un procesor i termin de eliminat
toate obiectele sale din list este dependent de evenimentul cnd un alt procesor i termin
toate sarcinile. Din cauza acestor dependene, am folosit inegalitatea lui Boole, care nu necesit
o relaie de independen, dar are ca rezultat o constant care este, n general, mai slab dect
cea ntlnit n practic.
Exerciii
30.4-1 Ilustrai prin desene ce erori pot s apar n execuia algoritmului Listare-Aleatoare-
de-Prefix dac dou obiecte adiacente din list sunt selectate pentru eliminare.
30.4-2 Propunei o schimbare simpl pentru a face algoritmul Listare-Aleatoare-de-
Prefix s se execute, n cel mai defavorabil caz, ntr-un timp O(n), pentru o list de n obiecte.
Folosii deniia ateptrii pentru a demonstra c, avnd aceast modicare, algoritmul are un
timp de execuie ateptat O(lg n).
30.4-3 Artai cum se poate implementa algoritmul Listare-Aleatoare-de-Prefix, astfel
nct s utilizeze cel mult O(n/p) spaiu pe procesor, n cel mai defavorabil caz, independent de
ct de adnc devine recursivitatea.
30.4-4 Artai c, pentru orice constant k 1, algoritmul Listare-Aleatoare-de-Prefix
ruleaz ntr-un timp O(lg n) cu o probabilitate de cel puin 1 1/n
k
. Artai cum inueneaz
k, constanta din limita timpului de execuie.
30.4-5 Folosind rezultatul din exerciiul 30.4-4, artai c timpul de execuie ateptat al
algoritmului Listare-Aleatoare-de-Prefix este O(lg n).
30.5. ntreruperi deterministe de simetrie
S considerm o situaie n care dou procesoare doresc ambele s obin acces exclusiv la
un obiect. Cum pot determina procesoarele care dintre ele va obine primul accesul? Dorim
s evitm att cazul n care ambelor li se acord accesul, ct i cazul n care nu i se acord
accesul nici unuia. Problema alegerii unuia din procesoare este un exemplu de ntrerupere de
simetrie. Am vzut cu toii confuzia momentan i impasul diplomatic care se ivesc atunci
cnd dou persoane ncearc s intre, simultan, pe o u. Probleme similare de ntrerupere de
simetrie sunt foarte rspndite n designul algoritmilor paraleli, iar soluiile eciente sunt extrem
de folositoare.
O metod de ntrerupere a simetriei este aruncarea unei monezi. Pe un calculator, aruncarea
monezii poate implementat cu ajutorul unui generator de numere aleatoare. Pentru exemplul
cu cele dou procesoare, ambele procesoare pot arunca monezi. Dac unul obine cap i cellalt
ban, cel care obine cap primete accesul. Dac ambele procesoare obin aceeai valoare, ele
arunc din nou monezile. Cu aceast strategie, simetria este ntrerupt ntr-un timp ateptat
constant (vezi exerciiul 30.5-1).
Am vzut efectivitatea unei strategii aleatoare n seciunea 30.4. n algoritmul Listare-
Aleatoare-de-Prefix, obiectele adiacente din list nu pot selectate pentru eliminare, dar
618 Capitolul 30 Algoritmi pentru calculatoare paralele
trebuie selectate ct mai multe obiecte din cele alese. Totui, ntr-o list de obiecte alese, toate
obiectele arat la fel. Dup cum am observat, folosirea numerelor aleatoare ofer un mijloc
simplu i ecient pentru a ntrerupe simetria dintre obiectele adiacente din list, garantnd, de
asemenea, cu o mare probabilitate, c multe obiecte sunt selectate.
n aceast seciune, vom cerceta o metod determinist de ntrerupere a simetriei. Cheia
algoritmului este folosirea indicilor de procesor sau a adreselor de memorie n locul aruncrii
aleatoare de monezi. De exemplu, n cazul celor dou procesoare, putem ntrerupe simetria
permind procesorului cu indicele de procesor mai mic s obin primul accesul un proces,
evident, constant din punct de vedere al timpului.
Vom folosi aceeai idee, dar ntr-un mod mult mai inteligent, ntr-un algoritm pentru
ntreruperea simetriei ntr-o list nlnuit de n obiecte. Scopul este alegerea unei pri constante
dintre obiectele din list, evitnd ns alegerea a dou obiecte adiacente. Algoritmul se execut,
pe o main cu n procesoare, ntr-un timp O(lg

n), ind implementat ntr-o manier EREW.


Deoarece lg

n 5 pentru orice n 2
65536
, valoarea lg

n poate privit ca o constant mic


pentru orice scop practic (vezi pagina 32).
Algoritmul nostru determinist are dou pri. Prima parte determin o 6-colorare a listei
nlnuite ntr-un timp O(lg

n). A doua parte convertete 6-colorarea ntr-o mulime indepen-


dent maximal a listei, ntr-un timp O(1). Mulimea independent maximal va conine o
parte constant dintre cele n obiecte din list i nu vor exista dou elemente n mulime care s
e adicente.
Colorri i mulimi independente maximale
O colorare a unui graf neorientat G = (V, E) este o funcie C : V N, astfel nct, oricare
ar u, v V , dac C(u) = C(v), atunci (u, v) E. Cu alte cuvinte, nu exist vrfuri adiacente
avnd aceeai culoare. ntr-o 6-colorare a unei liste nlnuite, toate culorile aparin domeniului
0, 1, 2, 3, 4, 5 i nu exist dou vrfuri consecutive care s aib aceeai culoare. De fapt, orice
list are o 2-colorare deoarece putem colora elementele avnd indicele impar cu 0 i elementele
avnd indicele par cu 1. Putem calcula o astfel de colorare ntr-un timp O(lg n) folosind un
calcul paralel de prex, dar, pentru multe aplicaii, este sucient s calculm o colorare ntr-un
timp O(1). Vom arta acum c o 6-colorare poate calculat ntr-un timp O(lg

n) fr a folosi
numere aleatoare.
O mulime independent a unui graf G = (V, E) este o submulime de vrfuri V
t

V , astfel nct orice muchie din E este incident cel mult unui vrf din V
t
. O mulime
independent maximal este o mulime independent V
t
astfel nct, oricare ar un vrf
v V V
t
, mulimea V
t
v nu este independent ecare vrf care nu este n V
t
este adiacent
unui vrf din V
t
. Nu confundai problema determinrii unei mulimi independente
o problem uoar cu problema determinrii unei mulimi independente o problem
dicil. Problema determinrii unei mulimi independente de dimensiune maxim, ntr-un graf
obinuit, este NP-complet. (Vezi capitolul 36 pentru o discuie despre NP-completitudine.
Problema 36-1 se refer la mulimi independente maxime.)
Pentru listele cu n obiecte, o mulime independent maxim (i, deci, maximal) poate
determinat ntr-un timp O(lg n) folosind calculul paralel de prex, la fel ca n cazul 2-colorrii,
menionate anterior, pentru a identica obiectele cu rang impar. Aceast metod selecteaz n/2|
obiecte. Observai, totui, c orice mulime independent maximal a unei liste nlnuite conine
cel puin n/3 obiecte deoarece, pentru oricare 3 obiecte consecutive, cel puin unul trebuie s
30.5. ntreruperi deterministe de simetrie 619
fac parte din mulime. Vom arta, totui, c o mulime maximal independent a unei liste
poate determinat ntr-un timp O(1) dat ind o colorare de timp O(1) a listei.
Determinarea unei 6-colorri
Algoritmul ase-Culori calculeaz o 6-colorare a unei liste. Nu vom da un pseudocod pentru
algoritm, dar l vom descrie destul de detaliat. Vom presupune c, iniial, ecare obiect x din
lista nlnuit este asociat cu un procesor distinct P(x) 0, 1, . . . , n 1.
Ideea algoritmului ase-Culori este s calculm un ir de culori C
0
[x], C
1
[x], . . . , C
m
[x]
pentru ecare obiect x din list. Colorarea iniial C
0
este o . Fiecare iteraie a
algoritmului denete o nou colorare C
k+1
bazat pe colorarea precedent C
k
, pentru k =
0, 1, . . . , m1. Colorarea nal C
m
este o 6-colorare, i vom demonstra c m = O(lg

n).
Colorarea iniial este o n-colorare trivial n care C
0
[x] = P(x). Deoarece n list nu exist
dou obiecte avnd aceeai culoare, nu exist nici dou obiecte adiacente n list colorate la fel
i, deci, colorarea este corect. Observai c ecare dintre culorile iniiale poate descris prin
lg n| bii, ceea ce nseamn c poate memorat ntr-un cuvnt de memorie.
Colorrile urmtoare se obin n modul urmtor. Iteraia cu numrul de ordine k, pentru
k = 0, 1, . . . , m1, ncepe cu o colorare C
k
i se sfrete cu o colorare C
k
+ 1 ce folosete mai
puini bii pentru un obiect, dup cum arat prima parte a gurii 30.11. S presupunem c, la
nceputul unei iteraii, culoarea C
k
a ecrui obiect ocup r bii. Determinm o nou culoare a
unui obiect x uitndu-ne nainte n list la culoarea lui urm[x].
Pentru a mai exaci, s presupunem c, pentru ecare obiect x, avem C
k
[x] = a i
C
k
[urm[x]] = b, unde a = 'a
r1
, a
r2
, . . . , a
0
` i b = 'b
r1
, b
r2
, . . . , b
0
` sunt culori pe r
bii. Deoarece C
k
[x] = C
k
[urm[x]], exist un cel mai mic index i la care biii celor dou
culori difer: a
i
= b
i
. Deoarece 0 i r 1, l putem scrie pe i cu numai lg r| bii:
i = 'i
|lg r|1
, i
|lg r|2
, . . . , i
0
`. Recolorm x cu valoarea lui i concatenat cu bitul a
i
. Cu alte
cuvinte, facem atribuirea
C
k+1
[x] = 'i, a
i
` = 'i
|lg r|1
, i
|lg r|2
, . . . , i
0
, a
i
`.
Ultimul element din list primete noua culoare '0, a
0
`. De aceea, numrul de bii din ecare
nou culoare este cel mult lg r| + 1.
Trebuie s demonstrm c, dac ecare iteraie a algoritmului ase-Culori pornete cu o
colorare, noua colorare pe care o produce este, ntr-adevr, o colorare corect. Pentru a face
acest lucru, demonstrm c C
k
[x] = C
k
[urm[x]] implic C
k+1
[x] = C
k+1
[urm[x]]. S presupunem
c C
k
[x] = a i C
k
[urm[x]] = b, i c C
k+1
[x] = 'i, a
i
` i C
k+1
[urm[x]] = 'j, b
j
`. Trebuie s
considerm dou cazuri. Dac i = j, atunci 'i, a
i
` = 'j, b
j
`, i astfel culorile noi sunt diferite.
Dac i = j, atunci a
i
= b
i
= b
j
din cauza metodei noastre de recolorare, i, astfel, noile culori
sunt, nc o dat, diferite. (Situaia din coada listei poate tratat similar).
Metoda de recolorare folosit de algoritmul ase-Culori ia o culoare de r bii i o nlocuiete
cu una de (lg r| + 1) bii, ceea ce nseamn c numrul de bii este strict redus pentru r 4.
Cnd r = 3, dou culori pot diferi prin biii din poziiile 0, 1 sau 2. De aceea, ecare culoare
nou este '00`, '01` sau '10`, concatenat e cu 0, e cu 1, rezultnd, astfel, nc o dat, un
numr de 3 bii. Totui, numai 6 din cele 8 valori posibile pentru numerele de 3 bii sunt folosite,
astfel nct ase-Culori se termin ntr-adevr cu o 6-colorare.
Presupunnd c ecare procesor poate determina indexul corespunztor i ntr-un timp O(1) i
poate executa o operaie de deplasare la stnga a biilor ntr-un timp O(1) operaii suportate n
620 Capitolul 30 Algoritmi pentru calculatoare paralele
mod obinuit de multe maini actuale ecare iteraie se execut ntr-un timp O(1). Algoritmul
ase-Culori este un algoritm EREW: pentru ecare obiect x, procesorul su acceseaz numai
pe x i pe urm[x].
n nal, s vedem de ce sunt necesare numai O(lg

n) iteraii pentru a aduce n-colorarea ini-


ial la o 6-colorare. Am denit lg

n ca ind numrul de aplicri ale funciei logaritm necesare


pentru a-l reduce pe n la o valoare aproapiat de 1 sau, notnd cu lg
(i)
n i aplicri succesive ale
funciei lg,
lg

n = min

i 0 : lg
(i)
n 1

.
Fie r
i
numrul de bii din colorare chiar nainte de iteraia cu numrul de ordine i. Vom
demonstra prin inducie c, dac lg
(i)
n| 2, atunci r
i
lg
(i)
n| +2. Iniial, avem r
1
lg n|.
Cea de-a i-a iteraie scade numrul de bii din colorare la r
i+1
= lg r
i
| + 1. Presupunnd c
ipoteza inductiv este adevrat pentru r
i1
, obinem
r
i
= lg r
i1
| + 1 lg(lg
(i1)
n| + 2)| + 1 lg(lg
(i1)
n + 3)| + 1
lg(2 lg
(i1)
n)| + 1 = lg(lg
(i1)
n) + 1| + 1 = lg
(i)
n| + 2.
A patra relaie rezult din presupunerea c lg
(i)
n| 2, ceea ce nseamn c lg
(i1)
n| 3. De
aceea, dup m = lg

n pai, numrul biilor din colorare este r


m
lg
(m)
n| + 2 = 3 deoarece
lg
(m)
n 1, din deniia funciei lg

. Astfel, cel mult nc o iteraie este de ajuns pentru a produce


o 6-colorare. De aceea, timpul total de execuie al algoritmului ase-Culori este O(lg

n).
Determinarea unei mulimi independente maximale dintr-o 6-colorare
Colorarea este partea dicil a ntreruperii simetriei. Algoritmul EREW Listeaz-MIM
folosete n procesoare pentru a gsi o mulime independent maximal ntr-un timp O(c), dat
ind o c-colorare a unei liste de n obiecte. Astfel, o dat ce am determinat o 6-colorare a unei
liste, putem gsi o mulime independent maximal ntr-un timp O(1).
Partea de la sfritul gurii 30.11 ilustreaz ideea ce st la baza algorimului Listeaz-
MIM. Se d o c-colorare C. Cu ecare obiect x, pstrm un bit posibil[x], care ne spune dac
x este nc un candidat pentru includerea n mulimea independent maximal (MIM). Iniial,
posibil[x] = adevrat, pentru toate obiectele din x.
Apoi, algoritmul itereaz ecare din cele c culori. n iteraia pentru culoarea i, ecare procesor
responsabil cu un obiect x veric dac C[x] = i i posibil[x] = adevrat. Dac ambele condiii
sunt adevrate, atunci procesorul marcheaz x ca aparinnd mulimii independente maximale
ce este construit. Toate obiectele adiacente celor adugate mulimii independente maximale
acelea imediat nainte sau imediat dup vor avea biii lor posibil setai pe fals. Ele nu pot
aparine mulimii independente maximale pentru c sunt adiacente unui obiect ce se a n ea.
Dup c iteraii, ecare obiect a fost e omort bitul su posibil a fost setat pe fals, e plasat
n mulimea maximal independent.
Trebuie s artm c mulimea rezultat este independent i maximal. Pentru a arta c
este independent, s presupunem c dou obiecte adiacente x i urm[x] sunt plasate n mulime.
Deoarece ele sunt adiacente, C[x] = C[urm[x]] pentru c C este o colorare. Fr a pierde din
generalitate, presupunem c C[x] < C[urm[x]], astfel nct x este plasat n mulime naintea
lui urm[x]. Dar n acest caz posibil[urm[x]] a fost deja setat pe fals atunci cnd obiectele de
culoare C[urm[x]] sunt luate n considerare i, deci, urm[x] nu poate s e plasat n mulime.
30.5. ntreruperi deterministe de simetrie 621
Figura 30.11 Algoritmii ase-Culori i Listeaz-MIM care rup simetria dintr-o list. mpreun,
algoritmii determin o mulime mare de obiecte neadiacente ntr-un timp O(lg

) folosind n procesoare.
Lista iniial de n = 20 obiecte este prezentat n partea stng, pe vertical. Fiecare obiect are o
culoare iniial, distinct, de 5 culori. Pentru aceti parametri, algoritmul ase-Culori nu necesit dect
cele dou iteraii prezentate pentru a recolora ecare obiect cu o culoare din domeniul 0, 1, 2, 3, 4, 5.
Obiectele albe sunt plasate n mulimea independent maximal (MIM) de ctre algoritmul Listeaz-
MIM pe msur ce culorile sunt procesate, iar obiectele negre eliminate.
622 Capitolul 30 Algoritmi pentru calculatoare paralele
Pentru a arta c mulimea este maximal, s presupunem c nici unul dintre obiectele con-
secutive x, y si z nu a fost plasat n mulime. Singurul mod n care y ar putut evita plasarea sa
n mulime este s fost eliminat atunci cnd un obiect adiacent a fost plasat n list. Deoarece,
din presupunerea noastr, nici x, nici z nu au fost plasate n mulime, obiectul y trebuie s
fost nc n via n momentul cnd obiectele de culoare C[y] au fost procesate. Deci, el trebuie
s fost plasat n mulime.
Fiecare iteraie a algoritmului Listeaz-MIM necesit un timp O(1) pe un PRAM. Al-
goritmul este EREW deoarece ecare obiect se acceseaz doar pe sine nsui, predecesorul
i succesorul su din list. Combinnd algoritmii Listeaz-MIM i ase-Culori, putem
ntrerupe, deterministic, simetria dintr-o list nlnuit ntr-un timp O(lg

n).
Exerciii
30.5-1 Pentru exemplul de ntrerupere de simetrie a dou procesoare, prezentat la nceputul
acestei seciuni, artai c simetria este ntrerupt ntr-un timp ateptat constant.
30.5-2 Dat ind o 6-colorare a unei liste de n obiecte, artai cum se poate 3-colora lista
ntr-un timp O(1) folosind n procesoare pe un PRAM EREW.
30.5-3 Presupunei c ecare nod dintr-un arbore cu n noduri, cu excepia rdcinii, are un
pointer la printele su. Dai un algoritm CREW pentru a O(1)-colora arborele ntr-un timp
O(lg

n).
30.5-4 Dai un algoritm PRAM ecient pentru a O(1)-colora un graf de gradul 3. Analizai
algoritmul propus.
30.5-5 O mulime k-conductoare a unei liste nlnuite este o mulime de obiecte (con-
ductori) din list, astfel nct nu exist doi conductori adiaceni i, cel mult, k neconduc-
tori (subieci) separ conductorii. Astfel, o mulime independent maximal este o mulime
2-conductoare. Artai cum se poate calcula o mulime O(lg n)-conductoare a unei liste de
n obiecte ntr-un timp O(1), folosind n procesoare. Artai cum se poate calcula o mulime
O(lg lg n)-conductoare ntr-un timp O(1), presupunnd aceleai lucruri ca mai sus.
30.5-6 Artai cum se poate determina o 6-colorare a unei liste nlnuite de n obiecte ntr-
un timp O(lg(lg

n)). Presupunei c ecare procesor poate memora un tablou precalculat de


dimensiune O(lg n). ( n algoritmul ase-Culori, de cte valori depinde culoarea nal
a unui obiect?)
Probleme
30-1 Prex paralel segmentat
La fel ca un calcul de prex obinuit, un calcul de prex segmentat este denit cu ajutorul
unui operator binar, asociativ . Algoritmul primete un ir de intrare x = 'x
1
, x
2
, . . . , x
n
` ale
crui elemente provin dintr-un domeniu S i un ir segment b = 'b
1
, b
2
, . . . , b
n
` ale crui elemente
provin din domeniul 0, 1, cu b
1
= 1. Algoritmul produce un ir de ieire y = 'y
1
, y
2
, . . . , y
n
`,
cu elemente din domeniul S. Biii lui b determin o partiionare a lui x i y n segmente. Un nou
Probleme 623
Figura 30.12 Un calcul al prexului paralel segmentat cu irul segment b, irul de intrare x i irul de
ieire y. Exist 5 segmente.
segment ncepe oricnd b
i
= 1, iar cel curent continu dac b
i
= 0. Calculul de prex segmentat
execut un calcul de prex independent n cadrul ecrui segment al lui x pentru a produce
segmentul corespunztor al lui y. Figura 30.12 ilustreaz un calcul de prex segmentat folosind
adunarea obinuit.
a. Se denete operatorul

pe perechile ordonate (a, z), (a
t
, z
t
) 0, 1S n modul urmtor:
(a, z)

(a
t
, z
t
) =

(a, z z
t
) dac a
t
= 0,
(1, z
t
) dac a
t
= 1.
Demonstrai c

este asociativ.
b. Artai cum se poate implementa, ntr-un timp O(lg n), orice calcul de prex segmentat
pe o list de n elemente pe un PRAM CRCW cu p = n procesoare.
c. Descriei un algoritm EREW de timp O(k lg n) pentru ordonarea unei liste de n numere
de k bii.
30-2 Algoritm de determinare a maximului, ecient ca numr de procesoare
Dorim s determinm maximul a n numere pe un PRAM CRCW cu p = n procesoare.
a. Demonstrai c problema determinrii maximului a m p/2 numere se poate reduce la
problema determinrii a maximului a, cel mult, m
2
/p numere ntr-un timp O(1) pe un
PRAM CRCW avnd p procesoare.
b. Dac pornim cu m = p/2| numere, cte numere rmn dup k iteraii ale algoritmului n
partea (a)?
c. Artai c problema determinrii maximului a n numere poate rezolvat ntr-un timp
O(lg lg n) pe un PRAM CRCW cu p = n procesoare.
30-3 Componente conexe
n aceast problem, investigm un algoritm CRCW arbitrar pentru determinarea componentelor
conexe ale unui graf neorientat G = (V, E) care folosete [V +E[ procesoare. Structura de date
folosit este o pdure de mulimi disjuncte (vezi seciunea 22.3). Fiecare vrf v V menine
un pointer p[v] la un printe. Iniial, p[v] = v: pointerul vrfului v este el nsui. La sfritul
algorimului, pentru oricare dou vrfuri u, v V , avem p[u] = p[v] dac i numai dac u Yv n
G. n timpul algorimului, cei p pointeri formeaz o pdure de arbori de pointeri cu rdcin.
O stea este un arbore de pointeri n care p[u] = p[v] pentru toate vrfurile u i v din arbore.
Algoritmul pentru determinarea componentelor conexe presupune c ecare muchie (u, v) E
apare de dou ori: o dat ca (u, v) i o dat ca (v, u). Algorimul folosete dou operaii de baz,
624 Capitolul 30 Algoritmi pentru calculatoare paralele
Crlig i Salt, i o subrutin Stea care seteaz stea[v] = adevrat dac v aparine unei
stele.
Crlig(G)
1: Stea(G)
2: pentru ecare muchie (u, v) E[G], n paralel execut
3: dac stea[u] i p[u] > p[v] atunci
4: p[p[u]] p[v]
5: Stea(G)
6: pentru ecare muchie (u, v) E[G], n paralel execut
7: dac star[u] i p[u] = p[v] atunci
8: p[p[u]] p[v]
Salt(G)
1: pentru ecare v V [G], n paralel execut
2: p[v] p[p[v]]
Algoritmul pentru determinarea componentelor conexe apeleaz iniial procedura Crlig,
iar apoi apeleaz, n continuu, procedurile Crlig, Salt, Crlig, Salt i aa mai departe,
pn cnd nici un pointer nu mai este schimbat de ctre procedura Salt. (Observai c procedura
Crlig este apelat de dou ori naintea primului apel al procedurii Salt).
a. Descriei procedura Stea(G) n pseudocod.
b. Artai c cei p pointeri formeaz, ntr-adevr, arbori cu rdcin, pointerul nodului
rdcin ind chiar rdcina nsi. Artai c, dac u i v se a n acelai arbore de
pointeri, p[u] = p[v] dac i numai dac u Yv n G.
c. Demonstrai c algoritmul este corect: el se termin, iar cnd se termin, p[u] = p[v] dac
i numai dac u Yv n G.
Pentru a analiza algoritmul pentru componente conexe, vom examina o singur component
conex C, despre care presupunem c are cel puin dou vrfuri. S presupunem c, la un
moment dat n cursul execuiei algoritmului, C este format dintr-o mulime T
i
de arbori de
pointeri. Denim potenialul C ca ind
(C) =

T
i
nlime(T
i
)
Scopul analizei noastre este s demonstrm c ecare iteraie de agri i salturi micoreaz
(C) cu un factor constant.
d. Demonstrai c, dup apelul iniial al procedurii Crlig, urmtoarele apeluri ale proce-
durii Crlig nu-l mresc niciodat pe (C).
f. Artai c, dup ecare apel al procedurii Crlig, cu excepia celui iniial, nici un arbore
de pointeri nu este o stea, dect dac arborele de pointeri conine toate vrfurile din C.
g. Argumentai c, dac C nu a fost compactizat ntr-o singur stea, atunci, dup un apel
al procedurii Salt, (C) este, cel mult, 2/3 din valoarea sa anterioar. Ilustrai cazul cel
mai defavorabil.
Note bibliograce 625
h. Demonstrai c algoritmul determin toate componentele conexe ale lui G ntr-un timp
O(lg V ).
30-4 Transpunerea unei imagini raster
Un tampon de cadru pentru o imagine raster poate privit ca o matrice de bii M de dimensiuni
p p. Dispozitivul zic de aare a imaginii rastru determin o submatrice aat n partea de
sus, stnga de dimensiuni nn a lui M vizibil pe ecranul utilizatorului. Se folosete o operaie
BitBLT(engl. BLock Transfer of BITs Transfer n Bloc al Biilor) pentru a muta un dreptunghi
de bii dintr-o poziie n alta. Mai exact, BitBLT(r
1
, c
1
, r
2
, c
2
, nr, nc, ) seteaz
M[r
2
+i, c
2
+j] M[r
2
+i, c
2
+j] M[r
1
+i, c
1
+j]
pentru i = 0, 1, . . . , nr 1 i j = 0, 1, . . . , nc 1, unde este oricare din cele 16 funcii booleene
cu dou intrri.
Ne intereseaz transpunerea imaginii (M[i, j] M[j, i]) n poriunea vizibil a tamponului
de cadru. Costul copierii biilor se presupune a mai mic dect acela al apelrii primitivei
BitBLT i, astfel, suntem interesai s folosim ct mai puine operaii BitBLT posibil.
Artai c orice imagine de pe ecran poate transpus cu O(lg n) operaii BitBLT.
Presupunei c p este sucient mai mare dect n astfel nct poriunile invizibile ale tamponnului
de cadru ofer destul spaiu de stocare pentru implementarea algoritmului. De ct spaiu
adiional de stocare avei nevoie? ( Folosii o abordare divide-i-stpnete paralel,
n care unele operaii BitBLT sunt efectuate prin operaii I booleene.)
Note bibliograce
Akl [9], Karp i Ramachandran [118], i Leighton [135] studiaz algorimii paraleli pentru
probleme combinaionale. Arhitecturi variate de maini paralele sunt descrise de Hwang i Briggs
[109] i de Hwang i DeGroot [110].
Teoria calculului paralel a nceput n anii 1940, cnd J. Von Neumann [38] a introdus un model
restrns de calcul paralel numit automat celular, care, n esen, este un tablou bidimensional
de procesoare cu stri nite, interconectate n form de reea. Modelul PRAM a fost formalizat
n 1978 de ctre Fortune i Wyllie [73], dei muli ali autori au discutat nainte modele esenial
asemntoare.
Salturile de pointeri au fost introduse de ctre Wyllie [204]. Studiul calculului paralel de prex
i are originea n lucrrile lui Ofman [152], n contextul adunrii carry-lookahead. Tehnica turului
lui Euler se datoreaz lui Tarjan i Vishkin [191].
Compromisuri n privina timpului procesor pentru determinarea maximului unei mulimi
de n numere au fost date de Valiant [193], care a demonstrat i faptul c nu exist un algoritm
ecient de timp O(1). Cook, Dwork i Reischuk [50] au demonstrat c problema determinrii
maximului necesit un timp (lg n) pe un PRAM CRCW. Simularea unui algoritm CRCW
printr-un algoritm EREW se datoreaz lui Vishkin [195].
Teorema 30.2 se datoreaz lui Brent [34]. Algoritmul aleator pentru determinarea ecient a
rangului listelor a fost descoperit de Anderson i Miller [11]. Ei au dat, de asemenea, i un algoritm
deterministic ecient pentru aceeai problem [10]. Algoritmul pentru ntreruperea deterministic
a simetriei se datoreaz lui Goldberg i Plotkin [84]. El se bazeaz pe un algoritm similar, cu
acelai timp de rulare, datorat lui Cole i Vishkin [47].
31 Operaii cu matrice
Operaiile cu matrice sunt operaii de baz n calcule tiinice. De aceea, eciena
algoritmilor asupra matricelor este de un interes considerabil. Acest capitol ofer o scurt
introducere n teoria matricelor, evideniind problema nmulirii matricelor i rezolvarea
sistemelor de ecuaii liniare.
Dup seciunea 31.1, care introduce conceptele de baz i notaiile referitoare la matrice,
seciunea 31.2 prezint algoritmul surprinztor al lui Strassen pentru nmulirea a dou matrice
de ordinul n n ntr-un timp de ordinul lui (n
lg 7
) = O(n
2.81
). Seciunea 31.3 denete
noiunile de cvasiinel, inel i cmpuri claricnd ipotezele cerute de funcionarea algoritmului
lui Strassen. De asemenea, seciunea conine un algoritm asimptotic rapid pentru nmulirea
matricelor booleene. n seciunea 31.4 se trateaz modul de rezolvare a unui sistem de ecuaii
liniare utiliznd descompunerea LUP. Apoi, n seciunea 31.5 se studiaz legtura strns dintre
problemele nmulirii matricelor i problema inversrii lor. n nal, n seciunea 31.6 se studiaz
clasa important a matricelor simetrice pozitiv-denite i se prezint modul lor de utilizare n
rezolvarea unui sistem de n ecuaii liniare cu m necunoscute m < n, folosind metoda celor mai
mici ptrate.
31.1. Proprietile matricelor
n aceast seciune, vom recapitula cteva concepte de baz din teoria matricelor precum
i proprieti fundamentale ale matricelor, concentrndu-ne atenia asupra acelora care vor
necesare n seciunile urmtoare.
Matrice i vectori
O matrice este un tablou dreptunghiular de numere. De exemplu,
A =

a
11
a
12
a
13
a
21
a
22
a
23

1 2 3
4 5 6

(31.1)
este o matrice A = (a
ij
) de ordinul 2 3, unde i = 1, 2 i j = 1, 2, 3, iar elementul matricei
din linia i i coloana j este a
ij
. Vom nota matricele cu litere mari, iar elementele lor cu litere
mici, indexate. Mulimea tuturor matricelor de ordinul mn, avnd elemente reale, se noteaz
cu R
mn
. n general, mulimea matricelor de ordinul mn, avnd elemente din mulimea S, se
noteaz cu S
mn
.
Transpusa unei matrice A este matricea A
T
care se obine interschimbnd liniile i coloanele
lui A. Pentru matricea A din relaia (31.1),
A
T
=

1 4
2 5
3 6

.
31.1. Proprietile matricelor 627
Un vector este un tablou unidimensional de numere. De exemplu,
x =

2
3
5

. (31.2)
este un vector de dimensiunea 3. Vom utiliza litere mici pentru a nota vectori i vom nota prin
x
i
, pentru i = 1, 2, . . . , n, al i-lea element al vectorului x de dimensiune n. Forma standard a
unui vector este vectorul coloan, echivalent cu o matrice de ordinul n 1; vectorul linie
corespunztor se obine lund transpusa:
x
T
= (2 3 5).
Vectorul unitate e
i
este vectorul pentru care al i-lea element este 1 i toate celelalte elemente
sunt 0. De obicei, dimensiunea unui vector unitate rezult din context.
O matrice zero este o matrice ale crei elemente sunt 0. O astfel de matrice, de obicei, se
noteaz cu 0, ntruct ambiguitatea dintre numrul 0 i matricea 0 se rezolv simplu, subne-
legndu-se din context la ce se face referirea. Dac este vorba de o matrice 0, atunci ordinul ei
trebuie s rezulte din context.
Matricele ptratice de ordinul n n sunt ntlnite frecvent. O importan mare prezint
diferitele cazuri particulare de matrice ptratice:
1. O matrice diagonal are elementele a
ij
= 0 pentru i = j. Deoarece toate elementele
nesituate pe diagonal sunt nule, matricea poate specicat enumernd elementele de pe
diagonal:
diag(a
11
, a
22
, . . . , a
nn
) =

a
11
0 0
0 a
22
0
.
.
.
.
.
.
.
.
.
.
.
.
0 0 a
nn

2. Matricea unitate I
n
de ordinul n n este matricea avnd 1 pe diagonal:
I
n
= diag(1, 1, . . . , 1) =

1 0 0
0 1 0
.
.
.
.
.
.
.
.
.
.
.
.
0 0 1

.
n cazul n care I nu are indice, ordinul ei poate dedus din context. Coloana a i-a a unei
matrice unitate este vectorul unitate e
i
.
3. Numim matrice tridiagonal acea matrice T n care t
ij
= 0 dac [i j[ > 1. Elementele
nenule apar numai pe diagonala principal, imediat deasupra diagonalei principale (t
i,i+1
pentru i = 1, 2, . . . , n 1) sau imediat sub diagonala principal (t
i+1,i
, pentru i =
628 Capitolul 31 Operaii cu matrice
1, 2, . . . , n 1):
T =

t
11
t
12
0 0 . . . 0 0 0
t
21
t
22
t
23
0 . . . 0 0 0
0 t
32
t
33
t
34
. . . 0 0 0
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0 0 0 0 . . . t
n2,n2
t
n2,n1
0
0 0 0 0 . . . t
n1,n2
t
n1,n1
0
0 0 0 0 . . . 0 t
n,n1
t
nn

.
4. Numim matrice superior triunghiular acea matrice U n care u
ij
= 0 pentru orice
i > j. Toate elementele de sub diagonal sunt nule:
U =

u
11
u
12
. . . u
1n
0 u
21
. . . u
2n
.
.
.
.
.
.
.
.
.
.
.
.
0 0 . . . u
nn

.
O matrice superior triunghiular este matrice unitate superior triunghiular dac
toate elementele de pe diagonal sunt egale cu 1.
5. Numim matrice inferior triunghiular acea matrice L n care l
ij
= 0 pentru orice
i < j. Toate elementele de deasupra diagonalei sunt nule:
L =

l
11
0 . . . 0
l
21
l
22
. . . 0
.
.
.
.
.
.
.
.
.
.
.
.
l
n1
l
n2
. . . l
nn

.
O matrice inferior triunghiulat care are toate elementele de pe diagonal egale cu 1 se
numete matrice unitate inferior triunghiular.
6. O matrice de permutare P este acea matrice care are exact un 1 n ecare linie sau
coloan i zero n rest. Un exemplu de matrice de permutare este:
P =

0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 0 0 1
0 0 1 0 0

.
O astfel de matrice se numete matrice de permutare deoarece, nmulind un vector x cu
o matrice de permutare, se permut (rearanjeaz) elementele lui x.
7. O matrice simetric A este o matrice care satisface condiia A = A
T
. De exemplu,

1 2 3
2 6 4
3 4 5

este o matrice simetric.


31.1. Proprietile matricelor 629
Operaii cu matrice
Elementele unei matrice sau ale unui vector sunt numere dintr-o clas, cum ar numerele
reale, complexe sau numere ntregi modulo un numr prim. Clasa denete modul de adunare
i nmulire a numerelor. Aceste deniii se pot extinde pentru a include adunarea i nmulirea
matricelor.
Denim adunarea matricelor dup cum urmeaz. Dac A = (a
ij
) i B = (b
ij
) sunt matrice
de ordinul mn, atunci matricea sum C = (c
ij
) = A+B este matricea de ordinul mn denit
prin
c
ij
= a
ij
+b
ij
pentru i = 1, 2, . . . , m i j = 1, 2, . . . , n. Dup cum se observ, adunarea se face pe
componente. Matricea zero este matricea unitate pentru adunarea matricelor:
A+ 0 = A = 0 +A.
Dac este un numr i A = (a
ij
) este o matrice, atunci A = (a
ij
) este produsul scalar al
lui A obinut nmulind ecare din elementele sale cu . Ca un caz special, denim opusul unei
matrice A = (a
ij
) ca ind 1 A = A, deci elementul de indice ij al lui A este a
ij
. Astfel,
A+ (A) = 0 = (A) +A.
Dndu-se aceste deniii, putem deni scderea matricelor prin adunarea opusei unei matrice:
A B = A + (B). Denim nmulirea matricelor dup cum urmeaz. Pornim cu dou
matrice A i B care sunt compatibile, n sensul c numrul de coloane al matricei A este egal
cu numrul de linii al matricei B. (n general, o expresie care conine un produs de matrice AB
implic faptul c matricele A i B sunt compatibile.) Dac A = (a
ij
) este o matrice de ordinul
m n i B = (b
jk
) este o matrice de ordinul n p, atunci matricea produs C = AB este o
matrice C = (c
ik
) de ordinul mp, unde:
c
ik
=
n

j=1
a
ij
b
jk
(31.3)
pentru i = 1, 2, . . . , m i k = 1, 2, . . . , p. Procedura nmulete-Matrice din seciunea 26.1
implementeaz nmulirea matricelor ntr-o manier direct bazat pe relaia (31.3), presupunnd
c matricele sunt ptratice: m = n = p. Pentru a nmuli matrice de ordinul n n, algoritmul
nmulete-Matrice efectueaz n
3
nmuliri i n
2
(n 1) adunri, timpul de execuie ind
(n
3
).
Matricele au multe (dar nu toate) din proprietile tipice numerelor. Matricele unitate sunt
uniti pentru nmulirea matricelor:
I
m
A = AI
n
= A
pentru orice matrice A de ordinul mn. nmulirea cu matricea zero d o matrice zero:
A0 = 0.
nmulirea matricelor este asociativ:
A(BC) = (AB)C (31.4)
630 Capitolul 31 Operaii cu matrice
pentru matricele compatibile A, B i C.
nmulirea matricelor este distributiv n raport cu adunarea:
A(B +C) = AB +AC,
(B +C)D = BD +CD. (31.5)
nmulirea matricelor de ordinul n n nu este comutativ dect dac n = 1. De exemplu, dac
A =

0 1
0 0

i B =

0 0
1 0

, atunci AB =

1 0
0 0

i BA =

0 0
0 1

.
Pentru a calcula produse de forma matrice-vector sau vector-vector, se consider c vectorul
ar echivalent cu o matrice de ordinul n1 (sau o matrice de ordinul 1n, n cazul unui vector
linie). Astfel, dac A este o matrice de ordinul mn i x un vector de dimensiune n, atunci Ax
este un vector de dimensiune m. Dac x i y sunt vectori de dimensiune n, atunci
x
T
y =
n

i=1
x
i
y
i
este un numr (de fapt, o matrice de ordinul 1 1) numit produs scalar al vectorilor x i y.
Matricea xy
T
este o matrice Z de ordinul n n numit produsul exterior al vectorilor x i y,
cu z
ij
= x
i
y
j
. Norma (euclidian) |x| a vectorului x de dimensiune n se denete prin
|x| = (x
2
1
+x
2
2
+. . . +x
2
n
)
1/2
= (x
T
x)
1/2
.
Astfel, norma lui x este lungimea n spaiul euclidian n-dimensional.
Inversul, rangul i determinantul matricelor
Inversa unei matrice A de ordinul n n este o matrice de ordinul n n, notat cu A
1
(dac exist), astfel nct AA
1
= I
n
= A
1
A. De exemplu,

1 1
1 0

1
=

0 1
1 1

.
Multe matrice de ordinul n n nenule nu au invers. O matrice care nu are invers se numete
neinversabil sau singular. Un exemplu de matrice singular nenul este

1 0
1 0

.
Dac o matrice are o invers, ea se numete inversabil sau nesingular. Inversele matricelor,
dac ele exist, sunt unice. (Vezi exerciiul 31.1-4.) Dac A i B sunt matrice de ordinul n n
nesingulare, atunci
(BA)
1
= A
1
B
1
. (31.6)
Operaia de inversare comut cu operaia de transpunere:
(A
1
)
T
= (A
T
)
1
.
Vectorii x
1
, x
2
, . . . , x
n
sunt liniar dependeni dac exist coecienii c
1
, c
2
, . . . , c
n
, nu toi
nuli, astfel nct c
1
x
1
+c
2
x
2
+ +c
n
x
n
= 0. De exemplu, vectorii x
1
= (1 2 3)
T
, x
2
= (2 6 4)
T
31.1. Proprietile matricelor 631
i x
3
= (4 11 9)
T
sunt liniar dependeni deoarece 2x
1
+ 3x
2
2x
3
= 0. Dac vectorii nu sunt
liniar dependeni, atunci sunt liniar independeni . De exemplu, coloanele matricei unitate
sunt liniar independente.
Rangul coloan al unei matrice A de ordinul mn nenule este dimensiunea celei mai mari
mulimi de coloane liniar independente ale lui A. Similar, rangul linie al lui A este dimensiunea
celei mai mari mulimi de linii liniar independente ale lui A. O proprietate fundamental a oricrei
matrice A este faptul c rangurile linie i coloan ale ei sunt totdeauna egale, aa c putem, pur
i simplu, s ne referim la rangul lui A. Rangul unei matrice de ordinul m n este un ntreg
ntre 0 i min(m, n), inclusiv. (Rangul unei matrice zero este 0, iar al matricei unitate de ordinul
n n este n.) O deniie echivalent pentru rang, adesea mai util, este aceea c rangul unei
matrice A de ordinul mn nenule este cel mai mic numr r, astfel nct s existe matricele B
i C de ordine mr, respectiv, r n, astfel ca
A = BC.
O matrice ptrat de ordinul n n are rangul complet dac acesta este n. O proprietate
fundamental a rangurilor va enunat prin urmtoarea teorem.
Teorema 31.1 O matrice ptrat are rangul complet dac i numai dac este nesingular.
O matrice de ordinul mn are rangul coloan complet dac rangul ei este n.
Un vector de anulare pentru o matrice A este un vector x diferit de zero, astfel nct
Ax = 0. Teorema urmtoare, a crei demonstraie este cerut n exerciiul 31.1-8, precum i
corolarul ei leag noiunile de rang coloan i singularitate cu cea de vector de anulare.
Teorema 31.2 O matrice A are un rang coloan complet dac i numai dac nu are un vector
de anulare.
Corolarul 31.3 O matrice ptratic A este singular dac i numai dac are un vector de
anulare.
Al ij-lea minor al matricei A de ordinul n n, pentru n > 1, este matricea A
[ij]
de ordinul
(n 1) (n 1), obinut eliminnd linia a i-a i coloana a j-a din A. Determinantul unei
matrice A de ordinul n n poate denit recursiv n termenii minorilor ei, prin
det(A) =

a
11
dac n = 1,
a
11
det(A
[11]
) a
12
det(A
[12]
)
+ + (1
n+1
a
1n
det(A
[1n]
)
dac n > 1.
(31.7)
Termenul (1)
i+j
det(A
[ij]
) este cunoscut sub numele de complement algebric al elementului
a
ij
.
Urmtoarele teoreme, ale cror demonstraii sunt omise aici, exprim proprietile funda-
mentale ale determinanilor.
Teorema 31.4 (Proprietile determinanilor) Determinantul unei matrice ptratice A
are urmtoarele proprieti:
Dac o linie sau o coloan oarecare a lui A este zero, atunci det(A)=0.
Dac se nmulesc elementele unei linii (sau unei coloane) cu , atunci determinantul lui
A se nmulete cu .
632 Capitolul 31 Operaii cu matrice
Dac elementele unei linii (sau coloane) se adaug la elementele altei linii (sau coloane)
valoarea determinantului nu se schimb.
Determinantul lui A este egal cu determinantul lui A
T
.
Dac se permut ntre ele dou linii (sau coloane), valoarea determinantului se nmulete
cu 1.
De asemenea, pentru orice matrice ptratice A i B, avem det(AB) = det(A) det(B).
Teorema 31.5 O matrice A de ordinul n n este singular dac i numai dac det(A) = 0.
Matrice pozitiv-denite
Matricele pozitiv-denite joac un rol important n multe aplicaii. O matrice A de ordinul
nn este pozitiv-denit dac x
T
Ax > 0 pentru orice vector x = 0, n-dimensional. De exemplu,
matricea unitate este pozitiv-denit, deoarece pentru orice vector nenul x = (x
1
x
2
x
n
)
T
,
x
T
I
n
x = x
T
x = |x|
2
=
n

i=1
x
2
i
> 0.
Aa cum vom vedea, conform urmtoarei teoreme, matricele care apar n aplicaii sunt adesea
pozitiv-denite.
Teorema 31.6 Pentru orice matrice A avnd rangul coloan complet, matricea A
T
A este
pozitiv denit.
Demonstraie. Trebuie s artm c x
T
(A
T
A)x > 0 pentru orice vector x nenul. Pentru orice
vector x, pe baza exerciiului 31.1-3, avem
x
T
(A
T
A)x = (Ax)
T
(Ax) = |Ax|
2
0. (31.8)
S observm c |Ax|
2
este chiar suma ptratelor elementelor vectorului Ax. De aceea, dac
|Ax|
2
= 0, ecare element al lui Ax este 0, ceea ce nseamn c Ax = 0. ntruct A are rangul
coloan complet, Ax = 0 implic x = 0 conform teoremei 31.2. Deci, A
T
A este pozitiv-denit.
Alte proprieti ale matricelor pozitiv-denite vor studiate n seciunea 31.6.
Exerciii
31.1-1 Demonstrai c produsul a dou matrice inferior triunghiulare este o matrice infe-
rior triunghiular. Demonstrai c determinantul unei matrice triunghiulare (inferioar sau
superioar) este egal cu produsul elementelor de pe diagonala ei. Demonstrai c dac o matrice
inferior triunghiular admite invers, aceasta este o matrice inferior triunghiular.
31.1-2 Demonstrai c, dac P este o matrice de permutare de ordinul nn i A este o matrice
de ordinul n n, atunci PA poate obinut din A permutnd liniile sale, iar AP poate
obinut din A prin permutarea coloanelor sale. Demonstrai c produsul a dou matrice de
permutare este o matrice de permutare. Demonstrai c dac P este o matrice de permutare,
atunci este inversabil, inversa ei este P
T
, iar P
T
este o matrice de permutare.
31.2. Algoritmul lui Strassen pentru nmulirea matricelor 633
31.1-3 Demonstrai c (AB)
T
= B
T
A
T
i c A
T
A este, ntotdeauna, o matrice simetric.
31.1-4 Demonstrai c, dac B i C sunt inversele matricei A, atunci B = C.
31.1-5 Fie A i B dou matrice de ordinul n n, astfel nct AB = I. Artai c, dac A
t
este
obinut din A adugnd linia j la linia i, atunci inversa B
t
a lui A
t
poate obinut scznd
coloana i din coloana j a matricei B.
31.1-6 Fie A o matrice de ordinul nn nesingular. Artai c orice element din A
1
este real
dac i numai dac orice element din A este real.
31.1-7 Artai c, dac A este o matrice nesingular simetric, atunci A
1
este simetric.
Artai c, dac B este o matrice arbitrar (compatibil), atunci BAB
T
este simetric.
31.1-8 Artai c o matrice A are rangul coloan complet dac i numai dac Ax = 0 implic
x = 0. ( se va exprima dependena liniar a unei coloane de celelalte, sub forma unei
ecuaii matrice-vector.)
31.1-9 Demonstrai c, pentru orice dou matrice A i B compatibile,
rang(AB) min(rang(A), rang(B))
unde egalitatea are loc dac A sau B este matrice ptratic nesingular.( utilizai
deniia alternativ a rangului unei matrice.)
31.1-10 Dndu-se numerele x
0
, x
1
, . . . , x
n1
, demonstrai c determinantul matricei Vander-
monde
V (x
0
, x
1
, . . . , x
n1
) =

1 x
0
x
2
0
x
n1
0
1 x
1
x
2
1
x
n1
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1 x
n1
x
2
n1
x
n1
n1

este
det (V (x
0
, x
1
, . . . , x
n1
)) =

0j<kn1
(x
k
x
j
).
( Se nmulete coloana i cu x
0
i se adun la coloana i + 1 pentru i =
n 1, n 2, . . . 1, apoi se utilizeaz inducia.)
31.2. Algoritmul lui Strassen pentru nmulirea matricelor
Aceast seciune prezint remarcabilul algoritm recursiv al lui Strassen de nmulire a matri-
celor de ordinul n n, care se execut ntr-un timp de ordin (n
lg 7
) = O(n
2.81
). Astfel, pentru
sucient de mare, algoritmul este mai performant dect algoritmul nmulete-Matrice,
prezentat n seciunea 26.1, pentru care timpul este de ordinul (n
3
).
634 Capitolul 31 Operaii cu matrice
Prezentarea general a algoritmului
Algoritmul lui Strassen poate privit ca o aplicaie a unei tehnici familiare de proiectare:
divide i stpnete. S presupunem c dorim s calculm produsul C = AB, unde ecare dintre
A, B i C sunt matrice de ordinul n n. Presupunnd c n este multiplu de 2, mprim ecare
din matricele A, B i C n n/2 n/2 matrice, rescriind relaia C = AB astfel:

r s
t u

a b
c d

e g
f h

(31.9)
(Exerciiul 31.2-2 trateaz situaiile n care n nu este multiplu de 2.) Pentru ca notaiile s e
convenabile, elementele lui A se noteaz alfabetic de la stnga la dreapta, n timp ce elementele
lui B se noteaz de sus n jos, n concordan cu modul de realizare a nmulirii matricelor.
Relaia (31.9) corespunde urmtoarelor patru relaii
r = ae +bf, (31.10)
s = ag +bh, (31.11)
t = ce +df, (31.12)
u = cg +dh. (31.13)
Fiecare dintre aceste patru relaii specic dou nmuliri de matrice de ordinul n/2 n/2 i
suma lor. Utiliznd aceste relaii pentru a deni o strategie direct a tehnicii divide i stpnete,
deducem urmtoarea relaie de recuren pentru timpul T(n) de nmulire a dou matrice de
ordinul n n:
T(n) = 8T(n/2) + (n
2
). (31.14)
Din nefericire, relaia (31.14) are soluia T(n) = (n
3
) i, deci, aceast metod nu este mai
rapid dect cea obinuit.
Strassen a descoperit o metod recursiv diferit care cere numai apte nmuliri recursive
de matrice de ordinul n/2 n/2 i (n
2
) adunri i scderi scalare, obinndu-se relaia de
recuren
T(n) = 7T(n/2) + (n
2
) = (n
lg 7
) = O(n
2.81
). (31.15)
Metoda lui Strassen are patru pai:
1. Se descompun matricele A i B date n submatrice de ordinul n/2 n/2, ca n relaia
(31.9).
2. Utiliznd (n
2
) adunri i scderi scalare, se calculeaz 14 matrice de ordinul n/2 n/2:
A
1
, B
1
, A
2
, B
2
, , A
7
, B
7
.
3. Se calculeaz recursiv 7 matrice produs: P
i
= A
i
B
i
pentru i = 1, 2, . . . , 7.
4. Se calculeaz submatricele r, s, t, u ale matricei rezultat C prin adunarea i/sau scderea
diferitelor combinaii ale matricelor P
i
, utiliznd numai (n
2
) adunri i scderi scalare.
O astfel de procedur satisface relaia de recuren (31.15). Tot ce trebuie s facem n continuare
este s completm detaliile absente.
31.2. Algoritmul lui Strassen pentru nmulirea matricelor 635
Determinarea produselor de submatrice
Modul n care Strassen a descoperit submatricele ce reprezint cheia acestui algoritm nu este
bine cunoscut. Reconstruim o metod plauzibil a determinrii submatricelor.
S presupunem c am ghicit c ecare matrice P
i
poate pus sub forma
P
i
= A
i
B
i
= (
i1
a +
i2
b +
i3
c +
i4
d) (
i1
e +
i2
f +
i3
g +
i4
h), (31.16)
unde coecienii
ij
,
ij
aparin mulimii 1, 0, 1. Adic, am ghicit c ecare produs se
calculeaz adunnd sau scznd nite submatrice din A, adunnd sau scznd nite submatrice
din B i nmulind cele dou rezultate. Dei sunt posibile strategii mai generale, aceast strategie
se dovedete a funcional.
Dac formm toate cele patru produse n acest fel, atunci, putem utiliza aceast metod
recursiv, fr a presupune comutativitatea nmulirii deoarece ecare produs are toate subma-
tricele lui A n stnga i toate submatricele lui B n dreapta. Aceast proprietate este esenial
pentru aplicarea recursiv a acestei metode deoarece nmulirea matricelor nu este comutativ.
Este convenabil s utilizm o matrice de ordinul 44 pentru a reprezenta combinaiile liniare
ale produselor de submatrice, unde ecare produs combin o submatrice a lui A cu o submatrice
a lui B, ca n relaia (31.16). De asemenea, ecuaia (31.10) poate scris astfel
r = ae +bf = ( a b c d )

+1 0 0 0
0 +1 0 0
0 0 0 0
0 0 0 0

e
f
g
h

e f g h
a +
b +
c
d

Ultima expresie utilizeaz o notaie prescurtat n care + reprezint +1, . reprezint 0, iar
reprezint 1. (n continuare, vom omite etichetele pentru linii i coloane.) Utiliznd aceast
notaie, obinem urmtoarele relaii pentru celelalte submatrice ale matricei rezultat C:
s = ag +bh =

+
+

t = ce +df =



+
+

,
u = cg +dh =



+
+

.
Vom cuta un algoritm mai rapid de nmulire de matrice observnd c submatricea s poate
calculat prin relaia s = P
1
+P
2
, unde P
1
i P
2
se calculeaz utiliznd o nmulire de matrice:
P
1
= A
1
B
1
= a (g h) = ag ah =

,
636 Capitolul 31 Operaii cu matrice
P
2
= A
2
B
2
= (a +b) h = ah +bh =

+
+

.
Matricea t poate calculat ntr-o manier similar prin relaia t = P
3
+P
4
, unde
P
3
= A
3
B
3
= (c +d) e = ce +de =



+
+

i
P
4
= A
4
B
4
= d (f e) = df de =

.
Numim termen principal unul din cei opt termeni care apar n prile drepte ale uneia din
relaiile (31.10)(31.13). Am utilizat acum 4 produse pentru a calcula cele dou submatrice s i t
ai cror termeni principali sunt ag, bh, ce i df. S observm c P
1
calculeaz termenul principal
ag, P
2
calculeaz termenul principal bh, P
3
calculeaz termenul principal ce, iar P
4
calculeaz
termenul principal df. Astfel, mai trebuie s se calculeze cele dou submatrice rmase r i u, ai
cror termeni principali sunt termenii diagonali ae, bf, cg i dh, fr a folosi mai mult de trei
produse suplimentare. ncercm s-l denim pe P
5
n vederea calculrii a doi termeni principali
deodat:
P
5
= A
5
B
5
= (a +d) (e +h) = ae +ah +de +dh =

+ +


+ +

.
Pe lng calculul celor doi termeni principali ae i dh, P
5
calculeaz termenii auxiliari ah i de,
care trebuie s e anihilai printr-o anumit modalitate. Putem s-i folosim pe P
4
i P
2
pentru
acest lucru, dar atunci apar ali doi termeni auxiliari:
P
5
+P
4
P
2
= ae +dh +df bh =

+


+ +

.
Adugnd un produs suplimentar
P
6
= A
6
B
6
= (b d) (f +h) = bf +bh df dh =


+ +

,
obinem
r = P
5
+P
4
P
2
+P
6
= ae +bf =

+
+

.
31.2. Algoritmul lui Strassen pentru nmulirea matricelor 637
Putem s-l obinem pe u, ntr-o manier similar, din P
5
, utiliznd P
1
i P
3
pentru a muta
termenii auxiliari ai lui P
5
n alt direcie:
P
5
+P
1
P
3
= ae +ag ce +dh =

+ +


+

.
Scznd un produs suplimentar
P
7
= A
7
B
7
= (a c) (e +g) = ae +ag ce cg =

+ +


,
vom obine
u = P
5
+P
1
P
3
P
7
= cg +dh =



+
+

.
Cele 7 produse de submatrice P
1
, P
2
, . . . , P
7
pot utilizate pentru a calcula produsul C = AB,
ceea ce completeaz descrierea metodei lui Strassen.
Discuie
Timpul de execuie mare al algoritmului lui Strassen l face impracticabil dac matricele nu
sunt mari (n s e cel puin 45) i nu sunt dense (puine elemente nule). Pentru matrice mici,
este preferabil algoritmul direct, iar pentru matrice mari, cu numr mare de elemente nule, exist
algoritmi speciali care sunt mai ecieni dect algoritmul lui Strassen. n felul acesta, metoda
lui Strassen este, n mare msur, de interes teoretic.
Prin utilizarea tehnicilor avansate care depesc scopul acestei cri, se pot nmuli matrice
de ordinul n n ntr-un timp mai bun dect (n
lg 7
). Cea mai bun limit superioar curent
este aproximativ egal cu O(n
2.376
). Cea mai bun limit inferioar cunoscut este chiar limita
evident (n
2
) (evident, deoarece trebuie s calculm n
2
elemente ale matricei produs). n felul
acesta, nu tim ct de costisitoare este, n realitate, nmulirea matricelor.
Algoritmul lui Strassen nu cere ca elementele matricelor s e numere reale. Tot ce conteaz
este faptul c sistemul de numere trebuie s formeze un inel algebric. Dac elementele matricei
nu formeaz un inel, pot introduse alte tehnici care s permit aplicarea metodei lui Strassen.
Aceste rezultate se trateaz n seciunea urmtoare.
Exerciii
31.2-1 Utilizai algoritmul lui Strassen pentru a calcula produsul matricelor

1 3
5 7

8 4
6 2

.
638 Capitolul 31 Operaii cu matrice
31.2-2 Cum s-ar modica algoritmul lui Strassen pentru nmulirea matricelor de ordinul nn
n care n nu este o putere a lui 2? Artai c algoritmul rezultat se execut ntr-un timp de
ordinul (n
lg 7
).
31.2-3 Care este cel mai mare k, astfel nct, dac se pot nmuli matrice de ordinul 3 3,
folosind k nmuliri (fr a presupune comutativitatea nmulirii), s se poat nmuli matrice de
ordinul n n ntr-un timp de ordinul o(n
lg 7
)? Care ar timpul de execuie al acestui algoritm?
31.2-4 V. Pan a descoperit un mod de a nmuli matrice de ordinul 68 68 folosind 132464
nmuliri, un mod de a nmuli matrice de ordinul 70 70 folosind 143640 nmuliri i un mod
de a nmuli matrice de ordinul 72 72 folosind 155424 nmuliri. Care metod are cel mai bun
timp asimptotic de execuie cnd se utilizeaz un algoritm de nmulire de matrice de tip divide
i stpnete? Comparai acest timp cu timpul de execuie pentru algoritmul lui Strassen.
31.2-5 Ct de repede se poate nmuli o matrice de ordinul kn n cu o matrice de ordinul
nkn, utiliznd algoritmul lui Strassen ca subrutin? Rspundei la aceeai ntrebare inversnd
ordinea de intrare a matricelor.
31.2-6 Indicai modul de nmulire a numerelor complexe a + bi i c + di utiliznd numai trei
nmuliri de numere reale. Algoritmul trebuie s-i aib la intrare pe a, b, c i d i s produc,
separat, componenta real ac bd i pe cea imaginar ad +bc.
31.3. Sisteme de numere algebrice i nmulirea matricelor
booleene
Proprietile adunrii i nmulirii matricelor depind de proprietile sistemului de numere
peste care sunt denite matricele. n aceast seciune denim trei sisteme diferite de numere
care s e elemente ale matricelor: cvasiinele, inele i corpuri. Putem deni nmulirea matricelor
peste cvasiinele, dar algoritmul de nmulire a matricelor al lui Strassen funcioneaz peste inele.
Prezentm o tehnic simpl pentru a reduce nmulirea matricelor booleene, care este denit
peste un cvasiinel ce nu este un inel, la nmulirea peste un inel. n nal, vom arta de ce
proprietile unui corp nu pot exploatate n mod natural pentru a furniza algoritmi mai buni
pentru nmulirea matricelor.
Cvasiinele
Fie (S, , ,

0,

1) un sistem de numere, unde S este o mulime de elemente, i sunt
operaii binare pe S (operaii de adunare, respectiv, de nmulire), iar

0 i

1 sunt elemente
distincte din S. Acest sistem este un cvasiinel dac satisface urmtoarele proprieti:
1. (S, ,

0) este un monoid:
S este o mulime nchis n raport cu ; adic, a b S pentru orice a, b S.
este asociativ, adic a (b c) = (a b) c pentru orice a, b, c S.


0 este elementul neutru pentru , adic a

0 =

0 a = a pentru orice a S.
31.3. Sisteme de numere algebrice i nmulirea matricelor booleene 639
La fel, (S, ,

1) este un monoid.
2.

0 este element neutru, adic, a

0 =

0 a =

0 pentru orice a S.
3. Operatorul este comutativ, adic a b = b a pentru orice a, b S.
4. Operatorul este distributiv n raport cu ; adic a (b c) = (a b) (a c) i
(b c) a = (b a) (c a) pentru orice a, b, c S.
Exemple de cvasiinele sunt cvasiinelul boolean ({0,1},, , 0, 1), unde noteaz operaia SAU
i noteaz operaia logic I, sistemul de numere naturale (N, +, , 0, 1), unde + i noteaz
operaiile obinuite de adunare i nmulire. Orice semiinel nchis (vezi seciunea 26.4) este, de
asemenea, un cvasiinel; semi-inelele nchise au, n plus, proprietile de idempoten i sum-
innit.
Putem extinde i pentru matrice aa cum am fcut pentru + i n seciunea 31.1.
Notm matricea identitate de ordinul n n compus din

0 i

1 prin

I
n
; gsim c nmulirea
matricelor este bine denit i c sistemul de matrice este el nsui un cvasiinel, aa cum se
arm n urmtoarea teorem.
Teorema 31.7 (Matricele peste un cvasiinel formeaz un cvasiinel) Dac (S, , ,

0,

1) este un cvasiinel i n 1, atunci (S


nn
, , ,

0,

I
n
) este un cvasiinel.
Demonstraie. Demonstraia este lsat pe seama cititorului (exerciiul 31.3-3).
Inele
Scderea nu este denit pentru cvasiinele, dar este denit pentru acele inele care sunt
cvasiinele (S, , ,

0,

1) i care satisfac urmtoarea proprietate suplimentar:
5. Orice element din S are un invers aditiv, adic, pentru orice a S, exist un element
b S, astfel nct a b = b a =

0. Un astfel de b este numit negativul lui a i este notat


cu (a).
Fiind denit negativul unui element, putem deni scderea prin a b = a + (b).
Exist multe exemple de inele. Mulimea numerelor ntregi (Z, +, , 0, 1), fa de operaiile
obinuite de adunare i nmulire, formeaz un inel. Mulimea numerelor ntregi modulo n pentru
orice numr ntreg n > 1 adic (Z
n
, +, , 0, 1), unde + este adunarea modulo n i este nmulirea
modulo n formeaz un inel. Un alt exemplu este mulimea R[x] a polinoamelor n x de grad
nit avnd coecieni reali, fa de operaiile obinuite adic, (R[x], +, , 0, 1), unde + este
adunarea polinoamelor i este nmulirea lor.
Corolarul urmtor arat c teorema 31.7 se generalizeaz n mod natural peste inele.
Corolarul 31.8 (Mulimea matricelor peste un inel formeaz un inel) Dac (S, , ,

0,

1) este un inel i n 1, atunci (S
nn
, , ,

0,

I
n
) este un inel.
Demonstraie. Demonstraia este lsat pe seama cititorului (exerciiul 31.3-3).
Folosind acest corolar, putem demonstra urmtoarea teorem.
Teorema 31.9 Algoritmul lui Strassen de nmulire a matricelor funcioneaz corect peste orice
inel de matrice.
640 Capitolul 31 Operaii cu matrice
Demonstraie. Algoritmul lui Strassen depinde de corectitudinea algoritmului pentru matrice
de ordinul 22, algoritm care cere numai ca elementele matricelor s aparin unui inel; corolarul
31.8 implic faptul c matricele nsele formeaz un inel. Astfel, rezult prin inducie, c algoritmul
lui Strassen funcioneaz corect la ecare nivel al recursivitii.
Algoritmul lui Strassen pentru nmulirea matricelor, depinde, de fapt, esenial de existena
inversei aditive. Din cele apte produse P
1
, P
2
, , P
7
, patru implic diferen de submatrice.
Astfel, n general, algoritmul lui Strassen nu va funciona pentru cvasiinele.
nmulirea matricelor booleene
Algoritmul lui Strassen nu se poate utiliza direct la nmulirea matricelor booleene deoarece
cvasiinelul boolean (0, 1, , , 0, 1) nu este un inel. Exist cazuri n care un cvasiinel este
coninut ntr-un sistem mai mare care este un inel. De exemplu, numerele naturale (un cvasiinel)
sunt o submulime a ntregilor (un inel) i de aceea, algoritmul lui Strassen poate utilizat
pentru a nmuli matrice de numere naturale n cazul n care considerm c sistemul de numere
peste care sunt denite matricele sunt ntregii. Din pcate, cvasiinelul boolean nu poate extins
ntr-un mod similar la un inel (vezi exerciiul 31.3-4.)
Urmtoarea teorem prezint o metod simpl pentru a reduce nmulirea matricelor booleene
la nmulirea peste un inel. Problema 31-1 prezint o astfel de concepie ecient.
Teorema 31.10 Dac notm cu M(n) numrul operaiilor aritmetice necesare pentru a nmuli
dou matrice de ordinul n n denite peste ntregi, atunci dou matrice booleene de ordinul
n n se pot nmuli utiliznd O(M(n)) operaii aritmetice.
Demonstraie. Fie A i B cele dou matrice, iar C = AB aparinnd cvasiinelului boolean,
adic,
c
ij
=
n

k=1
a
ik
b
kj
.
n loc de a calcula peste cvasiinelul boolean, vom calcula produsul C

peste inelul ntregilor,


folosind algoritmul de nmulire a matricelor care utilizeaz M(n) operaii aritmetice. n felul
acesta avem
c

ij
=
n

k=1
a
ik
b
kj
.
Fiecare termen a
ik
b
kj
al acestei sume este 0 dac i numai dac a
ik
b
kj
= 0 i 1 dac i numai
dac a
ik
b
kj
= 1. Astfel, suma ntreag c
t
ij
este 0 dac i numai dac ecare termen este 0 sau
echivalent, dac i numai dac SAU logic al termenilor care l exprim pe c
ij
este 0. De aceea,
matricea C poate reconstruit cu (n
2
) operaii aritmetice din matricea de numere ntregi
C
t
prin simpla comparare cu 0 a ecrui c
t
ij
. Numrul operaiilor aritmetice, pentru ntreaga
procedur, este O(M(n)) + (n
2
) = O(M(n)) deoarece M(n) = (n
2
).
Astfel, folosind algoritmul lui Strassen, putem realiza nmulirea matricelor booleene ntr-un
timp de ordinul O(n
lg 7
).
Metoda normal de nmulire a matricelor booleene utilizeaz numai variabile booleene. Dac
folosim aceast adaptare a algoritmului lui Strassen, matricea produs nal poate avea elemente
31.3. Sisteme de numere algebrice i nmulirea matricelor booleene 641
de mrimea lui n, deci, pentru a le memora, va nevoie de un cuvnt calculator, fa de un
singur bit. Mai ngrijortor este faptul c rezultalele intermediare, care sunt ntregi, pot chiar
mai mari. Pentru a nu avea rezultate intermediare care s creasc prea mult trebuie realizat
toate calculele modulo n+1. Exerciiul 31.3-5 cere s se arate c, lucrnd modulo n+1, nu este
afectat corectitudinea algoritmului.
Corpuri
Un inel (S, , ,

0,

1) este un corp dac sunt satisfcute urmtoarele dou proprieti
suplimentare:
6. Operatorul este comutativ, adic a b = b a pentru orice a, b S.
7. Orice element nenul din S are un invers multiplicativ; adic, pentru orice a S

0,
exist un element b S astfel ca a b = b a =

1. Un astfel de element b este adesea
numit inversul lui a i este notat cu a
1
.
Exemple de corpuri sunt numerele reale (R, +, , 0, 1), numerele complexe (C, +, , 0, 1) i numerele
ntregi modulo un numr prim p: (Z
p
, +, , 0, 1).
Deoarece ntr-un corp toate elementele au invers multiplicativ, mprirea este posibil.
Operaia este comutativ. Prin generalizare de la cvasiinele la inele, Strassen a reuit s mbu-
nteasc timpul de execuie al algoritmului de nmulire a dou matrice. ntruct elementele
matricelor sunt adesea dintr-un corp, de exemplu numere reale, s-ar putea spera ca, utiliznd
corpuri n locul inelelor ntr-un algoritm recursiv de felul celui al lui Strassen, timpul de execuie
s e n continuare mbuntit.
Aceast concepie pare puin probabil de a rodnic. Pentru ca un algoritm recursiv divide
i stpnete bazat pe corpuri s funcioneze, matricele trebuie s formeze un corp la ecare pas
al recurenei. Din nefericire, extinderea natural a teoremei 31.7 i a corolarului 31.8 la corpuri
nu este posibil. Pentru n > 1, mulimea matricelor de ordinul n n nu formeaz niciodat un
corp, chiar dac elementele acestora formeaz un corp. nmulirea matricelor de ordinul nn nu
este comutativ, iar multe matrice de ordinul n n nu au inverse. De aceea, este mai probabil
ca algoritmii mai buni pentru nmulirea matricelor s se bazeze pe teoria inelelor i nu pe cea
a corpurilor.
Exerciii
31.3-1 Funcioneaz oare algoritmul lui Strassen peste sistemul de numere (Z[x], +, , 0, 1),
unde Z[x] este mulimea tuturor polinoamelor cu coecieni ntregi de variabil x, iar + i sunt
operaiile obinuite de adunare i nmulire?
31.3-2 Explicai de ce algoritmul lui Strassen nu funcioneaz peste semi-inele nchise (vezi
seciunea 26.4) sau peste semi-inelul boolean (0, 1, , , 0, 1).
31.3-3 Demonstrai teorema 31.7 i corolarul 31.8.
31.3-4 Artai c cvasiinelul (0, 1, , , 0, 1) nu poate inclus ntr-un inel. Adic, artai
c este imposibil s se adauge 1 la cvasiinel, astfel nct structura algebric rezultat s e
un inel.
642 Capitolul 31 Operaii cu matrice
31.3-5 Argumentai c, dac toate calculele din algoritmul teoremei 31.10 se realizeaz modulo
n + 1, algoritmul mai funcioneaz corect.
31.3-6 Artai cum se determin ecient dac un graf neorientat dat conine un triunghi (o
mulime de trei vrfuri mutual adiacente).
31.3-7 Artai c produsul a dou matrice booleene de ordinul nn peste cvasiinelul boolean
se reduce la calculul nchiderii tranzitive a unui graf orientat dat, avnd 3n vrfuri.
31.3-8 Artai cum se calculeaz nchiderea tranzitiv a unui graf orientat dat, avnd n vr-
furi, ntr-un timp de ordinul O(n
lg 7
lg n). Comparai acest rezultat cu performana procedurii
nchidere-Tranzitiv din seciunea 26.2.
31.4. Rezolvarea sistemelor de ecuaii liniare
Rezolvarea unui sistem de ecuaii liniare este o problem fundamental care apare n diverse
aplicaii. Un sistem de ecuaii liniare poate exprimat printr-o ecuaie matriceal n care ecare
element al matricei sau vectorului aparine unui corp, care, de obicei, este corpul R al numerelor
reale. Aceast seciune trateaz modul de rezolvare a unui sistem de ecuaii liniare utiliznd o
metod numit desompunerea LUP.
Vom ncepem cu un sistem de ecuaii liniare cu n necunoscute x
1
, x
2
, , x
n
:
a
11
x
1
+a
12
x
2
+ +a
1n
x
n
= b
1
,
a
21
x
1
+a
22
x
2
+ +a
2n
x
n
= b
2
,
.
.
.
a
n1
x
1
+a
n2
x
2
+ +a
nn
x
n
= b
n
.
(31.17)
Despre un sistem de valori pentru x
1
, x
2
, . . . , x
n
care satisfac, simultan, toate ecuaiile (31.17)
se spune c este o soluie a acestui sistem de ecuaii. n aceast seciune vom trata numai cazul
n care exist exact n ecuaii cu n necunoscute.
Putem s rescriem, n mod convenabil, ecuaiile (31.17) ca o ecuaie matrice-vector

a
11
a
12
a
1n
a
21
a
22
a
2n
.
.
.
.
.
.
.
.
.

a
n1
a
n2
a
nn

x
1
x
2
.
.
.
x
n

b
1
b
2
.
.
.
b
n

sau, sub o form echivalent, notnd cu A = (a


ij
), x = (x
j
), b = (b
i
), vom avea
Ax = b. (31.18)
Dac A este nesingular, atunci matricea are o invers A
1
i
x = A
1
b (31.19)
este vectorul soluie. Putem demonstra c x este unica soluie a ecuaiei (31.18) dup cum
urmeaz. Dac ar exista dou soluii, x i x
t
, atunci Ax = Ax
t
= b i
x = (A
1
A)x = A
1
(Ax) = A
1
(Ax
t
) = (A
1
A)x
t
= x
t
.
31.4. Rezolvarea sistemelor de ecuaii liniare 643
n aceast seciune, ne vom ocupa de cazul n care A este nesingular, ceea ce este echivalent
(conform teoremei 31.1) cu faptul c rangul lui A este egal cu numrul n al necunoscutelor.
Cu toate acestea, exist alte posibiliti care merit o discuie atent. Dac numrul ecuaiilor
este mai mic dect numrul n al necunoscutelor, sau, mai general, dac rangul lui A este mai
mic dect n, atunci sistemul este nedeterminat. Un sistem nedeterminat are, de obicei, o
innitate de soluii (vezi exerciiul 31.4-9), dei el poate s nu aib nici o soluie dac ecuaiile
sunt incompatibile. Dac numrul ecuaiilor depete numrul necunoscutelor, sistemul este
supradeterminat i poate s nu aib nici o soluie. Gsirea unei soluii aproximative, bune
pentru un sistem de ecuaii liniare supradeterminat este o problem important care este tratat
n seciunea 31.6.
S revenim la problema noastr de rezolvare a sistemului Ax = b de n ecuaii cu n necunos-
cute. O posibilitate este de a calcula pe A
1
i, apoi, nmulind ambii membri cu A
1
, obinnd
A
1
Ax = A
1
b sau x = A
1
b. Aceast metod sufer, n practic, de instabilitate numeric:
erorile de rotunjire tind s se acumuleze cnd se utilizeaz numere reprezentate n virgul otant
n locul numerelor reale ideale. Din fericire, exist o alt concepie descompunerea LUP care
are o stabilitate numeric i care are marele avantaj de a mai rapid de, aproximativ, trei ori.
Privire general asupra descompunerii LUP
Ideea aat n spatele descompunerii LUP este de a gsi trei matrice L, U i P de ordinul
n n astfel nct
PA = LU, (31.20)
unde
L este o matrice unitate inferior triunghiular,
U este o matrice superior triunghiular, iar
P este o matrice de permutare.
Spunem c matricele L, U i P care satisfac ecuaia (31.20) formeaz o descompunere LUP a
matricei A. Vom arta c orice matrice nesingular A are o astfel de descompunere.
Avantajul determinrii unei descompuneri LUP pentru o matrice A este acela c sistemele
pot rezolvate mai rapid cnd sunt triunghiulare, cum este cazul ambelor matrice L i U. Avnd
determinat o descompunere LUP pentru A, putem rezolva ecuaia (31.18) Ax = b, rezolvnd
numai sisteme liniare triunghiulare, dup cum urmeaz. nmulind ambele pri ale lui Ax = b
cu P, se obine ecuaia echivalent PAx = Pb, care, avnd n vedere exerciiul 31.1-2, nseamn
s se permute ecuaiile (31.17). nlocuind n (31.20), obinem
LUx = Pb.
Putem, acum, s rezolvm aceast ecuaie rezolvnd dou sisteme liniare triunghiulare. Fie
y = Ux, unde x este vectorul soluie cutat. nti rezolvm sistemul inferior triunghiular
Ly = Pb (31.21)
pentru a determina vectorul necunoscut y printr-o metod numit substituie nainte. Cunos-
cndu-l pe y, rezolvm apoi sistemul superior triunghiular
Ux = y (31.22)
644 Capitolul 31 Operaii cu matrice
cu necunoscuta x printr-o metod numit substituie napoi. Vectorul x este soluia noastr
pentru Ax = b, ntruct matricea de permutare P este inversabil (exerciiul 31.1-2):
Ax = P
1
LUx = P
1
Ly = P
1
Pb = b.
n pasul urmtor vom arta cum funcioneaz substituiile nainte i napoi i apoi vom ataca
problema calculului nsui al descompunerii LUP.
Substituiile nainte i napoi
Substituia nainte poate rezolva sistemul inferior triunghiular (31.21) ntr-un timp de
ordinul (n
2
), dndu-se L, P i b. Este convenabil s reprezentm permutarea P printr-un tablou
[1..n]. Pentru i = 1, 2, . . . , n, elementul [i] indic faptul c P
i,[i]
= 1 i P
ij
= 0 pentru j = [i].
Astfel, n linia i i coloana j a lui PA este elementul a
[i],j
, iar al i-lea element al lui Pb este
b
[i]
. ntruct L este o matrice unitate inferior triunghiular, ecuaia (31.21) poate rescris
astfel
y
1
= b
[1]
,
l
21
y
1
+y
2
= b
[2]
,
l
31
y
1
+l
32
y
2
+y
3
= b
[3]
,
.
.
.
l
n1
y
1
+l
n2
y
2
+l
n3
y
3
+ +y
n
= b
[n]
.
Este ct se poate de evident c l putem gsi direct pe y
1
, din prima ecuaie y
1
= b
[1]
. Avnd
soluia pentru y
1
, o substituim n a doua ecuaie i obinem
y
2
= b
[2]
l
21
y
1
.
Acum, i substituim att pe y
1
ct i pe y
2
n ecuaia a treia i obinem
y
3
= b
[3]
(l
31
y
1
+l
32
y
2
).
n general, substituim pe y
1
, y
2
, , y
i1
n fa n ecuaia a i-a, pentru a-l gsi pe y
i
:
y
i
= b
[i]

i1

j=1
l
ij
y
j
.
Substituia napoi este similar cu substituia nainte. Dndu-se U i y, rezolvm nti a n-a
ecuaie i procedm la fel, revenind la prima ecuaie. Ca i substituia nainte, acest proces se
execut ntr-un timp de ordinul (n
2
). ntruct U este o matrice superior triunghiular, putem
rescrie sistemul (31.22) sub forma
u
11
x
1
+u
12
x
2
+ +u
1,n2
x
n2
+u
1,n1
x
n1
+u
1n
x
n
= y
1
,
u
22
x
2
+ +u
2,n2
x
n2
+u
2,n1
x
n1
+u
2n
x
n
= y
2
,
.
.
.
u
n2,n2
x
n2
+u
n2,n1
x
n1
+u
n2,n
x
n
= y
n2
,
u
n1,n1
x
n1
+u
n1,n
x
n
= y
n1
,
u
n,n
x
n
= y
n
.
31.4. Rezolvarea sistemelor de ecuaii liniare 645
Astfel, putem determina succesiv pe x
n
, x
n1
, . . . , x
1
dup cum urmeaz:
x
n
= y
n
/u
nn
,
x
n1
= (y
n1
u
n1,n
x
n
)/u
n1,n1
,
x
n2
= (y
n2
(u
n2,n1
x
n1
+u
n2,n
x
n
))/u
n2,n2
,
.
.
.
sau, n general,
x
i
=

y
i

j=i+1
u
ij
x
j

/u
ii
.
Dndu-se P, L, U i b, procedura LUP-Soluie l determin pe x combinnd substituiile nainte
i napoi. Presupunem c dimensiunea n apare n atributul linii[L] i c matricea de permutare
P se reprezint prin tabloul ; pseudocodul va :
LUP-Soluie(L, U, , b)
1: n linii[L]
2: pentru i 1, n execut
3: y
i
b
[i]

i1
j=1
l
ij
y
j
4: pentru i n, 1, 1 execut
5: x
i
(y
i

n
j=i+1
u
ij
x
j
)/u
ii
6: returneaz x
Procedura LUP-Soluie l determin pe y utiliznd substituia nainte n liniile 23, apoi l
determin pe x folosind substituia napoi n liniile 45. ntruct exist un ciclu implicit la
nsumri, n ecare ciclu pentru, timpul de execuie este de ordinul (n
2
).
Ca un exemplu al acestei metode, considerm sistemul de ecuaii liniare denit de

1 2 0
3 5 4
5 6 3

x =

0.1
12.5
10.3

,
unde
A =

1 2 0
3 5 4
5 6 3

, b =

0.1
12.5
10.3

,
pe care dorim s-l rezolvm n raport cu necunoscuta x. Descompunerea LUP este
L =

1 0 0
0.6 1 0
0.2 0.571 1

, U =

5 6 3
0 1.4 2.2
0 0 1.856

, P =

0 0 1
0 1 0
1 0 0

.
(Cititorul poate verica faptul c PA = LU.) Folosind substituia nainte, putem rezolva Ly = Pb
n raport cu y:

1 0 0
0.6 1 0
0.2 0.571 1

y
1
y
2
y
3

10.3
12.5
0.1

,
646 Capitolul 31 Operaii cu matrice
obinnd
y =

10.3
6.32
5.569

calculnd nti pe y
1
, apoi, pe y
2
i, n nal, pe y
3
. Folosind substituia napoi, rezolvm Ux = y
n raport cu x:

5 6 3
0 1.4 2.2
0 0 1.856

x
1
x
2
x
3

10.3
6.32
5, 569

,
obinnd n acest fel rspunsul dorit
x =

0.5
0.2
3.0

calculnd nti pe x
3
, apoi, pe x
2
i, n nal, pe x
1
.
Calculul descompunerii LU
Pn acum am artat c, dac o descompunere LUP poate determinat pentru o matrice
nesingular A, atunci substituiile nainte i napoi pot folosite pentru a rezolva sistemul de
ecuaii liniare Ax = b. Rmne s artm cum se poate gsi ecient o descompunere LUP pentru
A. ncepem cu cazul n care matricea A de ordinul nn este nesingular i P este absent (ceea
ce este echivalent cu P = I
n
). n acest caz, trebuie s gsim o factorizare A = LU. Cele dou
matrice L i U formeaz o descompunere LU a lui A.
Procesul prin care realizm descompunerea LU se numete eliminare gaussian. ncepem
prin a scdea multiplicri ale primei ecuaii din celelalte ecuaii, astfel nct s se elimine prima
variabil din acele ecuaii. Apoi, scdem multiplicri ale ecuaiei a doua din cea de a treia i din
celelalte ecuaii care urmeaz, astfel nct acum prima i cea de a doua variabil s e eliminate
din ele. Continum acest proces pn cnd sistemul obinut are o form superior triunghiular
de fapt s-a obinut matricea U. Matricea L este alctuit din multiplicatorii de linii care au
cauzat eliminarea variabilelor.
Algoritmul de implementare a acestei strategii este recursiv. Dorim s construim o descom-
punere LU pentru o matrice A de ordinul n n nesingular. Dac n = 1, atunci problema este
rezolvat deoarece putem alege L = I
1
i U = A. Pentru n > 1, l descompunem pe A n patru
pri:
A =

a
11
a
12
a
1n
a
21
a
22
a
2n
.
.
.
.
.
.
.
.
.
.
.
.
a
n1
a
n2
a
nn

a
11
w
T
v A
t

,
unde v este un vector coloan de dimensiune n1, w
T
este un vector linie de dimensiune n1,
iar A
t
este o matrice de ordinul (n 1) (n 1). Apoi, utiliznd algebra matriceal (se veric
31.4. Rezolvarea sistemelor de ecuaii liniare 647
ecuaiile prin simpla lor nmulire), l putem factoriza pe A, astfel:
A =

a
11
w
T
v A
t

1 0
v/a
11
I
n1

a
11
w
T
0 A
t
vw
T
/a
11

.
Zerourile din prima i a doua matrice a factorizrii sunt, respectiv, vector linie i coloan de
dimensiune n 1. Termenul vw
T
/a
11
, format, considernd produsul exterior a lui v i w i
mprind ecare element al rezultatului cu a
11
, este o matrice de ordinul (n 1) (n 1) care
este n conformitate cu dimensiunea matricei A
t
din care este sczut. Matricea rezultat:
A
t
vw
T
/a
11
(31.23)
de ordinul (n 1) (n 1) se numete complementul Schur al lui A n raport cu a
11
.
Vom determina acum recursiv o descompunere LU a complementului Schur. Fie
A
t
vw
T
/a
11
= L
t
U
t
,
unde L
t
este matricea unitate inferior triunghiular i U
t
este matrice superior triunghiular.
Atunci, utiliznd algebra matricelor, avem
A =

1 0
v/a
11
I
n1

a
11
w
T
0 A
t
vw
T
/a
11

1 0
v/a
11
I
n1

a
11
w
T
0 L
t
U
t

1 0
v/a
11
L
t

a
11
w
T
0 U
t

= LU,
ceea ce demonstreaz existena descompunerii LU. (S observm c, deoarece L
t
este matrice
unitate inferior triunghiular, i L este o matrice inferior triunghiular, i c, deoarece U
t
este
matrice superior triunghiular, la fel este i U.)
Desigur, dac a
11
= 0, aceast metod nu funcioneaz, din cauza mpririi cu zero. De
asemenea, ea nu funcioneaz dac elementul superior cel mai din stnga al complementului
Shur A
t
vw
T
/a
11
este zero, deoarece mprim cu el n pasul urmtor al recurenei. Elementele
cu care mprim n timpul descompunerii LU se numesc elemente pivot i ocup diagonala
matricei U. Raiunea de a include matricea de permutare P, n timpul descompunerii LUP, este
aceea c ea ne permite s eliminm mprirea cu zero. Utilizarea permutrilor, pentru a evita
mprirea cu zero (sau cu valori mici), se numete pivotare.
O clas important de matrice pentru care descompunerea LU funcioneaz ntotdeauna
corect este clasa matricelor simetrice pozitiv-denite. Astfel de matrice nu necesit pivotare i,
n felul acesta, strategia recursiv schiat mai sus poate utilizat fr frica mpririi cu 0.
Vom demonstra acest rezultat, mpreun cu altele, n seciunea 31.6.
Codul pentru descompunerea LU a unei matrice A urmeaz strategia recursiv, exceptnd
cazul cnd un ciclu iterativ nlocuiete recurena. (Aceast transformare este o optimizare stan-
dard pentru o procedur recursiv-la-sfrit una a crei ultim operaie este un apel recursiv
la ea nsi.) Se presupune c dimensiunea lui A este pstrat n atributul linii[A]. ntruct tim
c matricea de ieire U are zerouri sub diagonal i c LU-Soluie nu utilizeaz aceste intrri,
codul nu se ocup de completarea lor. La fel, deoarece matricea de ieire L are 1 pe diagonal i 0
deasupra ei, aceste elemente nu sunt completate. Astfel, codul surs calculeaz numai elementele
semnicative ale lui L i U.
648 Capitolul 31 Operaii cu matrice
Figura 31.1 Operaia LU-Descompunere. (a) Matricea A. (b) Elementul a
11
= 2 haurat cu negru
este pivotul, coloana haurat cu gri este v/a
11
, iar linia haurat cu gri este w
T
. Elementele lui U
calculate astfel sunt situate deasupra liniei orizontale, iar elementele lui L sunt n stnga liniei verticale.
Matricea complementul Schur A

vw
T
/a
11
se a n dreapta jos. (c) Acum operm asupra matricei
complement Schur produs n partea (b). Elementul a
22
= 4 haurat cu negru este pivotul, iar coloana i
linia haurate cu gri sunt respectiv v/a
22
i w
T
(n partiionarea complementului Schur). Liniile mpart
matricea n elementele lui U calculate pn acum (deasupra), elementele lui L calculate pn acum (n
stnga) i complementul Schur nou (dreapta jos). (d) Pasul urmtor completeaz factorizarea (Elementul
3 din complementul Schur nou devine parte a lui U cnd se termin recurena.) (e) Factorizarea A = LU.
LU-Descompunere(A)
1: n linii[A]
2: pentru k 1, n execut
3: u
kk
a
kk
4: pentru i k + 1, n execut
5: l
ik
a
ik
/u
kk
l
ik
pstreaz v
i
6: u
ki
a
ki
u
ki
pstreaz w
T
i
7: pentru i k + 1, n execut
8: pentru j k + 1, n execut
9: a
ij
a
ij
l
ik
u
kj
10: returneaz L i U
Ciclul exterior pentru, care ncepe n linia a doua, itereaz o dat pentru ecare pas recursiv.
n acest ciclu, pivotul se determin n linia 3 i este u
kk
= a
kk
. n ciclul pentru din liniile 46
(care nu se execut cnd k = n), vectorii v i w
T
se utilizeaz pentru a-i actualiza pe L i U.
Elementele vectorului v se determin n linia 5, unde v
i
este memorat n l
ik
, iar elementele
vectorului w
T
se determin n linia 6, unde w
T
i
se memoreaz n u
ki
. n nal, elementele
complementului Schur se calculeaz n liniile 79 i se pstreaz tot n matricea A. Deoarece
linia 9 este triplu imbricat, LU-Descompunere se execut ntr-un timp de ordinul (n
3
).
31.4. Rezolvarea sistemelor de ecuaii liniare 649
Figura 31.1 ilustreaz operaia LU-Descompunere. Ea arat o optimizare standard a pro-
cedurii n care elementele semnicative ale lui L i U se pstreaz n poziii din matricea A.
Adic, putem stabili o coresponden ntre ecare element a
ij
i l
ij
(dac i > j) sau u
ij
(dac
i j) i s actualizm matricea A, astfel nct ea s pstreze att pe L ct i pe U, cnd se
termin procedura. Pseudocodul pentru aceast optimizare se obine simplu din pseudocodul
de mai sus, nlocuind ecare referin la l sau u prin a; nu este dicil s se verice c aceast
transformare este corect.
Calculul unei descompuneri LUP
n general, pentru rezolvarea unui sistem de ecuaii liniare Ax = b, trebuie s pivotm ele-
mente din afara diagonalei lui A pentru a elimina mprirea cu 0. Nu doar mprirea cu 0 este
indezirabil, ci i mprirea cu valori mici, chiar dac A este nesingular, deoarece instabilitile
numerice pot rezulta din calcule. De aceea, ncercm s pivotm o valoare mare.
Matematica aat n spatele descompunerii LUP este similar celei din esena descompunerii
LU. Amintim c se d o matrice nesingular A de ordinul n n i dorim s gsim o matrice
de permutare P, o matrice unitate inferior triunghiular L i o matrice superior triunghiular
U, astfel nct PA = LU. nainte de a partiiona matricea A, aa cum am fcut pentru
descompunerea LU, vom muta un element nenul, de exemplu a
k1
, din prima coloan n poziia
(1,1) a matricei. (Dac prima coloan conine numai zerouri, atunci A este singular, deoarece
determinantul ei este 0, prin teoremele 31.4 i 31.5.) n vederea conservrii sistemului de ecuaii,
schimbm linia 1 cu linia k, ceea ce este echivalent cu nmulirea la stnga a lui A cu o matrice
de permutare Q (exerciiul 31.1-2). Astfel, pe QA l putem scrie:
QA =

a
k1
w
T
v A
t

,
unde v = (a
21
, a
31
, . . . , a
n1
)
T
, exceptnd pe a
11
care l nlocuiete pe a
k1
; w
T
= (a
k2
, a
k3
, . . .,
a
kn
); iar A
t
este o matrice de ordinul (n 1) (n 1). Deoarece a
k1
= 0, putem realiza, n
mare parte, aceeai algebr liniar ca i pentru descompunerea LU, dar avnd garania c nu
vom mpri prin 0:
QA =

a
k1
w
T
v A
t

1 0
v/a
k1
I
n1

a
k1
w
T
0 A
t
vw
T
/a
k1

.
Complementul Schur A
t
vw
T
/a
k1
este nesingular, deoarece, dac matricea a doua din ultima
ecuaie ar avea determinantul 0, atunci i determinantul matricei A ar 0; dar aceasta
nseamn c A este singular. n consecin, putem gsi inductiv o descompunere LUP
pentru complementul Schur, cu o matrice unitate inferior triunghiular L
t
, o matrice superior
triunghiular U
t
i o matrice permutare P
t
, astfel nct
P
t
(A
t
vw
T
/a
k1
) = L
t
U
t
.
Denim pe
P =

1 0
0 P
t

Q,
650 Capitolul 31 Operaii cu matrice
care este o matrice de permutare pentru c este produsul a dou matrice de permutare (exerciiul
31.1-2). Avem
PA =

1 0
0 P
t

QA
=

1 0
0 P
t

1 0
v/a
k1
I
n1

a
k1
w
T
0 A
t
vw
T
/a
k1

1 0
P
t
v/a
k1
P
t

a
k1
w
T
0 A
t
vw
T
/a
k1

1 0
P
t
v/a
k1
I
n1

a
k1
w
T
0 P
t
(A
t
vw
T
/a
k1

1 0
P
t
v/a
k1
I
n1

a
k1
w
T
0 L
t
U
t

1 0
P
t
v/a
k1
L
t

a
k1
w
T
0 U
t

= LU,
adic descompunrea LUP. Deoarece L
t
i L sunt matrice inferior triunghiulare i din cauz c
U
t
este superior triunghiular, la fel este i U.
S observm c, n aceast derivare, spre deosebire de cea pentru descompunerea LU, att
vectorul coloan v/a
k1
ct i complementul Schur A
t
vw
T
/a
k1
trebuie s e nmulii cu
matricea de permutare P
t
.
LUP-Descompunere(A)
1: n linii[A]
2: pentru i 1, n execut
3: [i] i
4: pentru k 1, n execut
5: p 0
6: pentru i k, n execut
7: dac [a
ik
[ > p atunci
8: p [a
ik
[
9: k
t
i
10: dac p = 0 atunci
11: eroare matrice singular
12: interschimb [k] [k
t
]
13: pentru i 1, n execut
14: interschimb a
ki
a
k

i
15: pentru i k + 1, n execut
16: a
ik
a
ik
/a
kk
17: pentru j k + 1, n execut
18: a
ij
a
ij
a
ik
a
kj
Ca i n cazul algoritmului LU-Descompunere, pseudocodul pentru descompunerea LUP
nlocuiete recurena cu un ciclu iterativ. Ca o mbuntire fa de implementarea direct
recursiv, pstrm dinamic matricea de permutare P printr-un tablou , unde [i] = j nseamn
c linia a i-a a lui P conine 1 n coloana j. De asemenea, implementm codul pentru calculul
31.4. Rezolvarea sistemelor de ecuaii liniare 651
lui L i U n spaiul matricei A. n felul acesta, cnd procedura se termin,
a
ij
=

l
ij
dac i > j,
u
ij
dac i j.
Figura 31.2 ilustreaz modul n care LUP-Descompunere factorizeaz o matrice. Vectorul
se iniializeaz n liniile 23 pentru a reprezenta permutarea identic. Ciclul pentru exterior
care ncepe n linia 4 implementeaz recurena. La ecare iteraie a ciclului exterior, liniile 59
determin elementul a
k

k
avnd cea mai mare valoare absolut dintre elementele aate n prima
coloan curent (coloana k) din matricea de ordin (nk +1) (nk +1) a crei descompunere
LU trebuie gsit.
Dac toate elementele din prima coloan curent sunt zero, liniile 1011 stabilesc c matricea
este singular. Pentru pivotare, n linia 12 se interschimb [k
t
] cu [k], i n liniile 1314
se interschimb al k-lea i al k
t
-lea rnd al lui A, n felul acesta a
kk
devine elementul pivot.
(Rndurile ntregi se permut deoarece, n derivarea de mai sus, nu doar A
t
vw
T
/a
k1
se
nmulete cu P
t
, ci i v/a
k1
.) n nal, complementul Schur este calculat prin liniile 1518 n mare
parte n acelai mod n care a fost calculat prin liniile 49 ale algoritmului LUP-Descompunere,
exceptnd faptul c aici operaia este scris pentru a funciona n spaiul matricei A.
Din cauza structurii ciclului triplu imbricat, timpul de execuie al algoritmului LUP-
Descompunere este (n
3
), acelai ca i pentru LU-Descompunere. Astfel, pivotarea ne cost,
n timp, cel mult un factor constant.
Exerciii
31.4-1 Rezolvai ecuaia

1 0 0
4 1 0
6 5 1

x
1
x
2
x
3

3
14
7

folosind substituia nainte.


31.4-2 Gsii o descompunere LU a matricei

4 5 6
8 6 7
12 7 12

.
31.4-3 De ce ciclul pentru din linia 4 a algoritmului LUP-Descompunere se execut nu-
mai pn la n 1, n timp ce ciclul pentru, corespunztor, din linia 2 a algoritmului LU-
Descompunere se execut n acelai mod pn la n?
31.4-4 Rezolvai ecuaia

1 5 4
2 0 3
5 8 2

x
1
x
2
x
3

12
9
5

folosind o descompunere LUP.


652 Capitolul 31 Operaii cu matrice

0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0

2 0 2 .6
3 3 4 2
5 5 4 2
1 2 3.4 1

1 0 0 0
.4 1 0 0
.2 .5 1 0
.6 0 .4 1

5 5 4 2
0 2 .4 .2
0 0 4 .5
0 0 0 3

P A L U
(j)
Figura 31.2 Operaia de LUP-Descompunere. (a) Matricea de intrare A cu permutarea identic a
liniilor n stnga. Primul pas al algoritmului determin faptul c elementul 5, din linia a treia, haurat cu
negru, este pivotul pentru prima coloan. (b) Rndurile 1 i 3 se permut i permutarea este actualizat.
Coloana i linia haurate cu gri reprezint pe v i w
T
. (c) Vectorul v este nlocuit cu v/5 i partea din
dreapta mai jos a matricei este actualizat cu complementul Schur. Liniile mpart matricea n trei
regiuni: elementele lui U (deasupra), elementele lui L (n stnga) i elementele complementului lui Schur
(n dreapta jos). (d)-(f ) Pasul al doilea. (g)-(i) Pasul al treilea. Nu mai intervin modicri n pasul
patru. (j) Descompunerea LUP PA = LU.
31.4-5 Descriei descompunerea LUP a unei matrice diagonale.
31.4-6 Descriei descompunerea LUP a unei matrice de permutare A i demonstrai c ea este
unic.
31.5. Inversarea matricelor 653
31.4-7 Artai c, pentru orice n 1, exist matrice singulare de ordinul n n care au des-
compuneri LU.
31.4-8 Artai cum se poate rezolva ecient un sistem de ecuaii de forma Ax = b peste un
cvasiinel boolean (0, 1, , , 0, 1).
31.4-9 S presupunem c A este o matrice real de ordinul m n de rang m, unde m < n.
Artai cum se poate determina un vector n-dimensional x
0
i o matrice de ordinul m(nm)
i de rang n m, astfel nct orice vector de forma x
0
+By, pentru y R
nm
, este o soluie a
ecuaiei nedeterminate Ax = b.
31.5. Inversarea matricelor
Dei n practic, n general, nu vom folosi inversele matricelor pentru a rezolva sisteme de
ecuaii liniare, prefernd folosirea de tehnici numerice mai stabile de felul descompunerii LUP,
uneori ind necesar s se calculeze inversa unei matrice. n aceast seciune, vom arta cum
poate folosit descompunerea LUP pentru a calcula inversa unei matrice. De asemenea, vom
discuta problema teoretic interesant, dac se poate sau nu, accelera calculul inversei unei
matrice, utiliznd tehnici de felul algoritmului lui Strassen pentru nmulirea matricelor. ntr-
adevr, articolul originar al lui Strassen avea ca motivaie de a arta c un sistem de ecuaii
liniare ar putea rezolvat mai rapid dect prin metoda obinuit.
Calculul inversei unei matrice dintr-o descompunere LUP
S presupunem c avem o descompunere LUP a unei matrice A sub forma a trei matrice L, U
i P, astfel nct PA = LU. Folosind algoritmul LU-Soluie, putem rezolva o ecuaie de forma
Ax = b ntr-un timp de ordinul (n
2
). n general, o dat ce avem descompunerea LUP a lui A,
putem rezolva, ntr-un timp de ordinul (kn
2
) k versiuni de ecuaii Ax = b care difer numai
prin b.
Ecuaia
AX = I
n
(31.24)
poate privit ca un set de n ecuaii distincte de forma Ax = b. Aceste ecuaii denesc matricea
X ca invers a lui A. Pentru a mai exaci, notm cu X
i
a i-a coloan a lui X i amintim
c vectorul unitate e
i
este a i-a coloan a lui I
n
. Ecuaia (31.24) poate , apoi, rezolvat n X
folosind descompunerea LUP a lui A pentru a rezolva, separat ecare ecuaie
AX
i
= e
i
separat, pentru X
i
. Fiecare dintre cei n de X
i
poate gsit ntr-un timp de ordinul (n
2
) i
astfel calculul lui X prin descompunerea LUP a lui A ia un timp de ordinul lui (n
3
). ntruct
descompunerea LUP a lui A poate determinat ntr-un timp de ordinul lui (n
3
), inversa A
1
a matricei A poate determinat ntr-un timp de ordinul lui (n
3
).
654 Capitolul 31 Operaii cu matrice
nmulirea i inversarea matricelor
Artm acum c accelerarea teoretic obinut pentru nmulirea matricelor se traduce
printr-o accelerare pentru inversarea matricelor. De fapt, demonstrm ceva mai mult: inversarea
matricelor este echivalent cu nmulirea, n urmtorul sens. Dac notm cu M(n) timpul de
nmulire a dou matrice de ordinul nn i cu I(n) timpul de inversare a unei matrice nesingulare
de acelai ordin, atunci I(n) = (M(n)). Demonstrm acest rezultat n dou etape. nti, artm
c M(n) = O(I(n)), ceea ce este relativ simplu, iar apoi demonstrm c I(n) = O(M(n)).
Teorema 31.11 (nmulirea nu este mai grea dect inversarea) Dac putem inversa o
matrice de ordinul n n n timpul I(n), unde I(n) = (n
2
) satisface condiia de regularitate
I(3n) = O(I(n)), atunci putem nmuli dou matrice de ordinul n n ntr-un timp de ordinul
O(I(n)).
Demonstraie. Fie A i B dou matrice de ordinul nn. Vrem s calculm matricea lor produs
C. Denim matricea D de ordinul 3n 3n astfel
D =

I
n
A 0
0 I
n
B
0 0 I
n

.
Inversa lui D este
D
1
=

I
n
A AB
0 I
n
B
0 0 I
n

,
i, astfel, putem calcula produsul AB lund submatricea de ordinul n n din dreapta sus a
matricei D
1
.
Putem determina matricea D ntr-un timp de ordinul (n
2
) = O(I(n)) i o putem inversa
ntr-un timp de ordinul O(I(3n)) = O(I(n)), prin condiia de regularitate pentru I(n). Astfel
avem
M(n) = O(I(n)).
S observm c I(n) satisface condiia de regularitate doar dac I(n) nu are salturi mari n
valoare. De exemplu, dac I(n) = (n
c
lg
d
n), pentru orice constante c > 0, d 0, atunci I(n)
satisface condiia de regularitate.
Reducerea inversrii matricelor la nmulirea lor
Demonstraia c inversarea matricelor nu este mai grea dect nmulirea lor, se bazeaz pe
cteva proprieti ale matricelor simetrice pozitiv-denite care vor studiate n seciunea 31.6.
Teorema 31.12 (Inversarea nu este mai grea dect nmulirea) Presupunnd c putem
nmuli dou matrice reale de ordinul n n n timpul M(n), unde M(n) = (n
2
) i M(n)
satisface cele dou condiii de regularitate M(n + k) = O(M(n)) pentru orice k, 0 k n, i
M(n/2) cM(n), pentru orice constant c < 1/2, atunci putem calcula inversa oricrei matrice
reale nesingulare de ordinul n n n timpul O(M(n)).
31.5. Inversarea matricelor 655
Demonstraie. Putem presupune c n este multiplu de 2, deoarece

A 0
0 I
k

1
=

A
1
0
0 I
k

,
pentru orice k > 0. Aadar, alegnd pe k astfel nct n + k s e o putere a lui 2, lrgim
matricea la o dimensiune care este puterea urmtoare a lui 2 i obinem rspunsul dorit, A
1
,
din rspunsul la problema lrgit. Condiia de regularitate asupra lui M(n) asigur ca aceast
lrgire s nu cauzeze creterea timpului de execuie mai mult dect cu un factor constant.
Pentru moment, s presupunem c matricea A de ordinul n n este simetric i pozitiv-
denit. O partiionm n patru submatrice de ordinul n/2 n/2:
A =

B C
T
C D

(31.25)
Apoi, dac
S = D CB
1
C
T
(31.26)
este complementul Schur al lui A n raport cu B, atunci
A
1
=

B
1
+B
1
C
T
S
1
CB
1
B
1
C
T
S
1
S
1
CB
1
S
1

(31.27)
deoarece AA
1
= I
n
, ceea ce se poate verica nmulind matricele. Matricele B
1
i S
1
exis-
t dac A este simetric i pozitiv-denit, conform lemelor 31.13 i 31.15 din seciunea 31.6,
deoarece att B ct i S sunt simetrice i pozitiv-denite. Conform exerciiului 31.1-3 avem c
B
1
C
T
= (CB
1
)
T
i B
1
C
T
S
1
= (S
1
CB
1
)
T
. De aceea, ecuaiile (31.26) i (31.27) pot
folosite pentru a specica un algoritm recursiv care implic 4 nmuliri de matrice de ordinul
n/2 n/2:
C B
1
,
(C B
1
) C
T
,
S
1
(CB
1
),
(CB
1
)
T
(S
1
CB
1
).
ntruct matricele de ordinul n/2 n/2 se nmulesc folosind un algoritm pentru matrice de
ordinul n n, inversarea matricelor simetrice pozitiv-denite se poate rezolva n timpul
I(n) 2I(n/2) + 4M(n) +O(n
2
) = 2I(n/2) +O(M(n)) = O(M(n)).
Rmne de demonstrat c timpul asimptotic de execuie a nmulirii matricelor poate
obinut pentru inversarea matricelor, dac A este inversabil, dar nu este simetric i pozitiv-
denit. Ideea de baz este aceea c, pentru orice matrice A nesingular, matricea A
T
A este
simetric (vezi exerciiul 31.1-3) i pozitiv-denit (vezi teorema 31.6). Astfel, problema inversrii
lui A se reduce la problema inversrii lui A
T
A.
Reducerea se bazeaz pe observaia c, atunci cnd A este o matrice nesingular de ordinul
n n, avem
A
1
= (A
T
A)
1
A
T
,
656 Capitolul 31 Operaii cu matrice
deoarece ((A
T
A)
1
A
T
)A = (A
T
A)
1
(A
T
A) = I
n
, i inversa unei matrice este unic. Prin
urmare, putem calcula A
1
, nmulind nti pe A
T
cu A pentru a-l obine pe A
T
A, inversnd
apoi matricea simetric i pozitiv-denit A
T
A prin algoritmul divide i stpnete prezentat,
i, n nal, nmulind rezultatul cu A
T
. Fiecare dintre aceti pai necesit un timp de ordinul
O(M(n)). Astfel orice matrice nesingular cu elemente reale poate inversat ntr-un timp de
ordinul O(M(n)).
Demonstraia teoremei 31.12 sugereaz un mod de a rezolva ecuaii Ax = b fr pivotare,
att timp ct A este nesingular. nmulind ambii membri ai ecuaiei cu A
T
, obinem (A
T
A)x =
A
T
b. Aceast transformare nu afecteaz soluia x deoarece A
T
este inversabil, aa c putem
factoriza matricea A
T
A simetric i pozitiv-denit cu ajutorul descompunerii LU. Apoi, folosim
substituiile nainte i napoi pentru a o rezolva, n raport cu x, partea dreapt ind A
T
b. Dei
aceast metod este teoretic corect, n practic, procedura LUP-Descompunere funcioneaz
mult mai bine. Descompunerea LUP necesit mai puine operaii aritmetice printr-un factor
constant i are proprieti numerice puin mai bune.
Exerciii
31.5-1 Fie M(n) timpul de nmulire a matricelor de ordinul n n, iar S(n) timpul necesar
pentru a ridica la ptrat o matrice de ordinul n n. Artai c nmulirea i ridicarea la ptrat
a matricelor au n esen aceeai dicultate: S(n) = (M(n)).
31.5-2 Fie M(n) timpul de nmulire a matricelor de ordinul n n i L(n) timpul de calcul
al descompunerii LUP pentru o matrice de ordinul n n. Artai c nmulirea matricelor i
calculul descompunerii LUP pentru o matrice au, n esen, aceeai dicultate: L(n) = (M(n)).
31.5-3 Fie M(n) timpul de nmulire a matricelor de ordinul n n, iar D(n) timpul necesar
pentru a calcula determinantul unei matrice de ordinul nn. Artai c aarea determinantului
nu este mai grea dect nmulirea matricelor: D(n) = O(M(n)).
31.5-4 Fie M(n) timpul de nmulire a matricelor booleene de ordinul nn, i T(n) timpul de
determinare a nchiderii tranzitive a matricelor booleene de ordinul n n. Artai c M(n) =
O(T(n)) i T(n) = O(M(n) lg n).
31.5-5 Stabilii dac funcioneaz algoritmul de inversare a matricelor, bazat pe teorema 31.12,
cnd elementele matricelor aparin corpului de ntregi modulo 2? Explicai.
31.5-6 Generalizai algoritmul de inversare a matricelor din teorema 31.12 pentru a trata
matrice de numere complexe i demonstrai c generalizarea respectiv funcioneaz corect.
( n locul transpusei lui A, se utilizeaz transpusa conjugat A

, care se obine din


transpusa lui A prin nlocuirea ecrui element cu complex-conjugatul lui. n locul matricelor
simetrice se consider matrice hermitiene, care sunt matrice A astfel nct A = A

.)
31.6. Matrice simetrice pozitiv-denite i aproximarea prin
metoda celor mai mici ptrate 657
31.6. Matrice simetrice pozitiv-denite i aproximarea prin
metoda celor mai mici ptrate
Matricele simetrice pozitiv-denite au multe proprieti interesante i avantajoase. De
exemplu, sunt nesingulare, iar descompunerea LU poate fcut fr s ne intereseze mprirea
cu zero. n aceast seciune, vom demonstra diferite alte proprieti importante ale lor i vom
prezenta o aplicaie important de ajustare a curbelor i anume aproximarea prin metoda celor
mai mici ptrate.
Prima proprietate, pe care o demonstrm, este poate cea mai important.
Lema 31.13 Orice matrice simetric pozitiv-denit este nesingular.
Demonstraie. Presupunem c A este o matrice singular. Atunci, pe baza corolarului 31.3,
rezult c exist un vector nenul x, astfel nct Ax = 0. nseamn c x
T
Ax = 0, deci, A nu
poate pozitiv-denit.
Demonstraia faptului c putem realiza o descompunere LU a unei matrice A simetrice
pozitiv-denite fr a mpri la 0, este mai complicat. ncepem prin a demonstra proprieti
pentru anumite submatrice ale lui A. Denim matricea A
k
, submatrice directoare a lui A, ca
ind format din A din interseciile dintre primele k linii i primele k coloane ale lui A.
Lema 31.14 Dac A este o matrice simetric pozitiv-denit, atunci ecare submatrice direc-
toare a lui A este simetric i pozitiv-denit.
Demonstraie. Faptul c ecare submatrice directoare A
k
este simetric, este evident. Pentru
a demonstra c A
k
este pozitiv-denit, e x un vector coloan nenul de dimensiune k i e A
partiionat dup cum urmeaz:
A =

A
k
B
T
B C

.
Atunci, avem
x
T
A
k
x = (x
T
0)

A
k
B
T
B C

x
0

= (x
T
0)A

x
0

> 0
deoarece A este pozitiv-denit, rezult c i A
k
este pozitiv-denit.
Ne ntoarcem la cteva proprieti eseniale ale complementului Schur. Fie A o matrice sime-
tric pozitiv-denit i A
k
submatricea directoare de ordinul k k a lui A. A este partiionat
astfel
A =

A
k
B
T
B C

. (31.28)
Complementul Schur al lui A, n raport cu A
k
, se denete prin
S = C BA
1
k
B
T
. (31.29)
(Conform lemei 31.14, A
k
este simetric i pozitiv-denit, astfel, pe baza lemei 31.13 exist
A
1
k
, rezult c S este bine denit.) S observm c deniia (31.23) a complementului Schur
este compatibil cu deniia (31.29) pentru k = 1.
658 Capitolul 31 Operaii cu matrice
Lema urmtoare arat c matricele complement Schur ale matricelor simetrice pozitiv-denite
sunt simetrice i pozitiv-denite. Acest rezultat a fost utilizat n teorema 31.12, iar corolarul ei
a fost necesar pentru a demonstra corectitudinea descompunerii LU pentru matrice simetrice
pozitiv-denite.
Lema 31.15 (Lema complementului Schur) Dac A este o matrice simetric pozitiv-de-
nit i A
k
este o submatrice principal de ordinul k k a lui A, atunci complementul Schur al
lui A, n raport cu A
k
, este simetric i pozitiv-denit.
Demonstraie. Complementul S este simetric pe baza exerciiului 31.1-7. Rmne s artm
c S este pozitiv-denit. Considerm partiionarea lui A dat n ecuaia (31.28).
Pentru orice vector x nenul, avem x
T
Ax > 0 prin ipotez. Fie x mprit n doi subvectori y
i z, compatibili cu A
k
i respectiv cu C. ntruct A
1
k
exist, avem
x
T
Ax = (y
T
z
T
)

A
k
B
T
B c

y
z

= y
T
A
k
y +y
T
B
T
z +z
T
By +x
T
Cz
= (y +A
1
k
B
T
z)
T
A
k
(y +A
1
k
B
T
z) +z
T
(C BA
1
k
B
T
)z,
(31.30)
(se va verica prin nmulire). Aceast ultim relaie se echivaleaz cu completarea ptratelor
formei ptratice (vezi exerciiul 31.6-2.)
ntruct avem x
T
Ax > 0 pentru orice x nenul, xm un z nenul i apoi l alegem pe y astfel
nct y = A
1
k
B
T
z, care anuleaz primul termen din relaia (31.30), obinndu-se
z
T
(C BA
1
k
B
T
)z = z
T
Sz
ca valoare a expresiei. Pentru orice z = 0, avem z
T
Sz = x
T
Ax > 0, adic S este pozitiv-denit.
Corolarul 31.16 Descompunerea LU a unei matrice simetrice pozitiv-denite nu implic
niciodat mprirea cu zero.
Demonstraie. Fie A o matrice simetric pozitiv-denit. Vom demonstra o armaie mai tare
dect enunul corolarului: orice pivot este strict pozitiv. Primul pivot este a
11
. Fie e
1
primul
vector unitate prin care se obine a
11
= e
T
1
Ae
1
> 0. ntruct primul pas al descompunerii LU
produce complementul Schur al lui A n raport cu A
1
= (a
11
), lema 31.15 implic faptul c toi
pivoii sunt pozitivi prin inducie.
Aproximarea prin metoda celor mai mici ptrate
Ajustarea curbelor printr-o mulime dat de puncte este o aplicaie important a matricelor
simetrice pozitiv-denite. Presupunem c se d o mulime de m puncte
(x
1
, y
1
), (x
2
, y
2
), . . . , (x
m
, y
m
),
unde y
i
sunt cu erori de msurare. Am dori s determinm o funcie F(x), astfel nct
y
i
= F(x
i
) +
i
(31.31)
31.6. Matrice simetrice pozitiv-denite i aproximarea prin
metoda celor mai mici ptrate 659
pentru i = 1, 2, . . . , m, unde erorile de aproximare
i
sunt mici. Forma funciei F depinde de
problem. Aici, presupunem c are forma unei sume liniare ponderate,
F(x) =
n

j=1
c
j
f
j
(x),
unde numrul n al termenilor i funciile de baz f
j
specice se aleg inndu-se seama de
problem. O alegere frecvent este f
j
(x) = x
j1
, ceea ce nseamn c
F(x) = c
1
+c
2
x +c
3
x
2
+ +c
n
x
n1
,
este un polinom n x, de gradul n 1.
Alegnd n = m, putem calcula ecare y
i
din ecuaia (31.31).
O astfel de funcie F de grad nalt aproximeaz perturbaiile la fel de bine ca i datele, dar,
cu toate acestea, n general, d rezultate slabe cnd se folosete la determinarea lui y, pentru
valori ale lui x, care nu sunt prevzute n prealabil. De obicei, este mai bine s se aleag n
semnicativ mai mic dect m i s se spere c, alegnd bine coecienii c
j
, se va gsi o funcie
F care s aproximeze bine punctele. Anumite principii teoretice exist pentru a-l alege pe n, dar
ele sunt n afara scopului acestui text. n orice caz, o dat ales n, ajungem n nal la un sistem
de ecuaii supradenit, pe care dorim s-l rezolvm ct mai bine cu putin. Artm cum se
poate face acest lucru.
Fie
A =

f
1
(x
1
) f
2
(x
1
) f
n
(x
1
)
f
1
(x
2
) f
2
(x
2
) f
n
(x
2
)
.
.
.
.
.
.
.
.
.
.
.
.
f
1
(x
m
) f
2
(x
m
) f
n
(x
m
)

matricea valorilor funciilor de baz n punctele date; adic a


ij
= f
j
(x
i
). Fie c = (c
k
) vectorul
n-dimensional al coecienilor pe care vrem s-l determinm. Atunci,
Ac =

f
1
(x
1
) f
2
(x
1
) f
n
(x
1
)
f
1
(x
2
) f
2
(x
2
) f
n
(x
2
)
.
.
.
.
.
.
.
.
.
.
.
.
f
1
(x
m
) f
2
(x
m
) f
n
(x
m
)

c
1
c
2
.
.
.
c
n

F(x
1
)
F(x
2
)
.
.
.
F(x
m
)

este vectorul m-dimensional de valori previzibile pentru y. Astfel,


= Ac y
este vectorul m-dimensional de erori de aproximare.
Pentru a minimiza erorile de aproximare, trebuie s minimizm norma vectorului eroare ,
ceea ce are ca soluie cele mai mici ptrate, deoarece
|| =

i=1

2
i

1/2
.
660 Capitolul 31 Operaii cu matrice
ntruct
||
2
= |Ac y|
2
=
m

i=1

j=1
a
ij
c
j
y
i

2
,
putem minimiza || prin diferenierea lui ||
2
n raport cu ecare c
k
i egalnd rezultatul cu
zero:
d||
2
dc
k
=
m

i=1
2

j=1
a
ij
c
j
y
i

a
ik
= 0. (31.32)
Cele n ecuaii (31.32) pentru k = 1, 2, . . . , n sunt echivalente cu o singur ecuaie matriceal
(Ac y)
T
A = 0
care este echivalent cu
A
T
(Ac y) = 0,
(folosind exerciiul 31.1-3), care implic
A
T
Ac = A
T
y. (31.33)
n statistic, aceasta se numete ecuaie normal. Matricea A
T
A este simetric pe baza
exerciiului 31.1-3, iar dac A are un rang coloan complet, atunci A
T
A este pozitiv-denit.
Deci, (A
T
A)
1
exist, iar soluia ecuaiei (31.33) este
c = ((A
T
A)
1
A
T
)y = A
+
y, (31.34)
unde matricea A
+
= ((A
T
A)
1
A
T
) se numete pseudoinversa matricei A. Pseudoinversa este
o generalizare natural a noiunii de invers a unei matrice pentru cazul n care A nu este
ptratic. (S se compare ecuaia (31.34), ca soluie aproximativ a lui Ac = y, cu soluia A
1
b
care este soluia exact a sistemului Ax = b.)
Ca un exemplu de folosire a aproximrii prin metoda celor mai mici ptrate, s presupunem
c avem 5 puncte
(1, 2), (1, 1), (2, 1), (3, 0), (5, 3)
indicate prin puncte negre n gura 31.3. Dorim s aproximm aceste puncte printr-un polinom
de gradul doi:
F(x) = c
1
+c
2
x +c
3
x
2
.
ncepem cu matricea valorilor funciei de baz
A =

1 x
1
x
2
1
1 x
2
x
2
2
1 x
3
x
2
3
1 x
4
x
2
4
1 x
5
x
2
5

1 1 1
1 1 1
1 2 4
1 3 9
1 5 25

.
31.6. Matrice simetrice pozitiv-denite i aproximarea prin
metoda celor mai mici ptrate 661
Figura 31.3 Aproximarea cu un polinom de gradul doi pe mulimea de puncte (1, 2), (1, 1), (2, 1),
(3, 0), (5, 3) prin metoda celor mai mici ptrate. Punctele negre sunt punctele date, iar punctele albe
sunt valorile estimate ale acestora prin polinomul F(x) = 1.2 0.757x +0.214x
2
, polinom de gradul doi
care minimizeaz suma ptratelor erorilor. Eroarea pentru ecare punct dat este vizualizat haurat.
Pseudoinversa este
A
+
=

0, 500 0, 300 0, 200 0, 100 0, 100


0, 388 0, 093 0, 190 0, 193 0, 088
0, 060 0, 036 0, 048 0, 036 0, 060

.
nmulind pe y cu A
+
, obinem vectorul coecient
c =

1, 200
0, 757
0, 214

,
deci, polinomul de gradul doi va :
F(x) = 1, 200 0, 757x + 0, 214x
2
care este cea mai apropiat aproximare cu polinoame de gradul doi pentru valorile date, n sensul
celor mai mici ptrate.
Din motive practice, rezolvm ecuaiile normale (31.33) nmulind pe y cu A
T
i, apoi, gsind
descompunerea LU a lui A
T
A. Dac A are rangul complet, se garanteaz faptul c A
T
A este
nesingular, deoarece este simetric i pozitiv-denit. (Vezi exerciiul 31.1-3 i teorema 31.6.)
Exerciii
31.6-1 Demonstrai c orice element de pe diagonala unei matrice simetrice pozitiv-denite este
pozitiv.
31.6-2 Fie A =

a b
b c

o matrice de ordinul 2 2 simetric i pozitiv denit. Demonstrai


c determinantul ac b
2
este pozitiv prin completarea ptrat ntr-o manier similar celei
utilizate n demonstraia lemei 31.15.
662 Capitolul 31 Operaii cu matrice
31.6-3 Demonstrai c elementul maxim ntr-o matrice simetric pozitiv-denit se a pe di-
agonal.
31.6-4 Demonstrai c determinantul ecrei submatrice principale a unei matrice simetrice
pozitiv-denite este pozitiv.
31.6-5 Fie A
k
submatricea principal k a unei matrice A, simetrice pozitiv-denite. Artai c
det(A
k
)/det(A
k1
) este al k-lea pivot din descompunerea LU, unde prin convenie det(A
0
) = 1.
31.6-6 Gsii o funcie de forma:
F(x) = c
1
+c
2
xlg x +c
3
e
x
care este cea mai bun aproximare prin metoda celor mai mici ptrate pentru punctele:
(1, 1), (2, 1), (3, 3), (4, 8).
31.6-7 Artai c pseudoinversa A
+
satisface urmtoarele patru ecuaii:
AA
+
A = A,
A
+
AA
+
= A
+
,
(AA
+
)
T
= AA
+
,
(A
+
A)
T
= A
+
A.
Probleme
31-1 Algoritmul lui Schur de nmulire a matricelor booleene
n seciunea 31.3, am observat c algoritmul lui Strassen de nmulire a matricelor nu poate
aplicat direct la nmulirea matricelor booleene deoarece cvasiinelul boolean Q = (0, 1,
, , 0, 1) nu este un inel. Teorema 31.10 a artat c, dac folosim operaii aritmetice asupra
cuvintelor de O(lg n) bii, am putea totui s aplicm metoda lui Strassen, pentru a nmuli
matrice booleene de ordinul nn, ntr-un timp O(n
lg 7
). Cercetm o metod probabilistic care
utilizeaz numai operaii pe bii care s ating o limit aproape tot att de bun i cu anse
mici de eroare.
a. Artai c R = (0, 1, , , 0, 1), unde este operatorul XOR, este un inel.
Fie A = (a
ij
) i B = (b
ij
) dou matrice booleene de ordinul nn i e C = (c
ij
) = AB n
cvasiinelul Q. Generm A
t
= (a
t
ij
) din A, folosind urmtoarea procedur de randomizare:
Dac a
ij
= 0, atunci a
t
ij
= 0.
Dac a
ij
= 1, atunci a
t
ij
= 1 cu probabilitatea 1/2 i a
t
ij
= 0 cu aceeai probabilitate
1/2. Alegerile aleatoare pentru ecare element sunt independente.
b. Fie c
t
= (c
t
ij
) = A
t
B n inelul R. Artai c c
ij
= 0 implic c
t
ij
= 0. Artai c c
ij
= 1
implic c
t
ij
= 1 cu probabilitatea 1/2.
Probleme 663
c. Artai c, pentru orice > 0, probabilitatea ca un c
t
ij
dat s nu ia niciodat valoarea
c
ij
pentru lg(n
2
/) alegeri independente ale matricei A
t
, este cel mult /n
2
. Artai c
probabilitatea ca toi c
t
ij
s ia valorile lor corecte, cel puin o dat, este cel puin 1 .
d. Dai un algoritm de randomizare cu timp de ordinul O(n
lg 7
lg n) care calculeaz produsul
matricelor booleene ale cvasiinelului Q de ordinul n n, cu probabilitatea de cel puin
1 1/n
k
pentru orice constant k > 0. Singurele operaii permise asupra elementelor
matricelor sunt , i .
31-2 Sisteme de ecuaii liniare tridiagonale
Considerm matricea tridiagonal
A =

1 1 0 0 0
1 2 1 0 0
0 1 2 1 0
0 0 1 2 1
0 0 0 1 2

a. Gsii o descompunere LU a lui A.


b. Rezolvai ecuaia Ax = ( 1 1 1 1 1 )
T
utiliznd substituiile nainte i napoi.
c. Gsii inversa lui A.
d. Artai c, pentru orice matrice simetric pozitiv-denit, tridiagonal de ordinul n n
i orice vector b, n-dimensional, ecuaia Ax = b poate rezolvat ntr-un timp de ordinul
O(n) prin descompunere LU. Argumentai c orice metod bazat pe determinarea lui A
1
este, n cel mai defavorabil caz, asimptotic mai costisitoare.
e. Artai c, pentru orice matrice A de ordinul nn nesingular, tridiagonal i pentru orice
vector b, n-dimensional, ecuaia Ax = b poate rezolvat ntr-un timp de ordinul O(n)
prin descompunerea LUP.
31-3 Spline-uri
O metod practic pentru a interpola o mulime de puncte cu o curb este aceea de a folosi
spline-uri cubice. Se d o mulime (x
i
, y
i
) : i = 0, 1, . . . , n de n+1 perechi de valori-puncte,
unde x
0
< x
1
< . . . < x
n
. Dorim s interpolm punctele printr-o curb cubic f(x) pe poriuni
(spline). Curba f(x) este alctuit din n polinoame cubice f
i
(x) = a
i
+b
i
x +c
i
x
2
+d
i
x
3
pentru
i = 0, 1, . . . , n 1, unde pentru x n domeniul x
i
x x
i+1
, valoarea curbei este dat de
f(x) = f
i
(x x
i
). Punctele x
i
n care polinoamele cubice sunt legate se numesc noduri .
Pentru simplicare, vom presupune c x
i
= i, pentru i = 0, 1, . . . , n.
Pentru a asigura continuitatea lui f(x), se cere ca
f(x
i
) = f
i
(0) = y
i
, f(x
i+1
) = f
i
(1) = y
i+1
pentru i = 0, 1, . . . , n1. Pentru a asigura faptul ca f(x) s e sucient de neted, vom impune
ca derivata de ordinul nti s e continu n ecare nod:
f
t
(x
i+1
) = f
t
i
(1) = f
t
i+1
(0)
pentru i = 0, 1, . . . , n 1.
664 Capitolul 31 Operaii cu matrice
a. S presupunem c, pentru i = 0, 1, . . . , n, se dau nu numai perechile de valori-puncte (x
i
, y
i
)
ci i derivatele de ordinul nti D
i
= f
t
(x
i
) n ecare nod. Exprimai ecare coecient
a
i
, b
i
, c
i
i d
i
n funcie de valorile y
i
, y
i+1
, D
i
i D
i+1
. (Amintim c x
i
= i.) Stabilii ct de
rapid pot calculai cei 4n coecieni din perechile valori-puncte i derivatele de ordinul
nti?
Trebuie stabilit modul de alegere a derivatelor de ordinul nti ale lui f(x) n noduri. O
metod este aceea de a cere ca derivatele de ordinul doi s e continue n noduri:
f
tt
(x
i+1
) = f
tt
i
(1) = f
tt
i+1
(0)
pentru i = 0, 1, . . . , n 1. n primul i ultimul nod, presupunem c f
tt
(x
0
) = f
tt
0
(0) = 0 i
f
tt
(x
n
) = f
tt
n
(1) = 0; aceste presupuneri determin ca f(x) s e un spline cubic natural .
b. Utilizai restriciile de continuitate ale derivatei a doua pentru a arta c pentru i = 1,
2, . . . , n 1,
D
i1
+ 4D
i
+D
i+1
= 3(y
i+1
y
i1
). (31.35)
c. Artai c
2D
0
+D
1
= 3(y
1
y
0
), (31.36)
D
n1
+ 2D
n
= 3(y
n
y
n1
). (31.37)
d. Rescriei relaiile (31.35)(31.37) printr-o ecuaie matriceal implicnd vectorul de necu-
noscute D = 'D
0
, D
1
, . . . , D
n
`. Ce atribute are matricea din ecuaia respectiv?
e. Argumentai faptul c o mulime de n + 1 perechi de valori-puncte poate interpolat cu
un spline cubic natural ntr-un timp de ordinul O(n) (vezi problema 31-2).
f. Artai cum se determin un spline cubic natural care interpoleaz un set de n+1 puncte
(x
i
, y
i
) care satisfac inegalitile x
0
< x
1
< < x
n
, chiar dac x
i
nu este n mod necesar
egal cu i. Ce ecuaie matriceal trebuie rezolvat i ct de rapid se execut algoritmul
respectiv?
Note bibliograce
Exist multe texte excelente care descriu calculul numeric i tiinic cu mai multe detalii
dect am fcut-o noi aici. n special, ar merita citite urmtoarele: George i Liu [81], Golub i
Van Loan [89], Press, Flannery, Teukolsky i Vetterling [161, 162] i Strang [181, 182].
Publicarea algoritmului lui Strassen n 1969 [183] a cauzat mult emoie. Pn atunci, s-
a imaginat c algoritmul ar putea mbuntit. Limita superioar asimptotic a dicultii
nmulirii matricelor a fost de atunci mbuntit considerabil. Cel mai ecient algoritm
asimptotic pentru nmulirea matricelor de ordinul n n, dat de Coppersmith i Winograd [52]
se execut ntr-un timp de ordinul O(n
2.376
). Reprezentarea grac a algoritmului lui Strassen a
Note bibliograce 665
fost dat de Paterson [155]. Fischer i Meyer [67] au adaptat algoritmul lui Strassen la matricele
booleene (teorema 31.10).
Eliminarea gaussian, pe care se bazeaz descompunerile LU i LUP, a fost prima metod
sistematic de rezolvare a sistemelor de ecuaii liniare. De asemenea, ea a fost printre primii
algoritmi numerici. Dei metoda a fost cunoscut mai de mult, descoperirea ei este atribuit
lui C. F. Gauss(17771855). De asemenea, n faimoasa sa lucrare [183], Strassen a artat c o
matrice de ordinul n n poate inversat ntr-un timp de ordinul O(n
lg 7
). Winograd [203] a
demonstrat, originar c nmulirea matricelor nu este mai grea dect inversarea lor, iar reciproca
se datoreaz lui Aho, Hopcroft i Ullman [4].
Strang [182] are o prezentare excelent despre matricele simetrice pozitiv-denite i despre
algebra liniar n general. El a fcut urmtoarea remarc la pagina 334: Elevii clasei mele
adesea m ntreab despre matricele pozitiv-denite. Eu niciodat nu am folosit
acest termen.
32 Polinoame i TFR
Metoda direct de a aduna dou polinoame de grad n necesit un timp (n), dar metoda
direct pentru nmulire necesit un timp (n
2
). n acest capitol, vom arta cum transformata
Fourier rapid sau TFR (Fast Fourier Transform n englez, prescurtat FFT) poate reduce timpul
de nmulire a dou polinoame la (nlg n).
Polinoame
Un polinom n variabila x peste cmpul (algebric) F este o funcie A(x) care poate
reprezentat dup cum urmeaz:
A(x) =
n1

j=0
a
j
x
j
.
Vom numi n limita de grad a polinomului, iar valorile a
0
, a
1
, . . . , a
n1
le vom numi coecienii
polinomului. Coecienii sunt elemente ale cmpului F, de regul corpul C al numerelor
complexe. Se spune c un polinom A(x) are gradul k dac k este rangul cel mai mare pentru
care coecientul a
k
este nenul. Gradul unui polinom cu limita de grad n poate orice ntreg din
intervalul [0, n1]. Reciproc, un polinom de grad k este un polinom cu limita de grad n, pentru
orice n > k.
Exist o varietate de operaii pe care dorim s le denim (i) pentru polinoame. Pentru
adunarea a dou polinoame, dac A(x) i B(x) sunt polinoame cu limita de grad n, spunem
c suma lor este un polinom C(x), tot cu limita de grad n, astfel nct C(x) = A(x) + B(x),
pentru orice x din cmpul peste care s-au denit polinoamele. Respectiv, dac
A(x) =
n1

j=0
a
j
x
j
i
B(x) =
n1

j=0
b
j
x
j
,
atunci
C(x) =
n1

j=0
c
j
x
j
,
unde c
j
= a
j
+ b
j
pentru j = 0, 1, . . . , n 1. De exemplu, dac A(x) = 6x
3
+ 7x
2
10x + 9 i
B(x) = 2x
3
+ 4x 5, atunci C(x) = 4x
3
+ 7x
2
6x + 4.
Pentru nmulirea a dou polinoame, dac A(x) i B(x) sunt polinoame cu limita de
grad n, vom spune c produsul lor C(x) este un polinom cu limita de grad 2n 1, astfel nct
C(x) = A(x)B(x), pentru orice x din cmpul peste care sunt denite polinoamele. Probabil c
ai nmulit deja polinoame, nmulind ecare termen din A(x) cu ecare termen din B(x) i
32.1. Reprezentarea polinoamelor 667
reducnd termenii cu puteri egale. De exemplu, putem nmuli polinoamele A(x) = 6x
3
+7x
2

10x + 9 i B(x) = 2x
3
+ 4x 5 dup cum urmeaz:
6x
3
+7x
2
10x +9
2x
3
+4x 5
30x
3
35x
2
+50x 45
24x
4
+28x
3
40x
2
+36x
12x
6
14x
5
+20x
4
18x
3
12x
6
14x
5
+44x
4
20x
3
75x
2
+86x 45
Un alt mod de a exprima produsul C(x) este
C(x) =
2n2

j=0
c
j
x
j
(32.1)
unde
c
j
=
j

k=0
a
k
b
jk
. (32.2)
De notat c grad(C) = grad(A) + grad(B), ceea ce implic
limita_de_grad(C) = limita_de_grad(A) + limita_de_grad(B) 1
limita_de_grad(A) + limita_de_grad(B)
Vom vorbi, totui, despre limita de grad a lui C ca ind suma limitelor de grad ale lui A i
B, deoarece un polinom care are limita de grad k are, de asemenea, limita de grad k + 1.
Rezumatul capitolului
Seciunea 32.1 prezint dou moduri de a reprezenta polinoamele: reprezentarea prin coeci-
eni i reprezentarea prin valori pe puncte. Metoda direct de nmulire a polinoamelor ecuaiile
(32.1) i (32.2) necesit un timp (n
2
) cnd polinoamele sunt reprezentate prin coecieni, dar
numai un timp (n) cnd ele sunt reprezentate sub form de valori pe puncte. Putem, totui, s
nmulim polinoamele, utiliznd forma de reprezentare prin coecieni n timp (nlg n) fcnd
conversia ntre cele dou reprezentri. Pentru a vedea cum funcioneaz aceast idee, trebuie s
studiem mai nti rdcinile complexe ale unitii, prezentat n seciunea 32.2. Apoi, pentru a
realiza conversia, utilizm transformata Fourier rapid i inversa sa, descrise, de asemenea, n
seciunea 32.2. n seciunea 32.3 se prezint o implementare ecient a transformatei Fourier
rapide, att n modelul serial, ct i n cel paralel.
Acest capitol utilizeaz intensiv numerele complexe, iar simbolul i va utilizat exclusiv pentru
a desemna valoarea

1.
32.1. Reprezentarea polinoamelor
Reprezentrile polinoamelor prin coecieni i prin valori pe puncte sunt, ntr-un anume
sens, echivalente; adic, un polinom reprezentat sub form de valori are un corespondent unic n
668 Capitolul 32 Polinoame i TFR
reprezentarea sub form de coecieni. n aceast seciune, vom introduce cele dou reprezentri
i vom arta cum se pot ele combina pentru a permite nmulirea a dou polinoame cu limita de
grad n n timp (nlg n).
Reprezentarea prin coecieni
O reprezentare prin coecieni a unui polinom A(x) =

n1
j=0
a
j
x
j
cu limita de grad n
este un vector de coecieni a = (a
0
, a
1
, . . . , a
n1
). n ecuaiile matriceale din acest capitol, vom
trata, n general, aceti vectori ca vectori coloan.
Reprezentarea prin coecieni este convenabil pentru anumite operaii cu polinoame. De
exemplu, operaia de evaluare a polinomului A(x), ntr-un punct dat x
0
, const n calculul
valorii A(x
0
). Evaluarea, utiliznd regula (schema) lui Horner, consum un timp (n):
A(x
0
) = a
0
+x
0
(a
1
+x
0
(a
2
+ +x
0
(a
n2
+x
0
(a
n1
)) . . .)).
Similar, adunarea a dou polinoame, reprezentate sub forma vectorilor de coecieni a =
(a
0
, a
1
, . . . , a
n1
) i b = (b
0
, b
1
, . . . , b
n1
), consum un timp (n): trebuie, doar, s listm
vectorul c = (c
0
, c
1
, . . . , c
n1
), unde c
j
= a
j
+b
j
, pentru j = 0, 1, . . . , n 1.
S considerm acum nmulirea a dou polinoame cu limita de grad n, A(x) i B(x), repre-
zentate sub form de coecieni. Dac utilizm metoda descris prin ecuaiile (32.1) i (32.2),
nmulirea a dou polinoame necesit un timp (n
2
) deoarece ecare coecient din vectorul a
trebuie nmulit cu ecare coecient din vectorul b. Operaia de nmulire a dou polinoame
reprezentate sub form de coecieni, pare s e considerabil mai dicil dect evaluarea unui
polinom sau adunarea a dou polinoame. Vectorul de coecieni rezultat c, dat de ecuaia (32.2),
se mai numete i convoluia vectorilor de intrare a i b i se noteaz cu c = a b. Deoarece
nmulirea polinoamelor i calculul convoluiilor sunt probleme de calcul de o importan practic
fundamental, acest capitol se concentreaz asupra algoritmilor ecieni pentru rezolvarea lor.
Reprezentarea prin valori pe puncte
O reprezentare prin valori pe puncte a unui polinom A(x), cu limita de grad n, este o
mulime de n puncte (perechi de valori)
(x
0
, y
0
), (x
1
, y
1
), . . . , (x
n1
, y
n1
)
astfel nct toate valorile x
k
sunt distincte i
y
k
= A(x
k
) (32.3)
pentru k = 0, 1, . . . , n 1. Un polinom poate avea mai multe reprezentri prin valori pe puncte
deoarece orice mulime de n puncte distincte x
0
, x
1
, . . . , x
n1
poate utilizat ca baz pentru
reprezentare.
Calculul unei reprezentri prin valori pe puncte pentru un polinom dat sub form de
coecieni este, n principiu, simpl deoarece tot ce avem de fcut este s alegem n puncte
distincte x
0
, x
1
, . . . , x
n1
i, apoi, s evalum A(x
k
) pentru k = 0, 1, . . . , n 1. Cu schema lui
Horner, aceste evaluri n n puncte consum un timp (n
2
). Vom vedea, mai trziu, c, dac
alegem x
k
n mod inteligent, acest calcul poate accelerat pn la un timp (nlg n).
Operaia invers evalurii determinarea reprezentrii sub form de coecieni dintr-o
reprezentare sub form de valori pe puncte se numete interpolare. Teorema urmtoare ne
32.1. Reprezentarea polinoamelor 669
arat c interpolarea este bine denit n ipoteza c limita de grad a polinomului de interpolare
este egal cu numrul de puncte.
Teorema 32.1 (Unicitatea polinomului de interpolare) Pentru orice mulime de n punc-
te (x
0
, y
0
), (x
1
, y
1
), . . . , (x
n1
, y
n1
) exist un polinom unic A(x) cu limita de grad n, astfel
nct, y
k
= A(x
k
) pentru k = 0, 1, . . . , n 1.
Demonstraie. Demonstraia se bazeaz pe existena inversei unei anumite matrice. Ecuaia
(32.3) este echivalent cu ecuaia matriceal

1 x
0
x
2
0
. . . x
n1
0
1 x
1
x
2
1
. . . x
n1
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1 x
n1
x
2
n1
. . . x
n1
n1

a
0
a
1
.
.
.
a
n1

y
0
y
1
.
.
.
y
n1

. (32.4)
Matricea din stnga se noteaz cu V (x
0
, x
1
, . . . , x
n1
) i este cunoscut sub numele de matrice
Vandermonde. Conform exerciiului 31.1-10, aceast matrice are determinantul

j<k
(x
k
x
j
),
i, de aceea, conform teoremei 31.5, dac x
k
sunt distincte, ea este inversabil (adic nesingular).
Astfel, coecienii a
j
pot determinai unic din reprezentarea prin puncte cu
a = V (x
0
, x
1
, . . . , x
n1
)
1
y.
Demonstraia teoremei 32.1 descrie un algoritm de interpolare bazat pe rezolvarea sistemului
de ecuaii liniare (32.4). Utiliznd algoritmul de descompunere LU, din capitolul 31, putem
rezolva acest sistem n timp O(n
3
).
Un algoritm mai rapid pentru interpolare pe n puncte se bazeaz pe formula lui Lagrange:
A(x) =
n1

k=0
y
k

j,=k
(x x
j
)

j,=k
(x
k
x
j
)
. (32.5)
Este uor de vericat c membrul drept al ecuaiei (32.5) este un polinom cu limita de grad n
care satisface A(x
k
) = y
k
pentru k = 0, 1, . . . , n 1. Exerciiul 32.1-4 pune problema calculrii
coecienilor lui A n timp (n
2
), utiliznd formula lui Lagrange.
Astfel, evaluarea n n puncte i interpolarea sunt operaii bine denite i una este inversa
celeilalte; ele convertesc reprezentarea prin coecieni a unui polinom n reprezentare prin valori
pe puncte i invers.
1
Algoritmul descris mai sus, pentru aceste probleme, dureaz un timp (n
2
).
Este un fapt notoriu c interpolarea este o problem instabil din punct de vedere numeric. Dei abordarea
de aici este corect din punct de vedere matematic, diferene mici n valorile de intrare sau erorile de rotunjire n
timpul calculelor pot cauza diferene mari n rezultat.
670 Capitolul 32 Polinoame i TFR
Aceast reprezentare prin valori pe puncte este convenabil pentru multe operaii cu
polinoame. Pentru adunare, dac C(x) = A(x) + B(x), atunci C(x
k
) = A(x
k
) + B(x
k
) pentru
orice punct x
k
. Mai precis, dac avem o reprezentare prin valori pe puncte pentru A,
(x
0
, y
0
), (x
1
, y
1
), . . . , (x
n1
, y
n1
)
i una pentru B

(x
0
, y
t
0
), (x
1
, y
t
1
), . . . , (x
n1
, y
t
n1
)

(de notat c A i B sunt evaluate n n puncte), atunci o reprezentare prin valori pe


puncte pentru C este

(x
0
, y
0
+y
t
0
), (x
1
, y
1
+y
t
1
), . . . , (x
n1
, y
n1
+y
t
n1
)

.
Timpul necesar pentru a aduna dou polinoame cu limita de grad n, reprezentate sub form de
valori pe puncte, este (n).
De asemenea, reprezentarea prin valori pe puncte este convenabil pentru nmulirea
polinoamelor. Dac C(x) = A(x)B(x), atunci C(x
k
) = A(x
k
)B(x
k
) pentru orice x
k
i, astfel,
putem nmuli punct cu punct reprezentarea prin valori pe puncte a lui A cu reprezentarea prin
valori pe puncte a lui B pentru a obine reprezentarea prin valori pe puncte a lui C. Trebuie,
totui, s facem fa problemei c limita de grad a lui C este suma limitelor de grad ale lui A
i B. O reprezentare standard prin valori pe puncte pentru A i B const din n puncte, dar
deoarece limita de grad pentru C este 2n, teorema 32.1 implic faptul c avem nevoie de 2n
puncte pentru o reprezentare prin valori pe puncte a lui C. De aceea, trebuie s ncepem cu
o reprezentare extins prin valori pe puncte a lui A i B, constnd ecare, din 2n puncte.
Dndu-se o reprezentare extins prin valori pe puncte pentru A
(x
0
, y
0
), (x
1
, y
1
), . . . , (x
2n1
, y
2n1
)
i o reprezentare extins prin valori pe puncte pentru B

(x
0
, y
t
0
), (x
1
, y
t
1
), . . . , (x
2n1
, y
t
2n1
)

,
atunci o reprezentare prin valori pe puncte pentru C este

(x
0
, y
0
y
t
0
), (x
1
, y
1
y
t
1
), . . . , (x
2n1
, y
2n1
y
t
2n1
)

.
Dndu-se, la intrare, dou polinoame n forma valorilor pe puncte, observm c timpul necesar
pentru a obine forma prin valori pe puncte a rezultatului este (n), mai mic dect timpul
necesar pentru a nmuli polinoamele reprezentate sub form de coecieni.
n nal, vom vedea cum putem s evalum un polinom dat sub forma valorilor pe puncte
ntr-un nou punct. Pentru aceast problem nu exist, n aparen, nici o abordare mai simpl
dect convertirea polinomului sub form de coecieni i apoi evaluarea sa n acel nou punct.
nmulirea rapid a polinoamelor sub form de coecieni
Oare putem utiliza metoda de nmulire n timp liniar a polinoamelor reprezentate sub
form de valori pe puncte pentru a accelera nmulirea polinoamelor reprezentate sub form
de coecieni? Rspunsul depinde de abilitatea noastr, de a converti rapid o reprezentare a
32.1. Reprezentarea polinoamelor 671
Figura 32.1 O schi grac a procesului ecient de nmulire a polinoamelor. Reprezentrile din
partea de sus sunt sub form de coecieni, n timp ce cele din partea de jos sunt sub form de valori pe
puncte. Sgeile de la stnga la dreapta corespund operaiilor de nmulire. Termenii
2n
sunt rdcinile
de ordinul 2n ale unitii.
unui polinom sub form de coecieni, ntr-o reprezentare a unui polinom sub form de valori
pe puncte (evaluare) i invers (interpolare).
Putem utiliza orice punct n care dorim s se fac evaluarea, dar, alegnd punctele de evaluare
cu grij, putem face conversia ntre reprezentri ntr-un timp de numai (nlg n). Aa cum vom
vedea n seciunea 32.2, dac alegem rdcinile complexe ale unitii ca puncte de evaluare,
putem genera o reprezentare prin valori pe puncte calculnd transformata Fourier discret (sau
TFD
2
) a vectorului coecienilor. n seciunea 32.2 se va arta cum TFR realizeaz TFD i
inversa TFD n timp (nlg n).
Figura 32.1 ilustreaz grac aceast strategie. Un detaliu minor se refer la limita de grad.
Produsul a dou polinoame cu limita de grad n este un polinom cu limita de grad 2n. nainte de
evaluarea polinoamelor de intrare A i B, vom dubla limita de grad la 2n, adugnd n coecieni
0 n extremitatea dreapt a vectorului. Deoarece vectorii au 2n elemente, vom utiliza rdcinile
complexe de ordinul 2n ale unitii pe care le vom nota n gura 32.1 cu
2n
.
Dndu-se TFR, avem urmtoarea procedur n timp (nlg n) pentru nmulirea a dou
polinoame A(x) i B(x) cu limita de grad n, unde intrarea i ieirea sunt reprezentate sub
form de coecieni. Presupunem c n este o putere a lui 2; aceast cerin poate satisfcut
ntotdeauna, adugnd coecieni zero de rang mare.
1. : crem reprezentrile sub form de coecieni pentru A(x) i B(x)
ca polinoame cu limita de grad 2n, completnd cu n coecieni 0 de ordin mare pe ecare
din ele.
2. : calcularea reprezentrilor sub form de valori pe puncte ale lui A(x) i B(X)
de lungime 2n prin dou aplicri ale TFR de ordin 2n. Aceste reprezentri conin valorile
celor dou polinoame n cele 2n rdcini de ordinul 2n ale unitii.
3. : se calculeaz o reprezentare prin valori pe puncte pentru polinomul
n englez Discrete Fourier Transform (DFT)n.t.
672 Capitolul 32 Polinoame i TFR
C(x) = A(x)B(x), nmulind aceste valori punct cu punct. Aceast reprezentare conine
valorile lui C(x) n rdcinile de ordinul 2n ale unitii.
4. : se creeaz reprezentarea prin coecieni a polinomului C(x) printr-o singur
aplicare a TFR pe 2n puncte pentru a calcula inversa TFD.
Paii (1) i (3) necesit un timp (n), iar paii (2) i (4) necesit un timp (nlg n). Astfel,
o dat ce am artat cum se realizeaz TFR, am demonstrat rezultatul urmtor:
Teorema 32.2 Produsul a dou polinoame cu limita de grad n poate calculat n timp
(nlg n), cu polinoamele de intrare i ieire reprezentate sub form de coecieni.
Exerciii
32.1-1 nmulii polinoamele A(x) = 7x
3
x
2
+x10 i B(x) = 8x
3
6x+3 utiliznd ecuaiile
(32.1) i (32.2).
32.1-2 Evaluarea unui polinom A(x) cu limita de grad n ntr-un punct dat x
0
se poate realiza,
de asemenea, mprind A(x) cu polinomul (x x
0
) pentru a obine un polinom q(x) cu limita
de grad n 1 i un rest r, astfel nct
A(x) = q(x)(x x
0
) +r.
Evident, A(x
0
) = r. Artai cum se poate calcula restul r i coecienii lui q(x) n timp (n),
date ind x
0
i coecienii lui A.
32.1-3 Obinei o reprezentare prin list de valori pe puncte pentru A
rev
(x) =

n1
j=0
a
n1j
x
j
dintr-o reprezentare prin valori pe puncte pentru A(x) =

n1
j=0
a
j
x
j
, presupunnd c nici unul
din puncte nu este 0.
32.1-4 Artai cum se poate utiliza ecuaia (32.5) pentru a realiza interpolarea n timp (n
2
).
( Se calculeaz nti

j
(x x
j
) i apoi se mparte cu (x x
k
) dup cum este necesar
pentru numrtorul ecrui termen. Vezi exerciiul 32.1-1.)
32.1-5 Explicai ce este greit n abordarea evident prin mprire de polinoame, utiliznd o
reprezentare prin valori pe puncte. Discutai separat cazurile cnd acesta funcioneaz corect i
cnd nu.
32.1-6 Considerm dou mulimi A i B, avnd ecare n elemente ntregi n intervalul de la 0
la 10n. Dorim s calculm suma cartezian a lui A i B denit prin
C = x +y : x A i y B.
De notat c numerele ntregi din C sunt din intervalul [0, 20n]. Dorim s gsim elementele lui C
i numrul de posibiliti n care ecare element din C se realizeaz ca o sum a elementelor din
A i B. Artai c aceast problem poate rezolvat n timp O(nlg n). ( Reprezentai
A i B ca polinoame de grad 10n.)
32.2. TFD i TFR 673
Figura 32.2 Valorile
0
8
,
1
8
, . . .,
7
8
n planul complex, unde
8
= e
2i/8
este rdcina complex de
ordinul 8 a unitii.
32.2. TFD i TFR
n seciunea 32.1 am armat c, dac utilizm rdcinile complexe ale unitii, putem s
evalum i s interpolm n timp (nlg n). n aceast seciune denim rdcinile complexe ale
unitii i studiem proprietile lor, denim TFD i apoi artm cum TFR calculeaz TFD i
inversa acesteia n timp (nlg n).
Rdcinile complexe ale unitii
O rdcin complex de ordinul n a unitii este un numr complex cu proprietatea

n
= 1.
Exist exact n rdcini complexe de ordinul n ale unitii; acestea sunt e
2ik/n
pentru k =
0, 1, . . . , n1. Pentru a interpreta aceast formul, vom utiliza exponeniala cu argument complex
e
iu
= cos(u) +i sin(u).
Figura 32.2 ne arat c cele n rdcini complexe ale unitii sunt egal spaiate pe cercul unitate.
Valoarea

n
= e
2i/n
(32.6)
se numete rdcin principal de ordinul n a unitii ; toate celelalte rdcini complexe
de ordinul n ale unitii sunt puteri ale lui
n
. Cele n rdcini de ordinul n ale unitii

0
n
,
1
n
, . . . ,
n1
n
,
formeaz un grup n raport cu operaia de nmulire (vezi seciunea 33.3). Acest grup are aceeai
structur
3
ca grupul aditiv modulo n (Z
n
, +), cci
n
n
=
0
n
= 1 implic
j
n

k
n
=
j+k
n
=

(j+k) mod n
n
. La fel,
1
n
=
n1
n
. Proprietile eseniale ale rdcinilor de ordinul n ale unitii
sunt date de urmtoarele leme.
Cele dou grupuri sunt izomorfe n.t.
674 Capitolul 32 Polinoame i TFR
Lema 32.3 (Lema de anulare) Pentru orice ntregi n 0, k 0 i d > 0,

dk
dn
=
k
n
. (32.7)
Demonstraie. Lema rezult direct din ecuaia (32.6), deoarece

dk
dn
= (e
2i/dn
)
dk
= (e
2i/n
)
k
=
k
n
.
Corolarul 32.4 Pentru orice ntreg par n > 0

n/2
n
=
2
= 1.
Demonstraie. Demonstraia rmne ca exerciiu (exerciiul 32.2-1).
Lema 32.5 (Lema de njumtire) Dac n > 0 este par, atunci ptratele celor n rdcini
complexe de ordinul n ale unitii sunt cele n/2 rdcini complexe de ordinul n/2 ale unitii.
Demonstraie. Din lema de anulare rezult c (
k
n
)
2
=
k
n/2
, pentru orice ntreg nenegativ k.
De notat c dac ridicm la ptrat toate rdcinile complexe de ordinul n ale unitii, atunci
ecare rdcin complex de ordinul n/2 a unitii se obine exact de dou ori, deoarece
(
k+n/2
n
)
2
=
2k+n
n
=
2k
n

n
n
=
2k
n
= (
k
n
)
2
.
Astfel,
k
n
i
k+n/2
n
au acelai pstrat. Aceast propritate poate demonstrat, de asemenea, u-
tiliz nd corolarul 32.4, deoarece
n/2
n
= 1 implic
k+n/2
n
=
k
n
i deci

k+n/2
n

2
=

k
n

2
.
Aa dup cum vom vedea, lema de njumtire este esenial pentru abordarea de tip divide
i stpnete a conversiei ntre reprezentarea polinoamelor prin coecieni i cea prin valori pe
puncte, deoarece ea garanteaz c subproblemele recursive au dimensiunea pe jumtate.
Lema 32.6 (Lema de nsumare) Pentru orice ntreg n 1 i orice ntreg nenegativ k nedi-
vizibil prin n,
n1

j=0
(
k
n
)
j
= 0.
Demonstraie. Din ecuaia (3.3), aplicat unor valori complexe, obinem
n1

j=0
(
k
n
)
j
=
(
k
n
)
n
1

k
n
1
=
(
n
n
)
k
1

k
n
1
=
(1)
k
1

k
n
1
= 0.
Cerina ca n s nu e divizor al lui k ne asigur c numitorul este nenul, deoarece
k
n
= 1 numai
dac k este divizibil cu n.
32.2. TFD i TFR 675
TFD
Reamintim c dorim s evalum polinomul
A(x) =
n1

j=0
a
j
x
j
cu limita de grad n n
0
n
,
1
n
,
2
n
. . . ,
n1
n
(adic rdcinile complexe de ordinul n ale unitii).
4
Fr a restrnge generalitatea, presupunem c n este o putere a lui 2, deoarece o limit de
grad poate ntotdeauna mrit putem aduga dup necesiti coecieni 0 de rang nalt.
Presupunem c A este dat sub form de coecieni: a = (a
0
, a
1
, . . . , a
n1
). Denim rezultatul
y
k
, pentru k = 0, 1, . . . , n 1, prin
y
k
= A(
k
n
) =
n1

j=0
a
j

kj
n
. (32.8)
Vectorul y = (y
0
, y
1
, . . . , y
n1
) este transformata Fourier discret (TFD) a vectorului
coecienilor a = (a
0
, a
1
, . . . , a
n1
). Scriem, de asemenea, y=TFD
n
(a).
TFR
Utiliznd o metod cunoscut sub numele de transformata Fourier rapid (TFR), care
prot de avantajul proprietilor speciale ale rdcinilor complexe ale unitii, putem calcula
TFD
n
(a) n timp (nlg n), spre deosebire de timpul (n
2
) necesitat de metoda direct. Metoda
TFR utilizeaz o strategie divide i stpnete, folosind separat coecienii cu indice par i
separat pe cei cu indice impar ai lui A(x), pentru a deni dou noi polinoame A
[0]
(x) i A
[1]
(x)
cu limita de grad n/2:
A
[0]
(x) = a
0
+a
2
x +a
4
x
2
+. . . +a
n2
x
n/21
,
A
[1]
(x) = a
1
+a
3
x +a
5
x
2
+. . . +a
n1
x
n/21
.
Observm c A
[0]
conine toi coecienii cu indice par ai lui A (reprezentarea binar a acestor
indici se termin cu 0) i A
[1]
conine toi coecienii cu indice impar (reprezentarea lor binar
se termin cu 1). Urmeaz c
A(x) = A
[0]
(x
2
) +xA
[1]
(x
2
), (32.9)
i, astfel, problema evalurii lui A(x) n
0
n
,
1
n
, . . . ,
n1
n
se reduce la:
1. evaluarea polinoamelor A
[0]
(x) i A
[1]
(x) cu limita de grad n/2 n punctele
(
0
n
)
2
, (
1
n
)
2
, . . . , (
n1
n
)
2
, (32.10)
i apoi
2. combinarea rezultatelor conform ecuaiei (32.9).
Lungimea n are acelai rol ca i 2n n seciunea 32.1, deoarece dublm limita de grad a polinomului nainte
de evaluare. n contextul nmulirii polinoamelor lucrm, din acest motiv, cu rdcini complexe de ordinul 2n ale
unitii.
676 Capitolul 32 Polinoame i TFR
Conform lemei de njumtire, lista de valori (32.10) nu este constituit din n valori
distincte, ci din cele n/2 rdcini complexe de ordinul n/2 ale unitii i ecare rdcin
aprnd de exact dou ori. De aceea, polinoamele A
[0]
i A
[1]
cu limita de grad n/2 sunt evaluate
recursiv n cele n/2 rdcini complexe de ordinul n/2 ale unitii. Aceste subprobleme au exact
aceeai form ca i problema general, dar pe jumtatea dimensiunii originale. Am reuit s
descompunem calculul TFD
n
a n elemente n calculul a dou TFD
n/2
a cte n/2 elemente.
Aceast descompunere este baza urmtorului algoritm recursiv pentru TFR, care calculeaz
TFD a unui vector cu n elemente a = (a
0
, a
1
, . . . , a
n1
), unde n este o putere a lui 2.
TFR-Recursiv(a)
1: n lungime[a] n este o putere a lui 2
2: dac n = 1 atunci
3: returneaz a
4:
n
e
2i/n
5: 1
6: a
[0]
(a
0
, a
2
, . . . , a
n2
)
7: a
[1]
(a
1
, a
3
, . . . , a
n1
)
8: y
[0]
TFR-Recursiv(a
[0]
)
9: y
[1]
TFR-Recursiv(a
[1]
)
10: pentru k = 0, n/2 1 execut
11: y
k
y
[0]
k
+y
[1]
k
12: y
k+(n/2)
y
[0]
k
y
[1]
k
13:
n
14: returneaz y se presupune c y este vector coloan
Procedura TFR-Recursiv lucreaz dup cum urmeaz. Liniile 23 reprezint baza recur-
sivitii; TFD a unui element este elementul nsui, deoarece n acest caz
y
0
= a
0

0
1
= a
0
1 = a
0
.
Liniile 67 denesc vectorii coecienilor pentru polinoamele A
[0]
i A
[1]
. Liniile 4, 5 i 13 garan-
teaz c este actualizat corespunztor, astfel ca ori de cte ori se execut liniile 1112, =
k
n
.
(Pstrarea valorii , de la o iteraie la alta, economisete timp, comparativ cu calculul lui
k
n
de ecare dat n ciclul pentru). Liniile 89 realizeaz calculul recursiv al lui TFD
n/2
, punnd,
pentru k = 0, 1, . . . , n/2 1,
y
[0]
k
= A
[0]
(
k
n/2
),
y
[1]
k
= A
[1]
(
k
n/2
),
sau, deoarece
k
n/2
=
2k
n
, conform lemei de anulare,
y
[0]
k
= A
[0]
(
2k
n
),
y
[1]
k
= A
[1]
(
2k
n
).
Liniile 1112 combin rezultatele calculelor recursive pentru TFD
n/2
. Pentru y
0
, y
1
, . . . , y
n/21
linia 11 ne furnizeaz
y
k
= y
[0]
k
+
k
n
y
[1]
k
= A
[0]
(
2k
n
) +
k
n
A
[1]
(
2k
n
) = A(
k
n
),
32.2. TFD i TFR 677
unde ultima egalitate a acestui raionament rezult din ecuaia (32.9). Pentru y
n/2
, y
n/2+1
, . . . ,
y
n1
, lund k = 0, 1, . . . , n/2 1, linia 12 produce
y
k+(n/2)
= y
[0]
k

k
n
y
[1]
k
= y
[0]
k
+
k+(n/2)
n
y
[1]
k
= A
[0]
(
2k
n
) +
k+(n/2)
n
A
[1]
(
2k
n
) =
= A
[0]
(
2k+n
n
) +
k+(n/2)
n
A
[1]
(
2k+n
n
) = A(
k+(n/2)
n
).
A doua egalitate rezult din prima deoarece
k+(n/2)
n
=
k
n
. A patra linie rezult din a treia,
deoarece
n
n
= 1 implic
2k
n
=
2k+n
n
. Ultima egalitate rezult din ecuaia (32.9). Astfel, vectorul
y returnat de TFR-Recursiv este ntr-adevr TFD a vectorului de intrare a.
Pentru a determina timpul de execuie al procedurii TFR-Recursiv, observm c,
excluznd apelurile recursive propriu-zise, ecare apel consum un timp (n), unde n este
lungimea vectorului de intrare. Aadar, recurena pentru timpul de execuie este
T(n) = 2T(n/2) + (n) = (nlg n).
Astfel, putem evalua un polinom cu limita de grad n n rdcinile complexe de ordinul n ale
unitii n timp (nlg n), utiliznd transformata Fourier rapid.
Interpolare n rdcini complexe ale unitii
Vom ncheia acum schema de nmulire polinomial artnd cum putem s interpolm n
rdcinile complexe ale unitii printr-un polinom, ceea ce ne permite s facem conversia de la
forma prin valori pe puncte la forma prin coecieni. Vom interpola, scriind TFD ca pe o ecuaie
matriceal i cutnd forma matricei inverse.
Din ecuaia (32.4) rezult c putem scrie TFD ca pe un produs de matrice y = V
n
a, unde
V
n
este o matrice Vandermonde ce conine puterile adecvate ale lui
n
:

y
0
y
1
y
2
y
3
.
.
.
y
n1

1 1 1 1 . . . 1
1
n

2
n

3
n
. . .
n1
n
1
2
n

4
n

6
n
. . .
2(n1)
n
1
3
n

6
n

9
n
. . .
3(n1)
n
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
n1
n

2(n1)
n

3(n1)
n
. . .
(n1)(n1)
n

a
0
a
1
a
2
a
3
.
.
.
a
n1

.
Intrarea (k, j) a lui V
n
este
kj
n
pentru j, k = 0, 1, . . . , n 1, iar exponenii intrrilor lui V
n
formeaz o tabel a nmulirii.
Pentru a realiza operaia invers, pe care o scriem ca a =TFD
1
n
(y), nmulim y cu matricea
V
1
n
, inversa lui V
n
.
Teorema 32.7 Pentru j, k = 0, 1, . . . , n 1, intrarea (j, k) a lui V
1
n
este
kj
n
/n.
Demonstraie. Vom arta c V
1
n
V
n
= I
n
, unde I
n
este matricea identic n n. Considerm
intrarea (j, j
t
) a lui V
1
n
V
n
:
[V
1
n
V
n
]
jj
=
n1

k=0
(
kj
n
/n)(
kj

n
) =
n1

k=0

k(j

j)
n
/n.
678 Capitolul 32 Polinoame i TFR
Aceast sum este egal cu 1 dac j
t
= j i este 0 n caz contrar, conform lemei de nsumare
(lema 32.6). Observm c ne bazm pe inegalitatea (n 1) < j
t
j < n 1 i pe faptul c
j
t
j este divizibil cu n, pentru ca lema de nsumare s se poat aplica.
Dndu-se matricea invers V
1
n
, TFD
1
n
(y) se calculeaz cu
a
j
=
1
n
n1

k=0
y
k

kj
n
(32.11)
pentru j = 0, 1, . . . , n 1. Comparnd ecuaiile (32.8) i (32.11), observm c, modicnd al-
goritmul TFR pentru a schimba rolurile lui a i y, nlocuind
n
cu
1
n
i mprind ecare
element al rezultatului cu n, calculm inversa TFD (vezi exerciiul 32.2-4). Astfel, i TFD
1
n
poate calculat n timp (nlg n).
Prin urmare, utiliznd TFR i inversa TFR, putem transforma reprezentarea sub form de
coecieni a unui polinom cu limita de grad n n reprezentarea prin valori pe puncte i invers,
n timp (nlg n). n contextul nmulirii polinomiale, am demonstrat urmtoarea teorem.
Teorema 32.8 (Teorema de convoluie) Pentru oricare doi vectori a i b de lungime n, unde
n este o putere a lui 2,
a b = TFD
1
2n
(TFD
2n
(a) TFD
2n
(b)),
unde vectorii a i b sunt completai cu zerouri pn la lungimea 2n, iar desemneaz produsul
pe componente al vectorilor cu 2n elemente.
Exerciii
32.2-1 Demonstrai corolarul 32.4.
32.2-2 Calculai TFD a vectorului (0, 1, 2, 3).
32.2-3 Rezolvai exerciiul 32.1-1, utiliznd o schem cu timpul (nlg n).
32.2-4 Scriei pseudocodul pentru a calcula TFD
1
n
n timp (nlg n).
32.2-5 Descriei generalizarea TFR n cazul cnd n este o putere a lui 3. Dai o recuren pentru
timpul de execuie i rezolvai recurena.
32.2-6 Presupunem c n loc de a realiza TFR a n elemente peste cmpul numerelor complexe
(unde n este par), utilizm inelul Z
m
al ntregilor modulo m, unde m = 2
tn/2
+ 1 i t este un
ntreg pozitiv arbitrar. Utilizai = 2
t
modulo m n loc de
n
ca rdcin principal de ordinul
n a unitii. Demonstrai c TFD i inversa TFD sunt bine denite n acest sistem.
32.2-7 Fie lista de valori z
0
, z
1
, . . . , z
n1
(posibil cu repetiii), artai cum pot gsii coeci-
enii polinomului P(x) cu limita de grad n ce are ca zerouri numerele z
0
, z
1
, . . . , z
n1
(posibil cu
repetiii). Procedura se va executa n timp O(nlg
2
n). ( polinomul P(x) are un zero n
z
j
dac i numai dac P(x) este multiplu al lui (x z
j
).)
32.3. Implementri eciente ale TFR 679
Figura 32.3 O operaie uture (buttery). Cele dou valori de intrare vin din stnga,
k
n
este nmulit
cu y
[1]
k
, iar suma i diferena sunt ieirile din dreapta. Figura poate interpretat ca un circuit combi-
naional.
32.2-8 Transformarea cirip (chirp transform) a unui vector a = (a
0
, a
1
, . . . , a
n
)
este vectorul y = (y
0
, y
1
, . . . , y
n1
) unde y
k
=

n1
j=0
a
j
z
kj
i z este un numr complex. TFD
este, deci, un caz particular al transformrii cirip, n cazurile n care z =
n
. Demonstrai c
transformarea cirip poate evaluat n timp O(nlg n) pentru orice numr complex z. (
utilizai ecuaia
y
k
= z
k
2
/2
n1

j=0

a
j
z
j
2
/2

z
(kj)
2
/2

pentru a putea considera transformarea cirip ca o convoluie.)


32.3. Implementri eciente ale TFR
Deoarece aplicaiile practice ale TFD, cum ar prelucrarea semnalelor, necesit vitez
maxim, aceast seciune examineaz dou implementri eciente ale ale TFR. Mai nti vom
examina o versiune iterativ a algoritmului TFR care se execut n timp (nlg n), dar are o
constant mai mic ascuns n notaia dect implementarea recursiv din seciunea 32.2.
Astfel, n scopul proiectrii unui circuit paralel ecient pentru TFR, vom utiliza analiza care ne
conduce la implementarea iterativ.
O implementare iterativ a TFR
Observm nti c ciclul pentru din liniile 1013 ale procedurii TFR-Recursiv calculeaz
valoarea
k
n
y
[1]
k
de dou ori. n terminologia din domeniul compilatoarelor, o astfel de valoare
este cunoscut sub numele de subexpresie comun. Vom schimba ciclul pentru astfel nct
s calculeze
k
n
y
[1]
k
o singur dat, memornd-o ntr-o variabil temporar t.
pentru k 0, n/2 1 execut
t y
[1]
k
y
k
y
[0]
k
+t
y
k+(n/2)
y
[0]
k
t

n
Operaia din acest ciclu, nmulirea lui (care este egal cu
k
n
) cu y
[1]
k
, memorarea
produsului n t, adunarea i scderea lui t din y
[0]
k
, este cunoscut sub numele de operaie
uture (buttery operation) i este prezentat schematic n gura 32.3. Vom arta cum putem
680 Capitolul 32 Polinoame i TFR
Figura 32.4 Cei trei vectori de intrare ai apelurilor recursive ale procedurii TFR-Recursiv. Apelul
iniial este pentru n = 8.
transforma un algoritm iterativ ntr-unul recursiv. n gura 32.4, am aranjat vectorii de intrare
pentru apelurile recursive ale procedurii TFR-Recursiv ntr-o structur de arbore, unde apelul
iniial este pentru n = 8. Arborele are un nod pentru ecare apel de procedur, etichetat cu
vectorul de intrare corespunztor. Fiecare apel al procedurii TFR-Recursiv face dou apeluri
recursive, n afara cazului cnd primete un vector cu un element. Vom transforma primul apel
ul stng i al doilea ul drept.
Examinnd arborele, observm c, dac putem aranja elementele vectorului iniial a n
ordinea n care ele apar n frunze, putem imita execuia procedurii TFR-Recursiv. nti, lum
elementele n perechi, calculm TFD a ecrei perechi, utiliznd o operaie uture i nlocuim
perechea cu transformata sa Fourier discret. Vectorul pstreaz, atunci, n/2 TFD a cte dou
elemente. Apoi, lum aceste n/2 perechi de TFD n perechi i calculm TFD a vectorilor cu 4
elemente care provin din execuia a dou operaii uture, nlocuind dou TFD cu dou elemente
cu o TFD cu 4 elemente. Vectorul va pstra, apoi, n/4 TFD cu 4 elemente. Continum n acest
mod pn cnd vectorul pstreaz dou TFD a n/2 elemente care pot combinate n TFD nal
cu n elemente.
Pentru a transforma aceast observaie n cod, vom utiliza un tablou A[0..n1] care, iniial,
pstreaz elementele vectorului de intrare a n ordinea n care apar n frunzele arborelui din gura
32.4. (Vom arta, mai trziu, cum se poate determina aceast ordine.) Deoarece combinarea
trebuie s se fac la ecare nivel al arborelui, introducem o variabil s, pentru a contoriza
nivelurile, mergnd de la 1 (n partea de jos, cnd combinm perechile pentru a forma TFD a
dou elemente) la lg n (n vrf, cnd combinm dou TFD a n/2 elemente pentru a produce
rezultatul nal). De aceea algoritmul are urmtoarea structur:
1: pentru s 1, lg n execut
2: pentru k 0, n 1, 2
s
execut
3: combin dou TFD a 2
s1
elemente din A[k..k + 2
s1
1] i A[k + 2
s1
..k + 2
s
1] n
TFD a 2
s
elemente n A[k..k + 2
s
1]
Putem exprima corpul ciclului (linia 3) printr-un pseudocod mai exact. Vom copia ciclul
pentru din procedura TFR-Recursiv, identicnd y
[0]
cu A[k..k + 2
s1
1] i y
[1]
cu A[k +
32.3. Implementri eciente ale TFR 681
2
s1
..k + 2
s
1]. Valoarea lui , utilizat n ecare operaie uture, depinde de valoarea lui s;
utilizm
m
, unde m = 2
s
. (Introducem variabila m doar n scop de lizibilitate). Introducem o
alt variabil temporar u care ne permite s realizm operaia uture pe loc ( ). Cnd
nlocuim linia 3 a structurii generale prin corpul ciclului, obinem pseudocodul urmtor, care
formeaz baza algoritmului nostru nal de TFR precum i a implementrii paralele pe care o
vom prezenta mai trziu.
Baza-TFR(a)
1: n lungime[a] n este o putere a lui 2
2: pentru s 1, lg n execut
3: m 2
s
4:
m
e
2i/m
5: pentru k 0, n 1, m execut
6: 1
7: pentru j 0, m/2 1 execut
8: t A[k +j +m/2]
9: u A[k +j]
10: A[k +j] u +t
11: A[k +j +m/2] u t
12:
m
Prezentm versiunea nal a codului iterativ pentru TFR, care inverseaz cele dou
cicluri interioare pentru a elimina unele calcule de index i utilizeaz procedura auxiliar
Copiere-Invers-Bii(a, A) pentru a copia vectorul a n tabloul A n ordinea iniial n care
avem nevoie de valori.
TFR-Iterativ(a)
1: Copiere-Invers-Bii(a, A)
2: n lungime[a] n este o putere a lui 2
3: pentru s 1, n execut
4: m 2
s
5:
m
e
2i/m
6: 1
7: pentru j 0, m/2 1 execut
8: pentru k j, n 1, m execut
9: t A[k +j +m/2]
10: u A[k]
11: A[k] u +t
12: A[k +m/2] u t
13:
m
14: returneaz A
Cum mut Copiere-Invers-Bii elementele din vectorul de intrare a n ordinea dorit n
tabloul A? Ordinea n care frunzele apar n gura 32.4 este ordinea binar invers a biilor.
Adic, dac rev(k) este ntregul de lungime lg n format prin considerarea n ordine invers a
biilor din reprezentarea binar a lui k, atunci vom pune elementul a
k
n locul lui A[rev(k)].
682 Capitolul 32 Polinoame i TFR
De exemplu, n gura 32.4, frunzele apar n ordinea 0, 4, 2, 6, 1, 5, 3, 7; aceast secven are
reprezentrile binare 000, 100, 010, 110, 001, 101, 011, 111, iar cu biii inversai obinem secvena
000, 001, 010, 011, 100, 101, 110, 111. Pentru a argumenta c, ntr-adevr, dorim, n general,
ordinea invers a biilor, s observm c, la nivelul de sus al arborelui, indicii al cror bit de
ordinul cel mai mic este zero sunt plasai n subarborele stng, iar cei al cror bit mai puin
semnicativ este 1 sunt plasai n cel drept. nlturnd biii de ordinul cel mai mic la ecare
nivel, continum acest proces n jos pn cnd obinem ordinea binar invers n frunze. Deoarece
funcia rev(k) se calculeaz uor, procedura Copiere-Invers-Bii poate scris dup cum
urmeaz:
Copiere-Invers-Bii(a, A)
1: n lungime[a]
2: pentru k = 0, n 1 execut
3: A[rev(k)] a
k
Implementarea iterativ a TFR se execut ntr-un timp (nlg n). Apelul procedurii Copi-
ere-Invers-Bii(a, A) se execut sigur n timp O(nlg n), deoarece iterm de n ori i putem
oglindi (inversa) biii unui ntreg ntre 0 i n 1 cu lg n bii n timp O(lg n). (n practic,
cunoatem valoarea iniial a lui n dinainte, aa c putem construi o tabel care s pun n
coresponden k cu rev(k), i astfel Copiere-Invers-Bii se execut n timp (n) cu o
constant ascuns ( coninut n notaia asimptotic) mic. Ca alternativ, putem utiliza
o schem amortizat inteligent de inversare a unui contor binar, descris n problema 18-1.
Pentru a ncheia demonstraia c TFR-Iterativ se execut n timp (nlg n), vom arta c
numrul L(n) de execuii ale corpului ciclului celui mai interior (liniile 912), este (nlg n).
Avem:
L(n) =
lg n

s=1
2
s1
1

j=0
n
2
s
=
lg n

s=1
n
2
s
2
s1
=
lg n

s=1
n
2
= (nlg n).
Un circuit paralel pentru TFR
Putem exploata multe dintre proprietile care ne permit s implementm un algoritm TFR
iterativ ecient pentru a produce un algoritm paralel ecient pentru TFR. (Pentru descrierea unui
model de circuit combinaional, vezi capitolul 29.) Circuitul combinaional TFR-Paralel care
calculeaz TFR a n intrri, pentru n = 8, apare n gura 32.5. Circuitul ncepe cu o permutare
prin inversarea biilor intrrii, urmat de lg n stadii, ecare constnd din n/2 operaii uture
executate n paralel. Adncimea circuitului este (lg n).
Partea cea mai din stnga a circuitului TFR-Paralel realizeaz permutarea prin inversa-
rea biilor, iar restul imit procedura iterativ Baza-TFR. Vom prota de avantajul c ecare
iteraie a celui mai exterior ciclu pentru (liniile 312) realizeaz n/2 operaii uture independen-
te care pot executate n paralel. Valoarea lui s din ecare iteraie din interiorul Baza-TFR
corespunde stadiului operaiilor uture ilustrate n gura 32.5. n interiorul stadiului s, pentru
s = 1, 2, . . . , lg n, exist n/2
s
grupuri de operaii uture (corespunznd ecrei valori a lui k
din Baza-TFR) cu 2
s1
uturi pe grup (corespunznd ecrei valori a lui j din Baza-TFR).
Operaiile uture din gura 32.5 corespund operaiilor uture din ciclul cel mai interior (liniile
811 ale procedurii Baza-TFR). De notat, de asemenea, c valorile lui utilizate n operaii
uture corespund celor din Baza-TFR; n stadiul s utilizm
0
m
,
1
m
, . . . ,
m/21
m
, unde m = 2
s
.
32.3. Implementri eciente ale TFR 683
Figura 32.5 Un circuit combinaional TFR-Paralel care calculeaz TFR, ilustrat pentru n =
8 intrri. Stadiile operaiilor uture sunt etichetate pentru a corespunde ciclului celui mai exterior
al procedurii Baza-TFR. O TFR pentru n intrri poate calculat cu adncimea (lg n), folosind
(nlg n) elemente combinaionale.
Exerciii
32.3-1 Artai cum calculeaz TFR-Iterativ TFD a vectorului de intrare (0,2,3,-1,4,5,7,9).
32.3-2 Artai cum se implementeaz un algoritm TFR n care permutarea prin inversarea
biilor s apar la sfritul calculului, n loc s apar la nceput. ( considerai TFD
invers).
32.3-3 Cte elemente de adunare, scdere i nmulire sunt necesare n circuitul TFR-
Paralel descris n aceast seciune, pentru a calcula TFD
n
(presupunem c este nevoie numai
de un r pentru a duce un numr dintr-un loc n altul)?
32.3-4 Presupunem c sumatorii dintr-un circuit TFR uneori greesc ntr-un mod care pro-
duce, ntotdeauna, o ieire 0 indiferent de intrare. Presupunem c greete exact un sumator, dar
c nu tim care anume. Descriei modul n care se poate identica sumatorul defect, furniznd
intrri circuitului TFR global i observnd ieirile. ncercai s realizacti o procedur ecient.
684 Capitolul 32 Polinoame i TFR
Probleme
32-1 nmulire divide i stpnete
a. Artai cum se pot nmuli dou polinoame de grad I ax+b i cx+d, utiliznd numai trei
nmuliri. ( una dintre nmuliri este (a +b)(c +d).)
b. Dai doi algoritmi divide i stpnete pentru nmulirea a dou polinoame cu limita de
grad n care se execut n timp (n
lg 3
). Primul algoritm ar putea mpri coecienii
polinoamelor de intrare ntr-o jumtate stng i una dreapt, iar cel de-al doilea dup
cum indicele lor este par sau impar.
c. Artai c doi ntregi de n bii pot nmulii n O(n
lg 3
) pai, unde ecare pas opereaz
pe cel mult un numr constant de valori de un bit.
32-2 Matrice Toeplitz
O matrice Toeplitz este o matrice de dimensiune n n, A = (a
ij
), astfel nct a
ij
= a
i1,j1
pentru i = 2, 3, . . . , n i j = 2, 3, . . . , n.
a. Este suma a dou matrice Toeplitz, n mod necesar, o matrice Toeplitz? Ce se poate spune
despre produs?
b. Descriei un mod de reprezentare a matricelor Toeplitz, astfel ca dou matrice Toeplitz
n n s poat adunate n timp O(n).
c. Dai un algoritm n timp O(nlg n) de nmulire a unei matrice Toeplitz cu un vector de
lungime n. Utilizai reprezentarea din partea (b).
d. Dai un algoritm ecient de nmulire a dou matrice Toeplitz de dimensiune n n.
Analizai timpul su de execuie.
32-3 Evaluarea tuturor derivatelor unui polinom ntr-un punct
Fie un polinom A(x) cu limita de grad n i derivata sa de ordinul t este denit prin
A
(t)
(x) =

A(x) daca t = 0
d
dx
A
(t1)
(x) daca 1 t n 1
0 daca t n.
Dndu-se reprezentarea prin coecieni (a
0
, a
1
, . . . , a
n1
) a lui A(x) i un punct x
0
, dorim s
determinm A
(t)
(x
0
) pentru t = 0, 1, . . . , n 1.
a. Fie coecienii b
0
, b
1
, . . . , b
n1
, astfel nct
A(x) =
n1

j=0
b
j
(x x
0
)
j
.
Artai cum se calculeaz A
(t)
(x
0
), pentru t = 0, 1, . . . , n 1, n timp O(n).
Probleme 685
b. Explicai cum putem gsi b
0
, b
1
, . . . , b
n1
n timp O(nlg n), dndu-se A(x
0
+
k
n
), pentru
k = 0, 1, . . . , n 1.
c. Demonstrai c
A(x
0
+
k
n
) =
n1

i=0

kr
n
r!
n1

j=0
f(j)g(r j)

,
unde f(j) = a
j
j! i
g(l) =

x
l
0
/(l)! daca (n 1) l 0
0 daca 1 l n 1.
d. Explicai cum se poate evalua A(x
0
+
k
n
) pentru k = 0, 1, . . . , n 1 n timp O(nlg n).
32-4 Evaluarea polinoamelor n puncte multiple
Am vzut c problema evalurii unui polinom cu limita de grad n 1 poate rezolvat n timp
O(n), utiliznd schema lui Horner. Am descoperit, de asemenea, c un astfel de polinom poate
evaluat n toate cele n rdcini complexe de ordinul n ale unitii n timp O(nlg n) utiliznd
TFR. Vom vedea cum putem s evalum un polinom cu limita de grad n n n puncte arbitrare
n timp O(nlg
2
n).
Pentru aceasta, vom utiliza faptul c putem calcula polinomul rest al mpririi unui polinom
la altul n timp O(nlg n), rezultat pe care l vom accepta fr demonstraie. De exemplu, restul
mpririi lui 3x
3
+x
2
3x+1 la x
2
+x+2 este (3x
3
+x
2
3x+1) mod (x
2
+x+2) = 7x+5. Dndu-
se reprezentarea prin coecieni a unui polinom A(x) =

n1
k=0
a
k
x
k
i n puncte x
0
, x
1
, . . . , x
n1
,
dorim s calculm n valori A(x
0
), A(x
1
), . . . , A(x
n1
). Pentru 0 i j n 1, denim
polinoamele P
ij
(x) =

j
k=i
(x x
k
) i Q
ij
(x) = A(x) mod P
ij
(x). De notat c Q
ij
(x) are limita
de grad cel mult j i.
a. Demonstrai c A(x) mod (x z) = A(z) pentru orice punct z.
b. Demonstrai c Q
kk
(x) = A(x
k
) i c Q
0,n1
(x) = A(x).
c. Demonstrai c, pentru i k j, avem Q
ik
(x) = Q
ij
(x) mod P
ik
(x) i Q
kj
(x) =
Q
ij
(x) mod P
kj
(x).
d. Dai un algoritm n timp O(nlg
2
n) pentru a evalua A(x
0
), A(x
1
), . . . , A(x
n1
).
32-5 TFR utiliznd aritmetic modular
Aa cum s-a denit, transformata Fourier discret necesit utilizarea numerelor complexe, ceea ce
poate conduce la o pierdere de precizie datorat erorilor de rotunjire. Pentru anumite probleme,
se tie c rspunsul conine doar numere ntregi i este de dorit s utilizm o variant a TFR
bazat pe aritmetica modular pentru a garanta c rspunsul este calculat exact. Un exemplu
de astfel de problem este aceea a nmulirii a dou polinoame cu coecieni numere ntregi.
Exerciiul 32.2-6 d o astfel de abordare ce utilizeaz un modul de lungime (n) bii pentru a
realiza o TFD pe n puncte. Aceast problem ofer o alt abordare care utilizeaz un modul de
lungime rezonabil O(lg n); ea necesit nelegerea materialului din capitolul 33. Fie n o putere
a lui 2.
686 Capitolul 32 Polinoame i TFR
a. S presupunem c dorim s cutm cel mai mic k, astfel ca p = kn + 1 s e prim. Vom
da un argument euristic simplu, care justic de ce ne ateptm ca valoarea lui k s e
aproximativ lg n. (Valoarea lui k ar putea mult mai mare sau mult mai mic, dar este
rezonabil s examinm candidatul O(lg n) ca valoare a lui k n medie.) Cum ne ateptm
s e lungimea lui p comparativ cu lungimea lui n?
Fie g un generator al lui Z

p
i e w = g
k
mod p.
b. Argumentai c TFD i inversa TFD sunt operaii bine denite modulo p, unde w este
utilizat ca rdcin principal de ordinul n a unitii.
c. Argumentai c TFR i inversa sa pot fcute s lucreze modulo p n timp O(nlg n),
unde operaiile pe cuvinte de lungime O(lg n) dureaz o unitate de timp. Presupunem c
algoritmul primete la intrare p i w.
d. Calculai TFD modulo p = 17 a vectorului (0, 5, 3, 7, 7, 2, 1, 6). De notat c g = 3 este
un generator al lui Z

17
.
Note bibliograce
Press, Flannery, Teukolsky i Vetterling [161, 162] conine o bun descriere a transformatei
Fourier rapide i a aplicaiilor sale. Pentru o excelent introducere n prelucrarea semnalelor, o
aplicaie binecunoscut i rspndit a domeniului TFR, recomandm textul lui Oppenheim i
Willsky [153].
Muli autori atribuie lui Cooley i Tuckey [51] descoperirea TFR prin anii 60. De fapt, TFR
a fost descoperit cu mult timp nainte, dar importana sa nu a fost pe deplin neleas naintea
apariiei calculatoarelor numerice moderne. Press, Flannery, Teukolsky i Vetterling atribuie
originile metodei lui Runge i Knig (1924).
33 Algoritmi din teoria numerelor
Teoria numerelor a fost cndva considerat ca ind un subiect frumos, dar fr a avea o mare
valoare n matematica pur. Astzi, algoritmii din teoria numerelor se utilizeaz des, datorit, n
mare parte, inventrii schemelor criptograce bazate pe numere prime mari. Flexibilitatea acestor
scheme rezid n abilitatea noastr de a gsi uor numere prime mari, n timp ce securitatea lor
rezid n imposibilitatea noastr de a factoriza produsul de numere prime mari. Acest capitol
prezint unele aspecte ale teoriei numerelor i algoritmii asociai care stau la baza unor astfel de
aplicaii.
n seciunea 33.1 se introduc conceptele de baz din teoria numerelor, cum ar divizibilitatea,
echivalena modular i factorizarea unic. n seciunea 33.2 se studiaz unul dintre cei mai vechi
algoritmi: algoritmul lui Euclid pentru calculul celui mai mare divizor comun a doi ntregi. n
seciunea 33.3 se revd conceptele aritmeticii modulare. n seciunea 33.4 se studiaz mulimea
multiplilor unui numr dat a, modulo n i se arat cum se gsesc toate soluiile ecuaiei ax
b (mod n) utiliznd algoritmul lui Euclid. Teorema chinezeasc a restului este prezentat n
seciunea 33.5. n seciunea 33.6 se consider puterile modulo n ale unui numr dat a i se
prezint un algoritm de ridicare repetat la ptrat pentru calculul ecient al lui a
b
mod n, cnd
a, b i n sunt date. Aceast operaie se a la baza testului ecient al numerelor prime. Seciunea
33.7 descrie sistemul de criptare RSA cu cheie public. n seciunea 33.8 se descrie o randomizare
a testului de numr prim care poate utilizat pentru a gsi ecient numere prime mari, ceea ce
este o sarcin esenial n crearea cheilor pentru sistemul de criptare RSA. n nal, seciunea 33.9
trece n revist o metod euristic simpl, dar ecient pentru factorizarea ntregilor mici. Este
neobinuit faptul c factorizarea este o problem pe care unii oameni ar dori-o de nerezolvat,
deoarece securitatea RSA depinde de dicultile de factorizare ale ntregilor mari.
Dimensiunea intrrilor i costul calculelor aritmetice
Deoarece vom lucra cu numere ntregi mari, avem nevoie s ne formm anumite idei privind
dimensiunea unei intrri i costul operaiilor aritmetice elementare.
n acest capitol, prin intrare mare, de obicei, se nelege o intrare care conine ntregi
mari i nu o intrare care conine muli ntregi (ca n cazul sortrii). Astfel, vom msura
dimensiunea unei intrri n termenii necesari pentru a reprezenta acea intrare
i nu doar n numrul de ntregi de la intrare. Un algoritm avnd ca date de intrare numerele
ntregi a
1
, a
2
, . . . , a
k
este un algoritm polinomial dac se execut ntr-un timp polinomial n
lg a
1
, lg a
2
, . . . , lg a
k
, adic n timp polinomial n lungimile datelor de intrare codicate binar.
n majoritatea situaiilor din aceast carte, am considerat c este convenabil s tratm
operaiile aritmetice elementare (nmuliri, mpriri sau calculul resturilor) ca operaii primitive
care necesit un timp de o unitate. Calculnd numrul de operaii aritmetice n acest fel, avem o
baz pentru a face o estimare rezonabil a timpului real de execuie al algoritmului pe calculator.
Operaiile elementare pot consumatoare de timp, mai ales cnd intrrile sunt mari. Devine
convenabil s msurm ct de multe operaii pe bii necesit un algoritm de teoria numerelor.
n acest mod, o nmulire a dou numere ntregi reprezentate pe bii, prin metode obinuite,
utilizeaz (
2
) operaii pe bii. Similar, operaia de mprire a unui ntreg reprezentat pe
bii printr-un ntreg mai scurt sau operaia de calcul a restului mpririi unui ntreg reprezentat
688 Capitolul 33 Algoritmi din teoria numerelor
pe bii la un ntreg mai scurt, poate fcut ntr-un timp (
2
) prin algoritmi simpli (vezi
exerciiul 33.1-11). Sunt cunoscute metode mai rapide. De exemplu, o metod simpl divide i
stpnete pentru nmulirea a doi ntregi reprezentai pe bii are un timp de execuie de
(
lg
2
3
), iar cea mai rapid metod cunoscut are un timp de execuie de ( lg lg lg ). Din
motive practice, totui algoritmul cu timpul (
2
) este cel mai bun i vom folosi aceast limit
ca o baz pentru analiza noastr.
n acest capitol, algoritmii sunt, n general, analizai att n termenii numrului de operaii
aritmetice ct i ai numrului de operaii pe bii pe care le necesit.
33.1. Noiuni elementare de teoria numerelor
Aceast seciune permite o scurt trecere n revist a noiunilor din teoria elementar
a numerelor privind mulimea numerelor ntregi Z = . . . , 2, 1, 0, 1, 2, . . . i mulimea
numerelor naturale N = 0, 1, 2, . . ..
Divizibilitate i divizori
Noiunea ca un ntreg s e divizibil cu un altul este de baz n teoria numerelor. Notaia
d [ a (se citete d divide pe a) nseamn c a = kd pentru un anumit ntreg k. Orice ntreg
divide pe 0. Dac a > 0 i d [ a, atunci [d[ [a[. Dac d[a, mai spunem c a este multiplu al
lui d. Dac d nu divide pe a, vom scrie d [a.
Dac d [ a i d 0, spunem c d este un divizor al lui a. S observm c d [ a dac i
numai dac d [ a, aa c nu se pierde din generalitate dac denim divizorii ca ind nenegativi,
nelegnd c negativul oricrui divizor al lui a este, de asemenea, divizor al lui a. Un divizor al
unui ntreg a este cel puin 1 i nu este mai mare dact [a[. De exemplu, divizorii lui 24 sunt 1,
2, 3, 4, 6, 8, 12 i 24.
Orice ntreg a este divizibil prin divizorii triviali 1 i a. Divizorii proprii ai lui a se numesc
factori . De exemplu, factorii lui 20 sunt 2, 4, 5 i 10.
Numere prime i compuse
Un ntreg a > 1 ai crui divizori sunt numai divizorii triviali 1 i a se spune c este un numr
prim (sau mai simplu un prim). Numerele prime au multe proprieti speciale i joac un rol
critic n teoria numerelor. Numerele prime mici sunt, n ordine:
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, . . . .
Exerciiul 33.1-1 cere s se demonstreze c exist o innitate de numere prime. Un ntreg
a > 1 care nu este prim este un numr compus (sau mai simplu compus). De exemplu, 39
este compus deoarece 3 [ 39. Se spune c ntregul 1 este o unitate i nu este nici prim i nici
compus. Similar, ntregul 0 i toi ntregii negativi nu sunt nici primi i nici compui.
Teorema mpririi, resturi i echivalen modular
Dac se d un ntreg n, ntregii pot partiionai n ntregi care sunt multipli de n i cei care
nu sunt multipli de n. Teoria numerelor se bazeaz pe o ranare a acestei partiionri obinut
33.1. Noiuni elementare de teoria numerelor 689
prin clasicarea nemultiplilor lui n potrivit resturilor lor cnd sunt mprii la n. Aceast ranare
se bazeaz pe urmtoarea teorem. Demonstraia ei nu va dat aici (vezi, de exemplu, Niven
i Zuckerman [151]).
Teorema 33.1 (Teorema mpririi) Pentru orice ntreg a i orice ntreg pozitiv n, exist q
i r unici, astfel nct 0 r < n i a = qn +r.
Valoarea q = a/n| este ctul mpririi. Valoarea r = a mod n este restul ( sau reziduul )
mpririi. n [ a dac i numai dac a mod n = 0. Rezult c
a = a/n|n + (a mod n) (33.1)
sau
a mod n = a a/n|n. (33.2)
Avnd noiunea de rest bine denit, este convenabil s furnizm o notaie special pentru
a indica egalitatea resturilor. Dac (a mod n) = (b mod n), vom scrie a b (mod n) i vom
spune c a este echivalent cu b, modulo n. Cu alte cuvinte, a b (mod n) dac a i b au acelai
rest la mprirea cu n. Echivalent, a b (mod n) dac i numai dac n [ (b a). Scriem a b
(mod n) dac a nu este echivalent cu b modulo n. De exemplu, 61 6 (mod 11). De asemenea,
13 22 2 (mod 5).
ntregii pot mprii n n clase de echivalen potrivit resturilor lor modulo n. Clasa de
echivalen modulo n care conine un ntreg a este
[a]
n
= a +kn : k Z.
De exemplu, [3]
7
= . . . , 11, 4, 3, 10, 17, . . .; alte notaii pentru aceast mulime sunt
[4]
7
i [10]
7
. Scrierea a [b]
n
reprezint acelai lucru cu scrierea a b (mod n). Mulimea
tuturor acestor clase de echivalen este
Z
n
= [a]
n
: 0 a n 1. (33.3)
Adesea se folosete deniia
Z
n
= 0, 1, . . . , n 1, (33.4)
care ar trebui citit ca ind echivalent cu relaia (33.3), subnelegnd c 0 reprezint [0]
n
,
1 reprezint [1]
n
i aa mai departe; ecare clas este reprezentat prin cel mai mic element
nenegativ. Fundamentul claselor de echivalen trebuie, totui reinut. De exemplu, o referire la
1 ca membru al lui Z
n
este o referire la [n 1]
n
deoarece 1 n 1 (mod n).
Divizori comuni i cel mai mare divizor comun
Dac d este un divizor al lui a i al lui b, atunci d este un divizor comun al lui a i b. De
exemplu, divizorii lui 30 sunt 1, 2, 3, 5, 6, 10, 15 i 30, divizorii comuni ai lui 24 i 30 sunt 1, 2,
3 i 6. S observm c 1 este un divizor comun pentru orice doi ntregi.
O proprietate important a divizorilor comuni este
d [ a i d [ b implic d [ (a +b) i d [ (a b). (33.5)
690 Capitolul 33 Algoritmi din teoria numerelor
Mai general, avem
d [ a i d [ b implic d [ (ax +by) (33.6)
pentru orice ntregi x i y. Dac a [ b, atunci sau |a| |b| sau b = 0, ceea ce implic faptul c
a [ b i b [ a implic a = b. (33.7)
Cel mai mare divizor comun a doi ntregi a i b, nu ambii nuli, este cel mai mare dintre
divizorii comuni ai lui a i b; se noteaz cu cmmdc(a, b). De exemplu, cmmdc(24, 30) = 6,
cmmdc(5, 7) = 1 i cmmdc(0, 9) = 9. Dac a i b nu sunt ambii nuli, atunci cmmdc(a, b) este
un ntreg ntre 1 i min([a[, [b[). Prin deniie, cmmdc(0, 0) = 0. Aceast deniie este necesar
pentru a putea standardiza proprietile funciei cmmdc (cum ar relaia (33.11) de mai jos).
Proprietile elementare ale funciei cmmdc sunt:
cmmdc(a, b) = cmmdc(b, a), (33.8)
cmmdc(a, b) = cmmdc(a, b), (33.9)
cmmdc(a, b) = cmmdc([a[, [b[), (33.10)
cmmdc(a, 0) = [a[, (33.11)
cmmdc(a, ka) = [a[ pentru orice k Z. (33.12)
Teorema 33.2 Dac a i b sunt ntregi, nu ambii nuli, atunci cmmdc(a, b) este cel mai mic
element pozitiv al mulimii ax +by : x, y Z de combinaii liniare ale lui a i b.
Demonstraie. Fie s o cea mai mic (pozitiv) combinaie liniar ntre a i b, astfel nct
s = ax +by pentru x, y Z. Fie q = a/s|. Relaia 33.2 implic
a mod s = a qs = a q(ax +by) = a(1 qx) +b(qy).
astfel, a mod s este o combinaie liniar a lui a i b. Dar, ntruct a mod s < s, avem a mod
s = 0, deoarece s este cea mai mic astfel de combinaie liniar pozitiv. De aceea, s [ a i, din
motive analoge, s [ b. Astfel, s este un divizor comun al lui a i b i cmmdc(a, b) s. Ecuaia
(33.6) implic faptul c cmmdc(a, b) [ s deoarece cmmdc(a, b) divide att pe a ct i pe b i s este
o combinaie liniar a lui a i b. Dar cmmdc(a, b) [ s i s > 0 implic faptul c cmmdc(a, b) s.
Combinnd cmmdc(a, b) s i cmmdc(a, b) s, obinem cmmdc(a, b) = s; concluzionm c s
este cel mai mare divizor comun al lui a i b.
Corolarul 33.3 Pentru orice ntregi a i b, dac d [ a i d [ b, atunci d [ cmmdc(a, b).
Demonstraie. Acest corolar rezult din (33.6), deoarece cmmdc(a, b) este o combinaie liniar
a lui a i b conform teoremei 33.2.
Corolarul 33.4 Pentru orice ntregi a i b i orice ntreg n nenegativ,
cmmdc(an, bn) = n cmmdc(a, b).
Demonstraie. Dac n = 0, corolarul este trivial. Dac n > 0, atunci cmmdc(an, bn) este cel
mai mic element pozitiv al mulimii anx +bny, care este de n ori cel mai mic element pozitiv
al mulimii ax +by.
Corolarul 33.5 Pentru orice numere ntregi pozitive n, a i b, dac n [ ab i cmmdc(a, n) = 1,
atunci n [ b.
Demonstraie. Demonstraia este lsat pe seama cititorului (exerciiul 33.1-4).
33.1. Noiuni elementare de teoria numerelor 691
ntregi relativ primi
Dou numere ntregi a, b sunt relativ prime dac singurul lor divizor comun este 1, adic,
dac cmmdc(a, b) = 1. De exemplu, 8 i 15 sunt relativ prime, deoarece divizorii lui 8 sunt 1,
2, 4 i 8, n timp ce divizorii lui 15 sunt 1, 3, 5 i 15. Teorema urmtoare arm c, dac dou
numere ntregi sunt ecare relativ prime cu un ntreg p, atunci produsul lor este relativ prim cu
p.
Teorema 33.6 Pentru orice numere ntregi a, b i p, dac cmmdc(a, p) = 1 i cmmdc(b, p) = 1,
atunci cmmdc(ab, p) = 1.
Demonstraie. Din teorema 33.2 rezult c exist numerele ntregi x, y, x
t
i y
t
, astfel nct
ax +py = 1,
bx
t
+py
t
= 1.
nmulind aceste ecuaii i rearanjndu-le, avem
ab(xx
t
) +p(ybx
t
+y
t
ax +pyy
t
) = 1.
ntruct 1 este o combinaie liniar a lui ab i p, un apel la teorema 33.2 completeaz
demonstraia.
Spunem c numerele ntregi n
1
, n
2
, . . . , n
k
sunt relativ prime dou cte dou dac, ori
de cte ori i = j, avem cmmdc(n
i
, n
j
) = 1.
Unicitatea factorizrii
Un fapt elementar, dar important, despre divizibilitatea cu numere prime este urmtoarea
teorem.
Teorema 33.7 Pentru toate numerele prime p i toi ntregii a, b, dac p [ ab, atunci p [ a sau
p [ b.
Demonstraie. Presupunem prin absurd c p [ ab dar p [ a i p [ b. Atunci, cmmdc(a, p) = 1 i
cmmdc(b, p) = 1, deoarece singurii divizori ai lui p sunt 1 i p, iar prin ipotez p nu divide nici
pe a nici pe b. Teorema 33.6 implic faptul c cmmdc(ab, p) = 1, contrazicnd ipoteza c p [ ab,
deoarece p [ ab implic cmmdc(ab, p) = p. Aceast contradicie ncheie demonstraia.
O consecin a teoremei 33.7 este faptul c un numr ntreg are o factorizare unic n numere
prime.
Teorema 33.8 (Unicitatea factorizrii) Un ntreg compus a poate scris exact ntr-un
singur mod ca produs de forma
a = p
e
1
1
p
e
2
2
p
e
r
r
unde p
i
sunt prime, p
1
< p
2
< < p
r
, iar e
i
sunt numere ntregi pozitive.
Demonstraie. Demonstraia este lsat pe seama cititorului (exerciiul 33.1-10).
Ca un exemplu, numrul 6000 poate factorizat n mod unic astfel 2
4
3 5
3
.
692 Capitolul 33 Algoritmi din teoria numerelor
Exerciii
33.1-1 Demonstrai c exist o innitate de numere prime. ( se va arta c nici unul
din numerele prime p
1
, p
2
, . . . , p
k
nu divide (p
1
p
2
p
k
) + 1.)
33.1-2 Demonstrai c, dac a [ b i b [ c, atunci a [ c.
33.1-3 Demonstrai c, dac p este prim i 0 < k < p, atunci cmmdc(k, p) = 1.
33.1-4 Demonstrai corolarul 33.5.
33.1-5 Demonstrai c, dac p este prim i 0 < k < p, atunci p [

p
k

. S se concluzioneze c,
pentru orice numere ntregi a, b i orice numr prim p,
(a +b)
p
a
p
+b
p
(mod p).
33.1-6 Demonstrai c, oricare ar a i b numere ntregi astfel nct a [ b i b > 0, atunci
(x mod b) mod a = x mod a
pentru orice x. Demonstrai, n aceleai ipoteze, c
x y (mod b) implic x y (mod a)
pentru orice numere ntregi x i y.
33.1-7 Pentru orice numr ntreg k > 0, spunem c n este o k putere dac exist un numr
ntreg a, astfel nct a
k
= n. Spunem c n > 1 este o putere nevid dac el este o k putere
pentru un anumit numr ntreg k > 1. Artai cum se determin, ntr-un timp polinomial n ,
dac un numr ntreg dat n reprezentat pe bii este o putere nevid.
33.1-8 Demonstrai relaiile (33.8)(33.12).
33.1-9 Artai c operatorul cmmdc este asociativ. Adic, trebuie s artai c, pentru orice
numere ntregi a, b i c,
cmmdc(a, cmmdc(b, c)) = cmmdc(cmmdc(a, b), c).
33.1-10 Demonstrai teorema 33.8.
33.1-11 Dai algoritmi ecieni pentru mprirea unui numr ntreg reprezentat pe bii la un
numr ntreg mai mic i pentru determinarea restului mpririi unui numr ntreg reprezentat
pe bii la un numr ntreg mai mic. Algoritmii trebuie s se execute ntr-un timp de ordinul
O(
2
).
33.1-12 Dai un algoritm ecient de conversie a unui numr ntreg (binar) reprezentat pe
bii n reprezentare zecimal. Argumentai faptul c, dac nmulirea sau mprirea numerelor
ntregilor a cror lungime este cel mult necesit un timp M(), atunci conversia din binar
n zecimal poate realizat ntr-un timp de ordinul (M() lg ). ( s se utilizeze o
concepie divide i stpnete, care obine jumtile superioar i inferioar ale rezultatului cu
recurene separate.)
33.2. Cel mai mare divizor comun 693
33.2. Cel mai mare divizor comun
n aceast seciune, utilizm algoritmul lui Euclid pentru a calcula ecient cel mai mare
divizor comun a doi ntregi. Analiza timpului de execuie ne conduce la o legtur surprinztoare
cu numerele Fibonacci, care ne ofer date de intrare defavorabile pentru algoritmul lui Euclid.
n aceast seciune ne restrngem la numere ntregi nenegative. Aceast restricie este
justicat prin relaia (33.10), care arm c cmmdc(a, b) = cmmdc([a[, [b[).
n principiu, putem calcula cmmdc(a, b) pentru ntregii pozitivi a i b din factorizarea n
numere prime a lui a i b. ntr-adevr, dac
a = p
e
1
1
p
e
2
2
p
e
r
r
, (33.13)
b = p
f
1
1
p
f
2
2
p
f
r
r
, (33.14)
folosind exponeni 0 pentru a obine aceleai numere prime p
1
, p
2
, . . . , p
r
att pentru a ct i
pentru b, atunci
cmmdc(a, b) = p
min(e
1
,f
1
)
1
p
min(e
2
,f
2
)
2
p
min(e
r
,f
r
)
r
(33.15)
Aa cum se va arta n seciunea 33.9, cel mai bun algoritm pentru factorizare, pn n
prezent, nu se execut ntr-un timp polinomial. Astfel, aceast concepie de calcul al celui mai
mare divizor comun este puin probabil s produc un algoritm ecient.
Algoritmul lui Euclid pentru calculul celui mai mare divizor comun se bazeaz pe urmtoarea
teorem.
Teorema 33.9 (Teorema CMMDC recursiv) Pentru orice ntreg nenegativ a i pentru
orice ntreg pozitiv b,
cmmdc(a, b) = cmmdc(b, a mod b).
Demonstraie. Vom arta c cmmdc(a, b) i cmmdc(b, a mod b) se divid unul pe altul, aa c,
prin relaia (33.7), ei trebuie s e egali (deoarece sunt nenegativi).
Artm mai nti c cmmdc(a, b) [ cmmdc(b, a mod b). Dac d = cmmdc(a, b), atunci d [ a
i d [ b. Din (33.2), (a mod b) = a qb, unde q = a/b|. ntruct (a mod b) este o combinaie
liniar a lui a i b, relaia (33.6) implic faptul c d [ (a mod b). De aceea, ntruct d [ b i
a [ (a mod b), corolarul 33.3 implic faptul c d [ cmmdc(b, a mod b) sau echivalent,
cmmdc(a, b) [ cmmdc(b, a mod b). (33.16)
A arta c cmmdc(b, a mod b) [ cmmdc(a, b) este aproape acelai lucru. Dac acum d =
cmmdc(b, a mod b), atunci d [ b i d [ (a mod b). ntruct a = qb + (a mod b), unde q = a/b|,
deci a este o combinaie liniar dintre b i (a mod b). Din ecuaia (33.6), deducem c d [ a.
ntruct d [ b i d [ a, avem d [ cmmdc(a, b) conform corolarului 33.3 sau echivalentul,
cmmdc(b, a mod b) [ cmmdc(a, b). (33.17)
Pentru a completa demonstraia, folosim relaia (33.7) pentru a combina relaiile (33.16) i
(33.17).
694 Capitolul 33 Algoritmi din teoria numerelor
Algoritmul lui Euclid
Urmtorul algoritm cmmdc este descris n lui Euclid (circa 300 .Hr.), dei el
poate avea o origine mai timpurie. Este scris ca un program recursiv bazat direct pe teorema
33.9. Intrrile a i b sunt ntregi nenegativi arbitrari.
Euclid(a, b)
1: dac b = 0 atunci
2: returneaz a
3: altfel
4: returneaz Euclid(b, a mod b)
Ca un exemplu de execuie al algoritmului Euclid, considerm calculul lui cmmdc(30, 21):
Euclid(30, 21) = Euclid(21, 9) = Euclid(9, 3) = Euclid(3, 0) = 3.
n acest calcul exist trei apeluri recursive ale lui Euclid.
Corectitudinea lui Euclid este garantat de teorema 33.9 i de faptul c, dac algoritmul
returneaz pe a n linia 2, atunci b = 0, deci cmmdc(a, b) = cmmdc(a, 0) = a, conform relaiei
(33.11). Algoritmul nu poate intra n ciclu innit, deoarece al doilea argument descrete strict
la ecare apel recursiv. De aceea, Euclid se termin totdeauna cu rspunsul corect.
Timpul de execuie al algoritmului lui Euclid
Analizm timpul de execuie pentru Euclid n cazul cel mai defavorabil, n funcie de
dimensiunile lui a i b. Presupunem, cu o mic pierdere a generalitii, c a > b 0. Aceast
presupunere poate justicat prin observaia c, dac b > a 0, atunci Euclid(a, b) face
imediat apelul la Euclid(b, a). Adic, dac primul argument este mai mic dect cel de al doilea,
atunci Euclid realizeaz un apel recursiv pentru a-i permuta parametrii i, apoi, continu.
Similar, dac b = a > 0, procedura se termin dup un apel recursiv deoarece a mod b = 0.
Timpul total de execuie al lui Euclid este proporional cu numrul apelurilor recursive pe
care le face. Analiza noastr face apel la numerele F
k
ale lui Fibonacci, denite prin recurena
(2.13).
Lema 33.10 Dac a > b 0 i apelul Euclid(a, b) execut k 1 apeluri recursive, atunci
a F
k+2
i b F
k+1
.
Demonstraie. Demonstraia se face prin inducie n raport cu k. Fie k = 1, atunci, b 1 = F
2
i, deoarece a > b, trebuie s avem a 2 = F
3
. Deoarece b > (a mod b), la ecare apel
recursiv, primul argument este strict mai mare dect al doilea, de aceea, presupunerea c a > b
se adeverete pentru ecare apel recursiv.
Presupunem acum c lema este adevrat cnd se realizeaz k 1 apeluri recursive; vom
demonstra atunci c ea este adevrat i pentru k apeluri recursive. ntruct k > 0, avem b > 0,
iar Euclid(a, b) apeleaz recursiv pe Euclid(b, a mod b) care, la rndul su, execut k 1
apeluri recursive. Ipotezele induciei implic faptul c b F
k+1
(astfel se demonstreaz o parte
a lemei), iar (a mod b) F
k
. Avem
b + (a mod b) = b + (a a/b|b) a,
33.2. Cel mai mare divizor comun 695
deoarece a > b > 0 implic a/b| 1. Astfel,
a b + (a mod b) F
k+1
+F
k
= F
k+2
.
Urmtoarea teorem este un corolar imediat al acestei leme.
Teorema 33.11 (Teorema lui Lam) Pentru orice ntreg k 1, dac a > b 0 i b < F
k+1
,
atunci apelul procedurii Euclid(a, b) execut mai puin de k apeluri recursive.
Putem arta c limita superioar din teorema 33.11 este cea mai bun posibil. n consecin,
numerele lui Fibonacci consecutive sunt cele mai defavorabile cazuri de intrare pentru Euclid.
ntruct Euclid(F
3
, F
2
) execut exact un apel recursiv i deoarece pentru k 2 avem
F
k+1
mod F
k
= F
k1
, avem:
cmmdc(F
k+1
, F
k
) = cmmdc(F
k
, (F
k+1
mod F
k
)) = cmmdc(F
k
, F
k1
).
Astfel, Euclid(F
k+1
, F
k
) itereaz exact de k 1 ori, atingnd limita superioar din teorema
33.11.
Deoarece F
k
este aproximativ
k
/

5, unde este raportul de aur (1 +

5)/2 denit prin


ecuaia (2.14), numrul apelurilor recursive n Euclid este O(lg b). (Vezi exerciiul 33.2-5
pentru o limit mai strns.) Dac se aplic Euclid la dou numere reprezentate pe bii,
atunci procedura va efectua O() operaii aritmetice i O(
3
) operaii pe bii (presupunnd
c nmulirile i mpririle numerelor reprezentate pe bii necesit O(
2
) operaii pe bii).
Problema 33-2 cere s artm c O(
2
) este o limit a numrului de operaii pe bii.
Forma extins a algoritmului lui Euclid
Rescriem algoritmul lui Euclid pentru a determina informaii suplimentare utile. n special,
extindem algoritmul pentru a calcula coecienii ntregi x i y, astfel nct
d = cmmdc(a, b) = ax +by. (33.18)
S observm c x i y pot negativi sau zero. Mai trziu, aceti coecieni vor utili n
calculul inverselor multiplicative modulare.
Procedura Euclid-Extins are la intrare o pereche arbitrar de ntregi nenegativi i
returneaz un triplet de forma (d, x, y) care satisface relaia (33.18).
Euclid-Extins(a, b)
1: dac b = 0 atunci
2: returneaz (a, 1, 0)
3: (d
t
, x
t
, y
t
) Euclid-Extins(b, a mod b)
4: (d, x, y) (d
t
, y
t
, x
t
a/b|y
t
)
5: returneaz (d, x, y)
Figura 33.1 ilustreaz execuia lui Euclid-Extins pentru calculul lui cmmdc(99, 78).
Procedura Euclid-Extins este o variant a procedurii Euclid. Linia 1 este echivalent cu
testul b = 0 din linia 1 a procedurii Euclid. Dac b = 0, Euclid-Extins returneaz nu
696 Capitolul 33 Algoritmi din teoria numerelor
Figura 33.1 Un exemplu de aplicare a lui Euclid-Extins asupra intrrilor 99 i 78. Fiecare linie arat
un nivel al recursivitii: valorile de intrare a i b, valoarea calculat ]a/b i valorile returnate d, x i
y. Tripletul returnat (d, x, y) devine tripletul (d

, x

, y

) utilizat n calcul la nivelul mai nalt, urmtor al


recursivitii. Apelul Euclid-Extins(99, 78) returneaz (3, 11, 14), astfel nct cmmdc(99, 78) = 3 i
cmmdc(99, 78) = 3 = 99 (11) + 78 14.
numai d = a n linia 2, ci i coecienii x = 1 i y = 0, astfel nct a = ax + by. Dac b = 0,
Euclid-Extins calculeaz nti (d
t
, x
t
, y
t
), astfel nct d
t
= cmmdc(b, a mod b) i
d
t
= bx
t
+ (a mod b)y
t
. (33.19)
Ca la Euclid, avem n acest caz d = cmmdc(a, b) = d
t
= cmmdc(b, a mod b). Pentru a obine
pe x i y, astfel nct d = ax+by, ncepem prin rescrierea ecuaiei (33.19) utiliznd relaia d = d
t
i relaia (33.2):
d = bx
t
+ (a a/b|b)y
t
= ay
t
+b(x
t
a/b|y
t
).
Astfel, alegnd x = y
t
i y = x
t
a/b|y
t
, se veric relaia d = ax+by, ceea ce demonstreaz
corectitudinea lui Euclid-Extins.
ntruct numrul apelurilor recursive din Euclid este egal cu numrul apelurilor recursive
din Euclid-Extins, timpul de execuie pentru cele dou proceduri este acelai, abstracie fcnd
de un factor constant. Adic, pentru a > b > 0, numrul apelurilor recursive este O(lg b).
Exerciii
33.2-1 Demonstrai c relaiile (33.13)(33.14) implic relaia (33.15).
33.2-2 Calculai valorile (d, x, y) care sunt ieirile la apelul Euclid-Extins(899, 493).
33.2-3 Demonstrai c, oricare ar ntregii a, k i n,
cmmdc(a, n) = cmmdc(a +kn, n).
33.2-4 Rescriei procedura Euclid ntr-o form iterativ care s foloseasc numai o cantitate
constant de memorie (adic, memoreaz numai un numr constant de valori ntregi).
33.2-5 Dac a > b 0, artai c apelul lui Euclid(a, b) implic cel mult 1 + log

b apeluri
recursive. S se mbunteasc aceast limit la 1 + log

(b/cmmdc(a, b)).
33.2-6 Ce returneaz Euclid-Extins(F
k+1
, F
k
)? Demonstrai corectitudinea rspunsului dat.
33.3. Aritmetic modular 697
33.2-7 Vericai ieirea (d, x, y) a lui Euclid-Extins(a, b) artnd c, dac d [ a, d [ b i
d = ax +by, atunci d = cmmdc(a, b).
33.2-8 Denii funcia cmmdc pentru mai mult de dou argumente prin relaia recursiv
cmmdc(a
0
, a
1
, . . . , a
n
) = cmmdc(a
0
, cmmdc(a
1
, . . . , a
n
)). Artai c cmmdc returneaz acelai
rspuns, independent de ordinea n care se specic argumentele sale. Artai cum se gsesc
x
0
, x
1
, . . . , x
n
, astfel nct cmmdc(a
0
, a
1
, . . . , a
n
) = a
0
x
0
+a
1
x
1
+ +a
n
x
n
. Artai c numrul
de mpriri realizat de algoritmul respectiv este de ordinul O(n + lg(max
i
a
i
)).
33.2-9 Denii cmmmc(a
1
, a
2
, . . . , a
n
) ca ind cel mai mic multiplu comun al numerelor
ntregi a
1
, a
2
, . . . , a
n
, adic cel mai mic ntreg nenegativ care este multiplu al ecrui a
i
. Artai
cum se calculeaz ecient cmmmc(a
1
, a
2
, . . . , a
n
) folosind operaia cmmdc (cu dou argumente)
ca subrutin.
33.2-10 Demonstrai c n
1
, n
2
, n
3
i n
4
sunt relativ prime dou cte dou, dac i numai dac
cmmdc(n
1
n
2
, n
3
n
4
) = cmmdc(n
1
n
3
, n
2
n
4
) = 1. Artai c, n cazul general, n
1
, n
2
, . . . , n
k
sunt
relativ prime dou cte dou dac i numai dac o mulime de lg k| perechi de numere derivate
din n
i
sunt relativ prime.
33.3. Aritmetic modular
Informativ, putem s ne gndim la aritmetica modular ca la aritmetica obinuit pentru
numere ntregi, exceptnd faptul c, dac lucrm modulo n, atunci ecare rezultat x este nlocuit
printr-un element din 0, 1, . . . , n1, adic este echivalent cu x modulo n (adic, x este nlocuit
cu x mod n). Acest model informal este sucient dac ne limitm la operaiile de adunare, scdere
i nmulire. Un model mai formal pentru aritmetica modular, pe care l dm acum, se descrie
mai bine n cadrul teoriei grafurilor.
Grupuri nite
Un grup (S, ) este o mulime S, mpreun cu o operaie binar denit pe S, pentru
care se ndeplinesc urmtoarele proprieti.
1. nchidere: Oricare ar a, b S, avem a b S.
2. Element neutru: Exist un element e S, astfel nct e a = a e = a pentru orice
a S.
3. Asociativitate: Oricare ar a, b, c S, avem (a b) c = a (b c).
4. Invers: Pentru orice a S, exist un element unic b S, astfel nct a b = b a = e.
De exemplu, considerm grupul familiar (Z, +) al ntregilor Z cu operaia de adunare: 0 este
unitatea, iar inversul lui a este a. Dac ntr-un grup (S, ) legea este comutativ, ab = ba
oricare ar a, b S, atunci el este un grup abelian. Dac un grup (S, ) satisface condiia
[S[ < , atunci este un grup nit.
698 Capitolul 33 Algoritmi din teoria numerelor
Figura 33.2 Dou grupuri nite. Clasele de echivalen sunt notate prin elementele lor reprezentative.
(a) Grupul (Z
6
, +
6
). (b) Grupul (Z

15
,
15
).
Grupuri denite prin adunare i nmulire modular
Putem forma dou grupuri abeliene nite folosind adunarea i nmulirea modulo n, unde n
este un ntreg pozitiv. Aceste grupuri se bazeaz pe clasele de echivalen a ntregilor modulo n,
denite n seciunea 33.1.
Pentru a deni un grup pe Z
n
, este nevoie de operaii binare corespunztoare, pe care le
obinem redenind operaiile obinuite de adunare i nmulire. Este uor s denim aceste
operaii n Z
n
deoarece clasele de echivalen a doi ntregi determin n mod unic clasa de
echivalen a sumei i a produsului lor. Adic, dac a a
t
( mod n) i b b
t
( mod n), atunci
a +b a
t
+b
t
( mod n)
ab a
t
b
t
( mod n).
Astfel, denim adunarea i nmulirea modulo n, notate +
n
i
n
, dup cum urmeaz:
[a]
n
+
n
[b]
n
= [a +b]
n
, [a]
n

n
[b]
n
= [ab]
n
.
(Scderea poate denit similar pe Z
n
prin [a]
n

n
[b]
n
= [a n]
n
, dar mprirea este mai
complicat, aa cum vom vedea.) Aceste fapte justic practica obinuit i convenabil de a
utiliza cel mai mic element nenegativ al ecrei clase de echivalen ca reprezentant al ei cnd se
fac calcule n Z
n
. Adunarea, scderea i nmulirea se efectueaz obinuit asupra reprezentanilor,
dar ecare rezultat x se nlocuiete cu reprezentantul clasei sale (adic, prin x mod n).
Utiliznd aceast deniie a adunrii modulo n, denim grupul aditiv modulo n prin
(Z
n
, +
n
). Dimensiunea grupului aditiv modulo n este [Z
n
[ = n. n gura 33.2 (a) avem tabela
operaiei +
6
pentru grupul (Z
6
, +
6
).
Teorema 33.12 Sistemul (Z
n
, +
n
) este un grup abelian nit.
33.3. Aritmetic modular 699
Demonstraie. Asociativitatea i comutativitatea lui +
n
rezult din asociativitatea i comuta-
tivitatea lui +:
([a]
n
+
n
[b]
n
) +
n
[c]
n
= [(a +b) +c]
n
= [a + (b +c)]
n
= [a]
n
+
n
([b]
n
+
n
[c]
n
),
[a]
n
+
n
[b]
n
= [a +b]
n
= [b +a]
n
= [b]
n
+
n
[a]
n
.
Elementul unitate al lui (Z
n
, +
n
) este 0 (adic [0]
n
). Inversul (aditiv) al unui element a (adic,
[a]
n
) este elementul a (adic, [a]
n
sau [n a]
n
), deoarece [a]
n
+
n
[a]
n
= [a a]
n
= [0]
n
.
Utiliznd deniia nmulirii modulo n, denim grupul multiplicativ modulo n prin
(Z

n
,
n
). Elementele acestui grup aparin mulimii Z

n
a elementelor din Z
n
care sunt relativ
prime cu n:
Z

n
= [a]
n
Z
n
: cmmdc(a, n) = 1.
Pentru a vedea c Z

n
este bine denit, observm c, pentru 0 a < n, avem a (a +
kn) (mod n) pentru orice ntregi k. Din exerciiul 33.2-3, rezult c cmmdc(a, n) = 1 implic
cmmdc(a + kn, n) = 1 pentru orice ntregi k. Deoarece [a]
n
= a + kn : k Z, mulimea Z

n
este bine denit. Un exemplu de astfel de grup este
Z

15
= 1, 2, 4, 7, 8, 11, 13, 14,
unde operaia grupului este nmulirea modulo 15. (Aici notm un element [a]
15
cu a.) n gura
33.2 (b) avem grupul (Z

15
,
15
). De exemplu, 8 11 = 13 (mod 15), n Z

15
. Unitatea pentru acest
grup este 1.
Teorema 33.13 Sistemul (Z

n
,
n
) este un grup abelian nit.
Demonstraie. Teorema 33.6 implic faptul c (Z

n
,
n
) este nchis. Asociativitatea i comutati-
vitatea pot demonstrate pentru
n
, aa cum au fost ele demonstrate pentru +
n
, n demonstraia
teoremei 33.12. Elementul unitate este [1]
n
. Pentru a arta existena inversului, e a un element
al lui Z

n
i e (d, x, y) ieirea lui Euclid-Extins(a, n). Atunci, d = 1, deoarece a Z

n
i
ax +ny = 1
sau, echivalentul,
ax 1( mod n).
Astfel, [x]
n
este un invers multiplicativ al lui [a]
n
, modulo n. Demonstraia c inversul este
unic denit o amnm pn la corolarul 33.26.
Cnd vom lucra cu grupurile (Z
n
, +
n
) i (Z

n
,
n
) n restul acestui capitol, vom folosi convenia
practic de a nota clasele de echivalen prin elementele lor reprezentative i vom nota operaiile
+
n
i
n
prin notaiile obinuite + respectiv (sau juxtapunere). De asemenea, echivalenele
modulo n pot interpretate ca relaii n Z
n
. De exemplu, urmtoarele dou armaii sunt
echivalente:
ax b( mod n),
[a]
n

n
[x]
n
= [b]
n
.
700 Capitolul 33 Algoritmi din teoria numerelor
Alt convenie ar urmtoarea: cnd operaia e subneleas din context ne vom referi la
grupul (S, ) doar prin S. Astfel, ne putem referi la grupurile (Z
n
, +
n
) i (Z

n
,
n
) prin Z
n
i,
respectiv, Z

n
.
Inversul (multiplicativ) al unui element a se noteaz cu (a
1
mod n). mprirea n Z

n
se
denete prin ecuaia a/b ab
1
( mod n). De exemplu, n Z

15
avem 7
1
13 (mod 15),
deoarece 7 13 91 1 (mod 15), aa c 4/7 4 13 7 (mod 15).
Dimensiunea lui Z

n
se noteaz cu (n). Aceast funcie, cunoscut ca funcia phi a lui
Euler, satisface ecuaia
(n) = n

p ] n

1
1
p

, (33.20)
unde p variaz peste toate numerele prime care-l divid pe n (inclusiv n, dac n este prim). Nu
vom demonstra aceast formul (aici). Intuitiv, ncepem cu o list de n resturi 0, 1, , n 1
i apoi, pentru ecare numr prim p care divide pe n, eliminm de pe list ecare multiplu al
lui p. De exemplu, deoarece divizorii primi ai lui 45 sunt 3 i 5,
(45) = 45

1
1
3

1
1
5

= 45

2
3

4
5

= 24.
Dac p este prim, atunci Z

p
= 1, 2, , p 1, iar
(p) = p 1. (33.21)
Dac n este compus, atunci (n) < n 1.
Subgrupuri
Dac (S, ) este un grup, S
t
S i (S
t
, ) este, de asemenea, un grup, atunci se spune c
(S
t
, ) este un subgrup al lui (S, ). De exemplu, mulimea numerelor ntregi pare formeaz un
subgrup al ntregilor fa de operaia de adunare. Urmtoarea teorem furnizeaz un instrument
util pentru recunoaterea subgrupurilor.
Teorema 33.14 (O submulime nchis nevid a unui grup nit este un subgrup)
Dac (S, ) este un grup nit i S
t
este orice submulime a lui S astfel nct a b S
t
pentru
orice a, b S
t
, atunci (S
t
, ) este un subgrup al lui (S, ).
Demonstraie. Lsm demonstraia pe seama cititorului (exerciiul 33.3-2).
De exemplu, mulimea 0, 2, 4, 6 formeaz un subgrup al lui Z
8
, deoarece este nchis n
raport cu operaia + (adic este nchis fa de +
8
).
Urmtoarea teorem furnizeaz o restricie extrem de important asupra dimensiunii unui
subgrup.
Teorema 33.15 (Teorema lui Lagrange) Dac (S, ) este un grup nit i (S
t
, ) este un
subgrup al lui (S, ), atunci [S
t
[ este un divizor al lui [S[.
Despre un subgrup S
t
al unui grup S se spune c este subgrup propriu dac S
t
= S.
Urmtorul corolar va util n analiza procedurii de test a numerelor prime a lui Miller-Rabin
din seciunea 33.8.
Corolarul 33.16 Dac S
t
este un subgrup propriu al unui grup nit S, atunci [S
t
[ [S[/2.
33.3. Aritmetic modular 701
Subgrupuri generate de un element
Teorema 33.14 furnizeaz un mod interesant de a produce un subgrup al unui grup nit
(S, ): se alege un element a i se iau toate elementele care pot generate din a utiliznd
operaia grupului. Mai exact, denim a
(k)
pentru k 1 prin:
a
(k)
=
k

i=1
a = a a a a
. .. .
k
.
De exemplu, pentru a = 2 n grupul Z
6
, secvena a
(1)
, a
(2)
, . . . este 2, 4, 0, 2, 4, 0, 2, 4, 0, . . ..
n grupul Z
n
, avem a
(k)
= ka mod n, iar n grupul Z

n
, avem a
(k)
= a
k
mod n. Subgrupul
generat de a, notat 'a` sau ('a`, ), este denit prin:
'a` = a
(k)
: k 1.
Spunem c a genereaz subgrupul 'a` sau c a este un generator al lui 'a`. Deoarece S
este nit, 'a` este o submulime nit a lui S, posibil s coincid cu S. ntruct asociativitatea
lui implic
a
(i)
a
(j)
= a
(i+j)
,
'a` este nchis i, deci, prin teorema 33.14, 'a` este un subgrup al lui S. De exemplu, n Z
6
avem:
'0` = 0,
'1` = 0, 1, 2, 3, 4, 5,
'2` = 0, 2, 4.
Similar, n Z

7
, avem:
'1` = 1,
'2` = 1, 2, 4,
'3` = 1, 2, 3, 4, 5, 6.
Ordinul lui a (n grupul S), notat ord(a), se denete prin cel mai mic t > 0 astfel nct
a
(t)
= e.
Teorema 33.17 Pentru orice grup nit (S, ) i orice a S, ordinul unui element este egal cu
dimensiunea subgrupului pe care-l genereaz, sau ord(a) = ['a`[.
Demonstraie. Fie, t = ord(a). Deoarece a
(t)
= e i a
(t+k)
= a
(t)
a
(k)
= a
(k)
pentru k 1,
dac i > t, atunci a
(i)
= a
(j)
pentru un anumit j < i. Astfel, nu exist elemente noi dup a
(t)
i 'a` = a
(1)
, a
(2)
, . . . , a
(t)
. Pentru a arta c ['a`[ = t, presupunem prin absurd c a
(i)
= a
(j)
pentru i, j care satisfac relaia 1 i < j t. Atunci, a
(i+k)
= a
(j+k)
pentru k 0. Dar aceasta
implic faptul c a
(i+(tj))
= a
(j+(tj))
= e, ceea ce este o contradicie deoarece i + (t j) < t,
dar t este cea mai mic valoare pozitiv astfel nct a
(t)
= e. De aceea, ecare element al secvenei
a
(1)
, a
(2)
, . . . , a
(t)
este distinct i ['a`[ = t.
Corolarul 33.18 Secvena a
(1)
, a
(2)
, . . . este periodic avnd perioada t = ord(a); adic, a
(i)
=
a
(j)
dac i numai dac i j (mod t).
702 Capitolul 33 Algoritmi din teoria numerelor
Conform corolarului de mai sus, are sens s denim pe a
(0)
ca ind e i a
(i)
prin a
(i mod t)
pentru orice numr ntreg i.
Corolarul 33.19 Dac (S, ) este un grup nit cu unitatea e, atunci
a
(]S])
= e,
pentru orice a S.
Demonstraie. Teorema lui Lagrange implic faptul c ord(a) [ [S[ i astfel S 0 (mod t),
unde t = ord(a).
Exerciii
33.3-1 Studiai tabela operaiei de grup pentru grupurile (Z
4
, +
4
) i (Z

5
,
5
). Artai c aceste
grupuri sunt izomorfe, stabilind o coresponden biunivoc ntre elementele lor, astfel nct
a +b c (mod 4) dac i numai dac (a) (b) (c) (mod 5).
33.3-2 Demonstrai teorema 33.14.
33.3-3 Artai c, dac p este prim i e este un ntreg pozitiv, atunci
(p
e
) = p
e1
(p 1).
33.3-4 Artai c, pentru orice n > 1 i pentru orice a Z

n
, funcia f
a
: Z

n
Z

n
denit prin
f
a
(x) = ax mod n este o permutare a lui Z

n
.
33.3-5 Scriei toate subgrupurile lui Z
9
i ale lui Z

13
.
33.4. Rezolvarea ecuaiilor liniare modulare
O problem practic important este problema determinrii soluiilor ecuaiei:
ax b( mod n), (33.22)
unde n > 0. Presupunem c a, b i n se dau, iar noi trebuie s-i gsim pe acei x modulo n, care
satisfac ecuaia (33.22). Pot exista zero, una sau mai multe astfel de soluii.
Fie 'a` subgrupul lui Z
n
generat de a. Deoarece 'a` = a
(x)
: x > 0 = ax mod n : x > 0,
ecuaia (33.22) are o soluie dac i numai dac b 'a`. Teoarema lui Lagrange (teorema 33.15)
ne spune c ['a`[ trebuie s e un divizor al lui n. Urmtoarea teorem ne d o caracterizare
precis a lui 'a`.
Teorema 33.20 Pentru orice numere ntregi, pozitive a i n, dac d = cmmdc(a, n), atunci:
'a` = 'd` = 0, d, 2d, . . . , ((n/d) 1)d, (33.23)
i, astfel,
['a`[ = n/d.
33.4. Rezolvarea ecuaiilor liniare modulare 703
Demonstraie. ncepem prin a arta c d 'a`. S observm c Euclid-Extins(a, n)
determin ntregii x
t
i y
t
, astfel nct ax
t
+ny
t
= d. Avem ax
t
d (mod n), astfel c d 'a`.
ntruct d 'a`, nseamn c orice multiplu al lui d aparine lui 'a`, deoarece un multiplu
al unui multiplu al lui a este tot un multiplu al lui a. Astfel, 'a` conine orice element din
0, d, 2d, . . . , ((n/d) 1)d. Adic, 'd` 'a`.
Artm acum c 'a` 'd`. Dac m 'a`, atunci m = ax mod n pentru un anumit ntreg x
i, astfel, m = ax +ny pentru un anumit ntreg y. ns, d [ a i d [ n i, astfel, d [ m din relaia
(33.6). De aceea m 'd`.
Combinnd aceste rezultate, avem 'a` = 'd`. Pentru a vedea c ['a`[ = n/d, s observm c
exist exact n/d multipli ai lui d ntre 0 i n 1, inclusiv.
Corolarul 33.21 Ecuaia ax b (mod n) este rezolvabil n necunoscuta x dac i numai dac
cmmdc(a, n) [ b.
Corolarul 33.22 Ecuaia ax b (mod n) e are d soluii distincte modulo n, unde d =
cmmdc(a, n), e nu are nici o soluie.
Demonstraie. Dac ax b (mod n) are o soluie, atunci b 'a`. irul ai mod n, pentru
i = 0, 1, . . . este periodic avnd perioada ['a`[ = n/d, conform corolarului 33.18. Dac b 'a`,
atunci b apare exact de d ori n irul ai mod n, pentru i = 0, 1, . . . , n 1, deoarece blocul de
lungime (n/d) al valorilor lui 'a` se repet exact de d ori cnd i crete de la 0 la n 1. Indicii x
ai acestor d poziii sunt soluiile ecuaiei ax b (mod n).
Teorema 33.23 Fie d = cmmdc(a, n) i presupunem c d = ax
t
+ ny
t
pentru anumii ntregi
x
t
i y
t
(de exemplu, cei calculai prin Euclid-Extins). Dac d [ b, atunci ecuaia ax b (mod
n) are una din soluiile sale valoarea x
0
, unde
x
0
= x
t
(b/d) mod n.
Demonstraie. Deoarece ax
t
d (mod n), avem
ax
0
ax
t
(b/d) (mod n)
d(b/d) (mod n)
b (mod n),
deci, x
0
este o soluie a lui ax b (mod n).
Teorema 33.24 Presupunem c ecuaia ax b (mod n) este rezolvabil (adic d [ b, unde d =
cmmdc(a, n)) i c x
0
este o soluie oarecare a acestei ecuaii. Atunci, aceast ecuaie are exact
d soluii distincte modulo n, date de x
i
= x
0
+i(n/d) pentru i = 1, 2, . . . , d 1.
Demonstraie. Deoarece n/d > 0 i 0 i(n/d) < n pentru i = 0, 1, . . . , d 1, valorile
x
0
, x
1
, . . . , x
d1
sunt toate distincte modulo n. Din periodicitatea irului ai mod n (corolarul
33.18), rezult c, dac x
0
este o soluie a lui ax b (mod n), atunci orice x
i
este o soluie. Prin
corolarul 33.22, exist exact d soluii, astfel c x
0
, x
1
, . . . , x
d1
trebuie s e exact acestea.
Pn acum am dezvoltat matematica necesar pentru a rezolva ecuaia ax b (mod n);
urmtorul algoritm aeaz toate soluiile acestei ecuaii. Intrrile a i b sunt ntregi arbitrari,
iar n este un ntreg pozitiv arbitrar.
704 Capitolul 33 Algoritmi din teoria numerelor
Rezolv-Ecuaie-Liniar-Modular(a, b, n)
1: (d, x
t
, y
t
) Euclid-Extins(a, n)
2: dac d [ b atunci
3: x
0
x
t
(b/d) mod n
4: pentru i 0, d 1 execut
5: scrie (x
0
+i(n/d)) mod n
6: altfel
7: scrie Nu exist soluie
Pentru a exemplica funcionarea acestei proceduri, considerm ecuaia 14x 30 (mod 100)
(aici a = 14, b = 30 i n = 100). Apelnd Euclid-Extins n linia 1, obinem (d, x, y) = (2, 7, 1).
Deoarece 2 [ 30, se execut liniile 35. n linia 3 calculm x
0
= (7)(15) mod 100 = 95. Ciclul
din liniile 45 aeaz cele dou soluii: 95 i 45.
Procedura Rezolv-Ecuaie-Liniar-Modular funcioneaz dup cum urmeaz. Linia
1 calculeaz d = cmmdc(a, n) mpreun cu dou valori x
t
i y
t
, astfel nct d = ax
t
+ ny
t
,
demonstrnd c x
t
este o soluie a ecuaiei ax
t
d (mod n). Dac d nu divide pe b, atunci
ecuaia ax b (mod n) nu are soluie, conform corolarului 33.21. Linia 2 veric dac d [ b; dac
nu, linia 7 ne spune c nu exist soluie. Altfel, linia 3 calculeaz o soluie x
0
a ecuaiei (33.22)
conform cu teorema 33.23. Dndu-se o soluie, teorema 33.24 arm c celelalte d1 soluii pot
obinute adugnd multipli lui (n/d) modulo n. Ciclul pentru din liniile 45 imprim toate
cele d soluii, ncepnd cu x
0
i separate la distana (n/d), modulo n.
Timpul de execuie al algoritmului Rezolv-Ecuaie-Liniar-Modular este O(lg n +
cmmdc(a, n)) operaii aritmetice, deoarece Euclid-Extins necesit O(lg n) operaii aritmetice i
ecare iteraie a ciclului pentru din liniile 45 necesit un numr constant de operaii aritmetice.
Urmtoarele corolare ale teoremei 33.24 denesc particularizri de interes general.
Corolarul 33.25 Pentru orice n > 1, dac cmmdc(a, n) = 1, atunci ecuaia ax b (mod n)
are o singur soluie modulo n.
Dac b = 1, x-ul pe care-l cutm este un invers multiplicativ al lui a, modulo n.
Corolarul 33.26 Pentru orice n > 1, dac cmmdc(a, n) = 1, atunci ecuaia
ax 1 ( mod n) (33.24)
are o soluie unic modulo n. Altfel, nu are soluie.
Corolarul 33.26 ne permite s folosim notaia (a
1
mod n) pentru a ne referi la inversul
multiplicativ al lui a modulo n, cnd a i n sunt relativi primi. Dac cmmdc(a, n) = 1, atunci
singura soluie a ecuaiei ax 1 (mod n) este ntregul x returnat de Euclid-Extins, deoarece
ecuaia
cmmdc(a, n) = 1 = ax +ny
implic ax 1 (mod n). Astfel, (a
1
mod n) poate calculat ecient folosind Euclid-Extins.
33.5. Teorema chinez a restului 705
Exerciii
33.4-1 Gsii toate soluiile ecuaiei 35x 10 (mod 50).
33.4-2 Demonstrai c ecuaia ax ay (mod n) implic x y (mod n) cnd cmmdc(a, n) =
1. Demonstrai necesitatea condiiei cmmdc(a, n) = 1 indicnd un contraexemplu pentru care
cmmdc(a, n) > 1.
33.4-3 Se consider urmtoarea schimbare n linia 3 a algoritmului Rezolv-Ecuaie-
Liniar-Modular:
3 x
0
x
t
(b / d) mod (n/ d)
Va funciona sau nu? Explicai de ce.
33.4-4 Fie f(x) f
0
+ f
1
x + + f
t
x
t
(mod p) un polinom de gradul t, avnd coecieni
f
i
din Z
p
, unde p este prim. Spunem c a Z
p
este un zero al lui f dac f(a) 0 (mod p).
Artai c, dac a este un zero al lui f, atunci f(x) (x a)g(x) (mod p) pentru un anumit
polinom g(x) de grad t 1. Demonstrai prin inducie asupra lui t c un polinom f(x) de grad
t poate avea cel mult t zerouri distincte modulo un numr prim p.
33.5. Teorema chinez a restului
n jurul anului 100 d.Hr., matematicianul chinez Sun-Ts u a rezolvat problema gsirii acelor
ntregi x care dau resturile 2, 3 i 2 cnd se mpart la 3, 5 i, respectiv, 7. O astfel de soluie
este x = 23; toate soluiile sunt de forma 23 +105k pentru numere ntregi k arbitrare. Teorema
chinez a restului furnizeaz o coresponden ntre un sistem de ecuaii modulo o mulime de
numere relativ prime dou cte dou (de exemplu, 3, 5 i 7) i o ecuaie modulo produsul lor
(de exemplu, 105).
Teorema chinez a restului are dou utilizri majore. Fie ntregul n = n
1
n
2
n
k
, unde
factorii n
i
sunt numere relativ prime dou cte dou. Mai nti, teorema chinez a restului este
o teorem de structur care descrie structura lui Z
n
ca ind identic cu cea a produsului
cartezian Z
n
1
Z
n
2
Z
n
k
cu adunarea i nmulirea modulo n
i
n a i-a component. n
al doilea rnd, aceast descriere poate , deseori, utilizat pentru a produce algoritmi ecieni
deoarece operarea n ecare din sistemele Z
n
i
poate mai ecient (n termenii operaiilor pe
bii) dect operarea modulo n.
Teorema 33.27 (Teorema chinez a restului) Fie n = n
1
n
2
n
k
, unde n
i
sunt relativ
prime dou cte dou. Se consider corespondena
a (a
1
, a
2
, . . . , a
k
), (33.25)
unde a Z
n
, a
i
Z
n
i
, iar
a
i
= a mod n
i
706 Capitolul 33 Algoritmi din teoria numerelor
pentru i = 1, 2, . . . , k. Apoi, transformarea (33.25) este o bijecie ntre Z
n
i produsul cartezian
Z
n
1
Z
n
2
Z
n
k
. Operaiile efectuate asupra elementelor lui Z
n
pot efectuate echivalent
asupra k-tuplelor corespunztoare. Astfel, dac
a (a
1
, a
2
, . . . , a
k
), b (b
1
, b
2
, . . . , b
k
),
atunci
(a +b) mod n ((a
1
+b
1
) mod n
1
, . . . , (a
k
+b
k
) mod n
k
), (33.26)
(a b) mod n ((a
1
b
1
) mod n
1
, . . . , (a
k
b
k
) mod n
k
), (33.27)
(ab) mod n (a
1
b
1
mod n
1
, . . . , a
k
b
k
mod n
k
). (33.28)
Demonstraie. Transformarea dintre cele dou reprezentri este ct se poate de direct.
Trecnd de la a la (a
1
, a
2
, . . . , a
k
), se cer numai k mpriri. Calculul lui a din intrrile
(a
1
, a
2
, . . . , a
k
) este la fel de uor, utiliznd urmtoarea formul. Fie m
i
= n/n
i
pentru
i = 1, 2, . . . , k. S observm c m
i
= n
1
n
2
n
i1
n
i+1
n
k
, astfel nct m
i
0 (mod
n
j
) pentru orice j = i. Apoi, punnd
c
i
= m
i
(m
1
i
mod n
i
) (33.29)
pentru i = 1, 2, . . . , k, avem
a (a
1
c
1
+a
2
c
2
+a
k
c
k
) (mod n). (33.30)
Ecuaia (33.29) este bine denit, deoarece m
i
i n
i
sunt relativ prime (prin teorema 33.6) i
corolarul 33.26 implic faptul c (m
1
i
mod n
i
) este denit. Pentru a verica ecuaia (33.30), s
observm c c
j
m
j
0 (mod n
i
) dac j = i, iar c
i
1 (mod n
i
). Astfel, avem corespondena
c
i
(0, 0, . . . , 0, 1, 0, . . . , 0),
vector care are 0-uri peste tot exceptnd a i-a component, unde are 1. Astfel, c
i
formeaz o
baz de reprezentare ntr-un anumit sens. De aceea, pentru ecare i avem
a a
i
c
i
(mod n
i
)
a
i
m
i
(m
1
i
mod n
i
) (mod n
i
)
a
i
(mod n
i
).
ntruct putem transforma n ambele direcii, corespondena este biunivoc. Ecuaiile
(33.26)(33.28) se deduc direct din exerciiul 33.1-6, deoarece x mod n
i
= (x mod n) mod
n
i
pentru orice x i i = 1, 2, . . . , k.
Urmtoarele corolare vor utilizate mai trziu n acest capitol.
Corolarul 33.28 Dac n
1
, n
2
, . . . , n
k
sunt relativ prime dou cte dou i n = n
1
n
2
n
k
,
atunci pentru orice ntregi a
1
, a
2
, . . . , a
k
, sistemul de ecuaii
x a
i
( mod n
i
),
pentru i = 1, 2, . . . , k, are o soluie unic modulo n n necunoscuta x.
33.5. Teorema chinez a restului 707
Figura 33.3 O ilustrare a teoremei chineze a restului pentru n
1
= 5 i n
2
= 13. Pentru acest exemplu,
c
1
= 26 i c
2
= 40. n linia i, coloana j, se arat valoarea lui a, modulo 65, astfel ca (a mod 5) = i i
(a mod 13) = j. S observm c linia 0, coloana 0 conine un 0. Similar, rndul 4, coloana 12 l conine
pe 64 (echivalentul lui -1). Deoarece c
1
= 26, mergnd la linia urmtoare, a se incrementeaz cu 26.
Similar, c
2
= 40 nseamn c, mergnd la urmtoarea coloan, a se mrete cu 40. Incrementarea lui a
cu 1 corespunde deplasrii pe diagonal n jos, spre dreapta i revenirii de jos n sus, de la dreapta spre
stnga.
Corolarul 33.29 Dac n
1
, n
2
, . . . , n
k
sunt relativ prime dou cte dou i n = n
1
n
2
n
k
,
atunci pentru orice dou numere ntregi x i a,
x a (mod n
i
)
pentru i = 1, 2, . . . , k dac i numai dac
x a (mod n).
Ca un exemplu pentru teorema chinezeasc a restului, presupunem c se dau dou ecuaii
a 2 (mod 5),
a 3 (mod 13),
astfel nct a
1
= 2, n
1
= m
2
= 5, a
2
= 3, iar n
2
= m
1
= 13, i vrem s calculm a mod 65,
deoarece n = 65. ntruct 13
1
2 (mod 5) i 5
1
8 (mod 13) avem
c
1
= 13 (2 mod 5) = 26,
c
2
= 5 (8 mod 13) = 40,
iar
a 2 26 + 3 40 (mod 65)
52 + 120 (mod 65)
42 (mod 65).
O ilustrare a teoremei chineze a restului, modulo 65, se poate vedea n gura 33.3.
Putem lucra direct modulo n sau n reprezentare transformat folosind calcule convenabile
modulo n
i
, separate. Calculele sunt complet echivalente.
708 Capitolul 33 Algoritmi din teoria numerelor
Exerciii
33.5-1 Gsii toate soluiile ecuaiilor x 4 (mod 5) i x 5 (mod 11).
33.5-2 Gsii toate numerele ntregi x pentru care se obin resturile 1, 2, 3, 4, 5 cnd sunt
mprite respectiv la 2, 3, 4, 5, 6.
33.5-3 Argumentai c, n conformitate cu deniiile din teorema 33.27, dac cmmdc(a, n) =
1, atunci
(a
1
mod n) ((a
1
1
mod n
1
), (a
1
2
mod n
2
), . . . , (a
1
k
mod n
k
)).
33.5-4 n conformitate cu deniiile teoremei 33.27, demonstrai c numrul rdcinilor ecuaiei
f(x) 0 (mod n) este egal cu produsul numrului rdcinilor ecrei ecuaii f(x) 0 (mod
n
1
), f(x) 0 (mod n
2
), . . . , f(x) 0 (mod n
k
).
33.6. Puterile unui element
Aa cum este normal s se considere multiplii unui element dat a, modulo n, este la fel de
natural s considerm irul puterilor lui a, modulo n, unde a Z

n
:
a
0
, a
1
, a
2
, a
3
, . . . , (33.31)
modulo n. Valoarea de indice 0 din acest ir este a
0
mod n = 1, iar a i-a valoare este a
i
mod n.
De exemplu, puterile lui 3 modulo 7 sunt
i 0 1 2 3 4 5 6 7 8 9 10 11
3
i
mod 7 1 3 2 6 4 5 1 3 2 6 4 5
iar puterile lui 2 modulo 7 sunt
i 0 1 2 3 4 5 6 7 8 9 10 11
2
i
mod 7 1 2 4 1 2 4 1 2 4 1 2 4
n aceast seciune vom nota cu 'a` subgrupul lui Z

n
generat de a, cu ord
n
(a) (ordinul lui
a modulo n), ordinul lui a n Z

n
. De exemplu, '2` = 1, 2, 4 n Z

7
, iar ord
7
(2) = 3. Utiliznd
deniia funciei lui Euler (n) ca dimensiune a lui Z

n
(vezi seciunea 33.3), vom transcrie
corolarul 33.19 n notaia lui Z

n
pentru a obine teorema lui Euler i o vom particulariza pentru
Z

p
, unde p este prim, pentru a obine teorema lui Fermat.
Teorema 33.30 (Teorema lui Euler) Pentru orice n > 1,
a
(n)
1 (mod n) pentru orice a Z

n
. (33.32)
Teorema 33.31 (Teorema lui Fermat) Dac p este prim, atunci
a
p1
1 (mod n) pentru orice a Z

n
(33.33)
33.6. Puterile unui element 709
Demonstraie. Din ecuaia (33.21) rezult c (p) = p 1 dac p este prim.
Acest corolar se aplic oricrui element din Z
p
, cu excepia lui 0, deoarece 0 Z

p
. Totui,
pentru orice a Z
p
, avem a
p
a (mod p) dac p este prim.
Dac ord
n
(g) = [Z

n
[, atunci orice element din Z

n
este o putere a lui g modulo n i spunem
c g este o rdcin primitiv sau generator al lui Z

n
. De exemplu, 3 este o rdcin
primitiv modulo 7. Dac Z

n
are o rdcin primitiv, spunem c grupul Z

n
este ciclic. Omitem
demonstraia urmtoarei teoreme, care a fost dat de Niven i Zuckerman [151].
Teorema 33.32 Valorile lui n > 1, pentru care Z

n
este ciclic, sunt 2, 4, p
e
i 2p
e
pentru toate
numerele prime impare i pentru orice ntregi e.
Dac g este o rdcin primitiv a lui Z

n
i a este un element arbitrar al lui Z

n
, atunci exist
un z astfel nct g
z
a (mod n). Acest z este numit logaritmul discret sau indexul lui a
modulo n, pentru baza g; notm aceast valoare cu ind
n,g
(a).
Teorema 33.33 (Teorema logaritmului discret) Dac g este o rdcin primitiv a lui Z

n
,
atunci relaia g
x
g
y
(mod n) are loc dac i numai dac are loc x y (mod (n)).
Demonstraie. Presupunem pentru nceput c x y (mod (n)). Atunci, x = y+k(n) pentru
un anumit ntreg k. De aceea,
g
x
g
y+k(n)
(mod n)
g
y
(g
(n)
)
k
(mod n)
g
y
1
k
(mod n)
g
y
(mod n)
Invers, presupunem c g
x
g
y
(mod n). Deoarece irul puterilor lui g genereaz orice element
al lui 'g` i ['g`[ = (n), corolarul 33.18 implic faptul c irul de puteri ale lui g este periodic
avnd perioada (n). De aceea, dac g
x
g
y
(mod n), atunci trebuie s avem x y (mod
(n)).
n unele cazuri, folosirea logaritmilor discrei poate simplica deduciile pentru o relaie
modular, dup cum se arat i n demonstraia teoremei urmtoare.
Teorema 33.34 Dac p este un numr prim impar i e 1, atunci ecuaia
x
2
1 (mod p
e
) (33.34)
are numai dou soluii i anume x = 1 i x = 1.
Demonstraie. Fie n = p
e
. Teorema 33.32 implic faptul c Z

n
are o rdcin primitiv g.
Ecuaia (33.34) poate scris
(g
ind
n,g
(x)
)
2
g
ind
n,g
(1)
(mod n). (33.35)
Dup ce remarcm c ind
n,g
(1) = 0, observm c teorema 33.33 implic faptul c ecuaia (33.35)
este echivalent cu
2 ind
n,g
(x) 0 (mod (n)). (33.36)
710 Capitolul 33 Algoritmi din teoria numerelor
Pentru a rezolva aceast ecuaie n necunoscuta ind
n,g
(x), aplicm metodele din seciunea 33.4.
Fie d = cmmdc(2, (n)) = cmmdc(2, (p1)p
e1
) = 2 i observm c d [ 0, iar din teorema 33.24
deducem c ecuaia (33.36) are exact d = 2, soluii. De aceea i ecuaia (33.34) are exact 2 soluii
care se veric dac sunt x = 1 i x = 1.
Un numr x este o rdcin netrivial a lui 1 modulo n dac veric ecuaia x
2
1
(mod n) i x nu este echivalent cu nici una dintre cele dou rdcini triviale: 1 sau -1 modulo
n. De exemplu, 6 este o rdcin ptrat netrivial a lui 1 modulo 35. Urmtorul corolar al
teoremei 33.34 va utilizat la demonstrarea corectitudinii procedurii lui Miller-Rabin de testare
a numerelor prime din seciunea 33.8.
Corolarul 33.35 Dac exist o rdcin ptrat netrivial a lui 1 modulo n, atunci n este
compus.
Demonstraie. Teorema 33.34 implic faptul c, dac exist o rdcin ptrat netrivial a lui
1 modulo n, atunci n nu poate prim sau o putere a unui numr prim. Deci, n trebuie s e
compus.
Ridicarea la putere prin ridicri repetate la ptrat
O operaie care apare frecvent n calculele din teoria numerelor este ridicarea unui numr la
o putere modulo un alt numr, cunoscut sub numele de exponeniere modular. Mai exact,
dorim un mod ecient de a calcula a
b
mod n, unde a i b sunt ntregi nenegativi i n este un ntreg
pozitiv. Exponenierea modular este o operaie esenial n multe rutine de testare a proprietii
de numr prim i n criptosistemul RSA cu cheie public. Metoda ridicrii repetate la ptrat
rezolv ecient aceast problem utiliznd reprezentarea binar a lui b.
Fie 'b
k
, b
k1
, . . . , b
1
, b
0
` reprezentarea binar a lui b. (Mai exact, reprezentarea binar are
lungimea de k +1 bii, b
k
este cel mai semnicativ bit, iar b
0
este cel mai puin semnicativ bit.)
Urmtoarea procedur calculeaz a
c
mod n mrind pe c prin dublri i incrementri de la 0 la
b.
Exponeniere-Modular(a, b, n)
1: c 0
2: d 1
3: e 'b
k
, b
k1
, . . . , b
0
` reprezentarea binar a lui b
4: pentru i k, 0, -1 execut
5: c 2c
6: d (d d) mod n
7: dac b
i
= 1 atunci
8: c c + 1
9: d (d a) mod n
10: returneaz d
Fiecare exponent calculat succesiv este sau de dou ori exponentul precedent, sau cu unu mai
mare dect el; reprezentarea binar a lui b este citit de la dreapta spre stnga pentru a decide
care operaie s se realizeze.
Fiecare iteraie a ciclului utilizeaz una din identitile
a
2c
mod n = (a
c
)
2
mod n,
33.7. Criptosistemul RSA cu cheie public 711
Figura 33.4 Rezultatele lui Exponeniere-Modular cnd se calculeaz a
b
(mod n), pentru a =
7, b = 560 = '1000110000) i n = 561. Sunt artate valorile dup ecare execuie a ciclului pentru.
Rezultatul nal este 1.
a
2c+1
mod n = a (a
c
)
2
mod n,
dup cum b
i
= 0, respectiv 1. Folosirea ridicrii la ptrat n ecare iteraie explic denumirea
de ridicare repetat la ptrat. Imediat dup ce bitul b
i
este citit i procesat, valoarea lui c este
egal cu prexul 'b
k
, b
k1
, . . . , b
i
` al reprezentrii binare a lui b. De exemplu, pentru a = 7, b =
560 i n = 561, algoritmul calculeaz irul de valori modulo 561 ilustrat n gura 33.4; irul de
exponeni folosii se poate observa n rndul c al tabelei.
n realitate, variabila c nu este necesar n algoritm, dar este inclus pentru scopuri
explicative: algoritmul conserv invariantul d = a
c
mod n, n timp ce-l mrete pe c prin dublri
i incrementri pn cnd c = b. Dac intrrile a, b i n sunt numere reprezentate pe bii,
atunci numrul total al operaiilor aritmetice necesare este O() i numrul total al operaiilor
pe bii necesare este O(
2
).
Exerciii
33.6-1 ntocmii un tabel care s arate ordinul ecrui element din Z

11
. Gsii cea mai mic
rdcin primitiv g i alctuii o tabel cu ind
11,g
(x) pentru orice x Z

11
.
33.6-2 Dai un algoritm de exponeniere modular care s examineze toi biii din reprezentarea
lui b de la dreapta spre stnga, i nu de la stnga spre dreapta.
33.6-3 Explicai cum se poate calcula a
1
mod n pentru orice a Z

n
utiliznd procedura
Exponeniere-Modular, presupunnd c se cunoate (n).
33.7. Criptosistemul RSA cu cheie public
Un criptosistem cu cheie public poate utilizat pentru a cripta mesaje trimise ntre dou
pri care comunic ntre ele, astfel nct o persoan strin care intercepteaz mesajele criptate
s nu le poat decodica. De asemenea, un criptosistem cu cheie public permite unei pri
s adauge o semntur digital nefalsicabil la sfritul unui mesaj electronic. O astfel de
semntur este versiunea electronic a unei semnturi scrise cu mna pe un document ocial
scris pe hrtie. Ea poate vericat uor de ctre oricine, nu poate falsicat de nimeni, totui
i pierde validitatea dac cel puin un bit din mesaj este alterat. De aceea, ea furnizeaz att
autenticitatea identitii semnatarului ct i a coninutului mesajului semnat. Este un instrument
perfect pentru contractele de afaceri semnate electronic, pentru cecurile electronice, comenzile
electronice de cumprare i alte comunicaii electronice care trebuie autenticate.
712 Capitolul 33 Algoritmi din teoria numerelor
Criptosistemul RSA cu cheie public se bazeaz pe diferena impresionant dintre uurina
de a gsi numere prime mari i dicultatea de a factoriza produsul a dou numere prime mari. n
seciunea 33.8 se descrie o procedur ecient pentru a gsi numere prime mari, iar n seciunea
33.9 se discut problema factorizrii ntregilor mari.
Criptosisteme cu cheie public
ntr-un criptosistem cu cheie public, ecare participant are att o cheie public ct i
o cheie secret. Fiecare cheie este un fragment de informaie. De exemplu, n criptosistemul
RSA, ecare cheie const dintr-o pereche de numere ntregi. Numele Alice i Bob se utilizeaz,
tradiional, n exemplele de criptograe; notm cheile lor publice i secrete cu P
A
, S
A
pentru Alice
i P
B
, S
B
pentru Bob.
Fiecare participant i creeaz propria cheie public i secret. Fiecare i pstreaz n secret
cheia sa secret, dar poate s-i deconspire cheia public oricui sau chiar s o fac public.
De fapt, putem presupune c o cheie public aparinnd unei persoane este disponibil ntr-
un director public, astfel nct orice participant poate obine uor cheia public a oricrui alt
participant.
Cheile publice i secrete specic funcii care pot aplicate oricrui mesaj. Notm prin T
mulimea mesajelor permise. De exemplu, T ar putea mulimea tuturor irurilor de bii de
lungime nit. Se cere ca ambele chei s specice funcii unu-la-unu (bijective) de la T la T.
Funcia care corespunde cheii publice P
A
a lui Alice se noteaz cu P
A
(), iar cea care corespunde
cheii secrete S
A
cu S
A
(). Funciile P
A
() i S
A
() sunt permutri ale lui T. Presupunem c funciile
P
A
() i S
A
() se pot calcula ecient cunoscnd cheile corespunztoare P
A
i S
A
.
Cheia public i cea secret pentru ecare participant, sunt o pereche asortat, n sensul c
ele specic funcii inverse una celeilalte. Adic,
M = S
A
(P
A
(M)), (33.37)
M = P
A
(S
A
(M)) (33.38)
pentru orice mesaj M T. Transformndu-l succesiv pe M cu ajutorul celor dou chei P
A
i
S
A
, n orice ordine, se revine la mesajul M.
ntr-un criptosistem cu cheie public, este esenial ca nimeni, n afar de Alice, s nu poat
calcula funcia S
A
() ntr-un timp rezonabil. Secretul mesajului criptat i expediat lui Alice i
autenticitatea semnturii digitale a lui Alice se bazeaz pe presupunerea c numai Alice este
n stare s calculeze pe S
A
(). Aceast cerin impune ca Alice s pstreze S
A
secret; dac nu
face acest lucru, ea i pierde unicitatea i criptosistemul nu o poate nzestra cu faciliti unice.
Presupunerea c numai Alice poate calcula S
A
() trebuie s se menin chiar dac cineva cunoate
P
A
i poate calcula ecient P
A
(), inversa funciei S
A
(). Dicultatea major n proiectarea unui
criptosistem funcionabil cu cheie public const n gurarea modului de a crea un sistem n
care putem deconspira o transformare P
A
(), fr a deconspira cum se calculeaz transformarea
invers S
A
() corespunztoare.
ntr-un criptosistem cu cheie public, criptarea funcioneaz dup cum urmeaz: presupunem
c Bob dorete s-i trimit lui Alice un mesaj M criptat, astfel nct el va arta ca o vorbire
neinteligibil pentru o persoan care trage cu urechea. Scenariul pentru trimiterea mesajului se
desfoar dup cum urmeaz:
Bob obine cheia public P
A
a lui Alice (dintr-un director public sau direct de la Alice).
33.7. Criptosistemul RSA cu cheie public 713
Figura 33.5 Criptarea ntr-un sistem cu cheie public. Bob cripteaz mesajul M utiliznd cheia public
P
A
a lui Alice i transmite textul cifrat care a rezultat C = P
A
(M) lui Alice. O persoan strin care
captureaz transmisia textului cifrat nu obine nici o informaie despre M. Alice l recepioneaz i-l
decripteaz folosind cheia ei secret pentru a obine mesajul original M = S
A
(C).
Bob calculeaz textul cifrat C = P
A
(M) care corespunde mesajului M i trimite C lui
Alice.
Cnd Alice recepioneaz textul cifrat C, aplic cheia ei secret S
A
pentru a obine mesajul
original M = S
A
(C).
Figura 33.5 ilustreaz acest proces. Deoarece S
A
() i P
A
() sunt funcii inverse, Alice l poate
calcula pe M din C. Deoarece numai Alice este n stare s-l calculeze pe S
A
(), numai ea l poate
calcula pe M din C. Criptarea lui M folosind P
A
() protejeaz dezvluirea lui M fa de oricine,
exceptnd-o pe Alice.
Semnturile digitale sunt la fel de uor de implementat ntr-un criptosistem cu cheie public.
Presupunem acum c Alice dorete s-i trimit lui Bob un rspuns M
t
, semnat digital. Scenariul
pentru semntur digital continu dup cum urmeaz:
Alice calculeaz semntura digital a ei pentru mesajul M
t
folosind cheia ei secret
S
A
i ecuaia = S
A
(M
t
).
Alice trimite lui Bob perechea (M
t
, ) mesaj/semntur.
Cnd Bob recepioneaz (M
t
, ), poate verica faptul c acesta este de la Alice, folosind
cheia public a lui Alice pentru a verica relaia M
t
= P
A
(). (Probabil c M
t
conine
numele lui Alice, astfel nct Bob tie a cui cheie public s o foloseasc). Dac relaia este
satisfcut, Bob trage concluzia c mesajul M
t
a fost ntr-adevr semnat de Alice. Dac
relaia nu este satisfcut, Bob trage concluzia c M
t
sau semntura digital au fost
deteriorate prin erori de transmisie sau c perechea (M
t
, ) este un fals.
Figura 33.6 ilustreaz acest proces. Deoarece o semntur digital furnizeaz autenticitatea
att a identitii semnatarului, ct i a coninutului mesajului semnat, ea este analog cu o
semntur scris cu mna la sfritul unui document scris.
O proprietate important a unei semnturi digitale este faptul c este vericabil de oricine
are acces la cheia public a semnatarului. Un mesaj semnat poate vericat de mai multe ori
(de mai multe pri). De exemplu, mesajul ar putea un cec electronic de la Alice la Bob. Dup
ce Bob veric semntura lui Alice de pe cec, el poate preda cecul la banca sa, care apoi poate
verica din nou semntura i poate efectua transferul corespunztor de capital.
714 Capitolul 33 Algoritmi din teoria numerelor
Figura 33.6 Semnturi digitale ntr-un sistem cu cheie public. Alice semneaz mesajul M

folosind
semntura ei digital = S
A
(M

). i transmite lui Bob perechea (M

, ) mesaj/semntur, el o veric
testnd relaia M

= P
A
(). Dac relaia este satisfcut, accept pe (M

, ) drept mesaj care a fost


semnat de Alice.
Observm c un mesaj semnat nu este criptat; mesajul este n clar i nu este protejat contra
falsicrii. Compunnd protocoalele de mai sus pentru criptare i semnturi, putem crea mesaje
care s e att semnate ct i criptate. Semnatarul adaug nti semntura sa digital la mesaj
i apoi cripteaz, rezultnd perechea mesaj/semntur cu cheie public a destinatarului avut n
vedere. Receptorul decripteaz cu cheia sa secret mesajul primit pentru a obine att mesajul
original ct i semntura lui digital. El poate, apoi, verica semntura utiliznd cheia public
a semnatarului. Procesul combinat este corespunztor practicii folosite la documentele scrise,
aceea de a semna documentul, apoi, a sigila plicul n care acesta a fost introdus i care poate
deschis numai de ctre destinatar.
Criptosistemul RSA
n criptosistemul RSA cu cheie public, un participant creeaz cheia sa public i secret
prin urmtoarea procedur:
1. Se selecteaz aleator dou numere prime mari p i q. Acestea ar putea avea, de exemplu,
100 de cifre zecimale.
2. Se calculeaz n prin relaia n = pq.
3. Se selecteaz un numr impar mic e care este relativ prim cu (n) i care, conform relaiei
(33.20), este (p 1)(q 1).
4. Se calculeaz d ca ind inversul multiplicativ al lui e modulo (n). (Corolarul 33.26
garanteaz c d exist i c acesta este unic).
5. Se declar perechea P = (e, n) drept cheie RSA public.
6. Se menine secret perechea S = (d, n) care este cheie RSA secret.
Pentru aceast schem, domeniul T este mulimea Z
n
. Transformarea mesajului M asociat
unei chei publice P = (e, n) este
P(M) = M
e
(mod n). (33.39)
33.7. Criptosistemul RSA cu cheie public 715
Transformarea textului cifrat C asociat unei chei secrete S = (d, n) este:
S(C) = C
d
(mod n). (33.40)
Aceste relaii se refer att la criptare, ct i la semnturi. Pentru a crea o semntur,
semnatarul aplic cheia sa secret mesajului de semnat i nu textului cifrat. Pentru a verica o
semntur, cheia public a semnatarului i se aplic ei i nu mesajului criptat.
Operaiile pentru cheie public i cheie secret pot implementate folosind procedura
Exponeniere-Modular descris n seciunea 33.6. Pentru a analiza timpul de execuie al
acestor operaii, s presupunem c ambele chei, cea public (e, n) i cea secret (d, n), satisfac
relaiile log
2
e = O(1), log
2
d = log
2
n = . Atunci, aplicarea unei chei publice necesit O(1)
nmuliri modulare i se utilizeaz O(
2
) operaii pe bii. Aplicarea unei chei secrete necesit
O() nmuliri modulare i O(
3
) operaii pe bii.
Teorema 33.36 (Corectitudinea lui RSA) Relaiile RSA (33.39) i (33.40) denesc trans-
formrile inverse ale lui Z
n
, care satisfac relaiile (33.37) i (33.38).
Demonstraie. Din relaiile (33.39) i (33.40), pentru orice M Z
n
, avem
P(S(M)) = S(P(M)) = M
ed
(mod n).
Deoarece e i d sunt inverse multiplicative modulo (n) = (p 1)(q 1),
ed = 1 +k(p 1)(q 1)
pentru un anumit ntreg k. Dar atunci, dac M 0 (mod p), avem (folosind teorema 33.31)
M
ed
M(M
p1
)
k(q1)
(mod p)
M(1)
k(q1)
(mod p)
M (mod p).
De asemenea, M
ed
M (mod p) dac M 0 (mod p). Astfel,
M
ed
M (mod p)
pentru orice M. Similar,
M
ed
M (mod q)
pentru orice M. Astfel, pe baza corolarulului 33.29 al teoremei chinezeti a restului,
M
ed
M (mod n)
pentru orice M.
Securitatea criptosistemului rezid, n mare parte, n dicultatea de a factoriza numere ntregi
mari. Dac adversarul poate factoriza modulul n printr-o cheie public, atunci poate obine cheia
secret din cea public, utiliznd cunotinele despre factorii p i q n acelai mod n care le-a
utilizat creatorul cheii publice. Astfel, dac factorizarea numerelor ntregi mari este uoar, atunci
spargerea criptosistemului RSA este simpl. Armaia invers, i anume c, dac factorizarea
numerelor ntregi mari este dicil, atunci spargerea lui RSA este dicil, este nedemonstrabil.
Totui, dup un deceniu de cercetri, nu a fost gsit nici o metod mai simpl de a sparge
716 Capitolul 33 Algoritmi din teoria numerelor
criptosistemul RSA cu cheie public, dect factorizarea modului n. Aa cum vom vedea n
seciunea 33.9, factorizarea numerelor ntregi mari este surprinztor de dicil. Alegnd aleator i
nmulind dou numere prime de 100 de cifre, se poate crea o cheie public ce nu poate spart
cu tehnologia curent ntr-un timp rezonabil. n absena unui salt fundamental n proiectarea
algoritmilor din teoria numerelor, criptosistemul RSA este capabil s furnizeze un grad nalt de
securitate n aplicaii.
n vederea obinerii securitii cu criptosistemele RSA, este totui necesar s se lucreze cu
numere ntregi care s aib 100200 de cifre, deoarece factorizarea ntregilor mai mici nu este
impractic. n particular, trebuie s m n stare s gsim ecient numere prime mari n vederea
crerii cheilor de lungime necesar. Aceast problem este prezentat n seciunea 33.8.
Pentru ecien, RSA este, adesea, utilizat ntr-un mod hibrid sau controlat-de-cheie cu
criptosistem rapid avnd cheie nepublic. Cu un astfel de sistem, cheile de criptare i decriptare
sunt identice. Dac Alice dorete s-i trimit lui Bob un mesaj condenial M lung, selecteaz
o cheie aleatoare K pentru criptosistemul cu cheie nepublic, cripteaz mesajul M cu ajutorul
cheii K i obine textul cifrat C. Textul C este tot att de lung ca M, dar cheia K este ct se
poate de scurt. Apoi, cripteaz K folosind cheia RSA public a lui Bob. Deoarece K este scurt,
calculul lui P
B
(K) este rapid (mult mai rapid dect calculul lui P
B
(M)). Apoi, (C, P
B
(K)) este
transmis lui Bob, care decripteaz P
B
(K) pentru a-l obine pe K i, apoi, l folosete pe K
pentru a-l decripta pe C, obinndu-l pe M.
O alt concepie hibrid similar este des folosit pentru a realiza semnturi digitale eciente.
n aceast concepie, RSA este nzestrat cu o funcie univoc de dispersie public h, o funcie
care este uor da calculat, dar pentru care nu este simplu, din punctul de vedere al calculului, s
se gseasc dou mesaje M i M
t
astfel nct h(M) = h(M
t
). Valoarea h(M) este o amprent
prescurtat (de exemplu, de 128 bii) a mesajului M. Dac Alice dorete s semneze un mesaj
M, aplic nti h lui M pentru a obine amprenta h(M), pe care apoi o semneaz cu cheia ei
secret. Va trimite (M, S
A
(h(M))) lui Bob ca versiune a lui M, semnat de ea. Bob poate verica
semntura prin calculul lui h(M) pe de o parte, iar pe de alta, aplicnd P
A
la S
A
(h(M)), obinnd
astfel h(M). Deoarece nimeni nu poate crea dou mesaje cu aceeai amprent, este imposibil s
se altereze un mesaj semnat i s se pstreze validitatea semnturii.
n nal, s observm c folosirea certicatelor uureaz distribuirea cheilor publice. De
exemplu, s presupunem c exist o autoritate de ncredere T a crei cheie public este
cunoscut de oricine. Alice poate obine de la T un mesaj semnat (certicatul ei) armnd
c Alice are cheia public P
A
. Acest certicat se auto-identic deoarece oricine cunoate
pe P
T
. Alice poate include certicatul ei cu mesajul semnat de ea, astfel nct destinatarul are
imediat disponibil cheia public a lui Alice n vederea vericrii semnturii. Deoarece cheia ei
a fost semnat de T, destinatarul tie c, ntr-adevr cheia lui Alice este a lui Alice.
Exerciii
33.7-1 Se consider o cheie RSA cu p = 11, q = 29, n = 319 i e = 3. Ce valoare ar trebui
folosit pentru d n cheia secret? Care este criptarea mesajului M = 100?
33.7-2 Demonstrai c, dac exponentul public al lui Alice este 3 i un adversar obine
exponentul secret d al lui Alice, atunci adversarul poate factoriza modulul n al lui Alice ntr-un
timp polinomial n numrul de bii din n. (Dei nu se cere s se demonstreze, putem interesai
33.8. Testul de primalitate 717
s tim c acest rezultat rmne valabil i n cazul n care condiia e = 3 este eliminat. Vezi
Miller [147].)
33.7-3 Artai c RSA este multiplicativ, n sensul c
P
A
(M
1
)P
A
(M
2
) P
A
(M
1
M
2
)( mod n).
S se utilizeze acest proprietate pentru a demonstra c, dac un adversar are o procedur care
ar putea decripta ecient 1 procent din mesajele alese aleator din Z
n
i care sunt criptate cu P
A
,
atunci ar putea utiliza un algoritm probabilistic pentru a decripta, cu probabilitate mare, orice
mesaj criptat cu P
A
.
33.8. Testul de primalitate
n aceast seciune considerm problema gsirii numerelor prime mari. ncepem cu o discuie
despre densitatea numerelor prime, continund cu examinarea unei concepii plauzibile (dar
incomplete) pentru testarea proprietii de numr prim i apoi prezentm un test aleator efectiv
pentru numere prime, datorat lui Miller i Rabin.
Densitatea numerelor prime
Pentru multe aplicaii (cum este criptarea), avem nevoie s gsim numere prime mari ale-
atoare. Din fericire, numerele prime mari nu sunt prea rare, aa c nu este prea costisitor n
timp s testm aleator ntregi de dimensiune corespunztoare, pn cnd gsim un numr prim.
Funcia (n) de distribuie a numerelor prime specic numrul numerelor prime care
sunt mai mici sau egale cu n. De exemplu, (10) = 4, deoarece exist 4 numere prime mai mici
sau egale cu 10 i anume 2, 3, 5 i 7. Teorema numrului numerelor prime ofer o aproximaie
util pentru (n).
Teorema 33.37 (Teorema numrului numerelor prime)
lim
n
(n)
n/ lnn
= 1.
Aproximaia n/ lnn d o estimare rezonabil de precis pentru (n), chiar i pentru n mic.
De exemplu, ea difer cu mai puin de 6% pentru n = 10
9
, unde (n) = 50847534 i n/ lnn
=48254942. (n teoria numerelor, 10
9
este considerat un numr mic).
Putem folosi teorema numrului numerelor prime pentru a estima c probabilitatea ca un
numr ntreg n ales la ntmplare s e numr prim este 1/ lnn. Astfel, va trebui s examinm
lnn numere ntregi apropiate de n, alese aleator, pentru a gsi un numr prim care s e de
aceeai lungime ca n. De exemplu, pentru a gsi un numr prim de 100 de cifre, s-ar cere s se
testeze dac sunt prime aproximativ ln10
100
230 numere de 100 de cifre alese aleator. (Acest
numr poate njumtit alegnd numai ntregi impari).
718 Capitolul 33 Algoritmi din teoria numerelor
n cele ce urmeaz, n aceast seciune, vom considera problema determinrii dac n (numr
ntreg impar, mare) este prim sau nu. Din punctul de vedere al notaiilor, este convenabil s
presupunem c n are descompunerea n numere prime
n = p
e
1
1
p
e
2
2
p
e
r
r
, (33.41)
unde r 1 i p
1
, p
2
, . . . , p
r
sunt factorii primi ai lui n. Desigur, n este prim dac i numai dac
r = 1 i e
1
= 1.
O concepie simpl pentru problema testrii numerelor prime este mprirea de prob. Se
ncearc s se divid n prin ecare ntreg 2, 3, . . . ,

n|. (Din nou, ntregii pari mai mari dect


2 pot omii.) Este uor s se observe c n este prim dac i numai dac nici unul din divizorii
de prob nu-l divide pe n. Presupunnd c ecare mprire de prob necesit un timp constant,
timpul de execuie n cazul cel mai defavorabil este (

n), care este exponenial n raport cu


lungimea lui n. (Amintim c, dac n are o reprezentare binar pe bii, atunci = lg(n+1)| i
astfel

n = (2
/2
).) Astfel, mprirea de prob funcioneaz bine numai dac n este foarte mic
sau are un factor prim mic. Cnd mprirea de prob funcioneaz, are avantajul c determin
nu numai faptul c n este prim sau compus, dar dac n este compus, determin unul din factorii
primi ai lui.
n aceast seciune suntem interesai numai n a determina dac un numr dat n este prim sau
compus i nu suntem interesai de gsirea factorizrii lui n numere prime. Aa cum vom vedea
n seciunea 33.9, determinarea factorizrii n numere prime a unui numr dat este laborioas
din punctul de vedere al calculelor. Este surprinztor, dar este mult mai uor s armi dac un
numr este prim sau nu, dect s determini factorizarea n numere prime dac el nu este prim.
Testul de pseudoprimalitate
Considerm acum o metod de testare a proprietii de numr prim care aproape
funcioneaz i care, de fapt, este destul de bun pentru multe aplicaii practice. O versiune
ranat a metodei, care elimin micul ei neajuns, va prezentat mai trziu. Prin Z
+
n
notm
elementele nenule ale lui Z
n
:
Z
+
n
= 1, 2, . . . , n 1.
Dac n este prim, atunci Z
+
n
= Z

n
.
Spunem c n este pseudoprim cu baza a dac n este compus i
a
n1
1 (mod n). (33.42)
Teorema lui Fermat (teorema 33.31) implic faptul c dac n este prim, atunci n satisface relaia
(33.42) pentru orice a din Z
+
n
. Astfel, dac putem gsi un a Z
+
n
oarecare astfel nct n s
satisfac relaia (33.42), atunci cu siguran n este compus. n mod surprinztor i inversa este
ntotdeauna adevrat, astfel nct acest criteriu formeaz un test aproape perfect al
faptului c un numr este prim. Vericm dac n satisface relaia (33.42) pentru a =2. Dac nu,
declarm c n este compus. Altfel, presupunem c n este prim (n realitate, tot ce tim este c
n este e prim, e pseudoprim cu baza 2).
Urmtoarea procedur realizeaz, n acest fel, testul proprietii de numr prim a lui n. Ea
utilizeaz procedura Exponeniere-Modular din seciunea 33.6. Intrarea n se presupune a
un ntreg mai mare dect 2.
33.8. Testul de primalitate 719
Pseudoprim(n)
1: dac Exponeniere-Modular(2, n 1, n) 1 (mod n) atunci
2: returneaz compus Denitiv.
3: altfel
4: returneaz prim Se sper!
Aceast procedur poate genera erori, dar numai de un singur tip. Adic, dac ea arm c
n este compus, atunci aceasta este totdeauna corect. Dac ea spune c n este prim, atunci ea
poate face o eroare numai dac n este pseudoprim cu baza 2.
Ct de des poate s apar aceast eroare? Surprinztor de rar. Exist numai 22 de valori
ale lui n mai mici dect 10000 pentru care ea este eronat; primele patru astfel de erori sunt
341, 561, 645 i 1105. Se poate arta c probabilitatea, ca acest program s genereze o eroare
pentru o alegere aleatoare a unui numr care are o reprezentare pe bii, tinde la zero cnd
. Utiliznd estimarea mai precis, dat de Pomerance [157], a numrului de pseudoprime
cu baza 2 pentru o dimensiune dat, putem estima c un numr de 50 de cifre ales aleator, care
este considerat prim prin procedura de mai sus, are mai puin dect o ans la un milion s e
pseudoprim cu baza 2, iar un numr de 100 de cifre ales aleator, care este considerat prim are
mai puin de o ans la 10
13
s e pseudoprim cu baza 2.
Din nefericire, nu putem elimina toate erorile prin simpla testare a relaiei (33.42) pentru
un al doilea numr de baz, s zicem 3, deoarece exist numere ntregi compuse n care satisfac
relaia (33.42) pentru orice a Z

n
. Aceti ntregi se numesc numere Carmichael . Primele
trei numere Carmichael sunt 561, 1105 i 1729. Numerele Carmichael sunt extrem de rare; de
exemplu, exist numai 255 astfel de numere mai mici dect 100000000. Exerciiul 33.8-2 ajut
la explicarea acestui fapt.
n continuare, artm cum se mbuntete testul de numr prim, astfel nct acesta s nu
e nelat de numere Carmichael.
Testul aleator de primalitate al lui Miller-Rabin
Testul de numr prim al lui Miller-Rabin depete problemele testului simplu Pseudoprim
prin dou modicri:
ncearc s aleag aleator diferite valori ale bazei a n loc de o singur valoare.
n timp ce calculeaz ecare exponeniere modular, stabilete dac nu cumva a fost
descoperit o rdcin netrivial a lui 1 modulo n. Dac este aa, se oprete cu ieirea
compus. Corolarul 33.35 justic detectarea numerelor compuse n acest fel.
Algoritmul pentru testul de numr prim al lui Miller-Rabin este prezentat mai jos. Intrarea
n > 2 este numrul impar care se testeaz dac este prim, iar s este valoarea bazei aleas
aleator din Z
+
n
pentru a se face testul. Algoritmul utilizeaz generatorul de numere aleatoare
Random din seciunea 8.3: Random(1, n1) returneaz un numr a ales aleator care satisface
1 a n1. Algoritmul utilizeaz o procedur auxiliar Proba, astfel nct Proba(a, n) este
adevrat dac i numai dac a este o prob pentru proprietatea de compus a lui n adic,
dac este posibil s se demonstreze (n maniera n care vom vedea) utiliznd a, c n este compus.
Testul Proba(a, n) este similar cu (dar mult mai ecient dect) testul
a
n1
1 (mod n)
720 Capitolul 33 Algoritmi din teoria numerelor
care a stat (utiliznd a = 2) la baza algoritmului Pseudoprim. Mai nti prezentm i justicm
construcia lui Proba i, apoi, artm cum se utilizeaz aceasta n testul Miller-Rabin.
Proba(a, n)
1: e 'b
k
, b
k1
, . . . , b
0
` reprezentarea binar a lui n-1
2: d 1
3: pentru i k, 0, 1 execut
4: x d
5: d (d d) mod n
6: dac d = 1 i x = 1 i x = n 1 atunci
7: returneaz adevrat
8: dac b
i
= 1 atunci
9: d (d a) mod n
10: dac d = 1 atunci
11: returneaz adevrat
12: returneaz fals
Acest algoritm pentru Proba se bazeaz pe procedura Exponeniere-Modular. Linia 1
determin reprezentarea binar a lui n 1, care va folosit la ridicarea lui a la puterea n 1.
Liniile 39 calculeaz pe d ca ind a
n1
mod n. Metoda utilizat este identic cu cea utilizat
de Exponeniere-Modular. Ori de cte ori se face un pas de ridicare la ptrat n linia a 5-a,
liniile 67 veric dac nu s-a descoperit chiar o rdcin ptrat netrivial a lui 1. Dac este
aa, algoritmul se oprete i returneaz adevrat. Liniile 1011 returneaz fals dac valoarea
calculat pentru a
n1
mod n nu este egal cu 1, aa cum procedura Pseudoprim returneaz
compus, n acelai caz.
Acum argumentm c, dac Proba(a, n) returneaz adevrat, atunci, se poate construi
folosind a o demonstraie a faptului c n este compus.
Dac Proba returneaz adevrat n linia 11, atunci algoritmul a gsit c d = a
n1
mod
n = 1. Dac n este prim, totui, pe baza teoremei lui Fermat (teorema 33.31), avem a
n1
1
(mod n) pentru orice a Z
+
n
. De aceea, n nu poate prim, iar ecuaia a
n1
mod n = 1 este o
demonstraie a acestui fapt.
Dac Proba returneaz adevrat n linia 7, atunci s-a descoperit c x este o rdcin
ptrat netrivial a lui 1 modulo n, deoarece avem x 1 (mod n) i x
2
1 (mod n). Corolarul
33.35 arm c, numai dac n este compus, poate s existe o rdcin ptrat netrivial a lui 1
modulo n, deci o demostraie a faptului c x este o rdcin ptrat netrivial a lui 1 modulo n
demonstreaz faptul c n este compus.
Aceasta completeaz demonstraia noastr asupra corectitudinii lui Proba. Dac apelul
Proba(a, n) returneaz adevrat, atunci n este, cu siguran compus, iar o demonstraie a
faptului c n este compus poate uor determinat din a i n. Acum, examinm testul de numr
prim al lui Miller-Rabin bazat pe utilizarea lui Proba.
Miller-Rabin(n, s)
1: pentru j 1, s execut
2: a Random(1, n 1)
3: dac Proba(a, n) atunci
4: returneaz compus Denitiv
5: returneaz prim Aproape sigur
33.8. Testul de primalitate 721
Procedura Miller-Rabin este o cutare probabilistic pentru a demonstra c n este compus.
Ciclul principal (care ncepe n linia 1) gsete s valori aleatoare pentru a din Z
+
n
(linia 2). Dac
una din valorile alese pentru a este o prob pentru proprietatea de numr compus a lui n, atunci
Miller-Rabin returneaz compus n linia 4. O astfel de ieire este totdeauna corect, datorit
corectitudinii lui Proba. Dac din s ncercri nu se gsete nici o prob, algoritmul Miller-
Rabin presupune c acest lucru se datoreaz faptului c nu s-a gsit nici o prob i returneaz
c n este prim. Vom vedea c aceast ieire este probabil corect dac s este destul de mare, dar
exist o mic ans ca procedura s e nenorocoas n alegerea lui a i ca probele s existe chiar
dac nu s-a gsit nici una.
Pentru a ilustra procedura lui Miller-Rabin, e n numrul Charmichael 561. Presupunnd
c a = 7 este aleas ca baz, gura 33.4 arat c Proba a descoperit o rdcin ptrat netrivial
a lui 1 n ultimul pas de ridicare la ptrat, deoarece a
280
67 (mod n) i a
560
1 (mod n).
De aceea, a = 7 este o prob n stabilirea faptului c n este compus, Proba(7, n) returneaz
adevrat, iar Miller-Rabin, compus.
Dac n este un numr care are reprezentarea binar pe bii, Miller-Rabin necesit O(s)
operaii aritmetice i O(s
3
) operaii pe bii, deoarece se cer nu mai mult dect s exponenieri
modulare.
Rata de eroare a testului de primalitate Miller-Rabin
Dac algoritmul Miller-Rabin returneaz prim, atunci exist o mic ans de eroare. Spre
deosebire de Pseudoprim, ansa de eroare nu depinde de n; nu exist intrri defavorabile
pentru aceast procedur. Mai degrab depinde de dimensiunea lui s i de norocul avut la
alegerea valorilor bazei a. De asemenea, deoarece ecare test este mai riguros dect un simplu
test al ecuaiei (33.42), ne putem atepta, pe baza principiilor generale, ca rata erorii s e
mai mic pentru numere ntregi n alese aleator. Urmtoarea teorem prezint un argument mai
convingtor.
Teorema 33.38 Dac n este un numr compus impar, atunci numrul de probe pentru propri-
etatea de numr compus a lui n este de cel puin (n 1)/2.
Demonstraie. Demonstraia const n a arta c numrul de nonprobe nu este mai mare dect
(n 1)/2, ceea ce implic teorema.
S observm c orice nonprob trebuie s e un membru al lui Z

n
, deoarece orice nonprob
a satisface a
n1
1 (mod n), n plus, dac cmmdc(a, n) = d > 1 atunci, conform corolarului
33.21, nu exist nici o soluie x a ecuaiei ax 1 (mod n). (n particular, x = a
n2
nu este o
soluie.) Astfel, orice membru al lui Z
n
Z

n
este o prob a proprietii de compus pentru n.
Pentru a completa demonstraia, vom arta c nonprobele sunt coninute toate ntr-un
subgrup B propriu al lui Z

n
. Din corolarul 33.16 avem [B[ [Z

n
[/2. Deoarece [Z

n
[ n 1,
obinem [B[ (n 1)/2. De aceea, numrul de nonprobe este cel mult (n 1)/2, deci numrul
de probe trebuie s e cel puin (n 1)/2.
S artm modalitatea de obinere a unui subgrup propriu B al lui Z

n
care conine toate
nonprobele. mprim demonstraia n dou cazuri.
Exist un x Z

n
, astfel nct:
x
n1
1 (mod n). (33.43)
722 Capitolul 33 Algoritmi din teoria numerelor
Fie B = b Z

n
: b
n1
1 (mod n). ntruct B este o mulime nchis n raport cu nmulirea
modulo n, rezult c B este un subgrup al lui Z

n
, conform teoremei 33.14. S observm c
orice nonprob aparine lui B, deoarece o nonprob a satisface a
n1
1 (mod n). Deoarece
x Z

n
B, rezult c B este un subgrup propriu al lui Z

n
.
Pentru orice x Z

n
,
x
n1
1 (mod n). (33.44)
n acest caz, n nu poate o putere a unui numr prim. Pentru a vedea de ce, e n = p
e
unde
p este un numr prim impar i e > 1. Teorema 33.32 implic faptul c Z

n
conine un element
g, astfel nct ord
n
(g) = [Z

n
[ = (n) = (p 1)p
e1
. Dar atunci ecuaia (33.44) i teorema
logaritmului discret (teorema 33.33 pentru y = 0) implic faptul c n 1 0 (mod (n)), sau
(p 1)p
e1
[p
e
1.
Aceast condiie eueaz pentru e > 1, deoarece n caz contrar partea stng ar divizibil cu
p dar partea dreapt nu. Astfel, n nu este o putere a unui numr prim.
ntruct n nu este o putere a unui numr prim, l descompunem ntr-un produs n
1
n
2
, unde
n
1
i n
2
sunt mai mari dect 1 i relativi primi. (Pot exista diferite moduri de a realiza acest
lucru i nu are importan care anume a fost ales. De exemplu, dac n = p
e
1
1
p
e
2
2
p
e
r
r
, atunci
putem alege n
1
= p
e
1
1
i n
2
= p
e
2
2
p
e
3
3
p
e
r
r
.)
Se denesc t i u astfel nct n 1 = 2
t
u, unde t 1 i u este impar. Pentru orice a Z

n
,
considerm irul
a = 'a
u
, a
2u
, a
2
2
u
, . . . , a
2
t
u
`, (33.45)
unde toate elementele sunt calculate modulo n. Deoarece 2
t
[n 1, reprezentarea binar a lui
n1 se termin cu t zerouri, iar elementele lui a sunt ultimele t +1 valori ale lui d, calculate prin
Proba pe parcursul unui calcul al lui a
n1
mod n; ultimele t operaii sunt ridicri la ptrat.
Determinm un j 0, 1, . . . , t astfel nct s existe un v Z

n
pentru care v
2
j
u
1 (mod
n); j ar trebui s e ct mai mare posibil. Un astfel de j exist cu siguran deoarece u este
impar: putem alege v = 1 i j = 0. Fixm pe v astfel nct condiia dat s e satisfcut. Fie
B = x Z

n
: x
2
j
u
1 (mod n).
ntruct mulimea B este nchis n raport cu nmulirea modulo n, ea este un subgrup al lui
Z

n
. De aceea, [B[ divide [Z

n
[. Orice nonprob trebuie s e un element al mulimii B, deoarece
irul (33.45) produs de o nonprob trebuie s aib toi termenii 1 sau s conin un element egal
cu 1 pe primele j poziii, datorit maximalitii lui j.
Folosim acum existena lui v pentru a demonstra c exist un w Z

n
B. ntruct v
2
j
u
1
(mod n), avem v
2
j
u
1 (mod n
1
) conform corolarului 33.29. Pe baza corolarului 33.28, exist
un w care satisface simultan ecuaiile:
w = v (mod n
1
),
w = 1 (mod n
2
).
De aceea,
w
2
j
u
1 (mod n
1
),
w
2
j
u
1 (mod n
2
).
33.8. Testul de primalitate 723
mpreun cu corolarul 33.29, aceste ecuaii implic faptul c
w
2
j
u
1 (mod n), (33.46)
i astfel w B. ntruct v Z

n
, avem c v Z

n
1
. Astfel, w Z

n
i w Z

n
B. Deducem c
B este un subgrup propriu al lui Z

n
.
n ambele cazuri, se observ c numrul probelor pentru proprietatea de numr compus al
lui n este cel puin (n 1)/2.
Teorema 33.39 Pentru orice ntreg impar n > 2 i orice ntreg pozitiv s, probabilitatea ca
Miller-Rabin(n, s) s greeasc este de cel mult 2
s
.
Demonstraie. Utiliznd teorema 33.38, observm c, dac n este compus, atunci ecare
execuie a ciclului din liniile 14 descoper o prob x pentru proprietatea de numr compus
al lui n, cu o probabilitate de cel puin 1/2. Miller-Rabin greete numai dac este aa de
nenorocoas nct nu gsete o prob pentru proprietatea de numr compus al lui n la nici una
din cele s iteraii ale ciclului principal. Probabilitatea unui astfel de ir de ratri este de cel mult
2
s
.
Astfel, s = 50 ar trebui s e sucient pentru aproape orice aplicaie imaginabil. Dac
ncercm s gsim numere prime mari aplicnd Miller-Rabin la ntregi mari ,
atunci se poate argumenta (dei nu o vom face aici) c alegnd o valoare mic pentru s (de
exemplu 3) este puin probabil s m condui la rezultate eronate. Adic, pentru un numr
ntreg impar n compus, ales aleator, numrul mediu de nonprobe pentru proprietatea de numr
compus a lui n este probabil mult mai mic dect (n1)/2. Dac ntregul n nu este ales aleator,
totui, cel mai bun rezultat de pn acum (folosind o versiune mbuntit a teoremei 33.39)
este c numrul de nonprobe este cel mult (n1)/4. Mai mult dect att, exist numere ntregi
n pentru care numrul de nonprobe este (n 1)/4.
Exerciii
33.8-1 Demonstrai c, dac un ntreg impar n > 1 nu este un numr prim sau o putere a unui
numr prim, atunci exist o rdcin ptrat netrivial a lui 1 modulo n.
33.8-2 Este posibil s se ntreasc puin teorema lui Euler sub forma
a
(n)
1 (mod n) pentru orice a Z

n
,
unde (n) se denete prin
(n) = cmmmc((p
e
1
1
), . . . , (p
e
r
r
)). (33.47)
Artai c (n) [ (n). Un numr compus n este un numr Carmichael dac (n) [ n 1. Cel
mai mic numr Carmichael este 561 = 3 11 17; aici (n) = cmmmc(2, 10, 16) = 80, care divide
pe 560. Demonstrai c numerele Carmichael trebuie s e att libere de ptrate (s nu e
divizibile prin ptratul nici unui numr prim) ct i produsul a cel puin trei numere prime. Din
acest motiv, ele nu sunt prea rspndite.
33.8-3 Artai c, dac x este o rdcin ptrat netrivial a lui 1 modulo n, atunci cmmdc(x
1, n) i cmmdc(x + 1, n) sunt divizori netriviali ai lui n.
724 Capitolul 33 Algoritmi din teoria numerelor
33.9. Factorizarea ntreag
Presupunem c avem un ntreg n pe care dorim s-l factorizm, adic, s-l descompunem
ntr-un produs de numere prime. Testul de numr prim, din seciunea precedent, ne va spune c
n este compus, dar nu ne va spune i factorii lui n. Factorizarea unui numr ntreg mare n pare a
mult mai dicil dect simpla determinare dac n este prim sau compus. Cu supercalculatoarele
de azi i cu cei mai buni algoritmi cureni factorizarea unui numr arbitrar cu 200 de cifre
zecimale este irealizabil.
Euristica rho a lui Pollard
ncercarea de a mpri cu toate numerele ntregi pn la B garanteaz factorizarea complet
a oricrui numr pn la B
2
. Cu aceeai cantitate de munc, urmtoarea procedur va factoriza
orice numr pn la B
4
(exceptnd cazul n care suntem nenorocoi). ntruct procedura este
doar euristic, nici timpul ei de execuie i nici succesul ei nu sunt garantate, dei este foarte
ecient n practic.
Pollard-Rho(n)
1: i 1
2: x
1
Random(0, n 1)
3: y x
1
4: k 2
5: ct timp adevrat execut
6: i i + 1
7: x
i
(x
2
i1
1) mod n
8: d cmmdc(y x
i
, n)
9: dac d = 1 i d = n atunci
10: scrie d
11: dac i = k atunci
12: y x
i
13: k 2k
Procedura funcioneaz dup cum urmeaz: liniile 12 iniializeaz pe i cu 1 i pe x
1
cu o
valoare aleas aleator din Z
n
. Ciclul ct timp, care ncepe n linia 5, itereaz la innit cutnd
factorii lui n. n timpul ecrei iteraii a ciclului ct timp, relaia de recuren:
x
i
(x
2
i1
1) mod n (33.48)
este utilizat n linia 7 pentru a produce valoarea urmtoare a lui x
i
din irul innit
x
1
, x
2
, x
3
, x
4
, . . . ; (33.49)
valoarea lui i este incrementat corespunztor n linia 6. Codul este scris utiliznd variabilele
x
i
cu indici pentru claritate, dar programul funcioneaz la fel dac se elimin indicii deoarece
doar valoarea cea mai recent a lui x
i
trebuie pstrat.
33.9. Factorizarea ntreag 725
Programul salveaz cea mai recent generat valoare x
i
n variabila y. Mai exact, valorile care
sunt salvate sunt cele care au indici puteri ale lui 2:
x
1
, x
2
, x
4
, x
8
, x
16
, . . . .
Linia 3 salveaz valoarea x
1
, iar linia 12 valoarea x
k
ori de cte ori i este egal cu k. Variabila k
se iniializeaz cu 2 n linia 4, k este dublat n linia 13 ori de cte ori y este actualizat. De aceea,
k urmeaz irul 1, 2, 4, 8, ... i denete, ntotdeauna, indicele urmtoarei valori x
k
de salvat n
y. Liniile 810 ncearc s gseasc un factor al lui n utiliznd valoarea salvat a lui y i valoarea
curent a lui x
i
. Mai exact, linia 8 calculeaz cel mai mare divizor comun d = cmmdc(y x
i
, n).
Dac d este un divizor netrivial al lui n (vericat n linia 9), atunci linia 10 l scrie pe d.
Aceast procedur conceput pentru a gsi un factor poate prea, ntr-o oarecare msur,
misterioas pentru nceput. Totui, s observm c Pollard-Rho nu aeaz niciodat un
rspuns incorect; orice numr pe care-l aeaz este un divizor netrivial al lui n. Totui,
Pollard-Rho poate s nu aeze nimic; nu exist nici o garanie c algoritmul va produce
vreun rezultat. Vom vedea c exist, totui, un motiv bun s ne ateptm ca Pollard-Rho
s aeze un factor p al lui n dup aproximativ

p iteraii ale ciclului ct timp. Astfel, dac
n este compus, ne putem atepta ca aceast procedur s descopere destui divizori pentru a
factoriza complet pe n dup aproximativ n
1/4
actualizri, deoarece ecare factor prim p al lui
n, exceptndu-l pe cel mai mare posibil, este mai mic dect

n.
Analizm comportamentul acestei proceduri studiind ct de lung este un ir aleator, modulo
n, pentru a repeta o valoare. Deoarece Z
n
este nit i ecare valoare din irul (33.49) depinde
numai de valoarea precedent, se repet, eventual, irul (33.49). O dat ce se ajunge la x
i
, astfel
nct x
i
= x
j
pentru j < i, suntem ntr-un ciclu, deoarece x
i+1
= x
j+1
, x
i+2
= x
j+2
i aa
mai departe. Motivul pentru care acest procedeu se numete euristica rho este acela c, aa
cum arat gura 33.7, irul x
1
, x
2
, . . . , x
j1
poate desemnat ca o coad a lui rho, iar ciclul
x
j
, x
j+1
, . . . , x
i
drept corpul lui rho.
S examinm ct dureaz pn cnd irul x
i
ncepe s se se repete. Cu puine modicri,
vom putea folosi mai trziu rezultatul obinut.
n scopul acestei estimri, s presupunem c funcia (x
2
1) mod n se comport ca o funcie
aleatoare. Desigur, n realitate, ea nu este aleatoare, dar aceast presupunere produce rezultate
compatibile cu comportamentul algoritmului Pollard-Rho. Putem, apoi, considera c ecare x
i
a fost ales independent din Z
n
potrivit unei distribuii uniforme pe Z
n
. Prin analiza paradoxului
zilei de natere, din seciunea 6.6.1, numrul mediu de pai anteriori ciclrii irului este (

n).
Acum, urmeaz modicarea cerut. Fie p un factor netrivial al lui n, astfel nct cmmdc(p,
n/p) = 1. De exemplu, dac n are factorizarea n = p
e
1
1
p
e
2
2
p
e
r
r
, putem s-l lum pe p chiar
p
e
1
1
. (Dac e
1
= 1, atunci p este chiar cel mai mic factor prim al lui n, un exemplu bun de inut
minte.) irul 'x
i
` induce un ir corespunztor 'x
t
i
` modulo p, unde
x
t
i
= x
i
mod p
pentru orice i. Mai mult dect att, din teorema chinez a restului avem
x
t
i+1
= (x
t
i
2
1) mod p (33.50)
deoarece
(x mod n) mod p = x mod p,
726 Capitolul 33 Algoritmi din teoria numerelor
Figura 33.7 Euristica rho a lui Pollard. (a) Valorile produse prin recurena x
i+1
(x
2
i
1) mod 1387,
ncepnd cu x
1
= 2. Factorizarea n numere prime a lui 1387 este 19 73. Sgeile ngroate indic paii
iteraiei care sunt executai nainte ca factorul 19 s e descoperit. Sgeile subiri indic spre valori
neatinse n iteraie pentru a ilustra forma de rho. Valorile haurate sunt valorile y memorate prin
Pollard-Rho. Factorul 19 este descoperit dup ce este atins x
7
= 177, cnd este calculat cmmdc(63
177, 1387) = 19. Prima valoare x care va repetat este 1186, dar factorul 19 este descoperit nainte
de a atinge aceast valoare. (b) Valorile produse prin aceeai recuren, modulo 19. Fiecare valoare x
i
,
dat n partea (a), este echivalent modulo 19 cu valoarea x

i
indicat aici. De exemplu, att x
4
= 63,
ct i x
7
= 177 sunt echivalente cu 6 modulo 19. (c) Valorile produse prin aceeai recuren, modulo
73. Fiecare valoare x
i
, prezentat n partea (a), este echivalent, modulo 73, cu valoarea x

i
prezentat
aici. Din teorema chinez a restului, rezult c ecare nod din partea (a) corespunde unei perechi de
noduri, unul din partea (b) i unul din partea (c).
pe baza exerciiului 33.1-6.
Raionnd analog, gsim c numrul mediu de pai, nainte ca irul 'x
t
i
` s se repete, este
(

p). Dac p este mic n comparaie cu n, irul 'x


t
i
` se poate repeta mult mai rapid dact irul
'x
i
`. ntr-adevr, irul 'x
t
i
` se repet de ndat ce dou elemente ale irului 'x
i
` sunt echivalente
numai modulo p, i nu echivalente modulo n. Pentru o ilustrare, vezi gura 33.7, prile (b) i
(c).
Fie t indicele primei valori repetate n irul 'x
t
i
` i e u > 0 lungimea ciclului care a fost
produs n acest fel. Adic, t i u > 0 sunt cele mai mici valori, astfel nct x
t
t+i
= x
t
t+u+i
pentru
orice i 0. Prin argumentele de mai sus, valorile medii ale lui t i u sunt (

p). S observm
c, dac x
t
t+i
= x
t
t+u+i
, atunci p [ (x
t+u+i
x
t+i
). Astfel, cmmdc(x
t+u+i
x
t+i
, n) > 1.
De aceea, o dat ce Pollard-Rho a salvat n y orice valoare x
k
, astfel nct k t, atunci
33.9. Factorizarea ntreag 727
y mod p este totdeauna n ciclul modulo p. (Dac o valoare nou este salvat n y, acea valoare
este, de asemenea, n ciclul modulo p.) n nal, k primete o valoare care este mai mare dect
u i apoi procedura face un ciclu ntreg n jurul ciclului modulo p fr a schimba valoarea lui y.
Apoi, este gsit un factor al lui n cnd x
i
se execut cu valoarea memorat n prealabil n y,
modulo p, adic atunci cnd x
i
y (mod p).
Probabil c factorul gsit este factorul p, dei se poate, n mod ocazional, s se descopere
un multiplu al lui p. Deoarece valorile medii, att ale lui t, ct i ale lui u sunt (

p), numrul
mediu de pai necesari pentru a determina factorul p este (

p).
Exist dou motive pentru care acest algoritm nu se execut aa cum este de ateptat. nti,
analiza euristic a timpului de execuie nu este riguroas i este posibil ca ciclul de valori, modulo
p, s e mai mare dect

p. n acest caz, algoritmul se execut corect, dar mult mai ncet dect
s-a sperat. n practic, aceasta se pare c nu este o problem. n al doilea rnd, divizorii lui n
produi de acest algoritm ar putea, totdeauna, s e unul din factorii triviali 1 sau n. De exemplu,
presupunem c n = pq, unde p i q sunt numere prime. Se poate ntmpla ca valorile lui t i u,
pentru p, s e identice cu valorile lui t i u pentru q i astfel factorul p este totdeauna gsit
n aceeai operaie cmmdc care descoper factorul q. Deoarece ambii factori sunt descoperii n
acelai timp, este descoperit factorizarea trivial pq = n, care este inutil. Din nou, aceasta
nu pare a o problem real n practic. Dac este necesar, se poate rencepe euristica, cu o
recuren diferit, de forma x
i+1
(x
2
i
c) mod n. (Valorile c = 0 i c = 2 ar trebui s e
eliminate pentru motive nejusticate aici, dar alte valori sunt bune.)
Desigur, aceast analiz este euristic i nu este riguroas, deoarece recurena nu este n
realitate aleatoare. Mai mult dect att, procedura se execut bine n practic i se pare c
este ecient aa cum indic aceast analiz euristic. Este o metod recomandat pentru a
gsi factori primi mici ai unui numr mare. Pentru a factoriza complet un numr compus n,
reprezentat pe bii, este nevoie numai s gsim toi factorii primi mai mici dect n
1/2
| i ne
putem atepta ca Pollard-Rho s necesite cel mult n
1/4
= 2
/4
operaii aritmetice i cel mult
n
1/4

3
= 2
/4

3
operaii pe bii. Abilitatea lui Pollard-Rho de a gsi un factor mic p al lui n
cu un numr mediu (

p) de operaii aritmetice este deseori cea mai atractiv caracteristic.


Exerciii
33.9-1 Conform execuiei aciunilor vizualizate n gura 33.7 (a), cnd se tiprete factorul 73
al lui 1387 n procedura Pollard-Rho?
33.9-2 Presupunem c se d o funcie f : Z
n
Z
n
i o valoare iniial x
0
Z
n
. Denim
x
i
= f(x
i1
) pentru i = 1, 2, . . .. Fie t i u > 0 cele mai mici valori astfel nct x
t+i
= x
t+u+i
pentru i = 0, 1, . . .. n terminologia algoritmului rho a lui Pollard, t este lungimea cozii i u este
lungimea ciclului lui rho. Elaborai un algoritm ecient pentru a determina exact pe t i pe u i
analizai timpul de execuie.
33.9-3 Ci pai va necesita Pollard-Rho pentru a descoperi un factor de forma p
e
, unde p
este prim i e > 1?
33.9-4 Un dezavantaj al lui Pollard-Rho, aa cum s-a scris, este c cere calculul lui cmmdc
pentru ecare pas al recurenei. S-a sugerat s grupm calculul cmmdc acumulnd produsul
diferiilor x
i
ntr-o linie i lund, apoi, cmmdc pentru acest produs, cu valoarea salvat n y.
Descriei cum s-ar putea implementa aceast idee, de ce funcioneaz i ce dimensiune ar trebui
728 Capitolul 33 Algoritmi din teoria numerelor
aleas pentru a cea mai ecient atunci cnd se lucreaz asupra unui numr n reprezentat pe
bii.
Probleme
33-1 Algoritm cmmdc binar
Pe cele mai multe calculatoare, operaiile de scdere, de testare a paritii (impar sau par)
unui numr ntreg binar i njumtire pot realizate mai rapid dect calculul resturilor.
Aceast problem studiaz algoritmul cmmdc binar, care elimin calculul resturilor utilizat
n algoritmul lui Euclid.
a. Demonstrai c, dac a i b sunt pari, atunci cmmdc(a, b) = 2 cmmdc(a/2, b/2).
b. Demonstrai c, dac a este impar i b par, atunci cmmdc(a, b) = cmmdc(a, b/2).
c. Demonstrai c, dac a i b sunt impari, atunci cmmdc(a, b) = cmmdc((a b)/2, b).
d. Proiectai un algoritm cmmdc binar ecient pentru numerele ntregi a i b, unde a b,
care s se execute ntr-un timp O(lg(max(a, b)). Se presupune c ecare scdere, test de
paritate i njumtire se execut ntr-o unitate de timp.
33-2 Analiza operaiilor pe bii n algoritmul lui Euclid
a. Artai c utilizarea algoritmului banal cu creion i hrtie pentru mprirea a dou
numere ntregi mari a i b, obinndu-se ctul q i restul r, necesit O((1 + lg q) lg b)
operaii pe bii.
b. Se denete (a, b) = (1 + lg a)(1 + lg b). Artai c numrul operaiilor pe bii executate
de algoritmul Euclid, pentru a reduce problema calculului lui cmmdc(a, b) la cea a lui
cmmdc(b, a mod b), este cel mult c((a, b) (b, a mod b)) pentru o constant c > 0
sucient de mare.
c. Artai c algoritmul Euclid(a, b) necesit, O((a, b)) operaii pe bii n general, i O(
2
)
operaii pe bii dac algoritmul are ca intrare dou numere ntregi reprezentate pe bii.
33-3 Trei algoritmi pentru numerele Fibonacci
Aceast problem compar eciena a trei metode pentru calculul celui de al n-lea numr al lui
Fibonacci F
n
, pentru un n dat. Costul pentru adunare, scdere sau nmulire a dou numere
este O(1), independent de dimensiunea numerelor.
a. Artai c timpul de execuie al metodei recursive directe pentru calculul lui F
n
, bazat pe
recurena (2.13), este exponenial n raport cu n.
b. Artai cum se poate calcula F
n
ntr-un timp de ordinul lui O(n) utiliznd memorarea.
c. Artai cum se poate calcula F
n
ntr-un timp O(lg n) utiliznd numai adunri i nmuliri
de ntregi. ( se consider matricea

0 1
1 1

Note bibliograce 729


i puterile ei).
d. Se presupune acum c, adunarea a dou numere avnd reprezentarea binar pe bii
necesit un timp () i c, nmulirea a dou numere avnd reprezentarea binar pe
bii necesit timpul (
2
). Care este timpul de execuie al acestor trei metode considernd
aceast msur a costului n timp, mult mai rezonabil pentru operaiile aritmetice
elementare?
33-4 Reziduuri ptratice
Fie p un numr prim impar. Un numr a Z

p
este un reziduu ptratic dac ecuaia x
2
= a
(mod p) are o soluie pentru necunoscuta x.
a. Artai c exist exact (p 1)/2 reziduuri ptratice modulo p.
b. Dac p este prim, denim simbolul lui Legendre

a
p

pentru a Z

p
, ca ind 1, dac a
este un reziduu ptratic modulo p, i 1 altfel. Artai c, dac a Z

p
, atunci

a
p

a
(p1)/2
(mod p).
Elaborai un algoritm ecient pentru a determina dac un numr dat a este sau nu un
reziduu ptratic modulo p. S se analizeze eciena algoritmului.
c. Demonstrai c, dac p este prim de forma 4k+3 i a este un reziduu ptratic n Z

p
, atunci
a
k+1
mod p este o rdcin ptrat a lui a, modulo p. Ct timp este necesar pentru a gsi
rdcina ptrat dintr-un reziduu ptratic a modulo p?
d. Descriei un algoritm de randomizare ecient pentru a gsi un reziduu neptratic, modulo
un numr prim p arbitrar. Cte operaii aritmetice necesit, n medie, algoritmul?
Note bibliograce
Niven i Zuckerman [151] furnizeaz o introducere excelent n teoria elementar a numerelor.
Lucrarea lui Knuth [122] conine o discuie bun despre algoritmul de gsire a celui mai ma-
re divizor comun, precum i despre ali algoritmi din teoria numerelor. Riesel [168] i Bach
[16] furnizeaz studii mai recente asupra teoriei calculului numeric. Dixon [56] d o privire
general asupra factorizrii i testrii proprietii de numr prim. Lucrrile conferinei editate
de Pomerance [159] conin diferite articole interesante de ordin general.
Knuth [122] discut originea algoritmului lui Euclid. El a aprut n cartea 7, propoziiile 1
i 2 din lucrarea a matematicianului grec Euclid, care a fost scris n jurul anului
300 .Hr. Descrierea lui Euclid ar putea deriva din algoritmul dat de Eudoxus n jurul anului
375 .Hr. Algoritmul lui Euclid are onoarea de a cel mai vechi algoritm netrivial i cu acesta
rivalizeaz numai algoritmul ranului rus pentru nmulire capitolul 29, care a fost cunoscut
n Egiptul antic.
Knuth atribuie un caz particular al teoremei chinezeti a restului matematicianului chinez
Sun-Ts u care a trit, aproximativ, ntre 200 .Hr. i 200 d.Hr. data este foarte inexact. Acelai
730 Capitolul 33 Algoritmi din teoria numerelor
caz particular a fost dat de matematicianul grec Nichomachus n jurul anului 100 d.Hr. Acesta a
fost generalizat de Chhin Chiu-Shao n 1247. Teorema chinez a restului a fost, n nal, enunat
i demonstrat complet, n generalitatea sa, de ctre L. Euler n 1734.
Algoritmul aleator de test al primalitii prezentat aici se datoreaz lui Miller [147] i Rabin
[166]; este cel mai rapid algoritm aleator cunoscut, care veric proprietatea de numr prim,
abstracie fcnd de factori constani. Demonstraia teoremei 33.39 este o uoar adaptare a celei
sugerate de Bach [15]. O demonstraie a unui rezultat mai puternic pentru Miller-Rabin a fost
dat de Monier [148, 149]. Randomizarea s-a dovedit a necesar pentru a obine un algoritm
care veric proprietatea de primalitate, ntr-un timp polinomial. Cel mai rapid algoritm care
veric proprietatea de primalitate, demonstrat este versiunea Cohen-Lenstra [45] a testului de
primalitate al lui Adleman, Pomerance i Rumely [3]. Testul care veric dac un numr n
de lungime lg(n + 1)| este prim, se execut n timpul (lg n)
O(lg lg lg n)
, ceea ce este chiar uor
superpolinomial.
Problema gsirii aleatoare a numerelor prime mari este discutat frumos ntr-un articol al
lui Beauchemin, Brassard, Crpeau, Goutier i Pomerance [20].
Conceptul de criptosistem cu cheie public se datoreaz lui Die i Hellman [54]. Cripto-
sistemul RSA a fost propus n 1977 de Rivest, Shamir i Adleman [169]. De atunci, domeniul
criptograei a cunoscut o dezvoltare deosebit. n particular, au fost dezvoltate tehnici noi pentru
a demonstra sigurana criptosistemelor. De exemplu, Goldwasser i Micali [86] au artat c
randomizarea poate un instrument ecient n proiectarea schemelor de criptare sigure cu cheie
public. Pentru schemele de semnturi, Goldwasser, Micali i Rivest [88] prezint o schem de
semntur digital pentru care ecare tip de falsicare posibil de imaginat este, probabil, tot
att de dicil ca factorizarea. Recent, Goldwasser, Micali i Racko [87] au introdus o clas de
scheme de criptare de cunotine nule pentru care se poate demonstra (n anumite presupuneri
rezonabile) c nici o parte nu nva mai mult dect i s-a propus s nvee dintr-o comunicaie.
Euristica rho pentru factorizarea ntreag a fost inventat de Pollard [156]. Versiunea
prezentat aici este o variant propus de Brent [35].
Cei mai buni algoritmi de factorizare a numerelor mari au un timp de execuie care
crete exponenial cu rdcina ptrat din lungimea numrului n de factorizat. Algoritmul de
factorizare prin ranare ptrratic datorat lui Pomerance [158] este, probabil, cel mai ecient
algoritm de acest fel pentru intrri mari. Dei este dicil s se dea o analiz riguroas a acestui
algoritm, n condiii rezonabile, putem deduce o estimare a timpului de execuie prin L(n)
1+o(1)
,
unde L(n) = e

ln nln ln n
. Metoda curbei eliptice, datorat lui Lenstra [137], poate mai ecient
pentru anumite date de intrare dect metoda prin ranare ptratic, deoarece, la fel ca metoda
rho a lui Pollard, ea poate gsi un factor prim mic destul de repede. Cu aceast metod, timpul
pentru determinarea lui p este estimat la L(p)

2+o(1)
.
34 Potrivirea irurilor
Determinarea tuturor apariiilor unui model, ntr-un text, este o problem frecvent ntlnit la
editoarele de texte. De obicei, textul este un document n editare i modelul cutat este un anumit
cuvnt, dat de utilizator. Algoritmi ecieni pentru aceast problem pot ajuta la mbuntirea
performanelor editoarelor de texte. Algoritmi de potrivire a irurilor sunt utilizai, de asemenea,
n cutarea de modele particulare n secvene ADN.
n continuare, vom prezenta un model formal pentru problema potrivirii irurilor. Pre-
supunem c textul este un vector T[1..n] de lungime n i c modelul cutat este un vector P[1..m]
de lungime m n. n plus, presupunem c elementele din P i T au caractere dintr-un alfabet
nit . De exemplu putem avea = 0, 1 sau = a,b,...,z. Tablourile de caractere P i
T sunt, de obicei, numite iruri de caractere.
Spunem c modelul P apare cu deplasament s n textul T (sau, echivalent, c modelul P
apare ncepnd cu poziia s+1 n textul T) dac 0 s nm i T[s +1..s +m] = P[1..m]
(adic, dac T[s + j] = P[j], pentru 1 j m). Dac P apare cu deplasament s n T,
atunci numim s un deplasament corect; altfel, numim s un deplasament incorect. Problema
potrivirii irurilor este problema determinrii tuturor deplasamentelor corecte cu care un model
dat P apare ntr-un text dat T. Figura 34.1 ilustreaz aceste deniii.
Capitolul este organizat dup cum urmeaz. n seciunea 34.1, prezentm algoritmul naiv
for-brut pentru problema potrivirii irurilor, care are, n cel mai defavorabil caz, timpul de
execuie O((n m + 1)m). n seciunea 34.2, se prezint un algoritm interesant de potrivire
a irurilor, datorat lui Rabin i Karp. Acest algoritm are, n cel mai defavorabil caz, timpul
de execuie O((n m + 1)m), dar media de funcionare este mult mai bun. De asemenea, se
poate generaliza uor pentru alte probleme de potrivire de modele. n continuare, n seciunea
34.3, se descrie un algortim de potrivire a irurilor care ncepe cu construirea unui automat
nit, special proiectat s caute ntr-un text potriviri pentru un model dat P. Acest algoritm are
timpul de execuie O(n + m[[). Algoritmul Knuth-Morris-Pratt (sau KMP), similar, dar mult
mai ingenios, este prezentat n seciunea 34.4; algoritmul KMP se execut n timpul O(n +m).
n nal, n seciunea 34.5, se descrie un algortim datorat lui Boyer i Moore care este adesea
preferat n practic, dei timpul su de execuie, n cel mai defavorabil caz (ca i la algoritmul
Rabin-Karp), nu este mai bun dect cel al algoritmultui naiv pentru potrivirea irurilor.
Figura 34.1 Problema potrivirii irurilor. Scopul este determinarea tuturor apariiilor modelului P =
abaa n textul T = abcabaabcabac. Modelul apare n text o singur dat, cu deplasamentul s = 3.
Deplasamentul s = 3 este un deplasament corect. Fiecare caracter din model este unit printr-o linie
vertical cu caracterul identic regsit n text i toate caracterele regsite sunt haurate.
732 Capitolul 34 Potrivirea irurilor
Notaii i terminologie
Vom nota cu

(citim sigma stelat) mulimea tuturor irurilor de lungime nit formate,


folosind caractere din alfabetul . n acest capitol, considerm numai iruri de lungime nit.
irul de lungime zero irul vid, notat cu , aparine de asemenea lui

. Lungimea unui ir x
este notat cu [x[. Concatenarea a dou iruri x i y, pe care o notm cu xy, are lungimea
[x[ +[y[ i conine caracterele din x urmate de caracterele din y.
Spunem c un ir w este un prex al unui ir x, notat w x, dac x = wy pentru orice
ir y

. De notat c, dac w x, atunci [w[ [x[. n mod analog, spunem c irul w este
un sux al unui ir x, notat w x, dac x = yw pentru orice y

. Din w x rezult c
[w[ [x[. irul vid este att sux ct i prex pentru orice ir. De exemplu, avem ab abcca i
cca abcca. Este folositor s observm c, pentru oricare iruri x i y i orice caracter a, avem
x y, dac, i numai dac, xa ya. De asemenea, observm c i sunt relaii tranzitive.
Urmtoarea lem va folositoare mai trziu.
Lema 34.1 (Lema de suprapunere a suxului) Presupunem c x, y i z sunt iruri, astfel
nct x z i y z. Dac [x[ [y[, atunci x y. Dac [x[ [y[, atunci y x. Dac [x[ = [y[,
atunci x = y.
Demonstraie. Urmrii gura 34.2 pentru o demonstratie grac.
Pentru prescurtarea scrierii, vom nota prexul k-caracter P[1..k], din modelul P[1..m] prin
P
k
. Deci, P
0
= i P
m
= P = P[1..m]. n mod analog, notm prexul k-caracter al textului
T cu T
k
. Folosind aceste notaii, putem considera c problema potrivirii irurilor este problema
determinrii tuturor deplasamentelor s n domeniul 0 s n m, astfel nct P T
s+m
.
n pseudocod, vom permite ca operaia de vericare a egalitii a dou iruri s e conside-
rat o operaie elementar. Dac irurile sunt comparate de la stnga la dreapta i compararea
se oprete cnd este descoperit o greeal, presupunem c timpul necesar pentru un astfel de
test depinde, dup o funcie liniar, de numrul caracterelor potrivite descoperite. Mai precis,
se presupune c testul x = y dureaz (t +1), unde t este lungimea celui mai lung ir z, astfel
nct z x i z y.
34.1. Algoritmul naiv pentru potrivirea irurilor
Algoritmul naiv gsete toate deplasrile corecte folosind un ciclu care satisface condiia
P[1..m] = T[s + 1..s +m] pentru ecare dintre cele n m+ 1 valori posibile ale lui s.
Potrivire-Naiv-a-irurilor(T, P)
1: n lungime[T]
2: m lungime[P]
3: pentru s 0, n m execut
4: dac P[1..m]=T[s + 1..s +m] atunci
5: tiprete Modelul apare cu deplasamentul s
Procedura naiv pentru potrivirea irurilor poate interpretat grac ca o deplasare peste
text a unui ablon coninnd modelul, notnd deplasamentele la care toate caracterele din
34.1. Algoritmul naiv pentru potrivirea irurilor 733
Figura 34.2 O demonstraie grac pentru lema 34.1. Presupunem c x z i y z. Cele trei cadre
ale gurii ilustreaz cele trei cazuri ale lemei. Liniile verticale unesc regiunile potrivite (haurate) ale
irurilor. (a) Dac [x[ [y[, atunci x y. (b) Dac [x[ [y[, atunci y x. (c) Dac [x[ = [y[, atunci
x = y.
Figura 34.3 Funcionarea algoritmului naiv pentru potrivirea irurilor pentru modelul P = aab i
textul T = acaabc. Ne putem imagina modelul P ca pe un ablon pe care l vom suprapune peste text.
Cadrele (a)-(d) prezint patru poziionri succesive ncercate de algoritmul naiv pentru potrivire. n
ecare cadru, liniile verticale unesc regiunile corespunztoare care se potrivesc (haurate), iar o linie n
zig-zag unete primul caracter gsit care nu se potrivete, dac acesta exist. n cadrul (c) se observ o
potrivire a modelului P, la deplasamentul s = 2.
ablon sunt egale cu caracterele corespondente din text, aa cum se poate vedea n gura 34.3.
n ciclul pentru, care ncepe n linia 3, sunt considerate explicit toate deplasamentele posibile.
n linia 4, testul determin dac deplasamentul curent este sau nu corect; acest test implic un
ciclu implicit pentru vericarea corespondenei poziiilor caracterelor pn cnd toate poziiile se
potrivesc sau pn cnd este ntlnit prima nepotrivire. Linia 5 tiprete toate deplasamentele
corecte s.
Procedura Potrivire-Naiv-a-irurilor are, n cel mai defavorabil caz, timpul de execuie
((nm+1)m). De exemplu, considerm textul a
n
(un ir format din n caractere a) i modelul
a
m
. Pentru ecare dintre cele n m+1 valori posibile ale deplasamentului s, ciclul implicit din
linia 4 de comparare a caracterelor corespondente trebuie executat de m ori pentru a valida un
deplasament. Timpul de execuie, n cel mai defavorabil caz, este atunci ((n m+ 1)m), care
este (n
2
) dac m = n/2|.
Dup cum vom vedea, Potrivire-Naiv-a-irurilor nu este procedura optim pentru
aceast problem. ntr-adevr, n acest capitol, vom prezenta un algoritm cu timpul de execuie,
n cel mai defavorabil caz, O(n +m). Algoritmul naiv este inecient deoarece informaia asupra
734 Capitolul 34 Potrivirea irurilor
textului, obinut pentru o valoare a lui s, este total ignorat la tratarea altor valori ale lui s. O
astfel de informaie poate foarte folositoare. De exemplu, dac P = aaab i gsim c s = 0 este
un deplasament corect, atunci nici unul dintre deplasamentele 1, 2 sau 3 nu este corect, deoarece
P[4] = b. n seciunile urmtoare vom examina cteva moduri pentru utilizarea acestui tip de
informaie.
Exerciii
34.1-1 Artai comparaiile fcute de algoritmul naiv pentru potrivirea irurilor n textul
T = 000010001010001 pentru modelul P = 0001.
34.1-2 Artai c algoritmul naiv pentru potrivirea irurilor gsete apariie a unui model
ntr-un text, n cel mai defavorabil caz, ntr-un timp ((n m+ 1)(m1)).
34.1-3 Presupunem c, n modelul P, toate caracterele sunt diferite. Artai cum poate
algoritmul Potrivire-Naiv-a-irurilor s se execute, pentru un text T de n caractere,
n timpul O(n).
34.1-4 Presupunem c modelul P i textul P sunt iruri obinute , de lungimi m i
respectiv, n, dintr-un alfabet
d
= 0, 1, ..., d 1, unde d 2. Artai c numrul de
comparaii caracater cu caracter executate de ciclul implicit din linia 4 a algoritmului naiv este
(n m+ 1)
1 d
m
1 d
1
2(n m+ 1).
(Se presupune c algoritmul naiv termin compararea caracterelor, pentru un deplasament dat,
o dat ce este gsit o nepotrivire sau modelul ntreg este recunoscut.) Astfel, pentru iruri alese
aleator, algoritmul naiv este chiar ecient.
34.1-5 Presupunem c permitem modelului P s conin apariii ale unui caracter de discon-
tinuitate . Acesta se potrivete cu orice ir de caractere (chiar i de lungime zero).
De exemplu, modelul abbac apare n textul cabccbacbacab astfel:
c ab
....
ab
cc
....

ba
....
ba
cba
....

c
....
c
ab
i
c ab
....
ab
ccbac
. .. .

ba
....
ba
....

c
....
c
ab.
Caracterul de discontinuitate poate s apar ori de cte ori dorim n model, dar se presupune
c nu apare n text. Dai un algoritm polinomial pentru a determina dac un astfel de model P
apare ntr-un text dat T, i analizai timpul de execuie pentru acest algoritm.
34.2. Algoritmul Rabin-Karp 735
34.2. Algoritmul Rabin-Karp
Rabin i Karp au propus un algoritm pentru potrivirea irurilor care se comport bine n
practic i care, de asemenea, se poate generaliza la ali algoritmi pentru probleme asemntoare,
cum ar potrivirea modelelor bidimensionale. Timpul de execuie, n cel mai defavorabil caz,
pentru algoritmul Rabin-Karp este O((n m+ 1)m), dar are un timp mediu de execuie bun.
Acest algortim folosete noiuni din teoria numerelor elementare, cum ar egalitatea a dou
numere modulo un al treilea numr. Pentru o deniie exact, se poate revedea seciunea 33.1.
Pentru prezentarea propus, presupunem c = 0,1,2,...,9, deci ecare caracter este
o cifr zecimal. (n general, putem presupune c ecare caracter este o cifr n baza d, unde
d = [[.) Putem, atunci, privi un ir de k caractere consecutive ca reprezentnd un numr
zecimal de lungime k. Astfel, irul de caractere 31415 corespunde numrului zecimal 31,415.
Dat ind faptul c datele de intrare pot interpretate pe de o parte ca simboluri grace, pe de
alta ca cifre, n continuare, le vom scrie cu fonturi obinuite.
Fiind dat modelul P[1..m], notm cu p valoarea sa zecimal corespunztoare. ntr-o manier
similar, ind dat textul T[1..n], notm cu t
s
valoarea zecimal a subirului T[s + 1..s +m]
de lungime m, pentru s = 0, 1, ..., n m. Desigur, t
s
= p dac, i numai dac, T[s + 1..s +
m] = P[1..m]; astfel, s este un deplasament corect dac, i numai dac, t
s
= p. Dac putem
calcula p n timpul O(m) i toate valorile t
i
n timpul total O(n), atunci putem determina toate
deplasamentele corecte s n timpul O(n) prin compararea lui p cu ecare t
s
. (Pentru moment,
nu ne ngrijoreaz faptul c p i t
s
ar putea numere foarte mari.)
Putem calcula p n timpul O(m) folosind schema lui Horner (vezi seciunea 32.1):
p = P[m] + 10(P[m1] + 10(P[m2] + + 10(P[2] + 10P[1]) )).
Valoarea t
0
poate calculat, n mod analog, din T[1..m] n timpul O(m).
Pentru calcularea valorilor rmase t
1
, t
2
, ..., t
nm
, n timpul O(n m), este sucient s
observm c t
s+1
poate calculat din t
s
ntr-un timp constant, deoarece:
t
s+1
= 10(t
s
10
m1
T[s + 1]) +T[s +m+ 1]. (34.1)
De exemplu, e m = 5 i t
s
= 31415. Dac dorim s tergem cifra cea mai semnicativ T[s+1] =
3 i s aducem, pe poziia cea mai puin semnicativ,atunci o nou cifr (presupunem c aceasta
este T[s + 5 + 1] = 2) pentru a obine:
t
s+1
= 10(31415 10000 3) + 2 = 14152.
Scznd 10
m1
T[s + 1], se terge cifra cea mai semnicativ din t
s
; nmulind rezultatul cu 10,
se deplaseaz numrul spre stnga cu o poziie i adunnd la aceasta cifra T[s +m+1], o aduce
pe poziia cea mai puin semnicativ. Dac, n prealabil, calculm constanta 10
m1
(ceea ce se
poate realiza n timpul O(lg m) folosind tehnicile din seciunea 33.6, dei pentru aceast aplicaie
este adecvat o metod simpl O(m)), atunci ecare execuie a ecuaiei (34.1) necesit un numr
constant de operaii aritmetice. Astfel, p i t
0
, t
1
, ..., t
nm
pot calculate n timpul O(n +m) i
putem determina toate apariiile modelului P[1..m] n textul T[1..n] ntr-un timp O(n +m).
Singurul inconvenient la aceast procedur este c p i t
s
pot prea mari ca s se poat
lucra, convenabil, cu ele. Dac P conine m caractere, atunci presupunerea c ecare operaie
aritmetic asupra lui p (care are o lungime de m cifre) dureaz un timp constant nu este
736 Capitolul 34 Potrivirea irurilor
rezonabil. Din fericire, exist o rezolvare simpl pentru aceast problem, aa cum este artat
n gura 34.4: calculul lui p i t
s
modulo o valoare potrivit q. ntruct calculul lui p, t
0
i
recursivitatea (34.1) pot efectuate modulo q, observm c p i toate valorile t
s
pot calculate
modulo q n timpul O(n+m). Pentru valoarea q este, de obicei, ales un numr prim, astfel nct
10q s poat reprezentat pe un cuvnt de memorie, ceea ce permite ca toate operaiile necesare
s e efectuate cu precizie aritmetic simpl. n general, avnd dat un alfabet 0, 1, ..., d 1,
alegem q astfel nct dq s se poat reprezenta pe un cuvnt de memorie, i modicm ecuaia
recursiv (34.1), astfel nct s se calculeze modulo q, i deci:
t
s+1
= (d(t
s
T[s + 1]h) +T[s +m+ 1]) mod q, (34.2)
unde h d
m1
(mod q) este valoarea pentru cifra 1 n poziia cea mai semnicativ a ferestrei
text de m-cifre.
Calitatea folosirii modulo q confer rapiditate, dei t
s
p (mod q) nu implic t
s
= p. Pe
de alt parte, dac t
s
= p (mod q), atunci, bineneles, avem t
s
= p, astfel nct deplasamentul
s este incorect. Putem, astfel, folosi testul t
s
p (mod q) ca pe un test euristic rapid pentru
determinarea deplasamentelor incorecte s. Orice deplasament s, pentru care t
s
p (mod q),
trebuie s e testat n plus pentru a vedea dac s este, ntr-adevr, corect sau avem doar o
fals potrivire. Aceast testare poate fcut prin vericarea, explicit, a condiiei P[1..m] =
T[s+1..s+m]. Dac q este sucient de mare, atunci, putem spera c potrivirile false apar destul
de rar i, astfel, costul vericrilor suplimentare este sczut.
Aceste idei se vor clarica urmrind procedura de mai jos. Datele de intrare pentru procedur
sunt textul T, modelul P, baza d folosit (care de obicei este aleas [[) i numrul prim q.
Potrivire-Rabin-Karp(T, P, d, q)
1: n lungime[T]
2: m lungime[P]
3: h d
m1
mod q
4: p 0
5: t
0
0
6: pentru i 1, m execut
7: p (dp +P[i]) mod q
8: t
0
(dt
0
+T[i]) mod q
9: pentru s 0, n m execut
10: dac p = t
s
atunci
11: dac P[1..m]=T[s + 1..s +m] atunci
12: tiprete Modelul apare cu deplasamentul s
13: dac s < n m atunci
14: t
s+1
(d(t
s
T[s + 1]h) +T[s +m+ 1]) mod q
Descriem, n continuare, modul n de funcionare a procedurii Potrivire-Rabin-Karp.
Toate caracterele sunt interpretate ca cifre n baza d. Indicele lui t este folosit numai pentru
claritate; programul funcioneaz corect i dac toi indicii sunt omii. n linia 3, se iniializeaz
h cu valoarea de pe poziia cea mai semnicativ dintr-o fereastr de m cifre. n liniile 48, se
calculeaz p ca valoarea P[1..m] mod q i t
0
ca ind valoarea lui T[1..m] mod q. Ciclul pentru,
ncepnd din linia 9, parcurge toate deplasamentele posibile s. Ciclul are urmtorul invariant:
de ecare dat cnd linia 10 este executat, t
s
= T[s + 1..s +m] mod q. Dac, n linia 10, avem
34.2. Algoritmul Rabin-Karp 737
Figura 34.4 Algoritmul Rabin-Karp. Fiecare caracter este o cifr zecimal i calculm valorile modulo
13. (a) Un ir text. O fereastr de lungime 5 este reprezentat haurat. Valoarea numeric a numrului
haurat este 7 calculat modulo 13. (b) Acelai ir text cu valori calculate modulo 13 pentru ecare
poziie posibil a ferestrei de lungime 5. Presupunnd modelul P = 31415, cutm ferestrele ale cror
valori modulo 13 sunt 7, deoarece 31415 7 (mod 13). Sunt determinate i haurate dou astfel de
ferestre. Prima, ncepnd cu poziia 7 n text, este, ntr-adevr, o apariie a modelului, n timp ce a
doua, ncepnd cu poziia 13 n text, este o fals potrivire. (c) Calculnd valoarea pentru o fereastr
ntr-un timp constant, am dat valoarea pentru fereastra precedent. Prima fereastr are valoarea 31415.
nlturnd cifra cea mai semnicativ, 3, deplasnd spre stnga (nmulind cu 10) i, apoi, adunnd, pe
poziia cea mai puin semnicativ

, a cifra 2, obinem noua valoare 14152. Toate calculele sunt efectuate


modulo 13, astfel, valoarea pentru prima fereastr este 7, i valoarea calculat pentru noua fereastr
este 8.
p = t
s
(o potrivire), atunci, n linia 11 se veric dac P[1..m] = T[s+1..s+m] pentru a elimina
posibilitatea unei potriviri false. n linia 12 se tipresc toate deplasamentele corecte determinate.
Dac s < n m (vericarea din linia 13), atunci ciclul pentru este executat cel puin nc o
dat, i, astfel, linia 14 este executat pentru a asigura c invariantul ciclului este corect cnd se
ajunge din nou la linia 10. Linia 14 calculeaz valoarea t
s+1
mod q din valoarea t
s
mod q ntr-un
738 Capitolul 34 Potrivirea irurilor
timp constant, folosind direct ecuaia (34.2).
Timpul de execuie, n cel mai defavorabil caz, pentru algoritmul Potrivire-Rabin-Karp
este ((n m+ 1)m) deoarece (ca n algoritmul naiv de potrivire a irurilor) algoritmul
Rabin-Karp veric explicit ecare deplasament corect. Dac P = a
m
i T = a
n
, atunci
vericrile dureaz un timp ((nm+1)m) deoarece ecare dintre cele nm+1 deplasamente
posibile sunt corecte. (Subliniem, de asemenea, c timpul necesar pentru calculul lui d
m1
mod q,
din linia a 3-a, i ciclul din liniile 68 este O(m) = O((n m + 1)m).) n multe aplicaii, ne
ateptm la puine deplasamente corecte (probabil O(1) dintre ele). Astfel, timpul de execuie
ateptat pentru algoritm este O(n+m), plus timpul necesar pentru procesarea potrivirilor false.
Putem susine o analiz euristic presupunnd c reducerea valorilor modulo q acioneaz ca o
proiecie aleatoare a lui

peste Z
q
. (Vezi discuia despre folosirea divizrii pentru dispersie
din seciunea 12.3.1. Este dicil s formalizm i s demonstrm o astfel de presupunere, dei o
modalitate viabil este s presupunem c q este ales aleator, din mulimea numerelor ntregi, cu
o valoare potrivit. Nu vom urmri aici aceast formalizare.) Ne putem atepta ca numrul de
potriviri false s e O(n/q), deoarece posibilitatea ca un t
s
arbitrar s e echivalent cu p, modulo
q, poate estimat la 1/q. Atunci, timpul de execuie estimat pentru algoritmul Rabin-Karp
este:
O(n) +O(m(v +n/q)),
unde v este numrul de deplasamente corecte. Acest timp de execuie este O(n) dac alegem
q m. Aadar, dac numrul estimat de deplasamente corecte este mic (O(1)) i numrul prim
q este ales mai mare dect lungimea modelului, atunci, estimm pentru procedura Rabin-Karp
timpul de execuie O(n +m).
Exerciii
34.2-1 Lucrnd modulo q = 11, cte potriviri false se ntlnesc la execuia algoritmului
Rabin-Karp pentru textul T = 3141592653589793 i pentru modelul P = 26?
34.2-2 Cum ai extinde metoda Rabin-Karp la problema cutrii ntr-un text a cte unei singure
apariii a ecrui model dintr-o mulime dat de k modele?
34.2-3 Artai cum se extinde metoda Rabin-Karp pentru a rezolva problema cutrii unui
model dat mm ntr-un ir de caractere n n. (Modelul poate deplasat vertical i orizontal,
dar nu poate rotit.)
34.2-4 Alice are o copie a unui ier A = a
n1
, a
n2
, ..., a
0
de lungime n bii, i Bob are,
de asemenea, un ier B = b
n1
, b
n2
, ..., b
0
care conine n bii. Alice i Bob doresc s tie
dac ierele lor sunt identice. Pentru a evita transmiterea ntregului ier A sau B, ei folosesc
urmtoarea vericare probabilistic rapid. Aleg mpreun numrul q > 1000n i un ntreg x
aleator din mulimea 0, 1, ..., q 1. Apoi, Alice calculeaz:
A(x) =

i=0
a
i
x
i

mod q
i n mod analog, Bob calculeaz B(x). Demonstrai c, dac A = B, exist, cel mult, o ans la
1000 ca A(x) = B(x), ntruct, dac cele dou iere sunt identice, A(x) este neaprat acelai
cu B(x). ( vezi exerciiul 33.4-4.)
34.3. Potrivirea irurilor folosind automate nite 739
34.3. Potrivirea irurilor folosind automate nite
Muli algoritmi de potrivire a irurilor construiesc un automat nit care caut n textul T
toate apariiile modelului P. Aceast seciune prezint o metod pentru construirea unui astfel
de automat. Aceste automate de potrivire a irurilor sunt foarte eciente: ele analizeaz ecare
caracter al textului , consumnd un timp constant pentru ecare caracter. Timpul
folosit dup ce se construiete automatul este, aadar, (n). Cu toate acestea, timpul pentru
construirea automatului poate mare dac este mare. n seciunea 34.4 se descrie o variant
inteligent de abordare a acestei probleme.
ncepem aceast seciune cu deniia unui automat nit. Examinm apoi un automat special
de potrivire a irurilor i artm cum poate el folosit pentru determinarea potrivirilor unui
model ntr-un text. Discuia include detalii privind simularea comportamentului unui automat
de potrivire a irurilor pe un text dat. n nal vom arta cum se construiete automatul de
potrivire a irurilor pentru un model de intrare dat.
Automate nite
Un automat nit M este un cvintuplu (Q, q
0
, A, , ), unde
Q este o mulime nit de stri ,
q
0
Q este starea de start,
A Q este o mulime distinct de stri de acceptare,
este un alfabet de intrare nit,
este o funcie denit pe Q cu valori n Q, numit funcie de tranziie a automatului
M.
Automatul nit ncepe n starea q
0
i citete, unul cte unul, caracterele din irul de intrare.
Dac automatul este n starea q i citete caracterul de intrare a, trece (execut o tranziie)
din starea q n starea (q, a). Atunci cnd starea curent q a automatului aparine mulimii A,
spunem c maina M accept irul citit pn n acest moment. Dac o intrare nu este acceptat,
spunem c este respins. Figura 34.5 ilustreaz aceast diniie printr-un automat simplu cu
dou stri.
Automatul nit M induce o funcie , numit funcie de stare nal, denit pe

cu
valori n Q astfel nct (w) este starea n care rmne M dup parcurgerea irului w. Astfel,
M accept un ir w dac i numai dac (w) A. Funcia este denit de relaia recursiv
() = q
0
,
(wa) = ((w), a) pentru w

, a .
Automate de potrivire a irurilor
Exist un automat de potrivire a irurilor pentru ecare model P; acest automat trebuie
construit (pornind de la modelul dat) nainte de a putea folosit pentru cutare. Figura 34.6
740 Capitolul 34 Potrivirea irurilor
Figura 34.5 Un automat nit simplu, cu dou stri, pentru care mulimea strilor este Q = 0, 1,
starea de start este q
0
= 0, iar alfabetul de intrare este = a, b. (a) O reprezentare vectorial a
funciei de tranziie . (b) O diagram echivalent a strilor de tranziie. Starea 1 este singura stare
de acceptare (colorat cu negru). Arcele orientate reprezint tranziii. De exemplu, arcul de la starea
1 la starea 0, etichetat cu b indic (1, b) = 0. Acest automat accept acele iruri care se termin cu
un numr impar de a-uri. Mai exact, un ir x este acceptat dac, i numai dac, x = yz, unde y =
sau y se termin cu un b, i z = a
k
, unde k este impar. De exemplu, secvena de stri pe care acest
automat le are pentru intrarea abaaa (inclusiv starea de start) este '0, 1, 0, 1, 0, 1) i, de aceea, accept
aceast intrare. Pentru intrarea abbaa, secvena de stri este '0, 1, 0, 0, 1, 0) i deci, aceast intrare nu
este acceptat.
ilustreaz aceast construcie pentru modelul P = ababaca. n continuare, vom presupune c
P este un model xat; pentru uurarea exprimrii, n notaii, nu vom indica toate dependenele
pentru P.
Pentru a specica automatul de potrivire a irurilor, corespunztor modelului dat P[1..m],
denim mai nti funcia , numit funcie sux, corespunztoare lui P. Funcia este o
proiecie a lui

peste 0, 1, ..., m, astfel nct (x) este lungimea celui mai lung prex al lui
P, care este sux pentru x:
(x) = maxk : P
k
x.
Funcia sux este bine denit deoarece irul vid P
0
= este un sux pentru orice ir. De
exemplu, pentru modelul P = ab, avem () = 0, (ccaca) = 1 si (ccab) = 2. Pentru modelul
P de lungime m, avem (x) = m dac i numai dac, P x. Din deniia funciei sux rezult
c, dac x y, atunci (x) (y).
Denim automatul de potrivire a irurilor pentru un model dat P[1..m] dup cum urmeaz.
Mulimea strilor Q este 0, 1, .., m. Starea de start q
0
este starea 0, i starea m este
singura stare de acceptare.
Funcia de tranziie este denit prin urmtoarea ecuaie, pentru orice stare q i orice
caracter a:
(q, a) = (P
q
a). (34.3)
Exist o raiune intuitiv pentru denirea (q, a) = (P
q
a): maina menine un invariant pe
parcursul operaiilor ei:
(T
i
) = (T
i
), (34.4)
34.3. Potrivirea irurilor folosind automate nite 741
Figura 34.6 (a) O diagram a strilor de tranziie pentru automatul de potrivire a irurilor care
accept toate irurile terminate cu ababaca. Starea 0 este starea de start i starea 7 (colorat cu negru)
este singura stare de acceptare. Un arc orientat de la starea i la starea j, etichetat cu a, reprezint
(i, a) = j. Arcele orientate spre dreapta, formnd coloana vertebral a automatului, reprezentate
ngroat, corespund potrivirilor corecte ntre model i caracterele de intrare. Arcele orientate spre stnga
corespund potrivirilor incorecte. Unele arce, corespunznd potrivirilor incorecte, nu sunt reprezentate;
prin convenie, dac o stare i nu are arc de ieire etichetat cu a pentru a , atunci (i, a) = 0. (b)
Funcia de tranziie corespunztoare i irul model P = ababaca. Intrrile corespunznd potrivirilor
corecte ntre model i caracterele de intrare sunt haurate. (c) Funcionarea automatului pentru textul
T = abababacaba. Sub ecare caracter al textului T[i], este dat starea (T
i
) n care se a automatul
dup procesarea prexului T
i
. O apariie a modelului este determinat, terminndu-se n poziia 9.
rezultat care este demonstrat mai jos n teorema 34.4. Cu alte cuvinte, aceasta nseamn c dup
parcurgerea primelor i caractere din textul T, maina este n starea (T
i
) = q, unde q = (T
i
)
este lungimea celui mai lung sux din T
i
care este, de asemenea, un prex al modelului P. Dac
urmtorul caracter prelucrat este T[i +1] = a, atunci maina trebuie s fac o tranziie la starea
(T
i+1
) = (T
i
a). Demonstraia teoremei arat c (T
i
a) = (P
q
a). Aadar, pentru a calcula
lungimea celui mai lung sux din T
i
a care este un prex al lui P, putem calcula cel mai lung
sux al lui P
q
a care este un prex al lui P. n ecare stare, maina trebuie s cunoasc doar
lungimea celui mai lung prex al lui P care este un sux a ceea ce a fost citit pn aici. De
aceea, atribuirea (q, a) = (P
q
a) pstreaz invariantul dorit (34.4). Aceast argumentare va
susinut riguros mai trziu.
n automatul de potrivire a irurilor din gura 34.6, de exemplu, avem (5, b) = 4. Aceasta
rezult din faptul c, dac automatul citete un b n starea q = 5, atunci P
q
b = ababab i cel
mai lung prex al lui P care este, totodat, sux al lui ababab este P
4
= abab.
742 Capitolul 34 Potrivirea irurilor
Figura 34.7 O ilustrare pentru demonstraia lemei 34.2. Figura arat c r (x) +1, unde r = (xa).
Pentru a clarica modul de funcionare a automatului de potrivire a irurilor, dm, n
continuare, un program simplu i ecient pentru simularea comportamentului acestuia (repre-
zentat prin funcia sa de tranziie ) n cutarea apariiilor unui model P de lungime m ntr-un
text de intrare T[1..n]. La fel ca la toate automatele de potrivire a irurilor pentru un model
de lungime m, mulimea strilor Q este 0, 1, ..., m i starea de start este 0; singura stare de
acceptare este starea m.
Automat-Finit-de-Potrivire(T,,m)
1: n lungime[T]
2: q 0
3: pentru i 1, n execut
4: q (q, T[i])
5: dac q = m atunci
6: s i m
7: tiprete Modelul apare cu deplasamentul s
Datorit structurii de ciclu simplu al algoritmului Automat-Finit-de-Potrivire, timpul
de execuie, pentru un text de lungime n, este O(n). Acest timp de execuie nu include timpul
necesar efecturii calculului funciei de tranziie . Aceast problem va abordat mai trziu,
dup ce se demonstreaz c procedura Automat-Finit-de-Potrivire funcioneaz corect.
Analizm funcionarea automatului pe un text de intrare T[1..n]. Vom demonstra c automa-
tul ajunge n starea (T
i
) dup prelucrarea caracterului T[i]. ntruct (T
i
) = m dac, i numai
dac, P T
i
, maina ajunge n starea de ateptare m dac i numai dac modelul P tocmai
a fost prelucrat. Pentru a demonstra aceasta vom folosi urmtoarele dou leme referitoare la
funcia sux .
Lema 34.2 (Inegalitatea funciei sux) Pentru orice ir x i orice caracter a, avem (xa)
(x) + 1.
Demonstraie. n gura 34.7, considerm r = (xa). Dac r = 0, atunci concluzia r (x) + 1
este imediat, deoarece funcia (x) este pozitiv. n continuare presupunem c r > 0. Deci,
P
r
xa conform deniiei lui . Astfel, P
r1
x, la eliminarea lui a de la sfritul lui P
r
i
de la sfritul lui xa. Rezult c r 1 (x) ntruct (x) este cel mai mare k pentru care
P
k
x.
Lema 34.3 (Lema de recursivitate a funciei sux) Pentru orice ir x i orice caracter a,
dac avem q = (x), atunci (xa) = (P
q
a).
Demonstraie. Din deniia lui avem a P
q
x. n gura 34.8 se ilustreaz c P
q
a xa. Dac
alegem r = (xa), atunci, conform lemei 34.2, r q + 1 . ntruct P
q
a xa, P
r
xa i [P
r
[
34.3. Potrivirea irurilor folosind automate nite 743
Figura 34.8 O ilustrare pentru demonstraia lemei 34.3. Figura arat c r = (P
q
a), unde q = (x) i
r = (xa).
[P
q
a[, conform lemei 34.1, rezult c P
r
P
q
a. Deci, r (P
q
a) nseamn c (xa) (P
q
a).
Dar, de asemenea, avem c (P
q
a) (xa), pentru c P
q
a xa. Rezult c (xa) = (P
q
a).
Avem toate datele necesare pentru a demonstra teorema principal ce caracterizeaz
comportamentul unui automat de potrivire a irurilor pentru un text de intrare dat. Aa cum
am observat mai sus, aceast teorem arat c, la ecare pas, este sucient ca automatul s
cunoasc lungimea celui mai lung prex al modelului care este un sux a ceea ce a fost prelucrat
pn atunci.
Teorema 34.4 Dac este funcia de stare nal a automatului de potrivire a irurilor pentru
un model dat P i un text de intrare T[1..n], atunci
(T
i
) = (T
i
)
pentru i = 0, 1, ..., n.
Demonstraie. Demonstraia se face prin inducie dup i. Pentru i = 0, teorema este imediat,
deoarece T
0
= . Deci, (T
0
) = (T
0
) = 0.
Acum, presupunem c (T
i
) = (T
i
) i demonstrm c (T
i
+ 1) = (T
i+1
). Notm cu q pe
(T
i
) i cu a pe T[i + 1]. Atunci,
(T
i+1
) = (T
i
, a) (din deniia lui T
i+1
i a)
= ((T
i
), a) (din deniia lui )
= (q, a) (din deniia lui q)
= (P
q
a) (din deniia (34.3) a lui )
= (T
i
a) (din lema 34.3 i din inducie)
= (T
i+1
) (din deniia lui T
i+1
)
Teorema este demonstrat prin inducie.
Conform teoremei 34.4, dac maina intr n starea q n linia 4, atunci q este cea mai mare
valoare, astfel nct P
q
T
i
. Avem q = m n linia 5 dac, i numai dac, o apariie a modelului
P, tocmai, a fost prelucrat. n concluzie, Automat-Finit-de-Potrivire funcioneaz corect.
Calculul funciei de tranziie
Procedura urmtoare calculeaz funcia de tranziie pornind de la modelul dat P[1..m].
744 Capitolul 34 Potrivirea irurilor
Calcul-Funcie-De-Tranziie(P, )
1: m lungime[P]
2: pentru q 0, m execut
3: pentru ecare caracter a execut
4: k min(m+ 1, q + 2)
5: repet
6: k k 1
7: pn cnd P
k
P
q
a
8: (q, a) k
9: returneaz
Aceast procedur calculeaz (q, a) ntr-o manier simpl, conform deniiei sale. Ciclurile
imbricate, care ncep din linile 2 i 3, parcurg toate strile q i caracterele a, iar n liniile 47 se
atribuie pentru (q, a) cea mai mare valoare a lui k, astfel nct P
k
P
q
a. Codul funciei ncepe
cu cea mai mare valoare posibil pentru k, care este min(m, q +1) i decrementeaz k pn cnd
P
k
P
q
a.
Timpul de execuie pentru Calcul-Funcie-de-tranziie este O(m
3
[[) deoarece ciclul
exterior contribuie cu un factor m[[, ciclul, repet, din interior se poate executa de cel mult
m + 1 ori i testul P
k
P
q
a, din linia 6, poate necesita compararea a pn la m caractere.
Exist proceduri mult mai rapide; timpul necesar pentru calcularea lui , pornind de la P, poate
mbuntit la O(m[[) prin utilizarea unor informaii deduse inteligent despre modelul P
(vezi exerciiu 34.4-6). Cu aceast procedur mbuntit pentru calcularea lui , timpul total
de execuie pentru determinarea tuturor apariiilor unui model de lungime m, ntr-un text de
lungime n, peste un alfabet este O(n +m[[).
Exerciii
34.3-1 Construii automatul de potrivire a irurior pentru modelul P = aabab i ilustrai
funcionarea sa pe textul T = aaababaabaababaab.
34.3-2 Desenai o diagram stare-tranziie pentru un automat de potrivire a irurilor pentru
modelul ababbabbababbababbabb peste alfabetul = a,b.
34.3-3 Spunem c un model P nu se poate suprapune dac P
k
P
q
implic k = 0 sau
k = q. Descriei diagrama stare-tranziie a automatului de potrivire a irurilor pentru un model
care nu se poate suprapune.
34.3-4 Fiind date modelele P i P
t
, descriei modul n care se construiete un automat nit
care determin toate apariiile ambelor modele. ncercai s minimizai numrul de stri ale
automatului.
34.3-5 Fiind dat modelul P coninnd caractere de discontinuitate (vezi exerciiul 34.1-5),
artai cum se construiete un automat nit care poate determina o apariie a lui P ntr-un
text T ntr-un timp O(n), unde n = [T[.
34.4. Algoritmul Knuth-Morris-Pratt 745
34.4. Algoritmul Knuth-Morris-Pratt
Prezentm acum un algoritm de potrivire a irurilor cu timpul de execuie liniar datorat lui
Knuth, Morris i Pratt. Algoritmul lor realizeaz un timp de execuie (n + m) prin evitarea
calculului ntregii funcii de tranziie i potrivirea modelului folosind chiar o funcie auxiliar
[1..m], precalculat pornind de la model n timpul O(m). irul permite funciei de tranziie
s e calculat ecient (n sens de amortizare) din zbor, aa cum este necesar. n general,
pentru orice stare q = 0, 1, ..., m i orice caracter a , valoarea [q] conine informaia care
este independent de a i este necesar pentru calcularea lui (q, a). (Aceast remarc va
claricat mai trziu.) Deoarece irul are doar m elemente i are O(m[[) elemente, timpul
de preprocesare l reducem cu un factor calculndu-l pe , n loc de .
Funcia prex pentru un model
Funcia prex pentru un model ncapsuleaz informaii despre potrivirea modelului cu
deplasamentele lui. Aceste informaii pot folosite pentru a evita testarea deplasamentelor
nefolositoare n algoritmul naiv de potrivire a irurilor sau pentru a evita precalcularea lui
pentru un automat de potrivire a irurilor.
Analizm algoritmul naiv de potrivire a irurilor. n gura 34.9(a) se arat un deplasament
particular s al unui ablon coninnd modelul P = ababaca pentru textul T. Pentru acest
exemplu, q = 5 dintre caractere s-au potrivit cu succes, dar al 6-lea caracter nu s-a potrivit
cu caracterul corespunztor din text. Informaia c primele q caractere au fost potrivite cu
succes determin caracterele text corespunztoare. Cunoscnd aceste q caractere din text, pu-
tem s determinm imediat c anumite deplasamente sunt incorecte. n exemplul din gur,
deplasamentul s +1 este sigur incorect deoarece primul caracter al modelului, un a, va aliniat
cu caracterul din text care se tie c se potrivete cu al doilea caracter al modelului, un b.
Deplasamentul s+2, prezentat n cadrul (b) al gurii, aliniaz primele trei caractere ale modelului
cu trei caractere din text care sigur se potrivesc. n general, este necesar s tim rspunsul la
urmtoarea ntrebare:
tiind c modelul P[1..q] se potrivete cu caracterele text T[s + 1..s + q], care este cel mai
mic deplasament s
t
> s, astfel nct
P[1..k] = T[s
t
+ 1..s
t
+k], (34.5)
unde s
t
+k = s +q?
Un astfel de deplasament s
t
este primul deplasament mai mare dect s care nu este neaprat
incorect conform informaiilor despre T[s + 1..s + q]. n cel mai bun caz avem c s
t
= s + q, i
deplasamentele s + 1, s + 2, ..., s + q 1 sunt toate eliminate. n orice caz, la noul deplasament
s
t
nu mai trebuie s comparm primele k caractere ale lui P cu caracterele corespunztoare ale
lui T deoarece ecuaia (34.5) ne asigur c ele se potrivesc.
Informaia necesar poate precalculat comparnd modelul cu el nsui, aa cum este
ilustrat n gura 34.9(c). Deoarece T[s
t
+ 1..s
t
+ k] face parte din poriunea de text cunoscut,
el este un sux al irului P
q
. Deci, ecuaia (34.5) poate interpretat ca o cerere pentru cel
mai mare k < q, astfel nct P
k
P
q
. Atunci, urmtorul potenial deplasament corect este
s
t
= s + (q k). Se ntmpl s e mai convenabil s memorm un numr de k caractere care
746 Capitolul 34 Potrivirea irurilor
Figura 34.9 Funcia prex . (a) Modelul P = ababaca este aliniat cu textul T, astfel nct primele
q = 5 caractere se potrivesc. Caracterele care se potrivesc sunt unite prin linii verticale i sunt haurate.
(b) Folosind numai informaiile noastre despre cele 5 caractere care se potrivesc, putem deduce c un
deplasament s+1 este incorect, dar c un deplasament s

= s+2 se potrivete cu tot ce tim despre text


i deci exist posibilitatea s e corect. (c) Informaia util pentru astfel de deducii poate precalculat
comparnd modelul cu el nsui. Aici, se observ c cel mai lung prex al lui P, care este i un sux
al lui P
5
, este P
3
. Aceast informaie este precalculat i reprezentat n irul , astfel [5] = 3. Dac
q caractere s-au potrivit cu succes la deplasamentul s, urmtorul deplasament corect posibil este la
s

= s + (q [q]).
se potrivesc la noul deplasament s
t
, dect s memorm, de exemplu, s
t
s caractere. Aceast
informaie poate utilizat pentru a mri viteza att la algoritmul naiv de potrivire a irurilor,
ct i la procedura de potrivire folosind automatul nit.
Formalizm, n continuare, precalculul necesar. Fiind dat un model P[1..m], funcia prex
pentru modelul P este : 1, 2, ..., m 0, 1, ..., m1, astfel nct
[q] = maxk : k < q i P
k
P
q
.
Astfel, [q] este lungimea celui mai lung prex al lui P care este un sux potrivit pentru P
q
.
Ca un alt exemplu, n gura 34.10(a) este prezentat ntreaga funcie prex pentru modelul
ababababca.
Algoritmul de potrivire Knuth-Morris-Pratt, este prezentat n pseudocod, prin procedura
Potrivire-KMP. Vei vedea c este asemntor procedurii aproape ca i Automat-Finit-
de-Potrivire. Pentru calculul lui , procedura Potrivire-KMP apeleaz procedura auxiliar
Calcul-Funcie-Prefix.
34.4. Algoritmul Knuth-Morris-Pratt 747
Potrivire-KMP(T,P)
1: n lungime[T]
2: m lungime[P]
3: Calcul-Funcie-Prefix(P)
4: q 0
5: pentru i 1, n execut
6: ct timp q > 0 i P[q + 1] = T[i] execut
7: q [q]
8: dac P[q + 1] = T[i] atunci
9: q q + 1
10: dac q = m atunci
11: tiprete Modelul apare cu deplasamentul i m
12: q [q]
Calcul-Funcie-Prefix(P)
1: m lungime[P]
2: [1] 0
3: k 0
4: pentru q 2, m execut
5: ct timp k > 0 i P[k + 1] = P[q] execut
6: k [k]
7: dac P[k + 1] = P[q] atunci
8: k k + 1
9: [q] k
10: returneaz
ncepem cu analiza timpului de execuie pentru aceste proceduri. Demonstrarea faptului c
aceste proceduri sunt corecte va ceva mai complicat.
Analiza timpului de execuie
Folosind o analiz amortizat (vezi capitolul 18), timpul de execuie pentru funcia
Calcul-Funcie-Prefix este O(m). Asociem un potenial k cu starea k curent a algoritmului.
Acest potenial are o valoare iniial 0, n linia 3. Linia 6 decrementeaz k, ori de cte ori este
executat, deoarece [k] < k. Deoarece [k] 0 pentru orice k, k nu poate deveni negativ.
Singura linie care mai afecteaz valoarea lui k este linia 8, unde se incrementeaz k, cel mult o
dat, n timpul ecrei iteraii a ciclului pentru. Deoarece k < q dup intrarea n ciclul pentru
i deoarece q este incrementat la ecare iteraie a ciclului pentru, ntotdeauna, va adevrat
relaia k < q. (Aceasta i linia 9 justic cerina [q] < q.) Pentru ecare iteraie a ciclului ct
timp din linia 6, putem decrementa funcia potenial, ntruct [k] < k. Linia 8 incrementeaz
funcia potenial cel mult o dat, deci costul amortizat al corpului ciclului din liniile 59 este
O(1). Deoarece numrul de iteraii ale ciclului exterior este O(m) i deoarece funcia potenial
nal este cel puin la fel de mare ca funcia potenial iniial, timpul total de execuie, n cel
mai ru caz, pentru Calcul-Funcie-Prefix este O(m).
Algoritmul Knuth-Morris-Pratt se execut n timp O(m+n). Apelul funciei Calcul-Func-
ie-Prefix consum un timp O(m), aa cum tocmai am artat, i o analiz amortizat similar,
748 Capitolul 34 Potrivirea irurilor
folosind ca funcie potenial valoarea q, arat c restul algoritmului Potrivire-KMP necesit
timpul O(n).
Comparativ cu Automat-Finit-de-Potrivire, prin folosirea lui n locul lui , am redus
timpul pentru preprocesarea modelului de la O(m[[) la O(m), pstrnd, simultan, timpul actual
de potrivire limitat la O(m+n).
Corectitudinea calculului funciei prex
ncepem cu o lem esenial care ne arat c, prin iterarea funciei prex , putem enumera
toate prexele P
k
care sunt suxe ale prexului P
q
dat. Fie

[q] = q, [q],
2
[q],
3
[q], ...,
t
[q],
unde
i
[q] este denit ca funcie compus, astfel nct
0
[q] = q i
i+1
[q] = [
i
[q]] pentru i > 1
i unde secvena

[q] se termin cnd se obine


t
[q] = 0.
Lema 34.5 (Lema de iteraie a funciei prex) Fie P un model de lungime m cu funcia
prex . Atunci, pentru q = 1, 2, .., m, avem

[q] = k : P
k
P
q
.
Demonstraie. Artm, mai nti, c:
i

[q] implic P
i
P
q
(34.6)
Dac i

[q], atunci, pentru un u oarecare, i =


u
[q]. Demonstrm ecuaia (34.6) prin inducie
dup u. Pentru u = 0, avem i = q, i cerina este ndeplinit deoarece P
q
P
q
. Folosind relaia
P
[i]
P
i
i tranzitivitatea pentru relaia , este xat cerina pentru orice i din

[q]. Deci,

[q] k : P
k
P
q
.
Demonstrm c k : P
k
P
q

[q] prin metoda reducerii la absurd. Presupunem c


exist un ntreg n mulimea k : P
k
P
q

[q] i e j cel mai mare astfel de ntreg. Deoarece


q aparine mulimii k : P
k
P
q

[q], avem j < q, aadar e j


t
cel mai mic ntreg din

[q] care este mai mare dect j. (Putem alege j


t
= q dac nu exist alt numr n

[q] mai
mare dect j.) Avem P
j
P
q
deoarece j k : P
k
P
q
, P
j
P
q
deoarece j
t

[q]; astfel,
P
j
P
j
conform lemei 34.1. Mai mult, j este cea mai mare valoare cu aceast proprietate. De
aceea, trebuie s avem [j
t
] = j i, astfel, j

[q]. Aceast contradicie demonstreaz lema.


Figura 34.10 ilustreaz aceast lem.
Algoritmul Calcul-Funcie-Prefix calculeaz [q] pentru ecare q = 1, 2, ..., m. Calculul
lui [1] = 0 din linia 2 a funciei Calcul-Funcie-Prefix este corect deoarece [q] < q pentru
orice q. Pentru a demonstra c funcia Calcul-Funcie-Prefix calculeaz corect valoarea lui
[q] pentru orice q > 1, vom folosi urmtoarea lem i corolarele acesteia.
Lema 34.6 Fie P un model de lungime m i e funcia prex pentru P. Dac [q] > 0 pentru
q = 1, 2, ..., m, atunci [q] 1

[q 1].
Demonstraie. Dac k = [q] > 0, atunci P
k
P
q
, astfel P
k1
P
q1
(eliminnd ultimul
caracter din P
k
i P
q
). Deci, k 1

[q 1] din lema 34.5.


Pentru q = 2, 3, ..., m, denim submulimea E
q1

[q 1] prin
E
q1
= k : k

[q 1] i P[k + 1] = P[q].
34.4. Algoritmul Knuth-Morris-Pratt 749
Figura 34.10 O ilustrare a lemei 34.5 pentru modelul P = ababababca i q = 8. (a) Funcia pentru
modelul dat. ntruct [8] = 6, [6] = 4, [4] = 2 i [2] = 0, iternd , obinem

[8] = 8, 6, 4, 2, 0.
(b) Deplasm ablonul care conine modelul P spre dreapta i reinem cnd un prex P
k
din P se
potrivete cu un sux al lui P
8
; aceasta se ntmpl pentru k = 6, 4, 2 i 0. n gur, prima linie prezint
modelul P. Verticala punctat este trasat imediat dup P
8
. Liniile succesive arat toate deplasrile lui
P pentru care un prex P
k
al lui P se potrivete cu un sux al lui P
8
. Caracterele care se potrivesc
sunt haurate. Liniile verticale unesc caracterele care se potrivesc. Astfel, k : P
k
P
q
= 8, 6, 4, 2, 0.
Lema arm c pentru orice q avem

[q] = k : P
k
P
q
.
Mulimea E
q1
conine acele valori k pentru care P
k
P
q1
(din lema 34.5); deoarece
P[k + 1] = P[q], exist, de asemenea, cazul n care pentru aceste valori ale lui k, P
k+1
P
q
.
Intuitiv, E
q1
conine acele valori k

[q 1] care ne permite s extindem P


k
la P
k+1
i s
obinem un sux al lui P
q
.
Corolarul 34.7 Fie P un model de lungime m i e funcia prex pentru modelul P. Pentru
q = 2, 3, .., m
[q] =

0 dac E
q1
= ,
1 + maxk E
q1
dac E
q1
= .
Demonstraie. Dac r = [q], atunci P
r
P
q
i, deci, r 1 implic P[r] = P[q]. Aplicnd
lema 34.6, dac r 1, atunci
r = 1 + maxk

[q 1] : P[k + 1] = P[q].
Dar mulimea maxim este chiar E
q1
, deci r = 1 + maxk E
q1
, i E
q1
este nevid. Dac
r = 0, nu exist k

[q 1] pentru care s putem extinde P


k
la P
k+1
i s putem obine un
sux al lui P
q
, deorece atunci am avea [q] > 0, Deci , E
q1
= .
Astfel, am demonstrat faptul c funcia Calcul-Funcie-Prefix calculeaz corect funcia
. n procedura Calcul-Funcie-Prefix, la nceputul ecrei iteraii a ciclului pentru din
750 Capitolul 34 Potrivirea irurilor
liniile 49, avem k = [q 1]. Aceast condiie este impus prin liniile 2 i 3 la prima intrare n
ciclu i rmne adevrat la ecare iteraie datorit liniei 9. Liniile 58 modic valoarea lui k,
astfel nct s devin valoarea corect a lui [q]. Ciclul din liniile 56 caut printre toate valorile
k

[q 1] pn cnd este gsit una pentru care P[k + 1] = P[q]; n acest moment k este
cea mai mare valoare din mulimea E
q1
, astfel, conform corolarului 34.7, putem atribui lui [q]
valoarea k +1. Dac nu este gsit un astfel de k, k = 0 n liniile 79, i atribuim lui [q] valoarea
0. Cu aceasta am demonstrat corectitudinea algoritmului Calcul-Funcie-Prefix.
Corectitudinea algoritmului KMP
Procedura Potrivire-KMP poate privit ca o reimplementare a procedurii Auto-
mat-Finit-de-Potrivire. Mai precis, vom arta c liniile 69 din Potrivire-KMP sunt
echivalente cu linia 4 din Automat-Finit-de-Potrivire, care atribuie (q, T[i]) lui q. n loc
s memorm valoarea (q, T[i]), aceasta este recalculat, la nevoie, din . O dat argumentat
faptul c procedura Potrivire-KMP simuleaz comportamentul procedurii Automat-Finit-
de-Potrivire, corectitudinea procedurii Potrivire-KMP reiese implicit (totui vom vedea
imediat de ce este necesar linia 12 n Potrivire-KMP).
Corectitudinea procedurii Potrivire-KMP rezult din armaia c (q, T[i]) = 0 sau
(q, T[i]) 1

[q]. Pentru a verica aceast armaie, e k = (q, T[i]). Atunci, din deniia
lui i , avem P
k
P
q
T[i]. De aceea, k = 0 sau k 1, i P
k1
P
q
prin eliminarea ultimelor
caractere din P
k
i P
q
T[i] (n acest caz k 1

[q]). Aadar, sau k = 0 sau k 1

[q],
rezult c armaia este adevrat.
Armaia este folosit dup cum urmeaz. Notm cu q
t
valoarea lui q la intrarea n linia
6. Folosim echivalena

[q] = k : P
k
P
q
pentru a justica iteraia q [q] care enumer
elementele k : P
k
P
q
. Liniile 69 determin (q
t
, T[i]) prin examinarea elementelor lui

[q
t
]
n ordine descresctoare. Codul utilizeaz armaia pentru a ncepe cu q = (T
i1
) = (T
i1
)
i execut iteraia q [q] pn cnd este gsit un q, astfel nct q = 0 sau P[q + 1] = T[i]. n
primul caz, (q
t
, T[i]) = 0; n al doilea caz, q este elementul maxim n E
q
, aa c (q
t
, T[i]) = q+1
conform corolarului 34.7.
Linia 12 din Potrivire-KMP este necesar pentru a evita o posibil referire la P[m+1], n
linia 6, dup ce a fost determinat o potrivire a lui P. (Argumentul q = (T
i1
) rmne corect. La
urmtoarea execuie a liniei 6, conform indicaiei date n exerciiul 34.4-6: (m, a) = ([m], a)
sau, n mod echivalent, (Pa) = (P
[m]
a) oricare ar a .) Ultimul argument pentru
corectitudinea algoritmului Knuth-Morris-Pratt rezult din corectitudinea procedurii Automat-
Finit-de-Potrivire, deoarece acum observm c procedura Potrivire-KMP simuleaz
comportamentul procedurii Automat-Finit-de-Potrivire.
Exerciii
34.4-1 Calculai funcia prex pentru modelul ababbabbababbababbabb cnd alfabetul este
= a,b.
34.4-2 Dai o limit superioar pentru dimensiunea lui

[q] ca funcie de q. Dai un exemplu


pentru a arta c limita dat este corect.
34.4-3 Explicai cum se determin apariia modelului P n textul T, examinnd funcia
pentru irul PT (concatenarea lui P i T de lungime m+n).
34.5. Algoritmul Boyer-Moore 751
34.4-4 Artai cum se mbuntete procedura Potrivire-KMP nlocuind din linia 7 (dar
nu i din linia 12) cu
t
, unde
t
este denit recursiv pentru q = 1, 2, ..., m prin ecuaia

t
[q] =

0 dac [q] = 0,

t
[[q]] dac [q] = 0 i P[[q] + 1] = P[q + 1],
[q] dac [q] = 0 i P[[q] + 1] = P[q + 1].
Explicai de ce algoritmul modicat este corect i n ce sens aceast modicare constituie o
mbuntire.
34.4-5 Dai un algoritm de timp liniar pentru a determina dac un text T este o rotaie ciclic
a altui ir T
t
. De exemplu, arc i car sunt ecare o rotaie ciclic a celuilalt.
34.4-6 Dai un algoritm ecient pentru calculul funciei de tranziie pentru automatul
de potrivire a irurilor, corespunztor unui model dat P. Algoritmul trebuie sa aib timpul de
execuie O(m[[). ( demonstrai c (q, a) = ([q], a) dac q = m sau P[q + 1] = a.)
34.5. Algoritmul Boyer-Moore
Dac modelul P este relativ lung i alfabetul este destul de mare, atunci algoritmul datorat
lui Robert S. Boyer i J. Strother Moore este, probabil, cel mai ecient pentru potrivirea irurilor.
Potrivire-Boyer-Moore(T,P,)
1: n lungime[T]
2: m lungime[P]
3: Calcul-Funcie-Ultima-Apariie(P,m,)
4: Calcul-Funcie-Sufix-Bun(P,m)
5: s 0
6: ct timp s n m execut
7: j m
8: ct timp j > 0 i P[j] = T[s +j] execut
9: j j 1
10: dac j = 0 atunci
11: tiprete Modelul apare cu deplasamentul s
12: s s +[0]
13: altfel
14: s s + max([j], j [T[s +j]])
n afar de aspectul obscur al lui i , acest program este foarte asemntor algoritmului
naiv de potrivire a irurilor. ntr-adevr, presupunem c liniile 34 le comentm i nlocuim
actualizarea lui s din liniile 1214 cu simple incrementri dup cum urmeaz:
12 : s s + 1
13 : altfel
14 : s s + 1
752 Capitolul 34 Potrivirea irurilor
Programul modicat funcioneaz acum exact ca procedura naiv de potrivire a irurilor: ciclul
ct timp, care ncepe n linia 6, consider cele nm+1 deplasamente posibile s, iar ciclul ct
timp, care ncepe n linia 8, testeaz condiia P[1..m] = T[s + 1..s + m], comparnd P[j] cu
T[s + j], pentru j = m, m 1, ..., 1. Dac ciclul se termin cu j = 0, atunci a fost determinat
un deplasament s corect, i linia 11 tiprete valoarea s. n acest stadiu, singura caracteristic
remarcabil a algoritmului Boyer-Moore este c el compar modelul n sens invers,
, i, de aceea, creterea deplasamentului s din liniile 1214 nu este neaprat 1.
Algoritmul Boyer-Moore include dou euristici care permit evitarea multor operaii pe care
le fac algoritmii anteriori de potrivire a irurilor. Aceste euristici sunt att de eciente, nct,
adesea, permit algoritmului s omit complet examinarea multor caractere din text. Aceste euris-
tici, cunoscute ca euristica bazat pe caracterul slab i euristica suxului bun, sunt ilustrate
n gura 34.11. Ele pot vzute ca lucrnd independent una de alta, n paralel. Cnd apare
o nepotrivire, ecare euristic propune o valoare cu care poate mrit s fr pierderea unui
deplasament corect. Algoritmul Boyer-Moore alege cea mai mare valoare i o adaug lui s: cnd
se ajunge n linia 13, dup o nepotrivire, euristica bazat pe caracterul slab propune incremen-
tarea lui s cu j [T[s +j]], iar euristica suxului bun propune incrementarea lui s cu [j].
Euristica bazat pe caracterul slab
Cnd apare o nepotrivire, euristica bazat pe caracterul slab folosete informaia despre
poziia din model n care apare caracterul slab T[s +j] din text (n cazul n care apare) pentru
a propune un deplasament nou. n cel mai bun caz, nepotrivirea apare la prima comparaie
(P[m] = T[s + m]) i caracterul slab T[s + m] nu apare deloc n model. (S ne imaginm
cutarea lui a
m
n irul text b
n
.) n acest caz, putem mri deplasamentul s cu m deoarece orice
deplasament mai mic dect s +m va poziiona cteva caractere din model peste caracterul slab,
provocnd o nepotrivire. Dac cel mai bun caz apare n mod repetat, atunci algoritmul Boyer-
Moore examineaz numai o fraciune 1/m a textului, deoarece ecare caracter text examinat
produce o nepotrivire n urma creia s se mrete cu m. Comportamentul acestui cel mai bun
caz ilustreaz puterea cutrii de la dreapta la stnga spre deosebire de cutarea de la stnga la
dreapta.
n continuare, vom vedea cum funcioneaz, n general, euristica bazat pe caracterul
slab. Presupunem c tocmai am descoperit o nepotrivire: P[j] = T[s+j] pentru un j, 1 j m.
Fie k cel mai mare index n intervalul 1 k m, astfel nct T[s + j] = P[k], dac exist un
astfel de k. Altfel, e k = 0. Armm c este corect s l mrim pe s cu j k. Pentru a demonstra
aceast armaie trebuie s considerm trei cazuri, aa cum este ilustrat n gura 34.12.
k = 0: Aa cum este artat n gura 34.12(a), caracterul slab T[s + j] nu apare deloc n
model i, deci, putem mri pe s cu j fr a risca pierderea vreunui deplasament corect.
k < j: Aa cum este artat n gura 34.12(b), cea mai din dreapta apariie a caracterului
slab n model este la stnga poziiei j, astfel c j k > 0, i modelul trebuie deplasat cu
j k caractere spre dreapta. Deci putem mri pe s cu j k fr a risca pierderea vreunui
deplasament corect.
k > j: Aa cum este artat n gura 34.12(c), jk < 0 i deci euristica bazat pe caracterul
slab propune decrementarea lui s. Aceast recomandare va ignorat de algoritmul Boyer-
Moore deoarece euristica suxului bun va propune o deplasare spre dreapta n toate
cazurile.
34.5. Algoritmul Boyer-Moore 753
Figura 34.11 O ilustrare a euristicii algoritmului Boyer-Moore. (a) Potrivirea modelului reminiscence
pentru un text, comparnd caracterele de la dreapta spre stnga. Deplasamentul s este incorect;
dei suxul bun ce al modelului se potrivete corect pentru caracterele corespunztoare din text
(caracterele potrivite sunt haurate, n text apare caracterul slab i, care nu se potrivete cu caracterul
n corespunztor din model. (b) Euristica bazat pe caracterul slab propune, dac este posibil, deplasarea
modelului spre dreapta, astfel nct s garanteze, pentru caracterul slab din text, c se va potrivi cu cea
mai din dreapta apariie a caracterului slab din model. n acest exemplu, deplasnd modelul cu 4 poziii
spre dreapta, caracterul slab i din text se potrivete cu caracterul cel mai din dreapta i din model,
pe poziia 6. n cazul n care caracterul slab nu apare n model, acesta poate mutat complet peste
caracterul slab din text. Dac cea mai din dreapta apariie a caracterului slab n model este imediat
n dreapta poziiei caracterului slab curent, atunci aceast euristic nu face nici o propunere. (c) Cu
euristica suxului bun, modelul este deplasat spre dreapta cu cel mai mic deplasament, astfel nct s
garanteze c orice caractere din model, care apar n dreptul suxului bun (gsit n text) se vor potrivi
cu toate caracterele suxului. n exemplu, deplasnd modelul cu 3 poziii spre dreapta, se satisface
aceast condiie. Deoarece eurisica suxului bun propune o deplasare cu 3 poziii, iar euristica bazat
pe caracterul slab propune o deplasare mai mare, cu 4 poziii, algoritmul Boyer-Moore incrementeaz
deplasamentul cu 4.
Urmtorul program denete [a] ca ind indicele celei mai din dreapta poziii din model la
care apare caracterul a, oricare ar a . Dac a nu apare n model, atunci [a] este 0. Numim
funcia ultimei apariii pentru model. Cu aceast deniie, expresia j [T[s +j]] din
linia 13 a procedurii Potrivire-Boyer-Moore implementeaz euristica bazat pe caracterul
slab. (Deoarece j [T[s + j]] este negativ, dac cea mai din dreapta apariie a caracterului
slab T[s +j] n model este la dreapta poziiei j, ne vom baza pe pozitivitatea lui [j], propus de
euristica suxului bun, pentru a ne asigura c algoritmul face progrese la ecare pas.)
754 Capitolul 34 Potrivirea irurilor
Figura 34.12 Cazul euristicii caracterului slab. (a) Caracterul slab h nu apare deloc n model i astfel
modelul poate avansat cu j = 11 caractere pn cnd trece peste caracterul slab. (b) Cea mai din
dreapta apariie a caracterului slab n model este la poziia k < j i, deci, modelul poate avansat cu
j k caractere. Deoarece j = 10 i k = 6 pentru caracterul slab i, modelul poate avansat cu 4 poziii
pn cnd linia lui i devine dreapt. (c) Cea mai din dreapta apariie a caracterului slab n model
este la poziia k > j. n acest exemplu, j = 10 i k = 12 pentru caracterul slab e. Euristica bazat pe
caracterul slab propune o deplasare negativ, care este ignorat.
34.5. Algoritmul Boyer-Moore 755
Calcul-Funcie-Ultima-Apariie(P,m,)
1: pentru ecare caracter a execut
2: [a] 0
3: pentru j 1, m execut
4: [P[j]] j
5: returneaz
Timpul de execuie al procedurii Calcul-Funcie-Ultima-Apariie este O([[ +m).
Euristica suxului bun
Pentru irurile Q i R denim relaia Q R (citim Q este asemenea cu R) astfel: Q R sau
R Q. Dac dou iruri sunt asemenea, atunci le putem alinia raportat la cel mai din dreapta
caracter care se potrivete. Relaia este simetric: Q R dac, i numai dac, R Q. De
asemenea, ca o consecin a lemei 34.1, avem c
Q R i S R implic Q S (34.7)
Dac gsim c P[j] = T[s + j], unde j < m, atunci euristica suxului bun spune c putem
mri fr risc s cu
[j] = mmaxk : 0 k < m i P[j + 1..m] P
k
.
Deci, [j] este cel mai mic deplasament cu care poate avansa s fr a determina, la noua aliniere
a modelului, apariia unui caracter slab n suxul bun T[s +j +1..s +m]. Funcia este bine
denit pentru orice j deoarece P[j +1..m] P
0
pentru orice j: irul vid este asemenea cu toate
irurile. Numim funcia suxului bun pentru modelul P.
Vom arta acum modul de calcul al funciei suxului bun . Observm, mai nti, c [j]
m[m] pentru orice j. Dac w = [m], atunci P
w
P din deniia lui . Mai mult, ntruct
P[j+1..m] P pentru orice j, avem P
w
P[j+1..m] din ecuaia (34.7). Aadar, [j] m[m]
pentru orice j.
Putem acum rescrie deniia lui astfel:
[j] = mmaxk : [m] k < m i P[j + 1..m] P
k
.
Condiia ca P[j +1..m] P
k
este ndeplinit dac ecare P[j +1..m] P
k
sau P
k
P[j + 1..m].
Dar ultima posibilitate implic P
k
P i, deci, k [m], din deniia lui . Aceast ultim
posibilitate nu poate reduce valoarea lui [j] sub m [m]. Aadar, putem rescrie deniia pe
care o vom folosi n continuare pentru dup cum urmeaz:
[j] = mmax([m] k : [m] < k < m i P[j + 1..m] P
k
).
(A doua mulime poate vid.) Din deniie reiese c [j] > 0 pentru orice j = 1, 2, ..., m.
Aceasta dovedete c algoritmul Boyer-Moore face progrese.
Pentru a simplica expresia pentru , denim, n plus, P
t
reversul modelului P i
t
funcia
prex corespunztoare. Acestea sunt, pentru i = 1, 2, ..., m, P
t
[i] = P[mi + 1] i
t
[t] cel mai
mare u astfel nct u < t i P
t
u
P
t
t
.
Dac k este cea mai mare valoare posibil, astfel nct P[j + 1..m] P
k
, atunci cerem ca

t
[l] = mj, (34.8)
756 Capitolul 34 Potrivirea irurilor
unde l = (m k) + (m j). Pentru a vedea c aceast cerin este bine denit, observm c
P[j + 1..m] P
k
implic m j k i, deci, l m. De asemenea, j < m i k m, deci l 1.
Vom demonstra aceast cerin n continuare. ntruct P[j +1..m] P
k
, avem P
t
mj
P
t
l
. Deci,

t
[l] mj. Presupunem acum c p > mj, unde p =
t
[l]. Atunci, din deniia lui
t
, avem c
P
t
p
P
t
l
sau, n mod echivalent, P
t
[1..p] = P
t
[l p+1..l]. Rescriind aceast ecuaie cu P n loc de
P
t
, avem P[mp+1..m] = P[ml +1..ml +p]. Efectund substituia l = 2mkj, obinem
P[mp +1..m] = P[k m+j +1..k m+j +p] de unde rezult P[mp +1..m] P
km+j+p
.
Din p > m j, avem c j + 1 > m p + 1, deci P[j + 1..m] P[m p + 1..m], rezult c
P[j + 1..m] P
km+j+p
din tranzitivitatea relaiei . n nal, din p > m j, avem k
t
> k,
unde k
t
= k m + j + p, contrazicnd alegerea lui k ca cea mai mare valoare posibil, astfel
nct P[j + 1..m] P
k
. Din aceast contradicie, deducem c nu putem avea p > m j, deci
p = mj. Cerina (34.8) este demonstrat.
Folosind ecuaia (34.8) i observnd c din
t
[l] = mj rezult j = m
t
[l] i k = ml+
t
[l],
putem rescrie deniia noastr pentru astfel:
[j] = mmax([m] ml +
t
[l] : 1 l m i j = m
t
[l])
= min(m[m] l
t
[l] : 1 l m i j = m
t
[l]).
(34.9)
Din nou, a doua mulime poate vid.
n continuare, vom studia procedura pentru calculul lui .
Calcul-Funcie-Sufix-Bun(P,m)
1: Calcul-Funcie-Prefix(P)
2: P
t
invers(P)
3:
t
Calcul-Funcie-Prefix(P
t
)
4: pentru j 0, m execut
5: [j] m[m]
6: pentru l 1, m execut
7: j m
t
[l]
8: dac [j] > l
t
[l] atunci
9: [j] l
t
[l]
10: returneaz
Procedura Calcul-Funcie-Sufix-Bun este o implementare simpl a ecuaiei (34.9).
Timpul de execuie al acesteia este O(m).
n cel mai defavorabil caz, timpul de execuie pentru algoritmul Boyer-Moore este O((nm+
1)m + [[), ntruct Calcul-Funcie-Ultima-Apariie are timpul de execuie O(m + [[),
Calcul-Funcie-Sufix-Bun are timpul de execuie O(m) i algoritmul Boyer-Moore (la fel ca
algoritmul Rabin-Karp) consum un timp O(m) validnd ecare deplasament corect s. Cu toate
acestea, n practic, algoritmul Boyer-Moore este, adesea, cea mai bun alegere.
Exerciii
34.5-1 Calculai funciile i pentru modelul P = 0101101201 i alfabetul = 0, 1, 2.
34.5-2 Dai exemple pentru a arta c algoritmul Boyer-Moore poate da performane mult mai
bune combinnd euristica bazat pe caracterul slab i euristica suxului bun dect dac acesta
folosete numai euristica suxului bun.
Probleme 757
34.5-3 O mbuntire, folosit adesea n practic, la procedura de baz Boyer-Moore este
nlocuirea funciei cu funcia
t
denit astfel:

t
[j] = mmaxk : 0 k < m i P[j + 1..m] P
k
i
(k m+j > 0) implic P[j] = P[k m+j]).
Funcia
t
garanteaz c acelai model nu va potrivit peste textul greit, asigurnd i c,
n suxul bun, caracterele nu se vor potrivi la un nou deplasament. Artai cum se calculeaz
ecient funcia
t
.
Probleme
34-1 Potivirea irurilor bazat pe factori de repetiie
Notm cu y
i
concatenarea irului y cu el nsui de i ori. De exemplu, (ab)
3
= ababab. Spunem
c irul x

are factor de repetiie r dac x = y


r
pentru un ir y

i un r > 0. Fie
(x) cel mai mare r, astfel nct x are factorul de repetiie r.
a. Dai un algoritm ecient care are ca date de intrare un model P[1..m] i calculeaz (P
i
)
pentru i = 1, 2, ..., m. Care este timpul de execuie pentru algoritmul pe care l-ai dat?
b. Pentru orice model P[1..m], denim

(P) ca max
1im
(P
i
). Demonstrai c, dac mode-
lul P este ales aleator din mulimea tuturor irurilor binare de lungime m, atunci valoarea
lui

(P) este O(1).


c. Argumentai faptul c urmtorul algoritm de potrivire a irurilor gsete, corect, toate
apariiile modelului P ntr-un text T[1..n] n timpul O(

(P)n +m).
Potrivire-Repetitiv(P,T)
1: m lungime[P]
2: n lungime[T]
3: k 1 +

(P)
4: q 0
5: s 0
6: ct timp s n m execut
7: dac T[s +q + 1] = P[q + 1] atunci
8: q q + 1
9: dac q = m atunci
10: tiprete Modelul apare cu deplasamentul s
11: dac q = m sau T[s +q + 1] = P[q + 1] atunci
12: s s + max(1, q/k|)
13: q 0
Acest algoritm este datorat lui Galil i Seiferas. Extinznd mult aceste idei ei obin un
algoritm de potrivire a irurilor de timp liniar. Acesta folosete numai O(1) spaiu de
memorie n afar de ceea ce este necesar pentru P i T.
758 Capitolul 34 Potrivirea irurilor
34-2 Potrivirea irurilor n paralel
Analizm problema de potrivire a irurilor pe un calculator paralel. Presupunem c, pentru
un model dat, avem un automat de potrivire a irurilor M cu mulimea de stri Q. Fie
funcia de stare nal pentru M. Textul de intrare este T[1..n]. Dorim s calculm (T
i
) pentru
i = 1, 2, ..., n; adic, dorim s calculm starea nal pentru ecare prex. Planul nostru este s
folosim calculul de prex paralel descris n seciunea 30.1.2.
Pentru ecare ir de intrare x, denim funcia
x
: Q Q, astfel nct, dac automatul M
pornete n starea q i citete intrarea x, atunci M se termin n starea
x
(q).
a. Demonstrai c
y

x
=
xy
, unde cu am notat funcia de compunere:
(
y

x
)(q) =
y
(
x
(q)).
b. Artai c este o operaie asociativ.
c. Artai c
xy
poate calculat din reprezentrile tabelare ale lui
x
i
y
n timpul O(1)
pe o main CREW PRAM. Analizai n funcie de [Q[ cte procesoare sunt necesare.
d. Demonstrai c (T
i
) =
T
i
(q
0
), unde q
0
este starea de start pentru M.
e. Artai cum se gsesc toate potrivirile unui model ntr-un text de lungime n n timpul
O(lg n) pe o main CREW PRAM. Presupunem c modelul este dat corespunztor n
forma automatului de potrivire a irurilor.
Note bibliograce
Relaia dintre potrivirea irurilor i teoria automatelor nite este discutat de Aho, Hopcroft
i Ullman [4]. Algoritmul Knuth-Morris-Pratt [125] a fost inventat independent de ctre Knuth
i Pratt i de ctre Morris; ei i-au publicat rezultatele reunite. Algoritmul Rabin-Karp a fost
propus de Rabin i Karp [117], iar algoritmul Boyer-Moore este datorat lui Boyer i Moore [32].
Galil i Seiferas [78] dau un algoritm deterministic interesant de potrivire a irurilor n timp liniar
care folosete doar O(1) spaiu de memorie n afara celui necesar pentru memorarea modelului
i textului.
35 Geometrie computaional
Geometria computaional este ramura tiinei informaticii care studiaz algoritmi pentru
rezolvarea problemelor geometrice. Geometria computaional are aplicaii n ingineria moder-
n, n matematic i n alte domenii cum ar graca pe calculator, robotica, proiectarea VLSI,
proiectarea asistat de calculator i statistica. Datele de intrare, pentru o problem de geometrie
computaional, sunt, de obicei, o descriere a unei mulimi de obiecte geometrice, ca o mulime de
puncte, o mulime de segmente de dreapt sau o mulime de vrfuri ale unui poligon, ordonate
n sens trigonometric. Ieirea este, adesea, un rspuns la o ntrebare despre obiecte, cum ar
intersectarea unor drepte sau un nou obiect geometric, de exemplu, nvelitoarea convex a
mulimii de puncte (cel mai mic poligon convex care le include).
n acest capitol, urmrim civa algoritmi de geometrie computaional n dou dimen-
siuni, adic n plan. Fiecare obiect de intrare este reprezentat ca o mulime de puncte p
i
,
unde p
i
= (x
i
, y
i
) i x
i
, y
i
R. De exemplu, un poligon P cu n vrfuri este reprezentat prin
secvena 'p
0
, p
1
, p
2
, ..., p
n1
` a vrfurilor sale n ordinea apariiei lor n P. De asemenea, geometria
computaional se poate face n trei dimensiuni i chiar n spaii dimensionale mai mari, dar astfel
de probleme i soluiile lor pot vizualizate foarte greu. Chiar i n dou dimensiuni, putem vedea
exemple bune de tehnici de geometrie computaional.
n seciunea 35.1 prezentm rspunsuri corecte i eciente la ntrebri simple despre segmente
de dreapt: dac un segment este n sensul acelor de ceasornic sau n sens trigonometric fa
de un alt segment cu care are un capt comun, n ce mod ne ntoarcem cnd parcurgem dou
segmente de dreapt adiacente, dac dou segmente de dreapt se intersecteaz. n seciunea 35.2
se prezint o tehnic numit baleiere pe care o vom folosi pentru a dezvolta un algoritm de timp
O(nlg n) care determin dac exist intersecii pentru o mulime de n segmente de dreapt. n
seciunea 35.3 se prezint doi algoritmi de baleiaj rotaional care calculeaz nvelitoarea convex
pentru o mulime de n puncte (cel mai mic poligon convex care le include): scanarea lui Graham,
care se execut n timpul O(nlg n), i potrivirea lui Jarvis, care are timpul de execuie O(nh),
unde h este numrul de vrfuri ale nvelitorii convexe. n nal, n seciunea 35.4 se prezint un
algoritm divide i stpnete de timp O(nlg n) pentru determinarea celei mai apropiate perechi
de puncte dintr-o mulime de n puncte din plan.
35.1. Proprietile segmentului de dreapt
n acest capitol, majoritatea algoritmilor de geometrie computaional vor cere rspunsuri
la ntrebri despre proprietile segmentelor de dreapt. O combinare convex a dou puncte
distincte p
1
= (x
1
, y
1
) i p
2
= (x
2
, y
2
) este un punct p
3
= (x
3
, y
3
), astfel nct pentru un
oarecare, n intervalul 0 1, avem x
3
= x
1
+ (1 )x
2
i y
3
= y
1
+ (1 )y
2
. De
asemenea, vom scrie c p
3
= p
1
+(1)p
2
. Intuitiv, p
3
este pe dreapta care trece prin punctele
p
1
i p
2
i este n afar sau ntre p
1
i p
2
pe aceast dreapt. Pentru dou puncte p
1
i p
2
date,
segmentul de dreapt p
1
p
2
este mulimea combinrilor convexe ale lui p
1
i p
2
. Numim p
1
i
p
2
capetele segmentului p
1
p
2
. Cteodat, conteaz ordinea punctelor p
1
i p
2
, atunci vorbim
despre segment orientat

p
1
p
2
. Dac p
1
este originea (0, 0), atunci putem trata segmentul
760 Capitolul 35 Geometrie computaional
orientat

p
1
p
2
ca ind vectorul p
2
.
n aceast seciune, vom cuta rspunsuri la urmtoarele ntrebri:
1. Dndu-se dou segmente orientate

p
0
p
1
i

p
0
p
2
innd seama de captul lor comun p
0
este

p
0
p
1
n sensul acelor de ceasornic de la

p
0
p
2
?
2. Fiind date dou segmente de dreapt p
1
p
2
i p
2
p
3
, dac parcurgem p
1
p
2
i apoi p
2
p
3
, facem
o ntoarcere la stnga n punctul p
2
?
3. Se intersecteaz segmentele de dreapt p
1
p
2
i p
3
p
4
?
Nu exist restricii pentru punctele date.
Putem rspunde la ecare ntrebare n timpul O(1), ceea ce ar trebui s nu ne surprind
deoarece dimensiunea datelor de intrare, pentru ecare ntrebare, este O(1). Mai mult, metodele
noastre folosesc doar adunri, scderi, nmuliri i comparaii. Nu avem nevoie nici de mpriri,
nici de funcii trigonometrice, amndou pot necesita calcule costisitoare i sunt predispuse
problemelor generate de erori de rotunjire. De exemplu, o metod simpl pentru a determina
dac dou segmente se intersectez calculm ecuaia dreptei n forma y = mx + b pentru
ecare segment (m este panta i b este intersecia dreptei cu Oy), gsim punctul de intersecie
al celor dou drepte i vericm dac el aparine ambelor segmente folosim mprirea pentru
a determina punctul de intersecie. Cnd segmentele sunt aproape paralele, aceast metod
este foarte sensibil la precizia operaiei de mprire pe un calculator real. n aceast seciune,
metoda care evit operaia de mprire este mult mai exact.
Produse ncruciate
Calcularea produsului ncruciat este esena metodelor noastre. Considerm vectorii p
1
i
p
2
, prezentai n gura 35.1(a). Produsul ncruciat p
1
p
2
poate interpretat ca ind aria
cu semn a paralelogramului format din punctele (0, 0), p
1
, p
2
i p
1
+ p
2
= (x
1
+ x
2
, y
1
+ y
2
). O
deniie echivalent, dar mult mai util, pentru produsul ncruciat este dat de determinantul
matricei:
1
p
1
p
2
= det

x
1
x
2
y
1
y
2

= x
1
y
2
x
2
y
1
= p
2
p
1
.
Dac p
1
p
2
este pozitiv, atunci p
1
este n sensul acelor de ceasornic fa de p
2
innd cont de
originea (0, 0); dac acest produs ncruciat este negativ, atunci p
1
este n sens trigonometric fa
de p
2
. n gura 35.1(b) se prezint regiunile relative la vectorul p, n sensul acelor de ceasornic
i n sensul trigonometric. Condiia limit apare dac produsul ncruciat este zero; n acest caz,
vectorii sunt coliniari , orientai n aceeai direcie sau n direcii opuse.
Pentru a determina dac un segment orientat

p
0
p
1
este n sensul acelor de ceasornic fa de
segmentul orientat

p
0
p
2
n raport cu punctul lor comun p
0
, facem o simpl translaie cu scopul
de a folosi p
0
ca origine. Adic, notm cu p
1
p
0
vectorul p
t
1
= (x
t
1
, y
t
1
), unde x
t
1
= x
1
x
0
i
y
t
1
= y
1
y
0
.

Denim n mod analog p
2
p
0
. Calculm apoi produsul ncruciat
(p
1
p
0
) (p
2
p
0
) = (x
1
x
0
)(y
2
y
0
) (x
2
x
0
)(y
1
y
0
).
De fapt, produsul ncruciat este un concept tri-dimensional. Este un vector perpendicular pe p
1
i pe p
2
,
conform regulii minii drepte, i al crui modul este |x
1
y
2
x
2
y
1
|. n acest capitol. se va dovedi convenabil
tratarea produsului ncruciat ca simpla valoare x
1
y
2
x
2
y
1
.
35.1. Proprietile segmentului de dreapt 761
Figura 35.1 (a) Produsul ncruciat al vectorilor p
1
i p
2
este aria cu semn a paralelogramului. (b)
Regiunea alb conine vectorii care sunt n sensul acelor de ceasornic fa de p. Regiunea haurat
conine vectorii care sunt n sens trigonometric fa de p.
Dac acest produs ncruciat este pozitiv, atunci

p
0
p
1
este n sensul acelor de ceasornic fa de

p
0
p
2
; dac este negativ, atunci este n sens trigonometric.
Determinarea dac segmente consecutive se ntorc la stnga sau la
dreapta
Urmtoarea ntrebare este dac dou segmente de dreapt consecutive p
0
p
1
i p
1
p
2
se ntorc
la stnga sau la dreapta n punctul p
1
. Adic, dorim o metod pentru determinarea direciei
n care se ntoarce un unghi dat p
0
p
1
p
2
. Produsul ncruciat ne permite s rspundem la
aceast ntrebare fr s calculm unghiul. Aa cum se poate vedea n gura 35.2, vericm
dac segmentul orientat

p
0
p
2
este n sensul acelor de ceasornic sau n sens trigonometric, relativ
la segmentul orientat

p
0
p
1
. Pentru aceast vericare, calculm produsul ncruciat (p
2
p
0
)(p
1

p
0
). Dac semnul acestui produs ncruciat este negativ, atunci

p
0
p
2
este n sens trigonometric
fa de

p
0
p
1
i, astfel, facem o ntoarcere la stnga n p
1
. Un produs ncruciat pozitiv, indic o
orientare n sensul acelor de ceasornic i o ntoarcere la dreapta. Un produs ncruciat 0 nseamn
c punctele p
0
, p
1
i p
2
sunt coliniare.
Determinarea faptului dac dou segmente de dreapt se intersecteaz
Pentru a determina dac dou segmente de dreapt se intersecteaz, vom proceda n dou
etape. Prima etap este respingerea rapid: segmentele de dreapt nu se pot intersecta dac
dreptunghiurile de mrginire nu se intersecteaz. Dreptunghiul de mrginire al unei guri
geometrice este cel mai mic dreptunghi care conine gura i ale crui segmente sunt paralele
cu axa-x i axa-y. Dreptunghiul de mrginire al segmentului de dreapt p
1
p
2
este reprezentat
prin dreptunghiul ( p
1
, p
2
) cu punctul stnga jos p
1
= ( x
1
, y
1
) i punctul dreapta sus p
2
=
( x
2
, y
2
), unde x
1
= min(x
1
, x
2
), y
1
= min(y
1
, y
2
), x
2
= max(x
1
, x
2
) i y
2
= max(y
1
, y
2
). Dou
dreptunghiuri reprezentate prin punctele din stnga jos i din dreapta sus ( p
1
, p
2
) i ( p
3
, p
4
) se
762 Capitolul 35 Geometrie computaional
Figura 35.2 Folosirea produsului ncruciat pentru a determina cum se ntorc n punctul p
1
segmentele
de dreapt consecutive p
0
p
1
i p
1
p
2
. Vericm dac segmentul orientat

p
0
p
2
este n sensul acelor de
ceasornic sau n sens trigonometric relativ la segmentul orientat

p
0
p
1
. (a) Dac este n sens trigonometric,
punctele fac o ntoarcere la stnga. (b) Dac este n sensul acelor de ceasornic, ele fac o ntoarcere la
dreapta.
intersecteaz dac, i numai dac, este adevrat conjuncia:
( x
2
x
3
) ( x
4
x
1
) ( y
2
y
3
) ( y
4
y
1
).
Dreptunghiurile trebuie s se intersecteze pe ambele laturi. Primele dou comparaii de mai sus
determin dac dreptunghiurile se intersecteaz n x; ultimele dou comparaii determin dac
dreptunghiurile se intersecteaz n y.
A doua etap n determinarea faptului dac dou segmente de dreapt se intersecteaz decide
dac ecare segment ntretaie dreapta care conine cellalt segment. Un segment p
1
p
2
ntretaie
o dreapt dac punctul p
1
se a de o parte a dreptei, iar p
2
se a de cealalt parte a ei. Dac
p
1
i p
2
se a pe dreapt, atunci spunem c segmentul ntretaie dreapta. Dou segmente de
dreapt se intersecteaz dac, i numai dac, ele trec de testul de respingere rapid i ecare
segment ntretaie dreapta care conine cellalt segment.
Putem folosi metoda produsului ncruciat pentru a determina dac segmentul de dreapt
p
3
p
4
ntretaie dreapta care conine punctele p
1
i p
2
. Ideea, aa cum am artat n gura 35.3(a)
i (b), este s determinm dac segmentele orientate

p
1
p
3
i

p
1
p
4
au orientri opuse relativ
la

p
1
p
2
. n acest caz, segmentul ntretaie dreapta. Amintim c putem determina orientrile
relative cu ajutorul produselor ncruciate, vericnd doar dac semnele produselor ncruciate
(p
3
p
1
) (p
2
p
1
) i (p
4
p
1
) (p
2
p
1
) sunt diferite. O condiie limit apare dac oricare
dintre produsele ncruciate este zero. n acest caz, e p
3
, e p
4
se a pe dreapta care conine
segmentul p
1
p
2
. Deoarece cele dou segmente au trecut deja testul de respingere rapid, unul
dintre punctele p
3
sau p
4
trebuie s se ae, de fapt, pe segmentul p
1
p
2
. Dou astfel de situaii
sunt ilustrate n gura 35.3(c) i (d). Cazul n care cele dou segmente sunt coliniare, dar nu
se intersecteaz, ilustrat n gura 35.3(e), este eliminat de testul de respingere rapid. O ultim
condiie limit apare dac unul dintre cele dou segmente are lungimea zero, altfel spus, capetele
segmentului coincid. Dac ambele segmente au lungimea zero, atunci testul de respingere rapid
este sucient. Dac doar un segment, s zicem p
3
p
4
, are lungimea zero, atunci segmentele se
intersecteaz dac, i numai dac, produsul ncruciat (p
3
p
1
) (p
2
p
1
) este zero.
Alte aplicaii ale produselor ncruciate
n ultima seciune a acestui capitol se vor prezenta alte utilizri ale produselor ncruciate.
n seciunea 35.3 vom avea nevoie s ordonm o mulime de puncte n raport cu unghiurile lor
35.1. Proprietile segmentului de dreapt 763
Figura 35.3 Determinarea faptului dac segmentul de dreapt p
3
p
4
ntretaie dreapta ce conine
segmentul p
1
p
2
. (a) Dac acesta ntretaie dreapta, atunci semnele produselor ncruciate (p
3
p
1
)(p
2

p
1
) i (p
4
p
1
) (p
2
p
1
) difer. (b) Dac acesta nu ntretaie dreapta, atunci produsele sunt de acelai
semn. (c)-(d) Cazurile limit n care cel puin unul dintre produsele ncruciate este zero i segmentul
ntretaie dreapta. (e) Cazul limit n care segmentele sunt coliniare, dar nu se intersecteaz. Ambele
produse ncruciate sunt zero, dar ele nu pot calculate prin algoritmul nostru deoarece segmentele nu
trec testul de respingere rapid dreptunghiurile lor de mrginire nu se intersecteaz.
polare i o origine dat. Aa cum se cere s artai n exerciiul 35.1-2, produsele ncruciate
pot folosite pentru comparrile din procedura de sortare. n seciunea 35.2, vom folosi arbori
rou-negru pentru a pstra ordonarea vertical a unei mulimi de segmente de dreapt care nu se
intersecteaz. Dect s pstrm valorile cheie explicit, preferm s nlocuim ecare comparaie
de cheie, din codul arborilor rou-negru, cu un calcul de produs ncruciat pentru a determina
care dintre dou segmente, care intersecteaz o dreapt vertical dat, este mai sus.
Exerciii
35.1-1 Demonstrai c, dac p
1
p
2
este pozitiv, atunci vectorul p
1
este n sensul acelor de
ceasornic fa de vectorul p
2
n raport cu originea (0, 0) i c, dac acest produs este negativ,
atunci vectorul p
1
este n sens trigonometric fa de vectorul p
2
.
35.1-2 Scriei, n pseudocod, o procedur pentru sortarea unei secvene 'p
1
, p
2
, ..., p
n
` de n
puncte specicate prin unghiurile lor polare, n raport cu un punct de origine p
0
dat. Procedura
trebuie s se execute ntr-un timp O(nlg n) i s foloseasc produse ncruciate pentru a compara
unghiuri.
35.1-3 Artai cum se determin, ntr-un timp O(n
2
lg n), dac oricare trei puncte dintr-o mul-
ime de n puncte sunt coliniare.
764 Capitolul 35 Geometrie computaional
35.1-4 Profesorul Amundsen propune urmtoarea metod pentru a determina dac secvena de
n puncte 'p
0
, p
1
, ..., p
n1
` reprezint vrfurile consecutive ale unui poligon convex. (Vezi seciunea
16.4 pentru deniiile relative la poligoane.) Dac mulimea p
i
p
i+1
p
i+2
: i = 0, 1, ..., n 1,
unde adunarea de indici se face modulo n, nu conine nici ntoarceri la stnga, i nici ntoarceri
la dreapta, atunci ieirea este da; altfel ieirea este nu. Artai c, dei aceast metod are
un timp de execuie liniar, ea nu conduce ntotdeauna la rezultatul corect. Modicai metoda
profesorului astfel nct s produc, ntotdeauna, rspunsul corect ntr-un timp liniar.
35.1-5 Fiind dat un punct p
0
= (x
0
, y
0
), raza orizontal spre dreapta, din punctul p
0
, este
mulimea punctelor p
i
= (x
i
, y
i
) : x
i
x
0
i y
i
= y
0
, adic mulimea punctelor din dreapta lui
p
0
inclusiv p
0
. Fiind dat o raz orizontal spre dreapta din p
0
, artai cum se determin ntr-
un timp O(1), dac aceasta se intersecteaz cu un segment de dreapt p
1
p
2
. Realizai aceasta
reducnd problema la a determina dac dou segemente de dreapt se intersecteaz.
35.1-6 O metod pentru a determina dac un punct p
0
se a n interiorul unui poligon P,
nu neaprat convex, este s vericm dac ecare raz din p
0
intersecteaz frontiera lui P de
un numr impar de ori, iar punctul p
0
nu este pe frontiera lui P. Artai cum se calculeaz,
ntr-un timp (n), dac un punct p
0
este n interiorul unui poligon P cu n vrfuri. (
Folosii exerciiul 35.1-5. Asigurai-v c algoritmul este corect cnd raza intersecteaz frontiera
poligonului ntr-un vrf i cnd raza se suprapune peste o latur a poligonului.)
35.1-7 Artai cum se calculeaz aria unui poligon cu n vrfuri, nu neaprat convex, ntr-un
timp (n).
35.2. Determinarea cazului n care oricare dou segmente se
intersecteaz
Aceast seciune prezint un algoritm pentru a determina dac oricare dou segmente de
dreapt, dintr-o mulime de segmente, se intersecteaz. Algoritmul folosete o tehnic cunoscut
sub numele de baleiere care este comun multor algoritmi de geometrie computaional. Mai
mult, aa cum este artat n exerciiile de la sfritul seciunii, acest algoritm sau simple variaiuni
ale lui pot folosite pentru a rezolva i alte probleme de geometrie computaional.
Timpul de execuie al algoritmului este O(nlg n), unde n este numrul de segmente date.
Algoritmul determin numai dac dou drepte se intersecteaz sau nu; nu aeaz toate
interseciile. (n exerciiul 35.2-1, pentru a gsi interseciile ntr-o mulime de n segmente
de dreapt, timpul de execuie, n cel mai defavorabil caz, este (n
2
).
n baleiere, o dreapt de baleiere vertical, imaginar, traverseaz mulimea de obiecte
geometrice dat, de obicei, de la stnga la dreapta. Dimensiunea x a spaiului n care dreapta
de baleiere se deplaseaz, este tratat ca dimensiunea timpului. Baleierea ofer o metod pentru
ordonarea obiectelor geometrice, de obicei, plasndu-le ntr-o structur de date dinamic, i
pentru obinerea relaiilor dintre ele. n aceast seciune, algoritmul intersecie-segment-de-
dreapt consider toate capetele segmentelor de dreapt ordonate de la stnga la dreapta i
veric dac exist o intersecie de ecare dat cnd ntlnete un capt de segment.
35.2. Determinarea cazului n care oricare dou segmente se intersecteaz 765
Figura 35.4 Ordinea segmentelor de dreapt pentru diferite drepte de baleiere verticale. (a) Avem
a >
r
c, a >
t
b, b >
t
c, a >
t
c i b >
u
c. Segmentul d nu este comparabil cu segmentele din gur.
(b) La momentul interseciei segmentului e cu segmentul f, ordinea lor se inverseaz: avem e >
v
f, dar
f >
w
e. Orice dreapt de baleiere (de exemplu z) care traverseaz regiunea haurat are n ordinea ei
total segmentele e i f consecutive.
Ordonarea segmentelor
Dac presupunem c nu exist segmente verticale, atunci orice segment de intrare care inter-
secteaz o dreapt de baleiere vertical dat, o face ntr-un singur punct. Astfel, putem ordona
segmentele care intersecteaz o dreapt de baleiere vertical dup coordonatele y ale punctelor
de intersecie.
Mai exact, considerm dou segmente s
1
i s
2
care nu se intersecteaz. Spunem c aceste
segmente sunt comparabile dup x dac dreapta de baleiere vertical cu coordonata orizontal
x le intersecteaz pe amndou. Spunem c s
1
este deasupra lui s
2
dup x i scriem s
1
>
x
s
2
,
dac s
1
i s
2
sunt comparabile dup x i intersecia lui s
1
cu dreapta de baleiere din x se a
deasupra interseciei lui s
2
cu aceeai dreapt de baleiere. De exemplu, n gura 35.4(a) avem
relaiile a >
r
c, a >
t
b, b >
t
c, a >
t
c i b >
u
c. Segmentul d nu este comparabil cu nici un alt
segment.
Pentru orice x dat, relaia >
x
este o ordine total (vezi seciunea 5.2) de segmente care
intersecteaz dreapta de baleiere din x. Pentru valori diferite ale lui x, ordinea poate diferit,
dei segmentele intr i ies din ordonare. Un segment intr n ordonare cnd captul stng este
ntlnit de baleiere i iese din ordonare cnd este ntlnit captul drept.
Ce se ntmpl atunci cnd dreapta de baleiere trece prin intersecia a dou segmente? Aa
cum se vede n gura 35.4(b) este inversat poziia lor n ordinea total. Dreptele de baleiere v
i w sunt n dreapta, respectiv, stnga punctului de intersecie a segmentelor e i f, i avem
e >
v
f dar f >
w
e. Subliniem aceasta pentru c presupunem c nu exist trei segmente
care s se intersecteze n acelai punct, trebuie s existe vreo dreapt de baleiere vertical x
care intersecteaz segmentele e i f i pentru care ele sunt n ordinea total >
x
.
Orice dreapt de baleiere care trece prin regiunea haurat din gura 35.4(b), cum ar z, are
segmentele e i f consecutive n ordinea total.
766 Capitolul 35 Geometrie computaional
Deplasarea dreptei de baleiere
Algoritmii de baleiere, de obicei, gestioneaz dou mulimi de date:
1. Starea liniei de baleiere d relaia dintre obiectele intersectate de linia de baleiere.
2. Lista punct-eveniment este o secven de coordonate-x, ordonate de la stnga la
dreapta, care denesc poziiile de oprire ale dreptei de baleiere. Numim ecare astfel de
poziie de oprire punct eveniment. Numai n punctele eveniment, se ntlnesc modicri
ale strii liniei de baleiere.
Pentru unii algoritmi (de exemplu, algoritmul cerut n exerciiul 35.2-7), lista punct-eveni-
ment este determinat dinamic n timpul execuiei algoritmului. Cu toate acestea, algoritmul
pe care l avem la ndemn determin, static, punctele eveniment, bazndu-se doar pe simple
proprieti ale datelor de intrare. n particular, ecare capt de segment este un punct eveniment.
Sortm capetele de segment prin creterea coordonatei-x i procedm de la stnga la dreapta.
Cnd ntlnim un capt stng de segment, inserm segmentul n strile dreptei de baleiere i,
cnd ntlnim un capt drept de segment, tergem segmentul din strile dreptei de baleiere.
De ecare dat cnd dou segmente devin consecutive n ordinea total, vericm dac ele se
intersecteaz.
Strile dreptei de baleiere sunt o ordine total T, pentru care avem nevoie de urmtoarele
operaii:
Insereaz(T,s): insereaz segmentul s n T.
terge(T,s): terge segmentul s din T.
Deasupra(T,s): returneaz segmentul care este imediat deasupra lui s n T.
Dedesubt(T,s): returneaz segmentul care este imediat dedesubtul lui s n T.
Dac exist n segmente n mulimea de intrare, folosind arborii rou-negru, putem realiza
ecare dintre operaiile deasupra n timpul O(lg n). Reamintim c, n capitolul 14, operaiile
arbore-rou-negru necesit compararea cheilor. Putem nlocui compararea cheilor cu compararea
produs ncruciat care determin ordinea relativ a dou segmente (vezi exerciiul 35.2-2).
Algoritm pseudocod pentru intersecia segmentelor
Algoritmul urmtor primete ca date de intrare o mulime S de n segmente de dreapt. Acesta
returneaz valoarea logic adevrat dac orice pereche de segmente din S se intersecteaz, iar
altfel returneaz fals. Ordinea total T este implementat printr-un arbore-rou-negru.
Execuia algoritmului este ilustrat n gura 35.5. n linia 1 este iniializat ordinea total
cu mulimea vid. Linia 2 determin lista punctelor eveniment prin ordonarea de la stnga la
dreapta a celor 2n capete de segment, eliminnd egalitile prin punerea capetelor din stnga
naintea capetelor din dreapta.
35.2. Determinarea cazului n care oricare dou segmente se intersecteaz 767
Figura 35.5 Execuia algoritmului Intersecia-Oricror-Segmente. Fiecare dreapt punctat
reprezint o dreapt de baleiere ntr-un punct eveniment. Ordinea numelor de segment de sub ecare
dreapt de baleiere este ordinea total T la sfritul ciclului pentru n care este tratat punctul eveniment
corespunztor. Intersecia segmentelor d i b este gsit cnd este detectat segmentul c.
Intersecia-Oricror-Segmente(S)
1: T
2: sorteaz capetele segmentelor din S de la stnga la dreapta eliminnd egalitile prin punerea
capetelor stnga naintea capetelor dreapta
3: pentru ecare punct p din lista ordonat de capete execut
4: dac p este captul stng al segmentului s atunci
5: Insereaz(T,s)
6: dac (Deasupra(T,s) exist i intersecteaz pe s) sau (Dedesubt(T,s) exist i
intersecteaz pe s) atunci
7: returneaz adevrat
8: dac p este captul drept al segmentului s atunci
9: dac exist ambele segmente Deasupra(T,s) i Dedesubt(T,s) i Deasupra(T,s)
intersecteaz Dedesubt(T,s) atunci
10: returneaz adevrat
11: terge(T,s)
12: returneaz fals
Fiecare iteraie a ciclului pentru din liniile 311 trateaz un punct eveniment p. Dac p
este captul din stnga al segmentului s, atunci linia 5 adaug s la ordinea total i liniile 6
7 returneaz adevrat dac s intersecteaz ambele segmente ce i sunt consecutive n ordinea
total denit de linia de baleiere ce trece prin p. (O condiie limit apare dac p se a pe un alt
segment s
t
. n acest caz, este necesar doar ca s i s
t
s e consecutive n T.) Dac p este captul
din dreapta al segmentului s, atunci s este ters din ordinea total. Liniile 910 returneaz
adevrat dac exist o intersecie ntre segmentele ce i sunt consecutive lui s n ordinea total
denit de dreapta de baleiere ce trece prin p; aceste segmente vor deveni consecutive n ordinea
total, cnd s este ters. Dac aceste segmente nu se intersecteaz, linia 11 terge segmentul s
768 Capitolul 35 Geometrie computaional
din ordinea total. n nal, dac nu este gsit nici o intersecie prin prelucrarea celor 2n puncte
eveniment, atunci linia 12 returneaz fals.
Corectitudinea
Urmtoarea teorem arat c Intersecia-Oricror-Segmente este corect.
Teorema 35.1 Apelul funciei Intersecia-Oricror-Segmente(S) returneaz adevrat
dac, i numai dac, exist o intersecie printre segmentele lui S.
Demonstraie. Procedura poate incorect dac, i numai dac, returneaz adevrat cnd
nu exist intersecie sau dac returneaz fals cnd exist, cel puin o intersecie. Primul caz
nu poate s apar deoarece Intersecia-Oricror-Segmente returneaz adevrat numai
dac gsete o intersecie ntre dou segmente de intrare.
Pentru a arta c ultimul caz nu poate s apar, s presupunem c exist, cel puin, o intersec-
ie i algoritmul Intersecia-Oricror-Segmente returneaz fals. Fie p cel mai din stnga
punct de intersecie, eliminnd egalitile prin alegerea unui punct cu cea mai mic coordonat-
y, i e a i b segmentele care se intersecteaz n p. ntruct nu apare nici o intersecie n stnga
lui p, ordinea dat de T este corect pentru toate punctele din stnga lui p. Exist un capt de
segment q pe dreapta de baleiere z care este punctul eveniment la care a i b devin consecutive
n ordinea total. Dac p este pe dreapta de baleiere z atunci q = p. Dac p nu este pe dreapta
de baleiere z atunci q este n stnga fa de p. n ambele cazuri, ordinea dat de T este corect
nainte de procesarea lui q. (Aici suntem siguri c p este cel mai de jos dintre cele mai din stnga
puncte de intersecie. Datorit ordinii n care sunt procesate punctele eveniment, chiar dac p
este pe dreapta de baleiere z i exist un alt punct de intersecie p
t
pe z, punctul eveniment
q = p, procesat naintea celeilalte intersecii p
t
poate interfera cu ordinea total T.) Exist doar
dou posibiliti de a aciona n punctul eveniment q:
1. Unul dintre a i b este inserat n T i cellalt segment este deasupra sau dedesubtul acestuia
n ordinea total. Liniile 47 detecteaz acest caz.
2. Segmentele a i b sunt deja n T i un segment aat ntre ele n ordinea total a fost ters,
astfel a i b devenind consecutive. Liniile 811 detecteaz acest caz.
n ambele cazuri, este gsit intersecia p, contrazicnd presupunerea c procedura returneaz
fals.
Timpul de execuie
Dac exist n segmente n mulimea S, atunci Intersecia-Oricror-Segmente se
execut ntr-un timp O(nlg n). Linia 1 necesit un timp O(1). Linia 2 necesit un timp O(nlg n),
folosind sortarea prin interclasare sau heapsort. Deoarece exist 2n puncte eveniment, ciclul
pentru din liniile 311 se execut de cel mult 2n ori. Fiecare iteraie necesit un timp O(lg n)
deoarece ecare operaie arbore-rou-negru necesit un timp O(lg n) i, folosind metoda din
seciunea 35.1, ecare test de intersecie necesit un timp O(1). Astfel, timpul total este O(nlg n).
35.3. Determinarea nvelitorii convexe 769
Exerciii
35.2-1 Artai c pot exista (n
2
) intersecii ntr-o mulime de n segmente de dreapt.
35.2-2 Fiind date dou segmente a i b care nu se intersecteaz i care sunt comparabile n x,
artai cum se folosesc produsele ncruciate pentru a determina, ntr-un timp O(1), care dintre
relaiile a >
x
b sau b >
x
a are loc.
35.2-3 Profesorul Maginot ne sugereaz s modicm Intersecia-Oricror-Segmente,
astfel nct, nloc s se termine la gsirea unei intersecii, s aeze segmentele care se
intersecteaz i s continue cu urmtoarea iteraie a ciclului pentru. Profesorul numete
procedura care se obine Afieaz-Intersecia-Segmentelor i arm c ea aeaz toate
interseciile, de la stnga la dreapta, aa cum apar ele n mulimea segmentelor. Artai c
profesorul greete n dou privine dnd o mulime de segmente pentru care prima intersecie
gsit de Afieaz-Intersecia-Segmentelor nu este cea mai din stnga i o mulime de
segmente pentru care Afieaz-Intersecia-Segmentelor eueaz n determinarea tuturor
interseciilor.
35.2-4 Dai un algoritm de timp O(nlg n) care determin dac un poligon cu n vrfuri este
simplu.
35.2-5 Dai un algoritm de timp O(nlg n) care determin dac dou poligoane simple, cu un
numr total de n vrfuri, se intersecteaz.
35.2-6 Un disc este alctuit dintr-un cerc plus interiorul acestuia i este reprezentat prin centrul
i raza sa. Dou discuri se intersecteaz dac au un punct comun. Dai un algoritm de timp
O(nlg n) care determin dac oricare dou discuri, dintr-o mulime de n discuri, se intersecteaz.
35.2-7 Fiind dat o mulime de n segmente de dreapt avnd n total k intersecii, artai cum
pot determinate toate cele k intersecii ntr-un timp O((n +k) lg n).
35.3. Determinarea nvelitorii convexe
nvelitoarea convex a unei mulimi de puncte Q este poligonul convex de arie minim
P, pentru care ecare punct din Q este sau pe frontiera lui P, sau n interiorul acestuia. Notm
nvelitoarea convex a lui Q prin C(Q). Intuitiv, ne putem gndi la ecare punct din Q ca
ind un cui xat pe o scndur. Atunci, nvelitoarea convex este curba format de o band de
cauciuc strns care nconjoar toate cuiele. n gura 35.6, se prezint o mulime de puncte i
nvelitoarea lor convex.
n aceast seciune vom prezenta doi algoritmi care determin nvelitoarea convex a unei
mulimi de n puncte. Ambii algoritmi au ca ieire vrfurile nvelitorii convexe ordonate n sens
trigonometric. Primul, cunoscut sub numele de scanarea lui Graham, se execut ntr-un timp
O(nlg n). Al doilea, numit potrivirea lui Jarvis, se execut ntr-un timp O(nh), unde h este
numrul de vrfuri ale nvelitorii convexe. Dup cum s-a putut observa n gura 35.6, ecare vrf
al lui C(Q) este un punct din Q. Ambii algoritmi exploateaz aceast proprietate, hotrnd
care vrfuri din Q sunt pstrate ca i vrfuri ale nvelitorii convexe i care vrfuri din Q sunt
eliminate.
770 Capitolul 35 Geometrie computaional
Figura 35.6 O mulime de puncte Q i nvelitoarea lor convex C(Q) desenat cu gri.
De fapt, exist cteva metode care calculeaz nvelitori convexe n timpi O(nlg n). Att
scanarea lui Graham ct i potrivirea lui Jarvis folosesc o tehnic numit baleiere rotaional,
procesnd vrfurile n ordinea unghiurilor polare pe care le formeaz cu vrful de referin. Alte
metode includ urmtorele:
n metoda incremental, punctele sunt ordonate de la stnga la dreapta, producnd
secvena 'p
1
, p
2
, ..., p
n
`. La etapa i, nvelitoarea convex C(p
1
, p
2
, ..., p
i1
) a celor mai
din stnga i 1 puncte este actualizat corespunztor celui de-al i-lea punct de la stnga,
formnd astfel C(p
1
, p
2
, ..., p
i
). Aa cum se cere s artai n exerciiul 35.3-6, aceast
metod poate implementat astfel nct timpul total de execuie s e O(nlg n).
n metoda divide i stpnete, n timpul (n) mulimea de n puncte este mprit n
dou submulimi, una cu cele mai din stnga n/2| puncte i una cu cele mai din dreapta
n/2| puncte. nvelitorile convexe ale submulimilor sunt calculate recursiv, i apoi este
folosit o metod inteligent de a combina nvelitorile ntr-un timp O(n).
Metoda trunchiaz-i-caut este similar cu cel mai defavorabil caz al algoritmului
median de timp liniar din seciunea 10.3. Aceasta gsete poriunea superioar (sau lanul
superior) al nvelitorii convexe prin eliminarea repetat a unei pri constante dintre
punctele rmase pn cnd nu mai rmne dect lanul superior al nvelitorii convexe.
Lanul inferior este determinat n mod analog. Aceast metod este, asimptotic, cea
mai rapid: dac nvelitoarea convex conine h vrfuri, execuia necesit doar un timp
O(nlg h).
Determinarea nvelitorii convexe a unei mulimi de puncte este, n sine, o problem inte-
resant. Mai mult, algoritmi pentru multe probleme de geometrie computaional ncep prin
determinarea unei nvelitori convexe. S analizm, de exemplu, n spaiul bidimensional, pro-
blema perechii celei mai ndeprtate: avem dat o mulime de n puncte din plan i vrem
s gsim dou puncte a cror distan unul fa de cellalt este maxim. Aa cum cere exer-
ciiul 35.3-3, aceste dou puncte trebuie s e vrfuri ale nvelitorii convexe. Dei nu vrem s
demonstrm aici, armm c perechea celui mai ndeprtat de vrf a unui poligon convex cu
n vrfuri poate gsit ntr-un timp O(n). Deci, calculnd nvelitoarea convex a n puncte
35.3. Determinarea nvelitorii convexe 771
de intrare ntr-un timp O(nlg n) i apoi gsind perechea cea mai departat dintre vrfurile
poligonului convex rezultat, putem gsi ntr-un timp O(nlg n) perechea celui mai ndeprtat
punct din orice mulime de n puncte.
Scanarea Graham
Scanarea Graham rezolv problema nvelitorii convexe prin ntreinerea unei stive S de
puncte posibile. Fiecare punct din mulimea de intrare Q este pus o dat pe stiv i punctele care
nu sunt vrfuri ale lui C(Q) sunt, eventual, scoase din stiv. La terminarea algoritmului, stiva S
conine exact vrfurile lui C(Q), ordonate dup apariia lor pe frontier n sens trigonometric.
Procedura Scanarea-Graham primete ca intrare o mulime de puncte Q, unde [Q[ 3.
Ea apeleaz funcia Vrf(S) care returneaz punctul din vrful stivei S, fr a modica stiva,
i funcia Urmtorul-Vrf(S) care returneaz punctul cu o intrare mai jos dect vrful stivei
S, fr a modica stiva. Aa cum vom demonstra imediat, stiva S returnat de procedura
Scanarea-Graham conine, de jos n sus, n ordine trigonometric, exact vrfurile lui C(Q).
Scanarea-Graham(Q)
1: e p
0
punctul din Q cu coordonata y minim sau cel mai din stnga astfel de punct, n caz
c exist mai multe
2: e 'p
1
, p
2
, ..., p
m
` punctele rmase din Q, ordonate dup unghiurile polare n jurul lui p
0
, n
sens trigonometric (dac mai multe puncte au acelai unghi, atunci se pstreaz punctul cel
mai ndeprtat fa de p
0
)
3: [S] 0
4: Pune-n-Stiv(p
0
, S)
5: Pune-n-Stiv(p
1
, S)
6: Pune-n-Stiv(p
2
, S)
7: pentru i 3 la m execut
8: ct timp unghiul format de punctele Urmtorul-Vrf(S), Vrf(S) i p
i
face o
ntoarcere, dar nu spre stnga execut
9: Scoate-Din-Stiv(S)
10: Pune-n-Stiv(p
i
, S)
11: returneaz S
n gura 35.7 se ilustreaz evoluia procedurii Scanarea-Graham. Linia 1 alege punctul
p
0
ca punct avnd coordonata y cea mai mic, n caz de egalitate alegnd punctul cel mai din
stnga. Deoarece nu exist nici un punct n Q care este mai jos dect p
0
i orice alt punct cu
aceeai coordonat y este la dreapta lui p
0
, acesta este un vrf al lui C(Q). Linia 2 sorteaz
punctele rmase din Qdup unghiurile polare relative la p
0
, folosind aceeai metod compararea
produselor ncruciate ca n exerciiul 35.1-2. Dac dou sau mai multe puncte au acelai unghi
polar relativ la p
0
, atunci toate aceste puncte, cu excepia celui mai ndeprtat, sunt combinaii
convexe ale lui p
0
cu punctul cel mai ndeprtat i, astfel, le eliminm pe toate din discuie.
Notm cu m numrul punctelor diferite de p
0
care rmn. Unghiul polar, msurat n radiani,
al ecrui punct din Q relativ la p
0
este n intervalul [0, /2). Deoarece unghiurile polare cresc
n sens trigonometric, punctele sunt sortate relativ la p
0
n sens trigonometric. Notm aceast
secven ordonat de puncte prin 'p
1
, p
2
, ..., p
m
`. Observai c punctele p
1
i p
m
sunt vrfuri
ale lui C(Q) (vezi exerciiul 35.3-1). n gura 35.7(a) sunt prezentate punctele gurii 35.6,
'p
1
, p
2
, ..., p
12
` cu unghiurile polare ordonate relativ la p
0
.
772 Capitolul 35 Geometrie computaional
Figura 35.7 Execuia algoritmului Scanarea-Graham pentru mulimea Qdin gura 35.6. nvelitoarea
convex curent din stiva S este reprezentat la ecare pas cu gri. (a) Unghiurile polare din
'p
1
, p
2
, ..., p
12
) ordonate relativ la p
0
i stiva iniial S coninnd p
0
, p
1
i p
2
. (b)-(k) Stiva S dup
ecare iteraie a ciclului pentru din liniile 710. Liniile punctate arat ntoarcerile care nu sunt spre
stnga, cauznd scoaterea punctelor din stiv. De exemplu, n (h), ntoarcerea spre dreapta din unghiul
p
7
p
8
p
9
conduce la scoaterea lui p
8
din stiv, i apoi ntoarcerea spre dreapta din unghiul p
6
p
7
p
9
conduce la scoaterea lui p
7
. (l) nvelitoarea convex returnat de procedur, aceeai ca n gura 35.6.
35.3. Determinarea nvelitorii convexe 773
Restul procedurii folosete stiva S. Liniile 36 iniializeaz stiva, de jos n sus, cu primele
trei puncte p
0
, p
1
i p
2
. n gura 35.7(a) se prezint stiva iniial S. Ciclul pentru din liniile
710 se execut o dat pentru ecare punct al secvenei 'p
3
, p
4
, ..., p
m
`. Intenia este ca, dup
procesarea punctului p
i
, stiva S s conin, de jos n sus, vrfurile lui C(p
0
, p
1
, ..., p
i
) ordonate
n sens trigonometric. Ciclul ct timp, din liniile 89, scoate din stiv punctele care nu fac parte
din nvelitoarea convex. Cnd parcurgem nvelitoarea convex n sens trigonometric trebuie s
facem ntoarceri la stnga n ecare vrf. Deci, de ecare dat cnd ciclul ct timp gsete un
vrf n care nu facem o ntoarcere la stnga, vrful este scos din stiv. (Vericnd c o ntoarcere
774 Capitolul 35 Geometrie computaional
Figura 35.8 Dou situaii eseniale n demonstrarea corectitudinii algoritmului Scanarea-Graham.
(a) Se arat c, n Scanarea-Graham, un punct scos din stiv nu este un vrf din C(Q). Dac vrful
p
j
este scos din stiv deoarece unghiul p
k
p
j
p
i
nu face o ntoarcere la stnga, atunci triunghiul haurat,
.p
0
p
k
p
i
, conine punctul p
j
. Deci punctul p
j
nu este un vrf din C(Q). (b) Dac punctul p
i
este pus n
stiv, atunci n unghiul p
k
p
j
p
i
trebuie s e o ntoarcere la stnga. Punctul p
i
trebuie s e n regiunea
haurat deoarece p
i
urmeaz dup p
j
n ordinea unghiurilor polare ale punctelor i datorit modului n
care a fost ales p
0
. Dac punctele din stiv formeaz un poligon convex nainte de operaia de punere,
atunci ele trebuie s formeze un poligon convex i dup aceea.
nu este spre stnga i nu doar c este spre dreapta, se exclude posibilitatea ca un unghi alungit
s fac parte din nvelitoarea convex rezultat. Aceasta este, tocmai, ceea ce dorim deoarece
ecare vrf al unui poligon convex nu trebuie s e o combinaie de alte vfuri ale poligonului.)
Dup ce scoatem din stiv toate vrfurile care nu au ntoarceri spre stnga, cnd mergem ctre
punctul p
i
, punem p
i
n stiv. n gura 35.7(b)-(k), se prezint starea stivei S dup ecare iteraie
a ciclului pentru. n nal, n linia 11, Scanarea-Graham returneaz stiva S. n gura 35.7(l)
se prezint nvelitoarea convex corespunztoare.
Urmtoarea teorem demonstreaz formal corectitudinea procedurii Scanarea-Graham.
Teorema 35.2 (Corectitudinea algoritmului scanarea Graham) Dac procedura Sca-
narea-Graham este executat pentru o mulime de puncte Q, [Q[ 3, atunci un punct din Q
este pe stiva S la terminare dac, i numai dac, este vrf al nvelitorii convexe C(Q).
Demonstraie. Aa cum am observat mai sus, un vrf care este o combinaie convex a lui
p
0
i alte vrfuri din Q, nu este vrf al lui C(Q). Un astfel de vrf nu este inclus n secvena
'p
1
, p
2
, ..., p
m
` i deci el nu poate s apar n stiva S.
Dicultatea acestei demonstraii const n cele dou situaii ilustrate n gura 35.8. Cadrul
(a) trateaz ntoarcerile care nu sunt la stnga, iar cadrul (b) trateaz ntoarcerile la stnga.
Artm, mai nti, c ecare punct scos din stiva S nu este un vrf al nvelitorii C(Q).
Presupunem c punctul p
j
este scos din stiv deoarece unghiul p
k
p
j
p
i
nu face o ntoarcere la
stnga, conform gurii 35.8(a). Deoarece parcurgem punctele n ordinea cresctoare a unghiurilor
polare relative la punctul p
0
, exist un triunghi p
0
p
i
p
k
cu punctul p
j
sau n interiorul lui sau
pe segmentul p
i
p
k
. n ambele cazuri, punctul p
j
nu poate un punct din C(Q).
Artm acum c, n nal, ecare punct din stiva S este un vrf din C(Q). ncepem prin a
demonstra urmtoarea armaie: Scanarea-Graham susine invariantul c punctele din stiva
S fac parte, ntotdeauna, din vrfurile unui poligon convex, ordonate n sens trigonometric.
35.3. Determinarea nvelitorii convexe 775
Figura 35.9 Adugnd un punct unui poligon convex P, n regiunea haurat, se obine un alt poligon
convex. Regiunea haurat este mrginit de o latur p
r
p
t
i prelungirile a dou laturi adiacente. (a)
Regiunea haurat este mrginit. (b) Regiunea haurat este nemrginit.
Imediat dup execuia liniei 6, armaia este valabil deoarece punctele p
0
, p
1
i p
2
formeaz
un poligon convex. Urmrim, acum, cum se modic stiva S n timpul execuiei algoritmului
Scanarea-Graham. Punctele sunt sau scoase, sau puse n stiv. n primul caz, ne bazm pe
o simpl proprietate geometric: dac un vrf este eliminat dintr-un poligon convex, poligonul
rezultat este convex. Deci scoaterea unui punct din stiva S pstreaz invariantul.
nainte de a trata cazul n care un punct este pus n stiv, s examinm o alt proprietate
geometric, ilustrat n gura 35.9(a) i (b). Fie P un poligon convex, alegem o latur oarecare
p
r
p
t
din P. S analizm regiunea mrginit de p
r
p
t
i prelungirile celor dou laturi adiacente. (n
funcie de unghiurile relative ale laturilor adiacente, regiunea poate mrginit, ca n regiunea
haurat din cadrul (a), sau nemrginit, ca n cadrul (b).) Dac adugm orice punct p
s
din
aceast regiune la P ca un nou vrf, nlocuind latura p
r
p
t
cu laturile p
r
p
s
i p
s
p
t
, poligonul
rezultat este convex.
Considerm acum c punctul p
i
este pus pe stiva S. Referindu-ne la gura 35.8(b), e p
j
punctul din vrful stivei S, chiar nainte de a pus p
i
, i e p
k
predecesorul lui p
j
n S. Armm
c p
i
trebuie s e n zona haurat din gura 35.8(b), care corespunde direct cu regiunea
haurat din gura 35.9(b). Punctul p
i
trebuie s e n partea haurat fa de prelungirea lui
p
k
p
j
deoarece unghiul p
k
p
j
p
i
face o ntoarcere la stnga. El trebuie s e n partea haurat
a lui p
0
p
j
deoarece, n ordinea unghiurilor polare, p
i
este dup p
j
. Mai mult, dup cum am ales
punctul p
0
, punctul p
i
trebuie s e n partea haurat fa de prelungirea lui p
0
p
1
. Deci p
i
este
n regiunea haurat, i, dup punerea lui p
i
n stiva S, punctele din S formeaz un poligon
convex. Acum, demonstraia armaiei este complet.
Deci, n nalul procedurii Scanarea-Graham punctele din Q care sunt n stiva S formeaz
vrfurile unui poligon convex. Am artat c toate punctele care nu sunt n S nu sunt din C(Q)
sau, n mod echivalent, c toate punctele care sunt din C(Q) sunt n S. ntruct S conine doar
vrfuri din Q i punctele sale formeaz un poligon convex, ele trebuie s formeze C(Q).
Artm acum c timpul de execuie al algoritmului Scanarea-Graham este O(nlg n), unde
n = [Q[. Linia 1 necesit un timp (n). Linia 2 necesit un timp O(nlg n) folosind sortarea prin
interclasare sau algoritmul heapsort pentru ordonarea unghiurilor polare i metoda produsului
ncruciat, din seciunea 35.1, pentru compararea unghiurilor. (tergerea tuturor punctelor cu
776 Capitolul 35 Geometrie computaional
acelai unghi polar, cu excepia celui mai ndeprtat punct, poate realizat ntr-un timp O(n)).
Liniile 36 necesit un timp O(1). Ciclul pentru este executat de cel mult n 3 ori deoarece
m n 1. ntruct Pune-n-Stiv necesit un timp O(1), ecare iteraie necesit exclusiv un
timp O(1) din timpul consumat de ciclul ct timp, din liniile 89. Deci, n total, ciclul pentru
necesit exclusiv un timp O(n) pentru ciclul ct timp pe care l conine.
Am folosit metoda agregat din analiza amortizat pentru a arta c ciclul ct timp necesit
un timp de execuie total de O(n). Pentru i = 0, 1, ..., m, ecare punct p
i
este pus exact o dat
n stiva S. La fel ca i n analiza procedurii Scoatere-Multipl-Din-Stiv din seciunea 18.1,
observm c exist, cel mult, o operaie Scoate-Din-Stiv pentru ecare operaie Pune-n-
Stiv. Exact trei puncte p
0
, p
1
i p
m
nu sunt scoase din stiv niciodat, deci se efectueaz cel
mult m2 operaii Scoate-Din-Stiv n total. Fiecare iteraie a ciclului ct timp execut o
operaie Scoate-Din-Stiv i deci exist, n total, cel mult m2 iteraii ale ciclului ct timp.
ntruct testul din linia 8 necesit un timp O(1), ecare apel Scoate-Din-Stiv necesit un
timp O(1) i m n 1, timpul total necesar execuiei ciclului ct timp este O(nlg n).
Potrivirea lui Jarvis
Potrivirea lui Jarvis determin nvelitoarea convex a unei mulimi de puncte Q folosind
o tehnic cunoscut sub numele de mpachetarea pachetului (sau mpachetarea cadoului ).
Timpul de execuie al algoritmului este O(nh), unde h este numrul de vrfuri din C(Q). Cnd h
este O(lg n), atunci potrivirea lui Jarvis este, asimptotic, mai rapid dect scanarea lui Graham.
Intuitiv, potrivirea lui Jarvis simuleaz mpachetarea unei buci de hrtie bine ntins n
jurul mulimii Q. ncepem prin a lega captul hrtiei la cel mai de jos punct al mulimii, adic
acelai punct p
0
cu care am nceput scanarea Graham. Acest punct este un vrf al nvelitorii
convexe. mpingem hrtia spre dreapta pentru a o ntinde bine, iar apoi o mpingem n sus pn
cnd atinge un alt punct. Acest vrf trebuie s e, de asemenea, pe nvelitoarea convex. Pstrnd
hrtia ntins, continum n acest fel, nconjurnd mulimea de vrfuri pn cnd ajungem napoi
la punctul de pornire p
0
.
Formal, potrivirea lui Jarvis construiete o secven H = 'p
0
, p
1
, ..., p
h1
` din punctele din
C(Q). ncepem cu punctul p
0
. Dup cum se vede n gura 35.10, urmtorul vrf al nvelitorii
convexe, p
1
, are cel mai mic unghi polar n raport cu p
0
. (n caz de egalitate, vom alege punctul
cel mai ndeprtat de p
0
.) n mod analog, p
2
este cel mai mic unghi polar n raport cu p
1
i
aa mai departe. Cnd ajungem la vrful cel mai de sus, e acesta p
k
(eliminnd egalitile prin
alegerea celui mai ndeprtat vrf), am construit, aa cum se poate vedea i n gura 35.10,
lanul drept al nvelitorii C(Q). Pentru construirea lanului stng, pornim de la p
k
i alegem
punctul p
k+1
, punctul cu cel mai mic unghi polar n raport cu p
k
, dar de pe .
Continum s formm lanul stng prin luarea unghiurilor polare de pe axa-x negativ pn
cnd revenim n vrful originar p
0
.
Putem implementa potrivirea lui Jarvis ca o deplasare conceptual n jurul nvelitorii convexe,
adic fr s construim, separat, lanurile drept i stng. Astfel de implementri, de obicei,
pstreaz ruta unghiului ultimei laturi alese pe nvelitoarea convex i necesit ca secven-
a de unghiuri ale laturilor nvelitorii s e n ordine strict cresctoare (n intervalul 02
radiani). Avantajul construirii separate a lanurilor este c nu avem nevoie de calculul explicit
al unghiurilor; sunt suciente tehnicile din seciunea 35.1 pentru compararea unghiurilor.
Timpul de execuie pentru potrivirea lui Jarvis, la o implementare corect, este O(nh). Pentru
ecare dintre cele h vrfuri din C(Q), gsim vrful cu unghiul polar minim. Fiecare comparaie
35.3. Determinarea nvelitorii convexe 777
Figura 35.10 Funcionarea algoritmului de potrivire a lui Jarvis. Primul vrf ales este cel mai de jos
punct p
0
. Urmtorul vrf, p
1
, are unghiul polar cel mai mic dintre toate punctele, n raport cu p
0
. Apoi,
p
2
are cel mai mic unghi polar n raport cu p
1
. Lanul drept merge la fel de sus ca i cel mai de sus
punct p
3
. Atunci, lanul drept este construit prin cutarea celor mai mici unghiuri polare n raport cu
axa-x negativ.
ntre unghiuri polare, folosind tehnicile din seciunea 35.1, necesit un timp O(1). Aa cum este
artat n seciunea 10.1, putem determina minimul a n valori ntr-un timp O(n) dac ecare
comparaie necesit un timp O(1). Deci potrivirea lui Jarvis necesit un timp O(nh).
Exerciii
35.3-1 Demonstrai c, n procedura Scanarea-Graham, punctele p
1
i p
m
trebuie s e
vrfuri din C(Q).
35.3-2 Considerm un model de calcul care permite adunarea, compararea i nmulirea, i care
conine marginea inferioar (nlg n) pentru ordonarea a n numere. Demonstrai c (nlg n) este
o margine inferioar pentru calcularea, n ordine, a vrfurilor nvelitorii convexe a unei mulimi
de n puncte ntr-un astfel de model.
35.3-3 Fiind dat o mulime de puncte Q, demonstrai c perechea punctelor celor mai nde-
prtate unul fa de cellalt trebuie s e vrfuri din C(Q).
35.3-4 Fie un poligon P i un punct q pe frontiera acestuia. Numim umbra lui q mulimea de
puncte r al cror segment qr se a, n ntregime, pe frontiera sau n interiorul lui P. Un poligon
P este n form de stea dac exist n interiorul su un punct p care se a n umbra oricrui
punct de pe frontiera lui P. Mulimea tuturor acestor puncte p se numete nucleul lui P. (Vezi
gura 35.11.) Fiind dat un poligon P cu n vrfuri, n form de stea, specicat prin vrfurile lui
ordonate n sens trigonometric, artai cum se calculeaz C(P) ntr-un timp O(n).
35.3-5 n problema nvelitorii convexe n timp real , avem dat o mulime Q de n puncte
pe care le primim pe rnd. La primirea ecrui punct, calculm nvelitoarea convex a punctelor
cunoscute pn la momentul curent. Evident, se poate executa pentru ecare punct scanarea
Graham, ind necesar un timp de execuie de O(n
2
lg n). Artai cum se rezolv problema
nvelitorii convexe n timp real, astfel nct timpul de execuie s e O(n
2
).
778 Capitolul 35 Geometrie computaional
Figura 35.11 Deniia unui poligon n form de stea, pentru exerciiul 35.3-4. (a) Un poligon n form
de stea. Segmentul din punctul p spre orice punct q de pe frontiera poligonului intersecteaz frontiera
numai n q. (b) Un ploligon care nu este n form de stea. Regiunea haurat din stnga este umbra
lui q iar regiunea umbrit din dreapta este umbra lui q

. Nucleul este mulimea vid, deoarece aceste


regiuni sunt disjuncte.
35.3-6 Artai cum se implementeaz metoda incremental pentru calcularea nvelitorii con-
vexe a n puncte, astfel nct timpul de execuie s e O(nlg n).
35.4. Determinarea celei mai apropiate perechi de puncte
Analizm problema determinrii celei mai apropiate perechi de puncte ntr-o mulime Q de
n 2 puncte. Cele mai apropiate se refer la distana euclidian: distana dintre punctele
p
1
= (x
1
, y
1
) i p
2
= (x
2
, y
2
) este

(x
1
x
2
)
2
+ (y
1
y
2
)
2
. Dou puncte din mulimea Q pot
coincide, caz n care distana dintre ele este zero. Aceast problem are aplicaii, de exemplu, n
sistemele de control ale tracului. Un sistem pentru controlul tracului aerian sau maritim are
nevoie s tie care sunt cele mai apropiate dou vehicule pentru a detecta o posibil situaie de
coliziune.
Un algoritm de for brut pentru determinarea celei mai apropiate perechi se uit, pur i
simplu, la toate cele (
n
2
) = (n
2
) perechi de puncte. n acest capitol vom descrie un algoritm
divide i stpnete pentru aceast problem, al crui timp de execuie este descris de bine
cunoscuta relaie de recuren T(n) = 2T(n/2) + O(n). Deci, acest algoritm folosete doar un
timp O(nlg n).
Algoritmul divide i stpnete
Fiecare apel recursiv al algoritmului necesit, ca intrare, o submulime P Q i dou iruri
X i Y , ecare coninnd toate punctele submulimii de intrare P. Punctele din irul X sunt
ordonate astfel nct coordonatele lor x s e monoton cresctoare. n mod analog, irul Y este
ordonat monoton cresctor dup coordonata y. Reinei c, pentru a ajunge la timpul limit
O(nlg n), nu ne permitem s facem sortri la ecare apel recursiv; dac am face, timpul de
execuie pentru o recuren ar T(n) = 2T(n/2)+O(nlg n), iar pentru soluie T(n) = O(nlg
2
n).
Vom vedea mai trziu cum se folosete presortarea pentru a menine irurile sortate fr a le
sorta efectiv la ecare apel recursiv.
35.4. Determinarea celei mai apropiate perechi de puncte 779
Un apel recursiv cu intrrile P, X i Y veric nti dac [P[ 3. Dac da, atunci se
va folosi metoda forei brute descris mai sus: consider toate cele

]P]
2

perechi de puncte i
returneaz perechea cea mai apropiat. Dac [P[ 3, apelul recursiv va folosi paradigma divide
i stpnete dup cum urmeaz.
1. Divide: Determin o dreapt vertical d care mparte mulimea de puncte P n dou
submulimi P
S
i P
D
, astfel nct [P
S
[ = [P[/2|, [P
D
[ = [P[/2|, toate punctele din P
S
sunt pe dreapta d sau n stnga ei i toate punctele din P
D
sunt pe sau n dreapta dreptei
d. irul X este mprit n irurile X
S
i X
D
care conin punctele din P
S
i, respectiv,
P
D
, sortate monoton cresctor dup coordonata x. n mod analog, irul Y este mprit n
irurile Y
S
i Y
D
care conin punctele din P
S
i, respectiv, P
D
, sortate monoton cresctor
dup coordonata y.
2. Stpnete: Avnd mprit mulimea P n P
S
i P
D
, se fac dou apeluri recursive,
unul pentru a determina cea mai apropiat pereche de puncte din P
S
, i cellalt pentru a
determina cea mai apropiat pereche de puncte din P
D
. Intrrile pentru primul apel sunt
mulimea P
S
i irurile X
S
i Y
S
; iar pentru al doilea apel intrrile sunt P
D
, X
D
i Y
D
.
Fie
S
i
D
valorile returnate pentru distanele celor mai apropiate perechi din P
S
i,
respectiv, P
D
i e = min(
S
,
D
).
3. Combin: Cea mai apropiat pereche este cea cu distana , determinat de unul din
apelurile recursive, sau este o pereche de puncte cu un punct n P
S
i cellalt n P
D
.
Algoritmul determin dac exist o astfel de pereche cu distana mai mic dect .
Observai c, dac exist o pereche de puncte cu distana mai mic dect , atunci ambele
puncte ale perechii trebuie s e, fa de dreapta d, la distana maxim . Astfel, conform
gurii 35.12(a), ambele trebuie s se situeze ntr-o regiune de lime 2, centrat n jurul
dreptei verticale d. Pentru a gsi o astfel de pereche, dac exist, algoritmul procedeaz
dup cum urmeaz:
(a) Construiete un ir Y
t
, care este irul Y fr punctele ce sunt n afara regiunii de
lime 2. irul Y
t
este sortat dup coordonata y, la fel ca i Y .
(b) Pentru ecare punct p din irul Y
t
, algoritmul ncearc s gseasc punctele din Y
t
care sunt la o distan de cel mult uniti fa de p. Aa cum vom vedea imediat,
este necesar s e considerate doar 7 puncte din Y
t
, care urmeaz dup p. Algoritmul
calculeaz distana de la p la ecare dintre cele 7 puncte i reine distana
t
a perechii
celei mai apropiate, gsite dintre toate perechile de puncte din Y
t
.
(c) Dac
t
< , atunci regiunea vertical conine, ntr-adevr, o pereche mai apropiat
dect cea care a fost gsit prin apelurile recursive. Sunt returnate aceast pereche i
distana sa
t
. Altfel, sunt returnate cea mai apropiat pereche i distana sa , gsite
prin apelurile recursive.
n descrierea de mai sus au fost omise unele detalii de implementare care sunt necesare
pentru a obine timpul de execuie O(nlg n). Dup demonstrarea corectitudinii algoritmului,
vom prezenta cum se implementeaz algoritmul pentru a obine timpul limit dorit.
780 Capitolul 35 Geometrie computaional
Figura 35.12 Ideea cheie pentru a demonstra c algoritmul pentru determinarea perechii celei mai
apropiate necesit vericarea a doar 7 puncte care urmeaz dup ecare punct din irul Y

. (a) Dac
p
S
P
S
i p
D
P
D
sunt la mai puin de uniti distan, atunci ele trebuie s se ae n interiorul unui
dreptunghi 2 centrat pe dreapta d. (b) Modalitatea de a situa 4 puncte n interiorul unui ptrat
dac sunt la mai puin de uniti distan dou-cte-dou. n stnga sunt 4 puncte din P
S
, iar
n dreapta sunt 4 puncte din P
D
. Acolo pot 8 puncte situate n dreptunghiul 2 dac punctele de
pe dreapta d sunt perechi de puncte care coincid cu un punct n P
S
i unul n P
D
.
Corectitudinea
Corectitudinea acestui algoritm pentru determinarea perechii celei mai apropiate este evi-
dent, cu excepia a dou aspecte. Primul, oprind recursivitatea cnd [P[ 3, ne asigurm c
nu vom ncerca niciodat s mprim o mulime cu un singur punct. Al doilea aspect este c
avem nevoie doar de 7 puncte care urmeaz dup ecare punct p din irul Y
t
. Vom demonstra
n continuare aceast proprietate.
Presupunem c la un anumit nivel al recursivitii, cea mai apropiat pereche de puncte este
p
S
P
S
i p
D
P
D
. Astfel, distana
t
dintre p
S
i p
D
este strict mai mic dect . Punctul p
S
trebuie s e pe dreapta d sau n stnga ei i la o distan mai mic de uniti. n mod analog,
p
D
este pe sau n dreapta dreptei d i la o distan mai mic de uniti. Mai mult, p
S
i p
D
se
a pe vertical la o distan de cel mult uniti unul fa de cellalt. Deci, aa cum se arat
n gura 35.12(a), p
S
i p
D
se a ntr-un dreptunghi 2 centrat pe dreapta d. (Desigur, pot
i alte puncte n interiorul acestui dreptunghi).
Artm n continuare c cel mult 8 puncte din P se pot situa n interiorul acestui dreptunghi
2. Studiem ptratul care reprezint jumtatea stng a dreptunghiului. Deoarece
toate punctele din P
S
sunt la o distan de cel puin uniti, cel mult 4 puncte se pot situa
n interiorul acestui ptrat; gura 35.12(b) arat cum. n mod analog, cel mult 4 puncte din
P
D
se pot situa n interiorul ptratului ce reprezint jumtatea dreapt a dreptunghiului.
Deci cel mult 8 puncte din P se pot situa n interiorul dreptunghiului 2. (Observm c,
ntruct punctele de pe d pot n oricare dintre mulimile P
S
sau P
D
, nu pot mai mult de 4
puncte pe d. Aceast limit este atins dac exist dou perechi de puncte care coincid, ecare
pereche coninnd un punct din P
S
i un punct din P
D
; o pereche se a la intersecia lui d cu
partea de sus a dreptunghiului, iar cealalt pereche se a la intersecia lui d cu partea de jos a
dreptunghiului.)
35.4. Determinarea celei mai apropiate perechi de puncte 781
Am artat c numai 8 puncte din P se pot situa n dreptunghi, se vede uor c este necesar s
vericm cel mult 7 puncte care urmeaz dup ecare punct n irul Y
t
. Pstrnd presupunerea
c cea mai apropiat pereche este p
S
i p
D
, presupunem, fr a reduce generalitatea, c p
S
l
precede pe p
D
n irul Y
t
. Atunci, chiar dac p
S
apare ct de devreme este posibil n irul Y
t
, i
p
D
apare ct mai trziu posibil, p
D
este ntr-una din cele 7 poziii care urmeaz dup p
S
. Deci
am demonstrat corectitudinea algoritmului pentru determinarea perechii celei mai apropiate.
Implementarea i timpul de execuie
Aa cum s-a observat, scopul nostru este ca timpul de execuie s e recurena T(n) =
2T(n/2) + O(n), unde T(n) este, desigur, timpul de execuie al algoritmului pentru o mulime
de n puncte. Dicultatea principal este de a ne asigura c irurile X
S
i X
D
, Y
S
i Y
D
, care
sunt folosite n apelurile recursive, sunt sortate dup coordonatele proprii i, de asemenea, c
irul Y
t
este sortat dup coordonata y. (Observm c, dac irul care este recepionat dintr-un
apel recursiv este gata sortat, atunci mprirea mulimii P n P
S
i P
D
se realizeaz uor n
timp liniar.)
Observaia cheie a rezolvrii problemei este c, la ecare apel, dorim s formm un subir
sortat dintr-un ir sortat. Fie un apel particular avnd ca date de intrare submulimea P i irul
Y , sortate dup coordonata y. Avnd mprit P n P
S
i P
D
, trebuie s formm irurile Y
S
i
Y
D
, care sunt sortate dup coordonata y. Mai mult, aceste iruri trebuie formate ntr-un timp
liniar. Metoda poate privit ca inversa procedurii Merge din sortarea prin interclasare din
seciunea 1.3.1: mprim un ir sortat n dou iruri sortate. Ideea este dat n pseudocodul
urmtor:
1: lungime[Y
S
] lungime[Y
D
] 0
2: pentru i 1 la lungime[Y ] execut
3: dac Y [i] P
S
atunci
4: lungime[Y
S
] lungime[Y
S
] + 1
5: Y [lungime[Y
S
]] Y [i]
6: altfel
7: lungime[Y
D
] lungime[Y
D
] + 1
8: Y [lungime[Y
D
]] Y [i]
Examinm punctele din irul Y n ordine. Dac un punct Y [i] este n P
S
, l adugm n
irul Y
S
la sfrit; altfel l adugm la sfritul irului Y
D
. n mod analog, pseudocodul formeaz
irurile X
S
,X
D
i Y
t
.
Singura ntrebare care mai rmne este cum sortm punctele la nceput. Facem o simpl
presortare a lor; adic le sortm, o dat, pe toate de primul apel recursiv. Aceste iruri
sortate sunt date n primul apel recursiv, de acolo ele sunt reduse prin apeluri succesive ct este
necesar. Presortarea adaug un timp O(nlg n) la timpul de execuie, dar acum ecare etap a
recursivitii necesit un timp liniar exclusiv pentru apelurile recursive. Deci, dac avem T(n)
timpul de execuie al ecrei etape recursive i T
t
(n) este timpul de execuie al algoritmului
complet, obinem T
t
(n) = T(n) +O(nlg n) i
T(n) =

2T(n/2) +O(n) dac n > 3,


O(1) dac n 3.
Deci T(n) = O(nlg n) i T
t
(n) = O(nlg n).
782 Capitolul 35 Geometrie computaional
Exerciii
35.4-1 Profesorul Smothers propune o schem care permite algoritmului determinrii celei mai
apropiate perechi s verice doar 5 puncte care urmeaz dup ecare punct n irul Y
t
. Ideea
este s plaseze totdeauna puncte de pe dreapta d n mulimea P
S
. Atunci, nu pot perechi de
puncte coincidente pe dreapta d, cu un punct n P
S
i unul n P
D
. Deci, cel mult, 6 puncte pot
n dreptunghiul 2. Ce nu este corect n schema profesorului?
35.4-2 Fr a crete asimptotic timpul de execuie al algoritmului, artai cum se garanteaz c
mulimea de puncte care a trecut de primul apel recursiv nu conine puncte care coincid. Artai
c este sucient s se verice punctele n 6 (nu 7) poziii din ir care urmeaz dup ecare punct
din Y
t
.
35.4-3 Distana dintre dou puncte poate denit i altfel dect euclidian. n plan, distana
L
m
dintre punctele p
1
i p
2
este dat de ((x
1
x
2
)
m
+(y
1
y
2
)
m
)
1/m
. Deci distana euclidian
este distana L
2
. Modicai algoritmul celei mai apropiate perechi, astfel nct s foloseasc
distana L
1
, cunoscut sub numele de distana Manhattan.
35.4-4 Fiind date dou puncte p
1
i p
2
n plan, max([x
1
x
2
[, [y
1
y
2
[) este distana L

dintre
ele. Modicai algoritmul celei mai apropiate perechi s foloseasc distana L

.
Probleme
35-1 Niveluri convexe
Fiind dat o mulime Q de puncte n plan, denim nivelurile convexe ale lui Q prin inducie.
Primul nivel convex al lui Q se compune din acele puncte din Q care sunt vrfuri din C(Q).
Pentru i > 1, denim mulimea Q
i
care conine puncte din Q, mai puin punctele care au fost
n nivelurile convexe 1, 2, ..., i 1. Atunci, al i-lea nivel convex al lui Q este C(Q
i
) dac Q
i
=
i nedenit altfel.
a. Dai un algoritm cu timpul de execuie O(n
2
) care determin nivelurile convexe ale unei
mulimi de n puncte.
b. Demonstrai c timpul (nlg n) este necesar pentru a calcula nivelurile convexe ale unei
mulimi de n puncte pe orice model de calcul care necesit un timp (nlg n) pentru a
sorta n numere reale.
35-2 Niveluri maximale
Fie Q o mulime de n puncte n plan. Spunem c punctul (x, y) domin punctul (x
t
, y
t
) dac
x x
t
i y y
t
. Un punct din Q care nu este dominat de alte puncte din Q l numim punct
maximal . Observm c mulimea Q poate s conin mai multe puncte maximale, care pot
organizate n niveluri maximale dup cum urmeaz. Primul nivel maximal L
1
este mulimea
de puncte maximale din Q. Pentru i > 1, al i-lea nivel maximal L
i
este mulimea de puncte
maximale din Q

i1
j=1
L
j
.
Presupunem c mulimea Q are k niveluri maximale nevide, i e y
i
coordonata n y a celui
mai din stnga punct din L
i
pentru i = 1, 2, ..., k. Presupunem, de asemenea, c dou puncte
din Q nu au aceeai coordonat x sau y.
Probleme 783
a. Artai c y
1
> y
2
> ... > y
k
.
Analizm un punct (x, y) care este n stnga fa de toate punctele din Q i pentru care y
este diferit fa de coordonata y a oricrui punct din Q. Fie Q
t
= Q (x, y).
b. Fie j cel mai mic index, astfel nct y
i
< y, excepie y < y
k
, caz n care considerm
j = k + 1. Artai c nivelurile maximale ale lui Q
t
sunt dup cum urmeaz.
Dac j k, atunci nivelurile maximale ale lui Q
t
sunt aceleai cu nivelurile maximale
ale lui Q, cu excepia c L
j
l include i pe (x, y) ca noul ei punct cel mai din stnga.
Dac j = k + 1, atunci primele k niveluri maximale ale lui Q
t
sunt aceleai cu ale lui
Q, dar, n plus, Q
t
are un al (k + 1)-lea nivel maximal nevid: L
k+1
= (x, y).
c. Descriei un algoritm care calculeaz nivelurile maximale ale unei mulimi Q de n puncte
ntr-un timp O(nlg n). ( : Deplasai o dreapt de baleiere de la dreapta la stnga.)
d. Ce diculti apar dac permitem ca punctele de intrare s aib aceeai coordonat x sau
y? Propunei soluii pentru aceste probleme.
35-3 Vntorii de fantome i fantomele
Un grup de n vnatori de fantome se rzboiete cu n fantome. Fiecare vntor este narmat cu o
arm protonic, ce lovete fantoma cu o raz, distrugnd-o. Raza se propag n linie dreapt i
i ncheie traiectoria n momentul n care nimerete fantoma. Vntorii de fantome i aleg una
din urmtoarele strategii. Ei fac perechi cu fantomele, formnd n perechi de vntori-fantome
i, n acest fel, simultan, ecare vntor de fantome va elimina fantoma pereche. Precum se tie,
e foarte periculos ca dou raze s se intersecteze i, de aceea, vntorii de fantome trebuie s-i
aleag perechi pentru care nu apar intersecii de raze.
Se presupune c poziia ecrui vntor de fantome i a ecrei fantome este un punct x n
plan i c nu exist trei puncte coliniare.
a. Demonstrai c exist o linie care trece printr-un vntor de fantome i printr-o fantom,
astfel nct numrul vntorilor de fantome aai de o parte a liniei este egal cu numrul
fantomelor aate de aceeai parte. Descriei cum se poate determina o astfel de linie ntr-un
timp O(nlg n).
b. Se cere un algoritm de timp O(n
2
lg n) care s echivaleze numrul vntorilor de fantome
cu numrul fantomelor n aa fel, nct s nu se intesecteze nici o raz.
35-4 Distribuie nvelit rar
Analizm problema calculrii nvelitorii convexe a unei mulimi de puncte din plan care au
fost obinute conform unor distribuii aleatoare cunoscute. Cteodat, nvelitoarea convex a
n puncte care au fost obinute dintr-o astfel de distribuie, are dimensiunea O(n
1
) pentru o
constant > 0 oarecare. Numim aceasta o distribuie nvelit rar. Distribuiile nvelite rar
includ urmtoarele:
Punctele au fost obinute uniform dintr-o raz unitate a discului. nvelitoarea convex are
dimensiunea (n
1/3
).
784 Capitolul 35 Geometrie computaional
Punctele au fost obinute uniform din interiorul unui poligon convex avnd k laturi, oricare
ar k constant. nvelitoarea convex are dimensiunea (lg n).
Punctele au fost obinute dup o distribuie normal bidimensional. nvelitoarea convex
are dimensiunea (

lg n).
a. Se dau dou poligoane convexe cu n
1
, respectiv n
2
vrfuri. Artai cum se calculeaz n-
velitoarea convex a celor n
1
+ n
2
puncte ntr-un timp O(n
1
+ n
2
). (Poligoanele se pot
suprapune.)
b. Artai c nvelitoarea convex a unei mulimi de n puncte obinute independent, conform
unei distribuii nvelite rar, poate calculat ntr-un timp O(n). ( Determinai
recursiv nvelitoarea convex pentru primele n/2 puncte i apoi pentru ultimele n/2 puncte
i apoi combinai rezultatele.)
Note bibliograce
Acest capitol este doar un punct de pornire pentru algoritmii i tehnicile geometriei com-
putaionale. Dintre crile de geometrie computaional amintim Preparata i Shamos [160] i
Edelsbrunner [60].
Cu toate c geometria a fost studiat nc din antichitate, dezvoltarea de algoritmi pentru
problemele geometrice este relativ nou. Preparata i Shamos arm c prima referire la com-
plexitatea unei probleme a fost dat de E. Lemoine n 1902. El a studiat construciile euclidiene
cele care se pot realiza cu ajutorul riglei i compasului n plan i a formulat cinci primitive:
se pune un picior al compasului ntr-un punct dat, se pune un picior pe o dreapt dat, se
traseaz cercul, se pune rigla ntr-un punct dat i se traseaz o dreapt. Lemoine a studiat care
este numrul de primitive necesar pentru a efectua o construcie dat; el numete acest numr
simplitatea construciei.
Algoritmul care determin dac orice dou segmente se intersecteaz, din seciunea 35.2, se
datoreaz lui Shamos i Hoey [176].
Versiunea originar a scanrii lui Graham este dat n Graham [91]. Algoritmul de
mpachetare este datorat lui Jarvis [112]. Folosind ca model un arbore de decizie, Yao [205]
demonstreaz c (nlg n) este marginea inferioar pentru timpul de execuie al oricrui algoritm
de determinare a nvelitorii convexe. Cnd se ine cont de numrul de vrfuri h ale nvelitorii
convexe, algoritmul trunchiaz-i-caut al lui Kirkpatrick i Seidel [120], care necesit un timp
O(nlg h), este asimptotic optimal.
Timpul de execuie O(nlg n) necesar algoritmului divide i stpnete pentru determinarea
celei mai apropiate perechi de puncte este dat de Shamos i se gsete n Preparata i Shamos
[160]. Preparata i Shamos arat, de asemenea, c algoritmul este asimptotic optimal ntr-un
model arbore de decizie.
36 NP-completitudine
Toi algoritmii studiai pn acum au fost algoritmi cu timp de execuie polinomial:
pentru date de intrare de mrime n, ordinul de complexitate n cel mai defavorabil caz este
O(n
k
), unde k este o constant. Este normal s ne punem ntrebarea dac problemele pot
rezolvate n timp polinomial. Rspunsul este negativ. Exist probleme care nu pot rezolvate
de nici un calculator indiferent de timpul acordat pentru gsirea unei soluii. Un exemplu,
n acest sens, este faimoasa problem a ovielii propus de Turing. Exist, de asemenea,
probleme care pot rezolvate, dar nu au ordinul de complexitate de forma O(n
k
), k constant. O
problem rezolvabil n timp polinomial o vom numi problem accesibil, iar una al crei ordin
de complexitate depinde de o funcie suprapolinomial o vom numi problem inaccesibil.
Subiectul acestui capitol l constituie o clas foarte interesant de probleme, aa-numitele
probleme NP-complete, al cror statut este necunoscut. Pn n prezent, nu s-a descoperit
nici un algoritm polinomial pentru rezolvarea unei astfel de probleme, dar nimeni nu a reuit
s demonstreze c exist o limit inferioar pentru timpul suprapolinomial care este necesar
rezolvrii acesteia. Aceast aa-numit problem P = NP reprezint, nc de la formularea ei n
1971, unul dintre cele mai interesante subiecte deschise n algoritmica teoretic.
Cei mai muli informaticieni cred c problemele NP-complete sunt inaccesibile. Explicaia este
c, dac se descoper o rezolvare polinomial pentru o singur problem NP-complet, atunci,
poate gsit un algoritm polinomial pentru rezolvarea alte probleme din aceast clas.
Datorit vastei arii pe care o acoper problemele NP-complete care au fost studiate pn acum
fr s aprut nici un progres n direcia gsirii unei rezolvri polinomiale pentru vreuna dintre
ele, ar ntr-adevr uluitor ca toate s poat totui rezolvate n timp polinomial.
Pentru a deveni un bun programator, trebuie s nelegei noiunile de baz ale teoriei NP-
completitudinii. Pentru a arma c o problem este NP-complet, trebuie dat o demonstraie
a inaccesibilitii sale. Pentru un inginer, ar mai bine s-i petreac timpul dezvoltnd un
algoritm de aproximare (vezi capitolul 37) dect s caute un algoritm rapid care s dea o soluie
exact. Mai mult, un numr mare de probleme obinuite i interesante, care la prima vedere
nu par a mai dicile dect o sortare, o cutare n grafuri sau un ux n reea, sunt, de fapt,
NP-complete. Aasar este important s v familiarizai cu aceast clas remarcabil de probleme.
n acest capitol vor studiate aspecte ale NP-completitudinii care se refer la analiza
algoritmilor. n seciunea 36.1 vom da o deniie a noiunii de problem, vom deni clasa de
complexitate P a problemelor de decizie rezolvabile n timp polinomial. Vom vedea, de asemenea,
care este locul acestor noiuni n cadrul teoriei limbajelor formale. n seciunea 36.2 se denete
clasa NP a problemelor de decizie ale cror soluii pot vericate n timp polinomial. Tot aici,
vom pune i ntrebarea P = NP.
n seciunea 36.3 se arat cum pot studiate legturile dintre probleme prin intermediul
reducerilor n timp polinomial. Este denit NP-completitudinea i se schieaz o demonstraie
a faptului c o problem, numit problema satisabilitii circuitului, este NP-complet. Dup
ce am demonstrat inaccesibilitatea unei probleme, n seciunea 36.4 vom arta cum poate
demonstrat faptul c o problem este NP-complet folosind metoda reducerii. Metodologia este
ilustrat prin demonstrarea faptului c alte dou probleme de satisabilitate sunt NP-complete.
n seciunea 36.5 se demonstreaz NP-completitudinea altor probleme.
786 Capitolul 36 NP-completitudine
36.1. Timpul polinomial
ncepem studiul NP-completitudinii denind noiunea de problem rezolvabil n timp
polinomial. Aceste probleme sunt, n general, privite ca ind accesibile, din motive mai mult
losoce dect matematice. Putem oferi trei argumente pentru ca problemele rezolvabile n timp
polinomial s e considerate accesibile.
n primul rnd, chiar dac ar rezonabil s considerm o problem cu ordinul de complexitate
(n
100
) ca ind inaccesibil, exist foarte puine probleme practice rezolvabile ntr-un timp care
s depind de o funcie polinomial al crei grad este att de mare. Problemele rezolvabile n
timp polinomial ntlnite n practic necesit, n marea majoritate a cazurilor, mult mai puin
timp pentru a rezolvate.
n al doilea rnd, pentru multe modele de calcul, o problem care poate rezolvat n timp
polinomial folosind un model de calcul, va putea rezolvat n timp polinomial folosind orice
alt model de calcul. De exemplu, clasa problemelor rezolvabile n timp polinomial cu ajutorul
mainilor seriale cu acces direct coincide cu clasa problemelor rezolvabile n timp polinomial cu
ajutorul mainilor virtuale Turing.
1
Aceast clas coincide, de asemenea, cu clasa problemelor
rezolvabile n timp polinomial folosind un calculator care are posibilitatea procesrii paralele,
chiar dac numrul procesoarelor crete dup o funcie polinomial care depinde de mrimea
intrrii.
n al treilea rnd, clasa problemelor rezolvabile n timp polinomial are cteva proprieti de
nchidere interesante, deoarece polinoamele sunt mulimi nchise n cazul adunrii, nmulirii i
al compunerii. De exemplu, dac ieirea unui algoritm polinomial este considerat intrare pentru
un alt algoritm polinomial, atunci algoritmul rezultat va unul polinomial. De asemenea, dac
un algoritm polinomial apeleaz de un numr constant de ori subrutine polinomiale, atunci,
algoritmul rezultat este polinomial.
Probleme abstracte
Pentru a nelege clasa problemelor rezolvabile n timp polinomial trebuie, pentru nceput,
s denim noiunea de problem. Denim o problem abstract Q ca ind a relaie binar
ntre mulimea I a instanelor problemei i mulimea S a soluiilor problemei. De exemplu,
s considerm problema Drum-Minim care cere determinarea celui mai scurt drum dintre dou
noduri ale unui graf neorientat fr costuri, G = (V, E). O instan a acestei probleme este un
triplet format dintr-un graf i dou noduri. O soluie este o secven de noduri ale grafului sau,
probabil, o secven vid n cazul n care nu exist drum ntre cele dou noduri. nsi problema
Drum-Minim este relaia care asociaz ecrei instane formate dintr-un graf i dou noduri
o soluie care precizeaz cel mai scurt drum care unete cele dou noduri. Deoarece, drumurile
minime nu sunt, n mod obligatoriu, unice, o anumit instan dat a problemei poate avea mai
multe soluii.
Aceast formulare a deniiei unei probleme abstracte este mai general dect este nevoie
pentru ca scopul acestei cri s e atins. Pentru a simplica lucrurile, teoria NP-completitudinii
se refer numai la problemele de decizie: cele care au soluii de tipul da/nu. n acest caz,
putem privi o problem abstract de decizie ca ind o funcie avnd ca domeniu mulimea I a
vezi Hopcroft i Ullman [104] sau Lewis i Papadimitriou [139] pentru detalii despre modelul mainii Turing.
36.1. Timpul polinomial 787
instanelor problemelor, codomeniul ind mulimea {0, 1}. De exemplu, o problem de decizie
Drum care se refer la drumul minim ntr-un graf ar putea formulat astfel: Dndu-se un graf
G = (V, E), dou vrfuri u, v V i un numr ntreg nenegativ k, aai dac exist un drum n
G, ntre u i v, a crui lungime este cel mult k. Dac i = 'G, u, v, k` este o instan a acestei
probleme, atunci Drum(i) = 1 (da), dac drumul minim dintre u i v are cel mult lungimea k
i Drum(i) = 0 (nu), n caz contrar.
Multe probleme abstracte nu sunt probleme de decizie, ci, n cele mai multe cazuri, probleme
de optim, caz n care o anumit valoare trebuie s e minimizat sau maximizat. Pentru a
putea aplica teoria NP-completitudinii n cazul problemelor de optim, trebuie s le transformm
n probleme de decizie. Modalitatea uzual de a transforma o problem de optim ntr-una de
decizie este impunerea, pentru valoarea care trebuie optimizat, a unei limite inferioare, n cazul
problemelor de maximizare, sau a uneia superioare, n cazul problemelor de minimizare. Un
exemplu ar transformarea problemei drumului minim n problema de decizie Drum prin
impunerea limitei superioare k.
Cu toate c teoria NP-completitudinii ne oblig s transformm problemele de optim n
probleme de decizie, aceasta nu diminueaz importana pe care o are aceast teorie. n general,
dac putem rezolva rapid o problem de optim, atunci, vom putea rezolva problema de decizie
corespunztoare la fel de rapid. Va trebui doar s impunem, ca limit a valorii care trebuie
optimizat, exact valoarea obinut n urma rezolvrii problemei de optim. Dac o problem de
optim este uor de rezolvat, atunci i problema de decizie corespunztoare este uor de rezolvat.
Aceast armaie, exprimat ntr-un mod care are o relevan pentru NP-completitudine, devine:
dac se poate demonstra c o problem de decizie este greu de rezolvat, atunci se va putea
demonstra i c problema de optim corespunztoare este greu de rezolvat. Aadar, chiar dac
teoria NP-completitudinii i limiteaz atenia la problemele de decizie, aria ei de aplicabilitate
este mult mai mare.
Codicri
Dac un program trebuie s rezolve o problem abstract, atunci, instanele problemei trebuie
s poat reprezentate astfel nct programul s e capabil s le neleag. O codicare a
unei mulimi S de obiecte abstracte este o funcie e, de la S la mulimea irurilor binare.
2
De exemplu, o codicare a mulimii numerelor naturale N = 0, 1, 2, 3, 4, . . . este mulimea de
iruri {0, 1, 10, 11, 100, . . . }. Folosind aceast codicare, obinem e(17) = 10001. Cei care au
aruncat o privire asupra reprezentrilor caracterelor de pe tastatur sunt familiarizai cu unul
din codurile ASCII sau EBCDIC. n cod ASCII, avem e(A) = 1000001. Chiar i un obiect compus
poate codicat folosind iruri prin combinarea reprezentrilor prilor componente. Poligoanele,
grafurile, funciile, perechile ordonate sau programele pot toate codicate ca iruri binare.
Aadar, un algoritm care rezolv probleme de decizie abstracte cu ajutorul unui calculator,
are ca intrare o codicare a instanei problemei. Vom numi problem concret o problem a
crei mulime a instanelor este o mulime de iruri binare. Spunem c un algoritm rezolv o
problem concret n timp O(T(n)) dac, atunci cnd este dat o instan i de lungime n = [i[,
algoritmul va gsi o soluie cel mult ntr-un timp O(T(n)).
3
Codomeniul lui e nu trebuie s conin iruri binare, orice mulime de iruri peste un alfabet nit, avnd cel
puin dou simboluri, ind potrivit.
Presupunem c ieirea algoritmului este separat de intrare. Deoarece este nevoie de cel puin un pas pentru
determinarea ecrui bit al ieirii i exist O(T(n)) pai, mrimea ieirii este O(T(n)). O problem concret este
788 Capitolul 36 NP-completitudine
Acum putem deni clasa de complexitate P ca ind mulimea problemelor concrete de
decizie care sunt rezolvabile n timp polinomial.
Putem folosi codicri pentru a stabili o coresponden ntre problemele abstracte i
problemele concrete. Dndu-se o problem de decizie abstract Q care stabilete o funcie de
la mulimea I a instanelor la mulimea {0, 1}, o codicare e : I 0, 1

poate folosit
pentru a gsi problema concret de decizie corespunztoare pe care o vom nota cu e(Q). Dac
soluia unei instane i I a problemei abstracte este Q(i) 0, 1, atunci, soluia instanei
e(i) 0, 1

este, de asemenea, Q(i). Ca un detaliu tehnic, putem aminti faptul c pot exista
unele iruri binare care nu reprezint o instan a problemei abstracte. Pentru comoditate, vom
considera c funcia-problem asociaz unui astfel de ir valoarea 0. Aadar o problem concret
are aceleai soluii ca i problema abstract corespunztoare, dac instanele formate din iruri
binare reprezint codicri ale instanelor problemei abstracte.
Am vrea s extindem deniia rezolvabilitii n timp polinomial de la problemele concrete
la cele abstracte folosind codicarea ca o punte de legtur ntre aceste tipuri de probleme, dar
am dori, totodat, ca deniia s nu depind de vreo codicare particular. Aceasta nseamn
c eciena cu care este rezolvat o problem nu ar trebui s depind de codicarea aleas. Din
nefericire, aceast ecien depinde ns destul de mult de modul n care sunt codicate datele.
De exemplu, s presupunem c intrarea pentru un anumit algoritm este numrul ntreg k i c
timpul de execuie este (k). Dac numrul ntreg k va reprezentat unar, atunci, ordinul de
complexitate va O(n) unde n este lungimea intrrii. Dac numrul ntreg va reprezentat n
baza 10, atunci, lungimea intrrii va n = lg k| +1. n acest caz, ordinul de complexitate va
(k) = (2
n
), adic un timp exponenial fa de lungimea intrrii. Deci, n funcie de codicarea
aleas, programul care va implementa algoritmul se va executa e n timp polinomial, e n timp
suprapolinomial.
Codicarea unei probleme abstracte are o importan deosebit pentru nelegerea noiunii
de timp polinomial. Nu putem vorbi despre rezolvarea unei probleme abstracte fr s specicm
mai nti care va codicarea acesteia. Cu toate acestea, n practic, dac excludem codicrile
costisitoare cum ar cele unare, codicarea unei probleme nu are o prea mare inuen asupra
complexitii algoritmului. De exemplu, n cazul n care ntregii sunt reprezentai n baza 3 n
loc de baza 2, timpul de execuie va rmne polinomial i pentru baza 3 dac a fost polinomial
pentru baza 2, deoarece un ntreg n baza 3 poate convertit n baza 2 ntr-un timp polinomial.
Spunem c o funcie f : 0, 1

0, 1

este calculabil n timp polinomial dac exist


un algoritm n timp polinomial A, pentru care, dndu-se o intrare x 0, 1

, ieirea produs
este f(x). Pentru o mulime I a instanelor unei probleme, spunem c dou codicri e
1
i e
2
sunt asociate poliomial dac exist dou funcii calculabile n timp polinomial f
12
i f
21
astfel
nct, pentru orice i I, s e satisfcute relaiile f
12
(e
1
(i)) = e
2
(i) i f
21
(e
2
(i)) = e
1
(i). Aceasta
ar nsemna c una dintre codicri poate determinat cu ajutorul celeilalte n timp polinomial.
Dac dou codicri e
1
i e
2
ale unei probleme abstracte sunt asociate polinomial, atunci nu are
nici o importan care dintre ele este folosit, algoritmul ind sau polinomial pentru ambele
codicri, sau suprapolinomial. Acest rezultat este demonstrat n lema urmtoare.
Lema 36.1 Fie Q o problem abstract de decizie, I mulimea instanelor sale, i e
1
i e
2
dou
codicri pentru I asociate polinomial. Atunci e
1
(Q) P dac i numai dac e
2
(Q) P.
rezolvabil n timp polinomial dac exist un algoritm care gsete o rezolvare ntr-un timp de ordinul O(n
k
),
k ind o constant.
36.1. Timpul polinomial 789
Demonstraie. Este nevoie s demonstrm implicaia doar ntr-un singur sens deoarece
implicaiile sunt simetrice. S presupunem deci, c e
1
(Q) poate rezolvat n timp O(n
k
), cu k
constant. Presupunem, totodat, c, pentru o instan i, codicarea e
1
(i) poate determinat
din codicarea e
2
(i) ntr-un timp O(n
c
), cu c constant, unde n = [e
2
(i)[. Pentru a rezolva
problema folosind codicarea e
2
(Q), pentru o intrare e
2
(i), calculm mai nti e
1
(i) i apoi rulm
algoritmul pentru e
1
(Q) i intrarea e
1
(i). S calculm acum timpul necesar acestor operaii.
Pentru schimbarea codicrii avem nevoie de un timp O(n
c
), aadar [e
1
(i)[ = O(n
c
), deoarece
ieirea unui calculator serial nu poate mai mare dect timpul su de execuie. Rezolvarea
problemei pentru e
1
(i) poate fcut ntr-un timp O([e
1
(i)[
k
) = O(n
ck
), ceea ce reprezint un
timp polinomial deoarece att c, ct i k, sunt constante.
Aadar, nu conteaz dac instanele unei probleme sunt codicate n baza 2 sau n
baza 3, complexitatea problemei neind afectat de acest fapt, adic va polinomial sau
suprapolinomial n ambele situaii. Totui, dac instanele sunt codicate unar, complexitatea
algoritmului s-ar putea schimba. Pentru a putea face conversii ntr-un mod independent de
codicare, vom presupune, n general, c instanele problemelor sunt codicate ntr-o manier
rezonabil i concis, dac nu este specicat contrariul. Pentru a mai exaci, vom presupune
c o codicare aleas pentru un ntreg este asociat polinomial cu reprezentarea n baza 2 a
ntregului, i c o codicare a unei mulimi nite este asociat polinomial cu codicarea ei ca
list a elementelor componente, cuprinse ntre acolade i separate prin virgule. (ASCII este o
astfel de schem de codicare.) Avnd la dispoziie un astfel de standard pentru codicri,
putem obine codicri rezonabile pentru alte obiecte matematice cum ar tuplele, grafurile
i formulele. Pentru a simboliza codicarea unui obiect, vom scrie simbolul obiectului ntre
paranteze unghiulare. Deci, 'G` va simboliza codicarea standard a grafului G.
Att timp ct folosim, n mod implicit, o codicare care este asociat polinomial cu o
codicare standard, putem vorbi, direct, despre probleme abstracte fr a mai face referire
la codicri particulare, tiind c alegerea unei anumite codicri nu are nici un efect asupra
complexitii algoritmului. De aici nainte vom presupune c, n general, instanele unei probleme
sunt codicate prin iruri binare, folosind codicarea standard, dac nu se precizeaz contrariul
n mod explicit. De asemenea, vom neglija diferena dintre problemele abstracte i problemele
concrete. Cititorul ar trebui s e atent la problemele practice pentru care codicarea standard
nu este evident i pentru care alegerea unei anumite codicri are efecte asupra complexitii
algoritmului.
Limbaje formale
Unul dintre aspectele cele mai avantajoase n rezolvarea problemelor de decizie l reprezint
faptul c sunt foarte uor de folosit uneltele oferite de teoria limbajelor formale. Merit, deci,
s recapitulm cteva deniii care apar n cadrul acestei teorii. Un alfabet este o mulime
nit de simboluri. Un limbaj L peste este orice mulime de iruri formate din simboluri din
. De exemplu, dac = 0, 1, atunci, mulimea L = 10, 11, 101, 111, 1011, 1101, 10001, . . .
este limbajul reprezentrii binare a numerelor prime. Simbolizm irul vid prin i limbajul
vid prin . Limbajul tuturor irurilor peste este notat prin

. De exemplu, dac = 0, 1,
atunci,

= , 0, 1, 00, 01, 10, 11, 000, . . . este mulimea tuturor irurilor binare. Orice limbaj
L peste este o submulime a lui

.
Exist o varietate mare de operaii cu limbaje. Operaii din teoria mulimilor cum ar
790 Capitolul 36 NP-completitudine
reuniunea i intersecia rezult, direct, din denirea teoretic a mulimilor. Denim
complementul lui L prin L =

L. Concatenarea a dou limbaje L


1
i L
2
este limbajul
L = x
1
x
2
: x
1
L
1
i x
2
L
2
.
nchiderea sau steaua Kleene a unui limbaj L este limbajul
L

= L L
2
L
3
. . . ,
unde L
k
este limbajul obinut prin concatenarea limbajului L cu el nsui de k ori.
Din punct de vedere al teoriei limbajelor, mulimea instanelor unei probleme Q este mulimea

, unde = 0, 1. Datorit faptului c problema Q este total caracterizat prin acele instane
care duc la obinerea rezultatului 1 (da), putem privi mulimea Q ca ind un limbaj L peste
= 0, 1, unde
L = x

: Q(x) = 1.
De exemplu, problema de decizie Drum are ca limbaj corespunztor limbajul
Drum = 'G, u, v, k` : G = (V, E) este un graf neorientat, u, v V,
k 0 este un ntreg, i
exist un drum de la u la v n G a crui lungime este cel mult k.
(Unde este convenabil vom folosi acelai nume Drum n acest caz pentru a ne referi att la
problema de decizie ct i la limbajul corespunztor.)
Limbajele formale ne permit s exprimm relaii ntre problemele de decizie i anumii
algoritmi care le rezolv. Spunem c un algoritm A accept un ir x 0, 1

dac, dndu-
se o intrare x, ieirea algoritmului este A(x) = 1. Limbajul acceptat de un algoritm A este
mulimea L = x 0, 1

: A(x) = 1, adic mulimea irurilor pe care algoritmul le accept.


Un algoritm A respinge un ir x dac A(x) = 0.
Chiar dac limbajul L este acceptat de un algoritm A, algoritmul nu va respinge neaprat
un ir x / L care i este dat ca intrare. De exemplu algoritmul ar putea intra n ciclu innit. Un
limbaj L este claricat de un algoritm A dac ecare ir binar din L este acceptat de ctre A
i ecare ir binar care nu este n L este respins de ctre A. Un limbaj L este acceptat n timp
polinomial de ctre un algoritm A dac exist o constant k astfel nct, pentru orice ir binar
x de lungime n din L, algoritmul l accept pe x n timp O(n
k
). Un limbaj L este claricat
n timp polinomial de ctre un algoritm A dac, pentru orice ir x 0, 1

de lungime n,
algoritmul decide n mod corect dac x L ntr-un timp O(n
k
) pentru o constant k. Deci,
pentru a accepta un limbaj, un algoritm trebuie s trateze numai irurile din L, dar pentru a
clarica un limbaj el trebuie s accepte sau s resping n mod corect orice ir din 0, 1

.
De exemplu, limbajul Drum poate acceptat n timp polinomial. Un algoritm polinomial
care accept limbajul Drum determin cel mai scurt drum din G, dintre u i v, folosind cutarea
n lime i apoi compar distana obinut cu k. Dac distana este cel mult k atunci algoritmul
furnizeaz ieirea 1 i se oprete. n caz contrar, algoritmul va intra n ciclu innit. Acest algoritm
nu claric Drum deoarece nu furnizeaz ieirea 0 n cazul n care cel mai scurt drum are o
lungime mai mare dect k. Un algoritm care claric Drum trebuie s resping n mod explicit
irurile binare care nu fac parte din Drum. Pentru o problem de decizie cum este Drum, un
36.1. Timpul polinomial 791
algoritm care claric limbajul Drum este uor de proiectat. Pentru alte probleme cum ar
problema ovielii a lui Turing exist un algoritm de acceptare, dar nu exist unul de claricare.
Putem deni clasa de complexitate ca ind o mulime de limbaje pentru care apartenena
unui element este determinat de o msur a complexitii unui algoritm (cum ar timpul
de execuie) care determin dac un ir dat x aparine sau nu limbajului L. Deniia riguroas
a clasei de complexitate este una mult mai tehnic cititorii interesai pot consulta o lucrare ai
crei autori sunt Hartmanis i Stearns [95].
Folosind teoria limbajelor formale, putem da o deniie alternativ a clasei de complexitate
P:
P = L 0, 1

: exist un algoritm A care claric L n timp polinomial}.


De fapt, P este i clasa limbajelor care pot acceptate n timp poliomial.
Teorema 36.2 P = {L: L este acceptat de un algoritm care se execut n timp polinomial}.
Demonstraie. Deoarece clasa limbajelor care pot claricate n timp polinomial de ctre un
algoritm este o submulime a clasei limbajelor care pot acceptate n timp polinomial de ctre
un algoritm, este sucient s artm c, dac L este acceptat de un algoritm polinomial, el poate
claricat ntr-un timp polinomial. Fie L un limbaj acceptat n timp polinomial de ctre un
algoritm A. Vom da o demonstraie clasic de simulare pentru a construi un alt algoritm A
t
care claric L. Datorit faptului c A accept L ntr-un timp O(n
k
), cu k constant, exist o
constant c astfel nct A accept L n cel mult T = cn
k
pai. Pentru ecare ir x furnizat la
intrare, algoritmul A
t
simuleaz aciunile realizate de algoritmul A pentru un timp T. La sfritul
acestui interval de timp T, algoritmul A
t
veric algoritmul A. Dac A l-a acceptat pe x, A
t
l
accept pe x i furnizeaz ieirea 1. Dac A nu l-a acceptat pe x, A
t
l respinge pe x i furnizeaz
ieirea 0. Faptul c A
t
simuleaz A nu crete timpul de execuie dect, cel mult, cu un factor
polinomial, deci A
t
este un algoritm polinomial care l claric pe L.
Trebuie remarcat faptul c demonstraia teoremei 36.2 este una neconstructiv. Pentru un
limbaj L P, s-ar putea s nu cunoatem o limit pentru timpul de execuie al algoritmului A
care l accept pe L. Totui, tim c o astfel de limit exist i, ca urmare, exist i un algoritm A
t
care veric existena acestei limite, chiar dac gsirea algoritmului A
t
nu este o sarcin uoar.
Exerciii
36.1-1 Denii problema de optimizare Lungimea-Celui-Mai-Lung-Drum ca o relaie ce
asociaz ecare instan a unui graf neorientat i a dou noduri cu lungimea celui mai lung
drum elementar dintre cele dou noduri. Denii problema de decizie Cel-Mai-Lung-Drum =
{'G, u, v, k` : G = (V, E) este un graf neorientat, u, v, V, k 0 este un numr ntreg, i exist
un drum elementar de la u la v n G a crui lungime este cel puin k}. Artai c problema
Lungimea-Celui-Mai-Lung-Drum poate rezolvat n timp polinomial dac i numai dac,
Cel-Mai-Lung-Drum P.
36.1-2 Dai o deniie pentru problema gsirii celui mai lung ciclu elementar ntr-un graf
neorientat. Formulai problema de decizie corespunztoare. Precizai care este limbajul cores-
punztor problemei de decizie.
792 Capitolul 36 NP-completitudine
36.1-3 Realizai o codicare pentru grafurile orientate ca iruri binare folosind reprezentarea
prin matrice de adiacen. Realizai acelai lucru folosind reprezentarea prin liste de adiacen.
Demonstrai c cele dou codicri sunt asociate polinomial.
36.1-4 Este algoritmul de programare dinamic a problemei 0-1 a rucsacului cerut la exericiul
17.2-2 un algoritm polinomial? Justicai rspunsul.
36.1-5 S presupunem c exist un limbaj L pentru care exist un algoritm care accept orice
ir x L n timp polinomial, dar acest algoritm se execut n timp suprapolinomial dac x / L.
Demonstrai c L poate claricat n timp polinomial.
36.1-6 Demonstrai c un algoritm care face cel mult un numr constant de apeluri la subrutine
polinomiale se execut n timp polinomial, dar c un numr polinomial de apeluri poate duce la
un algoritm care se execut n timp exponenial.
36.1-7 Demonstrai armaia: clasa P, vzut ca o mulime de limbaje, este nchis pentru
operatorii de reuniune, intersecie, concatenare, complementare sau steaua lui Kleene. Adic,
dac L
1
, L
2
P, atunci L
1
L
2
P, etc.
36.2. Vericri n timp polinomial
Vom studia, n continuare, algoritmii care veric apartenena la diferite limbaje. De
exemplu, s presupunem c, pentru o instan dat 'G, u, v, k` a problemei de decizie Drum,
avem dat i un drum d de la u la v. Putem verica foarte uor dac lungimea lui d este cel mult
k i, dac este aa, putem privi d ca o prob a faptului c aceast instan aparine ntr-adevr
mulimii Drum. Pentru problema de decizie Drum aceast prob nu ne ajut prea mult. Pn
la urm, Drum aparine clasei P de fapt, Drum poate rezolvat n timp liniar aadar
vericarea apartenenei pentru d ia tot atta timp ct ar necesar pentru rezolvarea problemei
iniiale. Vom studia acum o problem pentru care nu se cunoate nc un algoritm polinomial
de claricare, dar pentru care, dndu-se o instan ca prob, vericarea este foarte uoar.
Cicluri hamiltoniene
Problema gsirii unui ciclu hamiltonian ntr-un graf neorientat a fost studiat nc de acum
o sut de ani. Un ciclu hamiltonian al unui graf neorientat G = (V, E) este un ciclu elementar
care conine ecare nod din V . Un graf care conine un ciclu hamiltonian este numit graf
hamiltonian; n caz contrar graful este numit nehamiltonian. Bondy i Murty [31] citeaz
o scrisoare a lui W. R. Hamilton n care este descris un joc matematic cu un dodecaedru
(gura 36.1(a)) n care un juctor xeaz cinci ace n oricare cinci vrfuri consecutive, i cellalt
trebuie s completeze drumul pentru a forma un ciclu ce conine toate vrfurile. Dodecaedrul
este hamiltonian, iar gura 36.1(a) arat un ciclu hamiltonian. Totui, nu toate grafurile sunt
hamitoniene. De exemplu, gura 36.1(b) arat un graf bipartit cu un numr impar de vrfuri.
(Exerciiul 36.2-2 cere s se demonstreze c toate grafurile de acest tip nu sunt hamiltoniene.)
Putem deni problema ciclului hamiltonian, Conine graful G un ciclu hamiltonian?
ca un limbaj formal:
Ciclu-Ham = 'G` : G este graf hamiltonian.
36.2. Vericri n timp polinomial 793
Figura 36.1 (a) Un graf reprezentnd vrfurile, laturile i feele unui dodecaedru, cu un ciclu
hamiltonian vizualizat prin laturi ngroate. (b) Un graf bipartit cu un numr impar de vrfuri. Orice
astfel de graf nu este hamiltonian.
Cum ar putea un algoritm s clarice limbajul Ciclu-Ham? Dndu-se o instan 'G` a
problemei, un posibil algoritm de claricare ar determina toate permutrile vrfurilor lui G
i apoi ar verica, pentru ecare permutare, dac este un ciclu hamiltonian. Care este timpul
de execuie pentru acest algoritm? Dac folosim o codicare rezonabil pentru graf, cum ar
matricea de adiacen, atunci numrul m al vrfurilor din graf este (

n), unde n = ['G`[ este


lungimea codicrii lui G. Exist m! permutri posibile ale vrfurilor, deci timpul de execuie
va (m!) = (

n!) = (2

n
) care nu este de forma O(n
k
), pentru k constant. Deci, acest
algoritm naiv nu se execut n timp polinomial i, de fapt, problema ciclului hamiltonian este o
problem NP-complet, dup cum se va dovedi n seciunea 36.5.
Algoritmi de vericare
S considerm o problem puin mai simpl. S presupunem c un prieten v spune c un graf
G este hamiltonian i se ofer s demonstreze acest lucru preciznd ordinea n care apar vrfurile
n ciclul hamiltonian. Cu siguran, vericarea demonstraiei va o sarcin destul de uoar:
se veric pur i simplu c ciclul furnizat este hamiltonian, vericnd dac acesta reprezint o
permutare a vrfurilor grafului i dac ecare din muchiile ciclului exist n graf. Acest algoritm
de vericare poate cu siguran implementat astfel nct s se execute ntr-un timp O(n
2
), unde
n este lungimea codicrii lui G. Deci, o demonstraie a faptului c exist un ciclu hamiltonian
ntr-un graf poate vericat n timp polinomial.
Denim un algoritm de vericare ca ind un algoritm A cu doi parametri, unul ind
intrarea obinuit reprezentat de un ir x, iar al doilea ind un alt ir binar y numit prob. Un
astfel de algoritm veric o intrare x dac exist o prob y astfel nct A(x, y) = 1. Limbajul
794 Capitolul 36 NP-completitudine
vericat de un algoritm de vericare A este
L = x 0, 1

: exist y 0, 1

astfel nct A(x, y) = 1.


Intuitiv un algoritm A veric un limbaj L dac pentru orice ir x L, exist o prob
y pe care A o poate folosi pentru a demonstra c x L. Mai mult, pentru orice ir x /
L, nu este permis existena unei probe care s dovedeasc faptul c x L. De exemplu, n
problema ciclului hamiltonian, proba este lista vrfurilor din ciclul hamiltonian. Dac un graf
este hamiltonian atunci ciclul hamiltonian nsui ofer destule informaii pentru ca acest fapt s
poat vericat. Invers, dac un graf nu este hamiltonian, nu exist nici o list de vrfuri care ar
putea s nele algoritmul de vericare fcndu-l s cread c un astfel de graf este hamiltonian,
deoarece algoritmul de vericare analizeaz cu atenie ciclul propus pentru a sigur c acesta
este hamiltonian.
Clasa de complexitate NP
Clasa de complexitate NP este clasa limbajelor care pot vericate de un algoritm n
timp polinomial.
4
Mai precis, un limbaj L aparine clasei NP, dac i numai dac exist un
algoritm polinomial A cu dou intrri i o constant c astfel nct
L = x 0, 1

: exist o prob y cu [y[ = O([x[


c
) astfel nct A(x, y) = 1.
Spunem c algoritmul A veric limbajul L n timp polinomial.
Din discuia anterioar privind ciclul hamiltonian rezult c Ciclu-Ham NP. (Este
ntotdeauna mbucurtor s tim c o mulime important nu este vid.) Mai mult, dac L
P, atunci L NP, deoarece, dac exist un algoritm polinomial care claric L, acest algoritm
poate foarte uor transformat ntr-unul cu doi parametri care ignor pur i simplu orice prob
i accept exact acele intrri pe care le determin ca aparinnd lui L. Avnd n vedere cele de
mai sus, putem trage concluzia c P NP.
Nu se tie dac P = NP, dar cei mai muli cercettori cred c P i NP nu reprezint aceeai
clas. Intuitiv, clasa P const din problemele care pot rezolvate rapid. Clasa NP const din
problemele a cror soluie poate vericat rapid. S-ar putea ca, din experien, s tii deja
c, de obicei, este mult mai greu s rezolvi o problem dect s verici dac o anumit soluie
dat este corect. Informaticienii cred, n general, c aceast analogie se extinde asupra claselor
P i NP i, ca urmare, NP include limbaje care nu apar n P.
Exist o alt prob atrgtoare care ne-ar face s credem c P = NP i anume existena
limbajelor NP-complete. Vom studia aceast clas n seciunea 36.3.
Multe alte ntrebri fundamentale pe lng P = NP rmn fr rspuns. n ciuda muncii
depuse de muli cercettori, nimeni nu tie dac clasa NP este nchis fa de operatorul
complement, respectiv, nu s-a rspuns nc la ntrebarea: L NP implic L NP? Putem
deni clasa de complexitate co-NP ca ind mulimea limbajelor L pentru care L NP.
ntrebarea dac NP este nchis fa de operatorul complement poate reformulat astfel: sunt
mulimile NP i co-NP identice? Deoarece clasa P este nchis fa de complement (exerciiul
36.1-7), rezult c P NP co-NP. nc o dat, nu se tie dac P = NP co-NP sau dac
exist anumite limbaje n mulimea NP co-NP P. Figura 36.2 arat cele 4 posibiliti.
Denumirea NP provine de la nedeterminist polinomial. Clasa NP a fost studiat, la nceput, n contextul
nedeterminismului, dar aceast carte folosete noiunea, ntr-un anume fel, mai simpl, de vericare. Hopcroft i
Ullman [104] prezint NP-completitudinea n termeni ai modelelor nedeterministe de calcul.
36.2. Vericri n timp polinomial 795
Figura 36.2 Patru posibile relaii ntre clasele de complexitate. n ecare diagram, o regiune care
include o alt regiune indic o relaie de incluziune. (a) P = NP = co-NP. Cei mai muli cercettori
privesc aceast posibilitate ca ind cea mai puin probabil. (b) Dac NP este nchis fa de complement
atunci NP = co-NP, dar aceasta nu nseamn c P = NP. (c) P = NP co-NP, dar NP nu este nchis
fa de complement. (d) NP ,= co-NP i P ,= NP co-NP. Cei mai muli cercettori privesc aceast
posibilitate ca ind cea mai probabil.
Deci, cunotinele noastre asupra relaiilor precise care exist ntre P i NP sunt lacunare.
Cu toate acestea, cercetnd teoria NP-completitudinii, vom aa c dezavantajul nostru n
a demonstra c o problem este inaccesibil este, din punct de vedere practic, mult mai
nesemnicativ dect am putea presupune.
Exerciii
36.2-1 S considerm limbajul Graf-Izo = 'G
1
, G
2
` : G
1
i G
2
sunt grafuri izomorfe}.
Demonstrai c Graf-Izo NP, descriind un algoritm polinomial pentru vericarea limbajului.
36.2-2 Demonstrai c, dac G este un graf bipartit neorientat cu numr impar de vrfuri, G
nu este hamiltonian.
36.2-3 Demonstrai c, dac Ciclu-Ham P, atunci problema tipririi n ordine a vrfurilor
unui ciclu hamiltonian este rezolvabil n timp polinomial.
36.2-4 Demonstrai armaia: clasa NP a limbajelor este nchis fa de reuniune, intersecie,
concatenare i steaua lui Kleene. Discutai nchiderea clasei NP fa de complement.
36.2-5 Demonstrai c, orice limbaj din NP poate claricat de un algoritm care se va executa
ntr-un timp 2
O(n
k
)
, unde k este o constant.
36.2-6 Un drum hamiltonian ntr-un graf este un drum elementar care viziteaz ecare vrf
exact o dat. Demonstrai c limbajul Drum-Ham = {'G, u, v` : exist un drum hamiltonian
de la u la v n graful G} aparine clasei NP.
36.2-7 Artai c problema drumului hamiltonian poate rezolvat n timp polinomial pentru
grafuri orientate aciclice. Dai un algoritm ecient pentru aceast problem.
796 Capitolul 36 NP-completitudine
36.2-8 Fie o formul logic construit cu ajutorul variabilelor logice de intrare x
1
, x
2
, . . . , x
k
,
operatori de negaie (), I-logic (), SAU-logic () i paranteze. Formula este o tautologie
dac ia valoarea 1 pentru orice atribuire de 1 i 0 dat variabilelor de intrare. Denii
Tautologie ca limbajul expresiilor logice care sunt tautologii. Artai c tautologie co-NP.
36.2-9 Artai c P co-NP.
36.2-10 Artai c dac NP = co-NP atunci P = NP.
36.2-11 Fie G un graf neorientat conex cu cel puin trei vrfuri i e G
3
graful obinut prin
unirea tuturor perechilor de vrfuri care sunt unite printr-un drum de lungime cel mult 3.
Demonstrai c graful G
3
este hamiltonian. ( construii un arbore parial pentru G
i demonstrai prin inducie.)
36.3. NP-completitudine i reductibilitate
Poate c cel mai atrgtor motiv, pentru care informaticienii cred c P = NP, este existena
clasei problemelor NP-complete. Aceast clas are proprietatea surprinztoare c dac o
problem NP-complet poate rezolvat n timp polinomial, atunci, pentru problemele NP-
complete se va putea gsi un algoritm de rezolvare polinomial, adic P = NP. n ciuda anilor
de studiu nu s-a descoperit nici un algoritm polinomial pentru rezolvarea vreunei probleme NP-
complete.
Limbajul Ciclu-Ham este o problem NP-complet. Dac am putea clarica Ciclu-Ham n
timp polinomial, am putea rezolva orice problem din NP n timp polinomial. De fapt, dac s-ar
dovedi c mulimea NP P ar nevid, atunci, am putea arma cu certitudine c Ciclu-Ham
NP P.
Limbajele NP-complete sunt, ntr-un anume sens, cele mai dicile limbaje din NP. n aceast
seciune, vom arta cum putem compara dicultatea relativ a limbajelor folosind o noiune
numit reductibilitate n timp polinomial. Mai nti vom deni limbajele NP-complete, apoi
vom demostra c un astfel de limbaj, numit Circuit-Sat este o problem NP-complet. n
seciunea 36.5 vom folosi noiunea de reductibilitate pentru a arta NP-completitudinea altor
probleme.
Reductibilitate
Intuitiv, o problem Q poate redus la alt problem Q
t
, dac orice instan a lui Q poate
uor reformulat ca o instan a problemei Q
t
, iar gsirea unei soluii pentru Q
t
va nsemna
gsirea unei soluii pentru Q. De exemplu, problema rezolvrii ecuaiilor liniare cu o necunoscut
x poate redus la problema rezolvrii ecuaiilor ptratice cu o necunoscut. Dndu-se o instan
ax+b = 0, o transformm n 0x
2
+ax+b = 0, a crei soluie va de asemenea soluie i pentru
ax +b = 0. Deci, dac o problem Q se reduce la o alt problem Q
t
, atunci Q nu este, ntr-un
anume sens, mai greu de rezolvat dect Q
t
.
Revenind la limbajele formale pentru probleme de decizie, spunem c un limbaj L
1
este
reductibil n timp polinomial la un limbaj L
2
dac exist o funcie calculabil n timp
polinomial f : 0, 1

0, 1

astfel nct pentru orice x 0, 1

,
x L
1
dac i numai dac f(x) L
2
. (36.1)
36.3. NP-completitudine i reductibilitate 797
Figura 36.3 Ilustrarea reducerii n timp polinomial a unui limbaj L
1
la un limbaj L
2
prin intermediul
funciei de reducere f. Pentru o intrare x 0, 1

, ntrebarea dac x L
1
are acelai rspuns ca i
ntrebarea dac f(x) L
2
.
Figura 36.4 Demonstraia lemei 36.3. Algoritmul F este un algoritm de reducere care calculeaz funcia
de reducere f de la L
1
la L
2
n timp polinomial i A
2
este un algoritm polinomial care claric L
2
. Este
ilustrat un algoritm A
1
care decide dac x L
1
folosind F pentru a transforma ecare intrare x n f(x)
i folosind apoi A
2
pentru a decide dac f(x) L
2
.
Vom folosi notaia L
1

P
L
2
pentru a arta c limbajul L
1
este reductibil n timp polinomial
la limbajul L
2
. Funcia f se numete funcie de reducere i algoritmul polinomial F care
calculeaz f se numete algoritm de reducere.
n gura 36.3 este ilustrat ideea unei reduceri n timp polinomial de la un limbaj L
1
la un
limbaj L
2
. Fiecare limbaj este o submulime a mulimii 0, 1

. Funcia de reducere f furnizeaz,


n timp polinomial, o coresponden ntre x i f(x) astfel nct x L
1
i f(x) L
2
. Mai mult
dac x / L
1
atunci f(x) / L
2
. Deci funcia de reducere realizeaz o coresponden ntre orice
instan x a problemei de decizie reprezentat de limbajul L
1
i o instan f(x) a problemei
reprezentate de L
2
. Obinnd un rspuns pentru ntrebarea f(x) L
2
avem rspuns i pentru
ntrebarea x L
1
.
Reducerile n timp polinomial ne ofer o unealt puternic pentru a demonstra c diferite
limbaje fac parte din P.
Lema 36.3 Dac L
1
, L
2
0, 1

sunt limbaje astfel nct L


1

P
L
2
, atunci, L
2
P implic
L
1
P.
Demonstraie. Fie A
2
un algoritm polinomial care claric L
2
i F un algoritm polinomial
de reducere care calculeaz funcia de reducere f. Vom construi un algoritm polinomial A
1
care
claric L
1
.
n gura 36.4 este ilustrat modul n care este construit A
1
. Pentru o intrare dat x 0, 1

,
798 Capitolul 36 NP-completitudine
Figura 36.5 Modul n care sunt privite, de majoritatea informaticienilor, relaiile dintre P, NP i NPC.
Att P ct i NPC sunt incluse n NP i P NPC = .
algoritmul A
1
folosete F pentru a transforma x n f(x) i apoi folosete A
2
pentru a testa dac
f(x) L
2
. Intrarea lui A
2
este valoarea furnizat ca ieire de A
1
.
Corectitudinea lui A
1
rezult din condiia (36.1). Algoritmul se execut n timp polinomial
deoarece att F ct i A
2
se execut n timp polinomial (vezi exerciiul 36.1-6).
NP-completitudine
Reducerile n timp polinomial furnizeaz o modalitate pentru a arta c o problem este
cel puin la fel de dicil ca alta, aprnd, n plus sau n minus, cel mult un factor polinomial.
Aceasta nseamn c dac L
1

P
L
2
atunci L
1
este cu cel mult un factor polinomial mai dicil
dect L
2
. De aici deriv i semnul de mai mic sau egal din notaia pentru reducere. Putem
deni acum mulimea limbajelor NP-complete, mulime care conine cele mai dicile probleme
din NP.
Un limbaj L 0, 1

este NP-complet dac


1. L NP, i
2. L
t

P
L, oricare ar L
t
NP.
Dac un limbaj L satisface proprietatea 2, dar nu neaprat i propritatea 1, atunci spunem c
acest limbaj este NP-dicil. Denim, de asemenea, clasa NPC ca ind clasa limbajelor NP-
complete.
Dup cum arat teorema urmtoare, NP-completitudinea este un element cheie n a decide
c P este, de fapt, egal cu NP.
Teorema 36.4 Dac orice problem NP-complet este rezolvabil n timp polinomial, atunci
P = NP. De asemenea, dac orice problem din NP nu este rezolvabil n timp polinomial,
problemele NP-complete nu sunt rezolvabile n timp polinomial.
Demonstraie. S presupunem c L P i L NPC. Din proprietatea 2, care apare n deniia
NP-completitudinii rezult c pentru orice L
t
NP, avem L
t

P
L. Deci, conform lemei 36.3,
rezult c L
t
P, ceea ce demonstreaz prima parte a teoremei.
Pentru a demonstra a doua parte a teoremei, observai c este reciproca primei pri.
Din aceast cauz, cercetarea problemei P = NP se axeaz n jurul problemelor NP-complete.
Cei mai muli informaticieni cred c P = NP, ceea ce ar duce la relaiile dintre P, NP i NPC
ilustrate n gura 36.5. Dar, din cte tim, cineva ar putea gsi un algoritm polinomial pentru o
problem NP-complet demonstrnd astfel c P = NP. Cu toate acestea, datorit faptului c nu
36.3. NP-completitudine i reductibilitate 799
Figura 36.6 Dou instane ale problemei satisabilitii circuitului. (a) Valorile 'x
1
= 1, x
2
= 1, x
3
=
0) pentru intrrile circuitului determin ieirea 1, deci circuitul este satisabil. (b) Indiferent de valorile
pe care le iau intrrile circuitului, ieirea va ntotdeauna 1, deci circuitul nu este satisabil.
s-a gsit nc nici un algoritm polinomial pentru vreo problem NP-complet, o demonstraie a
faptului c o problem este NP-complet este acceptat ca o dovad excelent a inaccesibilitii
acestei probleme.
Satisabilitatea circuitului
Am denit noiunea de problem NP-complet, dar, pn acum, nu am demonstrat c o
anumit problem este NP-complet. Dup ce vom dovedi c cel puin o problem este NP-
complet, vom putea folosi reductibilitatea polinomial pentru a dovedi NP-completitudinea
altor probleme. Ne vom concentra acum atenia asupra demonstrrii existenei unei probleme
NP-complete: problema satisabilitii circuitului.
Din nefericire, demonstraia riguroas a faptului c problema satisabilitii circuitului este
NP-complet necesit detalii tehnice care depesc scopul lucrrii de fa. n locul unei astfel de
demonstraii, v vom prezenta o demonstraie care se bazeaz pe noiuni fundamentale despre
circuitele combinaionale logice. Acest material este recapitulat la nceputul capitolului 29.
Figura 36.6 prezint dou circuite combinaionale logice, ecare avnd trei intrri i o singur
ieire. O atribuire de adevr a unui circuit este o mulime de valori logice de intrare. Spunem
c un circuit cu o singur ieire este satisabil dac are o atribuire satisabil: o atribuire de
adevr care determin ieirea 1. De exemplu, circuitul din gura 36.6(a) are atribuirea satisabil
800 Capitolul 36 NP-completitudine
'x
1
= 1, x
2
= 1, x
3
= 0`, deci este satisabil. Nici o atribuire pentru valorile x
1
, x
2
i x
3
nu poate
determina ieirea 1, aceasta ind ntotdeauna 0, deci circuitul nu este satisabil.
Problema satisabilitii circuitului poate enunat astfel: Dndu-se un circuit
combinaional logic compus din pori I, SAU i NU, este el satisabil? Pentru a putea formula
aceast ntrebare, trebuie s cdem de acord asupra unei codicri standard pentru circuite.
Putem accepta o codicare de tipul grafurilor care stabilete o coresponden ntre un circuit
C i un ir binar 'C` a crui lungime nu este mult mai mare dect mrimea circuitului. Putem
deni limbajul formal:
Circuit-Sat = 'C` : Ceste un circuit combinaional logic care este satisabil}.
Problema satisabilitii circuitului are o mare importan n domeniul optimizrilor
hardware asistate de calculator. Dac ieirea circuitului este ntotdeauna 0, acesta poate
nlocuit cu un circuit simplu n care sunt eliminate toate porile logice i are ca ieire valoarea
constant 0. Un algoritm polinomial pentru aceast problem ar avea o deosebit aplicabilitate
practic.
Dndu-se un circuit C, am putea testa dac acesta este satisabil ncercnd toate posibilitile
pentru intrri. Din nefericire, pentru k intrri am avea 2
k
combinaii posibile. Dac mrimea
circuitului este dat de o funcie polinomial care depinde de k, vericarea tuturor posibilitilor
duce la un algoritm suprapolinomial. De fapt, aa cum am armat anterior, exist o demonstraie
riguroas a faptului c nu exist nici un algoritm polinomial care rezolv problema satisabilitii
circuitului deoarece aceast problem este NP-complet. Vom mpri demonstraia acestui fapt
n dou pri, bazate pe cele dou pri ale deniiei NP-completitudinii.
Lema 36.5 Problema satisabilitii circuitului aparine clasei NP.
Demonstraie. Vom descrie un algoritm polinomial A cu dou intrri care veric Circuit-
Sat. Una din intrrile pentru A este reprezentat de o codicare standard a unui circuit
combinaional logic C. Cealalt intrare este o prob corespunztoare unei atribuiri de valori
logice pentru rele din C.
Algoritmul A este construit dup cum urmeaz. Pentru ecare poart logic a circuitului,
veric dac valoarea furnizat de prob la rul de ieire este corect calculat ca o funcie de
valorile de la rele de intrare. Atunci, dac ieirea ntregului circuit este 1, algoritmul va avea ca
ieire valoarea 1 deoarece valorile atribuite intrrilor lui C furnizeaz o atribuire satisabili. n
caz contrar, programul va avea ca ieire valoarea 0.
De ecare dat, cnd un circuit satisabil C este intrare pentru algoritmul A, exist o prob
a crei lungime este o funcie polinomial care depinde de mrimea lui C i care determin
algoritmul A s furnizeze ieirea 1. De ecare dat, cnd un circuit care nu este satisabil este
intrare pentru algoritmul A, nici o prob nu va putea pcli algoritmul A. Acest algoritm se
execut n timp polinomial: dac este bine implementat, este sucient un timp liniar de execuie.
Deci, Circuit-Sat poate vericat n timp polinomial, ca urmare Circuit-Sat NP.
Pentru a doua parte a demonstraiei faptului c limbajul Circuit-Sat este NP-complet,
trebuie s artm c acest limbaj este NP-dicil. Aceasta nseamn c va trebui s artm c
orice limbaj din NP este reductibil n timp polinomial la Circuit-Sat. Demonstraia riguroas
a acestui fapt conine multe complicaii tehnice, de aceea nu o vom reproduce aici. Vom schia,
totui, o demonstraie bazat pe cunoaterea unor detalii ale modului n care funcioneaz partea
hardware a calculatorului.
36.3. NP-completitudine i reductibilitate 801
Un program este stocat n memoria calculatorului ca o secven de instruciuni. O instruciune
obinuit va codica o operaie care trebuie executat, adresele operanzilor din memorie i adresa
la care trebuie stocat rezultatul. O locaie special de memorie, numit registru instruciune
program, pstreaz adresa instruciunii care trebuie executat la pasul urmtor. Valoarea
acestui registru este incrementat automat ori de cte ori se ncheie execuia unei instruciuni,
ceea ce duce la o execuie secvenial a instruciunilor. Execuia unei instruciuni poate duce
la scrierea unei anumite valori n acest registru, astfel c execuia instruciunilor nu va mai
secvenial, permind calculatorului s execute cicluri sau instruciuni de tipul alternative.
n orice moment al execuiei programului, starea tuturor factorilor care inueneaz calculele
este pstrat n memoria calculatorului. (Considerm c memoria include programul, registrul
instruciune program, memoria de lucru i diferii bii de stare pe care i pstreaz calculatorul
pentru contabilizare.) Numim conguraie o anumit stare a memoriei calculatorului. Execuia
unei instruciuni poate vzut ca o funcie ntre dou conguraii. Important este faptul c
partea hardware a calculatorului care realizeaz aceast coresponden poate implementat ca
un circuit combinaional logic pe care l vom nota cu M n demonstraia lemei urmtoare.
Lema 36.6 Problema satisabilitii circuitului este NP-dicil.
Demonstraie. Fie L un limbaj din NP. Vom descrie un algoritm polinomial F pentru calculul
funciei f de reducere care realizeaz o coresponden ntre un ir binar x i un circuit C = f(x),
astfel nct x L dac, i numai dac, C Circuit-Sat.
Cum L NP, trebuie s existe un algoritm A care veric L n timp polinomial. Algoritmul
F pe care l vom construi va folosi algoritmul cu dou intrri A pentru a calcula funcia de
reducere f.
Notm cu T(n) timpul de rulare a algoritmului A n cazul cel mai defavorabil cnd acesta
se execut cu iruri de intrare de lungime n. Fie k 1 o constant astfel nct T(n) = O(n
k
)
i lungimea probei este O(n
k
). (Timpul de execuie al algoritmului A depinde dup o funcie
polinomial de lungimea total a intrrii, ce conine att irul de intrare ct i proba. Deoarece
lungimea probei depinde dup o funcie polinomial de lungimea n a irului de intrare, timpul
de execuie va o funcie polinomial n n.)
Ideea de baz a demonstraiei este s reprezentm calculele efectuate de A ca o serie de
conguraii. Dup cum se arat n gura 36.7, ecare conguraie poate mprit n mai
multe pri: programul care implementeaz algoritmul A, registrul instruciune program i starea
mainii, intrarea x, proba y i memoria de lucru. Pornind de la o conguraie iniial c
0
, ecare
conguraie c
i
este pus n coresponden cu conguraia urmtoare c
i+1
de ctre circuitul
combinaional M care implementeaz partea hardware a calculatorului. Ieirea algoritmului
A 0 sau 1 este scris, la ncheierea execuiei programului care l implementeaz, ntr-o
locaie a spaiului de lucru special aleas n acest scop. Dac presupunem c programul care
implementeaz A se oprete, atunci aceast valoare nu va mai modicat. Deci algoritmul va
avea cel mult T(n) pai, i ieirea va unul dintre biii din c
T(n)
.
Algoritmul de reducere F construiete un singur circuit combinaional care calculeaz toate
conguraiile rezultate din conguraia iniial. Ideea este de a uni T(n) copii ale circuitului
M. Ieirea celui de-al i-lea circuit, care determin conguraia c
i
este conectat la intrarea celui
de-al i+1-lea circuit. Deci, conguraiile, n loc s e pstrate n regitrii de stare, vor consta n
valori pe rele copiilor conectate ale lui M.
S ne amintim ce trebuie s realizeze algoritmul polinomial de reducere F. Dndu-se o intrare
x, el trebuie s calculeze un circuit C = f(x) care este satisabil dac, i numai dac, exist o
802 Capitolul 36 NP-completitudine
Figura 36.7 Seria conguraiilor determinate de algoritmul A care se execut pentru o intrare x i o
prob y. Fiecare conguraie reprezint starea calculatorului pentru un anumit pas i include, pe lng
A, x i y, registrul instruciune program, starea mainii i memoria de lucru. Cu excepia probei y,
conguraia iniial c
0
este constant. Fiecare conguraie este pus n coresponden ca urmtoarea
printr-un circuit combinaional logic M. Ieirea este un anumit bit din memoria de lucru.
prob y, astfel nct A(x, y) = 1. Cnd F obine o intrare x, el calculeaz mai nti n = [x[ i
construiete un circuit combinaional C
t
care const din T(n) copii ale lui M. Intrarea lui C
t
este o conguraie iniial corespunztoare unui calcul pe A(x, y), iar ieirea este conguraia
c
T(n)
.
Circuitul C = f(x) pe care l calculeaz F este obinut fcnd o mic modicare la circuitul
C
t
. Mai nti, intrrile pentru C
t
corespunztoare programului care implementeaz A, valoarea
36.3. NP-completitudine i reductibilitate 803
iniial a registrului instruciune program, intrarea x i starea iniial a memoriei sunt puse
n legtur cu aceste valori cunoscute. Deci, singurele intrri rmase ale circuitului sunt cele
corespunztoare probei y. Apoi toate ieirile circuitului sunt ignorate cu excepia singurului bit
din c
T(n)
care corespunde ieirii lui A. Circuitul C, construit n acest mod, calculeaz C(y) =
A(x, y) pentru orice intrare y de lungime O(n
k
). Algoritmul de reducere F rezolv un astfel de
circuit C cnd primete la intrare irul x.
Mai rmn de demonstrat dou proprieti. n primul rnd trebuie s artm c F calculeaz
n mod corect o funcie de reducere f, respectiv trebuie s artm c C este satisabil dac, i
numai dac, exist o prob y astfel nct A(x, y) = 1. n al doilea rnd, trebuie demonstrat i
faptul c F se execut n timp polinomial.
Pentru a arta c F calculeaz n mod corect o funcie de reducere, s presupunem c exist
o prob y de lungime O(n
k
) astfel nct A(x, y) = 1. Atunci, dac furnizm biii lui y ca intrri
pentru C, ieirea lui C va C(y) = A(x, y) = 1. Deci, dac exist o prob, C este satisabil.
Acum, s presupunem c C este satisabil. Ca urmare exist o intrare y pentru C astfel nct,
C(y) = 1. De aici tragem concluzia c A(x, y) = 1, deci F calculeaz corect o funcie de reducere.
Pentru a ncheia demonstraia, mai trebuie, doar, s artm c F se execut n timp
polinomial pentru n = [x[. Prima observaie pe care o facem este c numrul de bii necesari
pentru a reprezenta o conguraie depinde dup o funcie polinomial de n. Programul care
implementeaz A are o mrime constant, independent de lungimea intrrii x. Lungimea intrrii
x este n, iar lungimea probei y este O(n
k
). Deoarece algoritmul va avea cel mult O(n
k
) pai,
spaiul necesar pentru memorarea lui A depinde, de asemenea, dup o funcie polinomial de
n. (Presupunem c memoria este contigu; exerciiul 36.3-4 v cere s extindei demonstraia
pentru cazul n care locaiile accesate de A sunt rspndite pe o zon mai mare de memorie i
ablonul rspndirii poate s difere pentru ecare intrare x.)
Circuitul combinaional M care implementeaz partea hardware a calculatorului are di-
mensiunea dependent dup o funcie polinomial de lungimea unei conguraii, lungime care
este polinomial n O(n
k
), deci este polinomial n n. (Cea mai mare parte a acestei scheme
implementeaz partea logic a memoriei sistem.) Circuitul C const n cel mult t = O(n
k
) copii
ale lui M, deci dimensiunea lui depinde de o funcie polinomial n n. Construirea lui C din
x poate realizat n timp polinomial de ctre algoritmul de reducere F, deoarece ecare pas
necesit un timp polinomial.
n concluzie, limbajul Circuit-Sat este cel puin la fel de dicil ca orice alt limbaj din NP
i, datorit faptului c aparine clasei NP, este NP-complet.
Teorema 36.7 Problema satisabilitii circuitului este NP-complet.
Demonstraie. Rezult imediat din lemele 36.5 i 36.6 i deniia NP-completitudinii.
Exerciii
36.3-1 Artai c relaia
P
este o relaie tranzitiv ntre limbaje, respectiv dac L
1

P
L
2
i
L
2

P
L
3
atunci L
1

P
L
3
.
36.3-2 Artai c L
P
L dac, i numai dac, L
P
L.
36.3-3 Artai c o atribuire satisabil poate folosit ca prob ntr-o demonstraie alternativ
a lemei 36.5. Care prob credei c uureaz demonstraia?
804 Capitolul 36 NP-completitudine
36.3-4 n demonstraia lemei 36.6 s-a presupus c memoria de lucru pentru algoritmul A este o
zon contigu de memorie cu o dimensiune polinomial. Unde este folosit aceast presupunere
n demonstraie? Demonstrai c aceast presupunere nu implic restrngerea generalitii.
36.3-5 Un limbaj L este complet pentru o clas de limbaje C cu privire la reducerile n timp
polinomial dac L C i L
t

P
L, oricare ar L
t
C. Artai c i 0, 1

sunt singurele
limbaje din P care nu sunt complete pentru P cu privire la reducerile n timp polinomial.
36.3-6 Artai c L este complet pentru NP dac i numai dac L este complet pentru co-NP.
36.3-7 Algoritmul de reducere F folosit n demonstraia lemei 36.6, construiete circuitul C =
f(x) bazat pe cunoaterea lui x, A i k. Profesorul Sartre a observat c irul x este intrare
pentru F, dar numai existena lui A i k este cunoscut de F (deoarece limbajul L aparine
clasei NP), nu i valorile lor. Profesorul a concluzionat c F nu poate construi circuitul C i c
limbajul Circuit-Sat nu este neaprat NP-dicil. Gsii i explicai greeala din raionamentul
profesorului.
36.4. Demonstraii ale NP-completitudinii
NP-completitudinea problemei satisabilitii circuitului se bazeaz pe dovada direct c
L
P
Circuit-Sat pentru toate limbajele L NP. n aceast seciune, vom arta cum se poate
demonstra c un limbaj este NP-complet fr a reduce, n mod direct, limbaj din NP
la acel limbaj. Vom ilustra aceast metodologie demonstrnd NP-completitudinea mai multor
probleme de satisabilitate a unei anumite formule. n seciunea 36.5 sunt prezentate mai multe
exemple ale acestei metodologii.
Urmtoarea lem reprezint baza de la care pornete metoda noastr de a demonstra c un
anumit limbaj este NP-complet.
Lema 36.8 Dac L este un limbaj astfel nct L
t

P
L pentru L
t
NPC, atunci L este NP-
dicil. Mai mult, dac L NP, atunci, L NPC.
Demonstraie. Deoarece L
t
este NP-complet, pentru toate limbajele L
tt
NP avem L
tt

P
L
t
.
Din ipoteza L
t

P
L i datorit proprietii de tranzitivitate a relaiei
P
(exerciiul 36.3-1)
obinem c L
tt

P
L
t
, ceea ce arat c L este NP-dicil. Dac L NP, avem, de asemenea, L
NPC.
Cu alte cuvinte, reducnd la L un limbaj NP-complet L
t
, reducem la L, n mod implicit,
orice limbaj din NP. Deci, lema 36.8 ne ofer o metod de a demonstra c un limbaj L este
NP-complet:
1. Demonstrai c L NP.
2. Alegei un limbaj L
t
despre care tii c este NP-complet
3. Descriei un algoritm care calculeaz o funcie f care pune n coresponden ecare instan
a lui L
t
cu o instan a lui L.
36.4. Demonstraii ale NP-completitudinii 805
4. Demonstrai c funcia f satisface condiia x L
t
dac, i numai dac, f(x) L pentru
toi x 0, 1

.
5. Demonstrai c algoritmul care calculeaz f se execut n timp polinomial.
Aceast metodologie care folosete reducerea unui singur limbaj NP-complet este mult mai
uor de folosit dect procedura complicat de a reduce toate limbajele din NP. Demonstrnd
c Circuit-Sat NPC am pus un picior n pragul uii pentru c, tiind c problema
satisabilitii circuitului este NP-complet, putem demonstra, mult mai uor, c alte probleme
sunt NP-complete. Mai mult, cu ct vom gsi mai multe probleme NP-complete, folosirea acestei
metodologii va deveni mult mai uoar.
Satisabilitatea formulelor
Ilustrm metodologia reducerii dnd o demonstraie a NP-completitudinii problemei care
veric dac o formul logic, nu un circuit, este satisabil. Aceast problem are onoarea
istoric de a prima problem pentru care a existat o demonstraie a NP-completitudinii.
Formulm problema satisabilitii (formulei) n termenii limbajului Sat astfel: instan
Sat este o formul boolean compus din:
1. variabile logice: x
1
, x
2
, . . .;
2. legturi logice: orice funcie boolean cu una sau dou intrri i o singur ieire cum ar
(I), (SAU), (NU), (implicaie), (dac i numai dac);
3. paranteze.
Asemntor circuitelor combinaionale, o atribuire de adevr, pentru o formul boolean ,
este o mulime de valori pentru variabilele lui , iar o atribuire satisabil este o atribuire
de adevr pentru care evaluarea expresiei duce la rezultatul 1. O formul care are o atribuire
satisabil este o formul satisabil. Problema satisabilitii cere determinarea faptului dac
o anumit formul este sau nu satisabil; n termenii limbajelor formale:
Sat = {'` : este o formul logic satisabil}.
De exemplu formula
= ((x
1
x
2
) ((x
1
x
3
) x
4
)) x
2
are atribuirea satisabil 'x
1
= 0, x
2
= 0, x
3
= 1, x
4
= 1`, deoarece
= ((0 0) ((0 1) 1)) 0 = (1 (1 1)) 1 = (1 0) 1 = 1, (36.2)
deci formula aparine lui Sat.
Algoritmul naiv de determinare a faptului dac o formuleste sau nu satisabil nu se execut
n timp polinomial. Pot exista 2
n
atribuiri de adevr posibile pentru o furmul cu n variabile.
Dac lungimea lui '` este polinomial n n, atunci vericarea ecrei atribuiri de adevr necesit
un timp suprapolinomial. Dup cum arat i teorema urmtoare este puin probabil s existe
un algoritm polinomial.
Teorema 36.9 Problema satisabilitii formulei logice este NP-complet.
806 Capitolul 36 NP-completitudine
Figura 36.8 Reducerea problemei satisabilitii circuitului la problema satisabilitii formulei.
Formula rezultat n urma algoritmului de reducere are cte o variabil pentru ecare r din circuit.
Demonstraie. Vom demonstra, mai nti, c Sat NP i apoi, vom arta c Circuit-Sat
P
Sat; potrivit lemei 36.8, aceste dou demonstraii sunt suciente pentru a demonstra teorema.
Pentru a demonstra c Sat NP, artm c o prob, care const ntr-o atribuire satisabil
pentru o formul dat la intrare, poate vericat n timp polinomial. Algoritmul de vericare
va nlocui ecare variabil din formul cu valoarea corespunztoare i va evalua expresia ntr-o
manier asemntoare celei folosite pentru evaluarea expresiei (36.2). Aceast sarcin poate
ndeplinit foarte uor n timp polinomial. Dac valoarea rezultat n urma evalurii va 1
atunci formula este satisabil. Deci, prima condiie din lema 36.8 este ndeplinit.
Pentru a demonstra c Sat este NP-dicil, artm c Circuit-Sat
P
Sat. Cu alte
cuvinte, orice instan a problemei satisabilitii circuitului poate redus n timp polinomial
la o instan a problemei satisabilitii formulei. Prin inducie, putem arta c orice circuit
combinaional logic poate exprimat ca o formul logic. Vom lua n considerare poarta a
crei ieire reprezint i ieirea circuitului i apoi, prin inducie, exprimm intrrile porii ca
formule. Formula circuitului este obinut scriind o expresie care aplic funcia porii la formulele
intrrilor.
Din nefericire, aceast metod direct nu constituie o reducere n timp polinomial, subfor-
mulele distribuite ar putea duce la creterea exponenial a formulei generate (vezi exerciiul
36.4-1). Deci, algoritmul de reducere trebuie s e, ntr-un anume fel, mai performant.
Figura 36.8 ilustreaz ideea de baz a reducerii de la Circuit-Sat la Sat pentru circuitul
din gura 36.6(a). Pentru ecare r x
i
al circuitului C, formula are o variabil x
i
. Operaia
unei pori poate acum exprimat ca o formul care implic variabilele relor incidente. De
exemplu, operaia porii de ieire I este x
10
(x
7
x
8
x
9
).
Formula , rezultat n urma algoritmului de reducere, este un I ntre variabila de ieire
a circuitului i conjucia propoziiilor care descriu operaiile ecrei pori. Pentru circuitul din
gur, formula este:
= x
10
(x
4
x
3
) (x
5
(x
1
x
2
)) (x
6
x
4
) (x
7
(x
1
x
2
x
4
))
(x
8
(x
5
x
6
)) (x
9
(x
6
x
7
)) (x
10
(x
7
x
8
x
9
)).
Dndu-se un circuit C, este uor s obinem o astfel de formul n timp polinomial.
De ce este circuitul C satisabil cnd formula este satisabil? Dac C are o atribuire
satisabil, atunci ecare r al circuitului are o valoare bine denit i ieirea circuitului este
1. De aceea, atribuirea valorilor relor pentru variabilele din duce la evaluarea la 1 a ecrei
propoziii din , deci conjuncia tuturor va evaluat la 1. Analog, dac exist o atribuire de
36.4. Demonstraii ale NP-completitudinii 807
adevr care duce la evaluarea la 1 a expresiei, circuitul C este satisabil. Am artat, deci, c
Circuit-Sat
P
Sat, ceea ce ncheie demonstraia.
Problema satisabilitii 3-FNC
NP-completitudinea multor probleme poate demonstrat prin reducerea problemei satis-
abilitii formulei logice la aceste probleme. Algoritmul de reducere trebuie s manipuleze orice
formul dat la intrare, cu toate c aceasta ar putea duce la un numr uria de cazuri care
trebuie luate n considerare. De aceea, adesea este de dorit s facem o reducere de la un limbaj
restrns pentru formulele logice, pentru ca numrul cazurilor care trebuie luate n considerare s
scad. Bineneles, nu avem voie s restrngem limbajul att de mult, nct s devin rezolvabil
n timp polinomial. Un limbaj convenabil este satisabilitatea 3-FNC, pe care l vom nota cu
3-Fnc-Sat.
Denim problema satisabilitii 3-FNC folosind urmtorii termeni: un literal ntr-o formul
logic este o apariie a unei variabile sau a negaiei acesteia; o formul logic se a n form
normal-conjuctiv, sau FNC, dac este exprimat ca ind conjuncia mai multor propoziii,
ecare propoziie ind format din disjuncia mai multor literali. O formul logic se a n
a treia form normal-conjuctiv, sau 3-FNC, dac ecare propoziie conine exact trei
literali distinci.
De exemplu, formula logic
(x
1
x
1
x
2
) (x
3
x
2
x
4
) (x
1
x
3
x
4
)
este n a treia form normal-conjuctiv. Prima din cele trei propoziii este (x
1
x
1
x
2
) i
conine trei literali: x
1
, x
1
i x
2
.
n 3-Fnc-Sat ni se cere s determinm dac o formul logic n 3-FNC este satisabil.
Urmtoarea teorem arat c este puin probabil s existe un algoritm polinomial care veric
dac o formul logic este satisabil, chiar dac este exprimat n aceast form simpl.
Teorema 36.10 Problema satisabilitii formulelor logice n a treia form normal-conjunctiv
este NP-complet.
Demonstraie. Argumentele pe care le-am folosit n demonstrarea teoremei 36.9, pentru a arta
c Sat NP, pot folosite i pentru a demonstra c 3-Fnc-Sat NP. Deci mai trebuie s
artm numai c 3-Fnc-Sat este NP-dicil. Vom demonstra acest fapt artnd c Sat
P
3-Fnc-Sat i, de aici, va rezulta, conform lemei 36.8, c 3-Fnc-Sat este NP-complet.
Algoritmul de reducere poate divizat n trei pai elementari. La ecare pas vom scrie formula
ntr-o form tot mai apropiat de 3-FNC.
Primul pas este similar cu demonstraia faptului c Circuit-Sat
P
Sat, din teorema
36.9. Mai nti, construim un arbore gramatical pentru formula , avnd literalii ca frunze i
legturile ca noduri interne. Figura 36.9 arat un astfel de arbore gramatical pentru formula
= ((x
1
x
2
) ((x
1
x
3
) x
4
)) x
2
. (36.3)
n cazul n care formula conine o propoziie de tip SAU ntre mai muli literali, proprietatea
de asociativitate poate folosit pentru a paranteza toat expresia n aa fel nct ecare nod
intern al arborelui rezultat s aib unul sau doi i. Arborele gramatical binar poate acum
privit ca un circuit pentru calculul formulei logice.
808 Capitolul 36 NP-completitudine
Figura 36.9 Arborele corespunztor formulei = ((x
1
x
2
) ((x
1
x
3
) x
4
)) x
2
.
Imitnd reducerea din demonstraia teoremei 36.9, introducem o variabil y
i
pentru ieirea
ecrui nod intern. Apoi, rescriem formula iniial ca un I ntre variabila din rdcin i o
conjucie a propoziiilor care descriu operaiile din ecare nod. Pentru formula (36.3) expresia
rezultat este:

t
= y
1
(y
1
(y
2
x
2
)) (y
2
(y
3
y
4
)) (y
3
(x
1
x
2
))
(y
4
y
5
) (y
5
(y
6
x
4
)) (y
6
(x
1
x
3
)).
Se observ c formula
t
obinut este o conjucie de propoziii
t
i
n form normal-conjuctiv,
ecare propoziie avnd cel mult trei literali. Singura condiie care mai trebuie pus este ca
ecare propoziie s e o disjuncie ntre literali.
La al doilea pas al reducerii, vom converti ecare propoziie
t
i
n form normal-conjunctiv.
Vom construi o tabel de adevr pentru
t
i
lund n considerare toate combinaiile de valori pe
care le pot lua variabilele. Fiecare linie a tabelei de adevr const dintr-o combinaie posibil de
valori i valoarea expresiei pentru aceste valori. Folosind intrrile tabelei de adevr pentru care
valoarea expresiei este 0, construim o formul n form normal-disjunctiv (sau FND) un
SAU de I-uri formul care este echivalent cu
t
i
. Convertim apoi aceast formul ntr-o
formul FNC
tt
i
folosind regulile lui DeMorgan (5.2) pentru a complementa ecare literal i
pentru a schimba I-urile n SAU-uri i SAU-urile n I-uri.
n exemplul nostru convertim propoziia
t
1
= (y
1
(y
2
x
2
)) n FNC dup cum urmeaz.
Tabela de adevr pentru
t
1
este dat n gura 36.10. Formula FND echivalent cu
t
1
este
(y
1
y
2
x
2
) (y
1
y
2
x
2
) (y
1
y
2
x
2
) (y
1
y
2
x
2
).
Aplicnd legile lui DeMorgan, obinem formula FNC

tt
1
= (y
1
y
2
x
2
) (y
1
y
2
x
2
) (y
1
y
2
x
2
) (y
1
y
2
x
2
),
care este echivalent cu propoziia iniial
t
1
.
Fiecare propoziie
t
i
a formulei
t
poate convertit n acelai mod ntr-o formul FNC

tt
i
, deci
t
este echivalent cu formula FNC
tt
care const din conjuncia propoziiilor
tt
i
. Mai
mult, ecare propoziie din
tt
are cel mult trei literali.
36.4. Demonstraii ale NP-completitudinii 809
Figura 36.10 Tabela de adevr pentru propoziia (y
1
(y
2
x
2
)).
La al treilea i ultimul pas al reducerii vom transforma formula pentru ca ecare propoziie
s aib trei literali. Formula nal 3-FNC
ttt
este construit cu ajutorul propoziiilor
formulei FNC
tt
. Sunt folosite dou variabile auxiliare pe care le vom denumi p i q. Pentru
ecare propoziie C
i
din
tt
vom introduce n
ttt
urmtoarele propoziii:
Dac C
i
are exact trei literali atunci ea va introdus neschimbat n
ttt
.
Dac C
i
are doi literali distinci, adic C
i
= (l
1
l
2
) unde l
1
i l
2
sunt literali, atunci vom
include n
ttt
conjuncia de propoziii (l
1
l
2
p) (l
1
l
2
p). S-au introdus literalii p
i p pentru a putea ndeplinit cerina ca ecare propoziie s conin exact 3 literali:
(l
1
l
2
p) (l
1
l
2
p) este echivalent cu (l
1
l
2
) indiferent de valoarea lui p.
Dac C
i
are un singur literal l, atunci vom include n
ttt
conjuncia de propoziii (l p
q) (l p q) (l p q) (l p q). Se observ c valoarea acestei expresii va
l, indiferent de valorile lui p i q.
Vom observa c formula 3-FNC
ttt
este satisabil dac, i numai dac, este satisabil.
Asemeni reducerii de la Circuit-Sat la Sat, construirea formulei
t
din nu altereaz
proprietatea formulei de a este sau nu satisabil. La al doilea pas, se construiete o formul FNC

tt
care este echivalent, din punct de vedere algebric, cu
t
. La al treilea pas, se construiete o
formul 3-FNC
ttt
care este echivalent cu
tt
, deoarece orice atribuire de valori pentru p i q
duce la o formul echivalent, din punct de vedere algebric, cu
tt
.
Trebuie s artm i faptul c aceast reducere poate efectuat n timp polinomial. La
construirea formulei
t
din se introduce, cel mult, o variabil i o propoziie pentru ecare
legtur din . La construirea formulei
tt
din
t
se introduc, cel mult, 8 propoziii n
tt
pentru
ecare propoziie din
t
, deoarece ecare propoziie din
t
are cel mult 3 variabile, deci tabela
de adevr va avea, cel mult, 2
3
= 8 linii. La construirea formulei
ttt
din
tt
se introduc, cel mult,
4 propoziii n
ttt
pentru ecare propoziie din
tt
. n concluzie, mrimea formulei
ttt
depinde,
dup o funcie polinomial, de lungimea formulei originale, ecare construcie putnd realizat
foarte uor n timp polinomial.
Exerciii
36.4-1 Se consider reducerea n timp suprapolinomial prezentat n demonstraia teoremei
36.9. Descriei un circuit de mrime n care, atunci cnd este convertit la o formul folosind
aceast metod, duce la o formul a crei mrime depinde dup o funcie exponenial de n.
810 Capitolul 36 NP-completitudine
36.4-2 Gsii formula 3-FNC care rezult din formula (36.3) atunci cnd folosim metodele
artate n demonstraia teoremei 36.10.
36.4-3 Profesorul Jagger propune o demonstraie a faptului c Sat
P
3-Fnc-Sat folosind
numai metoda tabelei de adevr din demonstraia teoremei 36.10, fr s mai e nevoie de
ceilali pai. Profesorul propune s lum n considerare o formul logic , s construim tabela
de adevr pentru variabilele sale, s gsim cu ajutorul acestei tabele o formul 3-FND care
este echivalent cu i apoi, aplicnd regulile lui DeMorgan, s obinem o formul 3-FNC
echivalent cu . Artai c aceast strategie nu implic o reducere n timp polinomial.
36.4-4 Artai c problema determinrii faptului c o formul logic este sau nu o tautologie
este complet pentru co-NP. ( Vezi exerciiul 36.3-6.)
36.4-5 Artai c problema satisabilitii formulelor n form normal-disjunctiv este rezolva-
bil n timp polinomial.
36.4-6 S presupunem c cineva gsete un algoritm polinomial pentru problema satisabilitii
formulei. Artai cum poate folosit acest algoritm pentru a gsi atribuiri satisabile n timp
polinomial.
36.4-7 Fie 2-Fnc-Sat mulimea formulelor logice, n form normal-conjuctiv, care sunt
satisabile i care conin exact 2 literali n ecare propoziie. Artai c 2-Fnc-Sat P.
Construii un algoritm ct mai ecient posibil. ( Observai c x y este echivalent cu
x y. Reducei problema 2-Fnc-Sat la o problem de grafuri orientate care este rezolvabil
ecient.)
36.5. Probleme NP-complete
Problemele NP-complete apar n cele mai diverse domenii: logic, grafuri, aritmetic, pro-
iectarea reelelor, mulimi i partiii, memorri i cutri, planicri, programarea matematic,
algebr i teoria numerelor, jocuri, teoria limbajelor i a automatelor, optimizarea programelor
i multe altele. n aceast parte vom folosi metoda reducerii pentru a demonstra NP-
completitudinea pentru o varietate de probleme din domeniul teoriei grafurilor i a partiionrii
mulimilor.
Figura 36.11 ilustreaz structura demonstraiilor de NP-completitudine din aceast seciune
i din seciunea 36.4. Fiecare limbaj din gur este demonstrat a NP-complet printr-o reducere
de la limbajul care i este printe n arborele prezentat. Rdcina este Circuit-Sat a crui NP-
completitudine a fost dovedit n teorema 36.7.
36.5.1. Problema clicii
O clic, ntr-un graf neorientat G = (V, E), este o submulime V
t
V cu proprietatea c
ntre ecare pereche de vrfuri din V
t
exist o muchie din E. Cu alte cuvinte, o clic este un
subgraf complet al lui G. Mrimea clicii este dat de numrul de vrfuri pe care l conine.
Problema clicii este problema de optim care cere gsirea unei clici de dimensiune maxim
n graf. Problema de decizie corespunztoare va determinarea faptului dac exist o clic de
36.5. Probleme NP-complete 811
Figura 36.11 Structura demonstraiilor de NP-completitudine din seciunile 36.4 i 36.5. Fiecare
demonstraie rezult, n cele din urm, din NP-completitudinea problemei satisabilitii circuitului.
mrime k. Deniia limbajului formal este: Clic = {'G, k` : G este un graf care conine o clic
de dimensiune k}.
Un algoritm naiv pentru rezolvarea acestei probleme este de a determina toate submulimile
avnd k elemente ale lui V i a verica dac formeaz o clic. Timpul de execuie al acestui
algoritm este (k
2

]V ]
k

, deci este un timp polinomial dac k este o constant. n general, k


ar putea proporional cu [V [, caz n care programul, care implementeaz algoritmul ar rula n
timp suprapolinomial. Dup cum, probabil, presupunei este puin probabil s existe un algoritm
ecient pentru problema clicii.
Teorema 36.11 Problema clicii este NP-complet.
Demonstraie. Pentru a arta c Clic NP pentru un graf dat G = (V, E), folosim mulimea
V
t
V a vrfurilor clicii ca prob pentru G. Vericarea faptului c V
t
este o clic poate
efectuat n timp polinomial, vericnd pentru ecare pereche u, v V
t
dac muchia (u, v) E.
Artm, apoi, c problema clicii este NP-dicil demonstrnd c 3-Fnc-Sat
P
Clic.
Faptul c vom putea demonstra acest lucru este, ntr-un anume fel, surprinztor, deoarece
formulele logice par a avea puine n comun cu grafurile.
Algoritmul de reducere ncepe cu o instan a problemei 3-Fnc-Sat. Fie = C
1
C
2
C
k
o formul logic n 3-FNC cu k propoziii. Pentru r = 1, 2, . . . , k, ecare propoziie C
r
are exact
trei literali distinci l
r
1
, l
r
2
i l
r
3
. Vom construi un graf G astfel nct s e satisabil dac, i
numai dac, G are o clic de mrime k.
Graful G = (V, E) este construit dup cum urmeaz. Pentru ecare propoziie C
r
= (l
r
1
l
r
2

l
r
3
) din introducem un triplet de vrfuri v
r
1
, v
r
2
i v
r
3
n V . ntre dou vrfuri v
r
i
i v
s
j
va exista
muchie dac sunt ndeplinite simultan urmtoarele condiii:
v
r
i
i v
s
j
fac parte din triplete diferite, adic r = s;
literalii corespunztori acestor vrfuri sunt consisteni, adic l
r
i
nu este negaia lui l
s
j
.
812 Capitolul 36 NP-completitudine
Figura 36.12 Graful G obinut din formula 3-FNC = C
1
C
2
C
3
unde C
1
= (x
1
x
2
x
3
), C
2
=
(x
1
x
2
x
3
) i C
3
= (x
1
x
2
x
3
) pentru reducerea de la 3-Fnc-Sat la Clic. O atribuire satisabil
pentru formul este 'x
1
= 0, x
2
= 0, x
3
= 1). Aceast atribuire satisface C
1
prin x
2
, C
2
i C
3
prin x
3
.
Vrfurile clicii corespunztoare sunt cele deschise la culoare.
Acest graf poate foarte uor determinat, cu ajutorul lui , n timp polinomial. n gura 36.12
este prezentat graful corespunztor expresiei:
= (x
1
x
2
x
3
) (x
1
x
2
x
3
) (x
1
x
2
x
3
).
Trebuie s artm c aceast transformare de la la G este, ntr-adevr, o reducere. S
presupunem, mai nti, c are o atribuire satisabil. Atunci, ecare propoziie C
r
conine
cel puin un literal l
r
i
cruia i-a fost atribuit valoarea 1 i ecare astfel de literal corespunde
unui vrf v
r
i
. Alegnd un astfel de literal pentru ecare propoziie, obinem o mulime de k
vrfuri. Armm c V
t
este o clic. Pentru ecare dou vrfuri v
r
i
i v
s
j
V
t
, cu r = s, literalilor
corespunztori le-a fost atribuit valoarea 1, deci aceti literali nu pot unul complementul
celuilalt. Deci, datorit modului n care a fost construit graful G, muchia (v
r
i
, v
s
j
) aparine lui E.
Invers, s presupunem c G are o clic V
t
de dimensiune k. Nici o muchie din G nu leag
vrfuri din acelai triplet, deci V
t
conine exact un vrf pentru ecare triplet. Putem atribui
valoarea 1 pentru ecare literal l
r
i
, pentru care v
r
i
V
t
, fr a mai necesar vericarea cazului
n care a fost atribuit valoarea 1, att unui literal ct i complementului su, deoarece G nu
conine muchii ntre vrfurile corespunztoare unor literali inconsisteni. Astfel, ecare propoziie
va satisabil, deci va i ea satisabil. (Fiecare variabil care nu corespunde vreunui vrf
al grafului poate primi o valoare arbitrar.)
n exemplul din gura 36.12 o atribuire satisabil pentru este 'x
1
= 0, x
2
= 0, x
3
= 1`,
iar clica de dimensiune k = 3 corespunztoare const din vrfurile care corespund lui x
2
din
prima propoziie, x
3
din a doua i tot x
3
din a treia.
36.5. Probleme NP-complete 813
Figura 36.13 Reducere de la Clic la Acoperire-Cu-Vrfuri. (a) Un graf neorientat G = (V, E) cu
clica V

= u, v, x, y (b) Graful G obinut n urma algoritmului de reducere care are mulimea stabil
V V

= w, z.
36.5.2. Problema acoperirii cu vrfuri
O acoperire cu vrfuri a unui graf neorientat G = (V, E) este o submulime V
t
V astfel
nct, dac (u, v) E, atunci cel puin unul din vrfurile u i v face parte din V
t
. Aceasta
nseamn c ecare vrf i acoper muchiile incidente i c o acoperire cu vrfuri pentru G
este o mulime de vrfuri care acoper toate muchiile din E. Dimensiunea unei acoperiri cu
vrfuri este dat de numrul vrfurilor pe care le conine. De exemplu, graful din gura 36.13(b)
are o acoperire cu vrfuri w, z de dimensiune 2.
Problema acoperirii cu vrfuri cere determinarea unei acoperiri cu vrfuri de dimensiune
minim ntr-un graf dat. Reformulnd aceast problem de optim ca o problem de decizie, vom
cere vericarea faptului c un graf are o acoperire cu vrfuri de dimensiune dat k. Limbajul
formal corespunztor poate denit astfel:
Acoperire-Cu-Vrfuri = {'G, k` : graful G are o acoperire cu vrfuri de dimensiune k}.
Urmtoarea teorem arat c aceast problem este NP-complet.
Teorema 36.12 Problema acoperirii cu vrfuri este NP-complet.
Demonstraie. Artm, mai nti, c Acoperire-Cu-Vrfuri NP. S presupunem c avem
un graf G = (V, E) i un ntreg k. Proba pe care o alegem este chiar acoperirea cu vrfuri V
t
V .
Algoritmul de vericare arm c [V
t
[ = k i apoi veric, pentru ecare muchie (u, v) E,
dac u V
t
sau v V
t
. Aceast vericare poate efectuat n mod direct, n timp polinomial.
Demonstrm c problema acoperirii cu vrfuri este NP-dicil artnd c Clic
P
Acoperire-Cu-Vrfuri. Reducerea este bazat pe noiunea de complement al unui graf.
Dndu-se un graf neorientat G = (V, E), denim complementul lui G ca ind G = (V, E) unde
E = (u, v) : (u, v) / E. Cu alte cuvinte G este graful care conine exact acele muchii care nu
sunt coninute n G. n gura 36.13 se arat un graf i complementul su i ilustreaz reducerea
de la Clic la Acoperire-Cu-Vrfuri.
Algoritmul de reducere are ca intrare o instan 'G, k` a problemei clicii. Calculeaz
complementul G, fapt care poate realizat foarte uor n timp polinomial. Ieirea algoritmului
de reducere este instana 'G, [V [ k` a problemei acoperirii cu vrfuri. Pentru a completa
demonstraia, artm c aceast transformare este, ntr-adevr, o reducere: graful G are o clic
de dimensiune k dac, i numai dac, graful G are o acoperire cu vrfuri de dimensiune [V [ k.
814 Capitolul 36 NP-completitudine
S presupunem c G are o clic V
t
V cu [V
t
[ = k. Susinem c V V
t
este o acoperire
cu vrfuri n G. Fie (u, v) o muchie n E. Atunci (u, v) / E, ceea ce implic faptul c cel puin
unul din vrfurile u i v nu aparine lui V
t
deoarece ecare pereche de vrfuri din V
t
este legat
printr-o muchie din E. Acest lucru este echivalent cu faptul c cel puin unul din vrfurile u i
v este n V V
t
, ceea ce nseamn c muchia (u, v) este acoperit de V V
t
. Deoarece (u, v) a
fost aleas n mod arbitrar din E, ecare muchie din E este acoperit de un vrf din V V
t
. n
concluzie, mulimea V V
t
, care are dimensiunea [V [ k, este o acoperire cu vrfuri pentru G.
Invers, s presupunem c G are o acoperire cu vrfuri V
t
V , unde [V
t
[ = [V [ k. Pentru
orice u, v V , dac (u, v) E, atunci cel puin unul din vrfurile u i v aparine lui V
t
. O
implicaie echivalent este c pentru orice u, v V dac, u / V
t
i v / V
t
, atunci, (u, v) E.
Cu alte cuvinte V V
t
este o clic de dimensiune [V [ [V
t
[ = k.
Deoarece Acoperire-Cu-Vrfuri este NP-complet, nu ne ateptm s gsim un algoritm
polinomial pentru determinarea unei acoperiri cu vrfuri minimale. n seciunea 37.1 este
prezentat un algoritm de aproximare polinomial care d o soluie aproximativ pentru
problema acoperirii cu vrfuri. Dimensiunea acoperirii cu vrfuri, furnizat de acest algoritm,
este cel mult de dou ori mai mare dect dimensiunea minim a acoperirii cu vrfuri.
n concluzie, nu ar trebui s ncetm s m optimiti doar din cauz c o problem este
NP-complet. Poate exista un algoritm de aproximare polinomial care obine o soluie aproape
optim, chiar dac gsirea unei soluii optime este o problem NP-complet. n capitolul 37 sunt
prezentai mai muli algoritmi de aproximare pentru diferite probleme NP-complete.
36.5.3. Problema sumei submulimii
Urmtoarea problem NP-complet pe care o vom lua n considerare este o problem de
aritmetic. n problema sumei submulimii se d o mulime nit S N i o int t N
i se cere vericarea faptului c exist o submulime S
t
a lui S, pentru care suma elementelor
componente este t. De exemplu, dac S = 1, 4, 16, 64, 256, 1040, 1041, 1093, 1284, 1344 i t =
3754 atunci submulimea S
t
= 1, 16, 64, 256, 1040, 1093, 1284 este o soluie.
Ca de obicei vom deni problema ca un limbaj formal:
Suma = 'S, t` : exist o submulime S
t
S astfel nct t =

sS

s.
Ca pentru orice problem de aritmetic, este important s amintim c o codicare standard
presupune c numerele ntregi date la intrare sunt reprezentai n baza 2. innd cont de aceast
presupunere putem arta c este puin probabil ca problema sumei submulimii s aib un
algoritm rapid.
Teorema 36.13 Problema sumei submulimii este NP-complet.
Demonstraie. Pentru a arta c Suma NP, pentru ecare instan 'S, t` a acestei probleme,
lum ca prob submulimea S
t
. Algoritmul care veric dac t =

sS

s este unul polinomial.


Artm, acum, c Acoperire-Cu-Vrfuri
P
Suma. Dndu-se o instan 'G, k` a
problemei acoperirii cu vrfuri, algoritmul de reducere va construi o instan 'S, t` a problemei
sumei submulimii astfel nct G va avea o acoperire cu vrfuri de dimensiune k dac i numai,
dac, exist o submulime a lui S pentru care suma elementelor este exact t.
36.5. Probleme NP-complete 815
Figura 36.14 Reducerea problemei acoperirii cu vrfuri la problema sumei submulimii. (a) Un graf
neorientat G. O acoperire cu vrfuri v
1
, v
3
, v
4
de dimensiune 3, mulime format din vrfurile haurate
deschis. (b) Matricea de inciden corespunztoare. Liniile haurate deschis corespund acoperirii cu
vrfuri de la (a). Fiecare muchie e
j
are un 1 n cel puin o linie haurat deschis. (c) Instana
corespunztoare pentru problema sumei submulimii. Poriunea din chenar este matricea de inciden.
Aici acoperirea cu vrfuri v
1
, v
3
, v
4
de dimensiune k = 3 corespunde submulimii haurate deschis
1, 16, 64, 256, 1040, 1093, 1284 pentru care suma elementelor este 3754.
Elementul de baz al reducerii este o reprezentare a lui G cu ajutorul unei matrice de
inciden. Fie G = (V, E) un graf neorientat, V = v
0
, v
1
, . . . , v
]V ]1
i E = e
0
, e
1
, . . . , e
]E]1
.
Matricea de inciden a lui G este o matrice B = (b
ij
), de dimensiune [V [ [E[, astfel nct
b
ij
=

1 dac muchia e
j
este incident vrfului v
i
,
0 n caz contrar.
De exemplu, gura 36.14(b) arat matricea de inciden pentru graful neorientat din gura
36.14(a). Matricea de inciden conine muchiile cu indicele mai mic la dreapta i nu la stnga,
aa cum este reprezentarea convenional. S-a fcut aceast alegere pentru a simplica formulele
pentru numerele din S.
Dndu-se un graf G i un ntreg k, algoritmul de reducere determin o mulime S de numere
i un ntreg t. Pentru a nelege cum funcioneaz acest algoritm, reprezentm numerele n baza
4 modicat. Cele [E[ cifre de ordin inferior vor cifre ale bazei 4, iar cele de ordin superior
pot lua valori pn la k. Mulimea de numere este construit n aa fel, nct nici un transport
nu se poate propaga de la cifrele de ordin inferior la cele de ordin superior.
Mulimea S const din dou tipuri de numere corespunznd vrfurilor, respectiv muchiilor.
Pentru ecare vrf v
i
V , crem un ntreg pozitiv x
i
a crui reprezentare n baza 4 modicat
const dintr-un 1 urmat de [E[ cifre. Cifrele corespund celei de-a v
i
-a linie a matricei de inciden
B = (b
ij
) a lui G, dup cum se vede n gura 36.14(c). Putem spune c pentru i = 0, 1, . . . , [V [1
816 Capitolul 36 NP-completitudine
avem
x
i
= 4
]E]
+
]E]1

j=0
b
ij
4
j
.
Pentru ecare muchie e
j
E, crem un ntreg pozitiv y
j
care reprezint o linie a matricei
identitate de inciden. (Matricea identitate de inciden este o matrice de dimensiuni [E[
[E[ cu elemente egale cu 1 numai pe poziiile de pe digonal. Putem spune c pentru j =
0, 1, . . . , [E[ 1
y
j
= 4
j
.
Prima cifr a sumei int t este k i celelalte [E[ cifre de ordin inferior sunt 2-uri. Putem
spune c
t = k4
]E]
+
]E]1

j=0
2 4
j
.
Toate aceste numere au mrime polinomial cnd sunt reprezentate n baza 2. Reducerea
poate efectuat n timp polinomial, manipulnd biii matricei de inciden.
Trebuie s artm c graful G are o acoperire cu vrfuri de dimensiune k dac, i numai
dac, exist o submulime S
t
S pentru care suma elementelor este t. S presupunem, mai
nti, c G are o acoperire cu vrfuri V
t
V de dimensiune k. Fie V
t
= v
i
1
, v
i
2
, . . . , v
i
k
i
S
t
= x
i
1
, x
i
2
, . . . , x
i
k
y
j
: e
j
este incident exact unui vrf din V
t
.
Pentru a arta c

sS

s = t, s observm c, nsumnd cei k de 1 cu care ncepe ecare


x
i
m
S
t
, obinem cifra k ca prim cifr pentru reprezentarea n baza 4 modicat a lui t. Pentru
a obine cifrele de ordin inferior ale lui t (toate sunt 2), s considerm, pe rnd, poziiile cifrelor,
ecare corespunznd unei muchii e
j
. Deoarece V
t
este o acoperire cu vrfuri, e
j
este incident
cel puin unui vrf din V
t
. Deci, pentru ecare muchie e
j
, exist cel puin un x
i
m
S
t
cu 1 pe
poziia j. Dac e
j
este incident la dou vrfuri din V
t
, atunci ambele vrfuri contribuie cu un 1
n poziia j. A j-a cifr a lui y
j
nu contribuie cu nimic deoarece e
j
este incident la dou vrfuri,
ceea ce implic y
j
/ S
t
. Deci, n acest caz, suma pentru S
t
va duce la apariia cifrei 2 pe poziia
j a lui t. n cellalt caz cnd e
j
este incident exact unui vrf din V
t
avem y
j
S
t
, iar vrful
incident i y
j
vor contribui ambele cu cte un 1 pe poziia j a lui t, deci va aprea tot un 2. Deci
S
t
este o soluie pentru instana S a problemei sumei submulimii.
S presupunem, acum, c exist o submulime S
t
S pentru care suma elementelor este t.
Fie S
t
= x
i
1
, x
i
2
, . . . , x
i
m
y
j
1
, y
j
2
, . . . , y
j
p
. Armm c m = k i c V
t
= v
i
1
, v
i
2
, . . . , v
i
m

este o acoperire cu vrfuri pentru G. Pentru a demonstra acest lucru, ncepem prin a observa c,
pentru ecare muchie e
j
E, S conine trei ntregi care au cifra 1 pe poziia e
j
: cte unul pentru
ecare dintre vrfurile incidente muchiei e
j
i unul pentru y
j
. Deoarece lucrm cu reprezentarea
n baza 4 modicat, nu vor transferuri de la poziia e
j
la poziia e
j+1
. Deci, pentru ecare din
cele [E[ poziii de ordin inferior ale lui t, cel puin unul i cel mult doi x
i
trebuie s contribuie
la sum. Deoarece ultimul x
i
contribuie la suma corespunztoare ecrei muchii, observm c
V
t
este o acoperire cu vrfuri. Pentru a demonstra c m = k i, deci, c V
t
este o acoperire cu
vrfuri de dimensiune k, observm c singura modalitate de a obine k pe prima poziie a intei
t este a include x
i
de k ori n sum.
36.5. Probleme NP-complete 817
n gura 36.14, acoperirea cu vrfuri V
t
= v
1
, v
3
, v
4
corespunde submulimii S
t
=
x
1
, x
3
, x
4
, y
0
, y
2
, y
3
, y
4
. Fiecare y
j
este inclus n S
t
cu excepia lui y
1
care este incident la
dou vrfuri din V
t
.
36.5.4. Problema ciclului hamiltonian
Ne ntoarcem la problema ciclului hamiltonian denit n seciunea 36.2.
Teorema 36.14 Problema ciclului hamiltonian este NP-complet.
Demonstraie. Artm, mai nti, c Ciclu-Ham NP. Dndu-se un graf G = (V, E), proba
este o secven de [V [ noduri care formeaz ciclul hamiltonian. Vericm, cu ajutorul algoritmului
de vericare, dac secvena conine ecare vrf din V exact o dat i c primul vrf se repet la
sfrit. Aceast vericare poate fcut n timp polinomial.
Demonstrm c Ciclu-Ham este NP-complet artnd c 3-Fnc-Sat
P
Ciclu-Ham.
Dndu-se o formul logic n form normal conjunctiv care conine variabilele x
1
, x
2
, . . . , x
n
cu propoziiile C
1
, C
2
, . . . , C
k
, ecare coninnd exact 3 literali distinci, construim graful
G = (V, E) n timp polinomial astfel nct G are un ciclu hamiltonian dac, i numai dac,
este satisabil. Construcia noastr se bazeaz pe grafuri ajuttoare care sunt componente
ale grafurilor care au cteva proprieti speciale.
Primul graf ajuttor este subgraful A prezentat n gura 36.15(a). S presupunem c A
este un subgraf al unui graf G i singurele legturi dintre A i restul grafului G sunt realizate
prin nodurile a, a
t
, b i b
t
. S presupunem c G are un ciclu hamiltonian. Deoarece orice ciclu
hamiltonian al lui G trebuie s treac prin vrfurile z
1
, z
2
, z
3
i z
4
ntr-unul din modurile artate
n gurile 36.15(b) i (c), putem trata subgraful A ca i cum ar o simpl pereche de muchii
(a, a
t
) i (b, b
t
) cu restricia c orice ciclu hamiltonian din G trebuie s includ exact una dintre
aceste muchii. Vom reprezenta graful ajuttor A aa cum este artat n gura 36.15(d).
Subgraful B din gura 36.16 este al doilea graf ajuttor pe care l lum n considerare.
S presupunem c B este un subgraf al unui graf G i c singurele legturi dintre B i restul
grafului G sunt prin nodurile b
1
, b
2
, b
3
i b
4
. Un ciclu hamiltonian al grafului G nu poate conine,
concomitent, muchiile (b
1
, b
2
), (b
2
, b
3
) i (b
3
, b
4
) deoarece, n acest caz, toate celelalte vrfuri ale
grafului ajuttor, n afar de b
1
, b
2
, b
3
i b
4
, nu vor putea aprea n ciclu. Un ciclu hamiltonian al
lui G poate traversa orice submulime a acestor muchii. Figurile 36.16 (a)(e) arat cinci astfel
de submulimi; cele dou submulimi rmase pot obinute prin oglindirea fa de orizontal a
prilor (b) i (e). Reprezentm acest graf ajuttor ca n gura 36.18(f), ideea ind c cel puin
unul din drumurile indicate de sgei trebuie s apar i n ciclul hamiltonian.
Graful G pe care l vom construi const, n cea mai mare msur, din aceste dou grafuri
ajuttoare. Construcia este ilustrat n gura 36.17. Pentru ecare din cele k propoziii din ,
includem o copie a grafului ajuttor B i unim aceste grafuri ajuttoare ntr-o serie dup cum
urmeaz. Dac b
ij
este copia vrfului b
j
n a i-a component a lui B, conectm b
i,4
cu b
i+1,1
pentru i = 1, 2, . . . , k 1.
Apoi, pentru ecare variabil x
m
din , includem dou vrfuri x
t
m
i x
tt
m
. Conectm aceste
dou vrfuri prin dou copii ale muchiei (x
t
m
, x
tt
m
) pe care le notm prin e
m
i e
m
pentru a le
distinge. Ideea este c, dac ciclul hamiltonian trece prin e
m
, aceasta corespunde atribuirii valorii
1 variabilei x
m
. Dac ciclul hamiltonian trece prin muchia e
m
, valoarea atribuit variabilei x
m
este 0. Fiecare pereche de muchii formeaz un ciclu avnd dou muchii. Conectm aceste mici
818 Capitolul 36 NP-completitudine
Figura 36.15 (a) Graful ajuttor A folosit n reducerea de la 3-Fnc-Sat la Ciclu-Ham. (b)-(c)
Dac A este un subgraf al unui graf G care conine un ciclu hamiltonian i singurele legturi ale lui A cu
restul grafului G se fac prin vrfurile a, a

, b i b

, atunci, muchiile haurate reprezint singurele drumuri


posibile n care ciclul hamiltonian poate traversa muchiile subgrafului A. (d) O reprezentare compact
a grafului ajuttor A.
cicluri ntr-o serie adugnd muchiile (x
t
m
, x
tt
m+1
) pentru m = 1, 2, . . . , n 1. Legm partea
dreapt a grafului cu partea stng cu ajutorul a dou muchii (b
1,1
, x
t
1
) i (b
k,4
, x
tt
n
), care
reprezint muchiile cele mai de sus i cele mai de jos din gura 36.17.
nc nu am terminat construcia grafului G deoarece trebuie s realizm legtura dintre
variabile i propoziii. Dac cel de-al j-lea literal al propoziiei C
i
este x
m
, atunci folosim un
graf ajuttor A pentru a uni muchia (b
i,j
, b
i,j+1
) cu muchia e
m
. Dac cel de-al j-lea literal al
propoziiei C
i
este x
m
, atunci folosim un graf ajuttor A pentru a uni muchia (b
i,j
, b
i,j+1
) cu
muchia e
m
. n gura 36.17, de exemplu, deoarece propoziia C
2
este (x
1
x
2
x
3
), plasm trei
grafuri ajuttoare A dup cum urmeaz:
ntre (b
2,1
, b
2,2
) i e
1
,
ntre (b
2,2
, b
2,3
) i e
2
,
ntre (b
2,3
, b
2,4
) i e
3
.
Se observ c, pentru conectarea a dou muchii printr-un graf ajuttor A, trebuie s nlocuim
ecare muchie cu cele cinci muchii din partea de sus sau de jos a gurii 36.15(a) i, bineneles,
s adugm legturile care trec prin cele z vrfuri. Un literal dat l
m
poate aprea n mai multe
propoziii (x
3
din gura 36.17, de exemplu), deci o muchie e
m
sau e
m
poate inuenat
de mai multe grafuri ajuttoare A (muchia e
3
de exemplu). n acest caz, conectm grafurile
ajuttoare A n serie, aa cum se arat n gura 36.18, nlocuind muchiile e
m
sau e
m
printr-o
serie de muchii.
36.5. Probleme NP-complete 819
Figura 36.16 Graful ajuttor B, folosit n reducerea de la 3-Fnc-Sat la Ciclu-Ham. Nici un drum
de la vrful b
1
la vrful b
4
, care conine toate vrfurile din graful ajuttor, nu poate folosi concomitent
muchiile (b
1
, b
2
), (b
2
, b
3
) i (b
3
, b
4
). Orice submulime a acestei muchii poate folosit. (a)-(e) Cinci
astfel de submulimi. (f ) O reprezentare a acestui graf ajuttor n care cel puin unul din drumurile
indicate de sgei trebuie s apar n ciclul hamiltonian.
820 Capitolul 36 NP-completitudine
Figura 36.17 Graful G construit din formula = (x
1
x
2
x
3
) (x
1
x
2
x
3
) (x
1
x
2
x
3
). O
atribuire satisabil s pentru variabilele din este s(x
1
) = 0, s(x
2
) = 1 i s(x
3
) = 1, ceea ce corespunde
ciclului hamiltonian prezentat. Observai c dac s(x
m
) = 1 atunci muchia e
m
apare n ciclul hamiltonian
i dac s(x
m
) = 0 atunci n ciclul hamiltonian apare muchia e
m
.
Susinem c formula este satisabil dac, i numai dac, graful G conine un ciclu
hamiltonian. Presupunem, mai nti, c G are un ciclu hamiltonian h i artm c este
satisabil. Ciclul h trebuie s aib o form particular:
Mai nti traverseaz muchia (b
1,1
, x
t
1
) pentru a ajunge din stnga-sus n dreapta-sus.
Urmeaz apoi toate vrfurile x
t
m
i x
tt
m
de sus n jos, alegnd e muchia e
m
, e muchia e
m
dar nu ambele.
36.5. Probleme NP-complete 821
Figura 36.18 Construcia folosit cnd o muchie e
m
sau e
m
este inuenat de mai multe grafuri
ajuttoare A. (a) O poriune a gurii 36.17. (b) Subgraful construit.
Traverseaz muchia (b
k,4
, x
tt
n
) pentru a ajunge n partea stng.
n nal, traverseaz grafurile ajuttoare B de jos n sus.
(Traverseaz, de fapt, i muchiile din grafurile ajuttoare A, dar folosim aceste subgrafuri pentru
a scoate n eviden natura sau/sau a muchiilor pe care le leag.)
Dndu-se un ciclu hamiltonian h, denim o atribuire de adevr pentru dup cum urmeaz.
Dac e
m
h atunci atribuim valoarea 1 variabilei x
m
. n caz contrar, muchia e
m
h i valoarea
variabilei x
m
va 0.
Susinem c aceast atribuire satisface . S considerm propoziia C
i
i graful ajuttor B
corespunztor din G. Fiecare muchie (b
i,j
, b
i,j+1
) este conectat printr-un graf ajuttor A, e la
muchia e
m
, e la muchia e
m
, depinznd de faptul dac al j-lea literal este x
m
sau x
m
. Muchia
(b
i,j
, b
i,j+1
) este traversat de h dac, i numai dac, literalul corespunztor este 0. Deoarece
ecare din cele 3 muchii (b
i,1
, b
i,2
), (b
i,2
, b
i,3
) i (b
i,3
, b
4i,
) ale propoziiei C
i
apare, de asemenea,
ntr-un graf ajuttor B, nu pot traversate toate trei de ciclul hamiltonian h. Una dintre cele trei
muchii trebuie s aib literalul corespunztor cu valoarea 1, deci propoziia C
i
este satisabil.
Aceast proprietate este respectat pentru ecare propoziie C
i
, i = 1, 2, . . . , k, deci formula
este satisabil.
Invers, s presupunem c formula este satisabil folosind o anumit atribuire de adevr.
Urmrind regulile de deasupra putem construi un ciclu hamiltonian pentru graful G: traversm
muchia e
m
dac x
m
= 1, muchia e
m
dac x
m
= 0 i muchia (b
i,j
, b
i,j+1
) dac, i numai dac,
valoarea atribuit celui de-al j-lea literal al propoziiei C
i
este 0. Aceste reguli pot ntr-adevr
822 Capitolul 36 NP-completitudine
Figura 36.19 O instan a problemei comis-voiajorului. Muchiile haurate reprezint un ciclu de cost
minim, costul ind 7.
urmrite, deoarece presupunem c s este o atribuire satisabil pentru formula .
n nal, s observm c graful G poate construit n timp polinomial. El conine un graf
ajuttor B pentru ecare dintre cele k propoziii ale lui . Exist un graf ajuttor A pentru
ecare instan a ecrui literal din , deci exist 3k grafuri ajuttoare A. Deoarece grafurile
ajuttoare A i B au dimensiune x, graful G are O(k) vrfuri i muchii i poate foarte uor
construit n timp polinomial. Putem spune, acum, c am furnizat o reducere n timp polinomial
de la 3-Fnc-Sat la Ciclu-Ham.
36.5.5. Problema comis-voiajorului
n problema comis-voiajorului, care este n strns legtur cu problema ciclului
hamiltonian, un comis-voiajor trebuie s viziteze n orae. Modelnd problema pe un graf cu
n vrfuri, putem spune c comis-voiajorul dorete s fac un tur, sau un ciclu hamiltonian,
vizitnd ecare ora o singur dat i terminnd cu oraul din care a pornit. Pentru cltoria
ntre oraele i i j exist un cost c(i, j) reprezentat printr-un numr ntreg. Comis-voiajorul
dorete s parcurg un ciclu al crui cost total s e minim, unde costul total este suma costurilor
individuale de pe muchiile care formeaz ciclul. De exemplu, n gura 36.19, un ciclu de cost
minim este 'u, w, v, x, u`, acesta avnd costul 7. Limbajul formal pentru problema de decizie
corespunztoare este:
PCV = 'G, c, k` : G = (V, E) este un graf complet, c este o funcie de la V V Z,
k Z i G are un ciclu pentru comisul voiajor, de cost cel mult k.
Urmtoarea teorem arat c este puin probabil s existe un algoritm rapid pentru problema
comis voiajorului.
Teorema 36.15 Problema comis-voiajorului este NP-complet.
Demonstraie. Artm, mai nti, c PCV NP. Dndu-se o instan a problemei, folosim
ca prob irul de n vrfuri care formeaz ciclul. Algoritmul de vericare testeaz dac acest ir
conine ecare nod exact o dat, adun costurile muchiilor i veric dac suma este cel mult k.
Acest lucru poate , cu siguran, realizat n timp polinomial.
Pentru a demonstra c PCV este NP-dicil, artm c Ciclu-Ham
P
PCV. Fie G =
(V, E) o instan a problemei ciclului hamiltonian. Construim o instan a PCV dup cum
urmeaz: formm un graf complet G
t
= (V, E
t
) unde E
t
= (i, j) : i, j V i denim funcia
de cost c prin:
c(i, j) =

0 dac (i, j) E,
1 dac (i, j) / E.
Probleme 823
Instana problemei PCV este (G
t
, c, 0) i poate foarte uor determinat n timp polinomial.
Artm acum c graful G are un ciclu hamiltonian dac, i numai dac, graful G
t
conine un
ciclu de cost cel mult 0. S presupunem c graful G are un ciclu hamiltonian h. Fiecare muchie
din h E, deci are cost 0 n G
t
. Deci h este un ciclu n G
t
cu costul 0. Invers, s presupunem
c graful G
t
are un ciclu h
t
de cost cel mult 0. Deoarece costurile muchiilor din E
t
sunt 0 sau
1, costul ciclului este exact 0. n concluzie, h
t
conine numai muchii din E, deci h este un ciclu
hamiltonian n graful G.
Exerciii
36.5-1 Problema izomorsmului subgrafului cere ca, dndu-se dou grafuri G
1
i G
2
, s
se verice dac G
1
este izomorf cu un subgraf al lui G
2
. Artai c aceast problem este NP-
complet.
36.5-2 Dndu-se o matrice A de dimensiuni m n cu elemente numere ntregi i un vector
b cu elemente numere ntregi de dimensiune m, problema de programare a ntregilor 0-1
cere determinarea existenei unui vector x de dimensiune n avnd elemente din mulimea {0, 1}
astfel nct Ax b. Demonstrai c aceast problem este NP-complet. ( Reducei de
la 3-Fnc-Sat.)
36.5-3 Artai c problema sumei submulimii este rezolvabil n timp polinomial dac valoarea
int t este reprezentat unar.
36.5-4 Problema partiionrii mulimii are ca intrare o mulime S de numere ntregi.
Determinai dac numerele pot partiionate n dou mulimi A i A = S A astfel nct

xA
x =

xA
x. Artai c problema partiionrii mulimii este NP-complet.
36.5-5 Artai c problema drumului hamiltonian este NP-complet.
36.5-6 Problema celui mai lung ciclu elementar este problema determinrii unui ciclu
elementar (fr vrfuri care se repet) de lugime maxim ntr-un graf. Artai c aceast
problem este NP-complet.
36.5-7 Profesorul Marconi arm c subgraful folosit ca graf ajuttor A n demonstrarea
teoremei 36.14 este mai complicat dect este necesar: vrfurile z
3
i z
4
din gura 36.15(a)
i vrfurile de deasupra i dedesubtul lor nu sunt necesare. Are profesorul dreptate? Adic,
funcioneaz reducerea cu aceast versiune mai mic a grafului ajuttor, sau dispare proprietatea
de sau/sau a muchiilor?
Probleme
36-1 Mulime independent
O mulime independent a unui graf G = (V, E) este o submulime V
t
V de vrfuri astfel
nct ecare muchie din E este incident la cel mult un vrf din V
t
. Problema mulimii
independente cere gsirea unei mulimi extern stabile de dimensiune maxim n G.
824 Capitolul 36 NP-completitudine
a. Formulai o problem de decizie corespunztoare pentru problema mulimii independente
i demonstrai c este NP-complet. ( Reducei de la problema clicii.)
b. S presupunem c avem o subrutin care rezolv problema de decizie denit la punctul
(a). Gsii un algoritm pentru gsirea unei mulimi independente de dimensiune maxim.
Timpul de execuie al algoritmului ar trebui s e polinomial n [V [ i [E[. (Apelul
subrutinei este considerat a un singur pas.)
Cu toate c problema de decizie a mulimii independente este NP-complet, cteva cazuri
particulare pot rezolvate n timp polinomial.
c. Gsii un algoritm ecient pentru rezolvarea problemei extern stabile cnd ecare vrf al
lui G are gradul 2. Analizai timpul de execuie i demonstrai c algoritmul propus este
corect.
d. Gsii un algoritm ecient pentru rezolvarea problemei mulimii extern stabile cnd un
graf G este bipartit. Analizai timpul de excuie i demonstrai c algoritmul propus este
corect. ( Folosii rezultatele de la seciunea 27.3)
36-2 Colorarea grafului
O k-colorare a unui graf neorientat G = (V, E) este o funcie c : V 1, 2, . . . , k astfel nct
c(u) = c(v) pentru ecare muchie (u, v) E. Cu alte cuvinte, numerele 1, 2, . . . , k reprezint
k culori diferite. Problema colorrii grafului cere determinarea numrului minim de culori
necesare pentru colorarea unui graf dat.
a. Gsii un algoritm ecient pentru determinarea unei 2-colorri a unui graf, dac exist
una.
b. Reformulai problema colorrii grafului ntr-o problem de decizie. Artai c problema de
decizie astfel formulat este rezolvabil n timp polinomial dac, i numai dac, problema
colorrii grafului este rezolvabil n timp polinomial.
c. Fie limbajul 3-Col denit ca mulimea grafurilor care pot 3-colorate. Artai c, dac
3-Col este NP-complet, atunci problema de decizie formulat la punctul (b) este NP-
complet.
Pentru a demonstra c 3-Col este NP-complet, folosii o reducere de la 3-Fnc-Sat. Dndu-se
o formul cu m propoziii i n variabile x
1
, x
2
, . . . , x
n
, construim un graf G = (V, E) dup
cum urmeaz. Mulimea V const dintr-un vrf pentru ecare variabil, un vrf pentru negaia
ecrei variabile, cinci vrfuri pentru ecare propoziie i trei vrfuri speciale: adevrat, fals
i rou. Muchiile literalilor formeaz un triunghi pe vrfurile speciale i, de asemenea, formeaz
un triunghi pe x
i
, x
i
i rou pentru i = 1, 2, . . . , n.
d. Argumentai c n orice 3-colorare c a unui graf care conine muchiile literalilor, o variabil
i negaia ei sunt colorate cu c(adevrat), respectiv c(fals), sau invers. Demonstrai c
pentru orice atribuire de adevr pentru , exist o 3-colorare a grafului care conine numai
literalii muchiilor.
Note bibliograce 825
Figura 36.20 Graful ajuttor corespunztor propoziiei (x y z) folosit n problema 36-2.
Graful ajuttor, prezentat n gura 36.20, este folosit pentru a ndeplini condiia corespun-
ztoare unei clauze (xy z). Fiecare propoziie necesit o copie unic a celor cinci vrfuri care
sunt haurate cu negru n gur. Ele sunt conectate, aa cum se arat, cu literalii propoziiei i
cu vrful special adevrat.
e. Demonstrai c, dac x, y i z sunt colorai cu c(adevrat) sau c(fals) atunci graful
ajuttor este 3-colorabil dac i numai dac cel puin unul dintre vrfurile x, y i z este
colorat cu c(adevrat).
f. Completai demonstraia faptului c 3-Col este NP-complet.
Note bibliograce
Garey i Johnson [79] furnizeaz un ghid pentru NP-completitudine foarte bine realizat,
discutnd pe larg teoria i prezentnd un catalog cu multe probleme despre care se tia n 1979
c sunt NP-complete. (Lista domeniilor n care apar probleme NP-complete este preluat din
cuprinsul lucrrii lor.) Hopcroft, Ullman [104] i Lewis, Papadimitriou [139] au o tratare bun
a NP-completitudinii n contextul teoriei complexitii. Aho, Hopcroft, Ullman [4] acoper i ei
NP-completitudinea i dau cteva reduceri, incluzndu-le pe cele de la problema acoperirii cu
vrfuri i pe cea a grafului hamiltonian.
Clasa P a fost introdus n 1964 de Cobham [44] i, independent, de Edmonds [61] n
1965. Acesta din urm a introdus i clasa NP i a formulat ipoteza P = NP. Noiunea de
NP-completitudine a fost propus n 1971 de Cook [49], cel care a dat primele demonstraii ale
NP-completitudinii pentru problema satisabilitii formulei i problema satisabilitii formulei
3-FNC. Levin [138] a descoperit, independent, noiunea, dnd o dovad a NP-completitudinii
pentru o problem de acoperire. Karp [116] a introdus metodologia reducerii n 1972 i a
demonstrat marea varietate a problemelor NP-complete. Lucrarea lui Karp include demonstraia
original a NP-completitudinii problemelor clicii, a acoperirii cu vrfuri i a ciclului hamiltonian.
De atunci, muli cercettori au dovedit NP-completitudinea mai multor sute de probleme.
Demonstraia teoremei 36.14 a fost adaptat din lucrarea aparinnd lui Papadimitriou i
Steiglitz [154].
37 Algoritmi de aproximare
Multe probleme de importan practic sunt NP-complete, dar sunt prea importante pentru
a abandonate pentru simpluls fapt c obinerea unei soluii optimale este netratabil. Dac
o problem este NP-complet, este puin probabil s gsim un algoritm n timp polinomial
care s rezolve problema exact, dar aceasta nu nseamn c am pierdut orice speran. Exist
dou abordri pentru ocolirea NP-completitudinii. Mai nti, dac datele de intrare sunt de
dimensiuni reduse, un algoritm cu timp de execuie exponenial poate absolut satisfctor.
Apoi, ar putea , nc, posibil s obinem soluii n timp polinomial (e n
cazul cel mai defavorabil, e n cazul mediu). n practic, aproape-optimalitatea este, deseori,
sucient de bun. Un algoritm care returneaz soluii aproape optimale se numete algoritm de
aproximare. Acest capitol prezint algoritmi de aproximare n timp polinomial pentru cteva
probleme NP-complete.
Limite de performan pentru algoritmi de aproximare
S presupunem c lucrm la o problem de optimizare n care ecare soluie potenial are
un cost pozitiv i c dorim s gsim o soluie aproape optimal. n funcie de problem, o soluie
optimal ar putea denit ca ind una cu cost posibil maxim sau una cu cost posibil minim;
problema poate o problem de maximizare sau de minimizare.
Spunem c un algoritm de aproximare pentru problem are marginea raportului de (n)
dac, pentru orice date de intrare de dimensiune n, costul C al soluiei produse de algoritmul de
aproximare se abate cu un factor de (n) de costul C

al unei soluii optimale:


max

C
C

,
C

(n) (37.1)
Aceast deniie este valabil att pentru problemele de minimizare ct i de maximizare.
Pentru o problem de maximizare, 0 < C C

, i raportul C

/C produce factorul cu care costul


soluiei optimale este mai mare dect costul soluiei aproximative. Similar, pentru o problem de
minimizare, 0 < C

C, i raportul C/C

produce factorul cu care costul soluiei aproximative


este mai mare dect costul soluiei optimale. Deoarece toate soluiile se presupun ca avnd
cost pozitiv, aceste rapoarte sunt totdeauna corect denite. Marginea raportului unui algoritm
de aproximare nu este niciodat mai mic dect 1, deoarece C/C

< 1 implic C

/C > 1. Un
algoritm optimal are marginea raportului egal cu 1, iar un algoritm de aproximare cu o margine
mare a raportului poate returna o soluie care este mult mai rea dect cea optimal.
Uneori, este mai convenabil s lucrm cu o msur a erorii relative. Pentru orice date de
intrare, eroarea relativ a algoritmului de aproximare este denit astfel:
[C C

[
C

,
unde, ca mai nainte, C

este costul unei soluii optimale, i C este costul soluiei produse


de algoritmul de aproximare. Eroarea relativ este ntotdeauna nenegativ. Un algoritm de
aproximare are o margine a erorii relative de (n) dac
[C C

[
C

(n). (37.2)
Capitolul 37 Algoritmi de aproximare 827
Din deniii, rezult c marginea erorii relative poate mrginit, ca funcie de marginea
raportului:
(n) (n) 1. (37.3)
(Pentru o problem de minimizare, aceasta este o egalitate, n timp ce pentru o problem de
maximizare avem (n) = ((n) 1)/(n), care satisface inegalitatea (37.3) deoarece (n) 1.)
Pentru multe probleme au fost dezvoltai algoritmi de aproximare cu o margine a raportului
x, independent de n. Pentru astfel de probleme, utilizm notaia mai simpl sau , indicnd
independena de n.
Pentru unele probleme, nu s-au putut realiza algoritmi de aproximare n timp polinomial cu
marginea raportului x. Pentru astfel de probleme, cel mai bun lucru pe care l putem face este
s permitem creterea marginii raportului ca o funcie de dimensiunea n a datelor de intrare. Un
exemplu de astfel de probleme este problema de acoperire a mulimii, prezentat n seciunea
37.3.
Unele probleme NP-complete permit construirea unor algoritmi de aproximare care pot atinge
margini ale raportului din ce n ce mai mici (sau, echivalent, margini ale erorii relative din ce n
ce mai mici) prin utilizarea unui timp de calcul din ce n ce mai mare. Adic, exist un echilibru
ntre timpul de calcul i calitatea aproximrii. Un exemplu este problema sumei submulimii,
studiat n seciunea 37.4. Aceast situaie este sucient de important pentru a merita un nume
al ei.
O schem de aproximare pentru o problem de optimizare este un algoritm de aproximare
care are ca date de intrare nu doar o instan a problemei, ci i o valoare > 0, astfel nct,
pentru orice xat, schema este un algoritm de aproximare cu marginea erorii relative egal cu
. Spunem c o schem de aproximare este o schem de aproximare n timp polinomial
dac, pentru orice > 0 xat, schema se execut ntr-un timp polinomial n dimensiunea n a
instanei sale de intrare.
Timpul de execuie a unei scheme de aproximare n timp polinomial nu ar trebui s creasc
prea repede pe msur ce scade. Ideal ar ca dac scade cu un factor constant, timpul de
execuie pentru a atinge aproximarea dorit s nu creasc cu mai mult dect un factor constant.
Cu alte cuvinte, am dori ca timpul de execuie s e polinomial att n 1/ ct i n n.
Spunem c o schem de aproximare este o schem de aproximare n timp complet
polinomial dac timpul su de execuie este polinomial att n 1/ ct i n dimensiunea n
a instanei de intrare, unde este marginea erorii relative a schemei. De exemplu, schema ar
putea avea un timp de execuie de (1/)
2
n
3
. Cu o astfel de schem, orice scdere cu un factor
constant a lui se poate obine cu o cretere cu un factor constant corespunztoare a timpului
de execuie.
Rezumatul capitolului
Primele trei seciuni ale acestui capitol prezint exemple de algoritmi de aproximare n timp
polinomial pentru probleme NP-complete, iar ultima seciune prezint o schem de aproximare n
timp complet polinomial. Seciunea 37.1 ncepe cu un studiu al problemei acoperirii cu vrfuri, o
problem NP-complet de minimizare care are un algoritm de aproximare cu marginea raportului
egal cu 2. Seciunea 37.2 prezint un algoritm de aproximare cu marginea raportului egal
cu 2, pentru cazul problemei comis-voiajorului, n care funcia de cost satisface inegalitatea
triunghiului. De asemenea, se arat c, fr inegalitatea triunghiului, un algoritm de -aproximare
828 Capitolul 37 Algoritmi de aproximare
nu poate exista dect dac P = NP. n seciunea 37.3, artm cum poate folosit o metod
greedy ca algoritm de aproximare ecient pentru problema acoperirii mulimii, obinnd o
acoperire al crei cost este n cel mai defavorabil caz cu un factor logaritmic mai mare dect
costul optimal. Finalmente, seciunea 37.4 prezint o schem de aproximare n timp complet
polinomial pentru problema sumei submulimii.
37.1. Problema acoperirii cu vrfuri
Problema acoperirii cu vrfuri a fost denit i i s-a demonstrat NP-completitudinea n
seciunea 36.5.2. O acoperire cu vrfuri a unui graf neorientat G = (V, E) este o submulime
V
t
V , astfel nct, dac (u, v) este o muchie din G, atunci e u V
t
, e v V
t
(e ambele).
Dimensiunea unei acoperiri cu vrfuri este dat de numrul vrfurilor pe care le conine.
Problema acoperirii cu vrfuri const n a gsi o acoperire cu vrfuri de dimensiune
minim pentru un graf neorientat dat. Acoperirea cu vrfuri avnd aceast proprietate o numim
acoperire cu vrfuri optimal. Aceast problem este NP-dicil, deoarece problema de
decizie asociat este NP-complet, conform teoremei 36.12.
Chiar dac o acoperire cu vrfuri optimal pentru un graf G poate dicil de gsit, o acoperire
cu vrfuri aproape optimal nu este prea dicil de gsit. Urmtorul algoritm de aproximare
primete ca intrare un graf neorientat G i returneaz o acoperire cu vrfuri a crei dimensiune
este, cu siguran, nu mai mult de dou ori mai mare dect dimensiunea unei acoperiri cu vrfuri
optimale.
Acoperire-Cu-Vrfuri-Aprox(G)
1: C
2: E
t
E[G]
3: ct timp E
t
= execut
4: e (u, v) o muchie arbitrar din E
t
5: C C u, v
6: terge din E
t
ecare muchie incident cu u sau cu v
7: returneaz C
Figura 37.1 ilustreaz modul de funcionare al algoritmului Acoperire-Cu-Vrfuri-
Aprox. Variabila C conine acoperirea cu vrfuri n curs de construire. Linia 1 iniializeaz
variabila C cu mulimea vid. Linia 2 atribuie variabilei E
t
o copie a mulimii de vrfuri E[G]
a grafului. Bucla din liniile 36 alege, n mod repetat, o muchie (u, v) din E
t
, adaug capetele
sale u i v la C i terge toate muchiile din E
t
care sunt acoperite e de u, e de v. Timpul de
execuie al acestui algoritm este O(E) i utilizeaz o structur de date corespunztoare pentru
reprezentarea lui E
t
.
Teorema 37.1 Acoperire-Cu-Vrfuri-Aprox are marginea raportului de 2.
1
Demonstraie. Mulimea de vrfuri C returnat de Acoperire-Cu-Vrfuri-Aprox este
o acoperire cu vrfuri, deoarece algoritmul cicleaz pn cnd ecare muchie din E[G] este
acoperit de un vrf oarecare din C.
Soluia furnizat de algoritm conine de cel mult dou ori mai multe vrfuri dect soluia optim. n.t.
37.1. Problema acoperirii cu vrfuri 829
Figura 37.1 Modul de operare al algoritmului Acoperire-Cu-Vrfuri-Aprox. (a) Graful de intrare
G, care are 7 vrfuri i 8 muchii. (b) Muchia (b, c), indicat ngroat, este prima muchie aleas de
Acoperire-Cu-Vrfuri-Aprox. Vrfurile b i c, indicate cu haur, sunt adugate acoperirii cu vrfuri
C n curs de creare. Muchiile (a, b), (c, e) i (c, d), indicate cu linie ntrerupt, sunt terse deoarece sunt
acoperite de unele din vrfurile din C. (c) Muchia (e, f) este adugat la C. (d) Muchia (d, g) este
adugat la C. (e) Mulimea C, care este acoperirea cu vrfuri produs de Acoperire-Cu-Vrfuri-
Aprox, conine cele ase vrfuri b, c, d, e, f, g. (f ) Acoperirea cu vrfuri optimal pentru aceast
problem conine doar trei vrfuri: b, d i e.
Pentru a vedea c Acoperire-Cu-Vrfuri-Aprox returneaz o acoperire cu vrfuri care
este cel mult de dou ori mai mare dect o acoperire optimal, s notm cu A mulimea vrfurilor
alese n linia 4 a algoritmului. Nu exist n A dou muchii care s aib un capt comun, deoarece,
o dat ce n linia 4 am ales o muchie, toate celelalte muchii care sunt incidente cu unul din capetele
muchiei alese sunt terse din E
t
la linia 6. Prin urmare, ecare execuie a liniei 5 adaug dou
noi vrfuri la mulimea C, i [C[ = 2[A[. Pentru a acoperi muchiile mulimii A, orice acoperire cu
vrfuri n particular o acoperire optimal C

trebuie s includ cel puin unul din capetele


ecrei muchii din A. Deoarece n A nu exist dou muchii care s partajeze acelai capt, nici
un vrf din mulime nu este incident cu mai mult de o muchie din A. Prin urmare [A[ [C

[ i
[C[ 2[C

[, ceea ce demonstreaz teorema.


830 Capitolul 37 Algoritmi de aproximare
Exerciii
37.1-1 Dai un exemplu de graf pentru care Acoperire-Cu-Vrfuri-Aprox genereaz
ntotdeauna o soluie suboptimal.
37.1-2 Profesorul Nixon propune urmtoarea euristic pentru rezolvarea problemei acoperirii
cu vrfuri. Se selecteaz, n mod repetat, un vrf avnd gradul cel mai mare i se terg toate
muchiile sale incidente. Dai un exemplu pentru a arta c euristica profesorului nu are marginea
raportului egal cu 2.
37.1-3 Dai un algoritm greedy ecient care gsete n timp liniar o acoperire cu vrfuri optimal
pentru un arbore.
37.1-4 Din demonstraia teoremei 36.12, tim c problema acoperirii cu vrfuri i problema
NP-complet a clicii sunt complementare n sensul c o acoperire cu vrfuri este complementul
unei clici de dimensiune maxim n graful complementar. Implic aceast relaie faptul c exist
un algoritm de aproximare pentru problema clicii cu marginea raportului constant? Justicai
rspunsul.
37.2. Problema comis-voiajorului
n problema comis-voiajorului, introdus n seciunea 36.5.5, se d un graf neorientat complet,
G = (V, E), care are un cost ntreg nenegativ c(u, v) asociat ecrei muchii (u, v) E. Trebuie
s gsim un ciclu hamiltonian (un tur) de cost minim al lui G. Ca o extensie a notaiei noastre,
s notm cu c(A) costul total al muchiilor submulimii A E:
c(A) =

(u,v)A
c(u, v).
n multe situaii practice, este mai convenabil s ne deplasm direct dintr-un loc u ntr-un loc
w; deplasarea printr-un punct intermediar v nu poate mai puin costisitoare. Cu alte cuvinte,
reducerea unui punct intermediar nu duce niciodat la creterea costului. Pentru a formaliza
aceast noiune, vom spune c funcia de cost c satisface inegalitatea triunghiului dac,
pentru toate vrfurile u, v, w V , are loc
c(u, w) c(u, v) +c(v, w).
Inegalitatea triunghiului este natural i, n multe aplicaii, este satisfcut automat. De
exemplu, dac vrfurile grafului sunt puncte din plan i costul deplasrii ntre dou puncte
este distana euclidian uzual dintre acestea, atunci inegalitatea triunghiului este satisfcut.
Aa cum arat exerciiul 37.2-1, introducerea unei restricii asupra funciei de cost, astfel
nct aceasta s satisfac inegalitatea triunghiului, nu altereaz NP-completitudinea problemei
comis-voiajorului. Astfel, este puin probabil s putem gsi un algoritm n timp polinomial
pentru rezolvarea cu exactitate a acestei probleme. Prin urmare vom cuta algoritmi buni de
aproximare.
n seciunea 37.2.1 examinm un algoritm de aproximare pentru problema comis-voiajorului
cu inegalitatea triunghiului i care are o margine a raportului egal cu 2. n seciunea 37.2.2
artm c fr inegalitatea triunghiului un algoritm de aproximare cu margine constant a
raportului exist numai dac P = NP.
37.2. Problema comis-voiajorului 831
37.2.1. Problema comis-voiajorului cu inegalitatea triunghiului
Urmtorul algoritm determin un tur aproape optimal al unui graf neorientat G folosind
algoritmul arborelui de acoperire minim AAM-Prim din seciunea 24.2. Vom vedea c, n
situaia n care funcia de cost satisface inegalitatea triunghiului, turul returnat de acest algoritm
nu este mai lung dect dublul lungimii drumului optimal.
PCV-Tur-Aprox(G, c)
1: selecteaz un vrf r V [G] ca vrf rdcin
2: folosind algoritmul AAM-Prim(G, c, r) determin un arbore de acoperire minim T pentru
G, avnd rdcina r
3: e L lista vrfurilor lui T parcurse n preordine
4: returneaz ciclul hamiltonian H care conine vrfurile n ordinea din L
S ne reamintim, din seciunea 13.1, c o parcurgere n preordine viziteaz n mod recursiv
ecare vrf al arborelui i listeaz un vrf n momentul n care a fost ntlnit prima dat, nainte
ca oricare dintre ii si s e vizitat.
Figura 37.2 ilustreaz modul de operare al algoritmului PCV-Tur-Aprox. Partea (a) a
gurii arat mulimea de vrfuri dat i partea (b) arat arborele de acoperire minim T avnd
vrful rdcin a, produs de algoritmul AAM-Prim. Partea (c) arat modul n care vrfurile
sunt vizitate de o parcurgere n preordine a lui T i partea (d) prezint turul returnat de PCV-
Tur-Aprox. Partea (e) prezint un tur optimal, care este cu aproximativ 23% mai scurt.
Timpul de execuie al PCV-Tur-Aprox este (E) = (V
2
), deoarece graful de intrare
este un graf complet (vezi exerciiul 24.2-2). Vom arta, acum, c, dac funcia de cost pentru
o instan a problemei comis-voiajorului satisface inegalitatea triunghiului, atunci PCV-Tur-
Aprox returneaz un tur al crui cost nu este mai mare dect dublul costului unui tur optimal.
Teorema 37.2 PCV-Tur-Aprox este un algoritm de aproximare pentru problema comis-
voiajorului cu inegalitatea triunghiului i are o margine a raportului egal cu 2.
Demonstraie. Fie H

un tur optimal pentru mulimea de vrfuri dat. Un enun echivalent


cu enunul teoremei este c c(H) 2c(H

), unde H este turul returnat de PCV-Tur-Aprox.


Deoarece prin tergerea oricrei muchii dintr-un tur obinem un arbore de acoperire, dac T este
un arbore de acoperire minim pentru mulimea de vrfuri dat, atunci
c(T) C(H

) (37.4)
Un drum complet al lui T listeaz vrfurile n momentul n care acestea sunt vizitate prima
dat i oricnd se revine la ele dup vizitarea unui subarbore. S notm acest drum cu W.
Drumul complet, pentru exemplul nostru produce ordinea
a, b, c, b, h, b, a, d, e, f, e, g, e, d, a.
Deoarece drumul complet traverseaz ecare muchie a lui T exact de dou ori, avem
c(W) = 2c(T). (37.5)
Ecuaiile (37.4) i (37.5) implic
c(W) 2c(H

) (37.6)
832 Capitolul 37 Algoritmi de aproximare
Figura 37.2 Modul de operare al algoritmului PCV-Tur-Aprox. (a) Mulimea de puncte dat,
situat pe o gril avnd coordonatele ntregi. De exemplu, f este o unitate la dreapta i dou uniti
mai sus dect h. Ca funcie de cost ntre dou puncte, este utilizat distana euclidian uzual. (b) Un
arbore de acoperire minim T a acestor puncte, aa cum este determinat de AAM-Prim. Vrful a este
vrf rdcin. Vrfurile sunt etichetate ntmpltor, astfel nct ele sunt adugate n ordine alfabetic
arborelui principal construit de AAM-Prim. (c) Un drum prin T, care ncepe n a. Un drum complet al
arborelui viziteaz nodurile n ordinea a, b, c, b, h, b, a, d, e, f, e, g, e, d, a. O parcurgere n preordine a
lui T listeaz un vrf doar prima dat cnd este ntlnit i produce ordinea a, b, c, h, d, e, f, g. (d) Un
tur al vrfurilor, obinut prin vizitarea vrfurilor n ordinea dat de parcurgerea n preordine. Acesta este
turul H returnat de PCV-Tur-Aprox. Costul su total este aproximativ 19.074. (e) Un tur optimal
H

pentru mulimea de vrfuri dat. Costul su total este aproximativ 14.715.


i, deci, costul lui W este mai mic dect dublul costului unui tur optimal.
Din pcate, W, n general, nu este un tur, deoarece viziteaz unele vrfuri de mai multe ori.
Totui, pe baza inegalitii triunghiului, putem terge din W o vizit a oricrui vrf, fr ca
prin aceasta costul s creasc. (Dac un vrf v este ters din W ntre vizitele vrfurilor u i w,
ordinea rezultat precizeaz deplasarea direct de la u la w.) Prin aplicarea acestei operaii n
mod repetat, putem terge din W toate apariiile vrfurilor, cu excepia primelor apariii. n
exemplul nostru aceasta produce ordinea
a, b, c, h, d, e, f, g.
Aceast ordine este aceeai cu cea obinut printr-o parcurgere n preordine a arborelui T. Fie H
37.2. Problema comis-voiajorului 833
ciclul corespunztor acestei parcurgeri n preordine. Acesta este un ciclu hamiltonian, deoarece
ecare vrf este vizitat exact o singur dat. De fapt este ciclul determinat de PCV-Tur-Aprox.
Deoarece H este obinut prin tergerea vrfurilor din drumul complet W, avem
c(H) c(W). (37.7)
Combinarea inegalitilor (37.6) i (37.7) ncheie demonstraia.
n poda marginii bune a raportului, asigurat de teorema 37.2, algoritmul PCV-Tur-
Aprox nu reprezint de obicei o soluie practic pentru aceast problem. Exist i ali algoritmi
de aproximare care de obicei se comport mult mai bine n practic (vezi referinele de la sfritul
capitolului).
37.2.2. Problema general a comis-voiajorului
Dac renunm la presupunerea c funcia de cost c satisface inegalitatea triunghiului, nu
mai pot gsite tururi aproximative bune n timp polinomial dect dac P = NP.
Teorema 37.3 Dac P = NP i 1, atunci, pentru problema general a comis-voiajorului,
nu exist un algoritm de aproximare n timp polinomial cu marginea raportului egal cu .
Demonstraie. Demonstraia se face prin reducere la absurd. S presupunem contrariul
concluziei, i anume c exist un anumit numr 1 astfel nct exist un algoritm de
aproximare A n timp polinomial, care are marginea raportului egal cu . Fr a pierde
generalitatea, presupunem c este numr ntreg. Dac este necesar, l rotunjim n sus. Vom arta
cum s folosim A pentru a rezolva n timp polinomial instane ale problemei ciclului hamiltonian
(denit n seciunea 36.5.5). Conform teoremei 36.14, problema ciclului hamiltonian este NP-
complet. Ca urmare, conform teoremei 36.4, rezolvarea ei n timp polinomial implic faptul c
P = NP.
Fie G = (V, E) o instan a problemei ciclului hamiltonian. Dorim s determinm, n
mod ecient, dac G conine un ciclu hamiltonian. Pentru aceasta, vom utiliza algoritmul de
aproximare A. Transformm G ntr-o instan a problemei comis-voiajorului, dup cum urmeaz.
Fie G
t
= (V, E
t
) graful complet al lui V , adic
E
t
= (u, v)[u, v V, u = v.
Atribuim cte un cost ntreg ecrei muchii din E
t
dup cum urmeaz:
c(u, v) =

1 dac (u, v) E,
[V [ + 1 altfel.
Folosind o reprezentare a lui G, reprezentri ale lui G
t
i c pot create n timp polinomial n
[V [ i [E[.
Acum, s considerm problema comis-voiajorului (G
t
, c). Dac graful original G are un ciclu
hamiltonian H, atunci funcia de cost c atribuie ecrei muchii a lui H un cost egal cu 1, i,
astfel, (G
t
, c) conine un tur de cost [V [. Pe de alt parte, dac G nu conine un ciclu hamiltonian,
atunci orice tur al lui G
t
trebuie s foloseasc unele din muchiile care nu sunt n E. Dar orice
tur care folosete o muchie din afara lui E are un cost cel puin egal cu
([V [ + 1) + ([V [ 1) > [V [.
834 Capitolul 37 Algoritmi de aproximare
Deoarece muchiile din afara lui G sunt att de costisitoare, exist o distan mare ntre costul
unui tur care este ciclu hamiltonian n G (cost [V [) i costul oricrui alt tur (cost superior lui
[V [).
Ce se ntmpl dac aplicm algoritmul de aproximare A problemei comis-voiajorului (G
t
, c)?
Deoarece A garanteaz returnarea unui tur de cost nu mai mult dect de ori superior costului
unui tur optimal, dac G conine un ciclu hamiltonian, atunci A trebuie s l returneze. Dac
G nu are ciclu hamiltonian, atunci A returneaz un tur de cost superior lui [V [. Prin urmare,
putem folosi algoritmul A pentru rezolvarea problemei ciclului hamiltonian n timp polinomial.
Exerciii
37.2-1 Artai cum se poate transforma n timp polinomial o instan a problemei comis-
voiajorului ntr-o alt instan a crei funcie de cost satisface inegalitatea triunghiului. Cele
dou instane trebuie s aib aceeai mulime de tururi optimale. Presupunnd c P = NP,
explicai de ce o astfel de transformare n timp polinomial nu contrazice teorema 37.3.
37.2-2 Considerai urmtoarea euristic a celui mai apropiat punct pentru construirea
unui tur aproximativ al comis-voiajorului. ncepei cu un ciclu trivial care const dintr-un singur
vrf ales arbitrar. La ecare pas, identicai vrful u care nu aparine ciclului, dar a crui distan
fa de orice vrf din ciclu este minim. Modicai ciclul astfel nct el s conin vrful u (inserai
vrful u imediat dup vrful v). S notm cu v vrful din ciclu care este cel mai apropiat de u.
Repetai procedeul pn cnd toate vrfurile aparin ciclului. Demonstrai c aceast euristic
returneaz un tur al crui cost total nu este mai mare dect dublul costului unui tur optimal.
37.2-3 Problema comis-voiajorului strmtorat const n aarea unui ciclu hamiltonian,
astfel nct lungimea celei mai mari muchii din ciclu s e minimizat. Presupunnd c funcia de
cost satisface inegalitatea triunghiului, artai c, pentru aceast problem, exist un algoritm
de aproximare n timp polinomial cu marginea raportului egal cu 3. ( Artai, n mod
recursiv, c putem vizita exact o dat toate nodurile dintr-un arbore de acoperire parcurgnd
un drum complet n arbore i srind peste unele noduri, dar fr s se sar peste mai mult de
dou noduri intermediare consecutive.)
37.2-4 S presupunem c vrfurile unei instane a problemei comis-voiajorului sunt puncte din
plan i c funcia de cost c(u, v) este distana euclidian ntre punctele u i v. Artai c un tur
optimal nu se autointersecteaz.
37.3. Problema acoperirii mulimii
Problema acoperirii mulimii este o problem de optimizare care modeleaz multe probleme
de selecie a resurselor i care generalizeaz problema NP-complet a acoperirii cu vrfuri i este,
prin urmare, i NP-dicil. Totui, algoritmul de aproximare creat pentru problema acoperirii
cu vrfuri nu se aplic i aici, i, prin urmare, avem nevoie s ncercm alte abordri. Vom
examina o euristic greedy simpl cu o margine logaritmic a raportului. Adic, pe msur ce
dimensiunea instanei devine mai mare, dimensiunea soluiei aproximative poate crete, relativ
37.3. Problema acoperirii mulimii 835
Figura 37.3 O instan (X, T) a problemei acoperirii mulimii, unde X const din cele 12 puncte negre
i T = S
1
, S
2
, S
3
, S
4
, S
5
, S
6
. O mulime de acoperire de dimensiune minim este ( = S
3
, S
4
, S
5
.
Algoritmul greedy produce o acoperire de dimensiune 4 prin selectarea, n ordine, a mulimilor S
1
, S
4
,
S
5
i S
3
.
la dimensiunea unei soluii optimale. Deoarece funcia logaritm crete destul de ncet, algoritmul
de aproximare poate produce rezultate utile.
O instan (X, T) a problemei acoperirii mulimii const dintr-o mulime nit X i o
familie T de submulimi ale lui X, astfel nct ecare element din X aparine, cel puin, unei
submulimi din T:
X =
SJ
S.
Spunem c o submulime S T acoper elementele sale. Problema este de a gsi o submulime
de dimensiune minim ( T ai crei membri acoper toat mulimea X:
X =
Sc
S. (37.8)
Spunem c orice ( care satisface ecuaia (37.8) acoper pe X. Figura 37.3 ilustreaz problema.
Problema acoperirii mulimii este o abstractizare a multor probleme combinatoriale uzuale.
De exemplu, s presupunem c X reprezint o mulime de deprinderi necesare pentru a rezolva
o problem i c avem la dispoziie o mulime de oameni pentru a lucra asupra problemei.
Dorim s formm un comitet care s conin ct mai puini oameni, astfel nct, pentru ecare
deprindere solicitat din X, exist un membru al comitetului care s aib acea deprindere. n
versiunea decizional a problemei acoperirii mulimii ntrebm dac exist sau nu o acoperire
de dimensiune cel mult k, unde k este un parametru adiional specicat n instana problemei.
Versiunea decizional a problemei este NP-complet, aa cum se cere s demonstrai n exerciiul
37.3-2.
Un algoritm de aproximare greedy
Metoda greedy selecteaz, la ecare pas, mulimea S care acoper cele mai multe elemente
rmase nc neacoperite.
836 Capitolul 37 Algoritmi de aproximare
Acoperire-Mulime-Greedy(X, T)
1: U X
2: C
3: ct timp U = execut
4: selecteaz un S T care maximizeaz [S U[
5: U U S
6: ( ( S
7: returneaz (
n exemplul din gura 37.3, algoritmul Acoperire-Mulime-Greedy adaug la mulimea
( mulimile S
1
, S
4
, S
5
i S
3
, n aceast ordine.
Algoritmul funcioneaz dup cum urmeaz. Mulimea U conine, la ecare pas, mulimea
elementelor rmase neacoperite. Mulimea ( conine acoperirea n curs de construire. Linia 4
este pasul n care se ia decizia greedy. Este aleas o submulime S care acoper un numr ct
mai mare posibil de elemente neacoperite (cu legturile rupte n mod arbitrar). Dup ce S este
selectat, elementele sale sunt terse din U i S este adugat la (. Cnd algoritmul se termin,
mulimea ( conine o subfamilie a lui T care l acoper pe X.
Algoritmul Acoperire-Mulime-Greedy poate implementat cu uurin pentru a se
executa n timp polinomial n [X[ i [T[. Deoarece numrul de iteraii ale buclei din liniile 36
este cel mult min([X[, [T[) i corpul buclei poate implementat pentru a se executa n timpul
O([X[[T[), exist o implementare care se execut n timpul O([X[[T[ min([X[, [T[)). Exerciiul
37.3-3 cere un algoritm n timp liniar.
Analiz
Vom arta c algoritmul greedy returneaz o acoperire care nu este mult prea mare fa de
o acoperire optimal. Pentru convenien, n acest capitol vom nota cu H(d) al d-lea numr
armonic H
d
=

d
i=1
1/i (vezi seciunea 3.1).
Teorema 37.4 Algoritmul Acoperire-Mulime-Greedy are o margine a raportului egal cu
H(max[S[ : S T).
Demonstraie. Demonstraia urmrete atribuirea unui cost ecrei mulimi selectate de
algoritm, distribuirea acestui cost asupra elementelor acoperite pentru prima dat i apoi
utilizarea acestor costuri pentru a deduce relaia dorit ntre dimensiunea unei acoperiri optimale
(

i dimensiunea acoperirii ( returnat de algoritm. Fie S


i
a i-a mulime selectat de algoritmul
Acoperire-Mulime-Greedy; algoritmul induce un cost egal cu 1 cnd adaug pe S
i
la (.
mprtiem acest cost al selectrii lui S
i
n mod echilibrat ntre elementele acoperite pentru
prima dat de S
i
. Fie c
x
costul alocat elementului x, pentru ecare x X. Fiecare element
primete un cost o singur dat, cnd este acoperit pentru prima dat. Dac x este acoperit
pentru prima dat de S
i
, atunci
c
x
=
1
[S
i
(S
1
S
2
S
i1
)[
.
37.3. Problema acoperirii mulimii 837
Algoritmul gsete o soluie ( de cost total [([ i acest cost a fost mprtiat ntre elementele lui
X. Prin urmare, deoarece acoperirea optimal (

acoper, de asemenea, pe X, avem


[([ =

xX
c
x

Sc

xS
c
x
. (37.9)
Restul demonstraiei se bazeaz pe urmtoarea inegalitate, pe care o vom demonstra pe scurt.
Pentru orice mulime S aparinnd familiei T,

xS
c
x
H([S[). (37.10)
Din inegalitile (37.9) i (37.10) urmeaz c
[([

Sc

H([S[) [(

[ H(max[S[ : S T),
ceea ce demonstreaz teorema. Astfel, rmne de demonstrat inegalitatea (37.10). Pentru orice
mulime S T i i = 1, 2, . . . , [([, e
u
i
= [S (S
1
S
2
S
i
)[
numrul de elemente ale lui S care rmn neacoperite dup ce S
1
, S
2
, . . . , S
i
au fost selectate
de algoritm. Denim u
0
= [S[ ca reprezentnd numrul de elemente din S iniial neacoperite.
Fie k cel mai mic indice astfel nct u
k
= 0. Prin urmare, ecare element din S este acoperit de
ctre cel puin una din mulimile S
1
, S
2
, . . . , S
k
. Atunci, u
i1
u
i
i u
i1
u
i
elemente din S
sunt acoperite pentru prima dat de S
i
, pentru i = 1, 2, . . . , k. Astfel,

xS
c
x
=
k

i=1
(u
i1
u
i
)
1
[S
i
(S
1
S
2
S
i1
)[
.
Observm c
[S
i
(S
1
S
2
S
i1
)[ [S (S
1
S
2
S
i1
)[ = u
i1
,
deoarece selecia greedy S
i
garanteaz c S nu poate acoperi mai multe elemente noi dect S
i
(n caz contrar, S ar fost selectat n locul lui S
i
). Prin urmare obinem

xS
c
x

k

i=1
(u
i1
u
i
)
1
u
i1
.
Pentru ntregii a i b, unde a < b, avem
H(b) H(a) =
b

i=a+1
1/i (b a)
1
b
.
Utiliznd aceast inegalitate, obinem suma telescopic

xS
c
x

k

i=1
(H(u
i1
) H(u
i
))
= H(u
0
) H(u
k
) = H(u
0
) H(0) = H(u
0
) = H([S[),
deoarece H(0) = 0. Aceasta ncheie demonstraia inegalitii (37.10).
838 Capitolul 37 Algoritmi de aproximare
Corolarul 37.5 Acoperire-Mulime-Greedy are o margine a raportului de (ln[X[ + 1).
Demonstraie. Se folosete inegalitatea (3.12) i teorema 37.4.
n unele aplicaii, max[S[ : S T este o constant mic, i, astfel, soluia returnat de
algoritmul Acoperire-Mulime-Greedy este mai mare cel mult de o constant de ori dect
acoperirea optimal. O astfel de aplicaie apare n situaia n care aceast euristic este folosit
pentru obinerea unei acoperiri cu vrfuri aproximative pentru un graf ale crui vrfuri au un
grad de cel mult 3. n acest caz, soluia gsit de Acoperire-Mulime-Greedy este mai mare,
cel mult, de H(3) = 11/6 ori dect soluia optim, o asigurare de performan care este uor
superioar celei a algoritmului Acoperire-Cu-Vrfuri-Aprox.
Exerciii
37.3-1 S considerm ecare din urmtoarele cuvinte ca mulime de litere: {arid, dash, drain,
heard, lost, nose, shun, slate, snare, thread}. Artai ce acoperire produce Acoperire-
Mulime-Greedy cnd sunt rupte legturile n favoarea cuvntului care apare primul n
dicionar.
37.3-2 Artai, prin reducere, folosind problema acoperirii cu vrfuri, c versiunea decizional
a problemei de acoperire a mulimii este NP-complet.
37.3-3 Artai cum se implementeaz Acoperire-Mulime-Greedy, astfel nct s se execute
n timpul O(

SJ
[S[).
37.3-4 Artai c urmtoarea form mai slab a teoremei 37.4 este trivial adevrat:
[([ [(

[ max[S[ : S T.
37.3-5 Creai o familie de instane ale problemei acoperirii mulimii care s demonstreze c
algoritmul Acoperire-Mulime-Greedy poate returna un numr de soluii diferite care este
funcie exponenial de dimensiunea instanei. (Din faptul c legturile sunt rupte n mod diferit
n selecia lui S, din linia 4, rezult soluii diferite.)
37.4. Problema sumei submulimii
O instan a problemei sumei submulimii este o pereche (S, t) unde S este o mulime
x
1
, x
2
, . . . , x
n
de ntregi pozitivi i t este un ntreg pozitiv. Se pune problema dac exist
o submulime a lui S pentru care suma elementelor s e exact valoarea t. Aceast problem
este NP-complet (vezi seciunea 36.5.3).
n aplicaii practice, apare problema de optimizare asociat cu aceast problem de decizie.
n problema de optimizare, dorim s gsim o submulime a mulimii x
1
, x
2
, . . . , x
n
a crei
sum este ct mai mare posibil, dar nu mai mare dect t. De exemplu, am putea avea un camion
care nu poate transporta mai mult de t kilograme i n cutii, cutia i cntrind x
i
kilograme.
Dorim s umplem camionul ct mai mult, dar fr s depim greutatea limit dat.
n aceast seciune, prezentm un algoritm n timp exponenial pentru aceast problem
de optimizare i, apoi, vom arta cum se poate modica algoritmul, astfel nct s devin o
37.4. Problema sumei submulimii 839
schem de aproximare n timp polinomial. (S ne reamintim c o schem de aproximare n timp
polinomial are un timp de execuie polinomial n 1/ i n.)
Un algoritm n timp exponenial
Dac L este o list de ntregi pozitivi i x este un alt ntreg pozitiv, vom nota prin L+x lista
de ntregi construit pe baza listei L prin nsumarea ecrui element din L cu valoarea x. De
exemplu, dac L = '1, 2, 3, 5, 9`, atunci L + 2 = '3, 4, 5, 7, 11`. De asemenea, vom folosi aceast
notaie i pentru mulimi:
S +x = s +x : s S.
Folosim o procedur auxiliar Interclaseaz-Liste(L, L
t
) care returneaz lista sortat
obinut prin interclasarea listelor sortate date L i L
t
. La fel ca procedura Interclaseaz
folosit n seciunea 1.3.1, Interclaseaz-Liste se execut n timp O([L[ + [L
t
[). (Nu vom
prezenta aici pseudocodul pentru Interclaseaz-Liste.) Procedura Suma-Submulimii-
Exact are ca date de intrare o mulime S = x
1
, x
2
, . . . , x
n
i o valoare int t.
Suma-Submulimii-Exact(S, t)
1: n [S[
2: L
0
'0`
3: pentru i 1, n execut
4: L
i
Interclaseaz-Liste(L
i1
,L
i1
+x
i
)
5: terge din L
i
toate elementele mai mari dect t
6: returneaz cel mai mare element din L
n
Fie P
i
, mulimea tuturor valorilor care se pot obine prin selectarea unei submulimi (posibil
vide) a mulimii x
1
, x
2
, . . . , x
i
i nsumarea membrilor si. De exemplu, dac S = 1, 4, 5,
atunci
P
1
= 0, 1,
P
2
= 0, 1, 4, 5,
P
3
= 0, 1, 4, 5, 6, 9, 10.
Fiind dat identitatea
P
i
= P
i1
(P
i1
+x
i
) , (37.11)
putem demonstra, prin inducie dup i (vezi exerciiul 37.4-1), c lista L
i
este o list sortat
care conine toate elementele lui P
i
a cror valoare nu este mai mare dect t. Deoarece lungimea
lui L
i
poate cel mult 2
i
, Suma-Submulimii-Exact este, n general, un algoritm n timp
exponenial, dei este un algoritm n timp polinomial n cazurile speciale n care t este polinom
n [S[ sau toate numerele din S sunt mrginite de un polinom n [S[.
O schem de aproximare n timp complet polinomial
Pentru problema sumei submulimii putem deduce o schem de aproximare n timp complet
polinomial dac ltrm ecare list L
i
dup ce este creat. Folosim un parametru de ltrare ,
astfel nct 0 < < 1. A ltra o list L prin nseamn a terge din L ct mai multe elemente
840 Capitolul 37 Algoritmi de aproximare
este posibil, astfel nct, dac L
t
este rezultatul ltrrii lui L, atunci, pentru ecare element y
care a fost ters din L, exist un element z y n L
t
, astfel nct
y z
y

sau, echivalent,
(1 )y z y.
Astfel, ne putem gndi la z ca reprezentnd y n noua list L
t
. Fiecare y este reprezentat de
un z, astfel nct eroarea relativ a lui z, relativ la y, este cel mult . De exemplu, dac =0,1 i
L = '10, 11, 12, 15, 20, 21, 22, 23, 24, 29`,
atunci putem ltra L pentru a obine
L
t
= '10, 12, 15, 20, 23, 29`,
unde valoarea tears 11 este reprezentat de 10, valorile terse 21 i 22 sunt reprezentate de 20,
i valoarea tears 24 este reprezentat de 23. Este important s reinem c ecare element al
versiunii ltrate a listei este, de asemenea, un element al versiunii iniiale a listei. Filtrarea unei
liste poate micora, n mod dramatic, numrul elementelor din list, pstrnd, n acelai timp,
o valoare reprezentativ apropiat (i ceva mai mic) pentru ecare element ters din list.
Urmtoarea procedur ltreaz o list de intrare L = 'y
1
, y
2
, . . . , y
m
` n timpul (m),
presupunnd c L este sortat n ordine nedescresctoare. Rezultatul returnat de procedur
este o list ltrat, sortat.
Filtreaz(L, )
1: m [L[
2: L
t
'y
1
`
3: y
1
4: pentru i 2, m execut
5: dac < (1 )y
i
atunci
6: adaug y
i
la sfritul lui L
t
7: y
i
8: returneaz L
t
Elementele lui L sunt parcurse n ordine cresctoare, iar un numr este inserat n lista
returnat L
t
doar dac este primul element al lui L sau dac nu poate reprezentat de cel
mai recent numr inserat n L
t
.
Fiind dat procedura Filtreaz, putem construi schema noastr de aproximare dup cum
urmeaz. Aceast procedur primete, la intrare, o mulime S = x
1
, x
2
, . . . , x
n
format din n
ntregi (n ordine arbitrar), un ntreg int t i un parametru de aproximare , unde 0 < < 1.
37.4. Problema sumei submulimii 841
Suma-Submulimii-Aprox(S, t, )
1: n [S[
2: L
0
'0`
3: pentru i 1, n execut
4: L
i
Interclaseaz-Liste(L
i1
,L
i1
+x
i
)
5: L
i
Filtreaz(L
i
, /n)
6: terge din L
i
toate elementele mai mari dect t
7: e z cel mai mare element din L
n
8: returneaz z
Linia 2 iniializeaz lista L
0
la lista avnd elementul 0. Bucla din liniile 36 are efectul
calculrii lui L
i
ca list sortat, care conine o versiune ltrat corespunztor a mulimii P
i
,
din care toate elementele mai mari dect t au fost terse. Deoarece L
i
este creat din L
i1
,
trebuie s ne asigurm c ltrarea repetat nu produce prea mare inacuratee. Vom vedea c
Suma-Submulimii-Aprox returneaz o aproximaie corect, dac aceasta exist.
De exemplu, s presupunem c avem instana
L = '104, 102, 201, 101`
cu t = 308 i = 0, 20. Parametrul de ltrare este /4 = 0, 05. Suma-Submulimii-Aprox
calculeaz urmtoarele valori n liniile indicate:
linia 2: L
0
= '0`,
linia 4: L
1
= '0, 104`,
linia 5: L
1
= '0, 104`,
linia 6: L
1
= '0, 104`,
linia 4: L
2
= '0, 102, 104, 206`,
linia 5: L
2
= '0, 102, 206`,
linia 6: L
2
= '0, 102, 206`,
linia 4: L
3
= '0, 102, 201, 206, 303, 407`,
linia 5: L
3
= '0, 102, 201, 303, 407`,
linia 6: L
3
= '0, 102, 201, 303`,
linia 4: L
4
= '0, 101, 102, 201, 203, 302, 303, 404`,
linia 5: L
4
= '0, 101, 201, 302, 404`,
linia 6: L
4
= '0, 101, 201, 302`.
Algoritmul returneaz rspunsul z = 302, care se ncadreaz n eroarea de = 20% din
rspunsul optimal, 307 = 104 + 102 + 101; de fapt se ncadreaz n eroarea 2%.
Teorema 37.6 Suma-Submulimii-Aprox este o schem de aproximare n timp complet
polinomial pentru problema sumei submulimii.
Demonstraie. Operaiile de ltrare a lui L
i
din linia 5 i de tergere din L
i
a tuturor
elementelor mai mari dect t conserv proprietatea c ecare element al lui L
i
este, de asemenea,
842 Capitolul 37 Algoritmi de aproximare
membru al lui P
i
. Prin urmare, valoarea z returnat n linia 8 este, ntr-adevr, suma unei anumite
submulimi a lui S. Rmne s artm c nu este mai mic de (1) ori dect o soluie optimal.
(Notai c, deoarece problema sumei submulimii este o problem de maximizare, ecuaia (37.2)
este echivalent cu C

(1 ) C.) Trebuie, de asemenea, s artm c algoritmul se execut n


timp polinomial.
Pentru a arta c eroarea relativ a soluiei returnate este mic, s notm c, n momentul n
care lista L
i
este ltrat, introducem o eroare relativ de cel mult /n ntre valorile reprezentative
care rmn n L
i
i valorile de dinainte de ltrare. Prin inducie dup i, se poate arta c, pentru
ecare element y din P
i
nu mai mare dect t, exist un z L
i
, astfel nct
(1 /n)
i
y z y. (37.12)
Dac y

P
n
reprezint o soluie optimal a problemei sumei submulimii, atunci exist un
z L
n
, astfel nct
(1 /n)
n
y

z y

; (37.13)
cea mai mare valoare z de acest fel este valoarea returnat de Suma-Submulimii-Aprox.
Deoarece se poate arta c
d
dn

1

n

n
> 0,
funcia (1 /n)
n
crete n funcie de n, i, astfel, n > 1 implic
1 < (1 /n)
n
,
i de aici,
(1 )y

z.
Prin urmare, valoarea z returnat de Suma-Submulimii-Aprox nu este mai mic de 1 ori
dect soluia optimal y

.
Pentru a arta c aceasta este o schem de aproximare n timp complet polinomial, deducem
o margine a lungimii lui L
i
. Dup ltrare, dou elemente succesive z i z
t
din L
i
trebuie s
verice relaia z/z
t
> 1/(1 /n). Adic, ele trebuie s difere printr-un factor cel puin egal cu
1/(1 /n). Prin urmare, numrul elementelor din ecare L
i
este cel mult
log
1/(1/n)
t =
lnt
ln(1 /n)

nlnt

,
pe baza ecuaiei (2.10). Aceast margine este polinomial n numrul n de valori de intrare, n
numrul de bii lg t necesari pentru reprezentarea lui t i n 1/. Deoarece timpul de execuie al
procedurii Suma-Submulimii-Aprox este polinomial n lungimea lui L
i
, Suma-Submulimii-
Aprox este o schem de aproximare n timp complet polinomial.
Exerciii
37.4-1 Demonstrai ecuaia (37.11).
37.4-2 Demonstrai ecuaiile (37.12) i (37.13).
37.4-3 Cum ai modica schema de aproximare prezentat n aceast seciune pentru a gsi
o aproximare bun pentru cea mai mic valoare, nu mai mic dect t, i care este suma unei
submulimi a listei de intrare?
Probleme 843
Probleme
37-1 mpachetarea
S presupunem c se d o mulime de n obiecte, unde dimensiunea s
i
a celui de al i-lea obiect
satisface 0 < s
i
< 1. Dorim s mpachetm toate obiectele ntr-un numr minim de pachete
de dimensiune 1. Fiecare pachet poate conine orice submulime de obiecte avnd dimensiunea
total cel mult egal cu 1.
a. Demonstrai c problema determinrii numrului minim de pachete necesare este NP-
dicil. ( Reducei problema la problema sumei submulimii.)
Euristica primei potriviri ia ecare obiect, pe rnd, i l plaseaz n primul pachet n care
ncape. Fie S =

n
i=1
s
i
.
b. Argumentai c numrul optim de pachete necesare este cel puin S|.
c. Argumentai c euristica primei potriviri las, cel mult, un pachet plin mai puin dect pe
jumtate.
d. Demonstrai c numrul pachetelor folosite de euristica primei potriviri nu este niciodat
mai mare dect 2S|.
e. Demonstrai c euristica primei potriviri are marginea raportului egal cu 2.
f. Dai o implementare ecient a euristicii primei potriviri i analizai timpul de execuie al
acesteia.
37-2 Aproximarea dimensiunii unei clici maxime
Fie G = (V, E) un graf neorientat. Pentru orice k 1, denim G
(k)
graful neorientat (V
(k)
, E
(k)
),
unde V
(k)
este mulimea tuturor k-tuplelor ordonate de vrfuri din V , i E
(k)
este denit astfel
nct (v
1
, v
2
, . . . , v
k
) este adiacent cu (w
1
, w
2
, . . . , w
k
) dac i numai dac, pentru ecare i, 1
i k, e vrful v
i
este adiacent cu vrful w
i
n G, e v
i
= w
i
.
a. Demonstrai c dimensiunea clicii maxime din G
(k)
este egal cu puterea k a dimensiunii
clicii maxime din G.
b. Argumentai c, dac exist un algoritm de aproximare cu margine constant a raportului
pentru gsirea clicii maxime, atunci exist o schem de aproximare n timp complet
polinomial pentru aceeai problem.
37-3 Problema acoperirii ponderate a mulimii
S presupunem c generalizm problema acoperirii mulimii, astfel nct, ecrei mulimi S
i
din
familia T i se asociaz o pondere w
i
i c ponderea unei acoperiri ( este

S
i
c
w
i
. Dorim s
determinm o acoperire de pondere minim. (Seciunea 37.3 analizeaz cazul n care w
i
= 1
pentru toi i.)
Artai c euristica greedy de rezolvare a problemei acoperirii mulimii poate generalizat n
mod natural pentru a produce o soluie aproximativ pentru orice instan a problemei acoperirii
ponderate a mulimii. Artai c euristica astfel produs are o margine a raportului de H(d),
unde d este dimensiunea maxim a oricrei mulimi S
i
.
844 Capitolul 37 Algoritmi de aproximare
Note bibliograce
n domeniul algoritmilor de aproximare exist o literatur bogat. Ai putea ncepe cu studiul
lucrrii lui Garey i Johnson, [79]. Papadimitriou i Steiglitz [154] au, de asemenea, o prezentare
excelent a algoritmilor de aproximare. Lawler, Lenstra, Rinnooy Kan i Shmoys [133] prezint
o tratare extensiv a problemei comis-voiajorului.
Papadimitriou i Steiglitz atribuie algoritmul Acoperire-Cu-Vrfuri-Aprox lui F.
Gavril i M. Yannakakis. Algoritmul PCV-Tur-Aprox apare ntr-un articol excelent al lui
Rosenkrantz, Stearns i Lewis [170]. Teorema 37.3 se datoreaz lui Sahni i Gonzales [172].
Analiza euristicii greedy pentru problema acoperirii mulimii este modelat dup demonstraia
unui rezultat mai general, publicat de Chvtal [42]; acest rezultat de baz, aa cum este
prezentat aici, este datorat lui Johnson [113] i Lovsz [141]. Algoritmul Suma-Submulimii-
Aprox i analiza acestuia sunt uor modelate dup algoritmii de aproximare similari pentru
problema rucsacului i problema sumei submulimilor, de Ibarra i Kim [111].
Bibliograe
[1] Milton Abramowitz i Irene A. Stegun, editori. Handbook of Mathematical Functions. Dover, 1965.
[2] G. M. Adelson-Velskii i E. M. Landis. An algorithm for the organization of information. Soviet
Mathematics Doklady, 3:12591263, 1962.
[3] Leonard M. Adleman, Carl Pomerance, i Robert S. Rumely. On distinguishing prime numbers
from composite numbers. Annals of Mathematics, 117:173206, 1983.
[4] Alfred V. Aho, John E. Hopcroft, i Jerey D. Ullman. The Design and Analysis of Computer
Algorithms. Addison-Wesley, 1974.
[5] Alfred V. Aho, John E. Hopcroft, i Jerey D. Ullman. Data Structures and Algorithms. Addison-
Wesley, 1983.
[6] Ravindra K. Ahuja, Kurt Mehlhorn, James B. Orlin, i Robert E. Tarjan. Faster algorithms for
the shortest path problem. Technical Report 193, MIT Operations Research Center, 1988.
[7] Howard H. Aiken i Grace M. Hopper. The automatic sequence controlled calculator. n Brian
Randell, editor, The Origins of Digital Computers, p. 203222. Springer-Verlag, third edition,
1982.
[8] M. Ajtai, J. Komls, i E. Szemerdi. An O(nlog n) sorting network. n Proceedings of the Fifteenth
Annual ACM Symposium on Theory of Computing, p. 19, 1983.
[9] Selim G. Akl. The Design and Analysis of Parallel Algorithms. Prentice-Hall, 1989.
[10] Richard J. Anderson i Gary L. Miller. Deterministic parallel list ranking. n John H. Reif, editor,
1988 Aegean Workshop on Computing, volumul 319 din Lecture Notes in Computer Science, p.
8190. Springer-Verlag, 1988.
[11] Richard J. Anderson i Gary L. Miller. A simple randomized parallel algorithm for list-ranking.
Unpublished manuscript, 1988.
[12] Tom M. Apostol. Calculus, volumul 1. Blaisdell Publishing Company, second edition, 1967.
[13] A. J. Atrubin. A one-dimensional real-time iterative multiplier. IEEE Transactions on Electronic
Computers, EC-14(1): 394399, 1965.
[14] Sara Baase. Computer Algorithms: Introduction to Design and Analysis. Addison-Wesley, second
edition, 1988.
[15] Eric Bach. Private communication, 1989.
[16] Eric Bach. Number-theoretic algorithms. n Annual Review of Computer Science, volumul 4, p.
119172. Annual Reviews, Inc., 1990.
[17] R. Bayer. Symmetric binary B-trees: Data structure and maintenance algorithms. Acta
Informatica, 1:290306, 1972.
[18] R. Bayer i E. M. McCreight. Organization and maintenance of large ordered indexes. Acta
Informatica, 1(3):173189, 1972.
846 Bibliograe
[19] Paul W. Beame, Stephen A. Cook, i H. James Hoover. Log depth circuits for division and related
problems. SIAM Journal on Computing, 15(4):9941003, 1986.
[20] Pierre Beauchemin, Gilles Brassard, Claude Crpeau, Claude Goutier, i Carl Pomerance. The
generation of random numbers that are probably prime. Journal of Cryptology, 1:5364, 1988.
[21] Richard Bellman. Dynamic Programming. Princeton University Press, 1957.
[22] Richard Bellman. On a routing problem. Quarterly of Applied Mathematics, 16(1):8790, 1958.
[23] Michael Ben-Or. Lower bounds for algebraic computation trees. n Proceedings of the Fifteenth
Annual ACM Symposium on Theory of Computing, p. 8086, 1983.
[24] Jon L. Bentley. Writing Ecient Programs. Prentice-Hall, 1982.
[25] Jon L. Bentley. Programming Pearls. Addison-Wesley, 1986.
[26] Jon L. Bentley, Dorothea Haken, i James B. Saxe. A general method for solving divide-and-
conquer recurrences. SIGACT News, 12(3):3644, 1980.
[27] William H. Beyer, editor. CRC Standard Mathematical Tables. The Chemical Rubber Company,
1984.
[28] Patrick Billingsley. Probability and Measure. John Wiley & Sons, second edition, 1986.
[29] Manuel Blum, Robert W. Floyd, Vaughan Pratt, Ronald L. Rivest, i Robert E. Tarjan. Time
bounds for selection. Journal of Computer and System Sciences, 7(4):448461, 1973.
[30] Bla Bollobs. Random Graphs. Academic Press, 1985.
[31] J. A. Bondy i U. S. R. Murty. Graph Theory with Applications. American Elsevier, 1976.
[32] Robert S. Boyer i J. Strother Moore. A fast string-searching algorithm. Communications of the
ACM, 20(10):762772, 1977.
[33] Gilles Brassard i Paul Bratley. Algorithmics: Theory and Practice. Prentice-Hall, 1988.
[34] Richard P. Brent. The parallel evaluation of general arithmetic expressions. Journal of the ACM,
21 (2):201206, 1974.
[35] Richard P. Brent. An improved Monte Carlo factorization algorithm. BIT, 20(2):176184, 1980.
[36] Mark R. Brown. The Analysis of a Practical and Nearly Optimal Priority Queue. Tez de doctorat,
Computer Science Department, Stanford University, 1977. Technical Report STAN-CS-77600.
[37] Mark R. Brown. Implementation and analysis of binomial queue algorithms. SIAM Journal on
Computing, 7(3):298319, 1978.
[38] Arthur W. Burks, editor. Theory of Self Reproducing Automata. University of Illinois Press, 1966.
[39] Joseph J. F. Cavanagh. Digital Computer Arithmetic. McGraw-Hill, 1984.
[40] H. Cherno. A measure of asymptotic eciency for tests of a hypothesis based on the sum of
observations. Annals of Mathematical Statistics, 23:493507, 1952.
[41] Kai Lai Chung. Elementary Probability Theory with Stochastic Processes. Springer-Verlag, 1974.
[42] V. Chvtal. A greedy heuristic for the set-covering problem. Mathematics of Operations Research,
4(3):233235, 1979.
[43] V. Chvtal, D. A. Klarner, i D. E. Knuth. Selected combinatorial research problems. Technical
Report STAN-CS-72292, Computer Science Department, Stanford University, 1972.
[44] Alan Cobham. The intrinsic computational diculty of functions. n Proceedings of the 1964
Congress for Logic, Methodology, and the Philosophy of Science, p. 2430. North-Holland, 1964.
[45] H. Cohen i H. W. Lenstra, Jr. Primality testing and jacobi sums. Mathematics of Computation,
42(165):297330, 1984.
[46] Richard Cole. Parallel merge sort. n Proceedings of the 27th Annual Symposium on Foundations
of Computer Science, p. 511516. IEEE Computer Society, 1986.
Bibliograe 847
[47] Richard Cole i Uzi Vishkin. Deterministic coin tossing with applications to optimal parallel list
ranking. Information and Control, 70(1):3253, 1986.
[48] D. Comer. The ubiquitous B-tree. ACM Computing Surveys, 11(2):121137, 1979.
[49] Stephen Cook. The complexity of theorem proving procedures. n Proceedings of the Third Annual
ACM Symposium on Theory of Computing, p. 151158, 1971.
[50] Stephen Cook, Cynthia Dwork, i Rdiger Reischuk. Upper and lower time bounds for parallel
random access machines without simultaneous writes. SIAM Journal on Computing, 15(1):8797,
1986.
[51] James W. Cooley i John W. Tukey. An algorithm for the machine calculation of complex Fourier
series. Mathematics of Computation, 19(90): 297301, April 1965.
[52] Don Coppersmith i Shmuel Winograd. Matrix multiplication via arithmetic progressions. n
Proceedings of the Nineteenth Annual ACM Symposium on Theory of Computing, p. 16, 1987.
[53] George B. Dantzig. Linear Programming and Extensions. Princeton University Press, 1963.
[54] Whiteld Die i Martin E. Hellman. New directions in cryptography. IEEE Transactions on
Information Theory, IT-22(6):644654, 1976.
[55] E. W. Dijkstra. A note on two problems in connexion with graphs. Numerische Mathematik,
1:269271, 1959.
[56] John D. Dixon. Factorization and primality tests. The American Mathematical Monthly, 91
(6):333352, 1984.
[57] Alvin W. Drake. Fundamentals of Applied Probability Theory. McGrawHill, 1967.
[58] James R. Driscoll, Harold N. Gabow, Ruth Shrairman, i Robert E. Tarjan. Relaxed heaps: An
alternative to Fibonacci heaps with applications to parallel computation. Communications of the
ACM, 31(11):13431354, 1988.
[59] James R. Driscoll, Neil Sarnak, Daniel D. Sleator, i Robert E. Tarjan. Making data structures
persistent. n Proceedings of the Eighteenth Annual ACM Symposium on Theory of Computing, p.
109121, 1986.
[60] Herbert Edelsbrunner. Algorithms in Combinatorial Geometry, volumul 10 din EATCS
Monographs on Theoretical Computer Science. Springer-Verlag, 1987.
[61] Jack Edmonds. Paths, trees, and owers. Canadian Journal of Mathematics, 17:449467, 1965.
[62] Jack Edmonds. Matroids and the greedy algorithm. Mathematical Programming, 1:126136, 1971.
[63] Jack Edmonds i Richard M. Karp. Theoretical improvements in the algorithmic eciency for
network ow problems. Journal of the ACM, 19:248264, 1972.
[64] G. Estrin, B. Gilchrist, i J. H. Pomerene. A note on high-speed digital multiplication. IRE
Transactions on Electronic Computers, 5(3):140, 1956.
[65] Shimon Even. Graph Algorithms. Computer Science Press, 1979.
[66] William Feller. An Introduction to Probability Theory and Its Applications. John Wiley & Sons,
third edition, 1968.
[67] M. J. Fischer i A. R. Meyer. Boolean matrix multiplication and transitive closure. n Proceedings
of the Twelfth Annual Symposium on Switching and Automata Theory, p. 129131. IEEE
Computer Society, 1971.
[68] Robert W. Floyd. Algorithm 97 (SHORTEST PATH). Communications of the ACM, 5(6):345,
1962.
[69] Robert W. Floyd. Algorithm 245 (TREESORT). Communications of the ACM, 7:701, 1964.
[70] Robert W. Floyd i Ronald L. Rivest. Expected time bounds for selection. Communications of
the ACM, 18(3):165172, 1975.
848 Bibliograe
[71] Lestor R. Ford, Jr., i D. R. Fulkerson. Flows in Networks. Princeton University Press, 1962.
[72] Lector R. Ford, Jr., i Selmer M. Johnson. A tournament problem. The American Mathematical
Monthly, 66:387389, 1959.
[73] Steven Fortune i James Wyllie. Parallelism in random access machines. n Proceedings of the
Tenth Annual ACM Symposium on Theory of Computing, p. 114118, 1978.
[74] Michael L. Fredman i Michael E. Saks. The cell probe complexity of dynamic data structures. n
Proceedings of the Twenty First Annual ACM Symposium on Theory of Computing, 1989.
[75] Michael L. Fredman i Robert E. Tarjan. Fibonacci heaps and their uses in improved network
optimization algorithms. Journal of the ACM, 34(3):596615, 1987.
[76] Harold N. Gabow i Robert E. Tarjan. A linear-time algorithm for a special case of disjoint set
union. Journal of Computer and System Sciences, 30(2):209221, 1985.
[77] Harold N. Gabow i Robert E. Tarjan. Faster scaling algorithms for network problems. SIAM
Journal on Computing, 18(5):10131036, 1989.
[78] Zvi Galil i Joel Seiferas. Time-space-optimal string matching. Journal of Computer and System
Sciences, 26(3):280294, 1983.
[79] Michael R. Garey i David S. Johnson. Computers and Intractability: A Guide to the Theory of
NP-Completeness. W. H. Freeman, 1979.
[80] Fnic Gavril. Algorithms for minimum coloring, maximum clique, minimum covering by cliques,
and maximum independent set of a chordal graph. SIAM Journal on Computing, 1(2):180187,
1972.
[81] Alan George i Joseph W-H Liu. Computer Solution of Large Sparse Positive Denite Systems.
Prentice-Hall, 1981.
[82] Andrew V. Goldberg. Ecient Graph Algorithms for Sequential and Parallel Computers. Tez de
doctorat, Department of Electrical Engineering and Computer Science, MIT, 1987.
[83] Andrew V. Goldberg, va Tardos, i Robert E. Tarjan. Network ow algorithms. Technical Report
STAN-CS-891252, Computer Science Department, Stanford University, 1989.
[84] Andrew V. Goldberg i Serge A. Plotkin. Parallel ( + 1) coloring of constant-degree graphs.
Information Processing Letters, 25(4):241245, 1987.
[85] Andrew V. Goldberg i Robert E. Tarjan. A new approach to the maximum ow problem. n
Proceedings of the Eighteenth Annual ACM Symposium on Theory of Computing, p. 136146,
1986.
[86] Sha Goldwasser i Silvio Micali. Probabilistic encryption. Journal of Computer and System
Sciences, 28(2):270299, 1984.
[87] Sha Goldwasser, Silvio Micali, i Charles Racko. The knowledge complexity of interactive proof
systems. SIAM Journal on Computing, 18(1):186208, 1989.
[88] Sha Goldwasser, Silvio Micali, i Ronald L. Rivest. A digital signature scheme secure against
adaptive chosen-message attacks. SIAM Journal on Computing, 17(2):281308, 1988.
[89] Gene H. Golub i Charles F. Van Loan. Matrix Computations. The Johns Hopkins University
Press, 1983.
[90] G. H. Gonnet. Handbook of Algorithms and Data Structures. Addison-Wesley, 1984.
[91] R. L. Graham. An ecient algorithm for determining the convex hull of a nite planar set.
Information Processing Letters, 1:132133, 1972.
[92] R. L. Graham i Pavol Hell. On the history of the minimum spanning tree problem. Annals of the
History of Computing, 7(1):4357, 1985.
Bibliograe 849
[93] Leo J. Guibas i Robert Sedgewick. A diochromatic framework for balanced trees. n Proceedings
of the 19th Annual Symposium on Foundations of Computer Science, p. 821. IEEE Computer
Society, 1978.
[94] Frank Harary. Graph Theory. Addison-Wesley, 1969.
[95] J. Hartmanis i R. E. Stearns. On the computational complexity of algorithms. Transactions of
the American Mathematical Society, 117:285306, 1965.
[96] Frederick J. Hill i Gerald R. Peterson. Introduction to Switching Theory and Logical Design. John
Wiley & Sons, second edition, 1974.
[97] C. A. R. Hoare. Algorithm 63 (partition) and algorithm 65 (nd). Communications of the ACM,
4(7):321322, 1961.
[98] C. A. R. Hoare. Quicksort. Computer Journal, 5(1):1015, 1962.
[99] W. Hoeding. On the distribution of the number of successes in independent trials. Annals of
Mathematical Statistics, 27:713721, 1956.
[100] Micha Hofri. Probabilistic Analysis of Algorithms. Springer-Verlag, 1987.
[101] John E. Hopcroft i Richard M. Karp. An n
5/2
algorithm for maximum matchings in bipartite
graphs. SIAM Journal on Computing, 2(4):225231, 1973.
[102] John E. Hopcroft i Robert E. Tarjan. Ecient algorithms for graph manipulation.
Communications of the ACM, 16(6):372378, 1973.
[103] John E. Hopcroft i Jerey D. Ullman. Set merging algorithms. SIAM Journal on Computing,
2(4):294303, 1973.
[104] John E. Hopcroft i Jerey D. Ullman. Introduction to Automata Theory, Languages, and
Computation. Addison-Wesley, 1979.
[105] Ellis Horowitz i Sartaj Sahni. Fundamentals of Computer Algorithms. Computer Science Press,
1978.
[106] T. C. Hu i M. T. Shing. Computation of Matrix Chain Products. Part I. SIAM Journal on
Computing, 11(2): 362373, 1982. T. C. Hu i M. T. Shing. Computation of Matrix Chain Products.
Part II. SIAM Journal on Computing, 13(2): 228251, 1984.
[107] David A. Human. A method for the construction of minimum-redundancy codes. Proceedings of
the IRE, 40(9):10981101, 1952.
[108] Kai Hwang. Computer Arithmetic: Principles, Architecture, and Design. John Wiley & Sons, 1979.
[109] Kai Hwang i Fay A. Briggs. Computer Architecture and Parallel Processing. McGraw-Hill, 1984.
[110] Kai Hwang i Doug DeGroot. Parallel Processing for Supercomputers and Articial Intelligence.
McGraw-Hill, 1989.
[111] Oscar H. Ibarra i Chul E. Kim. Fast approximation algorithms for the knapsack and sum of
subset problems. Journal of the ACM, 22(4):463468, 1975.
[112] R. A. Jarvis. On the identication of the convex hull of a nite set of points in the plane.
Information Processing Letters, 2:1821, 1973.
[113] D. S. Johnson. Approximation algorithms for combinatorial problems. Journal of Computer and
System Sciences, 9:256278, 1974.
[114] Donald B. Johnson. Ecient algorithms for shortest paths in sparse networks. Journal of the
ACM, 24(1):113, 1977.
[115] N. Karmarkar. A new polynomial-time algorithm for linear programming. Combinatorica,
4(4):373395, 1984.
[116] Richard M. Karp. Reducibility among combinatorial problems. n Raymond E. Miller i James
W. Thatcher, editori, Complexity of Computer Computations, p. 85103. Plenum Press, 1972.
850 Bibliograe
[117] Richard M. Karp i Michael O. Rabin. Ecient randomized patternmatching algorithms. Technical
Report TR-3181, Aiken Computation Laboratory, Harvard University, 1981.
[118] Richard M. Karp i Vijaya Ramachandran. A survey of parallel algorithms for shared-memory
machines. Technical Report UCB/CSD 88/408, Computer Science Division (EECS), University
of California, Berkeley, 1988.
[119] A. V. Karzanov. Determining the maximal ow in a network by the method of preows. Soviet
Mathematics Doklady, 15:434437, 1974.
[120] D. G. Kirkpatrick i R. Seidel. The ultimate planar convex hull algorithm? SIAM Journal on
Computing, 15(2):287299, 1986.
[121] Donald E. Knuth. Fundamental Algorithms, volumul 1 din The Art of Computer Programming.
Addison-Wesley, 1968. Second edition, 1973.
[122] Donald E. Knuth. Seminumerical Algorithms, volumul 2 din The Art of Computer Programming.
Addison-Wesley, 1969. Second edition, 1981.
[123] Donald E. Knuth. Sorting and Searching, volumul 3 din The Art of Computer Programming.
Addison-Wesley, 1973.
[124] Donald E. Knuth. Big omicron and big omega and big theta. ACM SIGACT News, 8(2):1823,
1976.
[125] Donald E. Knuth, James H. Morris, Jr., i Vaughan R. Pratt. Fast pattern matching in strings.
SIAM Journal on Computing, 6(2):323350, 1977.
[126] Zvi Kohavi. Switching and Finite Automata Theory. McGraw-Hill, 1970.
[127] Bernhard Korte i Lszlo Lovsz. Mathematical structures underlying greedy algorithms. n F.
Gecseg, editor, Fundamentals of Computation Theory, numrul 117 din Lecture Notes in Computer
Science, p. 205209. Springer-Verlag, 1981.
[128] Bernhard Korte i Lszlo Lovsz. Structural properties of greedoids. Combinatorica, 3:359374,
1983.
[129] Bernhard Korte i Lszlo Lovsz. Greedoids a structural framework for the greedy algorithm.
n W. Pulleybank, editor, Progress in Combinatorial Optimization, p. 221243. Academic Press,
1984.
[130] Bernhard Korte i Lszlo Lovsz. Greedoids and linear objective functions. SIAM Journal on
Algebraic and Discrete Methods, 5(2):229238, 1984.
[131] J. B. Kruskal. On the shortest spanning subtree of a graph and the traveling salesman problem.
Proceedings of the American Mathematical Society, 7:4850, 1956.
[132] Eugene L. Lawler. Combinatorial Optimization: Networks and Matroids. Holt, Rinehart, and
Winston, 1976.
[133] Eugene L. Lawler, J. K. Lenstra, A. H. G. Rinnooy Kan, i D. B. Shmoys, editori. The Traveling
Salesman Problem. John Wiley & Sons, 1985.
[134] C. Y. Lee. An algorithm for path connection and its applications. IRE Transactions on Electronic
Computers, EC-10(3):346365, 1961.
[135] F. Thomson Leighton. Introduction to Parallel Algorithms and Architectures: Networks and
Algorithms. Morgan-Kaufmann, in preparation.
[136] Debra A. Lelewer i Daniel S. Hirschberg. Data compression. ACM Computing Surveys, 19(3):261
296, 1987.
[137] H. W. Lenstra, Jr. Factoring integers with elliptic curves. Annals of Mathematics, 126:649673,
1987.
[138] L. A. Levin. Universal sorting problems. Problemy Peredachi Informatsii, 9(3):265266, 1973. n
limba rus.
Bibliograe 851
[139] Harry R. Lewis i Christos H. Papadimitriou. Elements of the Theory of Computation. Prentice-
Hall, 1981.
[140] C. L. Liu. Introduction to Combinatorial Mathematics. McGraw-Hill, 1968.
[141] Lszlo Lovsz. On the ratio of optimal integral and fractional covers. Discrete Mathematics,
13:383390, 1975.
[142] Udi Manber. Introduction to Algorithms: A Creative Approach. Addison-Wesley, 1989.
[143] William J. Masek i Michael S. Paterson. A faster algorithm computing string edit distances.
Journal of Computer and System Sciences, 20(1):1831, 1980.
[144] Kurt Mehlhorn. Sorting and Searching, volumul 1 din Data Structures and Algorithms. Springer-
Verlag, 1984.
[145] Kurt Mehlhorn. Graph Algorithms and NP-Completeness, volumul 2 din Data Structures and
Algorithms. Springer-Verlag, 1984.
[146] Kurt Mehlhorn. Multidimensional Searching and Computational Geometry, volumul 3 din Data
Structures and Algorithms. Springer-Verlag, 1984.
[147] Gary L. Miller. Riemanns hypothesis and tests for primality. Journal of Computer and System
Sciences, 13(3):300317, 1976.
[148] Louis Monier. Algorithmes de Factorisation DEntiers. Tez de doctorat, LUniversit Paris-Sud,
Centre DOrsay, 1980.
[149] Louis Monier. Evaluation and comparison of two ecient probabilistic primality testing
algorithms. Theoretical Computer Science, 12( 1):97108, 1980.
[150] Edward F. Moore. The shortest path through a maze. n Proceedings of the International
Symposium on the Theory of Switching, p. 285292. Harvard University Press, 1959.
[151] Ivan Niven i Herbert S. Zuckerman. An Introduction to the Theory of Numbers. John Wiley &
Sons, fourth edition, 1980.
[152] Yu. Ofman. On the algorithmic complexity of discrete functions. Soviet Physics Doklady, 7(7):589
591, 1963. Traducere n limba englez.
[153] Alan V. Oppenheim i Alan S. Willsky, cu Ian T. Young. Signals and Systems. Prentice-Hall,
1983.
[154] Christos H. Papadimitriou i Kenneth Steiglitz. Combinatorial Optimization: Algorithms and
Complexity. Prentice-Hall, 1982.
[155] Michael S. Paterson, 1974. Unpublished lecture, Ile de Berder, France.
[156] J. M. Pollard. A Monte Carlo method for factorization. BIT, 15:331334, 1975.
[157] Carl Pomerance. On the distribution of pseudoprimes. Mathematics of Computation, 37(156):587
593, 1981.
[158] Carl Pomerance. The quadratic sieve factoring algorithm. n T. Beth, N. Cot, i I. Ingemarrson,
editori, Advances in Cryptology, volumul 209 din Lecture Notes in Computer Science, p. 169182.
Springer-Verlag, 1984.
[159] Carl Pomerance, editor. Proceedings of the AMS Symposia in Applied Mathematics: Computational
Number Theory and Cryptography. American Mathematical Society, 1992.
[160] Franco P. Preparata i Micheal Ian Shamos. Computational Geometry: An Introduction. Springer-
Verlag, 1985.
[161] William H. Press, Brian P. Flannery, Saul A. Teukolsky, i William T. Vetterling. Numerical
Recipes: The Art of Scientic Computing. Cambridge University Press, 1986.
[162] William H. Press, Brian P. Flannery, Saul A. Teukolsky, i William T. Vetterling. Numerical
Recipes in C. Cambridge University Press, 1988.
852 Bibliograe
[163] R. C. Prim. Shortest connection networks and some generalizations. Bell System Technical
Journal, 36:13891401, 1957.
[164] Paul W. Purdom, Jr., i Cynthia A. Brown. The Analysis of Algorithms. Holt, Rinehart, i
Winston, 1985.
[165] Michael O. Rabin. Probabilistic algorithms. n J. F. Traub, editor, Algorithms and Complexity:
New Directions and Recent Results, p. 2139. Academic Press, 1976.
[166] Michael O. Rabin. Probabilistic algorithm for testing primality. Journal of Number Theory, 12:128
138, 1980.
[167] Edward M. Reingold, Jrg Nievergelt, i Narsingh Deo. Combinatorial Algorithms: Theory and
Practice. Prentice-Hall, 1977.
[168] Hans Riesel. Prime Numbers and Computer Methods for Factorization. Progress in Mathematics.
Birkhuser, 1985.
[169] Ronald L. Rivest, Adi Shamir, i Leonard M. Adleman. A method for obtaining digital signatures
and public-key cryptosystems. Communications of the ACM, 21(2):120126, 1978. Vezi i U.S.
Patent 4,405,829.
[170] D. J. Rosenkrantz, R. E. Stearns, i P. M. Lewis. An analysis of several heuristics for the traveling
salesman problem. SIAM Journal on Computing, 6:563581, 1977.
[171] Y. A. Rozanov. Probability Theory: A Concise Course. Dover, 1969.
[172] S. Sahni i T. Gonzalez. P-complete approximation problems. Journal of the ACM, 23:555565,
1976.
[173] John E. Savage. The Complexity of Computing. John Wiley & Sons, 1976.
[174] Robert Sedgewick. Implementing quicksort programs. Communications of the ACM, 21(10):847
857, 1978.
[175] Robert Sedgewick. Algorithms. Addison-Wesley, second edition, 1988.
[176] Michael I. Shamos i Dan Hoey. Geometric intersection problems. n Proceedings of the 17th
Annual Symposium on Foundations of Computer Science, p. 208215. IEEE Computer Society,
1976.
[177] Daniel D. Sleator i Robert E. Tarjan. A data structure for dynamic trees. Journal of Computer
and System Sciences, 26(3):362391, 1983.
[178] Daniel D. Sleator i Robert E. Tarjan. Self-adjusting binary search trees. Journal of the ACM,
32(3):652686, 1985.
[179] Joel Spencer. Ten Lectures on the Probabilistic Method. Regional Conference Series on Applied
Mathematics (No. 52). SIAM, 1987.
[180] Sta of the Computation Laboratory. Description of a Relay Calculator, volumul XXIV din The
Annals of the Computation Laboratory of Harvard University. Harvard University Press, 1949.
[181] Gilbert Strang. Introduction to Applied Mathematics. Wellesley-Cambridge Press, 1986.
[182] Gilbert Strang. Linear Algebra and Its Applications. Harcourt Brace Jovanovich, third edition,
1988.
[183] Volker Strassen. Gaussian elimination is not optimal. Numerische Mathematik, 14(3):354356,
1969.
[184] T. G. Szymanski. A special case of the maximal common subsequence problem. Technical Report
TR-170, Computer Science Laboratory, Princeton University, 1975.
[185] Robert E. Tarjan. Depth rst search and linear graph algorithms. SIAM Journal on Computing,
1(2):146160, 1972.
Bibliograe 853
[186] Robert E. Tarjan. Eciency of a good but not linear set union algorithm. Journal of the ACM,
22(2):215225, 1975.
[187] Robert E. Tarjan. A class of algorithms which require nonlinear time to maintain disjoint sets.
Journal of Computer and System Sciences, 18(2): 110127, 1979.
[188] Robert E. Tarjan. Data Structures and Network Algorithms. Society for Industrial and Applied
Mathematics, 1983.
[189] Robert E. Tarjan. Amortized computational complexity. SIAM Journal on Algebraic and Discrete
Methods, 6(2):306318, 1985.
[190] Robert E. Tarjan i Jan van Leeuwen. Worst-case analysis of set union algorithms. Journal of the
ACM, 31(2):245281, 1984.
[191] Robert E. Tarjan i Uzi Vishkin. An ecient parallel biconnectivity algorithm. SIAM Journal on
Computing, 14(4):862874, 1985.
[192] George B. Thomas, Jr., i Ross L. Finney. Calculus and Analytic Geometry. Addison-Wesley,
seventh edition, 1988.
[193] Leslie G. Valiant. Parallelism in comparison problems. SIAM Journal on Computing, 4(3):348355,
1975.
[194] P. van Emde Boas. Preserving order in a forest in less than logarithmic time. n Proceedings of the
16th Annual Symposium on Foundations of Computer Science, p. 7584. IEEE Computer Society,
1975.
[195] Uzi Vishkin. Implementation of simultaneous memory address access in models that forbid it.
Journal of Algorithms, 4(1):4550, 1983.
[196] Jean Vuillemin. A data structure for manipulating priority queues. Communications of the ACM,
21(4):309315, 1978.
[197] C. S. Wallace. A suggestion for a fast multiplier. IEEE Transactions on Electronic Computers,
EC-13(1):1417, 1964.
[198] Stephen Warshall. A theorem on boolean matrices. Journal of the ACM, 9(1):1112, 1962.
[199] A. Weinberger i J. L. Smith. A one-microsecond adder using onemegacycle circuitry. IRE
Transactions on Electronic Computers, EC-5(2), 1956.
[200] Hassler Whitney. On the abstract properties of linear dependence. American Journal of
Mathematics, 57:509533, 1935.
[201] Herbert S. Wilf. Algorithms and Complexity. Prentice-Hall, 1986.
[202] J. W. J. Williams. Algorithm 232 (heapsort). Communications of the ACM, 7:347348, 1964.
[203] S. Winograd. On the algebraic complexity of functions. n Actes du Congres International des
Mathmaticiens, volumul 3, p. 283288, 1970.
[204] James C. Wyllie. The Complexity of Parallel Computations. Tez de doctorat, Department of
Computer Science, Cornell University, 1979.
[205] Andrew C.-C. Yao. A lower bound to nding convex hulls. Journal of the ACM, 28(4):780787,
1981.
Index
2-3 arbore, 241, 343
2-3-4 arbore, 331
divizare a, 342
fuzionare a, 342
i arbori rou-negru, 333
AAM-Generic, 429
AAM-Heap-Interclasabil, 360
AAM-Kruskal, 433
AAM-Prim, 436
AAM-Reducere, 439
abatere medie ptratic, 99
acceptare
de ctre un automat nit, 739
accesibilitate ntr-un graf(
p
Y), 75
Aceeai-Component, 380
acoperire
cu vrfuri, 828
printr-o submulime, 835
acoperire cu vrfuri, 813, 828
pentru un arbore, 830
Acoperire-Cu-Vrfuri-Aprox, 828
Acoperire-Mulime-Greedy, 836
adncime
a unei frunze ntr-un arbore de decizie,
149
a unei stive, 145
a unui arbore de decizie, 148
a unui arbore de recuren pentru
sortare rapid, 137
a unui nod ntr-un arbore cu rdcin,
81
a unui nod ntr-un arbore rou-negru,
229, 250
medie a unui nod ntr-un arbore binar
de cutare construit aleator, 223
Adaug-Subarbore, 396
adresare direct, 187
Adresare-Direct-Caut, 187
Adresare-Direct-Insereaz, 187
Adresare-Direct-terge, 188
adunare
a polinoamelor, 666
a unor ntregi binari, 5
adunare complet, 563
Afieaz-Intersecia-Segmentelor,
769
alfabet, 739, 789
alfabet de intrare, 739
algoritm, 1
corectitudine, 2
cu timp de execuie polinomial, 785
timp de execuie, 6
algoritm aleator, 138
comportarea n cazul cel mai defavora-
bil, 139
dispersie universal, 196
pentru cutare ntr-o list compact,
185
pentru inserare ntr-un arbore binar de
cutare cu chei egale, 222
pentru partiionare, 138, 143, 144
pentru permutare, 139
pentru selecie, 160
pentru sortare rapid, 138, 144
algoritm de aproximare, 826
pentru mpachetarea cu cutii, 843
pentru problema acoperirii cu vrfuri,
828
pentru problema acoperirii de pondere
minim a mulimii, 843
pentru problema acoperirii mulimii,
Index 855
835
pentru problema clicii maxime, 843
pentru problema comis-voiajorului, 830
pentru problema sumei submulimii,
838
algoritm de determinare a maximului, 623
algoritm de partiionare, 132
aleator, 138
elementul de mijloc dintre trei elemen-
te, 143
varianta Lomuto, 144
algoritm de preux, 519
algoritm generic, 522
operaii de baz, 520
pentru determinarea unui cuplaj
maxim, 527
algoritm de reducere, 797
algoritm de vericare, 793
algoritm EREW aleator
pentru calcularea prexului, 612
algoritm greedy, 283
bazele teoretice ale, 296
comparare cu metoda programrii dina-
mice, 288
elementele unui, 287
pe un matroid ponderat, 298
pentru arbore de acoperire minim, 428
pentru coduri Human, 290
pentru gsirea acoperirii de vrfuri
optimal pentru un arbore, 830
pentru planicarea activitilor, 301,
305
pentru problema acoperirii mulimii,
835
pentru problema acoperirii ponderate a
mulimii, 843
pentru problema fracionar a rucsacu-
lui, 288
pentru problema selectrii activitilor,
283
pentru schimb de monede, 304
proprietatea alegerii greedy n, 287
substructur optim n, 287
algoritm paralel, 590
ciclu eulerian, 599
citire concurent, 591
citire exclusiv, 591
ecient ca efort, 596
procesor inactiv, 612
scriere concurent, 591
scriere exclusiv, 591
tehnica ciclului eulerian, 598
algoritm polinomial, 687
algoritmul Bellman-Ford, 456
algoritmul Boyer-Moore, 751
algoritmul cmmdc binar, 728
algoritmul Dijkstra, 452
asemnarea cu algoritmul lui Prim, 435
algoritmul Dijkstra modicat, 455
algoritmul elipsoidului, 463
algoritmul Floyd-Warshall, 480
algoritmul Johnson, 486
algoritmul Karmakar, 463
algoritmul KMP, 745
algoritmul Knuth-Morris-Pratt, 745
algoritmul lui Edmonds-Karp, 512
algoritmul lui Kruskal, 433
asemnarea cu algoritmul generic, 433
avnd costuri ntregi ale muchiilor, 438
algoritmul lui Prim, 435
n gsirea unui tur aproape optimal al
comis-voiajorului, 831
asemnarea cu algoritmul lui Dijkstra,
435
cu matrice de adiacen, 438
implementat cu heap-uri Fibonacci, 438
algoritmul lui Strassen
pentru nmulirea matricelor, 633
algoritmul naiv pentru potrivirea irurilor,
732
algoritmul Rabin-Karp, 735
algoritmul simplex, 463
algoritmul ranului rus, 584
algoritmul Viterbi, 281
Aloc-Obiect, 181
Aloc-Nod, 334
alocarea obiectelor, 180
analiza
metodei de preux, 524
analiza algoritmilor, 5
analiz amortizat, 306
metoda de agregare pentru, 306
856 Index
metoda de cotare pentru, 310
metoda de potenial pentru, 312
pentru algoritmul Knuth-Morris-Pratt,
747
pentru arbori cu ponderi echilibrate,
323
pentru heap-uri Fibonacci, 363, 371,
373, 374
pentru permutare pe bii inveri, 322
pentru scanarea Graham, 776
pentru stive din memoria secundar,
341
pentru structuri de date mulimi dis-
juncte, 382
pentru tabele dinamice, 315
pentru varianta dinamic a cutrii
binare, 323
analiz euristic
a algoritmului Rabin-Karp, 738
analiz probabilistic, 108
a adncimii medii a unui nod ntr-un
arbore binar de cutare construit
aleator, 223
a cutrii ntr-o list compact, 186
a coliziunilor, 192, 205
a comparrii ierelor, 738
a determinrii maximului dintr-un
tablou, 114
a dispersiei cu nlnuire, 191
a dispersiei cu adresare deschis, 202,
205
a dispersiei universale, 196
a nlimii unui arbore binar de cutare
construit aleator, 217
a inserrii ntr-un arbore binar de
cutare cu chei egale, 222
a liniilor, 111, 113
a marginii celei mai lungi vericri
pentru dispersie, 205
a marginii inferioare a cazului mediu
pentru sortare, 156
a marginii pentru mrimea locaiei
pentru nlnuire, 206
a numrrii probabilistice, 115
a paradoxului zilei de natere, 109, 113
a partiionrii, 137, 140, 143
a problemei angajrii, 114
a seleciei aleatoare, 160
a sortrii pe grupe, 155, 156
a sortrii punctelor prin distana fa
de origine, 156
a sortrii rapide, 140, 144, 145, 222
pentru bile i cutii, 111, 113
anihilator, 490
antisimetria notaiei asimptotice, 27
antisimetrie, 71
apel prin valoare, 4
aproximarea lui Stirling, 31
arbitraj, 469
arbore, 78
2-3, 241, 343
2-3-4, 331
acoperirea optimal cu vrfuri a unui,
830
binomial, 345, 347, 364
biseciunea unui, 84
cu rdcin, 80, 182
de acoperire, 297, 428
de acoperire minim, 428
de analiz gramatical, 276
de decizie, 147, 149
de recuren, 51
diametru al unui, 409
dinamic, 326
drum complet al unui, 831
gsirea rdcinii unui, pe un CREW
PRAM, 608
nlime a unui, 81, 120
liber, 77, 78
oblic, 327
splay, 242
arbore k-ar, 82
arbore k-ar complet, 83
arbore al drumurilor minime, 444
arbore binar, 81
complet, 82
numr de distinci, 224
parcurgere a unui, 184
reprezentare a unui, 182
arbore binar complet, 82, 83
relaia cu codul optimal, 291
arbore binar de cutare, 208
Index 857
cutare, 210
cheia maxim a, 211
cheia minim a, 211
construit aleator, 217, 223
cu chei egale, 222
inserare n, 214
interogare, 210
pentru sortare, 217
predecesor n, 212
tergere din, 215
succesor n, 212
arbore binar de cutare construit aleator,
217, 223
arbore binar echilibrat
2-3 arbore, 241
arbore splay, 242
arbore binomial, 345, 347
neordonat, 364
arbore binomial neordonat, 364
arbore cu rdcin, 80, 222
reprezentare a unui, 182
arbore de acoperire, 297, 428
al doilea cel mai mic, 439
arbore de acoperire minim, 428
algoritm generic, 428, 429
construit folosind heap-uri intercla-
sabile, 359
n gsirea turului aproape optim al
comis-voiajorului, 831
n grafuri rare, 439
arbore de acoperire minim
relaia cu matroizi, 298
arbore de adncime, 410
arbore de analiz gramatical, 276
arbore de cutare echilibrat
2-3 arbore, 343
2-3-4 arbore, 331
arbore rou-negru, 226
arbore splay (oblic), 327
B-arbore, 328
cu ponderi echilibrate, 323
arbore de decizie, 147, 149
arbore de drum minim, 449
arbore de intervale, 251
arbore de lime, 403
arbore de recuren, 51
n demonstrarea teoremei master, 57
arbore de recursivitate
pentru sortare prin interclasare, 270
arbore de statistic de ordine, 243
interogare a, 250
arbore dinamic, 326
arbore liber, 77, 78
arbore oblic, 327
arbore ordonat, 81
arbore poziional, 82
arbore rou-negru, 226
cutare n, 227
cheia maxim n, 227
cheia minim n, 227
comparare cu B-arbori, 332
enumerarea cheilor dintr-un interval,
250
mbogirea, 249
n determinarea dac orice segmente de
dreapt se intersecteaz, 766
nlime a unui, 226
inserare n, 230
predecesor n, 227
proprieti ale, 226
rotaie n, 228
i 2-3-4 arbori, 333
tergere din, 234
succesor n, 227
uniune, 240
arbore splay, 242
arbore Wallace, 579
Arbore-Caut, 210
Arbore-Caut-Iterativ, 211
Arbore-Insereaz, 214, 217, 231
Arbore-Maxim, 212
Arbore-Minim, 212
Arbore-Predecesor, 213
Arbore-terge, 215, 236
Arbore-Succesor, 212
Arbore-Traversare-Inordine, 209
arbori cu ponderi echilibrate, 323
arc, 74
eticheta unui, 491
argument al unei funcii, 73
arie a unui poligon simplu, 764
articol, 117
858 Index
asemenea (), 755
asimptotic nenegativ, 21
asimptotic pozitiv, 29
asociativitate, 697
astfel nct, 66
atribuire
multipl, 3
atribuire de adevr, 799
atribuire multipl, 3
atribuire satisabil, 799
atribut al unui obiect, 4
autobucl, 74
automat
de potrivire a irurilor, 739
nit, 739
automat de potrivire a irurilor, 739, 744
automat nit, 739
pentru potrivirea irurilor, 739
Automat-Finit-De-Potrivire, 742
axiomele probabilitii, 91
B-arbore, 328
2-3-4 arbore, 331
cutare n, 333
cheia minim a unui, 338
creare a unui, 334
divizare a unui nod n, 334
grad minim al unui, 331
nlime a unui, 331
inserare n, 336
nod plin n, 331
proprietile unui, 330
tergere dintr-un, 339
baleiere, 764, 783
baleiere rotaional, 769
baza stivei, 171
Baza-TFR, 681
Bellman-Ford, 457
bile i cutii, 111, 113
Binomial-Legtur, 350
biseciunea unui arbore, 84
bit
xat hard, 567
bit de paritate, 563
bit sum, 566
CA, 411
CA-Vizit, 411
calcul de prex, 568
algoritm paralel ecient ca efort pentru,
612
pe un EREW PRAM, 596
versiune ecient pe un EREW PRAM,
612
calcul paralel de prex
analiza algoritmului de, 614
pe un EREW PRAM, 598
Calcul-Funcie-De-Tranziie, 744
Calcul-Funcie-Prefix, 747
Calcul-Funcie-Sufix-Bun, 756
Calcul-Funcie-Ultima-Apariie, 755
Calculeaz-nsumri, 495
cmp al unui obiect, 4
cap
al unei cozi, 172
al unei liste nlnuite, 174
capt
al unui interval, 251
al unui segment de dreapt, 759
cardinalitatea unei mulimi, 68
Crlig, 624
ct, 689
Caut, 168
Caut-B-Arbore, 334, 339
cutare
cutare binar, 14
cutare liniar, 5, 9
cazul cel mai defavorabil, 8
n arbore binar de cutare, 210
n arbore de intervale, 253
n B-arbori, 333
n liste compacte, 185
n mulimi statice, 206
n tabele cu adresare direct, 187
n tabele de dispersie cu adresare des-
chis, 199
n tabele de dispersie cu nlnuire, 191
ntr-un arbore rou-negru, 227
pentru un interval exact, 255
problem de, 5
cutare binar, 14
cu inserare rapid, 323
Index 859
n cutarea n B-arbori, 339
n sortarea prin inserie, 14
cutare n adncime, 410
cutare n lime, 403
i drumul cel mai scurt, 403
cutare liniar, 5, 9
cel mai apropiat strmo comun, 396
cel mai lung drum, 461
cel mai lung subir comun, 271, 282
cel mai mare divizor comun, 690
cel mai mic multiplu comun, 697
cheie, 117, 126, 168
median a unui B-arbore, 334
cheie median a unui B-arbore, 334
cheie minim
n heap-uri 2-3-4, 359
cheie public, 712
cheie RSA public, 714
cheie RSA secret, 714
cheie secret, 712
ciclu
detectare a unui, 419
ciclu de cost mediu minim, 470
ciclu elementar, 76
ciclu ntr-un graf, 76
circuit
adncime a unui, 564
bitonic, 279
cu ceas, 581
dimensiune a unui, 565
drum critic ntr-un, 574
secvenial, 582
circuit bitonic, 279
circuit combinaional, 561, 562, 608
simulare ecient a unui, 611
simulat de un CREW PRAM, 608
simulat de un EREW PRAM, 608
circuit de ieire, 563
circuit de intrare, 563
circuit de sumare, 566
circuit global de ceas, 582
circuit nalt, 574
circuit multiplicator, 575
circuit satisabil, 799
circuite operaionale
operarea n paralel, 561
Citete-Disc, 330
CL, 404
clas
de echivalen, 71
clas de echivalen, 71
clas de complexitate, 788, 791
clasa de complexitate co-NP, 794
clasa de complexitate NP, 794
clasa de echivalen modulo n, 689
clasicarea muchiilor n cutarea n adnci-
me, 415
clic, 810
mrimea unei, 810
CMLSC (cel mai lung subir comun), 271
coad de prioriti, 126
implementarea folosind heap-uri, 126
n algoritmul lui Prim, 436
n construirea codurilor Human, 292
coada
unei cozi, 172
coad, 171
a unei distribuii binomiale, 104
a unei liste nlnuite, 174
implementare folosind liste nlnuite,
178
coad complet, 174
coad de propagare, 562
coarda unui poligon, 275
cod, 290
Human, 290
cod binar al caracterelor, 290
cod caracter, 290
cod de lungime x, 290
cod Human, 290
cod prex, 291
codicare, 290, 787
asociat binomial, 788
codicare cu lungime variabil, 290
codomeniu, 72
coecienii
unui polinom, 666
coecient
al unui polinom, 29
binomial, 88
coecient binomial, 88
colectarea reziduurilor, 119
860 Index
colector de reziduuri(garbage collector), 180
coliniaritate, 760, 763
coliziune, 190
rezolvare prin nlnuire, 190
rezolvare prin adresare deschis, 198
colorare, 84, 618
pe un EREW PRAM, 618
combinri, 88
combinare, 87
combinare convex a punctelor, 759
comentariu n pseudocod (), 3
Compacteaz-List, 182
complement
al unei mulimi, 68
al unui eveniment, 92
complement algebric, 631
component
conex, 76
tare conex, 76
component biconex
ntr-un graf, 425
component conex, 76
identicat folosind structuri de date
mulimi disjuncte, 380
component tare conex, 76, 420
Componente-Conexe, 380
Componente-Tare-Conexe, 420
comprimarea unui drum, 385
concatenare, 491
a irurilor, 732
condiii de pant pentru recursivitate, 64
conguraie, 801
conservarea uxului, 499
consolidarea listei de rdcini a unui heap
Fibonacci, 369
Consolideaz, 369
Construiete-Heap, 123
Construiete-Heap, 130
contor binar
analizat prin metoda de agregare, 308
analizat prin metoda de cotare, 311
analizat prin metoda de potenial, 314
pe bii inveri, 322
i heap-uri binomiale, 359
contor pe bii inveri, 322
contracia unui matroid, 300
convoluie, 668
Copiere-Invers-Bii, 682
copil, 81, 82
corectitudinea unui algoritm, 2
coresponden unu-la-unu, 74
corp, 641
cost
ntr-un graf, 441
cost amortizat
pentru metoda de agregare, 306
pentru metoda de cotare, 310
pentru metoda de potenial, 312
cost mediu
al unui ciclu, 470
constrngere cu diferene, 463
costul minimax, 497
CRCW (citire concurent, scriere concuren-
t), 591
comparat cu EREW, 601
funcia SAU, 608
nmulirea matricelor, 608
credit, pentru metoda de cotare, 310
Creeaz-B-Arbore, 334
Creeaz-Heap, 344
Creeaz-Heap-Binomial, 349
CREW (citire concurent, scriere exclusiv)
potrivirea irurilor, 758
CREW (citire concurent, scriere exclusiv),
591
gsirea rdcinilor ntr-o pdure, 602
criptosistemul RSA cu cheie public, 714
cuantil, 164
culoarea unui nod ntr-un arbore rou-negru,
226
cuplaj, 515
i ux maxim, 515
cuplaj bipartit, 515
cuplaj bipartit maxim, 515, 527
cuplaj maxim, 498
cuplaj perfect, 518
cutii KPG, 572
cvasiinel, 638
boolean, 639
matrice peste un, 639
date adiionale, 117
Index 861
date satelit, 168
dealocarea obiectelor, 180
Deasupra, 766
Decrement, 310
Dedesubt, 766
densitate de probabilitate, 97
densitate de probabilitate asociat, 97
depire
a unei stive, 171
deplasator ciclic, 581
derivata unei serii, 39
Descarc, 529
descendent, 80
descendent propriu, 80
descreterea unei chei
n heap-uri 2-3-4, 359
n heap-uri binomiale, 357
n heap-uri Fibonacci, 372
Descrete-Cheie, 344
destinaie, 403
determinant
al unei matrice, 631
proprieti ale, 631
determinarea celei mai apropiate perechi de
puncte, 778
determinarea n paralel a rangului unei liste,
594
deviaia standard, abaterea medie p-
tratic
dezvoltare binomial, 88
diagram Venn, 68
diametrul unui arbore, 409
diferena dintre mulimi(), 67
diferenierea seriilor, 39
Dijkstra, 452
dimensiune
a datelor de intrare ale unui algoritm, 6
a unei acoperiri cu vrfuri, 828
a unei mulimi, 68
a unui arbore mulime disjunct, 390
a unui arbore binomial, 345
a unui subarbore ntr-un heap
Fibonacci, 376
disc, 769
dispersie, 98, 187
a mulimilor statice, 206
a unei distribuii binomiale, 102
a unei distribuii geometrice, 100
cu nlnuire, 190, 206
cu adresare deschis, 198
k-universal, 207
universal, 196
dispersie k-universal, 207
dispersie dubl, 201
dispersie uniform, 200
dispersie uniform simpl, 191
dispersie universal, 196
Dispersie-Caut, 199, 205
Dispersie-Cu-nlnuire-Caut, 191
Dispersie-Cu-nlnuire-Insereaz,
191
Dispersie-Insereaz, 205
Dispersie-Insereaz, 199
Dispersie-terge, 205
distan Manhattan, 165
distan
de editare, 281
euclidian, 778
Manhattan, 165
distana
L
m
, 782
Manhattan, 782
distana L
m
, 782
distana Manhattan, 782
distan de editare, 281
distan euclidian, 778
distribuie
binomial, 101
de probabilitate, 91
geometric, 100
nvelit rar, 783
distribuie binomial, 101
cozi ale unei, 104
i bile i cutii, 111
valoare maxim, 103
distribuie de probabilitate, 91
distribuie de probabilitate discret, 92
distribuie de probabilitate uniform, 92
distribuie de probabilitate uniform conti-
nu, 93
distribuie geometric, 100
i bile i cutii, 111
862 Index
i linii (secvene), 112
distribuie nvelit rar, 783
Divide-Fiu-B-Arbore, 335
divizare
a 2-3-4 arborilor, 342
a unui B-arbore, 334
divizor, 688
divizor comun, 689
divizor trivial, 688
domeniu, 72
domeniu de valori, 73
dreapt de baleiere, 764
Dreapta, 119
dreptunghiul de mrginire, 761
dreptunghiuri suprapuse, 256
drum, 75
cutare, 385
eticheta unui, 491
minim, 406
drum critic, 461
drum de ameliorare, 507
drum de cutare, 385
drum elementar, 75
drum hamiltonian, 795
drum minim, 406, 445, 475
construirea unui, 482
costul unui, 441
ntr-un graf , 441
structura optimal a unui, 445
structura unui, 475, 480
Drumuri-Minime-ntre-Toate-
Perechile-Lent, 477
Drumuri-Minime-ntre-Toate-
Perechile-Mai-Rapid, 478
echivalen modulo n(), 72
ecuaie normal, 660
egalitate
a funciilor, 73
a mulimilor, 66
element
instalat, 562
stabil, 562
element al unei mulimi(), 66
element combinaional, 561
element combinaional boolean, 561
element neutru, 490, 697
eliberarea obiectelor, 180
Elibereaz-Obiect, 181
ERCW (citire exclusiv, scriere concurent),
591
EREW (citire exclusiv, scriere exclusiv),
591
nmulirea matricelor, 608
comparat cu CRCW, 601
prex paralel, 612
rangul unei liste, 594
salt de pointer, 593
eroare relativ, 826
erori de aproximare, 659
eec ntr-o prob bernoullian, 100
estimare a drumului minim, 446
Euclid, 694
Euclid-Extins, 695
euristic bazat pe caracterul slab, 752
euristica celui mai apropiat punct, 834
euristica primei potriviri, 843
euristica reuniunii ponderate, 382
euristica suxului bun, 755
evaluarea unui polinom, 668, 672
n puncte multiple, 684
i derivatelor sale, 684
evantai de ieire, 563
evantai de intrare, 563
eveniment, 91
eveniment elementar, 91
evenimente incompatibile, 91
evenimente mutual exclusive, 91
evenimente mutual independente, 94
exces de ux, 519
exponeniere repetat, 388
exponeniere modular, 710
Exponeniere-Modular, 710
extensie a unei mulimi, 297
exteriorul unui poligon, 275
Extinde-Drumuri-Minime, 476
Extrage-Max, 126
Extrage-Max-Din-Heap, 128
Extrage-Min, 344
extragerea cheii maxime
din heap, 128
dintr-un heap d-ar, 130
Index 863
extragerea cheii minime
din heap-uri 2-3-4, 359
din heap-uri binomiale, 355, 357
din heap-uri Fibonacci, 367
factor, 688
factor de ncrcare
a unei tabele de dispersie, 191
al unui tablou dinamic, 315
factorizare, 724
fals potrivire, 736
familie ereditar de submulimi, 296
familie independent de submulimi, 296
FIFO, 171
ltrarea unei liste, 839
Filtreaz, 840
r, 562
rst-in, rst-out, 171
u drept, 82
u stng, 82
Floyd-Warshall, 482, 485
ux
de valoare ntreag, 516
exces, 519
ux de valoare ntreag, 516
ux maxim, 498
i cuplaj bipartit maxim, 515
algoritmi de preux, 519
Flux-Maxim-Prin-Scalare, 538
Ford-Fulkerson, 510
form normal disjunctiv, 808
form normal-conjuctiv, 807
Formeaz-Arbore, 395
Formeaz-Mulime, 379, 386
implementare folosind liste nlnuite,
382
implementare folosind pdure de mul-
imi disjuncte, 386
formula lui Lagrange, 669
formul satisabil, 805
frai, 81
frontiera unui poligon, 275
frunz, 81
funcie de nlime, n algoritmi de preux,
520
funcie de potenial
pentru algoritmul generic de preux,
526
funcia entropie, 89
funcia entropie binar, 89
funcia exponenial, 29
funcia invers a lui Ackermann, 389
funcia lui Ackermann, 389
funcia majoritate, 588
funcia partea ntreag inferioar(|), 28
funcia partea ntreag superioar(|), 28
funcia phi a lui Euler, 700
funcia suxului bun, 755
funcia ultimei apariii, 753
funcie, 72
calculabil n timp polinomial, 788
funcie bijectiv, 73
funcie boolean, 89
funcie de cost, 401
pentru un graf, 401
funcie de dispersie, 189, 193
metoda diviziunii, 194
metoda nmulirii, 195
funcie de distribuie de probabilitate, 156
funcie de etichetare, 491
funcie de ponderare
pentru triangularea poligonului, 277
funcie de potenial, 317, 319
funcie de reducere, 797
funcie de stare nal, 739
funcie de tranziie, 739, 743, 751
funcie factorial, 31
funcie generatoare, 64
funcie injectiv, 73
funcie iterat, 35
funcie liniar, 7
funcie logaritm, 30
iterat(lg

), 31
funcie logaritm iterat
i exponeniere repetat , 389
funcie lungime, 298
funcie obiectiv, 462
funcie ptratic, 8
funcie prex, 745
funcie simetric, 588
funcie sux, 740
funcie univoc de dispersie, 716
864 Index
funcie unu-la-unu, 73
fuzionare
a 2-3-4 arborilor, 342
Gsete-Adncime, 396
Gsete-Mulime, 380, 387
implementare folosind liste nlnuite,
382
implementare folosind pdure de mul-
imi disjuncte, 387
Gsete-Rdcini, 602
generator, 701, 709
generator de numere aleatoare, 138
generator de numere pseudoaleatoare, 138
geometrie computaional, 759
gestiunea memorrilor, 119, 180, 193
GOA-Drumuri-Minime, 460
grad
al rdcinii unui arbore binomial, 345
al unui nod, 81
al unui vrf, 75
maxim, n heap Fibonacci, 364, 371, 374
minim, al unui B-arbore, 331
grad exterior, 75
grad interior, 75
grad maxim n heap Fibonacci, 364, 371, 374
grad minim al unui B-arbore, 331
graf, 74
ajuttor, 817
cutare n adncime ntr-un, 410
cutare n lime ntr-un, 403
ciclu hamiltonian, 792
complementul unui, 813
componente biconexe ntr-un, 425
cost al unui drum, 441
costul unui drum minim, 441
cu costuri, 401
dens, 400
descompunerea n componente tare co-
nexe a unui, 420
drum critic ntr-un, 461
drum minim n, 441
interval, 286
k-colorare a unui, 824
matrice de inciden a unui, 304, 403
problem de drum minim, 441
problema drumurilor minime de surs
unic, 441
punct de articulaie ntr-un, 425
punte a unui, 425
rar, 400
reprezentare prin liste de adiacen a
unui, 400
reprezentare prin matrice de adiacen
a unui, 401
sortare topologic a unui, 417
transpusul unui, 402
tur Euler al unui, 426
unic conex, 417
graf aciclic, 76
graf bipartit, 77
reeaua de transport corespunztoare,
516
graf complet, 77
graf conex, 76
graf d-regular, 519
graf de constrngere, 464
graf dens, 400
graf elementar, 76
graf hamiltonian, 792
graf nehamiltonian, 792
graf neorientat, 75, 304
acoperire cu vrfuri a unui, 828
colorarea unui, 84
conversia la, a unui multigraf, 402
cuplaj, 515
d-regular, 519
determinarea unui arbore de acoperire
minim ntr-un, 428
graf orientat, 74
nchiderea tranzitiv a unui, 484
ptratul unui, 402
graf orientat aciclic (goa)
i muchii napoi, 418
graf rar, 400
graf tare conex, 76
grac PERT, 461
graful constrngerilor, 465
grafuri izomorfe, 76
gredoid, 305
Greedy, 299
grup, 697
Index 865
grup abelian, 697
grup aditiv modulo n, 698
grup ciclic, 709
grup nit, 697
grup multiplicativ modulo n, 699
grup, 154
grupare, 200
grupare primar, 200
grupare secundar, 201
heap, 119
d-ar, 130
2-3-4, 359
analizat cu metoda de potenial, 314
ca i coad de prioriti, 126
ca mijloc de memorare pentru colecta-
rea reziduurilor, 119
cheie maxim a unui, 128
construire a unui, 123, 130
cu chei cresctoare, 129
extragerea cheii maxime din, 128
inserare n, 128
pentru implementarea unui heap inter-
clasabil, 344
relaxat, 378
timpi de execuie a operaiilor pe, 345
heap d-ar, 130
heap 2-3-4, 359
heap binomial, 344, 360
cheia minim n, 349
creare a unui, 349
descreterea cheii n, 357
extragerea cheii minime, 355, 357
inserare n, 355
proprietile unui, 347
i contor binar, 359
tergere din, 358
timpi de execuie a operaiilor asupra
unei, 345
unicare, 350, 355
heap cu chei cresctoare, 129
heap Fibonacci, 362
cheia minim a, 366
creare a unui, 365
descreterea unei chei n, 372
extragere minim din, 367
funcia de potenial pentru, 363
grad maxim al, 364, 374
n algoritmul lui Prim, 438
inserare n, 365
reuniune a, 366
schimbare a unei chei ntr-un, 378
tergere din, 374, 377
timpi de execuie a operaiilor pe, 345
trunchiere, 378
heap interclasabil, 344
heap 2-3-4, 359
heap relaxat, 378
implementare folosind liste nlnuite,
185
n algoritmul arborelui de acoperire mi-
nim, 360
timpi de execuie a operaiilor pe, 345
heap relaxat, 378
Heap-Binomial-terge, 359
Heap-Binomial-Descrete-Cheie, 357
Heap-Binomial-Extrage-Min, 355
Heap-Binomial-Insereaz, 355
Heap-Binomial-Interclaseaz, 350, 359
Heap-Binomial-Min, 349, 359
Heap-Binomial-Reunete, 359
Heap-Binomial-Reunete, 351
Heap-Binomial-terge, 358
Heap-Cu-Chei-Cresctoare, 129
Heap-Fib-nlnuie, 370
Heap-Fib-Descrete-Cheie, 372
Heap-Fib-Extrage-Min, 367
Heap-Fib-Insereaz, 365
Heap-Fib-Reunete, 366
Heap-Fib-Schimb-Cheie, 378
Heap-Fib-terge, 374
Heap-Fib-Trunchiaz, 378
Heapsort, 125
heapsort, 119
stabilitatea, 154
hipergraf, 77
hipermuchie, 77
Huffman, 292
ieire
a unui algoritm, 1
ieire binar, 562
866 Index
imagine, 73
imagine raster
transpunerea unei, 625
mbogirea structurilor de date, 243
mpachetare cu cutii, 843
mpachetarea cadoului, 776
mpachetarea pachetului, 776
nlime
a unui arbore, 81, 120
a unui arbore binar de cutare construit
aleator, 220
a unui arbore binomial, 345
a unui arbore rou-negru, 226
a unui B-arbore, 331
a unui heap, 120, 121
a unui heap d-ar, 130
a unui heap Fibonacci, 377
a unui nod dintr-un heap, 120, 125
neagr, 226
nlime neagr, 226
nchidere, 493, 697
nchidere tranzitiv
a unui graf, 484
nchidere-Tranzitiv, 484
inciden, 75
Incrementeaz, 308
Incrementeaz-Cu-Inversarea-
Biilor, 322
indentare n pseudocod, 3
independen, 93, 96, 97
independen condiionat, 96
independen doi-cte-doi, 94
index, 709
inegalitatea funciei sux, 742
inegalitatea Kraft, 83
inegalitatea lui Boole, 95
inegalitatea lui Markov, 99
inegalitatea triunghiului, 830
inel, 639
Iniializeaz-Preflux, 522
Iniializeaz-Surs-Unic, 446
nlnuire, 190, 206
a arborilor binomiali, 345
a rdcinilor unui heap Fibonacci, 369
nmulire matrice-vector, 612
nmulire-Matrice, 260, 477
nmulire-ir-Matrice, 265
nmulirea unui ir de matrice, 260
corespondena cu triangularea poligoa-
nelor, 276
inserare
n B-arbori, 336
n arbore binar de cutare, 214
n arbore de intervale, 253
n arbore de statistic de ordine, 246
n arbore rou-negru, 230
n coad, 172
n heap, 128
n heap 2-3-4, 359
n heap Fibonacci, 365
n heap binomial, 355
n strile dreptei de baleiere, 766
n stiv, 171
n tabel dinamic, 316
n tabele cu adresare direct, 187
n tabele de dispersie cu nlnuire, 191
n tabele de dispersie cu adresare des-
chis, 199
ntr-un heap d-ar, 130
n list nlnuit, 175
Inserare-n-Heap
construirea unui heap cu, 130
Inserare-Multipl-n-Stiv, 310
Insereaz-n-Heap, 128
Insereaz-B-Arbore, 336
Insereaz-B-Arbore-Neplin, 337
Insereaz-Tablou, 316
Insereaz, 126, 169, 344
Inseria-Oricror-Segmente, 767
instan
a unei probleme, 1
nsumare, 37
formule i proprieti ale, 37
n notaie asimptotic, 38
mrginire, 40
integrarea unei serii, 39
interclasare
a k liste ordonate, 129
a dou tablouri sortate, 11
a listelor nlnuite, 178
pe un CRCW PRAM, 608
Interclaseaz, 11, 13
Index 867
Interclaseaz-Liste, 839
interiorul unui poligon, 275
interpolare n rdcinile complexe ale unit-
ii, 677
interpolare polinomial, 668
interpolare printr-un polinom, 668
intersecie
a coardelor, 248
a mulimilor(), 67
determinarea pentru o mulime de seg-
mente de dreapt, 764
determinarea, pentru dou discuri, 769
determinarea, pentru dou poligoane
simple, 769
determinarea, pentru dou segmente de
dreapt, 761
determinarea, pentru o mulime de
segmente de dreapt, 769
gsirea tuturor, ntr-o mulime de seg-
mente de dreapt, 769
interval, 251
interval deschis, 251
interval nchis, 251
interval semideschis, 251
Interval-Caut, 253, 255
Interval-Caut-Exact, 255
Interval-Insereaz, 251
Interval-terge, 252
intervale suprapuse, 251
gsirea tuturor, 255
punct de suprapunere maxim, 255
intrare
a unui algoritm, 1
dimensiunea unei, 6
intrare binar, 562
ntregi(Z), 66
ntrerupere de simetrie, 622
algoritm EREW pentru, 618
ntreruperi deterministe de simetrie, 617
nvelitoare convex, 769
nvelitoare convex, 783
invers, 697
fa de nmulire, 197
invers multiplicativ, 704
inversa
unei funcii bijective, 74
unei matrice, 630
inversarea unui ir, 16
inversor, 562
iteraie Newton, 588
Johnson, 488
k-putere, 692
lanul unei nvelitori convexe, 776
last-in, rst-out, 171
latur a unui poligon, 275
lege
comutativ, 697
legi de absorbie pentru mulimi, 67
legi de asociativitate pentru mulimi, 67
legi de comutativitate pentru mulimi, 67
legi de distributivitate pentru mulimi, 67
legi de idempoten pentru mulimi, 67
legile lui DeMorgan, 67
legile mulimii vide, 67
lema de njumtire, 674
lema de nsumare, 674
lema de anulare, 674
lema de iteraie a funciei prex, 748
lema de recursivitate a funciei sux, 742
lema de suprapunere a suxului, 732
lema strngerilor de mn, 78
LIFO, 171
limbaj, 789
acceptat de un algoritm, 790
limbaj
acceptat n timp polinomial, 790
claricat de un algoritm, 790
limbaj
claricat n timp polinomial de un
algoritm, 790
complementul unui, 790
complet, 804
concatenarea, 790
nchiderea unui, 790
intersecia unui, 790
NP-complet, 798
NP-dicil, 798
reductibil n timp polinomial, 796
reuniunea unui, 790
868 Index
steaua Kleene a unui, 790
vericat, 794
limbaj vid, 789
liniaritate, 38
liniaritatea nsumrilor, 38
liniaritatea mediei, 98
i bile i cutii, 111
i paradoxul zilei de natere, 110
linii, 111, 113
list compact, 185
list liber, 181
list nlnuit circular, 174
list nlnuit nesortat, 174
list nlnuit sortat, 174
list dublu nlnuit, 174
list simplu nlnuit, 174
List-Compact-Caut, 185
list
nlnuit, 174
lista punct-eveniment, 766
list de rdcini
a heap-ului Fibonacci, 363
a unui heap binomial, 347
lista ilor ntr-un heap Fibonacci, 363
list nlnuit
cutare, 175, 198
compact, 182, 185
inserare n, 175
pentru implementarea mulimilor dis-
juncte, 381
tergere din, 176
List-Caut, 175, 176
List-Insereaz, 175, 177
List-terge, 176
List-terge, 176
literal, 807
consistent, 811
locaie, 187
logaritm discret, 709
LU-Descompunere, 648
lungime
a unui ir, 87
a unui ir (de valori), 73
a unui drum, 75
Lungime-CMLSC, 272, 275
lungimea drumului exterior, 83
lungimea drumului interior, 83
lungimea unui drum al unui arbore, 83
LUP-Descompunere, 650
LUP-Soluie, 645
majoritate, 563
marcaj de timp, 410
n cutarea n adncime, 410
margine, 103
a coecienilor binomiali, 88
a cozilor unei distribuii binomiale, 104
a distribuiei binomiale, 103
asimptotic inferioar, 24
asimptotic superioar, 22
asimptotic tare, 21
polilogaritmic, 31
margine a erorii relative, 826
margine a raportului, 826
margine asimptotic inferioar, 24
margine asimptotic superioar, 22
margini inferioare
pentru nvelitori convexe, 777
pentru sortare, 147
mrginirea unei sume, 40
mrginit polilogaritmic, 31
mrginit polinomial, 29
main cu acces aleator, 5
paralel, 590
main paralel cu acces aleator, 590
msur a complexitii, 791
matrice, 626
adunare a, 629
compatibile, 629
complement Schur al unei, 647, 657
de adiacen, 401
de inciden, 304
determinant al unei, 631
nmulire a, 629
inversa, 630
inversabil, 630
inversare a, 653
minor, 631
neinversabil, 630
nesingular, 630
operaii cu, 626
opus al unei, 629
Index 869
ptratic, 627
pozitiv denit, 632
produs exterior al, 630
produs scalar al, 629
proprieti ale, 626
pseudoinversa, 660
rang al, 631
rang coloan al unei, 631
rang coloan complet al unei, 631
rang complet, 631
rang linie al unei, 631
scdere a, 629
simetric, 628
simetric pozitiv-denit, 657
singular, 630
submatrice directoare, 657
transpusa unei, 402, 626
Vandermond, 633
matrice booleene
nmulire a, 640
matrice de inciden
a unui graf neorientat, 304
a unui graf orientat, 304, 403
matrice de permutare, 628
matrice diagonal, 627
matrice inferior triunghiular, 628
unitate, 628
matrice ptratic, 627
matrice superior triunghiular, 628
unitate, 628
matrice Toeplitz, 684
matrice tridiagonal, 627
matrice unitate, 627
matrice zero, 627
matricea predecesorilor, 473
matroid, 296, 305
ponderat, 298
matroid grac, 297
matroid matriceal, 297
matroid ponderat, 298
Maxim, 126, 169
maxim, 158
n heap, 128
al unei distribuii binomiale, 103
al unei mulimi parial ordonate, 72
determinarea, 158, 623
n arbore binar de cutare, 211
n arbore de statistic de ordine, 250
n arbore rou-negru, 227
submulimi, ntr-un matroid, 297
Maxim-Rapid, 604
maximal
nivel, 782
punct, 782
median, 158
a unui tablou ordonat, 164
ponderat, 165
median ponderat, 165
medie, valoare medie
membru al unei mulimi(), 66
memoizarea, 268
memorie intern, 328
memorie principal, 328
memorie secundar
arbore de cutare pentru, 328, 341
stive pe, 341
metod n dou treceri, 386
metod cu o singur trecere, 397
metoda celor mai mici ptrate, 657
metod de agregare, 306
pentru contor binar, 308
pentru heap-uri Fibonacci, 374
pentru operatori de stiv, 307
pentru scanarea Graham, 776
pentru structuri de date mulimi
disjuncte, 382
metoda de cotare, 310
pentru contor binar, 311
pentru operaii de stiv, 310, 312
pentru tabele dinamice, 317
metoda de potenial, 312
pentru contor binar, 314
pentru heap, 314
pentru heap-uri Fibonacci, 363, 371,
373
pentru operaii de stiv, 313
pentru tabele dinamice, 317, 319
metoda de potenial
pentru algoritmul Knuth-Morris-Pratt,
747
metoda
870 Index
pentru transformata Fourier rapid,
675
metoda divide i stpnete, 10
analiza, 12
pentru cutare binar, 14
pentru determinarea celei mai apropia-
te perechi de puncte, 778
pentru gsirea nvelitorii convexe, 770
pentru selecie, 160
pentru sortare rapid, 131
pentru sortarea prin interclasare, 10
relaia cu programarea dinamic, 259
i arbori de recuren, 51
metoda diviziunii, 194
metoda Ford-Fulkerson
varianta de baz, 510
metoda nmulirii, 195
metoda iteraiei, 50
metoda lui Ford-Fulkerson, 505
analiza algoritmului Ford-Fulker-
son, 510
metoda master pentru rezolvarea unei recu-
rene, 53
metoda programrii dinamice, 259
comparare cu algoritmii greedy, 288
elementele unei, 266
pentru nmulirea unui ir de matrice,
260
pentru algoritmul Viterbi, 281
pentru cel mai lung subir comun, 270
pentru distana de editare, 280
pentru problema 0-1 a rucsacului, 289
pentru problema euclidian bitonic a
comis-voiajorului, 279
pentru selectarea activitilor, 286
pentru suprapunerea subproblemelor,
266
pentru tiprire uniform, 280
pentru triangularea optim a poligoa-
nelor, 275
i memoizare, 268
substructura optim, 266
metoda proiectrii incrementale
pentru gsirea nvelitorii convexe, 770
metoda ridicrii repetate la ptrat, 710
metoda substituiei, 47
metoda trunchiaz-i-caut, 770
Metoda-Ford-Fulkerson, 505
mijlocul-din-3, 146
Miller-Rabin, 720
Min-Dif, 255
Minim, 158, 169, 344
minim, 158
determinarea, 158
n arbore binar de cutare, 211
n arbore de statistic de ordine, 250
n arbore rou-negru, 227
n B-arbore, 338
n heap binomial, 349
n heap Fibonacci, 366
o-line, 395
Minim-Off-Line, 395
model de ir care nu se poate suprapune, 744
moneda perfect, 92
monoid, 490, 638
element neutru al, 638
monoton cresctor, 28
monoton descresctor, 28
muchie
clasicarea n cutarea n adncime,
415
cost al unei, 401
saturat, 521
uoar, 430
muchie de arbore, 410, 415
muchie de cost negativ, 442
muchie explorat, 411
n cutarea n adncime, 411
muchie nainte, 415
muchie napoi, 415
muchie saturat, 521
muchie sigur, 429
muchie transversal, 415
muchie uoar, 430
multigraf, 77
conversia la un graf neorientat echiva-
lent, 402
mulime, 66
static, 206
mulime cu un singur element, 69
mulime de arce, 74
mulime de vrfuri, 74
Index 871
mulime dinamic, 168
2-3 arbore, 241, 343
arbore binar de cutare, 208
arbore cu rdcin, 222
arbore de intervale, 251
arbore de statistic de ordine, 243
arbore oblic, 327
arbore rou-negru, 226
arbore splay, 242
B-arbore, 328
coad complet, 174
coad, 172
coad de prioriti, 168
heap, 119
heap 2-3-4, 359
heap binomial, 344, 360
heap Fibonacci, 362
heap relaxat, 378
interogare, 168
list nlnuit, 174
operaii de modicare pe, 168
persistent, 240, 327
stiv, 171
structur de date mulimi disjuncte,
379
structuri de date van Emde Boas, 326
tabel cu adresare direct, 187
tabel de dispersie, 189
vector de bii, 188
mulime nit, 68
mulime nchis, 490
mulime independent maximal, 618
mulime innit, 68
mulime nenumrabil, 69
mulime numrabil innit, 68
mulime static, 206
mulime vid(), 66
mulimea numerelor naturale(N), 66
mulimea numerelor reale(R), 66
mulimea prilor, 69
mulimi disjuncte, 68
mulimi disjuncte dou cte dou, 68
multiplicator arbore Wallace, 579
multiplicator liniar, 584
multiplicator matriceal, 575, 576
multiplu, 688
Mut-n-Fa, 532
nil, 4
niveluri
convexe, 782
maximale, 782
niveluri convexe, 782
niveluri maximale, 782
nod, 80
nod exterior, 81
nod intern, 81
nod marcat, 363, 373, 374
nod minim n heap Fibonacci, 363
nod plin, 331
nod surs, 403
n cutarea n lime, 403
norm (euclidian), 630
notaie asimptotic, 20
i liniaritatea nsumrilor, 38
nucleul unui poligon, 777
numr armonic, 39
numrare, 86
probabilistic, 115
numrare probabilistic, 115
numr Carmichael, 719
numr Catalan, 225, 261
numr compus, 688
numr prim, 688
numr pseudoprim cu baza n, 718
numere
relativ prime, 691
relativ prime dou cte dou, 691
numere Fibonacci, 32, 64, 376
numere naturale(N), 66
numere reale(R), 66
obiect, 4
alocare i eliberare a unui, 180
implementare folosind tablouri, 178
o-line Tarjan
algoritm pentru determinarea celui mai
apropiat strmo, 396
operaia de pompare (n algoritmi de
preux, 520
operaia de pompare a preuxului, 520
operaia de ridicare, 521, 525
872 Index
operaie uture (buttery operation), 679
operaie
pe bii, 687
operaie asociativ, 490
operaie comutativ, 490
operaie distributiv, 491
operaie idempotent, 491
operator de extindere, 490
operator de nsumare, 490
operator de stare a transportului, 568
ordine
liniar, 72
parial, 71
total, 72
ordine liniar, 72
ordine parial, 71
ordine total, 72
Ordine-ir-Matrice, 263
ordonare, 117
pe loc, 117
problem de, 117
Ordonare-Pe-Baza-Cifrelor, 153
Ordonare-Pe-Grupe, 154
origine, 759
pdure, 77, 78
gsirea rdcinilor unei, pe un CREW
PRAM, 602
mulime disjunct, 384
pdure de adncime, 410
pdure de mulimi disjuncte, 384
analiz, 391
proprietile rangurilor, 390
pagin pe un disc, 329, 342
paradoxul zilei de natere, 109, 113
parametru
costul transferului, 63
parantezare optim, 265
parantezarea produsului unui ir de matrice,
260
parcurgere a arborelui, 183, 184
Printe, 119
printe, 81
partiia unei mulimi, 68, 71
Partiie, 132, 144
Partiie-Aleatoare, 139
Partiie-Lomuto, 144
Partiie-Lomuto-Aleatoare, 144
ptrat
al unui graf orientat, 402
PCV-Tur-Aprox, 831
pe o main CREW PRAM, 758
pereche ordonat, 69
perechea cea mai apropiat, determinarea,
778
perioad de ceas, 582
permutare, 74
a unei mulimi, 87
cu inversarea biilor, 322
Josephus, 256
permutare aleatoare, 139
permutare cu inversarea biilor, 322
permutare Josephus, 256
Persistent-Arbore-Insereaz, 240
Pisano-terge, 377
planicarea activitilor, 301, 305
poart AND, 562
poart logic, 562
poart NAND, 562
poart NOR, 562
poart NOT, 562
poart OR, 562
poart XOR, 562
pointer, referin
implementare folosind tablouri, 178
poligon, 275
determinarea ariei unui, 764
determinarea, dac dou poligoane sim-
ple se intersecteaz, 769
n form de stea, 777
nucleul unui, 777
triangularea unui, 275
poligon convex, 275
poligon n form de stea, 777
poligon simplu, 275
determinarea unui, 769
polinom, 29, 666
comportarea asimptotic a unui, 33
evaluarea unui, 9
gradul unui, 666
limita de grad a unui, 666
reprezentarea, 667
Index 873
Pollard-Rho, 724
pompare saturat, 521, 525
Pompeaz, 521
potenial al unei structuri de date, 312
potrivire
a irurilor, 731
bipartit ponderat, 378
potrivire bipartit, 378
potrivire bipartit ponderat, 378
Potrivire-Boyer-Moore, 751
Potrivire-KMP, 747
Potrivire-Naiv-A-irurilor, 732
Potrivire-Rabin-Karp, 736
Potrivire-Repetitiv, 757
potrivirea lui Jarvis, 776
potrivirea irurilor
algoritm naiv, 732
algoritmul Boyer-Moore, 751
algoritmul Knuth-Morris-Pratt, 745
cu caractere de discontinuitate, 744
potrivirea irurilor, 731
algoritmul Rabin-Karp, 735
bazat pe factori de repetiie, 757
cu caracter de discontinuitate, 734
folosind automate nite, 739
PRAM (main paralel cu acces aleator),
590, 591
Predecesor, 169
predecesor, 443
n arbore binar de cutare, 212
n arbore de statistic de ordine, 250
n arbore rou-negru, 227
n B-arbore, 338
n list nlnuit, 174
prex
al unui ir, 271
prex al unui ir, 732
prex paralel
pe o list, 596
pe un vector, 612
prex paralel segmentat, 622
Prefix-List, 597
preux, 519
Preflux-Generic, 522
presortare, 781
primul sosit, primul servit, 171
principiul includerii i excluderii, 70
prob bernoullian, 100
i bile i cutii, 111
i nlimea unui arbore binar de
cutare construit aleator, 220
Proba, 720
prob, 793
probabilitate, 91
probabilitate condiionat, 93, 94
problem
de optimizare, 259
problem de optimizare, 259
algoritmi de aproximare pentru, 826
problem
rezolvabil n timp polinomial, 788
problem
de decizie, 786
de optim, 787
mulimea instanelor unei, 786
mulimea soluiilor unei, 786
problema 0-1 a rucsacului, 288, 289
problem abstract, 786
problema acoperirii cu vrfuri
algoritm de aproximare pentru, 828
i problema clicii, 830
problema acoperirii mulimii, 834
ponderat, 843
problema acoperirii ponderate a mulimii,
843
problema amplasrii ociului potal, 165
problema celui mai lung ciclu elementar, 823
problema ciclului hamiltonian, 792
problema clicii, 810
algoritm de aproximare pentru, 843
i problema acoperirii cu vrfuri, 830
problema colorrii grafurilor interval, 286
problema colorrii grafului, 824
problema comis-voiajorului, 822
algoritm de aproximare pentru, 834
cu inegalitatea triunghiului, 831
euclidian bitonic, 279
fr inegalitatea triunghiului, 833
strmtorat, 834
problema comis-voiajorului strmtorat, 834
problem concret, 787
problem de admisibilitate, 463
874 Index
problem de calcul, 1
problem de drum minim, 441
problema determinrii adncimii, 395
problema drumurilor minime de surs unic,
441
problema euclidian bitonic a comis-voia-
jorului, 279
problema fracionar a rucsacului, 288, 290
problema nvelitorii convexe n timp real,
777
problema izomorsmului subgrafului, 823
problema mulimii independente, 823
problema o-line
cei mai apropiai strmoi comuni, 396
minim, 395
problema partiionrii mulimii, 823
problema perechii celei mai ndeprtate, 770
problema rucsacului
0-1, 288, 289
fracionar, 288, 290
problema satisabilitii circuitului, 800
problema selectrii activitilor, 283
problema sumei submulimii, 814
produs
cartezian, 69
de polinoame, 666
ncruciat, 760
regula, 86
produs cartezian(), 69
produs ncruciat, 760
produs parial, 575
programare liniar, 462
proprietate de heap, 120
proprietate de schimb, 297
proprietatea alegerii greedy, 287
a codurilor Human, 293
a unui matroid ponderat, 299
proprietatea arborelui binar de cutare, 208
comparat cu proprietatea de heap, 210
proprietatea de heap
comparat cu proprietatea arborelui
binar de cutare, 210
reconstituirea, 121
proprietatea de trihotomie a numerelor
reale, 27
Pseudo-Prim, 719
pseudocod, 2, 3
punct
n geometria computaional, 759
punct de articulaie
ntr-un graf, 425
Pune-n-Coad, 173
Pune-n-Stiv, 172
punte
ntr-un graf, 425
putere nevid, 692
Quicksort, 145
Quicksort, 131, 144
Quicksort-Aleator, 139, 222
relaia cu arbore binar de cutare con-
struit aleator, 223
rdcin
a unui arbore, 80
rdcin complex de ordinul n a unitii,
673
rdcin netrivial a lui 1 modulo n, 710
rdcin primitiv, 709
rdcin principal a unitii, 673
Random, 138, 139
rang
al unei matrice, 631
al unui nod dintr-o pdure de mulimi
disjuncte, 385
al unui numr ntr-o mulime ordonat,
141, 243
n arbore de statistic de ordine, 245,
247
Rang-List, 595
raportul de aur (), 32, 64
reea de transport
corespunztoare unui graf bipartit, 516
Reconstituie-Heap, 121, 123
recuren, 46
arbore de recuren pentru, 51
i condiii de pant, 64
soluie prin metoda iterativ, 50
soluie prin metoda master, 53
soluie prin metoda substituiei, 47
recursivitate, 10
recursivitate de coad, 145
Index 875
reexivitatea notaiei asimptotice, 26
registru, 582
registru instruciune program, 801
Regula (schema lui Horner), 668
regula produsului, 86
regula sumei, 86
relaia deasupra, 765
relaie, 70
relaie binar, 70
relaie de echivalen, 71
i echivalen modulo, 72
relaie reexiv, 70
relaie simetric, 70
relaie tranzitiv, 70
relaie de dominare, 782
relaie prex, 732
relaie sux, 732
relaxare, 445, 446
ntr-un graf, 446, 447
Relaxeaz, 447
reprezentantul unei mulimi, 379
reprezentare prin coecieni
a unui polinom, 668
reprezentare prin liste de adiacen, 400
reprezentare prin matrice de adiacen, 401
reprezentare prin valori pe puncte
a unui polinom, 668
reprezentarea descendent-stng,frate-drept,
183
reprezentarea drumurilor minime, 443
Reset, 312
respingere
de ctre un automat nit, 739
rest, 689
reea de comparare
adncimea ei, 546
reea de sortare, 547
reea de sortare par-impar, 558
reea de transport, 498, 499
capacitate a unei, 499, 508
ux, 499
metoda lui Ford-Fulkerson, 505
problema uxului maxim, 499
tietur minim, 508
tieturi n reele de transport, 508
vrf destinaie, 499
vrf surs, 499
reea de transport multiprodus, 504
reele de interclasare, 552
reele de ordonare
reea par-impar, 558
reele de permutri, 559
reele de sortare, 544, 560
re de ieire, 545
re de intrare, 545
principiul zero-unu, 548
reele de transpoziii, 558
reele de comparare, 545
reele de interclasare, 552
reele de permutri, 559
sortator bitonic, 552
reele de transpoziii, 558
reele reziduale, 505
Reunete, 379, 387
implementare folosind liste nlnuite,
382
implementare folosind pdure de
mulimi disjuncte, 386
Reunete, 344
reuniune
a heap-urilor Fibonacci, 366
a mulimilor (), 67
reuniune dup rang, 385
reziduu ptratic, 729
Rezolv-Ecuie-Liniar-Modular,
704
Ridic, 521
ridicare la ptrat repetat
factor de repetiie a unui ir, 757
RN-Enumer, 250
RN-Insereaz, 231
RN-terge, 235
Rn-terge-Repar, 236
RN-Uniune, 241
rotaie
ntr-un arbore rou-negru, 228
rotaie
ciclic, 751
rotaie ciclic, 751
Rotete-Dreapta, 228
Rotete-Stnga, 229, 238, 255
876 Index
Salt, 624
salt de pointer, 593
santinel, 176, 234, 238, 243
scalare, 469
scanarea Graham, 771
Scanarea-Graham, 771
schem de aproximare, 827
schema de aproximare complet n timp
polinomial, 827
pentru problema clicii maxime, 843
pentru problema sumei submulimii,
839
schema lui Horner, 10
schimb de monede, 304
schimbare a costurilor, 486
schimbarea unei chei ntr-un heap Fibonacci,
378
SCMA, 397
Scoate-Din-Coad, 173
Scoate-Din-Stiv, 172
Scoatere-Multipl-Din-Stiv, 307
Scrie-CMLSC, 273
Scrie-Disc, 330
Scrie-Optim-Prini, 265
secvene, linii
secven biton, 550
segment de dreapt
determinarea ntoarcerii unui, 761
determinarea faptului c se intersectea-
z dou, 761
determinarea faptului c se intersectea-
z oricte, 764
gsirea tuturor interseciilor ntr-o mul-
ime, 769
segment de dreapt, 759
segment orientat, 759
segmente liniare comparabile, 765
selecie
n timp liniar n cazul cel mai
defavorabil, 161
n timp mediu liniar, 159
n arbori de statistic de ordine, 244
problema, 158
i sortare prin comparare, 163
Selecie, 162
Selecie-Aleatoare, 160, 161
Selectri-Activiti-Greedy, 284
Semi-Nivelator, 551
semiinel nchis, 490
exemplu de, 493
semntur digital, 713
serie, 38, 64
serie absolut convergent, 37
serie aritmetic, 38
serie armonic, 39
serie convergent, 37
serie de puteri, 64
serie divergent, 37
serie exponenial, 38
serie formal de puteri, 64
serie geometric, 38
serie Taylor, 225
serie telescopant, 39
simbolul lui Legendre, 729
simetria -notaiei, 27
simulare ecient ca efort, 611
simularea unui circuit combinaional, 608
ir, 87
ir (' `), 73
inversarea n, 16
ir nit, 73
ir innit, 73
ir vid, 732, 789
ir-Echivalent, 269
ir-Matrice-Memoizat, 269
ir-Matrice-Recursiv, 267
sistem de costrngeri cu diferene, 463
sistem de ecuaii liniare, 642
descompunere LUP, 643
eliminare gaussian, 646
instabilitate numeric, 643
nedeterminat, 643
soluie a unui, 642
substituie nainte, 644
substituie napoi, 644
supradeterminat, 643
tridiagonal, 663
sistem de ecuaii liniare
descompunere LU, 646
SO-Rang, 245
SO-Rang-Cheie, 247
SO-Selecteaz, 244, 247
Index 877
soluie
a unei probleme computaionale, 2
soluie cele mai mici ptrate, 659
soluie admisibil, 463
sortare
a punctelor folosind unghi polar, 763
folosind arbore binar de cutare, 217
heapsort, 119
n timp liniar, 149, 157
lexicograc, 222
margine inferioar a cazului mediu
pentru, 156
margini inferioare pentru, 147
pe baza cifrelor, 152
pe grupe, 154
pe loc, 3
prin numrare, 149
sortare prin inserie, 2
sortare prin interclasare, 10
sortare prin selecie, 9
sortare rapid, 131
sortarea lui Shell, 17
sortare lexicograc, 222
sortare pe baza cifrelor, 152
sortare pe grupe, 154
sortare prin comparare, 147
i arbori binari de cutare, 210
i heap-uri interclasabile, 372
i selecie, 163
sortare prin inserie, 2, 6, 14
comparat cu sortarea prin interclasare,
15
folosind cutarea binar, 14
n sortare rapid, 143
n sortarea pe grupe, 154
n sortarea prin interclasare, 15
stabilitatea, 154
sortare prin interclasare, 10
arbore de recursivitate pentru, 270
comparat cu sortarea prin inserie, 15
utilizarea sortrii prin inserie n, 15
sortare prin numrare, 149
n sortarea pe baza cifrelor, 153
sortare prin selecie, 9
sortare rapid, 131, 146
adncimea unei stive n, 145
analiza algoritmului, 139
analiza cazului mediu, 140
analiza celui mai defavorabil caz, 139
comportare medie, 135
cu metoda mijlocul-din-3, 146
descriere, 131
implementare ecient pentru cazul cel
mai defavorabil, 163
partiionare echilibrat, 135
partiionarea cea mai bun, 134
partiionarea cea mai defavorabil, 134
partiionarea irului, 132
sortare prin inserare n, 143
stabilitatea, 154
timp de execuie, 133
varianta aleatoare, 137
varianta folosind recursivitatea de
coad, 145
sortare topologic, 417
Sortare-Prin-Numrare, 150
Sortare-Topologic, 418
sortarea lui Shell, 17
Sortator-Bitonic, 552
Sorteaz-Prin-Interclasare, 12
Sorteaz-Circular, 144
Sorteaz-Prin-Inserie, 3, 7
spaiu de selecie, 91
spline, 663
cubic, 663
Stnga, 119
stabilitate
a algoritmilor de sortare, 151, 154
stare
a transportului, 567
stare de acceptare, 739
stare de start, 739
starea liniei de baleiere, 766
statistici de ordine, 158
dinamice, 243
statistici dinamice de ordine, 243
terge, 169, 344
terge-B-Arbore, 339
terge-Din-Heap, 129
terge-Tablou, 319
tergere
din arbore binar de cutare, 215
878 Index
din arbore de intervale, 253
din arbore rou-negru, 234
din B-arbore, 339
din coad, 172
din heap binomial, 358
din heap Fibonacci, 374, 377
din heap-uri 2-3-4, 359
din list nlnuit, 176
din strile dreptei de baleiere, 766
din stiv, 171
din tabel dinamic, 319
din tabele cu adresare direct, 188
din tabele de dispersie cu nlnuire,
191
din tabele de dispersie cu adresare
deschis, 199
dintr-un arbore de statistic de ordine,
247
Stiv-Vid, 171
stiv, 171
adncimea unei, 145
implementare folosind liste nlnuite,
177
n scanarea Graham, 771
operaii analizate prin metoda de agre-
gare, 307
operaii analizate prin metoda de cota-
re, 310
operaii analizate prin metoda de po-
tenial, 313
pe memoria secundar, 341
pentru execuia procedurilor, 145
stiv vid, 171
strmo, 80
strmo propriu, 80
strict cresctor, 28
strict descresctor, 28
structur de bloc n pseudocod, 3
structuri de date, 167, 326
2-3 arbore, 241, 343
arbore binar de cutare, 208
arbore cu rdcin, 182, 222
arbore de intervale, 251
arbore de statistic de ordine, 243
arbore dinamic, 326
arbore oblic, 327
arbore rou-negru, 226
arbore splay, 242
B-arbore, 328
coad, 172
coad complet, 174
coad de prioriti, 126
dicionare, 168
heap, 119
heap binomial, 344, 360
heap Fibonacci, 362
heap relaxat, 378
mbogire a, 243
n memoria secundar, 328
lis-nlnuit, 174
mulimi disjuncte, 379
persistente, 240, 327
potenial al unei, 312
stiv, 171
tabele cu adresare direct, 187
tabele de dispersie, 189
van Emde Boas, 326
structuri de date mulimi disjuncte, 379
396
n determinarea adncimii, 395
implementarea folosind liste nlnuite
a, 381
implementarea folosind pduri de mul-
imi disjuncte a, 384
analiza, 391
n algoritmul lui Kruskal, 433
n planicarea activitilor, 305
structuri de date mulimi disjuncte n minim
o-line, 395
structuri de date persistente, 240, 327
structuri de date van Emde Boas, 326
structuri repetitive n pseudocod, 3
subarbore, 80
gestiunea dimensiunilor, n arbore de
statistic de ordine, 246
subarbore drept, 81
subarbore stng, 81
subdepire
a unei cozi, 174
a unei stive, 171
subdrum, 76
subexpresie comun, 679
Index 879
subgraf, 76
subgraf indus, 76
subgraf predecesor, 443
al unei cutri n adncime, 410
subgraful predecesorilor, 474
subgrup, 700
subgrup propriu, 700
submuime optim a unui matroid, 298
submulime, 66
familie ereditar de, 296
familie independent de, 296
submulime strict(), 66
subprobleme suprapuse, 266
subir, 87, 270
subir comun, 270
cel mai lung, 270
substructur
unei triangulri optime, 278
substructur optim
a codurilor Human, 294
a nmulirii unui ir de matrice, 261
a problemei 0-1 a rucsacului, 288
a problemei fracionare a rucsacului,
288
a unui CMLSC, 271
a unui matroid ponderat, 300
n algoritm greedy, 287
n metoda programrii dinamice, 266
succes ntr-o prob bernoullian, 100
Succesor, 169
succesor
gsirea celui de-al i-lea,al unui nod ntr-
un arbore de statistic de ordine,
247
n arbore binar de cutare, 212
n arbore de statistic de ordine, 250
n arbore rou-negru, 227
n list nlnuit, 174
sum
innit, 37
regula, 86
telescopare, 39
sum innit, 37
Suma-Submulimii-Aprox, 841
Suma-Submulimii-Exact, 839
sumator
bit-serial, 582, 583
cu transport anticipat, 567, 572
cu transport propagat, 566
cu transport salvat, 572
sumator complet, 563
sumator cu transport salvat, 573
surjecie, 73
tiere,n heap Fibonacci, 373
tabel de adevr, 562
tabel dinamic, 315
analizat prin metoda de cotare, 317
analizat prin metoda de potenial, 317,
319
factor de ncrcare al, 315
tabel cu adresare direct, 187
tabel de dispersie, 189
dinamic, 322
tabel de dispersie cu adresare deschis, 198
dispersie dubl, 201
vericare liniar, 200
vericare ptratic, 201, 207
tabel de simboluri, 187, 194, 196
tablou, 4
tact de ceas, 582
Taie, 372
Taie-n-Cascad, 372
tiere n cascad, 373, 377
tietur
a unui graf neorientat, 429
tautologie, 796
tehnica ciclului eulerian, 598
teorema de convoluie, 678
teorema de integralitate, 518
teorema drumului alb, 413
teorema lui Bayes, 94
teorema lui Brent, 608
teorema master, 53
demonstraia, 55
teorema parantezelor, 413
text cifrat, 713
TFD (transformata Fourier discret), 675
TFR-Iterativ, 681
TFR-Recursiv, 676
timp CPU, 329
timp de execuie, 6
880 Index
cazul mediu, 9
cel mai defavorabil caz, 25
cel mai favorabil caz, 10, 24
timp de execuie pentru cazul mediu, 9
timp de execuie pentru cel mai defavorabil
caz, 8, 25
timp de execuie pentru cel mai favorabil
caz, 10, 24
timp polinomial
schem de aproximare, 827
tiprire uniform, 280
Tiprete-Cale, 409
Tiprete-Drumurile-Minime-Dintre-
Toate-Perechile, 474
transformata Fourier discret, 675
transformata Fourier rapid
circuit pentru, 682
implementare iterativ a, 679
implementare recursiv, 676
transformata Fourier rapid TFR
utiliznd aritmetica modular, 685
transport
distrus, 567
generat, 567
propagat, 567
transport de ieire, 566
transport de intrare, 566
transpusa
unei matrice, 402
transpusul
unui graf, 402
tranzitivitatea notaiei asimptotice, 26
traversare a unui arbore, 209, 245
traversarea arborelui n inordine, 209, 210,
213, 245
traversarea arborelui n postordine, 209
traversarea arborelui n preordine, 209
traversarea unei tieturi, 430
triangulare, 275
triangularea optim a poligoanelor, 275
trihotomia intervalelor, 251
triunghi, 275
al lui Pascal, 90
triunghiul lui Pascal, 90
trunchiere a unui heap Fibonacci, 378
tuplu, 69
tur Euler
al unui graf, 426
ultimul sosit, primul servit, 171
umbra unui punct, 777
Unete, 387
unghi polar, sortarea punctelor, 763
unic conex, 417
unicare
a heap-urilor, 344
a heap-urilor 2-3-4, 359
a heap-urilor binomiale, 351, 355
a listelor nlnuite, 178
unitate, 688
uniune
a arborilor rou-negru, 240
univers, 68
vrf cu exces de ux, 519
vrf cuplat, 515
valoare
a unei funcii, 73
valoare de dispersie, 190
valoare medie, 97
a unei distribuii binomiale, 102
a unei distribuii geometrice, 100
vrf, 771
n graf, 74
al unui poligon, 275
vrf al unei stive, 171
vrf alb, 403, 410
n cutarea n adncime, 410
ntr-un arbore de lime, 403
vrf descoperit, 403, 410
n cutarea n adncime, 410
vrf destinaie, 442
vrf gri, 403, 410
n cutarea n adncime, 410
ntr-un arbore de lime, 403
vrf intermediar, 480
vrf negru, 403, 410
n cutarea n adncime, 410
ntr-un arbore de lime, 403
vrf surs, 441
vrfuri adiacente, 75
variabil aleatoare discret, 96
Index 881
variabil
aleatoare, 96
n pseudocod, 4
variabil aleatoare, 96
variabil global, 4
vecin, 77
vecintate, 518
vector, 626
de anulare, 631
n plan, 760
liniar dependent, 630
liniar independent, 631
produs ncruciat al, 760
vector coloan, 627
vector de bii, 188
vector linie, 627
vector unitate, 627
vericare, 199, 205
vericare liniar, 200
vericare ptratic, 201, 207
versiunea neorientat a unui graf orientat,
77
versiunea orientat a unui graf neorientat,
77
VLSI (integrare pe scar foarte larg), 65
zero, 705
882 Index

Das könnte Ihnen auch gefallen