Sunteți pe pagina 1din 152

CUPRINS CUPRINS.1 CAPITOLUL 1 Structuri elementare de date...3 1.1 Structuri liniare.....3 1.2 Stive......3 1.3 Coada....

5 ntrebri i exerciii la capitolul 1..8 CAPITOLUL 2. Structuri externe de date9 ntrebri i exerciii la capitolul 214 CAPITOLUL 3 Modelul reea15 3. 1 Noiuni de baz i definiii16 3.2.1. Transformnarea unei relaii n-are..20 3.2.2. Transformarea relaiilor n la m..20 3.3. Limbajul de definire al datelor (DDL)..21 ntrebri i exerciii la capitolul 322 CAPITOLUL 4 Modelul ierarhic...23 ntrebri i exerciii la capitolul 4....27 CAPITOLUL 5 Modelul relaional28 2.1. Scurf istoric al modelului relaional..28 2.2. Modelul relaional al datelor.28 2.3 Structura relaional a datelor31 ntrebri i exerciii la capitolul 532 CAPITOLUL 6 Arbori binari.33 ntrebri i exerciii la capitolul 638 CAPITOLUL7 Cozi de prioritate (cu HEAP)...39 7.1 Operaii asupra unei cozi de prioriti44 ntrebri i exerciii la capitolul 747 CAPITOLUL 8 Arbori binari de cutare...47 8.1.Ce este un arbore binar de cautare.47 8.2.Operaii asupra unui arbore binar de cutare.48 ntrebri i exerciii la capitolul 855 CAPITULUL 9 HASH TABLES56 9.1. Tabele cu adresare direct..56 9.2. Tabele de repartizare .(hash-tables)..58 9.3. Funcii de repartizare (hash funcii)..61 9.4.Adresarea deschis.63 ntrebri i exerciii la capitolul 9....67 10. Arbori balansai (B-Trees)68 10.1 Structura datelor n memoria pe disc68 10.2. Definiia arborilor balansai....69
1

10.3 Operaii n arbori balansai...71 ntrebri i exerciii la capitolul 10..77 CAPITOLUL 11. Arbori rou-negri..78 11.1.Proprietle arborilor rou-negri...78 11.2.Rotaii...79 11.3.Inserarea...81 11.4 tergerea..83 ntrebri i exerciii la capitolul 11..85 CAPITOLUL 12 mbogirea structurilor de date.86 ntrebri i exerciii la capitolul 12..94 Capitolul 13 Heap-uri binomiale i Fibonacci.95 13.1 Despre necesitatea unor altfel de structuri...95 13.2 Heap-uri binomiale..98 13.3 Arbori binomiali...99 13.4 Operaii pe heap-uri binomiale...103 13.3 Heap-uri Fibonacci.113 13.4 Metoda de potenial....115 13.5 Operaii cu heap-uri interclasabile.............................117 13.6 Mrginirea gradului maxim130 Rezolvarea unor probleme dintre cele propuse..133 BLIOGRAFIE...143

CAPITOLUL 1 Structuri elementare de date. n capitolul 1, introductiv, recapitulm cteva din noiunile introduse la algoritmic i anume: structuri liniare vectori, matrici, stive, cozi alocarea stucturilor liniare secvenial nlnuit Am folosit, pn acum structuri foarte simple de date cum ar fi : variabile simple (dintre care unele aveau domeniul de valori formate doar din dou valori). vectori cu componentele sortate sau nesortate (aa cum sunt folosii n matematic). matrici considerate ca vectori de vectori sau ca masive biortogonale. Vom studia acum alte structuri ceva mai complicate. 1.1 Structuri liniare. O structur liniar este o mulime de n 0 componente x(1),x(2), ,x(n) cu proprietile: a) Cand n=0 spunem ca structura este vid. b) Daca n > 0 atunci x(1) este primul element iar x(n) este ultimul element. c) Oricare ar fi x(k) unde k{2,,n-1} exist un predecesor x(k-1) i un succesor x(k+1). Ne va interesa s executm cu aceste structuri urmatoarele operaii: -adugarea unui element -extragerea unui element -accesarea unui element x(k) din structur -combinarea a dou sau mai multe structuri ntr-una singur - ruperea unei structuri n mai multe structuri -sortarea elementelor unei structuri -cutarea unui element al structurii care are anumite proprieti etc 1.2 Stive.

Una din cele mai folosite structuri liniare este stiva.O stiv este caracterizat de disciplina de intrare i ieire din stiv. S considerm o mulime de cri puse una peste alta ; exist o prim carte care se poate lua foarte or (TOP) i o carte care se poate lua numai dac deplasez toate celelalte cari (BOTTOM). Disciplina unei stive este ultimul intrat - primul ieit (disciplin care nu v-ar place s fie respectat cnd stai la rnd la lapte ! ) ( Last in, first out prescurtarea acestei reguli este LIFO). Care ar fi diferenele fat de un vector : -un vector are o lungime fix, non zero cunoscut aprioric -o stiv poate fi vid -stiva are un numar variabil de elemente n timpul execuiei unui algoritm Se pune problema reprezentrii concrete a unei stive n memoria unui calculator. Putem aloca o stiv n dou moduri : I ) Secvenial II ) nlnuit I ) Alocarea secvenial a stivei. Folosim vectorul ca fiind structura cea mai apropiat de structura real a memoriei. n vectorul (x (i) ) i=1,n | x(1) | x(2) | x(3) | | x(k) | | x(n) | Bottom Top -din n componente ale unui vector doar k elemente fac parte din stiv. Algoritmul de intrare n stiv va fi : a STIVA Daca k = n atunci DEPASIRE altfel k=k+1 x(k) = a Sdaca Return Algoritmul de ieire din stiv va fi : aSTIVA Daca k = 0 atunci STIVA VIDA altfel

a = x( k ) k=k1 Sdaca Return

II ) Alocarea nlanuit a stivei n alocarea nlnuit fiecare element al structurii este nsoit de adresa la care se afla precedentul element. Vom avea vrful pus n eviden (ancorat) n INC i un semn special n loc de adresa bazei ca n figura urmtoare : | INFO | LEG | INC | || x(k) | ||x(k-1) | ||x(2) | ||x(1) | |

(Ordinea 1,2,,k este ordinea intrrii n stiv). n acest caz intrarea n stiv va folosi stiva de locuri libere (aceast stiv se numete LIBERE) pentru a obine locuri la introducerea n stiv. Vom prezenta n continuare algoritmii de intrare-ieire dintr-o stiv n cazul n care alocarea ei a fost nlnuit : Algoritmul de intrare in stiva va fi : a STIVA yLIBERE INFO(y) = a ; LEG(y)=INC ; INC = y Return Algoritmul de ieire din stiv va fi : aSTIVA Daca INC= atunci STIVA VIDA Altfel INCLIBERE a=INFO(INC) INC=LEG(INC) Sdaca Return 1.3 Coada.

O alt structur liniar utilizat n conceperea algoritmilor este coada. O coad este caracterizat i ea de o disciplin de intrare-iesire, bineineles diferit de cea a stivei. De aceast dat putei s v gndii la coada la lapte: primul care s-a aezat la coad va fi primul servit, adic primul care iese din coad. Disciplina unei cozi este primul venit, primul plecat ( first in, first out avnd prescurtarea FIFO). O coad poate fi vid i are i ea un numr variabil de elemente n timpul execuiei unui algoritm. I ) Alocarea secvenial a cozii. Coada alocata secvenial i va gsi locul tot ntr-un vector (x(i)),i=1,n. | x(1) | x(2) | | x(f) | | x(s) | | x(n) | FA SFRIT Din cele n componente ale vectorului doar componentele x(f) x(s) fac parte din coad. Algoritmul de intrare n coad va fi : a COADA Daca S = n atunci DEPASIRE Altfel S=S+1 x(S) = a Sdaca Return Algoritmul de ieire din coad va fi : aCOADA Daca F> S atunci COADA VIDA Altfel a=x(F);F=F+1 Sdaca Return Se poate imagina uor ca procednd n acest fel (scond din fa i introducnd la sfrit) coada migreaz spre dreapta i poate s ajung n situaia DEPASIRE cnd de fapt mai exist mult loc gol (n vectorul x) pe

primele poziii. Apare astfel ideea de a folosi elementele vectorului ca i cum ar fi dispuse circular: FATA | x(F) | | x(2) | | x(1) | | x(n) |

| x(S) |SFARSIT

Este locul ca cititorul s fac primul efort de a scrie algoritmii de intrare-ieire din coada circular. Exerciiul 1 i 2.

II ) Alocarea nlnuit a cozii. Se face n mod similar cu alocarea nlnuit a stivei n noduri de tipul: | INFO | LEG | | x(F) | || FA | | | x(S) | | SFRIT

Algoritmul de intrare n coad va fi : a COADA yLIBERE INFO(y) = a ; LEG(SFARSIT)=y Return Algoritmul de ieire din coad va fi : aCOADA Daca FATA= atunci COADA VIDA Altfel a=INFO(FATA) FATALIBERE FATA=LEG(FATA) Sdaca Return ntrebri i exerciii la capitolul 1. Exerciiile 1 i 2 se refer la coada circular i sunt cuprinse n text. Exerciiul 3. Considerai dou stive alocate n acelai vector. a. care va fi disciplina de umplere? Facei un desen. b. scriei algoritmii de intrare-ieire pentru stiva 1. c. scriei algoritmii de intrare-ieire pentru stiva 2. Exerciiul 4 Considerai o matrice patratic de ordinul n n care toate elementele deasupra diagonalei principale sunt egale cu 0. a) cte elemente pot fi diferite de 0? b) aranjai, pe linii, elementele acestea (de pe diagonala principal i de sub ea) ntr-un vector. Facei un desen. c) Dac matricea este A i vectorul este B, A(i,j) se va duce n B(k). Dai formula pentru calculul lui k n funcie de i i j. d) Dai i formula invers: i i j n funcie de k. e) Scriei algoritmul care citete matricea A i trece elementele de pe diagonala principal i de sub ea n vectorul B. f) Scriei algoritmul care, pornind de la doi vetori B1 i B2, obinui ca la punctul e) din matricile A1 i A2 calculeaz

imaginea MB a matricii produs A1xA2. (Artai, mai nti, c produsul este o matrice de aceeai form.)

CAPITOLUL 2. STRUCTURI EXTERNE DE DATE . ASPECTE ALE ORGANIZARII FIZICE A BAZELOR DE DATE n acest capitol vom nva: Cum se desfoar o operaie intrare-ieire Cum este organizat un disc magnetic Care sunt factorii de performan ai discului Cum se calculeaz timpul de transfer al datelor Care sunt formatele de memorare pe disc De modul n care sunt pstrate datele pe memoria extern depinde regsirea informaiei dorite n forma dorit ntr-un timp acceptabil. Dac problema formei se poate rezolva mai uor, problema obinerii datelor n timp util este mai greu de rezolvat i organizarea va fi subordonat rezolvrii acestei probleme. Accesul fizic este prezentat schematic n urmatoarea figur:

Fig.2.1 Figura arat cum cererea emis de utilizator, ntr-un limbaj evoluat, este translatat ntr-o forma efectiv (cea mai eficient) pentru execuie. Cererea translatat activeaz managerul de buffer care controleaz micarile datelor ntre memoria principal i cea secundar (n general pe disc magnetic). Managerul de fiier transfer de pe memoria secundar datele conform unei structuri definite tot de utilizator n dicionarul de date. Memoria principal ese o memorie foarte rapid care conine programele i datele, transferate din memoria secundar cu care se lucreaz la un moment dat; ea mai poate conine ctiva megabaii de date dar, n general, este prea mic pentru totalitatea datelor. Memoria secundar este realizat fizic pe suport magnetic disc( mai des) i band. Discul magnetic este cel mai folosit pentru ca asigura un acces rapid la date i poate realiza accesul direct; banda magnetic dei mult mai ieftin, este prea lent i se folosete mai des pentru arhivare. Partea de hard a calculatorului care rezolv sarcinile de scriere-citire a dlscului magnetic este unitatea de disc. n unitate se afl un pachet de unul sau mai multe discuri pe un ax comun ntr-o micare permanent de rotaie cu o mare vitez. n figur se poate observa componenta discului cu faa magnetizat organizat pe piste (cecuri concentrice), cu mecanismul de acces care prin mulimea de capete genereaz din pistele parcurse concomitent de capete aa numitul cilindru. Aceast structur fizic permite accesuI direct la

10

o anumit nregistrare (noiune logic) dac se specific numarul de cilindru, numrul de suprafa i numrul de nregistrare.

11

Factorii de performan ai discului. Timpul de cautare(A), este timpul necesar poziionrii dispozitivului de acces (mpreun cu capetele de citire-scriere) pe cilindrul cerut. n general micarea pna la cilindrul alturat nu va dura la fel de mult ca micarea de la primul la ultimul cilindru. De obicei pen~ acestt~mp se folosete o valoare medie dat de timpul poziionare de la primul cilimdru la mljlocul discului. 12 sau 20 de milisecunde sunt timpi tipici de cutare n funcie de modelul de unitate de disc. Timpul de activare al capetelor este timpul necesar pentru a determina electronic care din capetele de citire-scriere va fi activ (adic pe ce suprafa se va face operaia de intrare-ieire) acest timp este n general foarte mic n comparaie cu ceilali timpi i se neglijeaz n calcule. Intervalul de rotaie este timpul necesar discului n micare de rotaie s ajung la blocul care trebuie citit sau scris astfel ca tranferul de date s poat ncepe. Acest interval depinde de doi factori: viteza de rotaie a discului i poziia relativ a noului bloc dat de poziia de moment a discului. Fizic acest timp poate varia ntre zero i timpul de revoluie al discului; deci n medie se va consuma un timp egal cu R/2. Rata de transfer al datelor (D) se refer la timpul necesar transferului datelor Fig2.2 de pe suprafaa magnetic n memoria principal. Acesta este n funcie de viteza de rotaie a discului i de densitatea datelor inregistrate. Acest timp este n general exprimat n mii de baii pe secund. Timpul de transfer al datelor este timpul n care se sper s se ajung la adres i s se realizeze transferul; deci formula de calcul va fi: T=A+R/2+L/D unde A este timpul de cutare, R este timpul de revoluie (rotaie complet), L este lungimea blocului n baii i D este rata de transfer a datelor. Exemplu de calcul pentru inregistrari accesate direct: Sa presupunem c o instituie are depuse datele pe un disc cte trei nregistrri per bloc, (factor de blocare 3) i fiecare nregistrare are 200 de baii. Rata de transfer a datelor este de 806000 baii pe secund. Timpul mediu de cutare este de 30 milisecunde. Discul se rotete cu 7200 rotaii pe minut. Care va fi timpul de transfer al datelor? S fixm mai nti variabilele: A=0.03 secunde Viteza de revoluie pe secund va fi R=7200/60= 120 R=1/120=0.0083 secunde R/2= 0.00415 L/D=600/806000=0.00074

12

Deci: T=0.03+0.00415+0.00074=0.03489 secunde Exemplu cu nregistrari accesate secvenial: S presupunem ca n loc de a accesa un bloc, ca n exemplul precedent, avem de accesat un fiier cu plile fcute de la nceputul lunii. Are sens s considerm ca un astfel de fiier este secvenial umplut n ordinea n care se fac plile i deci cilindri succesivi sunt parcuri pentru scrierea sau citirea unui asemenea fisier secvenial. Se realizeaz, evident, n acest fel o economie de micri ale capetelor de citire-scriere: de exemplu, dac capetele se afla la inceputul fiierului, pe primul cilindru ocupat, timpul de cutare va fi nul sau va fi pus o singur dat, pentru prima cutare, deci el poate fi ignorat. Vor fi numai mici micri la trecerea de la o pist la urmatoarea (pentru alinieri) care poate fi evaluat n medie cu parcurgerea a jumtate de pist. Pe o pist nou, o dat nceput transferul, blocurile pot fi transferate fr interval de rotatie, deci dac avem de parcurs 8 piste, vom avea numai de 8 ori intervalul de rotaie, indiferent de numrul de blocuri transferate. S presupunem, n continuare, c trebuiesc transferate 1000 de blocuri de pe fiecare din cele 8 piste, deci un total de 8000 de blocuri i dac factorul de blocaj este tot 3 asta nsearnn 24000 de nregistrri. Vom presupune, ca i mai nainte, c fiecare nregistrare are 200 de baii deci blocul va fi de 600 de baii. Dac avem de accesat ntregul fiier atunci timpul mediu de acces pe nregistrare va fi: Timpul total de citire a fiierului= 0.00415*8+0.00074*8000=5.9532, iar T=5.9532/8000=0.0007415 secunde Unde Teste timpul mediu de acces la o nregistrare. 2.2 Formate ale datelor memorate pe disc. Formate de pist. Datele se pot memora pe o pist cu cheie sau fr cheie. Este momentul aici s facem diferena ntre nregistrarea logic i fizic; ntre orice dou nregistrri de pe o pist apare un spaiu liber, gap, care are o lungime variabil determinat de posibilitaile hard de citire-scriere i care, evident, ocup loc pe suportul magnetic. Pentru a micora acest spaiu ocupat neproductiv, se grupeaz mai multe nregistrri logice ntr-una singur fizic pe pist, grup care se numete bloc. Acolo unde nu exist confuzie vom folosi noiunea de nregistrare i pentru cea fizic i pentru cea logic, dar cele dou noiuni nu coincid dect cnd blocul conine o singur nregistrare. Numrul de cilindru, numrul de cap (de citire-scriere) i numrul de nregistrare dau o adres unic pe suportul magnetic pentru fiecare nregistrare. Ceea ce se va citi sau scrie, la un moment dat, va fi o nregistrare fizic, addic un bloc (cu probleme rezolvate de soft la sfrit de fiier), iar

13

desfacerea blocului n nregistrri logice este tot o sarcin a sistemului de operare. Dac nregistrarea este blocat, cu cheie atunci cheia nregistrarii fizice (care nu poate fi dect una) va fi cea mai mare cheie dintre cheile din bloc. Formate de inregistrare. Datele pot fi memorate, pe disc, ntr-unul din urmtoarele patru formate: Inregistrri de lungime fix. Aa cum spune i denumirea apare atunci cnd nregistrrile logice sunt de lungime fix, deci ele vor da natere la nregistrri fizice de lungime fix blocate sau neblocate. Atunci cnd nregistrrile logice pot avea lungimi care difer vom avea i nregistrri fizice de lugime variabil (blocate sau nu). Strucura acestor tipuri de nregistrri este prezentat n figura urmtoare. (a) Fixe neblocate .

(b) Fixe blocate.

(c) Variabile neblocate.

(d) Variabile blocate

14

ntrebri i exerciii la capitolul 2 Exerciiul 1. S presupunem c o instituie are depuse datele pe un disc cte patru nregistrri per bloc i fiecare nregistrare are 250 de baii. Rata de transfer a datelor este de 80000 baii pe secund. Timpul mediu de cutare este de 20 milisecunde. Discul se rotete cu 7200 rotaii pe minut. Care va fi timpul de transfer al datelor n acces direct? Exerciiul 2. n aceleai condiii de hard, s presupunem c trebuiesc transferate 1000 de blocuri de pe fiecare din cele 8 piste, deci un total de 8000 de blocuri. Care va

fi timpul de transfer al datelor n acces secvenial? Exerciiul 3. Care sunt factorii de performan ai discului? n capitolele 3,4 i 5 prezentm cele mai importante modele de descriere a datelor n bazele de date. Vei nva despre ele Ce este modelul reea Cum se adapteaz o diagram ER oarecare pentru modelul reea Care este limbajul DDL pentru modelul reea Ce este modelul ierarhic Cum se adapteaz o diagram ER oarecare pentru modelul ierarhic Care este limbajul DDL n limbaju sistemului IMS Ce este modelul relaional Ce este i cum trebuiesc interpretate operaiile n algebra relaional CAPITOLUL 3 MODELUL REEA.

15

Prezentm aici modelul reea aa cum a fost el formalizat de CODASIL . Modelul reea este un model care conine nregistrri, date i relaii 1 la mai muli ntre nregistrri. Legtura dintre nregistrarea client i nregistrarea factur reprezint o relaie de unu- la-mai-multe. nregistrarea de pe partea 1 se va numi proprietar iar cea de pe partea mai-multe se va numi membru.

Relaia unu-la-mai-multe reprezentat mai sus nseamn c exist posibilitatea ca 0 ,1 sau mai multe facturi sa fie n legtur cu un client dat. Exist situaii n care relaia este unu-la-unu de exemplu camionul i oferul, dar ea este tratat la fel. Forma general a unei structuri de date n cazul modelului reea este dat n figura 3.1.

Fig.3. 1 Aceasta schem poart numele de diagrama lui Bachman. In figura 3.2 va fi prezentata o schem a unei structuri de date obinute din diagrama Bachman prin introducerea instanelor (actualele valori ale nregistrrilor din structura de date).

16

Reelele sunt un mod natural de a reprezenta legturile care se stabilesc ntre obiecte. Ele sunt des folosite n matematic, operaii de cutare, chimie, fizic, sociologie i alte domenii de cercetare. Att timp ct marile concerne folosesc obiectele i legturile dintre ele pentru a modela fenomenele comerciale, nu ne va surprinde c arhitectura unei reele este aplicat i n organizarea bazelor de date. n general reelele sunt reprezentate cu ajutorul unei structuri matematice numit graf orientat. 3. 1 Noiuni de baz i definiii. Modelul reea aplicat bazelor de date este reprezentat de o arhitectur pe trei nivele dup cum urmeaz: 1. nivelul conceptual ( aspectul logic al tuturor datelor i al relaiilor din baza de date) numit schema. 2. nivelul extern ( punctele de vedere ale utilizatorilor n ceea ce privete necesarul de date pentru diferitele aplicaii ) numit subschema. 3. nivelul intern ( detalii referitoare la memorarea fizic ) este implicit n faza de implementare. La modelul reea sunt doar dou structuri fundamentale si anume : - mregistrarea sau record (o colecie de date logic legate ntre ele) - legtura sau set (o relaie de unu-la-mai-multe sau unu-la unu ntre dou lnregistrri). Exemplu : nregistrarea unui client trebuie s cuprind urmatoarele date: Clientul, Nume, Adresa, ValoareDatorata, DataultimeiPlati . De reinut : vom identifica aceasta colecie ca o inregistrare client prin specificarea numelui nregistrrii. Toate nregistrrile vor primi nume ca CLIENT, FACTURA, FURNIZOR i aa mai departe.

17

Fig.3.2 n figura 3.2 am aplicat cteva convenii de reprezentare a modelului reea sub form de diagram. Legturile sunt reprezentate prin sgei de la nregistrarea proprietar ctre nregistrarea membru, fiecare legtur avnd un nume corespunzator etichetei din dreptul sgeii. Aceast diagram corespunde unui graf orientat n care nodurile conin nregistrrile iar arcele sunt legturile dintre nregistrri. n figura 3.1 putem vedea trei tipuri de legturi: CLIENT-FACTURA legtura dintre proprietarul CLIENT si membrul FACTURA FURNIZOR-FACTURA legtura dintre proprietarul FURNIZOR i membrul FACTURA FACTURA-LINIEFACT legtura dintre proprietarul FACTURA i membrul LINIEFACT Reea simpl este structura de date n care toate legturile se stabilesc pe baza relaiilor de tip unu-la-mai-multe. Reea complex este structura de date n care toate legturile se stabilesc pe baza relaiilor de tip multe-la-mai-multe. n figura 3.3 este un exemplu de reea complex:

