11.07.2015 Views

ocu Heap-uri BINOMIALE - GInfo

ocu Heap-uri BINOMIALE - GInfo

ocu Heap-uri BINOMIALE - GInfo

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Din nou, la grãmadã...<strong>GInfo</strong> nr. 14/7 - noiembrie 200428f<strong>ocu</strong>s<strong>Heap</strong>-<strong>uri</strong> <strong>BINOMIALE</strong>Mihai ScorþaruÎn cadrul acestui articol vom prezenta o nouã structurã de date derivatã dinheap-<strong>uri</strong>le clasice (binare). Principalul avanta al acestei struct<strong>uri</strong> îl reprezintãposibilitatea de a uni douã astfel de struct<strong>uri</strong> într-un timp foarte scurt. Existãmai multe alte avantaje pe care le veþi putea descoperi în paginile acestuiarticol.Un heap binomial este o colecþie dearbori binomiali. Vom începe prezentareaheap-<strong>uri</strong>lor binomiale cudescrierea arborilor binomiali; vomprezenta apoi heap-<strong>uri</strong>le binomiale,precum ºi operaþiile care pot fi efectuateasupra acestora.Arbori binomialiÎn cadrul acestei secþiuni vom definiarborii binomiali ºi vom prezenta ilustraconceptul de arbore binomial.DefiniþieArborii binomiali suntdefiniþi recursiv astfel:arborele binomial deordin 0 (B 0) constã într-unsingur nod; arborelebinomial de ordink (B k) este formatFigura 1: DefiniţiaarboreluibinomialFigura 2: Arbori binomialidin doi arbori binomiali de ordin k - 1(B k-1) care sunt legaþi: rãdãcina unuiadintre cei doi arbori este fiul cel maidin stânga (sau cel mai din dreapta) arãdãcinii celuilalt arbore (vezi figura1 pentru ilustrarea definiþiei).În figura 2 sunt prezentaþi arboriibinomiali B 0, B 1, B 2, B 3ºi B 4.Se poate spune cã un arbore binomialde ordin k este format dinrãdãcinã ºi k arbori binomial alecãror ordine sunt 0, 1, 2, ..., k - 1.Proprietãþile arborilorbinomialiVom prezenta în continuare principaleleproprietãþi ale arborilor binomiali.Vom începe cu o teoremã careindicã numãrul nod<strong>uri</strong>lor unui arborebinomial.TeoremãUn arbore binomial de ordink conþine 2 k nod<strong>uri</strong>.DemonstraþieDeºi intuitiv deducem destul de uºorcã teorema este adevãratã (pentru fiecareordin numãrul nod<strong>uri</strong>lor se dubleazãfaþã de ordinul imediat inferior),vom demonstra afirmaþie folosindmetoda inducþiei matematice.Vom nota numãrul nod<strong>uri</strong>lorunui arbore binomial de ordin k prinn kºi vom încerca sã demonstrãm cãavem întotdeauna n k= 2 k .Pentru k = 0, avem arborele binomialde ordin 0 care este formatdintr-un singur nod, deci n 0= 1 = 2 0 .Aºadar, ipoteza de inducþie este adevãratã.Presupunem acum cã pentru oricevaloare k < l arborele binomial deordin k conþine n k= 2 k nod<strong>uri</strong> ºi vomîncerca sã demonstrãm cã arborelebinomial de ordin l conþine n l= 2 lnod<strong>uri</strong>.Aºa cum am arãtat anterior unarbore binomial de ordin l este formatdin rãdãcinã ºi l arbori binomialale cãror ordine sunt 0, 1, 2, ..., l - 1.Ca urmare numãrul nod<strong>uri</strong>lor arboreluibinomial de ordine l este:n l= 1 + n 0+ n 1+ ... + n l-1.Conform ipotezei de inducþieºtim cã pentru orice k < lavem n k= 2 k . Ca urmare, obþinem:n l= 1 + 2 0 + 2 1 + ... + 2 l-1 .Folosind formula matematicã a 0+ a 1 + ... + a n = (a n+1 - 1) / (a - 1), obþinem:n l= 1 + (2 l - 1) / (2 - 1)n l= 1 + (2 l - 1)n l= 2 lAºadar, am demonstrat cã dimensiunilearborilor binomiali (numãrul


doilea element al listei de arbori binomiali.ReuniuneaOperaþia de reuniune a douã heap<strong>uri</strong>binomiale este asemãnãtoare cuadunarea binarã a douã numere. Practic,se unesc la fiecare pas arbori binomialicare au acelaºi grad, obþinându-seun arbore binomial al cãruigrad este imediat superior.Unirea a doi arbori binomialiPentru reuniunea a douã heap-<strong>uri</strong>binomiale avem nevoie de reuniuneaa doi arbori binomiali.Practic, din doi arbori binomialide grad n, vom obþine un arbore binomialde grad n + 1.Operaþia este foarte simplã ºiconstã în legarea unui arbore de rãdãcinaceluilalt. Astfel, rãdãcina unuiarbore va deveni ultimul fiu al rãdãciniiceluilalt arbore.Se observã imediat cã se pãstreazãtoate proprietãþile arborilor binomial,dar trebuie sã ne asigurãm cã seva pãstra ºi proprietatea de heap. Pentruaceasta este suficient sã ne asigurãmcã cheia rãdãcini noului arboreeste întotdeauna cea mai micã dintrecheile rãdãcinilor celor doi arbori.De fapt, va trebui sã decidem înaintecare arbore va deveni subarbore alceluilalt.Dupã ce a fost luatã o decizie înacest sens (pe baza comparãrii cheilor)poate fi folosit urmãtorul subalgoritm:subalgoritm UneșteArbori(y, z)y.părinte ← zy.următor ← z.primul_fiuz.primul_fiu ← yz.grad ← z.grad + 1sfârșit subalgoritmAstfel, nodul y devine primul fiual nodului z în timp constant, deoarecefiecare dintre cele patru operaþiiefectuate necesitã un timp constantpentru a fi executatã.Algoritmul de reuniuneVom prezenta în cele ce urmeazã algoritmulcare poate fi utilizat pentrua reuni douã heap<strong>uri</strong>binomiale.Vom prezentaversiunea în pseudocoda unuialgoritm carerealizeazã aceastãoperaþie. Existãpatru caz<strong>uri</strong> caretrebuie tratate,fiecare fiind ilustratîn figura 5.Pe lângã subalgoritmulde unire adoi arbori binomiali,mai este utilizatun subalgoritmcare realizeazã interclasarealistelorarborilor din celedouã heap-<strong>uri</strong> binomiale,astfel încâtarborii sã fie ordonaþicrescãtor înfuncþie de gradelelor. Subalgoritmulare ca parametrireferinþe spre vârf<strong>uri</strong>lelistelor de arboridin cele douãheap-<strong>uri</strong> ºi returneazão referinþãspre vârful noii liste.Acest subalgoritmeste foarte simplu,motiv pentru carenu îl mai prezentãmaici.Figura 5: Exemplu pentru reuniunea a două heap-<strong>uri</strong> binomialealgoritm Reuniune(H1, H2)H.vârf ← Interclasare(H1, H2)dacă H.vârf = nil atuncireturnează Hsfârșit dacăpredecesor ← nilx ← H.vârfsuccesor ← x.următorcât timp succesor ≠ nilexecutădacă x.grad ≠ succesor.grad sau (succesor.următor ≠ nil șisuccesor.următor.grad = x.grad)atunci// caz<strong>uri</strong>le 1 ºi 2anterior ← xx ← succesoraltfeldacă x.cheie ≤succesor.cheie atunci// cazul 3x.următor ←succesor.următorUneșteArbori(succesor, x)altfel// cazul 4dacă predecesor =nil atunciH.vârf ← succesoraltfel31f<strong>ocu</strong>s<strong>GInfo</strong> nr. 14/7 - noiembrie 2004


<strong>GInfo</strong> nr. 14/7 - noiembrie 200432f<strong>ocu</strong>spredecesor.următor← succesorsfârșit dacăUneșteArbori(x,succesor)x ← succesorsfârșit dacăsfârșit dacăsuccesor ← x.următorsfârșit cât timpreturnează Hsfârșit algoritmFigura 6: Primul caz pentru reuniuneaa două heap-<strong>uri</strong> binomialeDescrierea algoritmuluiAlgoritmul de reuniune a douã heap<strong>uri</strong>binomiale constã în douã faze.Prima fazã constã din apelul subalgoritmuluicare interclaseazã listelede arbori ale celor douã heap-<strong>uri</strong> într-osingurã listã înlãnþuitã care esteordonatã crescãtor în funcþie de gradelearborilor binomiali care o formeazã.Pot exista cel mult doi arbori (datnu mai mulþi!) care sã aibã un anumitgrad. În cea de-a doua fazã sunt uniþiarborii care au grade egale. Datoritãfaptului cã lista este ordonatã în funcþiede gradele arborilor, aceastã operaþiepoate fi executatã foarte repede.Figura 8: Al treilea caz pentru reuniuneaa două heap-<strong>uri</strong> binomialeAlgoritmul continuã cu pãstrareaunui referinþe spre primul element allistei create. În cazul în care lista nuare nici un element, heap-ul rezultateste vid ºi algoritmul se opreºte.Dacã algoritmul continuã, ºtimcu siguranþã cã avem cel puþin unarbore. Vom pãstra pentru a simplificaoperaþiile câze un pointer spreelementele vecine elementului curent(predecesorul ºi succesorul).La început existã cel mult doi arboribinomiali care au un anumit graddat deoarece am avut douã heap-<strong>uri</strong>binomiale care (conform definiþiei)conþineau un singur arbore de unanumit grad dat.Mai mult, operaþia de interclasarea arborilor ne asigurã cã cei doi arborise aflã pe poziþii consecutive înlista obþinutã dupã interclasare.Totuºi, în timpul execuþiei putemavea pânã la trei arbori care au unanumit grad dat. Vom vedea la momentuloportun cum poate apãrea oastfel de situaþie.La fiecare iteraþie astruct<strong>uri</strong>i repetitivevom decide dacã vomuni arborele curent ºisuccesorul sãu în funcþiede gradele lor ºi,eventual, în funcþie de gradularborelui care se aflã la douã poziþiidupã succesorul arborelui curent.Pe parcursul executãrii acestui cicluvom fi sig<strong>uri</strong> întotdeauna cã referinþelespre arborele curent ºi spresuccesorul acestuia nu sunt nule.În continuare vom identifica celepatru caz<strong>uri</strong> care potapãrea în timpul executãriiciclului.Primul caz trateazãsituaþia în care arborelecurent are gradul diferit de gradulsuccesorului sãu. În aceastã situaþiecei doi arbori nu sunt uniþi ºi se trecela urmãtorul arbore din listã. Acestcaz este ilustrat în figura6.Cel de-al doileacaz trateazã situaþia încare avem trei arboride acelaºi grad aflaþi pepoziþii consecutive. ªiîn acest caz vom trece pur ºi simplula arborele urmãtor, urmând ca la urmãtorulpas cei doiarbori care urmeazãdupã arborele curentsã fie uniþi. O reprezentarea acestui cazeste prezentatã în figura7.Celelalte douã caz<strong>uri</strong> apar în situaþiaîn care arborele curent ºi succesorulsãu au acelaºi grad. Este demnde observat faptul cã dupã cazul aldoilea va apãrea cu siguranþã unuldintre aceste caz<strong>uri</strong>. În aceste caz<strong>uri</strong>cei doi arbori trebuie uniþi, diferenþadintre ele fiind datã de relaþia de ordinedintre cheile din rãdãcinile celordoi arbori.În cazul al treilea, cheia rãdãciniiarborelui curent este mai micã sauegalã cu cheia rãdãcinii succesorului.În aceastã situaþie, dupã unirea arborilor,succesorul este eliminat din listã.Figura 8 descrie acest al treilea caz.În cazul al patrulea, cheia rãdãciniiarborelui curent este mai mare decâtcheia rãdãcinii succesorului. Înaceastã situaþie, dupã unirea arborilor,arborele curent este eliminat dinlistã. Putem avea douã situaþii pentruaceastã eliminare: arborele curent poatesau nu fi primul în lista arborilor.Cazul este prezentat în figura 9.Dacã ne-am aflat în al treilea saual patrulea caz, am obþinut un arborebinomial nou care este acum arborelecurent. Înainte de efectuarea acesteioperaþii, lista mai putea conþine pânãla doi arbori de acest grad.Figura 7: Al doilea caz pentru reuniuneaa două heap-<strong>uri</strong> binomialeAºadar, în acest moment ar puteaurma nici unul, unul sau doi arboricu acelaºi grad ca ºi arborele curent.Dacã nu urmeazã nici unu alt arborede acelaºi grad, atunci la pasulurmãtor ne vom afla în primul caz;dacã urmeazã un singur arbore deacelaºi grad, atunci la pasul urmãtorne vom afla în al treilea sau al patruleacaz; în sfârºit, dacã urmeazã doiarbori de acelaºi grad, atunci la pasulurmãtor ne vom afla în al doilea caz.Figura 9: Al patrulea caz pentru reuniuneaa două heap-<strong>uri</strong> binomialeOrdinul de complexitate al acestuialgoritm de reuniune a douãheap-<strong>uri</strong> binomiale este O(log n),unde n este numãrul total de nod<strong>uri</strong>din cele douã heap-<strong>uri</strong>.


Operaþia de reuniune este ceamai importantã dintre operaþiile cuheap-<strong>uri</strong> binomiale, deoarece atâtinserarea, cât ºi ºtergerea, se bazeazãpe ea.InserareaPentru a adãuga un element într-unheap binomial H este suficient sãcreãm un nou heap binomial H' ºi sãreunim heap-<strong>uri</strong>le H ºi H'.Crearea heap-ului binomial necesitãun timp constant, iar interclasareaun timp logaritmic.Versiunea în pseudocod a algoritmuluide inserare a unui elementîntr-un heap binomial este urmãtoarea:algoritm Inserare(H, x)x.părinte ← nilx.primul_fiu ← nilx.următor ← nilx.grad ← 0H'.vârf ← xH ← Reuniune(H, H')sfârșit algoritmªtergerea minimuluiPentru a ºterge elementul minim alunui heap binomial, vom identificamai întâi arborele în a cãrui rãdãcinãeste pãstrat acest element.Vom elimina din lista arborilorheap-ului binomial arborele identificatºi apoi vom construi un altheap binomial care va conþine arboriiai cãror rãdãcini au fost fiii rãdãciniicare trebuie eliminatã.Dupã interclasarea celor douãheap-<strong>uri</strong> vom obþine un heap binomialdin care am eliminat elementulminim.Versiunea în pseudocod a algoritmuluidescris este prezentatã încontinuare:algoritm EliminăMinim(H)x ← DeterminăMinim(H)eliminã x din Hinverseazã ordinea arborilordin lista fiilor lui xH'.vârf ← x.primul_fiuH ← Reuniune(H, H')returnează xsfârșit algoritmPaºii acestui algoritmsunt prezentaþiîn figura 10. Pentruexemplificare am folositun heap binomialformat trei arboriale cãror gradesunt 1, 2 ºi 4.La primul pasvom identifica arborelea cãrui rãdãcinãconþine cea mai micãcheie. Cheia minimãeste 1, deci vom eliminadin heap arborelede grad 4.La al doilea pasvom inversa ordineafiilor rãdãcinii arboreluieliminat pentrua putea crea un heapbinomial ai cãrui arborisã fie în ordineacorectã. Noua listãreprezintã un heapbinomial care conþine arbori binomialide gradele 0, 1, 2 ºi 3.La cel de-al treilea pas vom realizareuniunea celor douã heap-<strong>uri</strong> ºivom obþine un heap binomial cu treiarbori ale cãror grade sunt 0, 2 ºi 4.Se poate observa în imagine cãstructura heap-ului s-a schimbat destulde mult dupã ce am eliminat unelement al acestuia.ConcluziiAm prezentat în cadrul acestui articolo structurã de date care poate fifolositoare în diferite caz<strong>uri</strong>.Cea mai frecventã situaþie în caresunt utilizate aceste heap-<strong>uri</strong> binomialeapare atunci când avem maimulte cozi de prioritãþi pe despre careºtim cã, la un moment dat, vortrebui sã formeze o singurã coadã deprioritãþi (evident, cu respectareaprioritãþilor).Am vãzut cã un heap binomialeste o coadã de prioritãþi care nu estereprezentatã sub forma unui arbore,ci sub forma unei colecþii de arbori,iar fiecare dintre aceºti arbori trebuiesã respecte structura de heap. O colecþiede arbori este numitã în majoritateacaz<strong>uri</strong>lor pãdure.Figura 10: Exemplu pentru eliminarea elementuluiminim dintr-un heap binomialFiecare dintre arborii care formeazãun heap binomial are o structurãspecialã; aceºti arbori sunt denumiþiarbori binomiali, iar aceastã denumireprovine de la faptul cã pe unnivel al unui astfel de arbore se aflãun numãr de nod<strong>uri</strong> egal cu coeficientulbinomial corespunzãtor niveluluirespectiv.Arborii binomiali sunt arbori generalipentru care nu se impune nicio restricþie cu privire la gradul maximal unui nod (gradul unui nod nueste fixat la o anumitã valoare saulimitat la un interval de valori).O caracteristicã remarcabilã aheap-<strong>uri</strong>lor binomiale este reprezentatãde faptul cã operaþia de reuniuneeste similarã adunãrii binare. Pãdureade arbori binomiali care formeazã unheap binomial poate fi asemuitã cumulþimea de biþi care formeazãreprezentarea binarã a unui numãrnatural.Mai mult, reuniunea a douãheap-<strong>uri</strong> binomiale se realizeazã întromanierã foarte asemãnãtoareadunãrii binare. Arborii binomialisunt uniþi într-o manierã similarãcombinãrii biþilor atunci când suntadunate douã numere binare.33f<strong>ocu</strong>s<strong>GInfo</strong> nr. 14/7 - noiembrie 2004

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!