Fig.3.3. Dar o reea complex nu poate fi implementat direct, de aceea este necesar transformarea ei ntr-o reea simpl penru a putea raspunde cerinelor de implementare. Pentru a realiza aceast transformare vom folosi o nregistrare de legtur care are cel puin cheile celor dou entiti proprietar respectiv membru (celelalte

18

atribute pot fi adugate dup dorina proiectantului). Figura 3.4 ilustreaz cum o reea complex este transformat ntr-una simpl.

Fig.3.4

In figura 3.5 vom vedea ce devine schema din fig.3.4 dup introducerea instanelor.

Fig 3.5 3.2.Modelarea conceptual semantic a relaiilor n modelul reea. Modelul reea poate fi gndit ca un model conceptual de date cu toate relaiile limitate la legturi ntre dou obiecte unde relaiile snt de unu la mai multe sau unu la unu. Acestea permit o reprezentare grafic simpl a structurilor de date. n schimbul mulimilor de obiecte ale modelului conceptual de date avem nregistrari logice (nregistrrile vzute din perspectiva utilizatorlui) care snt conectate cu alte nregistrri logice prin conectri fizice conectarea nregistrrilor folosind adresa de pe disc a acestora. Fiecare conectare reprezint o relaie ntre exact dou nregistrri. Relaia dintre dou nregistrri conectate fizic fac trimitere ctre o legtur. Vom considera o ntreprindere avnd urmtoarele departamente: marketing i contabilitate. In figura 3.6 vom prezenta un fragment din modelul

19

Fig.3.6 conceptual de date care ilustreaz relaiile dintre clieni i conturi . In figura 3.7 vom arta cum acest fragment din modelul conceptual este transformat ntr-o sructur de date de tip reea.

Fig.3. 7. In figura 3.8 vom prezenta ce ar nsemna o relaie de unu-la-mai-multe ntre client i cont.

Fig.3. 8 Figura are urmtoarea semnificaie: un client poate avea mai multe conturi dar un cont poate aparine unui singur client. Putem da uor un exemplu n care un cont poate aparine mai multor clieni dar fiecare client poate avea un singur cont.

20

Din precedentele exemple putem deduce urmatoarele reguli de transformare a modelului conceptual In model logic reea. - Regula 1. Pentru fiecare obiect al unei scheme conceptuale se creaz o lnregistrare R in structura de date de tip reea. Toate atributele ei sunt reprezentate ca i cmpuri ale nregistrrii R. - Regula 2. Pentru o relaie unu-la-mai-multe nregistrarea de pe partea 1 devine proprietar, iar nregistrarea de pe partea mai-multe devine membru. Dac relaia este de tipul unu-la-unu atunci proprietarul i membrul pot fi arbitrar alei. 3.2.1. Transformnarea unei relaii n-are. ntr-o ntreprindere pot aprea relaii pe trei ci ,dup cum se poate vedea n figura 3.8 acestea nesatisfcnd cerinele unei relaii binare. Totui exista o cale pentru a indeplini aceste cerine ,lucru aratat in figura 3.9.

Fig.3.9. - Regula 3. Pentru orice relatie n-ara ,n > 2,se creaza o nregistrare de conectri care va fi o nregistrare membru corespunztoare nregistrrilor proprietar obinute pe partea n a relaiilor de tip unu-la-mai-multe obinute n urma acestei transforrnri. 3.2.2. Transformarea relaiilor n la m. Am vzut deja, n fig 3.3 c o relaie poate fi n la m. Iat, n continuare un alt exemplu: un produs poate fi fcut de mai muli furnizori i un furnizor poate face mai multe produse.

21

Pentru aceasta diagram un exemplu de instan ar putea fi cel din diagrama urmtoare

- Regula 4. Pentru o relaie mai-multe-la-mai-multe ntre dou obiecte O1 i O2 se creaz o nregistrare de conectri care devine nregistrare membru pentru fiecare dintre nregistrarile proprietar corespunztoare obiectelor O1 i O2 . 3.3.Limbajul de definire al datelor (DDL). n 1971 grupul Database Task Group a publicat un raport naintat la ANSI ( American Standard Institute) pentru standardizare. Raportul creaz modelul CODASYL DBTG care a stat la baza mai multor modele comerciale cum ar fi S (Honeywell) IMS (Computer Associates). Limbajul DDL pentru descrierea schemei, al DBTG este prezentat n continuare pe un exemplu. Dup cum am vzut mai nainte, schema conceptual trece prin mai multe stadii pentru a putea fi transpus n model reea. Paii acestei transformri sunt: 1. Crearea poiectului conceptual. 2.1 Transformarea modelului conceptual n model reea urmrind 2.1 relaiile 1 la n se vor transcrie fr probleme n DDL . 2.2 Relaiile n la m se transform n dou seturi avnd relaii 1 la n adugnd entitatea necesar de legatur. 2.3 Dac sunt relaii complexe, n-are, se convertesc n relaii binare conform modelului prezentat . 3. Se traduce n DDL modelul obinut. n acest limbaj avem componentele: seciunea record (nregistrri)

22

seciunea set care specific legturile dintre nregistrri. S considerm diagrama conceptual din fig 3.10

fig.3.10. Transformat n model reea se poate vedea n figura urmtoare.

Acest model d natere la urmtoarea secven n DDL al DBTG. 1. SCHEMA NAME IS INTRARI 2. RECORD NAME IS CLIENT 3. CLIENT-ID TYPE IS NUMERIC INTEGER 4. NUME TYPE IS CHARACTER 15 5. ADRESA TYPE IS CHARACTER 20 6. VAL-CONT TYPE IS NUMERIC (5.2) 7. RECORD NAME IS FACT 8. NRFACT TYPE IS NUMERIC INTEGER 9. DATA TYPE IS CHARACTER 9

23

10. RECORD NAME IS LINIE-FACT 11. COD-PROD TYPE IS NUMERIC INTEGER 12. PRET TYPE IS NUMERIC (13.2) 13. CANT TYPE IS NUMERIC (6.2) 14. CLIFACT 15. OWNER IS CLIENT 16. MEMBER IS FACT 17. FACTLIN 18. OWNER IS FACT . 19. MEMBER IS LINE-FACT n programe se va defini numai subschema care d un acces limitat la date. Limbajul DBTG mai conine i partea cu care se descriu algoritmii aplicaiilor. ntrebri i exerciii la capitolul 3. Exerciiul 1. Ce este modelul reea? Exerciiul 2. Dai un exemplu de transformare a unei reele complexe n diagram utilizabil n modelul reea. CAPITOLUL 4 MODELUL IERARHIC. Modelul ierarhic a fost dezvoltat primul n ordine istoric i, dei se bazeaz pe teoria grafurilor, nu are un standard ca i modelele relaional sau reea. SGBD-ul de referin pentru modelul ierarhic este IMS (Information Management System) dezvoltat de IBM i North American Association (mai trziu Rockwell) ncepnd din anii 1960 n legtur cu proiectul APOLLO. Ceea ce se transcrie n stuctura extern modelul ierarhic este o arboresce grafic, un graf orientat, conex fr cicluri. Alte proprieti ale acestui tip de graf ar fi: exist un singur vrf, numit rdcin, n care nu este incident nici un arc exista varfuri, numite frunze, din care nu pleac nici un arc; orice varf, dac nu este frunz, poate avea mai muli descendeni (direci), vrfuri la care se poate ajunge parcurgnd un singur arc orice varf, n afar de rdcin, are un printe unic (vrful al crui descendent este).

24

Rezult din aceste definiii c o schem, ca cea din urmtorul exemplu, care nu pune nici o problem pentru transformare n model reea, trebuie transformat pentru modelul ierarhic.

De la schema conceptual se transform, pentru modelul ierarhic, n schema urmtoare:

Pentru c, n prima imagine, o persoan ar putea avea doi prini, unul ca apartenen la o secie i altul ca apartenen a persoanei la un lot de pensionare la o anumit dat. Putem deduce de aici cteva principii: Modelul ierarhic transpune scheme E-R de tipul 1 : n, n particular 1 :1. A doua apariie a unei entiti poate fi numai o referin la prima apariie. Dei noiunile folosite n legtur cu modelul ierarhic difer puin de cele de la modelul reea, exist totui multe asemnri. Exist, n legatur cu modelul ierarhic, dou noiuni de baz: printe i relaie printe-copil (PCR). Segmentul este analogul lui record din structura reea, iar PCR este analog cu set din modelul reea cu

25

diferena, care de altfel decurge din regulile de mai sus, c un segment poate fi descendentul unui singur printe. S vedem, n continuare, cum se transform alte tipuri de scheme conceptuale pentru a fi descrise cu modelul ierarhic:

Fig.4.1 Figura 4.1 Este un exemplu de arbore cu trei nivele, reprezentnd entitile SECTIE, PERSONAL, FUNCTIE, PROIECT ca segmente. Apariiile nregistrrilor corespunztoare segmentelor unui arbore pot fi realizate n memorie folosind metoda de parcurgere n preordine. S lum, de exemplu, o instan pentru schema din figura de mai sus:

26

Parcurgerea n preordine (algoritmul se gasete n capitolul arbori binari) se refer la posibila transformare a acestui arbore oarecare n arbore binar, n care cei doi fii ai unui vrf vor fi: primul descendent i primul frate. Putem ns enuna preordinea i pentru arbori oarecare (aceast parcurgere mai poate fi gsit i sub numele de parcurgere n adncime). 1. Se ncepe din rdcina arborelui i se nregistreaz rdcina 2. La fiecare vrf, dup ce s-a nregistrat segmentul respectiv, se nregistreaz segmentul celui mai din stnga descendent al segmentului care a fost nregistrat. Dac nu mai exist descendeni ne ntoarcem cu un nivel mai sus i nregistrm cel mai din stnga descendent nenregistrat nc; procedeul se continu pn se epuizeaz segmentele arborelui. Aceast procedur, pentru graful urmtor, d secvena de nregistrri din fig.4.2

fig.4.2 Iteraie Segment Tip de segment 1 A S 2 B P 3 E F 4 F PR 5 G PR 6 C P 7 H F 8 I PR 9 D P

27

10 11

J F K PR Deoarece modelul ierarhic nu are standard vom prezenta , n continuare, limbajul IMS de descriere al datelor (DDL) pentru figura 4.1. 1 DBD NAME = SECTPERS, ACCESS = HISAM 2 SEGM NAME = SECTIE, PARENT = 0, BYTES = 20 3 FIELD NAME = (SECNUME,SEQ,U), BYTES = 10, START = 1, TYPE = C 4 FIELD NAME = MANAGER, BYTES = 10, START = 11, TYPE = C 5 SEGM NAME = PERSONAL, PARENT = SECTIE, BYTES = 22 6 FIELD NAME = (PERSNUME,SEQ), BYTES = 20, START = 1, TYPE = C 7 FIELD NAME = VECHIME, BYTES = 2, START = 21, TYPE = P 8 SEGM NAME = FUNCTIE, PARENT = PERSONAL, BYTES = 17 $ 9 FIELD NAME = (CODFUNCTIE,SEQ), BYTES = 2, START = 1, TYPE = P 10 FIELD NAME = NUMEFUNCTIE, BYTES = 15, START = 3, TYPE = C 11 SEGM NAME = PROIECT, PARENT = PERSONAL, BYTES = 4 12 FIELD NAME = (NUMEPROIECT,SEQ), BYTES = 2, START = 1, TYPE = P 13 FIELD NAME = DIVIZIE, BYTES = 2, START = 5, TYPE = C 14 DBGEN Segmentele (SEGM) sunt simbolurile din limbaj ale nodurilor grafului, PARENT = 0 nseamn c nodul SECTIE este rdcina grafului, BYTES stabilete lugimea segmentului, NAME = ( SECNUME, SEQ, U) nseamn c o nou memorare trebuie fcut ind cont de valoarea cmpului din segment, iar U nseamn c SECNUME trebuie s fie unic, START semnific numrul locaiei de nceput al cmpului n segment, TYPE = P i TYPE = C reprezint tipuri de date decimal mpachetat respectiv caracter. Metode de acces: IMS furnizeaz patru metode de acces : HSAM, ISAM, HDAM si HIDAM. Alegerea unei astfel de metode se face cu ACCESS = < metoda de acces aleas >. Vom prezenata sumar aceste patru metode: - HSAM HSAM nseamn hierarchic sequential acces method.Este metoda de acces secvenial la baza de date ierarhic. Segrnentele sunt memorate fizic n poziii alturate i poate fi implementat pe disc sau band. Segmentele sunt

28

ordonate conform schemei de parcurgere n preordine care pstreaz structura ierarhic. Aceast metod este util numai pentru citirea datelor adic nu este destul de flexibil pentru actualizrile bazelor de date. - HISAM HISAM nseamnhierarchic indexed-sequential acces method. Este metoda de acces indexat-secvenial la baza de date ierarhic care memoreaz segmentele ca i n metoda HSAM dar d posibilitatea accesului direct la un anumit segment rdcin cu ajutorul indexului, dup care accesul la segmentele dependente se face secvenial ca i n metoda HSAM. - HDAM HDAM nseamn hierarchic direct- acces method. Este metoda de acces direct la baza de date ierarhic. Aceast metod nu leag segmentele prin index sau apropiere fizic ci prin pointere adic cmpuri care conin adrese pe disc. Accesul la o anumit rdcin se face folosind algoritmi de repartizare. (vezi cap.10) - HIDAM HIDAM nseamn hierarchic indexed direct- acces method. Este o metod de acces direct indexat care nseamn acelai lucru ca i HDAM dar permite accesul indexat la o anumit rdcin ca i accesul prin pointere la segmentele dependente. ntrebri i exerciii la capitolul 4. Exerciiul 1. Cu ce difer modelul ierarhic de modelul reea? CAPITOLUL 5 MODELUL RELAIONAL . Sistemele de gestiune ale bazelor de date relaionale (notate pe scurt SGBDR) au devenit principalul soft n prelucrarea datelor folosite astzi. Acest soft reprezint a doua generaie a SGBD-urilor i este bazat pe modelul relaional introdus de E.F.Codd n 1970. n modelul relaional toate datele Sunt logic structurate prin relaii (tabele). Fiecare relaie are un nume cruia i corespunde o coloan de tabel (atribut). Fiecare tuplu (linie de tabel) conine o valoare a fiecrui atribut. Un mare avantaj al modelului relaional este aceast structur logic simpl. 2.1. Scurf istoric al modelului relaional. Modelul relaional a fost propus pentru prima dat de catre E.F.Codd n seminarul Modelul relaional al datelor pentru partajarea marilor date bancare n 1970. Un alt model asamblist a fost propus de catre Childs, n 1968, care a subliniat faptul c orice structur de date poate fi prezentat prin una sau mai multe tabele de date, n cadrul crora este necesar s existe i informaii de legtur, pentru asigurarea legturilor ntre tabele. Codd, ns,

29

are meritul de a fi accentuat i dezvoltat ideile cu privire la utilizarea teoriei mulimilor sub forma unui model coerent de structurare a datelor, i anume modelul relaional. Sistemele comerciale bazate pe modelul relaional au nceput s apar n ultimii ani ai perioadei 1970. Acum sunt mai mult de 100 de SGBDR, chiar dac multe nu respect ntocmai definiia modelului relaional. Datorit popularitii modelului relaional, multe dintre sistemele non-relaionale furnizeaz interfaa relaional. 2.2. Modelul relaional al datelor. 1. Structura relaional a datelor. n cadrul bazelor de date relaionale, datele sunt organizate sub forma unor tablouri bidimensionale (tabele) de date, numite relaii. Asocierile dintre relaii se reprezint explicit prin atributele de legtur. Aceste atribute figureaz ntr-una din relaiile implicate n asociere. Selecia este operaia care creeaz dintr-o relaie-operand o relaierezultat cu aceeai schem, dar n care sunt incluse numai tuplele pentru care predicatul de selecie este adevrat.

Oras=brasov (student) va avea ca rezultat:

Proiecia este operaia care creeaz dintr-o relaie-operand o relaie-rezultat care are acelai numr de tuple dar are numai o parte din atribute. De exemplu

nume,oras

(student)

va avea tuplele:

30

Produsul cartezian a doua relaii-operanzi are ca rezultat o relaie-rezultat cu atributele formate din reuniunea celor dou mulimi de atribute ale operanzilor i ca tuple, pentru fiecare tuplu din prima relaie toate tuplele din a doua relaie (deci ca numr produsul numerelor tuplelor celor doua relaii-operanzi). Deci dac avem schema catalog=(nr_mat,materia,note) cu avea tupele: nr_mat 22 22 102 102 1330 Materia Matematica Engleza Matematica Engleza Matematica note 10 9 8 9 5

Atunci produsul cartezian student X catalog va avea tuplele: Student.nr_mat nume 22 Avram Ion 22 Avram Ion 22 Avram Ion 22 Avram Ion 22 Avram Ion 102 Condr u Marin 102 Condr u Marin 102 Condr u Marin 102 Condr u Marin ora Braov Braov Braov Braov Braov Catalog.nr_mat materia note 22 matematica 10 22 102 102 1330 engleza 9

matematica 8 engleza 9

matematica 5 matematica 10 engleza 9

Craiova 22 Craiova 22 Craiova 102 Craiova 102

matematica 8 engleza 9

31

102 1330 1330 1330 1330 1330

Condr u Marin Pop Nelu Pop Nelu Pop Nelu Pop Nelu Pop Nelu

Craiova 1330 Braov Braov Braov Braov Braov 22 22 102 102 1330

matematica 5 matematica 10 engleza 9

matematica 8 engleza 9

matematica 5

Aceast tabel este greu de neles la ce ar fi bun. De ce s-l legm pe un anumit student de toate notele? Avem ns i alte operaii mai utile. Echijonciunea face de fapt o selecie dup un predicat n produsul cartezian. Dac vom lua Student

student.nr_mat=catalog.nr_mat(student X catalog)
vom obine tabela: Student.nr_mat nume 22 Avram Ion 22 Avram Ion 102 Condr u Marin 102 Condr u Marin 1330 Pop Nelu ora Braov Braov Catalog.nr_mat materia note 22 matematica 10 22 engleza 9

Jstudent.nr_mat=catalog.nr_mat catalog =

Craiova 102 Craiova 102 Braov 1330

matematica 8 engleza 9

matematica 5

32

Se observ c de data aceasta operaia leag fiecare student de nota lui n mod natural. De ce s mai avem atunci de dou ori atributul Nr_mat? Join-ul natural a dou relaii are un efect similar cu echijonciunea, pe atribute care n cele dou relaii-operanzi au acelai nume i n relaia rezultat atributele respective apar o singur dat. De exemplu: Student N catalog Va avea tuplele:

Reuniunea se poate aplica numai la dou relaii care au aceeai schem i are ca rezultat relaie cu schema iniial i cu tuplele din ambele relaii operanzi. Intersecia se poate aplica numai la dou relaii care au aceeai schem i are ca rezultat o relaie cu schema iniial i cu tuplele - numai tuplele comune celor dou relaii iniale. Diferena se poate aplica numai la dou relaii care au aceeai schem i are ca rezultat o relaie cu schema iniial i cu tuplele care sunt n prima relaie dar nu i n a doua relaie. Exemplele se pot da uor de ctre cititor devreme ce noiunile sunt analoage cu binecunoscutele noiuni omonime din teoria mulimilor. Restriciile de integritate ale modelului relaional permit definirea strilor coerente ale bazei de date. 2.3. Structura relaional a datelor. Modelul relaional este bazat pe conceptul matematic de relaie care este fizic reprezentat de o tabel. Cunoscutul matematician Codd folosete termionologia matematic din teoria mulimilor i logica predicatelor n definirea modelului relaional.

33

Prezentarea structurii relaionale a datelor impune definirea noiunilor de: relaie, atribut, domeniu i schem a unei relaii. Trebuie adaugat aici c orice tabel are urmatoarele proprieti: nu exist rnduri duplicate, nu exist nume de coloane duplicate ordinea rndurilor nu este important ordinea coloanelor nu este important valorile atributelor sunt atomice ( nedecompozabile). o relaie este o tabela cu linii i coloane. n modelul relaional, relaiile sunt folosite pentru a pstra informaii despre obiectele care sunt reprezentate n baz. Relaia este reprezentat printr-un tablou bidimensional, n care liniile reprezint nregistrrile individuale (tuplele), iar coloanele reprezint atributele. Un SGBDR necesit ca baza de date sa fie perceput de ctre utilizatori doar sub forma unei tabele. Atributul unei relaii este o coloan a relaiei, caracterizat printr-un nume. Numele coloanei exprim semnificaia valorilor din cadrul coloanei respective. Domeniul este un set de valori permise pentru unul sau mai multe atribute. Acest concept are o mare greutate n modelul relaional. Fiecare atribut are asociat un domeniu. Domeniile pot fi distincte pentru fiecare domeniu n parte, sau pot exista dou sau mai multe atribute definite pe acelai domeniu. Totodat, acest concept are o mare importan deoarece permite utilizatorului s defineasc ntr-o poziie central semnificaia i sursa valorilor pe care atributul le poate lua. O importan aparte n cadrul relaiei o are semnificaia valorilor. Semnificaia valorilor din cadrul unui tuplu se stabilete att pe baza domeniilor crora aparin valorile, ct i n funcie de poziia ocupat n cadrul tuplului. Dependena fa de ordinea valorilor n tuplu ar nseamna o reducere a flexibiliii organizrii datelor. Pentru a diferenia coloanele care conin valori ale aceluiai domeniu i a elimina astfel dependena de poziia din cadrul tabelei se asociaz fiecrei coloane un nume distinct, ceea ce duce la apariia noiunii de atribut. Tot din punct de vedere al semnificaiei valorilor, putem spune c relaia reprezint un subansamblu al produsului cartezian de mai multe

34

domenii, subansamblu caracterizat printr-un nume i care conine tupluri cu semnificaie. n cadrul modelului relaional nu intereseaz dect relaiile finite, chiar dac la construirea relaiilor se admit domenii infinite. Numrul valorilor dintr-un tuplu poart numele de grad al relaiei. Gradul unei relaii este parte a intensiei unei relaii. Cardinalul unei relaii este numrul tuplurilor coninute n respectiva relaie. Prin contrast fa de gradul relaiei, numrul tuplurilor este numit cardinalul relaiei, iar schimbarea cardinalului unei relaii se face prin tergerea sau adugarea de tupluri. Cardinalul este o proprietate a extensiei ( intensia i extensia vor fi definite puin mai jos, n cadrul schemei unei relaii). Structura unei relaii, mpreun cu o specificare a domeniilor pentru valori formeaz schema unei relaii. Schema unei relaii este adesea cunoscut i sub denumirea de intensie a relaiei, ca expresie a proprietilor comune i invariante ale tuplurilor care compun relaia. ntrebri i exerciii la capitolul 5. Exerciiul . Se dau relaiile cu schema: Carte=(id_carte,titlu,c_edit,c_domeniu) Domenii=(c_domeniu,d_domeniu) Edituri=(c_edit,d_edit,oras, str, nr) Autor=(c_aut,nume_aut) Carteaut=(id_carte,c_aut) S se exprime nalgebra relaional cererile: 1. Titlurile crilor din domeniul stiinta 2. Editurile din brasov 3. Crile scrise de Ion Ion 4. Crile scrise numai de Ion Ion (ca singur autor) CAPITOLUL 6 ARBORI BINARI. n acest capitol vom nva: Ce sunt arborii binari Cum se memoreaz ei Cum se parcurg arborii binari Cum se transform un arbore oarecare n arbore binar

35

Ce este un nomenclator Un arbore n care orice vrf are zero, unul sau doi descendeni se numete arbore binar. Un arbore binar care are numai vrfuri cu nici un descendent sau cu doi descendeni se numete arbore strict binar. (Un astfel de arbore de folosete, de exemplu, la reprezentarea n memorie a unei expresii aritmetice.) Exemplu: expresia (a+b)*c - 2/c^3.5 unde (x^y nseamn x la puterea y) - se va reprezenta astfel : fig. 6.1

Frunzele acestui arbore ( nodurile fr descendeni) conin operanzii, iar celelalte noduri conin operaiile. Deoarece nu toate operaiile sunt comutative este foarte important dac un nod este descendent pe stnga sau pe dreapta. Rdcina unui arbore este nodul care nu este descendentul nici unui nod. Alocarea unui arbore binar se poate face: secvenial, nlnuit sau mixt. 1) Alocarea secvenial a unui arbore binar n vectorul (x(I))I=l,n) vom avea urmtoarele reguli: rdcina este n x(1) pentru fiecare nod x(I) descendentul din stnga este x(2*I) iar cel din dreapta este x(2 *I+1) dac nu exist descendent se pune *. Reprezentarea secvenial a arborelui din fig. 1 este :

36

Observaie : x(20), ... , x(27) sunt poziii din vector neutilizate.Vom folosi aceast alocare n capitolul destinat cozilor de prioritate pentru a construi o structur asemntoare denumit HEAP. Exemple de parcurgeri: 1- parcurgerea arborelui din fig.6.1 n preordine -,*,+,a,b,c,2,/,^,c,3.5 aceasta scriere se nmete scriere polonez prefixata pentru o expresie aritmetic. 2- parcurgerea arborelui din fig. 1 n inordine a,+,b,*,c,-,2,/,c,^,3.5 aceasta este scrierea obinuit a expresiilor matematice (operaiile sunt scrise n ordinea efecturii lor). 3- parcurgerea arborelui din fig. 1 n postordine a,b,+,c, *,2,c, ^,3.5,/,aceasta scriere se numete scriere polonez postfixat a unei expresii aritmetice.

PREORD_IT(RAD) STIVA = {Stiva este vid} P=RAD {P conine nodul care se vizitez} Repet Repet Dac P * atunci{Parcurgere pe stnga} Scrie INFO(P); P=>STIVA P=LS(P) Cicleaz altfel EXIT Sdaca sciclu {Parcurgere pe dreapta} Dac STIVA = atunci EXIT Altfel P<=STIVA ; P= LD(P) Sdaca Sciclu Return Algoritmul se poate modifica uor pentru INORDINE_IT, dar pentru POSTORDINE_IT este nevoie de dou stive. Exerciiul 1.

37

Scriei algoritmul pentru inordine iterativ.

Exerciiul 2. Scriei algoritmul pentru postordine iterativ.

Un exemplu des folosit este structura unui produs format din ansamble, subansamble i aa mai departe pn la piese simple. Aceast structur d natere unui arbore oarecare cum ar fi cel din figura 6.2.

38

Fig.6.2 Exist o metod de a construi un arbore asociat care, de aceast dat, este binar. Transformarea se face n felul urmtor : pentru fiecare nod descendentul din dreapta este fratele urmtor (elementul urmtor aflat la acela nivel de descompunere). Astfel arborele din fig.6.2 d natere unui

arbore binar ca cel din fig.6.3.

39

Fig 6.3. Parcurgerea n preordine a acestui arbore binar asociat d aceeai ordine a nodurilor ca i parcurgerea n adncime a arborelui oarecare iniial (fapt pentru care se spune cte odat ordine de parcurgere n preordine pentru arborele oarecare). Lista parcurgerii n preordine n acest caz concret este nomenclatorul de produse i este o list reprezentativ care intr n reclama

produsului. Ea arat n felul urmtor: Diagrama E-R conceptual pentru nomenclatorul de produse arat n prima instan aa: Repere = (CodRep, Denum,. . .) Stuctura = (CodRep,CodRep,Cant) De exemplu, pentru arborele de mai sus, se obin instanele:

40

Repere

Structura

Structura ntrebri i exerciii la capitolul 6. Exerciiile 1 i 2 sunt n text referitoare la parcurgerea arborilor binari n inordine i postordine nerecursiv. Exerciiul 3. Se d A,B,C,D,E,F,G,H parcurgerea n preordine a unui arbore binar i B,A,E,D,C,F,H,G parcurgerea n inordine a aceluiai arbore. S se deseneze arborele. Exerciiul 4. S se scrie algoritmul pentru exerciiul 3.

CAPITOLUL7 COZI DE PRIORITATE (cu HEAP).

41

HEAP -ul este o structur de date care memoreaz un arbore binar complet ntr-un vector. Fiecare nod al arborelui corespunde unui element al vectorului unde se memoreaz valoarea din nod. Arborele este echilibrat, adic numai ultimul nivel este eventual incomplet. Un vector A care reprezint un Heap este caracterizat de dou atribute: n=lung(A) care este numrul elementelor memorate n vector i Heap- C lung(A) care este numrul de elemente ale Heapului din vectorul A. Deci Heap-Iung(A)~lung(A). Rdcina arborelui este ntotdeauna A(l) si dndu-se un indice i al unui nod, indicii printelui Par(i) , fii din stnga LS(i) i din dreapta LD(i) pot fi calculai conform algoritmilor : Functie Par(i) ... Par = Li/2J Return Functie LS(i) LS = 2*i Return Functie LD(i) LD = 2*i + 1 Return Pe cele mai multe computere funcia LS poate calcula 2*i printr-o singur instruciune deplasnd ctre stnga peste o poziie binar reprezentarea binara a lui i. Similar, funcia LD poate calcula rapid 2*i + 1 prin deplasare ctre stnga peste o poziie binar reprezentarea lui i i modificnd n 1 cel mai din dreapta bit. Funcia Par poate calcula i/2 printr-o singur instruciune deplasnd ctre dreapta peste o poziie binar reprezentarea binar a lui i. Reprezentarea unui arbore binar ntr-un vector oarecare .

42

Acest arbore este un arbore binar echilibrat i are adncimea h = log2n. O structur creia i se poate pune n coresponden un arbore echilibrat se numete HeapMax dac orice nod are o valoare mai mare dect oricare din fii si. (Dac orice nod are o valoare mai mic dect oricare dintre fii si atunci structura se numete HeapMin ). Algoritmul de heapificare a unui vector cu n componente ncepnd de la a i-a component este: HEAPIFY(A ,i) L = 2*i R = 2*i + 1 Daca L <= Heap-lung(A) i A(L) > A(i) atunci Imax = L Altfel Imax = i Sdaca Daca R <= heap-lung(A) i A(R) > A(imax) atunci

43

Imax=R Sdaca Daca Imax I atunci A(i) A(imax) Sdaca Cheama HEAPIFY(A, Imax) return Algoritmul pentru construcia unui heap este urmtorul: CHEAP(A ,n) Heap-lung(A) = n pentru i =n/2,1,-1 cheama HEAPIFY (A ,i) Spentru Fiierul al crui arbore ataat este:

se hipific n felul urmtor: Pentru I=5

1
44

1 0 0 0 0 0

i
7 9

1 0 0 0 0 0

45

1 0 7 9 3 0

1 0 7 9 3 0

46

Heap-ul dup terminarea algoritmului va arta astfel :


1 0 8 9

3 0

Se poate observa c timpul de execuie al lui Heapify depinde de nlimea nodului n arbore. n heap avem pentru orice nlime h avem [n/2h+1] noduri de nlime h. Cunoscnd aceasta putem calcula timpul de execuie. T(n)= [n/2h+1]*O(h) = O(n* [h/2h+1])= O(n)
h=0,lg(n) h=0,lg(n)

Algoritmul Heapify este de complexitate O(n). Structura de Heap este foarte util: am vzut n cursul de Algoritmic c HeapSort-ul este un excelent algoritm de sortare. n continuare vom prezenta cea mai utilizat aplicaie a unui Heap i anume coada de prioriti. Coada de prioriti este o structur de date care pstreaza elementele unei mulimi S n care fiecrui element i este asociat o valoare numit prioritate. 7.1 Operaii asupra unei cozi de prioriti: 1) Introducera unui element x n S Insert(S,x)

47

2) Determinarea elementului cu cea mai mare cheie Maxim(S) : 3) Extragerea elementului cu cea mai mare cheie Extract_Max(S) Una dintre aplicaiile cozii de prioriti este gestionarea proceselor n programarea partajat. Coada de prioriti pstreaz lista proceselor care trebuie s fie efectuate i prioritile acestora. Cnd un proces s-a ncheiat sau s-a ntrerupt se introduce un nou proces, alegerea acestuia se face n funcie de prioritatea ataat. Deci se va folosi Extract_Max(S) pentru alegerea procesului cu cea mai mare i Insert(S ,x) pentru a-l introduce n lucru. O coad de prioriti poate fi folosit i n simularea conducerii evenimentelor. n continuare vom prezenta algoritmii care implementeaz cu ajutorul Heap-ului operaiile care se pot efectua asupra unei cozi. Extract_Max(A,max) Daca Heap-lung(A) < 1 atunci EROARE heap vid Sdaca max = A(l) A(l) = A(Heap-lung(A) ) Heap-lung(A) = Heap-lung(A) - 1 Cheama Heapify(A,l) Return Evident c, deoarece heapul s-a stricat doar la vrf, Heapify(A,l) va parcurge doar o singur dat arborele de la rdcin la o frunz, deci complexitatea va fi O(lg n). Insert(A,cheie) Heap-lung(A) = Heap-lung(A) + 1 i= Heap-lung(A) Att timp ct i> 1 i A(Par(i)) < cheie A(i) = A(Par(i)) i= Par(i) A(i) = cheie Sciclu Si aceast procedur va parcurge doar o singur dat arborele de la rdcin la o frunz, deci complexitatea va fi O(lg n).

48

Figura urmtoare ilustreaz operaia Insert asupra heap-ului a) n care urmeaz s fie inserat un nod cu cheia 15.
1 0 8 9

3 0

a)

1 5

1 0 8 9

1 5

3 0

6 1 0

49

1 5 4 8 4

3 0

1 5 0 1 0 4 8 4 9

3 0

Cheia 15 a fost iserat la locul ei. Putei observa, pe succesiunea de arbori, c s-a creat mai nti locul i apoi, 15 a trecut la locul corect urcnd n sus n arbore, din printe n printe. ntrebri i exerciii la capitolul 7. Exerciiul 1. Artai cum se poate implementa o stiv cu ajutorul unui HEAP. Exerciiul 2. Artai cum se poate implementa o coad cu ajutorul unui HEAP. Exerciiul 3. Avnd un arbore binar memorat secvenial scriei algoritmul care listeaz nodurile fr descendent stng.

50

CAPITOLUL 8 ARBORI BINARI DE CUTARE . n acest capitol vom nva: Ce sunt arborii binari de cutare Ce operaii se fac cu acti arbori Care este complexitatea acestor algoritmi Arborii de cutare sunt structuri de date care suport foarte multe operaii cum ar fi : SEARCH (cautare), MINIMUM, MAXIMUM, PREDECESOR, SUCCESOR, INSERT (introducere) i DELETE (tergere). Un arbore de cutare poate fi folosit att ca dicionar ct i ca o coad de prioriti. Operatiile de baz pe un arbore binar de cutare au timpul proporional cu nlimea arborelui. Pentru un arbore binar complet aceste operaii se execut n cel mai ru caz n O(lg n). Dac arborele este o nlnuire liniar de n noduri atunci aceleai operaii se vor face n cel mai ru caz n O(n). n practic nu putem garanta ntotdeauna randomizarea construirii arborilor de cutare, dar sunt anumii arbori binari de cutare (arborii rounegru, arborii balansai) ale cror performane sunt bune pentru operaiile de baz, chiar i n cel mai ru caz. 8.1.Ce este un arbore binar de cautare? Un arbore binar de cutare este organizat, dup cum ne sugeraz i numele, ca un arbore binar cum vedem n figura 8.1

fig.8.1 Acesta este un arbore binar de cutare cu 6 noduri i nlime 2. Un asemenea arbore poate fi reprezentat de o structur de date nlnuit n care fiecare nod este un obiect. ntr-un nod x avem |KEY | ADR | LS | LD |

51

P | KEY(x) nsemn valoarea cheii din nodul x, informaia de lng KEY se mai numete i informaie satelit (SAT), legtura la copilul din stnga, legtura la copilul din dreapta, i printele nodului x. Dac un copil sau un printe lipsesc, cmpul corespunzator va conine NIL. Fie un arbore care conine aceleai chei cu cel din fig.8.l dar cu nlimea 4 i mai puin eficient a crui reprezentare o gsii n figura 8.2. Definiie Un arbore binar de cutare este un arbore binar care satisface condiia:

fig.8.2. a) Pentru orice nod y care se afl ntr-un subarbore stng al nodului x KEY(y) ~ KEY(x) b) Pentru orice nod y care se afl ntr-un subarbore drept al nodului x KEY(x) ~ KEY(y) Aceasta proprietate a unui arbore binar de cutare ne permite s extragem toate cheile sortate cu ajutorul unui simplu algoritm recursiv printr-o parcurgere n inordine. INORD_PARC (x) Daca LS(x) NIL atunci Cheama INORD_P ARC(LS(x)) Scrie KEY (x) Cheama INORD_P ARC(LD(x)) Sdaca 8.2.Operaii asupra unui arbore binar de cutare. Cea mai comun operaie efectuat asupra unui arbore binar de cutare este cutarea unei chei memorat n arbore careia i vom spune cutare binar.

52

Aceasta structur mai suport i interogri de tipul care este Minimumul, Maximum-ul, Succesor-ul, Predecesor-ul?. n continuare vom examina aceste operaii i vom vedea c fiecare se poate face ntr-un timp proporional cu nlimea arborelui, deci O(h). n figura 8.3 vom exemplifica care este calea de cutare a cheii 13.

Fig.8.3. Cutarea cheii 13 trebuie fcut pe partea stng a rdcinii - 15, unde gsim cheia 6, deci cutarea trebuie continuat pe partea dreapt, unde gsim cheia 7, vom continua cutarea pe partea dreapt i gsim cheia 13. Calea acestei cutari este: 15-6-7-13. Vom folosi urmtorul algoritm pentru a cuta ntr-un arbore binar de cutare un nod cu cheie dat: CAUT_BIN(Rad, k, Rez) x=Rad Atat timp cat x Nil i k KEY(x) Daca k <KEY(x) atunci x = LS(x) altfel x = LD(x) Sdaca Sciclu Daca x = Nil atunci Rez =Nil altfel Rez =ADR(x) Sdaca

53

return MINIMUM i MAXIMUM. Un element al unui arbore binar de cutare, a carui cheie este minim, poate fi gsit urmrind pointerele descendenilor din partea stng ncepnd de la rdcin pn cnd este ntlnit o adres = Nil. Urmtorul algoritm determin nodul de cheie minim a unui arbore cu rdcina Rad: MIN_BIN (Rad, Min) x = Rad Atat timp cat LS(x) Nil x = LS(x) Min=KEY(x) Return Exerciiul 1. Algoritmul pentru determinarea nodului cu cheia maxim este simetric cu cel de mai sus i v propunem s-l scriei aici:

SUCCESOR i PREDECESOR Fiind dat un nod ntr-un arbore binar de cutare, cteodat este important s-i gsim succesorul n irul sortat al cheilor obinut prin parcurgerea n inordine. Dac toate cheile sunt distincte succesorul unui nod x este nodul cu cea mai mic cheie, mai mare dect KEY(x). Structura arborilor binari de cutare ne permite s determinm succesorul unui nod fr a compara vreodat cheile. Urmtorul algoritm determin succesorul nodului x dac acesta exist i returnaz Nil dac x este cea mai mare cheie din arbore: SUCC_BIN(x, y) Daca LD(X) Nil atunci Cheama MIN_BIN(LD(x), y) Return sdaca y =P(x) Atat timp cat y Nil i KEY(y)<KEY(x) x=y

54

y = P(y) sat Return Algoritmul pentru succesor este rupt n doua cazuri: Dac sub arborele drept al nodului x nu este gol, atunci succesorul lui x este cel mai din stnga nod al subarborelui drept, pe care l gsim chemnd MIN_BIN. Dac subarborele drept al nodului x este gol i x are un succesor y, atunci y este cel mai mic stramo al lui x i copilul stng al lui y este deasemenea un stramo al lui x. Exerciiul 2. Algoritmul pentru determinarea predecesorului este simetric cu cel de mai sus i l lsm ca exerciiu pentru cititor.

INSERAREA i ERGEREA Operaiile de inserare i tergere aplicate unei mulimi dinamice reprezentate de un arbore binar de cutare cauzeaz schimbari n arbore. Structura de date trebuie modificat ca s reflecte aceste schimbri, dar proprietile arborelui binar de cutare trebuie s fie n continuare pstrate. Modificarea arborelui pentru inserarea unui unui element este relativ direct, n schimb la tergere este ceva mai complicat. INSERAREA Pentru inserarea unei noi valori ntr-un arbore binar de cutare T vom folosi algoritmul INS_BIN. Aceasta procedura este exemplificat n figura 9.4: n aceasta figur nodurile umbrite marcheaz calea de la rdcin pn la poziia n care se face inserarea. Linia punctat indic legtura n arbore care este adugat pentru inserarea elementului. (cheia elementului care se insereaza este 13).

55

fig.5. 4 INS_BIN(x ,y) y = Nil x = Rad LS(z) = LD(z)=Nil Atata timp cat x Nil y=x Daca KEY(z)<KEY(x) atunci x = LS(x) altfel x = LD(x) sdaca Sciclu P(z)=y Daca y = Nil atunci Rad = z altfel Daca KE Y ( z) < KE Y (y) atunci LS(y) = z altfel LD(y) = z Sdaca Sdaca Return

56

TERGEREA. Algoritmul pentru tergerea unui nod dat - z dintr-un arbore binar de

cutare are ca argument un pointer ctre z. Procedura consider trei cazuri ilustrate n figura 8.5: Dac z nu are copil modificm printele lui z nlocuindu-l pe z cu Nil. Dac z are un singur copil l eliminm pe z fcnd o nou legtur ntre copilul i printele lui z. Daca z are doi copii l eliminm pe z prin nlocuirea coninutului su cu cel al succesorului su care nu are copil stng. Fig. 8.5 a ) cnd z nu are copil: b ) cnd z are un singur copil:

57

c ) cnd z are doi copii ELIMIN_BIN (T ,z) Daca LS(z)=Nil sau LD(z)=Nil atunci y=z altfel cheama SUCC_BIN(z ,y) sdaca Daca LS(y) Nil atunci x =LS(y) altfel x=LD(y) sdaca Daca x Nil atunci

58

P(x) = P(y) sdaca Daca P(y) = Nil atunci Rad = x altfel Daca y=LS(P(y)) atunci LS(P(y)) = x altfel LD(P(y)) = x Sdaca sdaca Daca KE Y ( z) < KE Y (y) atunci KEY(z) = KEY(y) ADR(z) = ADR(y) Sdaca Return ntrebri i exerciii la capitolul 8. Exerciiile 1 i 2 se gsesc n text. Exerciiul 3. Scriei algoritmul de cutare binar recursiv.

CAPITULUL 9 HASH TABLES. n acest caitol vom nva: Ce este i cum se folosete o tabel cu adresare direct Ce este i cum se folosete o tabel de repartzare Ce operaii se fac ntr-o tabel de repartizare Ce este o funcie derepartizare i cum se poate defini Cum se poate rezolva problema coliziunilor Ce este o tabel cu repartizare deschis Ce este o tabel cu repartizare nchis

59

Cum se poate face testarea Foarte multe aplicaii au nevoie de o mulime dinamic n care sunt permise operaiile Insert, Search (cutare), Delete (tergere ). De exemplu, un compilator pentru un limbaj folosete o tabel de simboluri n care cheile sunt iruri de caractere arbitrare care corespund identificatorilor limbajului. Vom folosi n continuare pentru Hash-Table denumirea de Tabela de repartizare. O tabel de repartizare este o structur de date eficient pentru implementarea dicionarelor. De asemenea cutarea ntr-o tabela de repartizare se poate face, n cel mai ru caz, cu un timp egal cu cel necesar cutarii ntr-o list nlnuit adic O(n), practic ns metoda repartizrii funcioneaz foarte bine. Cu presupuneri rezonabile, complexitatea cutarii unui element ntr-o tabel de repartizare este O(1). O tabel de repartizare este generalizarea, pentru memoria auxiliar, a noiunii de vector. Cnd numrul cheilor memorate este mic raportat la numrul total posibil de chei, tabelele de repartizare devin o altemativ eficient la memorarea direct ntr-un vector, deoarece o tabel de repartizare folosete un spaiu de mrime proporional cu numrul cheilor memorate. n loc de a folosi cheia ca indice n vector, indicele este calculat n funcie de cheie. 9.1. Tabele cu adresare direct. Adresarea direct este o tehnic simpl care lucreaz bine atunci cnd universul U al cheilor este destul de mic. Presupunem c o aplicaie are nevoie de o mulime dinamic n care fiecare element are o cheie care face parte din universul cheilor U={ 0, 1, ... ,m-l}, unde m nu este prea mare i de asemenea nu avem dou elemente cu aceeai cheie. n figura 9.1 este descris implementarea unei mulimi dinamice printro tabel cu adresare direct. Fiecare cheie din universul U = {O ,1 ,... ,9 } corespunde unui index din tabela T. Mulimea cheilor actuale K ={2 ,3 ,5 ,8}

60

determin n tabel o celul care va conine pointere ctre element, celelalte celule (umbrite) conin Nil. Pentru a reprezenta o mulime dinamic vom folosi un vector sau o tabel cu adresare direct T[O..m-l] fiecrei celule k din tabel corespunzndu-i un element din mulime avnd cheia k sau NIL dac n mulime nu s-a gsit un element cu cheia egal cu numrul celulei. Fig. 9.1 Operaiile asupra tabelei cu adresare direct sunt implementate de urmtorii algoritmi care sunt foarte rapizi avnd o complexitate O(1): SEARCH(T , k ,lor) lor = T(k) Return INSERT(T ,x) T(cheie(x)) = x Return DELETE(T ,x) T(cheie(x)) = NIL Return Pentru unele aplicaii, elementele unei mulimi dinamice pot fi memorate chiar n tabela cu adresare direct. 9.2. Tabele de repartizare .(hash-tables). Este evident c prin adresare direct apar dificulti dac universul U este mare, memorarea unei tabele T (de dimensiune |K|) devenind ineficient sau chiar imposibil. Dac mulimea cheilor actuale K este foarte mic n raport cu U atunci cea mai mare parte a spaiului alocat pentru T se va irosi. Atunci cnd mulimea cheilor actuale K memorat ntr-un dicionar este cu mult mai mic dect universul U o tabel de repartizare necesit mult mai puin memorie dect o tabel cu adresare direct. i anume, cerinele de memorie pot fi reduse la O(|K|) , chiar dac cutarea unui element ntr-o tabel de repartizare se va face tot ntr-un timp O(|K|). (Atragem atenia ca acestea se refer la timpul mediu, pe cnd pentru adresarea direct este timpul pentru cel mai ru caz). Cu adresarea direct, memorarea unui element cu cheia k, se fcea n celula k. Prin repartizare acest element va fi memorat n celula h(k) unde h este o funcie care va calcula celula n care va fi memorat elementul cu cheia k - vom numi aceasta funcie hash funcie sau funcie de repartizare.

61

De acum h va pune n coresponden fiecrui element avnd cheia din U o singur celul din tabela de repartizare T[O ,... ,m-l] deci: h : V ~ {O ,1 ,... ,m-l}. Vom spune c un element cu cheia k este repartizat celulei h(k) i c h(k) este valoarea de repartizare a cheii k. n urmtoarea figur va fi ilustrat ideea de baz. Fie h(k) = k mod 10. Atunci: h(3) = 3 , h(12) = 2 , h(15) = 5 , h(17) = 7

fig.9.2 Scopul funciei de repartizare h, este de a reduce rangul indicilor vectorului ajuttor. Observm c, indiferent de cardinalul mulimii U, avem nevoie doar de cel mult |K| valori, deci cerinele pentru memorare sunt mult reduse. Dac, n figura 9.2, K ar conine cheia 25 funcia de repartizare i-ar pune n coresponden celula 5 ( h(15) = 5 i h(25) = 5 ). Vom numi dou chei k1 i k2 sinonime daca h(k1) = h(k2), iar repartizarea aceleiai celule, pentru chei distincte, coliziune. Cum vom rezolva problema coliziunii? Soluia ideal ar fi s evitm coliziunile alegnd o funcie de repartizare convenabil de exemplu : a) h(k) = k mod n ,unde n sa fie un numr prim nu foarte apropiat de o putere a lui 2 b) h(k) = [m*(k*A) mod I] ,unde A este o aproximare a lui (5-1) i N mod 1 = N [N]. Aceasta funcie a fost propus de Knuth n Tratat de programare a calculatoarelor.

62

c) crearea unui portofoliu de funcii de repartizare, alegerea uneia dintre ele fiind aleatoare (aceast metod este cunoscut sub numele de funcie universal de repartizare) Cu toate acestea, toate soluiile propuse mai sus nu fac altceva dect s micoreze numrul de coliziuni deci avem nevoie de o metod care s rezolve coliziunile care pot avea loc. Vom prezenta n figura 9.3 cea mai simpl metod de rezolvare a coliziunilor numit nlnuire.

Fig9.3 Se observ ca fiecare celul a tabelei de repartizare conine o list nlnuit a tuturor cheilor a cror valoare de repartizare este egal cu j. De exemplu h(k1) = h(k4) = 1 sau h(k3) = h(k7) = h(k8) = 5. Operaiile asupra unei tabele de repartizare n care coliziunile au fost rezolvate prin nlnuire sunt implementate cu urmtorii algoritmi: Repart_Inlant_Insert(T, x) Insereaza x in capul listei T(h(cheie(x))) Return Repart_Inlant_Search(T, k) Caut un element cu cheia k n lista T(h(k)) Return Repart_Inlant_Delete(T, x) terge elementul x din lista T(h(cheie(x))) Return

63

Listele care se creaz sunt de fapt stive. Cititorii sunt rugai, pentru ntelegerea acestor algoritmi, sa consulte capitolul 1. n cel mai ru caz, algoritmul pentru inserie are o complexitate de O(1). Pentru cutare, n cel mai ru caz, complexitatea algoritmului este proporinal cu lungimea listei. Pentru tergere, complexitatea este O(1) dac lista este dublu nlanuit. Dac lista este simplu nlnuit, atunci va avea aceeai complexitate cu algoritmul de cutare. Analiza repartizarii prin nlnuire. Ne punem ntrebarea ct dureaz cutarea unui element de cheie dat n cazul repartizarii prin nlnuire? Fiind dat o tabel T cu m celule care memoreaz n elemente vom defini factorul de ncrcare- al tabelei T ca fiind raportul =n / m adic numrul mediu de elemente memorate n lan. Analiza se va face n funcie de imaginndu-ne c el este fixat iar n i m tind ctre infinit. (Obs. poate fi < , > sau = 1) Performana medie a repartizrii prin nlnuire depinde de ct de bine distribuie funcia h celule setului de chei pentru a fi memorate. Putem presupune c n fiecare celul elementele au fost egal distribuite (adica o repartizare simplu uniform). Teorema. ntr-o tabel de repartizare, n care coliziunile au fost rezolvate prin nlnuire, iar repartizarea este simplu uniform, compexitatea cutarii este n medie dat de (1+). Dac numrul celulelor din tabela de repartizare este cel puin proporional cu numrul de elemente din tabel, vom avea n = O(m) i n consecin = n/m = O( m)/m = 1, aadar cutarea n medie se face ntr-un timp constant. n subcapitolul 9.4 se va introduce o metod altemativ de rezolvare a coliziunilor numit adresare deschis. 9.3. Funcii de repartizare (hash funcii). n acest subcapitol ne vom ocupa de cteva chestiuni care se refer la proiectarea unei funcii de repartizare bune. Vom prezenta trei scheme pentru construirea lor: prin mprire, prin nmulire i universal. Cele mai multe funcii de repartizare presupun c universul cheilor este format din numere naturale. Dac acestea nu sunt naturale trebuie s gsim o cale de a le interpreta ca pe nite numere naturale. De exemplu dac o cheie

64

este un ir de caractere ea poate fi interpretat ca o expresie ntreag apelnd la reprezentarea binar a caracterelor. n continuare vom presupune c universul cheilor este format din numere naturale. Metoda impririi. Aceast metod construiete o funcie de repartizare care memoreaz elementul avnd cheia k ntr-una din celulele tabelei T[0,..., m-l] avnd numrul egal cu restul mpririi lui k la m. h(m) =k mod m exemplu: Dac tabela T are m=12, iar cheia k=90, atunci h(k) = 6. Medoda inmulirii. Aceast metod determin funcia de repartizare n doi pai: mai nti nmultete cheia k cu o constant A (0<A<1) i reine partea fracionar a acestei nmuliri, apoi nmulete aceast valoare cu m i reine doar partea ntreag a rezultatului. h(k) = [m*(k*A) mod 1] Avantajul acestei metode este c valoarea lui m nu este critic. De obicei se alege pentru un ntreg m astfel nct 2 - m =2P putnd implementa funcia pe orice tip de calculator. n fig 9.4 este reprezentat metoda nmulirii pentru construirea unei funcii de repartizare. Reprezentarea w de bii (w lungimea reprezentarii binare a unui cuvnt) a cheii k (presupunem c k ncape ntr-un singur cuvnt) este nmulit cu valoarea k [A*2w], unde 0<A<l este o constant convenabil. Rezultatul este o valoare pe 2w bii r1*2W+ro uncle r1 este cuvntul de rang maxim al rezultatului iar, r0 cuvntul de rang minim. Valoarea de repartizare, din p bii, const din bitul cel mai semnificativ al lui r0.

65

Fig.9.4 Aceast metod funcioneaz cu orice valoare a constantei A dar, funcioneaz mai bine cu anumite valori dect cu altele. Alegerea optim pentru aceast constant depinde de caracteristicile datelor ce urmeaz a fi repartizate. Knuth sugereaz alegerea lui A ca fiind ( 5-1) 0,6180339887. . . care funcioneaz foarte bine. De exemplu pentru cheia k=123456 i m=10000 obinem h(k)=[10000*(123456*0,61803...) mod 1] = 41. Metoda universal. Dac se caut nod n papur se pot alege cheile n aa fel nct toate s fie repartizate n aceeai celul a tabelei de repartizare ceea ce ar duce la un timp mediu (n). Orice funcie de repartizare fix din cele prezentate mai sus este vulnerabil n cazul alegerii rutcioase a cheilor adic va genera multe chei sinonime. Singura cale de a mbunti aceast situaie este alegerea aleatoare a unei funcii de repartizare ntr-un mod care s nu depind de cheile care urmeaz a fi memorate. Aceast metod se numete repartizarea universal metoda are performane bune indiferent de cheile alese de cei ru intenionai . Ideea, care st la baza repartizrii universale, este alegerea aleatoare a unei funcii de repartizare, n momentul execuiei, dintr-un portofoliu de funcii de repartizare construite cu grij la nceput. Randomizarea, la fel ca i n cazul sortrii rapide, garanteaz c nici o intrare nu va cauza un comportament ru. Datorit randomizrii algoritmul se va comporta diferit la fiecare execuie chiar i pentru aceleai date de intrare. Fie H o colecie (portofoliu) de funcii de repartizare care memoreaz cheile din universul U ntr-o tabela T[O,... ,m-l]. H se va numi universal dac pentru fiecare pereche de chei distincte k1,k2U numrul de funcii de repartizare hH pentru care h(k1) = h(k2) este egal exact cu |H|/m. Cu alte cuvinte probabilitatea unei coliziuni, n acest caz, este de 1/m. Teorema. Daca h este aleas din H i este folosit pentru repartizarea a n chei ntro tabel de repartizare de mrime m, unde n m, numrul posibil de coliziuni n care este implicat o cheie x, este mai mic dect 1. S vedem cum se poate crea un astfel de portofoliu. S alegem mrimea tabelei de repartizare m prim. Descompunem cheia x n r + 1 byi deci x =

66

(xo,,xr) singura restricie fiind c valoarea maxim a unui byt s fie mai mic dect m. Fie a = (a0,... ,ar ) o secven de elemente aleas la ntmplare din mulimea {0,..., m - 1}. Definim funcia de repartizare corespunzatoare ha H ca fiind
r

ha(x) = ai* xi mod m


i=0

(1)

Cu aceast definiie obinem H=U{ha}


a

(2)

care va avea mr+1 elemente. Teorema. Multimea H definit de ecuaiile (1) i (2) mulime universal de funcii de repartizare. 9.4.Adresarea deschis. n acest caz toate elementele unei mulimi dinamice sunt memorate n tabela de repartizare (fiecare celul va conine un element al mulimii dinamice sau NIL). Pentru a cuta un element n tabela de repartizare vom examina sistematic celulele tabelei pn cnd vom gsi elementul dorit sau pn cnd va fi clar c acesta nu se gsete n tabel. Aceast metod nu utilizeaz liste, nu sunt elemente memorate n afara tabelei (spaii de depire) aa cum folosea metoda nlnuirii. Deci, n adresarea deshis, tabela de repartizare se poate umple ceea ce nseamn c nu se vor mai putea face inserri de noi elemente, altfel spus factorul de ncrcare nu poate fi mai mare dect 1. Avantajul adresrii deschise const n faptul c evit cu totul pointerele. De fapt, n loc s cutam pointere, vom calcula o secven de celule care urmeaz a fi examinat. Memoria rmas liber prin nememorarea pointerelor face ca tabela de repartizare s aib un numr mare de celule pentru aceai cantitate de memorie, ansele de coliziune s fie mici iar regsirea elementelor s fie rapid. Pentru a executa inserarea, folosind adresarea deshis, examinm succesiv tabela de repartizare pn cnd vom gsi o celul liber n care se va pune cheia. n loc s fie fixat n ordinea 0, 1, ..., m-1 (care nseamn o complexitate de cautare (n) irul poziiilor testate depinde de cheia care a fost inserat. Pentru a determina celula de examinat extindem funcia de

67

repartizare pentru a include numrul testrii (ncepnd de la 0) ca o a doua intrare. Astfel funcia de repartizare devine h: U x {0,1,... ,m-1} {0,1,... ,m-1}. Cu adresare deschis, avem nevoie pentru fiecare cheie k ,ca irul de testare {h(k,0), h(k,I) ,h(k,2),,h(k,m-1)} s fie o permutare a lui {0,1,... ,m-1} astfel nct fiecare poziie din tabela de repartizare este eventual considerat ca o celul pentru o nou cheie pe msur ce tabela se umple. n urmtorul algoritm, presupunem c elementele n tabela de repartizare T sunt chei fr informaie satelit; cheia k este identic cu elementul care conine cheia k. Fiecare celul conine deci fie o cheie fie NIL (dac celula este goal). REPART _Insert(T, k,j) i=O repeta j = h(k, i) Daca T (j) = NIL atunci T(j) = k return i=i+l sdaca pana cand i=m sau T(j)=NIL j=NIL EROARE tabela plin return Algoritmul de cutare pentru cheia k testeaz celulele n aceeai ordine n care algoritmul de inserare le-a examinat cnd a fost inserat cheia k. De aceea cutarea se poate termina (fr succes) cnd gsete o celul goal deoarece k ar fi fost inserat acolo i nu mai departe n irul lui de testri. (bineneles c nu vom mai permite tergerea cheilor din tabela de repartizare.) Procedura REPART_Search are ca intrare o tabel de repartizare T i o cheie k, i ca ieire j dac celula j a fost gsit cu cheia k sau NIL dac cheia k nu este prezent n tabela T. REPART_Search(T, k,rez) i=0 repeta j = h(k, i)

68

daca T (j) = k atunci rez = j return sdaca i=i+l pana cand T(j)=NIL sau i =m rez =NIL return tergerea dintr-o tabel de repartizare cu adresare deschis este dificil. Nu avem dreptul s punem n locul unei chei care a fost tears valoarea NIL pentru c ar face imposibil gsirea oricarei chei la inseria creia celula respectiv a fost gasit ocupat. Soluia acestei probleme poate fi gsit introducnd un nou cmp n nregistrare care s conin, n cazul tergerii, un marcaj pentru tergere. n acest situaie procedurile de cutare i de inserie se vor modifica corespunztor. n analiza noastr facem presupunerea de repartizare uniform: adic orice cheie considerat are anse egale de a avea ca secven de testare oricare din cele m! permutri ale mulimii {0,... ,m-l} . Repartizarea uniform generalizeaz noiunea de repartizare simplu uniform definit mai nainte pentru situaia n care funcia de repartizare d, nu un singur numr ci o ntreag secven de testri. Se folosesc, mai des, urmtorele trei tehnici pentru a calcula irul de testri necesar pentru adresare deschis. Toate aceste tehnici garanteaz c {h(k,0), h(k,l) ,h(k,2) ,,h(k,m)} este permutare a lui {0,... ,m-l} pentru fiecare cheie k. Niciuna din aceste tehnici nu ndeplinete presupunerea de repartizare uniform deoarece niciuna din acestea nu este capabil de a genera mai mult decat m2 iruri de testri diferite (n loc de m! cte cere repartizarea uniform). Dubla repartizare are cel mai mare numr de iruri de testare deci pare s dea cele mai bune rezultate. Testarea liniar. Fiind dat o funcie de repartizare oarecare h:U{0,... ,m-1}, metoda testrii liniare folosete funcia de repartizare de forma: h(k ,i) = (h(k) + i) mod m pentru i = 0, 1,... ,m-1. Pentru o cheie dat k, prima celul testat este T(h(k)). Urmtoarea celul testat va fi T(h(k) + 1) i aa mai departe pn la celula T(m-1). Vom testa celulele T(0) ,T(1), ... , pn cnd, n sfrit, vom testa celula T(h(k) 1). Deoarece n testarea liniar testarea poziiei iniiale

69

determin ntreg irul de testri, vom folosi doar m iruri distincte de testri. Testarea ptratic. Testarea ptratic folosete o funcie de repartizare de forma h(k ,i) = (h(k) + c1*i +c2*i2) mod m unde h este o funcie de repartizare auxiliar, c1, c2 sunt constante auxiliare i i=0,1,... , m-1. Poziia iniial testat este T(h(k)); poziiile testate ulterior sunt decalate prin cantiti care depind ntr-un mod ptratic de a i-a testare. Aceast metod funcioneaz mult mai bine dect testarea liniar dar, pentru a folosi complet tabela de indexare valorile lui c1, c2 i m sunt restricionate. Dubla repartizare. Dubla repartizare este una din cele mai bune metode n cazul adresrii deschise pentru c permutrile care se produc au multe caracteristici ale permutrilor alese aleator. Funcia de repartizare folosit este de forma: h(k ,i) = (h1(k) + i *h2(k)) mod m, unde h1, h2 sunt funcii de repartizare auxiliare. Prima poziie testat este T(hl(k)); poziiile testate ulterior sunt decalate de la poziia anterioar prin cantitatea h2(k) mod m. Astfel, spre deosebire de cazurile testrii liniare i ptratice, aici irul de testare depinde n dou feluri de cheia k deoarece poziia iniial de testare, decalarea, sau amndou pot varia. Fig 9.5 d un exemplu de inserie cu dubl repartizare. Avem o tabel de repartizare de mrime 13 i funciile de repartizare hl(k) = k mod 13, h2(k) = 1 + (k mod 11). Cum 14=1 mod 13 va fi testat celula T(1), dar ea este ocupat. 14=3 mod 11 deci urmtoarea celul testat va fi T(5) care este i ea ocupat, celula care urmeaz a fi testat este T(9) care este liber i cheia 14 va fi inserat.

70

fig. 10.5. Analiza repartizrii prin adresare deschis. La fel ca la analiza repartizrii prin nlnuire i aceast analiz se va face n funcie de factorul de ncrcare al tabelei de repartizare. Reamintim c dac n elemente sunt memorate ntr-o tabel de mrime m atunci =n/m. Cum la adresarea deschis n m rezult c factorul de ncarcare 1. Presupunem c este folosit repartizarea uniform. n aceast schem idealizat irul de testare {h(k,0) , h(k,1) ,h(k,2),,h(k,m)} pentru fiecare k este echiprobabil de a fi orice permutare a lui {0,1,... ,m-1}. Asta nseamn c orice ir posibil de testare este echiprobabil s fie utilizat ca ir de testare pentru o inserie sau o cutare. Desigur o anumit cheie dat are un anumit ir de testare asociat unic i fix; asta nseamn c, considernd distribuia de probabilitate pe spaiul cheilor i operaia de funcie de repartizare a unei chei, orice ir de testare are aceeai probabilitate. Urmtoarele teoreme vor stabili numrul de testri preconizate pentru repartizarea cu adresarea deschis. Teorema. Fiind dat o tabel de repartizare cu adresare deschis cu factorul de ncrcare =n/m < 1 numrul preconizat de testri ntr-o cutare fr succes este cel mult 1/(1-), presupunnd repartizarea uniform. Aceast teorem ne d imediat performana inseriei prin urmtorul: Corolar

71

lnseria unui element ntr-o tabel de repartizare cu adresare deschis are nevoie de cel mult 1/(1-) testri n medie, presupunnd repartizarea uniform. Formula pentru numrul preconizat de testri pentru o cutare cu succes este dat de urmtoarea : Teorem. Fiind dat o tabel de repartizare cu adresare deschis cu factorul de ncarcare <1 numrul preconizat de testri ntr-o cutare cu succes este cel mult (1/)*ln(1/(1-)) presupunnd repartizarea uniform. ntrebri i exerciii la capitolul 9. Exerciiul 1. Se consider o tabel de reprtizare de dimensiune m=1000 i funcia de repartizare h(k)=[m*(k*A mod 1)] pentru A=(5-1)/2calculai locaiile n care se pun cheile: 61, 62, 63, 64, 65. Exerciiul 2. Se consider c se insereaz cheile 10, 22, 31, 4, 15, 28, 17, 88, 59 ntr-o tabel de repartizare de lungime m=11 folosind adresarea deschis cu funcia de repartizare h(k)=k mod m. Ilustrai rezultatul inserrii cu verificare liniar, cu verificare patratic unde c1=1 i c2=3 i folsind dubla repartizare cu h2(k)=1+(k mod(m-1)). Exerciiul 3. Scriei algoritmul pentru tergerea din tabela de repartizare cu adresare deschis i modificai corespunztor algoritmii REPART_INSERT i REPART_SEARCH. 10. ARBORI BALANSAI (B-Trees) . n acest capitol : Vom afla ce sunt arborii balansai Vom calcula nlimea arborilor balansai Vom descrie operaiile cu arbori balansai

72

Arborii balansai sunt arbori de cutare destinai s lucreze eficient pe discuri magnetice; ei sunt realizai urmrind aceleai idei i scopuri ca i arborii rou-negrii dar sunt superiori acestora n minimizarea timpului pentru intrare-ieire . Diferena esenial este c, n arborii balansai, un nod poate avea mai muli descendeni (pn la sute). Asemnarea este c nlimea arborelui este O(log n) dei baza logaritmului (mult mai mare) d o nlime corespunzator mai mic. Aceasta este important pentru c operaiile asupra arborelui, cum ar fi cutarea, inserarea i tergerea au complexiti proporionale cu nlimea arborelui. Se vede din figura 10.1 cum arborii balansai generalizeaz arborii binari de cutare.

Fig.10. Cheile sunt consoane. Un nod conine n(x) chei i are n(x) + 1 descendeni. Toate frunzele au aceeai adancime. Nodurile albe marchez drumul pentru cutarea literei R. 10.1 Structura datelor n memoria pe disc. Avem la dispoziie multe tehnologii de memorare a datelor. Memoria principal este realizat pe cipuri de siliciu. Aceast memorie a crescut i s-a ieftinit de-a lungul timpului, totui ea rmne mai mic i mai scump dect memoria pe medii magnetice dei mult mai rapid. Timpul unor operaii pe calculator ce includ citiri i scrieri pe disc depind de: - numarul de accese la disc - timpul de lucru al procesorului. Folosim arbori balansai n aplicaii n care datele nu pot intra n memoria Principal. Algoritmii coninui n acest capitol copiaz anumite pagini de memorie de pe disc n memoria principal i, pe cele care s-au modificat, le rescrie (napoi pe disc). Modelul, din acest punct de vedere, este urmtorul:

73

Fie x un pointer ctre un obiect. Dac obiectul se afl n memoria principal, ne vom referi la cmpuri ca de obicei (ex.KEY(x)). Dac obiectul se afl pe disc, vom face mai nti o operaie de citire CIT_DISK(x) a obiectului x i apoi ne putem referi la cmpurile lui. Dac s-au efectuat modificri ale cmpurilor lui x ele vor fi actualizate pe disc prin scriere SCR_DISK(x).

fig. 10.2. Figura 10.2 conine un exemplu de arbore balansat care are mai mult de un miliard de chei. Ca s micorm numrul de accese la disc trebuie s mrim dimensiunea nodului. n general un nod va fi memorat pe o pagin ntreag. Aceasta nseamn un factor de ramificare ntre 50 i 2000. 10.2. Definiia arborilor balansai. Vom considera, ca i mai nainte, c informaia satelit asociat cu o cheie este memorat n acelai nod cu cheia i este mutat odat cu mutarea cheii. Un arbore balansat (echilibrat) T este un arbore cu rdcina Rad(T) cu urmtoarele proprieti : 1.Fiecare nod are urmtoarele cmpuri: a) n( x) numarul de chei de stocate n x b) cele n( x) chei memorate n ordine cresctoare KEY1(x),KEY2(x),...,KEYn(x)(x). c)F(x) cu valoare adevarat daca x este frunz i fals dac x nu este frunz d) Dac x este nod intern (Frunza(x) este fals) atunci x mai conine n(x)+ 1 pointeri Cl(X),C2(X) ,... ,Cn(x)+l(X) la copiii (descendenii) lui x 2.Cheile din x separ cheile din descendeni adic dac kj este o cheie oarecare din descendentul de la adresa Cj( x) cu j{1,2,...,n( x)+ 1}

74

atunci k1KEY1(x)k2KEY2(X) ... KEY n(x)(x)kn(x)+l 3.Fiecare frunz are aceeai adncime care este nlimea arborelui. 4.Exist un numr maxim i un numr minim de chei pe care le poate conine un nod care sunt n legtur cu t 2 numit gradul minim al lui T. a)Fiecare nod, n afar de rdcin, are cel puin t-1 chei i deci, dac este intern, are cel puin t descendeni. Dac arborele este nevid, rdcina trebuie s aib cel puin o cheie . b)Fiecare nod poate conine cel mult 2t-1 chei (un nod intern are cel mult 2t descendeni). Spunem ca un nod este plin, dac are exact 2t1 chei. Cel mai simplu arbore balansat este cu t = 2 unde fiecare nod poate avea 2, 3 sau 4 descendeni. nlimea unui arbore balansat. Teorema Dac n1 este numrul de chei dintr-un arbore balansat cu nlimea h i gradul minim t 2 atunci h logt ((n+1)/2). Demonstraie. O s pornim n demonstraie de la un arbore cu numr maxim de chei ca n exemplul urmtor.

Figl0.3 Dac arborele are nlimea h, atunci numrul de noduri este minim cnd rdcina conine o cheie i celelalte noduri conin t-1 chei. n acest caz sunt 2 noduri la primul nivel, 2t la al doilea nivel, i aa mai departe pn la nivelul h unde sunt 2th-1.

75

n 1+ (t - 1)

2
i=1,h

t-1

=1 + 2(t-1)((th-1)/(t-1))= 2th - 1

10.3 Operaii n arbori balansai. Pentru urmtorii algoritmi vom presupune c rdcina arborelui este n memoria principal, deci nu avem CIT_DISK pentru ea, dar este nevoie de SCR_DISK dac avem actualizri ale cmpurilor rdcinii. Mai presupnem c orice alt nod are nevoie s fie citit ca s avem acces la cmpurile lui. Cutarea n arborii balansai. Algoritmul este recursiv i se apeleaz prima dat cu B_TREE_CAUT(Rad(T), k ,rez), unde k este cheia cautat, rez conine rezultatul cutrii adic perechea (y,i) care nseamn c nodul y are a i-a cheie KEY(y)=k sau rez=Nil dac cheia nu este n arbore. B- TREE- CAUT( x,k,rez) i=l att timp cat i<n(x) i k> KEYi(x) i=i+l Sciclu Daca in(x) i k = KEYi(x) atunci rez = (x, i) return sdaca Daca Frunza(x) atunci rez = Nil Return altfel Cheama CIT_DISK(ci(x)) Cheama B_TREE_CAUT(ci(x), k, rez) return sdaca b.Construcia unui arbore balansat. Pentru aceasta vom creea mai nti un arbore vid i vom insera pe rnd n el noile chei. Avem nevoie mereu de locuri libere pe disc pe care le fumizeaz ALOC_NOD(). B_TREE_CRE(T)

76

x = ALOC_NOD( ) Frunza(x) = True n(x) = 0 SCR_DISK(x) Rad(T) = x Return Dac un nod este plin, ca s putem insera n continuare, el trebuie rupt n dou, ca n figura 10.4:

Fig.l0.4 Nodul plin are 2t - 1 chei i cheia din mijloc (indice t) se duce n printe, presupus neplin. Dac se face ruperea rdcinii atunci arborele crete n nlime cu 1. Procedura B_TREE_RUP are ca intrare un nod intern neplin - x (aflat deja n memoria principal), un index - i i un nod y = ci(x) care este un descendent plin al lui x. B_TREE_RUP(x, k, y) z = ALOC_NOD( ) Frunza(z) = Frunza(y) n(z) = t-1 Pentru i = 1, t-1 KEYi(z) = KEYi + t(y) spentru Daca nu Frunza(y) atunci Pentru i=1,t

77

Ci(z) = Ci+t(z) spentru sdaca n(y) = t-1 Pentru i = n(x)+1,k+l,-1 Ci+l(X) = Ci(x) spentru Ci+l(X)= z Pentru i = n(x), k, -1 KEYi+l(X) = KEYi(x) spentru KEYk(x)=KEY t(y) n(x) = n(x) +1 SCR_D ISK( x) SCR_DISK(y) SCR_DISK(z) return Inserarea n arborii balansai. Putem s construim acum inserarea care ncepe cu cazul n care rdcina este plin exemplificat n figura 10.5.

Fig.10.5 Cheia k trebuie inserat n arborele T, la locul ei. B-TREE_INSERT(T, k) r=Rad(T) daca n(r) = 2t-1 atunci s = ALOC_NOD( ) Rad(T) = s

78

Frunza(T) = False n(s) = 0 cl(S) = r cheama B_TREE_RUP(s, 1, r) cheama B_TREE_INS_NEPLIN(s,k) altfel cheama B- TREE_INS_NEPLIN (r,k) Sdaca Return Procedura B_TREE_INS_NEPLIN parcurge arborele n jos pn la locul unde trebuie fcut inserarea. B- TREE_INS_NEPLIN(x, k) i = n(x) Daca Frunza(x) atunci atata timp cat i 1 i k<KEYi(x) KEYi+1(x) = KEYi(x) i=i-1 Sciclu KEYi+1(X) = k n(x) = n(x) + 1 SCR_DISK(x) atata timp cat i 1 i k<KEYi(x) i=i-1 sciclu i=i+l CIT_DISK(ci(x)) Daca n(ci(x))=2t-l atunci

Cheama B_TREE_RUP(x,i,ci(x)) Daca k> KEYi( x) atunci i=i+ 1 sdaca sdaca Cheama B_TREE_INS_NEPLIN(ci(x), k) return

79

Exemple de inserri Mai multe cazuri sunt reprezentate n figura 10.6.:

(a)

arborele iniial

(b) este inserat B ( c ) este inserat Q

(d)

este inserat L

( e) este inserat F Fig.10.6. tergerea unei chei dintr-un arbore balansat. Aceasta este o operaie similar cu inserarea, dar ceva mai complicat. B_TREE_STERG(x, k) terge din subarborele T ncepnd n nodul x, cheia k. Grija este ca numrul de chei din nodurile parcurse (altul dect rdcin) s fie t (gradul minim), adic cu 1 mai mult dect de obicei ca s putem terge o cheie. Aa c, uneori, o anumit cheie trebuie s coboare ntr-un nod descendent nainte de a-l parcurge. Dac n acest mod rdcina x rmne fr

80

chei atunci singurul descendent ci(x) va fi noua rdcin i x dispare, micornd astfel nalimea arborelui cu 1. Figura 10.7. ilustreaz diversele situaii care se pot ntlni la tergere.

(a)

arborele iniial

(b ) tergerea lui F: cazul 1

(c)

tergerea lui M: cazul2a

(d)

tergerea lui G: cazul 2c

(e)

tergerea lui D: cazul 3b

81

(e) arborele scade n nlime

(e) tergerea lui B : cazul 3a Contrar obiceiului dm aici numai cteva idei ale algoritmului de tergere: 1.Dac cheia k este n nodul x i x este frunz atunci se terge pur i simplu k din cheile lui x. 2.Daca cheia k este n nodul x (intern) atunci : a.Dac descendentul y, care precede k n x (k=KEYi(x)), y=ci(x)) are cel puin t chei atunci se gsete k care precede pe k i se nlocuiete k cu k n x (tergnd k din y) b.Dac z este descendentul care urmeaz pe k se procedeaz simetric cu cazul a. c.n alt caz (deci cnd i y i z au t-1 chei adic numrul minim) terge k din x i adresa ci+1(x) (ctre z) iar cheile k i cele din z se introduc mpreun cu pointerii n y continund tergerea recursiv cu B_TREE_STERG(y, k). 3.Dac k nu este n nodul intern se determin ci(x) rdcina unui subarbore care trebuie s-l conin pe k. Dac ci(X) are numai t-l chei se execut 3.a. sau 3.b. apoi se reia recursiv pasul 3. a.Daca ci(x) are numai t-l chei, dar are un frate alturat (ci(x) sau c+1(x) care au t chei atunci ci(x) primete o nou cheie cobort din x, urmnd s se completeze numrul de chei cu cheia potrivit din fratele care avea t chei. b.Dac ci(x) i toi fraii lui alturai (ci-1(x) sau ci+1(x)) au numai t-1 chei se unific ci(x) cu unul dintre fraii alturai cobornd o cheie din x ca cheie median n noul nod. (Aciunea este exact inversa ruperilor i determin eliminarea ei i crearea unei noi

82

rdcini, aceasta nsemnnd micorarea nlimii arborelui cu o unitate. ntrebri i exerciii la capitolul 10. Exerciiul 1. Construii un arbore balansat cu t=3 i nlime =3. Exerciiul 2. Ilustrai, pe arborele de mai sus, inserarea i tergerea unui nod.

11.ARBORI ROU-NEGRI. n capitolul 10 am artat c operaiile de cutare, predecesor, succesor, minimum, maximum, inserarea, i tergerea pentru un arbore binar de cutare cu nlimea h se fac n O(h). Deci aceste operaii se execut rapid dac nlimea este mic; dar, dac nlimea este mare, performanele lor nu pot fi mai bune dect ale unei lisle nlnuite. Arborii rou-negri sunt una din multele scheme de arbori de cutare care sunt echilibrai cu scopul de a garanta ca operaiile dinamice s aib complexitatea O(lg n). 11.1.Proprietle arborilor rou-negri. Un arbore rou-negru este un arbore binar care conine cte o informaie n plus pentru fiecare nod aceasta fiind culoarea care poate fi rou sau negru. Arborii rou-negrii ne asigur c nu exist o cale cu lungimea de dou ori mai mare dect orice alt cale, deci aceti arbori sunt aproximativ echilibrai. Fiecare nod al arborelui rou-negru conine urmtoarele cmpuri: - culoarea (CuI) - cheia (KEY) - legtura din stnga (LS) - legtura din dreapta (LD) - printele (P) Un arbore binar de cutare este arbore rou-negru dac ndeplinete urmtoarele proprieti: 1.Fiecare nod este rou sau negru 2.Fiecare frunz Nil este neagr 3.Dac un nod este rou, atunci ambii descendeni sunt negri

83

4.Pe orice cale ntre un nod i o frunz descendent se afl acelai numr de noduri negre. Un exemplu de arbore rou-negru avem n figura 11.1 unde nodurile roii sunt cele umbrite.

fig.11.1. Lema Un arbore rou-negru cu n noduri interne are nlimea cel mult 2*log(n+ 1). Consecin Operaiile dinamice cutare, minimum, maximum, succesolr, predecesor pot fi implementate pentru arborii rou-negri n O(lg n).

84

11.2.Rotaii. Operaiile de cutare i tergere aplicate unui arbore rou-negru cu n chei modific arborele, ceea ce ar putea duce la distrugerea proprietilor pe care trebuie s le aib un arbore rou-negru. Pentru a restaura aceste proprieti va trebui sa schimbm culoarea anumitor noduri i, deasemenea, s schimbm structura pointer. Schimbm structura pointer printr-o rotaie, care este o operaie local ntr-un arbore de cutare care conserv disciplina cheilor. In figura 11.2 sunt expuse dou tipuri de rotaii: rotaie_stnga i rotaie_dreapta.

fig. 11.2. Cnd facem o rotaie stnga presupunem c LD(y)Nil. Rotatia_stnga pivoteaz n jurul legturii dintre x i y, fcndu-l pe y noua rdcina a subarborelui avnd pe x ca i copil stng, iar copilul stng al lui y va fi copilul drept al lui x. (,,, sunt subarbori arbitrari). Algoritmul pentru rotaie_stnga. Rotaie_stnga(T ,x) y=LD(x) LD(x)=LS(y) Daca LS(y) Nil atunci P(LS(y))=x sdaca P(y)=P(x) Daca P(x)=Nil atunci Rad(T)=y altfel Daca x = LS(P(x)) atunci LS(P(x))=y altfel

85

LD(P(x))=y sdaca LS(y)=x P(x)=y Return Exerciiul 1. Algoritmul Rotaie_dreapta este similar. Este momentul s vedei dac l-ai neles pe cel dinainte i s scriei algoritmul pentru Rotaie_dreapta.

86

Ambii algoritmi au complexitatea O(1). n figura 11.3 se vede cum funcioneaz Rotaie_stnga: Fig.11.3 .

fig.11.3.b 11.3.Inserarea. Vom folosi algoritmul INS_BIN din capitolul 9. Pentru a insera un nod x n arborele T ca i cum ar fi un arbore binar de cutare oarecare apoi l vom colora rou. Pentru a garanta c proprietile rou-negru sunt pstrate vom repara modificrile aprute n arbore prin recolorarea nodurilor i folosirea rotaiilor. n mare parte algoritmul se ocup de diferitele cazuri care pot aprea pentru a repara modificrile aprute n arbore. RN_INSERT(T ,x) Cheama INS_BIN(T ,x) Cul(x)=rou Atat timp cat xRad(T) i cul(P(x))=rou daca P(x) = LS(P(P(x)) atunci y= LD(P(P(x)) daca Cul(y)=rou atunci Cul(P(x))=negru Cul(y)=negru Cul(P(P(x))=rou x=P(P(x)) altfel

87

daca x=LD(P(x)) atunci x=P(x) cheama Rotaie_stnga(T,x) sdaca Cul(P(x))=negru Cul(P(P(x)) = ro:u Cheama Rotaie_dreapta( T ,P(P(x)) Sdaca (aceleai instruciuni ca pe ramura de dreapt unde LD i LS au fost schimbate) Cul(Rad(T))=negru return Care dintre proprietile rou-negru sunt nclcate dup primele dou linii ale algoritmului? Proprietatea 1 se pstreaz cu siguran, la fel i cea dea doua din moment ce noul nod introdus este rou i copilul sau este Nil. Proprietatea 4 este satisfacut pentru c nodul x nlocuiete un nod negru - Nil i acest nod x este rou cu copil Nil. Deci singura proprietate care poate fi stricat este cea cu numarul 3 (n cazul n care printele lui x este rou). n figura 11.4.a. este dat un exemplu care arat cum este ncalcat aceast proprietate dup ce un nod x este inserat. La celelalte subpuncte ale figurii sunt prezentai paii algoritmului care repar aceast nclcare. (a) (b)

88

(d) fig. 11.4. 11.4 tergerea. tergerea unui nod dintr-un arbore rou-negru este doar un pic mai complicat dect operaia de inserare. Algoritmul RN_Elimin este obinut din algoritmul ELIMIN_BIN din cap.9 printr-o mic modificare. Vom utiliza o sentinel pentru a reprezenta nodurile Nil. ntr-un arbore rou-negru T, sentinela NiI(T) e un nod cu aceeai structur cu a oricrui nod n arbore. Culoarea sa este neagr, iar restul nregistrrilor (KEY, LS, LD, P) vor avea valori arbitrare. ntr-un arbore rou-negru vom nlocui toate legturile la Nil cu legturi la Nil(T). Sensul folosirii sentinelei este de a nlocui un descendent Nil al unui nod x printr-un nod care are ca printe pe x. Pentru economie de memorie vom folosi o singur sentinela pentru a reprezenta

89

toate nodurile Nil (setnd la fiecare folosire a sentinelei legtur de tip printe ctre nodul x la care ne referim). La fel ca la inserare trebuie s avem grij s pstrm proprietaile rou-negru ale arborelui. Acest lucru se face cu ajutorul unui algoritm care se apeleaz dup ce tergerea a fost efectuat. Cazurile care apar la tergerea nodurilor dintr-un arbore rou-negru sunt prezentate n figura urmtoare : (nodurile umbrite sunt roii, cele albe sunt cele care pot fi roii sau negre).

Cazul 1. Acest caz apare cnd fratele alturat al nodului x este rou.

90

Cazurile 2, 3, 4. Aceste cazuri apar cnd fratele alturat al nodului x este negru difereniindu-se ntre ele dup culorile copiilor acestui frate. ntrebri i exerciii la capitolul 11. Exerciiul 1 este n text la rotaii. Exerciiul 2. Pe arborele de la nceputul capitolului ilustrai tergerea cheii 30. Exerciiul 3. Pe arborele de la nceputul capitolului ilustrai adugarea cheii 13.

91

CAPITOLUL 12 mbogirea structurilor de date. n acest capitol vom nva: De ce este nevoie de mbogirea unei structuri Cum arat un arbore pentru statistic de ordine Care sunt paii care trebuie parcuri pentru mbogirea unei structuri Cum arat un arbore de intervale In practica programrii apar cte o dat situaii care necesit numai o structur de date clasic, ca de exemplu lista dublu nlnuit, tabela de dispersie sau arborele binar de cutare, ns majoritatea problemelor care trebuie rezolvate au nevoie de o structur nou. Totui foarte far este nevoie s se creeze un tip complet nou de structur de date. Mai des se potrivete s fie suficient s adaugm informaii suplimentare la o structur de date clasic n aa fel nct ea sa rspund nevoilor impuse de aplicaia pe care o realizm. Desigur, mbogirea structurilor de date nu este ntotdeauna simpl, deoarece informaia adugat trebuie sa fie actualizat, i ntretinut prin operaiile obinuite ale structurii de date respective. Definim a i-a statistic de ordine a unei mulimi de n elemente ca al ilea cel mai mic element. De exemplu, minimul unei multimi de n 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. Cnd n este impar, mediana este unic, i apare pe pozitia i = (n+ 1)/2. Cnd n este par, exist dou mediane, care apar pe poziiile i = n/2, i = n/2+ 1. Se poate arta c orice statistic de ordine poate fi determinat ntr-un timp de O(n) n cazul unei mulimi neordonate. n acest capitol vom vedea cum se pot modifica arborii rou-negri pentru ca orice statistic de ordine s se determine ntr-un timp O(lg n) i vom

92

afla cum se determin rangul unui element - poziia acestuia n ordonarea liniar a mulimii - tot ntr-un timp O(lg n). In figura urmtoare vom prezenta o structur de date care posed operaii rapide de statistici de ordine. Un arbore cu statistic de ordine T este un arbore rou-negru care conine o informaie suplimentar n fiecare nod. La cmpurile uzuale pentru un nod x dintr-un arb ore rou-negru: KEY(x), CUL(x), P(x), LS(x), i LD(x), se adaug un cmp nu DIM(x). Acest cmp conine numrul de noduri (interne) din subarborele cu rdcina x (incluzndu-l i pe x), adic dimensiunea subarborelui. Dac facem convenia DIM(NIL)=0, atunci are loc identitatea: DIM(x)=DIM(LS(x))+DIM(LD(x))+1 Un arbore de statistic de ordine care este de fapt un arbore rou-negru mbogit. Nodurile gri sunt roii, iar nodurile negre sunt negre. n partea de

jos a fiecarui nod este cmpul DIM(x) care reprezint numrul de noduri ale subarborelui cu rdcina x. Fig.12.1 Regsirea unui element cu rangul cunoscut. ncepem cu operaia care regsete un element cu rangul cunoscut. Procedura RN-SELECT(x,i,y) retumeaza un pointer - y la nodul care conine a i-a cheie din subarborele avnd rdcina x. Pentru a determina a i-a cea mai

93

mic cheie din arborele de statistic de ordine T vom face apelul RN -SELECT( RAD(T),i,y). RN-SELECT(X,i,y) R=DIM(LS(x))+1 daca i=r atunci y=x altfel daca i < r atunci cheama RN-SELECT(LS(x)) altfel cheama RN-SELECT(LD(x)) sdaca sdaca Return Pentru a vedea cum funcioneaza RN-SELECT, s considerm cutarea pentru al 17 -lea cel mai mic element din arborele de statistica de ordine T din figura 12.1 . Se ncepe cu x egal cu rdcina, a carei cheie este 26 i cu i = 17. Deoarece dimensiunea subarborelui stng al lui 26 este 12, rangul rdcinii va fi 13. Prin urmare, tim deja c nodul cu rangul 17 este a117-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 rdcina, 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 el este rdcin este 2. Aadar se face un nou apel recursiv pentru a-l determina pe al 14-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 doilea cel mai mic element. n consecin, acest ultim apel va ntoarce pe y ca pointer la nodul avnd cheia 38 i execuia procedurii se termin. Deoarece fiecare apel recursiv coboar un nivel n arborele de statistic de ordine T, timpul total pentru acest algoritm este, n cel mai defavorabil caz, proporional cu nlimea arborelui. Deoarece arborele este rou-negru nlimea sa este O(lg n), unde n este numrul de noduri. Prin urmare, timpul de execuie al algoritmului prezentat este O(lg n) pentru o mulime dinamic avand n elemente.

94

Determinarea rangului unui element. Fiind dat un pointer la un nod x dintr-un arbore de statistic de ordine T, procedura RN-RANG returneaz r = poziia lui x n ordinea liniar dat de parcurgerea n inordine a lui T. RN-RANG(T,x,r) R=DIM(LS(x))+1 y=x cat timp yRAD(T) daca y=LD(P(x)) atunci r=r+DIM(LS(P(y)))+1 sdaca y=P(y) sciclu return Execuia algoritmului RN-RANG pe arborele de statistic de ordine din figura 12.1 pentru determinarea rangului nodului avnd cheie 38 va produce urmtoarea secvena de valori pentru KEY(y) i r nregistrate la nceputul corpului ciclului cat timp. Iteraia KEY r 1 38 2 2 30 4 3 41 4 4 26 17 Procedura va returna rangul r = 17. Fiecare iteraie a ciclului cat timp consum un timp de O(1), iar y urc un nivel n arbore la fiecare iteraie, timpul de execuie al algoritmului RNRANG este, n cel mai ru 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 fiecare nod, procedurile RN-SELECT i RN-RANG pot calcula repede informia de statistic de ordine. Nu am catigat nimic dac cmpurile nu se pot ntreine eficient prin operaiile de baz ce modific arborii rou-negri. Vom arta acum c dimensiunile subarborilor se pot ntreine att pentru inserare ct i pentru tergere, fara afectarea timpilor asimptotici de execuie ai acestor operaii. Inserarea unui nod ntr-un arbore rou-negru se face n dou etape:

95

- se insereaza nodul x n arborele dat ca i cum ar fi un arbore binar de cutare obinuit i se coloreaz inserat cu rou -se aplic asupra arborelui rezultat un algoritm care va recolora nodurile pentru conservarea proprietilor specifice arborelui rou-negru. n prima faz se coboar n arbore ncepnd de la rdcin i se insereaz nodul nou ca fiu al unui nod existent. A doua faz nseamn urcarea n arbore, modificnd culorile i efectund la sfrit rotaii pentru a conserva proprietile rou-negru. Pentru a ntreine dimensiunile subarborilor n prima faz, se va incrementa cmpul dimensiune[x] pentru fiecare nod x de pe drumul traversat de la rdcin n jos spre frunze. Noul nod care se aduga va primi valoarea 1 pentru cmpul su dimensiune. Deoarece pe drumul parcurs sunt O(lg n) noduri, costul suplimentar pentru ntreinerea cmpurilor dimensiune va fi i el O(lg n ). n faza a doua, singurele modificri structurale ale arborelui rounegru sunt produse de rotaii, care sunt cel mult dou. Mai mult, rotaia este o operaie local; ea invalidez numai cmpurile dimensiune din nodurile incidente (de la capetele) legturii n jurul creia se efectueaz rotaia. La codul procedurii ROTETE-STANGA(T ,x) se adaug urmtoarele dou linii: dimensiune(y)= dimensiune(x) dimensiune(x)= dimensiune(LS(x))+ dimensiune(LD(x))+1 Figura de mai jos ilustreaz cum sunt actualizate cmpurile dimensiune. Pentru procedura ROTETE-DREAPTA modificrile sunt simetrice. Deoarece la inserarea unui nod ntr-un arbore rou-negru sunt necesare cel mult dou rotaii, se consum un timp suplimentar de 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 cu n noduri este de O(lg n) acelai din punct de vedere asimptotic cu cel al arborilor 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 face cel mult trei rotaii i n rest nu efectueaz alte modificri structurale ale arborelui. Prima faz elimin din arbore un nod y. Pentru a actualiza dimensiunile subarborelui, 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 cu n noduri, timpul suplimentar consumat cu ntreinerea cmpurilor dimensiune n prima faza a tergerii unui nod este de 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 ntretinerea cmpurilor

96

dimensiune, consuma un timp O(lg n) pentru un arbore de statistic de ordine cu n noduri. 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. Procesul de mbogire a unei structuri de date se poate mprii n patru pai: 1. Alegerea unei structuri de date suport. 2. Determinarea informaiei suplimentare care trebuie inclus i ntreinut n structura de date luat ca suport. 3. Verificarea posibilitii ntreinerii informaiei suplimentare n cazul operaiilor de baz care modific structura suport. 4. Proiectarea noilor operaii. Ca i n cazul altor metode de proiectare prezentate schematic, nu trebuie s respectm exact paii n ordinea de mai sus. Nu are nici un rost, de exemplu, s se determine informaia suplimentar i proiectarea noilor operaii (paii 2 i 4) dac nu se va putea ntreine eficient 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 fast exemplificai la nceputul capitolului pentru proiectarea arborilor de statistic de ordine. La pasul 1 am ales ca structur suport arborii rou-negri. O indicaie asupra utilitii acestor arbori la obinerea statisticilor de ordine este dat de eficiena operaiilor specifice mulimilor dinamice pe o ordine total, precum MINIM, MAXIM, SUCCESOR i PREDECESOR. La pasul 2 am adugat cmpurile dimensiune, care conin, pentru fiecare nod x, dimensiunea subarborelui avnd rdcina x. n general, informaia suplimentar are ca scop sa fac operaiile (proprii structurii mbogite) mai eficiente. De exemplu, am fi putut implementa operaiile RNSELECT i RN-RANG folosind numai cheile memorate n arbore, ns n acest caz timpul lor de execuie nu ar mai fi fost O(lg n). Uneori aceast informaie suplimentar conine referine i nu date. La pasul 3, ne-am asigurat c operaiile de inserare i tergere pot ntreine cmpurile dimensiune fr a-i altera eficiena asimptotic, ele executndu-se tot ntr-un timp O(lg n). n cazul ideal, un numar mic de modificri ale structurii de date, trebuie s fie suficient pentru a ntreine

97

informaia suplimentar. De exemplu, dac am memora n fiecare nod rangul su din arbore, atunci operaiile RN-SELECT i RN-RANG s-ar executa mai rapid, dar inserarea unui nou element minim n arbore, ar provoca modificarea acestei informaii (rangul) n fiecare dintre nodurile arborelui. n schimb dac memorm dimensiunea subarborilor n locul rangului, inserarea unui nou element va necesita modificri ale informaiilor doar in O(lg n) noduri. La pasul 4, am proiectat operaiile RN-SELECT i RN-RANG. De fapt, mbogirea structurii de date este impus tocmai de nevoia de a implementa noi operaii. Uneori informaia suplimentar se va putea folosi nu numai la proiectarea operaiilor noi, ci i la reproiectarea celor proprii structurii de date suport pentru a le mbuntii performanele. Arbori de intervale. Ne propunem s mbogim arborii rou-negri pentru a realiza operaii pe mulimi dinamice de intervale. Un interval nchis este o mulime notat [t1;t2] ={tR|t1,t2R, t1<t<t2}. 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 ocupa fiecare 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. Bazele de date temporale, de altfel, sunt la mod acum. Structura de date prezentat n aceasta seciune ofer un mijloc eficient de ntreinere a unei astfel de baze de date de intervale. Intervalul [t1;t2] se poate reprezenta sub forma unui obiect i, care are cmpurile jos[i] = t1 (captul inferior) i sus[i] = t2 (captul superior). Spunem ca intervalele i i i se suprapun daca i i adic dac jos[i] sus[i] i jos[i] sus[i]. Pentru orice dou intervale i ~i i are loc trihotomia intervalelor, adic ele verific doar una din urmatoarele trei proprieti: a. i si i se suprapun, b. sus[i] < jos[i], c. sus[i] < jos[i ]. n figura urmtoare sunt prezentate cele trei cazuri:

98

(a)

(b)

(c)

Numim arbore de intervale un arbore rou-negru care ntreine o mulime dinamic de elemente, n care fiecare element x conine un interval int[x]. Arborii de intervale au urmatoarele operaii. INSEREAZ(T, x) adaug la arborele de intervale T elementul x care are n cmpul int un interval. TERGE(T,x) terge elementul x din arborele de intervale T. CAUTA(T,x,r) retumeaz un pointer la un element din arborele de intervale pentru care int[y] se suprapune cu intervalul int[x], sau NIL dac n mulime nu exist un astfel de element. -n figura urmtoare vom ilustra modul de reprezentare al unei mulimi de intervale cu ajutorul unui arbore de intervale. Vom aplica metoda n patru pai descris mai nainte pentru a proiecta arborele de intervale i operaiile proprii acestuia.

(a)

99

(b) Figura (a) reprezinta 0 multime de 10 intervale, sortate de jos n sus dup captul din stnga (inferior), iar figura (b) reprezint arborele de intervale corespunztor. Parcurgerea n inordine a acestui arbore va produce lista nodurilor sortat dup captul din stnga. Pasul 1: Structura de date suport Am ales ca structur suport un arbore rou-negru n care fiecare 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 int[x], fiecare nod x va conine o valoare max[x] care reprezint valoarea maxim a capetelor intervalelor memorate n subarborele avnd rdcina x. Deoarece captul superior al fiecrui interval este cel puin la fel de mare ca i captul inferior al acestuia, max[x] va fi de fapt valoarea maxim a capetelor superioare ale intervalelor memorate n subarborele avnd rdcina x. Pasul 3: ntreinerea informaiei suplimentare. Inserarea i tergerea se pot executa ntr-un timp O(lg n) pe un arbore de intervale cu n noduri. Valoarea cmpului max[x] se determin uor dac se cunosc int[x] i valorile max ale fiilor nodului x cu : max[x] = max(sus[int[x]], max[LS[x]], max[LD[x]]). De fapt, actualizarea cmpurilor max dup o rotaie se poate realiza ntrun timp O(1). Pasul 4: Proiectarea noilor operaii. Singura operaie care trebuie proiectat este CAUTA(T ,i,x), care gsete un interval din arborele T suprapus pe intervalul i. Dac T nu conine

100

astfel de intervale se returneaz NIL altfel retumeaz x - pointer la intervalul cutat. CAUTA(T,i,x) x=rad[T] Daca jos[i]>max[x] atunci x=NIL return sdaca cat timp x NIL i i nu se suprapune cu int[x] daca LS[x] NIL i max[LS[x]] jos[i] atunci x=LS[x] altfel x=LD[x] sdaca scattimp Daca xNIL atunci i=x return Altfel i=NIL sdaca ntrebri i exerciii la capitolul 12. Exerciiul 1. Verificati afirmaia: dac am memora n fiecare nod rangul su din arbore, atunci operaiile RN-SELECT i RN-RANG s-ar executa mai rapid, dar inserarea unui nou element minim n arbore, ar provoca modificarea acestei informaii (rangul) n fiecare dintre nodurile arborelui . Exerciiul 2. Scriei algoritmul pentru INSEREAZA(T, x). Exerciiul 3. Scriei algoritmul pentru TERGE(T, x). Exerciiul 4. Scriei algoritmul care gsete toate intervalele i pentru care sus[i] < jos[i ], unde i este un interval la intrare. Exerciiul 5. Care este complexitatea algoritmului de mai sus?

Capitolul 13 Heap-uri binomiale i Fibonacci

101

n acest capitol vom nva: Ce sunt arborii binomiali De ce se numesc aa Ce sunt heap-urile binomiale Ce este analiza amortizat Ce sunt heap-urile Fibonaci De ce sunt superioare heap-urile Fibonacci 13.1 Despre necesitatea unor altfel de structuri Mulimea, ca noiune fundamenatal, este la fel de important n informatic ca i n matematic. n timp ce mulimile matematice sunt nemodificabile, mulimile manipulate de algoritmi pot crete, descrete sau, n restul cazurilor, se pot modifica n timp. Astfel de mulimi se numesc dinamice. n funcie de algoritmi, sunt necesare diferite timpuri de operaii pentru a fi executate asupra mulimilor. De exemplu, muli algoritmi au nevoie doar de posibilitatea de a insera elemente ntr-o mulime, de a terge elemente dintr-o mulime sau de a testa apartenena la o mulime. Ali algoritmi necesit operaii mai complicate. De exemplu, cozile de prioritate 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. ntr-o implementare tipic a unei mulimi dinamice, fiecare element este reprezentat de un obiect ale crui cmpuri pot fi examinate i manipulate dac avem un pointer (o referin) la acel obiect. Unele categorii de mulimi dinamice presupun c un cmp al obiectului este un cmp cheie, de identificare. Dac toate cheile sunt diferite, mulimea dinamic poate fi 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. O ordine total ne permite s definim, de exemplu, cel mai mic element n mulime sau s vorbim despre urmtorul element mai mare dect un element dat din mulime.

102

Operaiile pe o mulime dinamic pot fi mprite n dou categorii: interogri, care returneaz informaii despre mulime sau operaii de modificare, care modific mulimea. Exist structuri de date simple ca: stive, cozi, liste nlnuite i arbori cu rdcin, tabele de dispersie (hash). O alt structur de date important sunt arborii de cutare binar care au rol de baz pentru multe alte structuri de date. Arborii rou-negru, sunt o variant a arborilor de cutare binar. Un arbore rou-negru este un arbore de cutare echilibrat ca i un alt tip de arbore de cutare echilibrat numit B-arbore. O alt structur de date important este ansamblul (heap-ul). Heapsort introduce o tehnic nou de proiectare a algoritmilor bazat pe utilizarea unei structuri de date, numit heap. Structura de date heap este util nu doar pentru algoritmul heapsort, ea poate fi la fel de util i n tratarea eficient a unei cozi de prioritate. 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. Prezentm n continuare sructurile de date avansate: heap-uri binomiale i operaiile care se execut pe heap-uri: creare, gsirea cheii minime, reuniunea a dou heap-uri binomiale, inserarea unui nod, extragerea nodului avnd cheia minim i descreterea unei chei. B-arborii, care sunt arbori echilibrai folosii la memorarea pe disc magnetic. Deoarece discul magnetic opereaz mult mai ncet dect memoria RAM, performanele B-arborilor vor fi msurate nunumai prin timpul consumat cu operaiile de cutare dinamice, ci i prin numrul de accese la disc efectuate. Pentru fiecare operaie numrul de accese la disc este proporional cu nlimea B-arborelui. Heap-urile binomiale execut operaiile: INSEREAZ, MINIMUM, EXTRAGE-MIN i REUNETE n cazul cel mai defavorabil, n timp O(lg n), unde n este numrul total de elemente din heap-ul de intrare (sau n cele dou heap-uri de intrare n cazul REUNETE). Pe structura de date heap binomial se pot executa i operaiile TERGE i DESCRETE-CHEIE. Heap-urile Fibonacci sunt superioare heap-urilor binonmiale, cel puin n sens teoretic. Pentru msurarea performanelor heap-urilor Fibonacci se folosesc margini de timp amortizate. Operaiile INSEREAZ, MINIMUM i REUNETE consum n caul heap-urilor Fibonacci, timp amortizat de numai

103

O(1), n timp ce EXTRAGE-MIN i TERGE consum un timp amortizat de O(lg n). Cel mai mare avantaj al heap-urilor Fibonacci este acela c DESCRETE-CHEIE consum un timp amortizat de numai O(1). Operaia DESCRETE-CHEIE definit pentru heap-urile Fibonacci este asimptotic mai slab dect operaiile similare la diverii algoritmi specifici de grafuri, motiv pentru care acetia o folosesc mai rar. O alt categorie de structuri de date avansate o reprezint structurile de date pentru mulimi disjuncte. Se d un univers de n elemente care sunt grupate n mulimi dinamice. Iniial, fiecare element este singur ntr-o mulime. Operaia reunete fuzioneaz dou mulimi, iar cererea GSETE-MULIME identific mulimea care conine un anumit element la un moment dat. Reprezentnd fiecare mulime printr-un arbore cu rdcin, vom obine operaii surprinztor de rapide: o secven de m operaii se execut n timp O(m(m,n)), unde (m,n) este cel mult 4. Printre altele sunt incluse i urmtoarele structuri: O structur de date, inventat de van Emde Boas, care admite operaiile MINIMUM, 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). Arborii dinamici, definii de ctre Sleator i Tarjan. Cu ajutorul lor se ntreine o pdure de arbori cu rdcini disjuncte. Fiecare arc din fiecare arbore are ataat, drept cost, un numr real. n arborii dinamici se pot efectua operaii n vederea aflrii prinilor, rdcinilor, costurilor arcelor, costului minim al unui drum de la un nod la o rdcin. Arborii pot fi manevrai prin tierea de arce, modificarea costurilor arcelor de pe un drum de la un nod la o rdcin, legarea unei rdcini la un alt arbore etc. Una din implementrile arborilor dinamici necesit un timp amortizat de O(lg n) pentru fiecare operaie. Arborii splay (oblici), dezvoltai de ctre Sleator i Tarjan, sunt un tip de arbori binari de cutare care dau un timp amortizat O(lg n) pentru toate operaiile standard. Una dintre aplicaiile acestor arbori permite simplificarea arborilor dinamici. Structurile de date persistente permit att cereri, ct i, uneori, actualizri ale versiunilor vechi ale structurii. Tehnicile de creare a structurilor de date nlnuite persistente, descrise de ctre Driscoll, Sarnak, Sleator i Tarjan, sunt eficiente deoarece consum foarte puin timp i spaiu. 13.2 Heap-uri binomiale

104

Heap-urile binomiale fac parte din structurile de date cunoscute sub numele de heap-uri interclasabile, caracterizate de urmtoarele operaii: CREEAZ-HEAP(H) creeaz i returneaz un heap nou care nu conine elemente. INSEREAZ(H,x) insereaz nodul x a crui cheie a fost iniializat n heap-ul H. MINIMUM(H,y) 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(H1,H2,H) creeaz i returneaz un heap nou care conine toate nodurile heap-urilor H1 i H2. Heap-urile H1 i H2 sunt distruse n urma acestei operaii. DESCRETE-CHEIE(H,x,k) atribuie nodului x din heap-ul H valoarea k pentru cheie, valoare presupus a nu fi mai mare dect valoarea curent a cheii. TERGE(H,x) terge nodul x din heap-ul H. Tabelul de mai jos arat c heap-urile binare obinuite, folosite, de exemplu, n heapsort, suport bine aceste operaii, cu excepia operaiei REUNETE. n cazul heap-urilor binare, pentru fiecare operaie, exceptnd REUNETE, tipul 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 fi 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). heap binar (cazul cel mai defavorabil) (1) (lg n) (1) (lg n) (n) (lg n) heap binomial (cazul cel mai defavorabil) (1) O(lg n) O(lg n) (lg n) O(lg n) (lg n) heap Fibonacci (amortizat) (1) (1) (1) O(lg n) (1) (1)

procedur CREEAZ-HEAP INSEREAZ MINIMUM EXTRAGE-MIN REUNETE DESCRETECHEIE

105

TERGE

(lg n)

(lg n)

O(lg n)

n tabel sunt prezentai timpii de execuie ai operaiilor pentru trei implementri ale heap-urilor interclasabile. Numrul elementelor din heapurile folosite de o operaie este notat cu n. n continuare vom analiza heap-urile binomiale a cror margini pentru timpii de execuie, n cazurile cele mai defavorabile, sunt prezentate n tabelul de mai sus. n particular, operaia reunete pentru interclasarea a dou heap-uri binomiale cu n elemente va fi de complexitate O(lg n). Vor fi 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 ineficiente 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. 13.3 Arbori binomiali

106

figura 13.2 Deoarece un heap binomial este o colecie de arbori binomiali, vom prezenta mai inti arborii binomiali i demonstra unele proprieti eseniale ale acestora. Arborele binomial Bk este un arbore ordonat definit recursiv. Dup cum se vede n figura de mai jos, arborele binomial B0 const dintr-un singur nod. Arborele binomial Bk const din doi arbori binomiali Bk-1 care sunt nlnuii: rdcina unui dintre ei este fiul situat cel mai n stnga rdcinii celuilalt arbore. Figura prezint arborii binomiali de la B0 la B4. Lema urmtoare conine cteva proprieti ale arborilor binomiali. Arborele binomial Bk are: 1. 2k noduri, 2. nlimea k, 3. exact noduri, la adncimea i, pentru i=0,1,,k. 4. rdcina de grad k, grad mai mare dect al oricrui alt nod; mai mult, dac fii rdcinii sunt numerotai de la stnga spre dreapta prin k-1, k-2,,0 atunci fiul i este rdcina subarborelui Bi.

107

k i

Demonstraie Demonstraia este inductiv n raport cu k. Pasul iniial pentru fiecare proprietate l constituie arborele binomial B0. Verificare prorpietilor pentru B0 este imediat. Presupunem c lema are loc pentru arborele Bk-1. 1. Arborele binomial Bk are 2k-1+2k-1=2k noduri, deoarece el const din dou copii ale arborelui Bk-1. 2. innd cont de modul n care sunt nlnuite cele dou copii ale lui Bk-1 pentru a forma Bk, rezult c adncimea maxim a lui Bk este cu 1 mai mare dect adncimea maxim a lui Bk-1. Din ipoteza de inducie obinem valoarea (k-1)+1=k pentru adncimea maxim a lui Bk. 3. Fie D(k,i) numrul nodurilor situate pe nivelurile i al arborelui binomial Bk. Deoarece Bk este compus din dou copii nlnuite ale lui Bk-1, un nod de pe nivelul i din Bk-1 apare n Bk pe nivelele i i i+1. Altfel spus, numrul nodurilor situate pe nivelul i n Bk este egal cu numrul nodurilor de pe nivelul i din Bk-1 plus numrul nodurilor de pe nivelul i-1 din Bk-1. Astfel,
k 1 k 1 k D (k , i ) = D(k 1, i ) + D(k 1, i 1) = i + = i 1 i

4. Singurul nod cu grad mai mare n Bk dect n Bk-1 este rdcina, care are cu un fiu mai mult dect n Bk-1. Deoarece rdcina lui Bk-1 are gradul k-1, rdcina lui Bk are gradul k. Din ipoteza de inducie i dup cum ilustreaz figura de mai sus, fii lui Bk-1 (de la stnga la dreapta) sunt rdcinile arborilor Bk-2, Bk-3, , B0. Cnd Bk-1 este legat la Bk-1, fii rdcinii rezultate sunt rdcini pentru Bk-1, Bk-2, , B0. Corolar Gradul maxim al nodurilor unui arbore binomial avnd n noduri este lg n. Demonstraie Rezult imediat din prorietile 1 i 4 ale lemei de mai sus. Proprietatea 3 a lemei justific termenul de arbore binomial prin faptul k i c sunt coeficienii binomiali. Heap-uri binomiale Un heap binomial H este format dintr-o mulime de arbori binomiali care satisfac urmtoarele proprieti de tip 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.

108

Proprietatea a doua implic faptul c un heap binomial H avnd n noduri conine cel mult [lg n]+1 arbori binomiali. Pentru o justificare a acestei afirmaii se observ c reprezentarea binar a lui n are [lg n]+1 bii, fie acetia [lg n ] i <b[lg n], b[lg n]-1,,b0>, astfel nct n = i =0 bi 2 . Din proprietatea 1 a lemei de mai sus rezult c arborele binomial Bi apare n H dac i numai dac bitul bi=1. Astfel heap-ul H conine cel mult [lg n]+1 arbori binomiali. n figura de mai jos este prezentat un heap binomial H avnd 13 noduri. Reprezeantarea binar a numrului 13 este 1101, iar H conine arborii binomiali cu proprietatea de heap B3, B2 i B0 avnd 8, 4 i respectiv un nod,

n total fiind 13 noduri. figura 13.3

109

Reprezentarea heap-urilor binomiale Dup cum ilustreaz i figura de mai sus, fiecarea arbore binomial al unui heap binomial este memorat conform reprezentrii stnga-fiu, dreaptafrate. Fiecare nod are un cmp cheie plus alte informaii specifice aplicaiei care folosete heap-ul. n plus, fiecare nod x conine pointerii p[x] spre printele lui, fiu[x] spre fiul situat cel mai n stnga i frate[x] spre fratele lui x, situat imediat n dreapta. Dac nodul x este o rdcin atunci p[x]=NIL. Dac nodul x nu are fii atunci fiu[x]=NIL, iar dac x este fiu situat cel mai n dreapta, atunci frate[x]=NIL. Fiecare nod conine de asemenea cmpul grad[x], care reprezint numrul fiilor lui x. Rezult din figur 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 frate are semnificaii diferite dup cum nodurile sunt rdcini sau nu. Dac x este rdcin atunci frate[x] refer rdcina urmtoare n lista de rdcini. (dac x este ultima rdcin din list atunci, ca de obicei, frate[x]=NIL.) Un heap binomial dat H este referit prin pointerul cap[H] spre prima rdcin din lista de rdcini a lui H. Dac heap-ul binomial H nu are elemente, atunci cap[H]=NIL. 13.4 Operaii pe heap-uri binomiale Crearea unui heap binomial nou Pentru a crea un heap binomial vid, procedura CREEAZ-HEAPBINOMIAL va aloca i returna un obiect H, pentru care cap[H]=NIL. Timpul de execuie este (1). Gsirea cheii minime Procedura HEAP-BINOMIAL-MIN returneaz un pointer y la nodul cu cea mai mic cheie dintr-un heap binomial H avnd n noduri. Aceast implementare presupune c nu exist chei cu valoarea . HEAP-BINOMIAL-MIN(H,y) 1: y=NIL 2: x=cap[H]

110

3: min= 4: ct timp xNIL execut 5: dac cheie[x]<min atunci 6: min=cheie[x] 7: y=x 8: sfrit daca 9: y=frate[x] 10: sfrit ct timp 11: return Cheia minim a unui heap binomial se afl ntr-o rdcin deoarece este un heap ordonat. Procedura HEAP-BINOMIAL-MIN verific toate rdcinile (n numr de cel mult [lg n]+1) i reine minimul curent n min, respectiv un pointer la acest minim n y. Apelat pentru heap-ul binomial din figura 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 verificate. 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 Bk-1 avnd nodul rdcin y la arborele Bk-1 avnd nodul rdcin z; mai precis, z va fi printele lui y. Nodul z devine astfel rdcina unui arbore Bk. BINOMIAL-LEGTUR(y,z) 1: p[y]=z 2: frate[y]=fiu[z] 3: fiu[z]=y 4: grad[z]=grad[z]+1 5: return Procedura BINOMIAL-LEGTUR plaseaz nodul y n capul listei nlnuite care conine fiii nodului z ntr-un timp O(1). Reprezentarea stngafiu, dreapta-frate a fiecrui arbore binomial asigur succesul acestei proceduri deoarece fiecare arbore binomial are proprietatea de ordonare a arborelui: fiu cel mai din stnga al rdcinii unui arbore Bk este rdcina unui arbore Bk-1. Procedura HEAP-BINOMIAL-REUNETE unete dou heap-uri binomiale H1 i H2 i returneaz heap-ul rezultat. Pe parcursul efecturii operaiei, reprezentrile heap-urilor H1 i H2 sunt distruse. Procedura folosete

111

pe lng procedura BINOMIAL-LEGTUR nc o procedur auxiliar ANSAMBLU-BINOMIAL-INTERCLASEAZ, care interclaseaz listele de rdcini ale heap-urilor H1 i H2 ntr-o singur list simplu nlnuit ordonat cresctor dup gradul nodurilor.

112

figura 13.4 n figura 13.4 se prezint un exemplu pentru care se petrec toate cele patru cazuri indicate prin comentarii n procedura HEAP-BINOMIALREUNETE. Procedura HEAP-BINOMIAL-REUNETE se desfoar n dou faze. n prima faz se interclaseaz (prin apelul HEAP-BINOMIALINTERCLASEAZ) listele de rdcini ale heap-urilor binomiale H1 i H2 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 fraze ale procedurii. Liniile 1-3 ncep prin interclasarea celor dou liste ale heap-urilor binomiale H1 i H2 ntr-o singur list de rdcini H. Listele de rdcini ale lui H1 i H2 sunt ordonate strict cresctor dup grad, iar HEAP-BINOMIAL-INTERCLASEAZ returneaz o list de rdcini H, ordonat cresctor dup grad. Dac listele H1 i H2 au mpreun m noduri, atunci timpul de execuie pentru HEAP-BINOMIALINTERCLASEAZ este O(m), datorat 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(H1,H2,H) 1: Cheama CREEAZ-HEAP-BINOMIAL(H ) 2: Cheama HEAP-BINOMIAL-INTERCLASEAZ(H1,H2,H) 3: elibereaz obiectele H1,H2, dar nu i listele referite de ele 4: dac cap[H]=NIL atunci 5: return 6: sfrit dac 7: prec-x=NIL 8: x=cap[H]

113

9: urm-x=frate[x] 10: ct timp urm-xNIL 11: dac (grad[x]grad[urm-x]) sau (frate[urm-x]NIL i grad[frate[urm-x]]=grad[x]) atunci 11: prec-x=x cazurile 1 i 2 12: x=urm-x cazurile 1 i 2 13: altfel 14: dac cheie[x]cheie[urm-x] atunci 15: frate[x]=frate[urm-x] cazul 3 16: BINOMIAL-LEGTUR(urm-x,x) cazul 3 17: altfel 18: dac prec-x=NIL atunci 19: cap[H]=urm-x cazul 4 20: altfel 21: frate[prec-x]=urm-x cazul 4 22: sfrit dac 23: BINOMIAL-LEGTURA(x,urm-x) cazul 4 24: x=urm-x cazul 4 25: sfrit dac 26: urm-x=frate[x] cazul 4 27: sfrit dac 28: sfrit dac 29: sfrit ct timp 30: return 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 4-5 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 3 pointeri n lista de rdcini: - x indic rdcina curent examinat, - prec-x indic rdcina precedent lui x n lista de rdcini: frate[prec-x]=x, - urm-x indic rdcina urmtoare lui x n list: frate[x]=urm-x. H poate conine iniial cel mult dou rdcini cu un grad dat: deoarece H1 i H2 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.

114

n timpul execuiei procedurii HEAP-BINOMIAL-REUNETE, de fapt, pot exista 3 rdcini avnd acelai grad. Vom vedea cnd se produce aceast situaie. La fiecare iteraie a ciclului ct timp din liniile 9-24 se decide dac se poate lega x i urm-x n funcie de gradul lor i de gradul lui frate[urm-x]. Un invariant al acestui ciclu este faptul c la fiecare reluare a corpului ciclului att x ct i urm-x sunt diferii de NIL.

figura 13.5 Cazul 1, prezentat n figura 13.5.a se produce atunci cnd grad[x]grad[urm-x], adic x este rdcina unui arbore Bk i urm-x este rdcina unui arbore Bl pentru un l>k. Aceast situaie este tratat n liniile 1112. Deoarece nu trebuie s legm x i urm-x, nu rmne dect s deplasm

115

pointerii n list. Actualizarea pointerului urm-x pentru a referi nodul ce urmeaz noului nod x este efectuat n linia 24, deoarece aceasta este comun tuturor cazurilor. Cazul 2, prezentat n figura 13.5.b, are loc atunci cnd x este prima rdcin din cele 3 care au acelai grad, adic atunci cnd grad[x]=grad[urmx]=grad[frate[urm-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 11-12 trateaz amndou cazurile. Cazurile 3 i 4 se produc atunci cnd x este prima rdcin din 2 rdcini succesive avnd acelai grad, adic grad[x]=grad[urmx]grad[frate[urm-x]]. Aceste cazuri apar la iteraia urmtoare dup fiecare caz, dar unul din ele urmeaz imediat dup cazul 2. n cazurile 3 i 4 vom nlnui x i urm-x. Aceste cazuri difer ntre ele dup cum x sau urm-x au cheia mai mic, fapt ce determin care din noduri va fi rdcin n procesul de legare a lor. n cazul 3, prezentat n figura 13.5.c, cheie[x]cheie[urm-x], astfel c urm-x va fi legat la linia x. Linia 15 terge urm-x din lista de rdcini, iar n linia 16 urm-x devine fiul situat cel mai n stnga lui x. n cazul 4, prezentat n figura 13.5.d cheia mai mic o are urm-x, deci este legat la urm-x. Liniile 17-21 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 fiul situat cel mai n stnga lui urm-x, 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 Bk+1 obinut prin negarea a doi arbori Bk. Dup operaia HEAP-BINOMIAL-INTERCLASEAZ n lista de rdcini existau zero, unu sau doi arbori Bk+1, deci x este acum prima rdcin din lista de rdcini pentru un numr de unu, doi sau trei arbori Bk+1. n cazul existenei unui singur arbore (x referindu-l pe acesta), la iteraia urmtoare se va produce cazul 1: grad[x]grad[urm-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 H1 i H2. Justificm acest rezultat dup cum urmeaz: fie n1 i n2 numrul nodurilor heap-urilor H1 i respectiv H2 astfel nct n=n1+n2. Atunci numrul maxim de rdcini coninute de H1 i H2 este [lg n1]+1, respectiv [lg n2]+1. Astfel imediat

116

dup apelul HEAP-BINOMIAL-INTERCLASEAZ, H conine cel mult [lg n1]+[lg n2]+22[lg 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 n1]+[lg n2]+2 iteraii deoarece de la fiecare iteraie fie pointerii avanseaz cu o poziie n lista H, fie 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: Cheama CREEAZ-HEAP-BINOMIAL(H ) 2: p[x]=NIL 3: fiu[x]=NIL 4: frate[x]=NIL 5: grad[x]=0 6: cap[H]=x 7:Cheama HEAP-BINOMIAL-REUNETE(H,H,H) 8: return Procedura creeaz un heap binomial H 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 heapului binomial temporar H. 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: Cheama CREEAZ-HEAP-BINOMIAL(H) 3: inverseaz ordinea memorrii fiilor lui x n lista nlnuit asociat i atribuie lui cap[H] capul listei rezultate 4: Cheama HEAP-BINOMIAL-REUNETE(H,H,H) 5: returne

117

figura 13.6 Modul de funcionare al procedurii este ilustrat n figura 13.6. Heap-ul binomial H dat ca parametru de intrare este ilustrat n figura 13.6.a. Figura 13.6.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 Bk, atunci fiii lui x de la stnga la dreapta, sunt rdcinile unor arbori Bk-1, Bk-2, , B0. n figura 6.c se ilustreaz faptul c inversnd lista fiilor lui x (n linia 3) obinem un heap binomial H 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, conform figurii 6.d, va conine toate nodurile care existau iniial n H, exceptndu-l desigur pe x. n final, n linia 5 se returneaz x. HEAP-BINOMIAL-EXTRAGE-MIN se execut ntr-un timp O(lg n) deoarece fiecare din liniile 1-4 se execut ntr-un timp O(lg n).

118

Descreterea unei chei Procedura HEAP-BINOMIAL-DESCRETE-CHEIE(H,x,k) 1: dac k>cheie[x] atunci 2: eroare cheia nou este mai mare dect cheia existent 3: sfrit dac 4: cheie[x]=k 5: y=x 6: z=p[y] 7: ct timp zNIL i cheie[y]<cheie[z] 8: interschimb cheie[y]cheie[z] 9: dac y i z au i alte cmpuri atunci interschimb i aceste cmpuri 10: y=z 11: z=p[y] 12: sfrit ct timp

119

figura 13.7 Aceast procedur descrete o cheie n mod similar cu metoda aplicat pentru un heap binar: prin ridicarea cheii n heap, dup cum arat figura 7. 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 fiecare iteraie a ciclului ct timp, n liniile 6-10, se compar cheie[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 6-10) este [lg n] deoarece, din proprietatea 2 a lemei enunate mai sus rezult c nlimea maxim a lui x este [lg n].

120

tergerea unei chei tergerea cheii i a altor informaii asociate unui nod x aparinnd unui heap binomial H se poate desfura fr dificultate ntr-un timp O(lg n). Implementarea urmtoare presupune c 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 valoarea - cheii nodului x, acesta devine nodul avnd cheia minim n heap-ul binomial. Urmeaz apoi ca aceast cheie i eventual alte informaii asociate s fie ridicate pn la o rdcin prin apelul HEAP-BINOMIAL-DESCRETECHEIE. Aceast rdcin este apoi eliminat din H prin apelul HEAPBINOMIAL-EXTRAGE-MIN. Timpul de execuie pentru HEAP-BINOMIAL-TERGE este O(lg n). 13.3 Heap-uri Fibonacci Un arbore cu rdcin este un arbore liber n care unul dintre vrfuri se deosebete de celelalte. Vrful evideniat se numete rdcina arborelui. Un arbore ordonat este un arbore cu rdcin n care fiii fiecrui nod sunt ordonai. Cu alte cuvinte, dac un nod are k fii, atunci exist un prim fiu, un al doilea fiu,i un al k lea fiu. Arborele binomial Bk este un arbore ordonat definit recursiv: 1. arborele binomial B0 const dintr-un singur nod; 2. arborele binomial Bk const din doi arbori binomiali Bk-1 care sunt nlnuii: rdcina unuia dintre ei este fiul situat cel mai n stnga rdcinii celuilalt arbore. 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.

121

Conform acestei definiii, rdcina unui arbore cu proprietatea de heap ordonat, conine cea mai mic cheie din arbore. 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 fie arbori binomiali. Figura 13.8(a) reprezint 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 figura 13.8(b), fiecare nod x conine un pointer p[x] spre printele lui i un pointer fiu[x] la unul din fiii lui. Fiii lui x sunt nlnuii circular printr-o list dublu nlnuit, numit lista fiilor lui x. Fiecare fiu y dintr-o list de fii are pointerii stnga[y] i dreapta[y] care indic fratele stng, respectiv drept al lui y. Dac nodul y este singurul fiu, atunci stnga[y] = dreapta[y] =y . Ordinea n care apar fiii n list este arbitrar. Folosirea listelor dublu nlnuite i circulare pentru heap-uri Fibonacci are 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. Fiecare nod va conine nc dou cmpuri utile. Numrul de fii din lista fiilor nodului x este memorat n grad[x]. Cmpul de tip boolean marcat[x] va indica dac nodul x a pierdut un fiu dup ultima operaie n care x a fost transformat n fiul unui alt nod. Nodurile nou create nu sunt marcate, iar un nod x devine nemarcat atunci cnd este transformat n fiul unui alt nod. Un heap Fibonacci H este referit printr-un pointer min[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 min[H] =NIL Rdcinile tuturor arborilor dintr-un heap Fibonacci sunt nlnuite prin pointerii stnga i dreapta, formnd o list dublu nlnuit i circular, numit list de rdcini a heap-ului Fibonacci. Astfel, pointerul min [H] indic acel nod din lista de rdcini care are cheia minim. Ordinea nodurilor din lista de rdcini este arbitrar. Un atribut pe care ne vom baza este i numrul nodurilor n[H] al unui heap Fibonacci H. 13.4 Metoda de potenial

122

Vom folosi n analiza complexitii operaiilor pe heap-uri Fibonacci metoda de potenial . Descriem n continuare cum lucreaz metoda de potenial. Plecm de la o structur de date iniial D0 asupra creia se execut n operaii. Pentru fiecare i=1,2,,n, fie ci costul real al operaiei i i fie Di structura de date obinut din Di-1 dup aplicarea operaiei i. O funcie de potenial ataeaz fiecrei structuri de date Di numrul (Di ), care este potenialul asociat structurii de date Di . Costul amortizat i al operaiei i pentru funcia de potenial este definit astfel: i (13.1) = ci + (Di) (Di-1).

Prin urmare, costul amortizat al fiecrei operaii este costul real plus creterea de potenial datorat operaiei. Conform ecuaiei (13.1), costul amortizat total al celor n operaii este:
n n n

(13.2)
i=1

i =
i=1

(ci

+ (Di) - (Di-1)) =
i=1

ci

+ (Dn) - (D0)

Costurile amortizate definite de ecuaiile (13.1) i (13.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. 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 definit prin: (H)=t(H)+2m(H) (13.3) De exemplu, potenialul heap-ului Fibonacci din figura 13.8 este 5+23=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 suficient

123

de mare care acoper orice calcul necesar care se execut ntr-un timp constant .

(a).
-----2 -------3 7

min[H]
---------------3 -------------------- -------------------------1 2
7 4

1 8

5 2

3 8

3 0

2 6

4 6

3 9

4 1

3 5

(b).

min[H]

2 3

1 7

2 4

1 8

5 2

3 8

3 0

2 6

4 6

3 9

4 1

3 5

Figura 13.8 Heap Fibonacci

124

(a) Un heap Fibonacci constnd din 5 arbori , ce satisfac proprietatea de heap ordonat, i care conine 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 + 23 =11. (b) O reprezentare mai complex care arat pointerii p (sgeile orientate n sus), fiu (sgeile n jos), i stng (sgeile laterale). Aceste detalii vor fi omise n celelalte figuri deoarece toate informaiile prezentate aici pot fi 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 (1.2.3) , potenialul este nenegativ la orice moment de timp ulterior. O margine superioar a costului amortizat total este i o margine superioar a costului actual pentru secvena de operaii. Grad maxim n seciunea urmtoarea 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. Atunci cnd avem doar operaii de interclasare pe heap-uri D(n)= [lg n]. n seciunea 1.3 vom arta c, dac includem i operaiile DESCRETE-CHEIE i TERGE, D(n) =O(lg n). 13.5 Operaii cu heap-uri interclasabile n aceast seciune vom descrie i analiza operaiile heap-urilor interclasabile precum i implementri pe heap-uri Fibonacci. Dac se au n vedere doar aceste operaii - CREAZ-HEAP, NSEREAZ, MINIM, EXTRAGE-MIN, REUNETE - fiecare heap Fibonacci este o colecie de arbori binomiali "neordonai". Un arbore binomial neordonat este asemntor unui arbore binomial i se definete , de asemenea, recursiv. Arborele binomial neordonat Uk const dintr-un singur nod, iar un arbore binomial neordonat Uk const din doi arbori binomiali neordonai Uk-1, rdcina unuia din ei fiind (oricare) fiu al rdcinii celuilalt. Astfel, avem urmtoarea lem care conine propieti pentru arborii binomiali neordonai: Lema 13.1 Arborele binomial Uk are:

125

1.

2k noduri,

2. nlimea k,
3. exact

pentru i = 0,1 ,...,k, 4. gradul rdcinii arborelui binomial Uk este k, grad mai mare dect al oricrui alt nod. ntr-o ordine oarecare, descendenii rdcinii sunt rdcinile unor arbori U0,U1,...,Uk-1. Astfel, deoarece un heap Fibonacci avnd n noduri este o colecie de arbori binomiali neordonai, D(n) = lg n.. Ideea de baz , aplicat la definirea operaiilor heap-urilor interclasabile pe heap-uri Fibonacci este de a ntrzia anumite prelucrri ct mai mult posibil. Obinerea unor operaii performante poate fi n detrimentul altora. Dac numrul arborilor unui heap Fibonacci este mic, atunci nodul minim necesar operaiei EXTRAGE-MIN este determinat eficient. Dar, dup cum se tie pentru heap-uri binomiale, 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 fi lsat n seama operaiei EXTRAGE-MIN, operaie care necesit gsirea nodului minim.

k i

), noduri , la adncimea i ,

13.5.1 Crearea unui heap Fibonacci


Pentru a crea un heap Fibonacci vid , procedura HEAP-FIB-CREAZ, creeaz i returneaz un obiect heap Fibonacci H, cu n[H] = 0 i min[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 HEAP-FIBCREAZ este egal cu costul ei actual O(1).

13.5.2 Inserarea unui nod

126

Procedura urmtoare insereaz nodul x n heap-ul Fibonacci H, presupunnd c nodul a fost alocat n prealabil i c cheie[x] a fost de asemenea iniializat.

HEAP-FIB-INSEREAZ (H,x)
1. grad[x] = 0 2. p[x] = NIL 3. fiu[x] = NIL 4. stnga[x] = x 5. dreapta[x] = x 6. marcat[x] = FALS 7. concateneaz lista de rdcini care l conine pe x cu lista de rdcini a lui H 8. dac min[H] = NIL sau cheie[x] < cheie[min[H]] atunci 9. min[H] = x 10. Sdac 11. n[H] = n[H] + 1 12. return Dup iniializarea cmpurilor nodului x n liniile 1-6 , 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 binomial neordonat aparinnd heap-ului Fibonacci. Acest arbore nu are fii i nu este marcat. n continuare, n liniile 8-10, este actualizat, dac este necesar, pointerul la nodul minim din heap-ul Fibonacci H. n final, linia 11 incrementeaz n[H] marcnd inserarea unui nod nou. Figura 13.9 prezint inserarea nodului avnd cheia 21 n heap-ul Fibonacci din figura 13.8. (a)
-----2 -------3 7

min[H]
---------------3 -------------------- -------------------------1 2
7 4

1 8

5 2

3 8

3 0

2 6

4 6

3 9

4 1

3 5

127

(b)
2 3

min[H]
-----------------------------------------------------------------------------------------7 2 3 1 2
1 7 4

1 8

5 2

3 8

3 0

2 6

4 6

3 9

4 1

3 5

Figura 13.9 Inserarea unui nod ntr-un heap 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 adugat listei de rdcini, devenind fratele stng al rdcinii. Procedura HEAP-FIB-INSEREAZ nu consolideaz arborii 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, fie H heap-ul Fibonacci dat ca intrare i H' heap-ul Fibonacci rezultat. Atunci : t (H') = t (H) +1 m (H') = 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).

13.5.3 Gsirea nodului minim


Nodul minim al unui heap Fibonacci H este dat de pointerul min (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). 13.5.4 Reuniunea a dou heap-uri Fibonacci Procedura urmtoare reunete heap-urile Fibonacci H1 i H2, distrugnd H1 i H2 n timpul desfurrii procesului.

128

HEAP-FIB-REUNETE (H1,H2,H)
1. Cheama HEAP-FIB-CREAZ(H) 2. min[H] = min[H1] 3. concateneaz lista de rdcini a lui H1 cu lista de rdcini a lui H2 4. dac (min[H1] = NIL ) sau (min [H2] NIL i min[H2] < min[H2]) atunci 5. min[H] = min[H2] 6. Sdac 7. n[H] = n[H1] + n[H2] 8. elibereaz obiectele H1 i H2 9. return Liniile 1-3 concateneaz listele de rdcini ale lui H1 i H2 obinndu-se o list de rdcini nou H . Liniile 4 i 6 stabilesc nodul minim al lui H, iar linia 7 iniializeaz n[H] cu numrul total de noduri. Obiectele H1 i H2 sunt dealocate n linia 8, iar linia 9 returneaz heap-ul Fibonacci H rezultat. Arborii heap-ului nu sunt consolidai, la fel ca i n procedura HEAP-FIBINSEREAZ. Potenialul rmne neschimbat i anume:

(H) - ( (H1) + (H2)) =


= (t(H) + 2m(H)) - ((t(H1) + 2m(H1)) +((t(H2) + 2m(H2))) = 0, deoarece t(H) = t(H1) + t(H2) i m(H) = m(H1) + m(H2). Costul amortizat al operaiei HEAP-FIB-REUNETE este astfel egal cu costul actual O(1) .

13.5.5 Extragerea nodului minim


Procesul de extragere al nodului minim este cel mai complicat dintre toate operaiile prezentate n aceast seciune. Consolidarea arborilor din lista de rdcini este efectuat n cadrul acestei operaii. Urmtorul algoritm 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 fi prezentat n continuare.

HEAP-FIB-EXTRAGE-MIN (H,z)
1. z = min[H]

129

2. dac z NIL atunci

3. 4.
5.

6. 7. 8. 9.
10.

11. 12. 13. 14. 15. 16. 17.

pentru fiecare fiu al lui z adaug x la lista de rdcini a lui H p[x] = NIL Spentru terge z din lista de rdcini a lui H dac z = dreapta [z] atunci min [H] = NIL altfel min [H] = dreapta [z] CONSOLIDEAZ(H) Sdac n[H] = n[H] 1 Sdac returne

Conform figurii 13.10, procedura HEAP-FIB-EXTRAGE-MIN rupe legturile ntre nodul rdcin minim respectiv fiii 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 fiecare grad . Pornim n linia 1 prin reinerea unui pointer z la nodul minim ; n final se va returna acest pointer. Dac z = NIL atunci heap-ul Fibonacci H este vid i prelucrarea este ncheiat. n caz contrar, nodul z este ters din H n liniile 3-6 prin transformarea fiilor lui z n rdcini i tergerea lui z din lista de rdcini (linia 7). Dac z = dreapta [z] atunci z fusese singurul nod din lista de rdcini i nu avusese nici un fiu, astfel nct, mai nti, trebuie s facem heapul H vid. n caz contrar, stabilim pointerul min[H] n lista de rdcini astfel nct s indice nodul minim rmas ( n acest caz, dreapta[z]) diferit de z . Figura 13.10 (b) prezint heap-ul Fibonacci din figura 13.10 (a) dup executarea instruciunii din linia 12. (a)
2 3

min[H]
-----------------------------------------------------------------------------------------7 2 3 1 2
1 7 4

1 8

5 2

3 8

3 0

2 6

4 6

130
3 9 4 1 3 5

(b)
2 3

min[H]
-----------------------------------------------------------------------------------------7 2 1 5 3 1 2
1 8 2 8 7 4

3 9

4 1

3 0

2 6

4 6

3 5

(c)
A

0 1 2 3
w,x -----------------------------------------------------------------------------------------7 2 1 5 3 1 2
1 8 2 8 7 4

2 3

3 9

4 1

3 0

2 6

4 6

(d)
A

0 1 2 3

3 5

2 3

w,x -----------------------------------------------------------------------------------------7 2 1 5 3 1 2
1 8 2 8 7 4

3 9

4 1

3 0

2 6

4 6

3 5

131

(e)
A

0 1 2 3
w,x 1 -----------------------------------------------------------------------------------------7 2 5 3 1 2
1 8 2 8 7 4

2 3

3 9

4 1

3 0

2 6

4 6

3 5

(f)
A

0 1 2 3

x w

-------------------------------------------------------------------------------7 2 1 5 3 1 2
1 8 2 8 7 4

2 3

3 9

4 1

3 0

2 6

4 6

3 5

(g)
A

0 1 2 3

x
1 7

-------------------------------------------------------------------------------7 2 1 5 3 2
1 8 2 8 4

2 3

3 9

4 1

2 6

4 6

3 0

3 5

132

(h)
A

0 1 2 3

x
2 4

2 --------------------------------------------------------------------1 5 3 1 8 2 8

1 7

2 3

3 9

4 1

2 6

4 6

3 0

(i) 5 A
w,x

0 1 2 3

7 --------------------------------------------------------------------2 1 5 3 1 8 2 8

2 4

1 7

2 3

3 9

4 1

2 6

4 6

3 0

3 5

0 1 2 3 A
w,x

(j)

7 --------------------------------------------------------------------2 1 5 3 1 8 2 8

2 4

1 7

2 3

3 9

4 1

2 6

4 6

3 0

3 5

133

0 1 2 3 A
w,x

(k)

7 --------------------------------------------------------------------3 1 8 8 1 7 3 0 2 3

2 4 2 6 4 6

2 1 5 2

3 9

4 1

3 5

0 1 2 3 A

(l)

w,x
7--------------------------------------------------------------------3 1 8 8 2 4 2 6 1 7 2 3

2 1 5 2

3 9

4 1

4 6

3 0

3 5

(m)

min [H]
--------------------------------------------------------------------7 1
8 3 8

2 4

1 7

2 3

2 1

3 9

4 1

2 6 3 5

4 6

3 0

5 2

134

Figura 13.10 Inserarea unui nod ntr-un heap Fibonacci. (a) Un heap Fibonacci H. (b) Situaia obinut dup tergerea nodului minim z din lista de rdcini i adugarea la lista de rdcini a fiilor lui z. (c)-(e) Tabloul A i arborii dup primele 3 iteraii ale ciclului pentru din liniile 4-17 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 fiecrei iteraii a ciclului ct timp din liniile 7-15 . 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 acum indicat 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) Situaiile obinute 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]. Pasul urmtor n care reducem numrul de arbori din heap-ul Fibonacci const n consolidarea 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 fiecare rdcin din lista de rdcini are o valoare distinct pentru gradul su : 1. Gsete dou rdcini x i y din lista de rdcini avnd acelai grad i cheie[x] < cheie[y] 2. nlnuie y la x terge y din lista de rdcini i include nodul y printre fiii lui x. Aceast operaie este efectuat prin procedura HEAP-FIBNLNUIE. Cmpul grad[x] este incrementat, iar marcajul nodului y, dac exist, este ters.

CONSOLIDEAZ(H)
1. pentru i = 0 , D(n(H)) 2. A[i] = NIL 3. Spentru

135

4. pentru fiecare nod w din lista de rdcini a lui H 5. x = w 6. d = grad[x] 7. ct timp A[d] NIL 8. y = A[d] 9. dac cheie[x] > cheie[y] atunci 10. interschimb x y 11. Sdac 12. HEAP-FIB-NLNUIE(H,y,x) 13. A[d] = NIL 14. d = d+1 15. Sciclu 16. A[d] = x 17. Spentru 18. min[H] = NIL 19. pentru i = 0, D(n[H]) 20. dac A[I] NIL sau cheie[A[i]] < cheie[min[H]] atunci 21. adaug A[i] listei de rdcini a lui H 22. dac min[H] = NIL sau cheie[A[i]] < cheie[min[H]] atunci 23. min[H] = A[i] 24. Sdac 25. Sdac 26. Spentru 27. return

HEAP-FIB-NLNUIE (H,y,x)
1. terge y din lista de rdcini a lui H 2. nlnuie y ca fiu al lui x i incrementeaz grad[x] 3. marcat[y] = FALS
4. return

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 1 - 2 se iniializeaz A atribuind fiecrui element

136

valoarea NIL. Procesarea fiecrui nod w se ncheie cu un nod x care poate fi , sau nu, identic cu w. Astfel, elementele tabloului A[grad[x]] sunt iniializate cu x. n ciclul pentru din liniile 4-17 este examinat fiecare nod w din lista de rdcini. Invariantul la fiecare iteraie n ciclul for este c nodul x este rdcina arborelui care conine nodul w. Ciclul ct timp din liniile 7-15 are predicatul invariant d = grad[x] (cu excepia liniei 13 dup cum vom vedea imediat). La fiecare iteraie a ciclului ct timp A[d] indic o anumit rdcin y. Deoarece d =grad[x]= grad[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 9-11. n continuare y este legat la x prin apelul din linia 12, HEAP-FIB-NLNUIE(H,y,x). n urma apelului , grad[x] este incrementat, iar grad[y] rmne d. Deoarece nodul y nu mai este rdcin, pointerul spre el din tabloul A este ters n linia 13. Deoarece dup apelul HEAP-FIB-NLNUIE valoarea grad[x] este incrementat, n linia 14 este restabilit proprietatea invariantului d = grad[x]. Ciclul ct timp este executat de attea ori pn cnd A[d] = NIL, situaie n care nu exist alte rdcini avnd acelai grad ca i x. n linia 16 iniializm A[d] cu x i efectum iteraia urmtoarea ciclului pentru. Figurile 2.2 (c) - (e) prezint tabloul A i arborii rezultai dup primele trei iteraii ale ciclului pentru din liniile 4-17. La iteraia urmtoare a ciclului pentru sunt realizate trei legturi; rezultatele lor se pot vedea n figurile 2.2 (f) - (h). Figurile 2.2 (i)-(l) prezint rezultatele urmtoarelor patru iteraii ale ciclului pentru. Rmne s definitivm operaiile ncepute. Dup execuia ciclului pentru din liniile 417, linia 18 videaz lista de rdcini iar n liniile 1926 aceasta este reconstruit. Heap-ul Fibonacci rezultat este redat n figura 2.2 (m). Dup consolidarea listei de rdcini, operaiile efectuate de HEAP-FIB-EXTRAGEMIN se ncheie cu decrementarea valorii n[H] n linia 15 i returnarea n linia 17 a unui pointer la nodul ters z. Observm c dac anterior apelului HEAP-FIB-EXTRAGE-MIN toi arborii din heap-ul Fibonacci sunt arbori binomiali neordonai, atunci arborii rezultai dup apel sunt de asemenea binomiali neordonai. Arborii sunt modificai n dou feluri. n primul rnd, n liniile 3-6 din HEAP-FIBEXTRAGE-MIN, fiecare fiu x al lui z devine o rdcin i fiecare arbore nou va fi 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 fii au fiecare o structur de tip Uk. Rezult c arborele obinut va avea o structur Uk+1.

137

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 fi fcut dup cum urmeaz. O contribuie O(D(n)) provine din faptul c nodul minim are cel mult D(n) fii care sunt procesai de HEAP-FIB-EXTRAGE-MIN i din calculele efectuate n liniile 1-3 i 18-26 n procedura CONSOLIDEAZ. Ne rmne s analizm contribuia din partea ciclului pentru din liniile 4-17. Dup apelul procedurii CONSOLIDEAZ lungimea listei de rdcini poate fii 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 fiilor nodului extras care poate fi cel mult D(n). De fiecare dat, n ciclul ct timp din liniile 6-16 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 fiecrei legturi se datoreaz reducerii potenialului n urma nlnuirilor care micoreaz cu 1 numrul de rdcini. 13.6 Mrginirea gradului maxim Pentru a demonstra c timpul amortizat al operaiilor HEAP-FIBEXTRAGE-MIN i HEAP-FIB-TERGE este O(lg n), trebuie s artm c marginea superioar D(n) a gradului oricrui nod dintr-un heap Fibonacci avnd n noduri este O(lg n). 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

138

arta c prin nlturarea unui nod de la printele lui, dac acesta pierde doi fii, atunci D(n) = O(lg n). Mai precis, vom arta c D(n) < [log n], unde

= (1 +

)/2.

Ideea de baz a analizei este urmtoarea. Pentru fiecare nod x dintr-un heap Fibonacci fie dim(x) numrul nodurilor subarborelui cu rdcina x, incluzndu-l i pe x. (S observm c x nu trebuie s fie n lista de rdcini poate fi orice nod.) Vom arta c dim(x) depinde exponenial de grad[x]. S reinem c grad[x] este actualizat pentru a exprima cu precizie gradul lui x. Lema 13.2 Fie x un nod oarecare dintr-un heap Fibonacci i presupunem c grad[x]= k. Notm cu y1, y2, ,yk, fiii lui x n ordinea n care au fost legai la x, de la cel mai devreme la cel mai recent. Atunci, grad[y1] > 0 i grad[yi] > i-2 pentru i = 2,3,,k.. Demonstraie. Este evident c grad[y1]>0. Pentru i > 2, observm c atunci cnd yi a fost legat la x, celelalte noduri y1,y2,, yi-1 erau deja fii ai lui x, astfel c grad[x] > i-1. Nodul yi este legat la x numai dac grad[x] = grad[y i], de unde rezult c la acel moment are loc de asemenea grad[yi] > i-1. Din acel moment nodul yi poate pierde cel mult un fiu, deoarece, dac i-ar fi pierdut ambii fii, ar fi fost tiat legtura sa cu x. n concluzie, grad[yi] > i-2. Ajungem, n sfrit, la acea parte a analizei noastre care justific numele de heap-uri Fibonacci. Dup cum bine tim, pentru k = 0,1,2,, al k-lea numr Fibonacci este definit prin relaia de recuren

Fk =

0 1 Fk--1 + Fk-2

dac k = 0 dac k = 1 dac k > 2

Lema urmtoare ofer un alt mod de a exprima Fk. Lema 13.3 Pentru orice k > 0,
k

Fk+2 = 1+ Fi .
i =0

139

Demonstraie. Demonstraia este prin inducie dup k. Dac k = 0,


0

1+

Fi

= 1+ F0 = 1 + 0 = 1 = F2
k-1

i =0

Presupunnd acum c are loc ipoteza induciei, Fk+1 = 1 +


k-1 i=0 k i=0

Fi ,
i =0

avem:

Fk+2 = Fk + Fk+1 = Fk + ( 1 + Fi ) = 1 + Fi . Lema urmtoare i corolarul ei completeaz analiza. Lema folosete inegalitatea: Fk+2 >
k

,
5 )/2

unde este raportul de aur definit prin ecuaia Fk+2 = Fk + Fk+1 ca fiind :

=(1+
Atunci

= 1.61803 .

Lema 13.4 Fie x un nod oarecare dintr-un heap Fibonacci i fie k =grad[x]. dim(x)> Fk+2 >
k

unde

=(1+

)/2 = 1.61803 .

Demonstraie. Notm cu sk valoarea minim posibil pentru dim(z) pentru toate nodurile z care au proprietatea grad[z] = k. Evident c s0 = 1, s1 = 2, s2 = 3. Numrul sk este cel mult dim(z). Ca i n lema 4.1, notm y1, y2, ,yk fiii lui x n ordinea n care au fost legai la x.Pentru a calcula o margine inferioar pentru dim(x) adunm 1 pentru x i 1 pentru primul fiu y 1 (pentru care dim(y1)>1) i aplicm apoi lema 4.1 pentru ceilali fii. Avem astfel:
k

dim(x) > sk > 2 + s i-2 .


i=2

140

Artm acum, prin inducie n raport cu k, faptul c sk >Fk+2, pentru orice k nenegativ. Cazurile de baz pentru k = 0 i k =1 sunt evidente. Pentru pasul inductiv, presupunem c k > 2 i si > Fi+2, pentru i = 0,1, ,k-1. Avem:
k i=2 k i=2 k

sk > 2 + si-2 > 2 + Fi = 1 +

Fi = Fk+2.
i=0

Ultima egalitate rezult din lema 4.2. Am artat astfel c dim(x) > sk > Fk+2 > k . Corolarul 13.1 Gradul maxim D(n) al oricrui nod dintr-un heap Fibonacci avnd n noduri, este O(lg n). Demonstraie. Fie x un nod oarecare al unui heap Fibonacci cu n noduri i fie k = grad[x]. Din lema 4.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).

Rezolvarea unor probleme dintre cele propuse. Rezolvri la capitolul 1. Structuri elementare de date 1. Algoritm de intrare intr-o coada circulara alocat intr-un vector x cu n elemente, cu faa n f i sfritul n s.

141

Intrare_coada_circulara (x,f,s,n) Daca (s = n i f=1) sau (s=f-1) atunci DEPASIRE Altfel s=s+1 daca s>n atunci s=1 sdaca x [ s ] = inf sdaca return 2. Algoritm de iesire dintr-o coada circulara alocat intr-un vector x cu n elemente, cu faa n f i sfritul n s. Iesire_coada_circulara(x,f,s,n) Daca s = f atunci COADA VIDA Altfel Inf = x [ f ] ; f= f+1 Daca f>n atunci f=f+1 sdaca sdaca return 3. Doua stive alocate in acelasi vector : a) Disciplina de umplere:

Presupunem ca la un moment dat sirul nostru va arata astfel: V[1 V[2 V[3 V[k1 V[k2] V[n] ] ] ] ] Unde pn la k1 avem prima stiv, iar de la k2 pn la n avem cea de-a doua stiv. b) Algoritmi de intrare-iesire a informaiei a pentru stiva 1: Intrare_stiva1(V,n,k1,a) Daca (k1 = n sau k1=k2-1) atunci DEPASIRE altfel k1 = k1 + 1 ; v[k1] = a ;

142

sdaca return Iesire_stiva1(V,n,k1,a) Daca k1 = 0 atunci STIVA VIDA altfel a = v[k1] k1=k1-1 sdaca return c) Algoritmi de intrare-iesire a informaiei a pentru stiva 2: Intrare_stiva2(V,n,k2,a) Daca (k2 = k1+1 sau k2+n) atunci DEPASIRE altfel k2 = k2 - 1 ; v[k2] = a; sdaca return Iesire_stiva2(V,n,k2,a) Daca k2 = n atunci STIVA VIDA altfel a = v[k2] k2 = k2 + 1 ; sdaca return 4. Matrice patratica de ordin n in care toate elementele deasupra diagonalei principale sunt egale cu 0 d) Cate elemente pot fii diferite de 0? :
n( n +1) 2

e) Aranjarea elementelor pe linii intr-o coloana Matricea : A[1, 1] 0 0 0

143

A[2, 1] A[3, 1] A[n, 1] Sirul:

A[2, 2] A[3, 2] A[n, 2]

0 A[3, 3] A[n, 3]

0 0 A[n, n]

A[1, A[2, A[2, A[3, A[3, A[3, A[n,1 A[n, A[n,2] A[n,3] 1] 1] 2] 1] 2] 3] ] n] B[k- B[k-(n- B[k-(nB[1] B[2] B[3] B[4] B[5] B[6] B[k] n] 1)] 2)]

f) Formula pentru k:
k= (i 1)i +j 2

g) Formulele pentru i si j: Mai rmne s o facei. h) Algoritm de transformare din matrice in sir: Transformare_Matrice_in_Sir(a,n,B) k=0; Pentru i = 1 la n Pentru j = 1 la i k=k+1 B[ k ] = a [ i , j ] ; Spentru Spentru Return

144

i) Algoritm de calcul pentru produsul normal este: Prod_mat(A1,A2,n,MA) Pentru i=1,n Pentru j=1,n MA[i,j]=0 Pentru k=1,n MA[i,j]=MA[i,j]+A1[i,k]*A2[k,j] Spentru spentru spentru return Pentru a gsi algoritmul dorit trebuie s nlocuim: A1[i,j] cu B1[(i(i-1)/2+j] A2[i,j] cu B2[(i(i-1)/2+j] i MA[i,j] cu MB[(i(i-1)/2+j]. Rezolvri la capitolul 2. 1. A=0.02 secunde Viteza de revoluie pe secund va fi R=7200/60= 120 R=1/120=0.0083 secunde R/2= 0.00415 L/D=1000/80000=0.010205 Deci: T=0.02+0.00415+0.010205=0.034355 secunde 2. Timpul total de citire a fiierului= 0.00415*8+0.010205*8000=81.6732, iar T=81.67/8000=0.0102 secunde Rezolvri la capitolul 3. 1. Modelul reea este un model care conine nregistrri, date i relaii 1 la mai muli ntre nregistrri. Reelele sunt un mod natural de a reprezenta legturile care se stabilesc ntre obiecte. n general reelele sunt reprezentate cu ajutorul unei structuri matematice numit graf orientat. La modelul reea sunt doar dou structuri fundamentale si anume : - mregistrarea sau record (o colecie de date logic legate ntre ele) - legtura sau set (o relaie de unu-la-mai-multe sau unu-la unu ntre dou

145

lnregistrri). 2. S considerm relaia Carte la Autor. Carte Autor

Aeast relaie este, evident, muli la muli. Ea se transform n: Carte


CarteId AutorId

nregistrare de lagtur

Autor Rezolvri la capitolul 4. 1. Ceea ce se transcrie n stuctura extern modelul ierarhic este o arboresce grafic, un graf orientat, conex fr cicluri. 2. S considerm relaia Carte la Autor. Carte Autor

Aeast relaie este, evident, muli la muli. Aceeai relaie folosit i la problema 2. cap 3. se va transforma: Carte Carteautor Carteautor Autor

n dou relaii 1 la muli n care dublarea lui Carteautor se face n mod util. Rezolvri la capitolul 5.
1. R1=titlu(

d_domeniu="stiinta"

(cartedomenii))

2. R2=d_edit( 3. R3=titlu

oras="brasov"

(edituri)) (cartecarteaut autor))

nume_aut="Ion Ion"

146

4. R4=titlu(

nume_aut="Ion Ion"

(cartecarteaut autor))\ titlu(

nume_aut !="Ion Ion"

(cartecarteaut autor))

Rezolvri la capitolul 6. 1. INORD_IT(RAD) STIVA = {Stiva este vid} P=RAD {P conine nodul care se vizitez} Repet Repet Dac P * atunci{Parcurgere pe stnga} P=>STIVA P=LS(P) Cicleaz altfel EXIT Sdaca sciclu {Parcurgere pe dreapta} Dac STIVA = atunci EXIT Altfel P<=STIVA ; Scrie INFO(P);P= LD(P) Sdaca Sciclu Return 3. Arborele va fi:
A B D E H C F G

Rezolvri la capitolul 7. 3. Fiul stng al nodului i se gsete n 2i deci algoritmul va fi:

147

list_fara_stng(a,n) pentru i=1,n daca a[i] * atunci daca ((2i < n) si (a[2i] *)) atunci scrie a[i] sdaca sdaca spentru return Rezolvri la capitolul 8. Arbori binari de cutare. 1. Exercitiul 1. (Determinarea nodului cu cheie maxim) MAX_BIN (Rad, Max) x = Rad Atat timp cat LD(x) Nil x = LD(x) Max = KEY(x) sciclu Return 2. Exercitiul 2. (determinarea predecesorului) PRED_BIN(x, y) Daca LS(x) Nil atunci Cheama MAX_BIN(LS(x), y) Return sdaca y = P(x) Atat timp cat y Nil si KEY(y)>KEY(x) executa y = P(y) sciclu Return 3. Exercitiul 3. (Cautarea binara recursiva) CAUT_BIN_REC(Rad, k, Rez,x) x = Rad Daca x = Nil sau k = KEY(x) atunci Return sdaca Daca k < KEY(x) atunci Cheama CAUT_BIN_REC(LS(x), k, Rez,x)

148

Return altfel Cheama CAUT_BIN_REC( LD(x), k, Rez,x) Return sdaca

Rezolvri la capitolul 9. 1. h(k)=[m*((k*A) mod 1)] pentru A=(5-1)/2=0.6180339 m=1000 (k*A) mod 1 pentru k=61 va fi 0.700 pentru k=62 va fi 0.318 pentru k=63 va fi 0.936 pentru k=64 va fi 0.554 pentru k=65 va fi 0.172 Deci locaiile vor fi respectiv 700, 318, 936, 554, 172. 2. Cu verificarea liniar se obine aceast secven:

149

23 4 15 17 28 31 10 88

23 4 15 17 28 59 31 10 88

Cu verificare patratic cu funcia h(k,i)=((k mod 11)+i+3i2) mod 11) se obine:

23

23 4

10

31 10

31 10

150

23

23 4

23 4 28

23 17 4 28 15 31 10

88 23 17 4 28 15 31 10

88 23 17 4 28 59 15 31 10

10

15 31 10

15 31 10

Rezolvri la capitolul 10.


35 9 18 44 53 18 23 27 18 16 17 1 2 18 7 8 18 4 5 18 10 11 13 14 19 21 25 26 28 29 31 33 36 37 39 40 42 43 30 38 41 18 47 50 18 45 46 48 49 51 52 57 58 62 63 65 66 68 69 56 18 61 64 67 70

12 15 18

54 55 71 72

Pentru a insera cheia 60:


151

- rdcina e neplin - al doilea fiu al ei este tot neplin - al treilea fiu al acestuia din urm este plin deci va trebui s fie rupt: Zona care ne intereseaz va arta aa:
44 38 41 47 50 53 54 56 61 67 70

54 55

57 58

62 63

Pe calea ngroat se va face inserarea. Dup inserare aceeai zon va arta:


44 38 41 47 50 53 54 56 61 67 70

54 55

57 58 60

62 63

BIBLIOGRAFIE: [1] CORMEN T.H, LEISERSON C., RIVEST R. INTRODUCERE IN ALGORMI AGORA,CLUJ 1999 [2] TOMESCU I.D. DATA STRUCTURES ED.UNlV BUCURESTI [3] IACOB P. BAZE SI STRUCTRI DE DATE notie de curs UNIV BRASOV 1998

152