Você está na página 1de 93
-e— See ee ei eee see Ai ay ce? RODICA CETERCHI Y ATEGR STRUCTURI DE DATE $I ALGORITMI ASPECIE MATEMATICE $1 APLICATII Parteal STRUCTURI DE DATE ELEMENTARE sis’ editura universititii din bucuresti* Refereni stiinfifici Prof.dr. George GEORGESCU Prof.dr, Alexandru MATEESCU Prof.dr. loan TOMESCU © Eakura Universitat dia Bucuresti 0s, Panduri 90-92, Bucuresti - 76235; ‘Tel/Fax: 410.23.84 E-mail: editura@unibuc.ro Internet: www.editura.unibue.ro Desericrem CO? a Dibiiotceii Naf CETERCHI, RO) licatii / Rodi Universitaqi din Bucuresti, p.m. Bibliog ISBN 973. Diliotecs Ge Matematica ATER DICA Lem Rominiei de date: aspecte matematice gi es Cet: 5594-7 001 Bucuresti, Editurs Cuprins Introducere in studiul structurilor de date 1. Structun lineare 1. Structur: lineare in alocare statics 2, Structuri lineare in alocare dinamica. Liste simple inlanjuite 3. Alte tipuri de liste, Aplicapi ale listelor ink 4. Structun lineare cu restrichi la intrareliegire: tive $i 602i I. Structuri arborescente 1. Anbori 2. Arbori binan 3. Arbori binan - similaritate gi echivalent 4. Atbori binari de cdutare 5. Atbori binari de cdutare echibraji AVL. interne 1 Sortarea prin insertie directa 2. Sortarea prin sclectie directa Soctarea prin interschimbare dir GD Sorarea prin insertie cu micsorarea incrementuiut {sertarea Shell) 5. Sectarea prin ie folosing struct i aiboreseenie (ortarea ca ansamble} & Sonarea prin interschimbare folosind parti (QuickSor) D Interclasarea a doui siruri ordonate, Sortarea prin interelasare._, IV, Arbor’ binari strict Aplicaii "Arbor binari stricti, Definitie Propriety 2. Limita inferioara a algoritmilor de sortare bazati pe comparatiiintre chei 3. Arbon binari strcti cu ponder. Algoritmul lui Huffinann 4. Aplicafiita codificare. Coduri Huffman, - Interclasarea optimald a mai multor sinari Teste grils Bibliografie 39 11 143 197 161 eS eS =o —& j— Lucrarea te foga conine material prezenat tn prima parte a curs de *Sinuctur! de date Wt algorioni® pe care autoerea fl fine la Facultatea de Mfatomoned a Universttapi din Bucures in cadrul Colegidut de Infarmatic8 $1 arnemeh Maiematica-tnformotica, Ea se adreseaxd tn primd rind cceitor Miateit dar mu mune for, lwcrarea putind fi id tuurar celor core doves thy anbngdfcased sow 58-9 istemarizeze cxmostinfele din domrentu sven ia partes citonite! 10 poxede cunostinge generate de snyurmanca in special progromare (metode de programare, noitunea de Ngorum gi cea de complestite)s{ewnoaserea cel pina limbajulai Pascal. Vihource mufpunegte pe aceastd cale colaborotorilor pe care 1a avul fo ngulaniter eare sou adur conmbusa la buna desfastare curs falwmejee fe arenence acetor student at atu If seria 2000-2001 care av aoe ie a cchoredarctarca Iwordot, precio si Editurit Untvervtent din JRucirest perte sprijined acurdat in vederea publiedrt ———————_———— Introducere in studiul structurilor de date Structurile de date au aptirut ca si mater distincta in informatica in curriculums ACM incd din 1968. O formula semaificativi care le plsseazi in contextul programérii este dati de titlul unei celebre c&rti a lui N. Wirth "Algorithms + Date Structures = Programs", Intr-adevr, couafia Yalgoritmi + structuri de date = programe” pune in evident faptul ch orice problema de programare presupune, pe ling gisirea unvia sou mai multor algoritmi, alegerea unei structuri de date adecvate pentnt menjinerea detelor problem. lar de multe ori, gisirea algoritmului gia structuni adecvate merg mand tn man, dup cum vom vedes. Mulfimile de cate pe care le manipulcacé programele sunt in general colectit finite, de date omogene, adict date de acelssi tip. Tipal unui element 21 mulfimii poate fi foarte complex, dar, In general, un clement va fi identificat print-o valoare unica numita chete, O structur de date mentine o asemenes colectie finité into muljims cu o anumitt forganizare internd - structura. Organizarea intend a datelor va influenia, fin acelasi timp depinde de operariile ce trebuie efectuate pe elementele Tnultimii, de aceea orice siructurd de date vine insotita de v lista de Speratié ce se efectuea:h pe ea side algoritmi care implementeazi aceste operat ‘Dam tn continuare 0 list’ a operatilor de bari pe structuri de date, impreuni cu o descriere ¢ ler. ‘Traversarea unei siructuri este operajia care acceseaza fiecare element 0 singura data in vederea yruvestviis pentr prosesarea unui element in cadrul traversarii se mai foloscsie denumirea de visitare a clementului respectiv. ‘Cuarea este operat care cauta un clement eu eheie dat into siructurd $i se terming cu seu rd succes Ea consti dintr-o treversare, eventual incompleti, a siructuri, in care vizitarea fiecirui clement rovine Ta a+] compara cu cel cdutat, Daca elementul chutat existé Tn structuri, nu se mai continua traversarea $i locul primei spariji este retumat, cdutares Tncheindu-se cu succes. Daca elemental cfiutat nu existh fn structart Iraversarea va tebui s fie completa pentru a putea decide avcasta, cchularea se va termina fir succes ‘Tnserarea nui nou clement int-o structurd dati este operatia care adauph un element nou, de scelasi tip, unci colectii nite de clement teprezentate structurat, "AdAugarea” se face astfelincit noua structurd, cu un clement in plus, sé fie de acelasi tip cu structurainifiala Stergerea sau extragerea unui element dinto structurd ese ‘operajia inversi inscrarii, Ea "scoate” un element dint-o mulime structurata dats, refaicind structua inifiald pe elementele rimase Elementul exiras poate folosit pentra diverse procesiri, print care si alle operatii pe structur. Exist doud aspecte ale acetei operat ce ‘webuie luate in considerare: aspectul de “extragere”, cind accental cade Pe clementul extras din structurd, si aspectul de stergere, cind accentul ‘ads pe clementeie rémase si pe refacerea tipulu initial de structurd pe cle. Oricum am denumi operatia, trebuie s4 ne ocupim de amibele aspecte de mai sus. Operate de inserare si stergere sunt foarte importante peatna eprezeniarea maltimilor care au un earacter ainamic ia timp, muljimi care Iji schimbs fEecvert componenja. In probiemicle care manipulears muljimi dinamice, webuie 3 le reprezentim pe acestea cu ajutorul unor structuri de date pe care opcratile de insczare §i slergere si se efectueze rapid fi necostisitor. Atit inserarea edt st stergetea unui element sunt Precedate in general de opeiagii de cautare a locului inserini in (respectiv ‘ergerii din) structurd, deci performanjele acestor opetajii depind de peeformanja operajici de cautare, La rindul ei, cdularen depinde de operajia de uaversar. Aceste patru tipuri de operatii de baz’ pentru menfinerea tmuliimitor dinamice, sunt insojite si de operafii auxiliare (dar absolut necesare), precum initializarea unei structur si crearea unei structuri fn ‘general, crearea unei siructuri de un anume tip se fare tm dos pag (1) inipalzarea structurii cu structura vidi (2) un ciciu tepetitiv de lungime variabila in care (2) seia cate un element dintr-ur: fisier de intrare; (b) pentru fiecare asemenca element se apeleazi o proceduri ce implementeaza operatia de inserare Pentru toate structurile de date discutate in aceasté lucrare vom Codifica modul in care se reprezintA stractura vidi, iar operatile de creare Vor fi ca mai sus, bazate pe inifializri, urmate de inserdri repetate Structunle clemeniare de date discutate in primele cout capitole, ele lincare si cele arborescente, vor avea implemestate pe ele toate operatiile de mai sus, Combinarea a doui structuri este 0 alti operaiie important. Ea Produce din dou structuri de acelagi tip o alta, de acelasi tip, ce contine Glementele reunite ale primelor dou. Vom vedea in capitolul Il sectiunea 7 un prim exemply de operatie de combinare, interclasarea a dou siruri ordonate, In particular, gi inserarea poate fi privitd ca gt caz particular de combinare, una din structurile ce sunt date de intrare pentrw combinare avind un singur element Sortarea ese 0 alts operatie extrem de imporianti pentru multe aplicajii, Ea consti in ordonares totalé a clomentelor uneimulfimi Trebuie trata separat cazul multimilor statice de al eelor dinami Pentru cazul mulkimilor seatice (acele multimi care nu-si schimb componcnia in timp) ne putem pune problema sortart elementelot ¢i 0 Singur dat. In plus, ne putem pune problema sortéri m sins, adic& "pe lec", folosind accteasi locatii ca gi datele de intrare (mulfimea wnesortatd, sisi mulpines nw-si schimbi componenja. Capitolul Ill se ocupa dé studiul algoritmailor de sortare in sit si bazafi pe comparafil intre che Daca avem de 2 face cu mulfimi dinamice pe care se pune si problema sortini, atunci atunci vom luca cu tipun speciale de structun, in care releple Totre chei joacd si cle un rol in organizarea structuri Menjioném structure lineare ordonate. arborii binari de cautate, arboris paral ordonap, $.., structuri pe care vom avea algoritmi specifies de inserare si stergere, $i operaii ce pot produce la cerere o versiune sortath a multimi O alta operatie importamtd pe structuri este operatia de extra minmulu’ (espectiv maximului) dinte-9 etructurd. Ea poate fi privitd ca tun caz particular de extragere, dintr-o structuri ordorats, deci are turd fi cu sortares. Vom vodea ci existA structusi care opimizeaza performania acestei opersii, ficénd extragcrea propriu-zisa in timp O/1) i rofvecres structuril pe daicle iauuse 2 mp Ullogyt): este vorba despre sructura de ansamblu studiacd In eapitolul Ili, secltunea 5 {in cele ce urmeaz’ vom infelege prin structuré de date de un ‘snume tip nu numei organizarea intemA a datelor s) modul de acces la cle, ei gi gestionarea structurit, adicd operauule care se extcula pe Fespectiva structurd, cu aigoritmi specifici ce implementeazé aceste eperajit. De exemplu, un arbore binar de ciutare va fi stryetura aracterzati nu numai prin definifia de 1a incoputul scefiunii 4a apitolului I, ci si prin algoritmii specifici de cautace, inserare gi gtergere Prezeniafi acolo. Analog, structurile de stiva gi de coada prezentate in cepitolul I seetiunea 4 sunt structuri lineare cu operatir specifice de inserare si stergere, si pe cate mu vom face waversan sf edutan (desi folosind eveatual in mod repetat operayia de stergere) Structurle de date se impart in dous mari categonn: cele /imeare, pe care le vom prezeata in eapitolul I, 51 cele nelineare ~ arborit si grafurile, Dintre acestea din urma prezentam pe scurt doar arbosi, in Sapitolul I, al componentelor. Caracteristica (b) din defiits de mai sus se relect& asupra modulut in care se creazi cu Gatcle de tip vector, Pentru variabila 4 de mai sus, caleulatorul mentine adress primului element al lui 4, numié si adiesa de baz8, si.0 natim Bure(dy. Vom nota Ioc(t{k = adresa clementului fk) Pentnt accetarea componentel 4/k/ se caleuleazd adress ei eu formula LoctAfk} = Baso() ~ w/t-i) acd / este prinul indice al lui, sau, penta 4/1... GB/eu formula Locéa{i}) ~ Base{A) + wfk-LB) Penuu vice valuate a indivclul 4, tinpul de saleul al Corulsi cate acelagi, Mai mult, dat fiind un indice 4 un program poate accosa A/&/ fara a inspecta celelalte componente ale lui 4. Vor spane ef timpul de acces la oricatce components 4/4] ¢ avantaje ale structuri Sa presupuncm acum ci avem 1 elemente depuse in 1 locati suceesive ale unui vector ca mai sus. Evident, # trebuie si fie mai mi deat Max. Presupunem de asemenca cA ele ocupi locafii indexate de la 7 laa, S& vedem cum se implementeazs operapile de traversare, ineerare, stergere pi clutare pe o asemenes siru te unul din marile 16 ft), 8 aossta Trayersaxca unei structuri lineare in slocare static Operasia de traversare este extrem de sunplii jy: strscturite lineare. procedure Traversare(A, I, 1) k= 1, Gina while k no (test pentru nedepdsirea structuri} viriteaok AM]; k= kl; [trecem la componenta urmiteare} endwhile cendproe Evident, putem folosi avantajele instrucfiunii for gi atunci procedura de traversare devine procedure Traversare (A, 1.1) fori 1 ton do vizitear’ Ali]; endfor cedproe Inserarea si stergerea unui clement al unet structuri fineare Penta operajia de inserare @ unui nou clement, Elem ia stuctars menginutd in sl{/ .. n) webuie si aver. in primul rand spafis, adict n< Mat. Dacd condifia ¢ indeplinité, avem Max > 1 Jocafii libere in care putem insera tot atitea clemente, Inserarca. Ja_sfirgimuls structurii, pe Composenta -/gmi pune pfobleme? ar dack vrem $& insertim thtr-o pociie kin, vector aflath inte sm abun trebui si mutim toare Comiponebtele de la k la’ cltéb-Tocatie'ta dreaita pentru a face lor noului element procedure Insert(A, 1.n, k, Elem) {insereazi Tr structure lineard Al ..n}, pe pozitia , valoarea iui Elem} A pe tind elementele de la Afn} pina la Afk] cite 0 Tocatic ta dreapta) while i> k do Ait) = Ali ini ndwhile {inserarea propriu-zisi} ATK] = Elem [eregle dimensiunea steuctariiy nent endproc —————— Dick, wem si facem inserrea cx procedura de.mal sus, atuncl sg presupne e4, tosinte 42 apelul proeedunit am feat ummdioarele, dou Prerafil sii -necesare;(1) un test peniu a verifics dact' mal exsté Peat bere: n 1. Din now, decd cxtrgeree #28 Fiat nama fa eapttal din dreapts, adic& daca s-ar extrage dear An] ea ny tr pune probleme. DacS se extrage ins de pe o componest® K oareoets, a eet “reorganizarea’ elementelor rimase implict din nou un sir de ‘nutri astfel inet ele sf rAménd contigue procedure Detete(A, 1, X) {exuage in X valoatea Af] st reface vectorull {extragerea propriu-ziss} X= Ak), {refacerea siructuri for i=kton-! do Ati) > ALTE endfor {scade dimensiunea structurii} need: endproc sector} Dacd facem. stergerea..cu. procedura.de..mai-sus,atunci. puter presupane ef, inane de apelul ci, ame ficut wrmitoarale douk oper th ae vesare:(1) am veriica 8 suuctura arc cel puta xm element, >] ¢ wos pergerea are sens, 2) im Wenical CHF este o poe valde dey adic J Sk Sn. pviperal, operaile de inserare/stergere intro stucturh dats, fe carl de fafd fntr-o structurd lineard in alocare staticd, se fae pe pozitii aricen in interforul structuri, poripi care webule chutat» i plste cu Sjutor unor traversiri, eventual incomplete, guveruste deo ems conditie, in functic de natura problemei. Cu alte cuvinte, in multe probleme reale, pozifia # pentru iaserac/pergere na este cunoseut Ginainte, deci mu va fi tansmisa ca perametru, ci uchuie gasits, cu o traversare guvematt de o condifie specifica problemei si, evident, de conditia de nedepisire a stuctunt “Traversarea se poate face pe acest tip de structura linearé in ambele sersuri: de la stinga la dreapta, adic& in sensul cresedtor al indicilor sau de la dreapta ia stinga, adicd in sensul descresc&tor al indicitor. Traversarea de la stings la dreapta se face in felul urmitor it ‘while (i<=n) and {conditia de inserare/stergere nu c indeplinita) do ime endwhile ‘Traversarea de la dreapta la stings se face in folul urmitor i=n while ) and (condi de inserare’stergere nu c indeplinita} do ied endwhile ‘Ambele tipuri de waversiri sunt governate de: 0 condijie de nedepasire a ‘ructuni, apoi de o condifie a cdrei formulare depinde de natura problemei, In functic de aceasté a doua conéifie, la terminarea traversérii ptem decide dacé locul inserdri sau stergeri 2 fost gst i, daca da, care este acesta, si scriem in continuare codul care implementeazi inserarea sau stergerea proprivezisé, cu mutdnile aferente, si cu modificarea dimensiunis Sa observim c& operajiile de inserare si stergere dinte-un vector sunt ccostisitoare in termeni de mutéri de componente Putem si evaluim rnumérul de mutani M Fie py = probabilitatea evenimentului de « insera 0 valoare noud pe componenta i, i €/1..nj. La inserarea pe pozitia‘ trebuie sé mutam n-f= 1 compotente Numiral mediu de mutin la inserare va fi deci Mm ¥ pn-ed aca inserarea se face cu probabilitifi egale pe orice pezitie, died py ~ is Analog, fie p) = probabilitatea evenmmentului de a sterge componenta Afi), i € [l..n). La stergerea lui fi] twebuie si muti nt componente. Numérul mediu de muti la stergere va fi deci Mod pln) Daca stergem cu probabilitatt gale orice component, atunci: Ly ae) med cents tn » Observism e&, atit la ing Ia slergere trebuie si mutam in medic cam jurniiate din componente, 22. Existi gi cazul cel mai nefavordbil, cand inserim sau glergem prima component’, deci facem humarul maxim de mutari O/n). Din acest motiv, structura de vector nu este recomandata peatra muljimi cv caracicr dinamic, multimi care-§i schimiba freevent components prin inserari gi slergeri Cautarea intr-o structar’ linea re seeventt ajie elementar’ pe orice structurd cle date este operapia de oh e, Val. In cazal structunlor bneare avem ccButarea lineara care este in e! struciuri, in care iaitarea revine la a compra elemental vizitat cu valoarea cAutata. Za se termini cu succes dacd am gasit valorea Val si refurneazi indicele pe eave am gAsit-o, 3i fri succes daca tenmind de sraveroct ciructura Pied e& gisansel pe Pil {cautd linear valoarea Vai in A[l..n} si returneaza Loz = 0 dac& nu 0 Jeyte, io valoare Loc ¢ [!_-n] dact 0 giseste pe componenta A{Loc}} Loe: = 0 while (<> n)and (Ali isl endwi ificn then Loc =i endif ‘endpros (SearchLin} = Val) do so t Observam ci cichil repetitiv while in care se face traversarea eventual iacompleta a structunt este guvernat de dou’ conditii: conditia de nedepisire a structurii, / < m si condifia de a nu fi gAsit Inc pe Val, AliJeVel. Se p conditia de nedepigire # structurii, reducind in felul acesta numirul de comparatii Ia jumBtate, prin tehnica componente: marca). Se adaugh structurii o locatie in plus le capital unde se termind traversarea, deci pe componenta n'-2 daca traversim de fa stanga la dreapta ca mai sus, (Dac traversiim de la dreapia la sténge se adaugi o component 4/0).) antl Max A (Le Tal TO) A fal Fig. 1.1.1, Componente marcaj pentru raversarea cu cautare, Se pune valoarea cdutatd pe componenta marca). In felul acesta c&utares Se va termina intoldeauna cu succes, veloarea Vai fiind gisiti pe componenia marca} dee mu apare in’ restul structurii. Gisirea ei pe componenta marcaj codified situatia “clutare fara succes” procedure SearchLinl (A, I, n, Val, Loc) A{n+1]:= Val {introducem Val pe componenta mare Loc: = 1 while AfLoe] © Val do Loe: “Loe +1 endwh ifLoc=n41 then ‘Clutare fird succes” else "Am pisit pe componenta Loc" endproc, {Searchin} Acceasi tehnict a componentei mareaj poate fi folosté si la traversirile flcute Tn scopul c&utrii locului unei opereii de inserare/stergere. S& analizim acum complexitatea clutirii lineare in termeni de elemente accesate, care este acelasi cu num&nul de compamtii de Ia ciclul while, In cazul eel mai nefavornbil, efnd Vol nu se gieeste in struct trebuie sf traversdim toatl structur, deci accestim n=/ componente (ji pe ea marea)), C = n+]. Si analizim acum cazul mediu. Fie p,~ probabi i € [1.n] sig probabilitatca ca Val sf mu se giseasca in 4/1 Sin-ant Deca Af Uli) = Val (prima aparitie a lai .cem J comparatii, dee! numirul mediu de comparapii va § Inpa . daca Val se gisestc precis in vecto € cu probabilitate egala pe oricare din componente r ade s Lgminet) met Deci, in azul cauténi cu succes, numarul mediu de comparajit esle én~ 172, adicd jumétate din dimensiunea vectorului. In cea ce privegle clasa de complexitate, algoritmul d= cAutare lineart are complexitaten Otns Exerciti 1. SA se serie 0 proceduri de inserare intr-o structurd linear’ in alocare statica cu clemente ordonate total crescitor. Sa se folosea: proceduri de inserare penirua crea un vector ordonat 2. Si se serie un program eate contine: a) O proceduri de inserare a unei valori date pe o pozitie dati i structur’ linear’ in alocare stati 'b) O procedura de stergere a unei valori date de pe o pozitie datd dintr-o structurlineard tn alocare static ©) © proceduri de creare 2 unui vector care apcleagi in mod repetat procedura de inserate de la puncrul a) penmy ee rete (valoar pozitie) cit \ 4)O procedurt 1B ©) O interfapd a programului principal prin care utilizatorul s& post apela provedusile de mai sus. C&utarca liniard fatr-un vector soriat Daca clementcle unci structuri lineare au gi 0 organizare *intemna’, de exemplu daca sunt sortate crescitor, adic avem ALIS Al2] S$ ~S Ale, stunci aceasti informafic in plus poate fi folosita peatru « Imbundtasi performanja operatici de chutare, (Despre modalitatic de 2 soma crescdtor un vector vorn vorbi ints-un capitol separat) Este suficient si travers elementele strict mai mici decat Val, 1a primul indice # cu A/i) cegalitate, deci cdutare cu succes, Be inealtate sti, dupt eae continues parcugei mal are ses elici Val nu se paseste in A procedure S Loe cendihite ifi Val} {cautare fara succes} codif else (céutare Aid succes) endif endproc{ S schLinOrd} ¢ structuri de vector, gi anume ‘accestrit ia timp O(1) 2 oricarei componente, ac permite si yim si mai mult perfosruunya caulanii pe un vector ordonat. (Ciutares dinars Fie A/i.nJ un vector eu elementcle ondonate eresestor, All] SAR] SS Ala]: Algoritmul de edutare binaré este un exempiu clisic de metodi Divide et Impera. La fiecare fas problema se, Imparte” In dou sub-probleme de dimensiuni mai mick; comparind "pe Val cu valoares modiand @ veetorului, dack Val este mai mick decdt acecsta, atunci are sens si ‘continuden chutarea ei doar pe subvectoral din stanga, tar dacd este mat mare, atusci continuiim ciutarea pe subvectoru din dreapta. Algoritmul de edutare binari are unmatoarea structur (i) Seincepe cu segmentul definit de mdicii Lefir~ I sf (2) Pentru flecare subvector Left. Right] se repet fa) Se caiculeaza mijlocel seymentului Mid~ () Secompart ValcuA[Mi). daca Val = A(ivtid] cautarea se termini cu succes, daca Val < A/iMid] se reia pasul (2) pe {Left.Med-) daca Vai > [iid se weie pasul (2) pe [Mid 1..Right] ft ~ Raght) di 2 Urmitoarea procedural in pseudo-cod implementcaza acest algorites -ovedure SearchBin(A, 1, n, Val, Loc) Left + Right) div 2 while (Left <= Right) and (Val > A[Mid] } do if Val < APMid] then {se continu p Right= Mid-l wvalul din st else {Val > A[Mid]} {se continu pe subintervalul din dreapia) Left= Mid+1 exdif Mid: (Left + Right) div2 endwhile if A[Mid] = Val then Loc= Mid {cautarc cu succes} else Loc 0 fcdulare fird succes) en proc SeavehBin) oe ——™——— 20 Fie Cy) aumarul de comparafii pe care fl necesité clusarea binard pe tun vector cu # componente, Dupa fiecare comparajie, dimensiunea Segmertului pe care cluidm se va reduce Ia jumatate, Dact dupt Cn) comparaji am incheiat c&utarea, atunci avem relapia Pen de unde ; Cw» Llogan J +1. Desi, complexitaten cautrii binare este de ordimul O(log n), exc ce reprezint’ o imbundtatire substanyials fats de O(n), performanta elutii liniare Sd ne reamintim insd cd doi au fost factorii care ne-au permis aplicarea acestui algoritim » faptul ed elementele erau sortate crescator, iar operayia Ue sortare in sine poate fi costisitoare: “Tfaptul ef structuca lineatd ere Tn alocare stticd, deci permite acces in timp Of1) lo jundtatea unui segment. Am vizut cl o aseinenca eucturd nu este potrivitl pentru un set de date pe care avem si aperstit freevente de inseriri yi slerger, ‘Abia structura dz arbore binac de chutare echilibat AVL ne va permite sf Imptoim simultan cele dova cerinfe: posibilitaea efectusrit recosisitoate a insceacilor i steryerilor ew performmanze de ordin fiogsn) peniruoperatia de wiuiase 2 1.2, Structuri liniare in alocare dinamicA. Liste simplu inlin ‘Am vizut ci, dae folosim alocarea siatica pentru reprezentarea ‘nei mulkimi cu o structura lineard, ne izbim de dou’ neajunsuri majore, si anume ~ finitudinea spatiului pre-alocat structurli ; Max va fi numdrul maxim de elemente pe esre va putea si- contini lista in alocare statict Af Ma]. ecesitatea efectutrii de operapii de mutare la insert si stergeri, din cauzi ca elementcle structurii ocup adrese suceesive din RAM. ‘deel ar fi ea, la ficcare operatic de inserare 88 putem face alocare de spefiv pentru nou! clement gi sl inser in structurd cu un numar Teinim de operatit si, invers, la stergere s& putem reface, din rou cu pumar minim de operati, structura lincard pe elementele rimase, iar Spafiul eliberat de companenta ce a fost sis s8 fie dealocat Limbajele procedurale precum Pascal sau C ne pun la disporitie faciltati de alocare dinamicé de spatiu, precum si variabite de tip adresk (pointeri) pentra lucrul cu variabile dinamice. Cel mai simpiu tip de Stnicturd beard care foloseste facilitiile oferite de alocarea dinamica de Spatin este lista simplindinfuité pe care o prezentim in continuare Liste simplu inltiaguite 0 listi simplu inténguitt este o structuri de date aranjate in ordine tineara.‘Spre Ususcbire de vector, unde ordinea lineard a datelor este Getemminaia de ordines linesri pe multimea indicilor si datele ocup Tocatit succesive in memorie, intr-o Hsth simple inlantuitd ordinea lis ‘Cue descrninath de existenfa edte unai pointer, in ficeare nod, eitre nodul fumator”" a structuri, modurile avind adrese oarecari In memone. ‘Accestl la iniccaga structurd se Face avand adresa primului nod. ‘Un nod al unei liste simplu falénfuite va confine deci : (1) un set de cmpuri pe care se reprezinth un element al mulfimii, de obicei von {ndentifica clementul cu veloarea de pe un singur cimp, sumit cmp ccheie, In algoritmii care urmea24 putem presupane ci elementul ocupd in singur cimp, info, (2) ua pointer efire nodul ummétor, next. De fexemplu, in Pascal putem folosi urmitoarele declaraii de tip pentru 0 listh de intregi info 208 Cad 2 type pnod=T nod; nod = record info: integer; next: pnod end Tipul nod va fi pentru nodunile listei, iar tipul prrad pentru adrese, adica variabile de tip pointer oitre noduri Lista tn intregime va fi data de.un pointer edtre primul nod (variabila Start de tip pnod ), Cémpul de adresé al ultinului nod va fi setat la nu, Lista Stare este vidi dact nu confine aici un clement, situafie care se codified prin Start = nil sua o>( Tae Pentru structura de Lista puter da si o definitie recursiva: O listé £ de un anume tip de bazi este (1) fie lista vida (= 0), (2) fie este nevidi, $i atunci contine un nod numit eapullistei, urmat de 0 ist de acelasi tip de baza. unde prin “tip de bara” ne referim la lipul de date de pe cémpul un, Observatie: Liste simplu inlamuite se pot reprezenta 4i in alocare static’ CAmpurile info ocupa anumite locapii ale unui vector, iar cimpurile new asociate vor contine indicele elementulij urmator se numeste reprezentarea cu cursor’ a liste’ 12 info [TYE next [Tn Fig.1.2.1. Reprezentarea cu cursori a liste ( lista incepe la indicele & iste simaplu inky Spre deosebire de structurile lineare in alogare siaticd un tea traversiri_s inllnguite nu pute parc cturii “in_ambele sensun, la liste simplu ge structura decd init-un sing sens, accesind Primul nod, Stari si, din fiecare nod curent p accesind nodul umétor cu ajutorl adresei pt. next Structura provedurii de traversare este Hineare in alocare statied, decdt 8 rolul indice de un pointer curent eeagi ca 9i la structun i eurent este acum preluat procedure Trev_Lista (Stan) i> Start, {inijializarea pointerului cuter petiru traversare) ‘while p=nil do (test pentru nedepasitea structurii) {viziteaza nodul pt} pe=pinext (trecem ia componenta urmaioare) endwhile endproc{ Trav_Lists} Exemple de prelucrdri simple care implica traversiri sunt afisarea datelor din nodur; la consoli sau aflares numniului de noduri al listet (Ciutares inte-9 list simalu hs i i rt Se cath o.valoace dash Val. Mai precis se cout nod. Leet. cu wrongetalea Loch infor Val. Dack wo asemanea tad ni aisth eecchumeacd Loe=nil procedure Search_List (Siatt, Val, Loc) Loe ~Stait, while (Locnil) and (Lect infoVal) do Loc=Loc} next endwhile if Local then {cautare cu succes} (Loc=nil} {cautare fara succes) endif cendproe{Search_List} dent, variabila Loc ya webu sé fie transmis pentra a retirna ezuliatul caulanit si In afara proceduri Putem sce alifel procedura de cavtarc, punind in evident ‘area, chvenival incompleta, unde “procesarea’” este comparatis cu » procedure Search List_1 (Start, Val, Loe) prStant While pOrnil do {test de nedepasirea structuni) ifpt.info=Val then Loe:=p exit (cfutare cui succes cu iesite cin procedurt} ele p=ptnext endif cendwhile Loci=nil (cdutare fed succes) endproc(Search_List_1} ‘Analiza complexitafii cdutArii pe o Tisth simpld Hnlanyuith este aseminitonre celei de Ia structuri lincarc tn alocaze staict Ea este de anal Orn) unde este numarl dz nodural-linei Abia la Kee con ai nod tates} Vor putes reduce Ia jomtate numdral de compart elimindnd testul de nedepésire al structunl (ceca ce ne ne Scoate din aceastt clas’ de complexitate) Ins area way oad Jote-a fst siroplu inkinguitt ingerare slement intt-0. tistd-simpla inlanjuitd xa trebs' suiaonmn a) opemiia ds crear. a unginad-nax avnd pe empal infe Sac Tul Ge figeiat 9B) oparabia. de ngare.s nodulus now in yodului nou este cen cire face alocare.dinamicd aT Rgu, pentru o Heth de nireg. avind o valoare jpgtrucfiumt new(tiou) {alocarea de spafiu pentru noul nod} Now f. info=x {sctarea cdmpului info a valoatea doris} {Now }.nextail {setarea efmpulu de legsturd La rl} Existt posibilites depiirit“diinensiuni” gi ln structure linea (8 locate ditamicd, Dack programul nu mai are loca libere din care oh stove spajiu pen variabiladinaraic& pf, atuneci newt) vt return nil. fh prneipa, dupa invocarea hi new(p),ptrebuie tests wil, Deck dorim si ficem crearca nodului now seporat si ded wate problemel o cere (de exemplu dacd inseraren se face oblnpstria) tunel 3 patem modilariza seevents. de creare, de exemplu cx ajutonul unet fungf function Nou(«:integer):pnod; new(Nou) Nou} info:-x Nou}.next— endfunction Functia Nou ereazi un nod nou cu valoare data x pe cimpul info st Foturbeazd pointerul Now elire acest nod, Pointerul citze nedul now ereat ta fi transmis ca paametra unci proceduri de inserare si va fi folosit pevtry eperajia de inserare proprit-zis, In enumite tipan de problems pean este mai practic ca operatia de creare simu sc fac8 separa, ef sbia nd a sosit momentul inseririt in Hist. nserate propu-ish Tntrp list, simplu jnldngulth este gperafa are Ieagi™ nodal pou reat de eelelalte nodu din list int See ee ygaare uebue dclrminat in foneje de nature probleme Ogg determinatlocul insererii,legares noului nod Ia Vise face sips Sind valonle doi poinen (Sau schimbnd dou lesitun) ‘Ceoal inserdrii ia eapul liste ebuic depistat gi tat separst de cette procedura de inserare, deoarece fn acest cau se schimbt adresa cMrmufat od ai Ustel. Legarea in cap iste! Start a una nod ou, cteat ojo eu functis Urus ea mai sus, se face cu secventa: ‘Nout wext:=Start (1) Swt=Now 2) Dupt cum se vede si in Figur, prima instuciunerealizead lta 6 dreapts (1), iar 2 doua Jegitura. la stings (2) — Jn cazul acesta ea redefineste eapal liste. Siar 7 Now in general, determinatea locului inseririt in lista se fave cu © traverare eventual incompled a liste, cu un pointer curent 7. 1% “Traversarea va fi guvemnatd de o condifie de neterminate a structurii $i 0 conditie legati de natura locului de inserat. In functie de acesié a doua conditic, traversarea se opreste in una din urmatoarele dou situayit (bl) Nodul pe care s-a oprit p este cel dup care urmeaz4 si se facd inserarea; (62) Nodul pe care s-a oprit p este cel intea cdruia trebuie s& se facd (b1) Daca pointer! curent al traversirii p se opreste Inaintea locului de ingerat, stunci inserarea se face cu secvenja de instructiuni ‘Nouf.next:=pt-next (1) pinext=Now (2) care realizeazd noile legituri la dreapia (1) gi la stings (2), dup’ cum este dlustrat gi fa figura Set “Te ge I>, Ts os Un exerplu de inserare in care traversarea se poate opri inainte de locul inceririiecte incerarea unei valoriintregi = fatr-o list de intregi, pe al Flea nod al liste, unde & este itzeg. Peatru a gisi locul inser se va face © traversare cu contorizarea nodurilor gine oprim eu p pe al (F-1)-lea nod al istei (acd exist) inserdnd nost nod dup pt. Dacd lista nu are cel putin &-! nodur, nu se face inserares, iar inserarea cu 1 este inserarca in capul liste. (02) in cazul in care traversarea se oprejte cu pointenal curent p pe nodul fnaintz de care trebuie si inscrim, dificultatea consti in faptul od, neputind accesa nodul precedent, nu putem seta toate legitunile necesare, Dificultatea acesta se deplyeste ficind traversarea cu doi pointer succesivi in loc de unul singur. Dack p este pointerul care conduce waversarea, fie ofd un alt pointer, care il urmeazi pe p rimanind Tntotdeauna un pas in urma lui pe nodul precedent. fn cazul acesta, Ia terminarea traversivii lecul inserdrii este intre nodurile eld gi pT, deci —————————— | 27 legarea se face dupé, old ca si cum am fi In caval (b1), dupt cum ilustreaz’ si figura : sat =k: Tew Unmnatoarea procedurd in pseudo-cod presupune nodul creat deja cu functia Vow sii] insereaza inainte de primul nod din lisid cu valoare data Val pe cammpul info procedure Incerti (Start, Nou, Val) {inserarea lui Nou} inainte de primul p pentru care pt-info=Val} oldmnil p=Start {traversarea incompletd} sshile(gnit) and (pf infos Vat) do old p, p= pr next eve {inserarea, dacd este cazul} if p= nil then (n-am gisit locatia, eventual nu inst else{inserarea intre old sip} ( (1) lepittura la sténga} if old = nil then {inserdm in cap Start= Now else (inserare dupi old) oldj.next= Now end ( (2) legitura te dreapta } Nout next= p endif endproe insert!) WS eS eee a a ro Ce ee ea oe Apiicaie 4 rocedurii de ingerare ta crearen unei liste simplu lintuite ordonate Progremal inittalizeaz lista cu lista vid $i confine un cick: repetitiv care citejte cite un intreg de la consol& gi it insetesz le local iat in lista ordonat spetind procedura Insert ister, Start nil (inifiatizarea listei cu lista vies } while not eof do read(x) Insertl.istaOrd(Start,x) endwhite Procedura de inserare intr-o std ordonata este un exemplu clasi in care suntem in eazl (42), procedure InsertListaOrd (Start, Val) { inserarea valovit Val fntt-o listé de intregi cu cdmpurile info ordonate crescitor } { tuiarea locului inserarii in lista } p= Sart; old nil, {initializarite pentru parcurgere} while (p< nil) and (pf info <= Val) do old p p= pt-neet endiwhile {inserarea propriu-sist) aew(Nou) Nou. info:=Val (legitura la dreapta} Nouf.next-p {epitura le stings} ‘fold nil then {incerare tn capul liste’) Start= Now else (inserare dupa old) oldt.next= Nou endif endproc{IasertListaOrd) 2 Erocedura acopert i cam insertii pe ultima oe (p ~ mi) precum si azul insert primului nod in ista Stare = ni Observatie: O alth solic eare sar putea alopta in cazul (62) tn care traversarea se termind eu p pe un nod inaintea caruia Uebuie sf iaseram solute apleabil8 aumai tn cazal fn care <>nil, ar fi umadtoarea: slo Spatia Pentre un nod nou, copiem in el valorle din cdmpurile fui pt, valoarea de inscrat o punem pe cimpul info al lui p. apoi inser roti nod dupa p, Exercitt aid faversarea cu doi pointeri in scopul inserts, am putea face 4vansul pointerilor cu uimdtoarea secventa P=pinext ld=oldt.next ? SA se justifice raspunsul mar SE In Pteulocod, soi in cod, o procedurt InserrStary, x, ky care inseresz4 un nod nou eu valoarea x pe cdmpul info ca al Elen acl listei Starr, daca este posibil (& este inreg) SA se serie o versiune tecursiva a procedu ordonats 4 Si sc serie, in pseudo-cod si cod, 0 peoceduré de inserare in care suniem Ta cazul (b2), dar facem traversares cu un singur pointer eure aplicdnd ideca Observatiei dela sfarginul sectiumii ist sia In.cazul stergerti unui nod ¢ intr-o Jistd simply inlantuiss tre! (ose sc det St Sega oe eae ae ocupim_sventual_de_dealocarea_de spatiy_peniru .nodul, sere (sounem "eventual" pentru 8, in anumite splicati podul extras dito {ist poate fi folosit la alte operafii, de. -exemplit se. poate core inserarea lui {mal ist, deci problema dealocdrii de spajia nu se pune) i de inserare intry listé ‘Stengeres unui nod dis 20 (b) Dealocarea de spain se face in feiul urtor. Fie emp o variabilé de {ip povntereatre nodul de ster din Ist. Se reface structura de lst pe ee eile rimase (fesetdnd nije adrese dup& cum vom vedea in cele ¢ Trmeaza). Se “exploateaza” valoarea extrasd, adicd se proceseazA cémpal info al rodului temp ters din lista. Dupd c= ne-am asigurat nil facem temp:=pT:next (salva adresa nodului in variabila temp} pi.next=prnext.next (refacerea structurii de listé a nodurilorrimase) ‘wath tempT do {utiliza valorile din nodul extras} endwith ‘dispose(temp) {dealocarea de spefiu} Observim cd refacerea structurit de lista se face cu schimbarea valont unui singur pointer. (0 procedurd care face extragerea si transmite adresa nodului extras {in afama ei este urmitoarea’ procedure Del_1 (Start,temp) p= Start While (pail) and (conditia de oprize este false) do p=ptinext endwhile if ponil then (traversarea © tenminat; wrebuie siers nodal p.next i pt-next>ail) {selvim in temp adresa nodulu extras} tomp™ pl next {refacerea structuri de lista pe nodurile rammase} pf.next'= pT .nexty.next endif end proc {Del_I} (22) pointerul curent p termina traversarea exact po aodul ce trebuie sters. in cazu acesta vorn face, ca si la inserare, traversurea cu doi pointert ‘curenti succesivi, ofd cu un pas in usma lui p, astfel neat sa putem sterge nodul de dup’ old plasindu-ne in cazul (al) de ers a> fe Te Pid P © procedara care sterge un nod pe care se opreste traversarea, transmitind adresa nodului extras in afaza ¢i este urmatoarea’ procedure Det_2 (Star.temp) p= Sur old= mil il) and{conditia de oprite este false} do Pp p= pl next endwhile if poni hen {traversarea s-a terminat; trebuie sters nodul p} {salvam in temp adresa nodului extras} Pp {refacerea structurii de lista pe nodurile rarmase} fold = nil then {cazul stergerii prrwulai nod al listel} StartpT.next else old?.next= pI next endif endptoc { Del Sa observam of trebuic tratat separat cazul slergerii primului nod al listet gi, deoureee variabila Stari isi poate schimba valoarea, ea va trebut sf fie transmis prin adres’. Tot prin adres trebuie transmisé gi variabila temp ce conjine nodul extras EE EE ean — ee 2 S& mai observim e& inainte de a apcla © proceduri de extragere dlintr-o list® webuie s4 ne asigurdm c& acesa nu este vidi si el desi extragerea are se Observatie Si anume: dupa ce se salveazi cdmpurile lui pf de care am avea eventualé Revoie, se mutl in ele cimpurile corespunritoare ale nodulti urmsior, Ph-next, apoi se elimina pt.next din lists Exercitii |. SH se serie © procedurd care extrage vaiori date dint listd simpiu {nlinnuiti ordonath (reficand strucura de lista ordonatt pe nodule 2. Si te serie 0 versiune rectursiva a slergenii unui nod cu valoare dats dintr-o lista simplu inlanquita ordonata 3. Si se serie o versiune recursiva a stergerii unui nod cu valoare dat dino Tita simpiu inlanjuita oszecare 4, Si se sctie o procedurd de siergere in cate suntem in cazul (22), dar facem traversarea cu un singur pointer si aplicdm iden Observajiei de la stargital sectiuni 5, SH se serie un program care <4 compare intre ele doud liste simplu ialantuite 6, Sa se scrie un provram care 64 reslizere iaversarea legaturlor intro list simplu intingita 7. Si se serie un proyram care s8 stearga repetitile dito lisa simpli inlaoquita 3 13. Alte tipuri de liste. Apticati ate tistelor: inlanfuite, Liste cu nod mareaj Sa Sar CU nod marca, va confine in variable Start adres clement allt efectvd, in care in fccare nod avem representa at clement al multimii de date, va fi Staret.nens “Sea Tae, Fig.1.3.1, Listé cu nod marcaj. © list cu nod marcaj vida va contine doar nodul marcej Stan eee Fig 132.1, vidi cu nod marcat Inthalizarea nei asemenea liste eu lista vidi se va face ey secvenyar new(Stan) {alocare de spatiu pentru nodul mare Startf.next = nil {iniiaizares listi efective cu nil} ja Guaiul liselor cu ned marc ft de este fad mares} apare la shamlife de inserare si steqgere, cind cezal inserdil tn caput Ittel aa Tap aebuie trata: separat in cod, edei vasibile Sart au ip, schinta valoarea. In primul rnd, iializarea cclor doi pointer succeiva pentru Darcurgere se va face cu old = Sta p= Start next M Observim ch old nu mai are v inserdrii in capul listei, deci te (Gadiferent de loca inser) cu ofd}.next =~ Now jloarea nil nici cind suntem in cazul igitwa la stinga la inserare se face Liste circulare CO tins simply inlinpuith circutard este o Lis simple inl Entyt in care césnpel adres al utils nod, n Toe s fe stat Ler ete Seat in fadresa peimaulut nod al liste Sa ae, of 8 : eae Co 33. Lista cireulard. Fig cista circular este deosebit de ult pens apical in care Oe nevoie 2a favem parcurgeri repetae ale liste. In loc sf vaults mevOtsgele repetae separa, le PUT” tata ca Pe © SNE POETS Par cand singer scopul propus de aplicaie Exider, pe Wn sermeisa Me it, testl de nedeplsire al structri mu va mai 6 ée Spal p> ml Liste cireulare en nod marca} patem combina avantgjeie celor dowd tipun de modifcan precentate rai sus, lucrénd cu liste cireulare ou nod masct} oo 4, Lista circular cunod marca} Fig Lista confine nodal marcaj si in plus, este circular ie ce reulard cu nod rarca) va confine doar nodul marca J8F cAmpul sé nex! va fi setat la Start un asemenea tip de lists pute folos| nodul marca) Ia fel eur roloscan conponenta mare Ia efuarea Linea pe strucunile Wrest oles ep Ge mwoduce valoared chuath Val pe compl fe 2 sca muaea) cx Starr. info := Val. Apoi se inespe cauarca in iste aes ir Cum lista ese cucuass, im cazal moyasint Ik Fal b9 1A) Siecavd, parcurgerca ajunge pe nodul marca unde il BASS Fe val, crore ‘care coufica cauarea fis succes. Fie Fc pointers} etree de aronatia de chuare pe 0 ascmenca Vist, Daod Loe + Start caulared cestecu Gneces, daci Loc = Start cautarea este fish succes Liste dublu inkintuite calor noduri au cimpuri de cit gt cttre. precedentul ‘ariabila de tp nnd, unde Je dublu inlinuite sunt liste ale legitué atit eftre urmiterul nod al liste Feesupunem un nodal unei asemerea Tite €2.0 avem dectarapite de &p Listel ype pnod ~f nod. od = rewured info: én nent, prev: prod see Fig 13.6 Nod pentru lista dubia inlanuit La listele de acest tip, la procedunile de inserare st tergere, traversarea in scopul gisiriiloculu se poate face eu un Sing pO Ft cere guniern in comune Tn care traversarea se opre ne dupa Loe ra chiar pe nodal de srs, clei ven acces la nodul precedent eemediul varisbilei pL pred. Un exemplu simyplu pentra care ae 36 tip de lisid ar fi indicat este 0 lst pe care se cer freevent parcurgeri in ambele sensuri ee vet, abe tp de lst ponte combion cu ele tir obfindnd astfel liste dubla inkanquita eu nod marca), circulare, ete. ‘Cand alegem pentru o problemi datd acest tip de list trebuie $8 tinem cont de faptul c& adresele citre nodurile precedente ocups si cle spatiu in plus gi trebuie si céntirim dacd avantajele commenseaza acest dezavanta). cazul operatiei de stergere. Si se serie pseudocodul pentru procedura de liniare in alocare static& pentru listele simplu inlantuite Pird si folosim versiunea circulari a lor? , $. Sa se serie procedurite de inserare si de stergere de nod dinte-o Ii ordonate, precum si In evolutia ei dinamicd (se cer de Ia consalA inser’ri i ptargen Aplicatii ale listelor faliintuite Dam in continuare cieva exemple de probleme in care reprezentarea datelor intr-o structura de listi Talanfuitt este indientd, find de exemplu mai avantajoasa decit cea de vector. 1) Reprezentarea yeetoritor rari Numim vectori rari acei vector’ care au foarte multe componente rule, in. general, pentru a implementa operafii pe mulpini de vec dimensiune data (adunarea, ‘nmulfirea a doi vectori componeaa ci Somponenia, cic) ei sunt reprezentati tm alocare static cu ajutorul tipulul array, Aceasia reprezentaze face ca programele ce implementea?) Coperafiile de mat sus st fle extrem de simplu de seris ” Probleme apar cind vectori au dimensiuni foarte mar si i plus, ea mai mare parte a componentelor lor sunt mule, Pertru un vector dy dimensiune 1000, cu numai dout valori nenule (pe componentele de indice 17 1 912 de exemplu) gi eu toate cclelalte componente mule eprezeniarea eu o variabild A de tip array 1.1000) of integer este ineficiensd din punet de vedere al spapiulu, c&ci 998 de locatii vor confine valoasea 0, O reprezentare mai efficient este aceea cu afitorul une! liste simplu inlanpuite, cu doar douk noduri, in care sf menginem valorile nenule, impreant cu indicii pe care ele apar, orpanizats ca lsth ordonstd dupa campul indicilor. 2) Reprezentarea polincamelor rare © problema asemandtoare este cea a reprezentisi polinoamelor rare, polinoame care au foarte multi coeficienti mui, Tn general, olinoamele se reprezini8 in alocare stated folosind vectori in cate meninem coeficienti Ca sla vectori ran, 0 reprezentare mai effcienté din punct de vedere al spativlui ar fi sub forme unci liste simplu inlénfuite (ordonate dupa valorie exponentiler) i care menginem in fiecare nod informatie despre monoamele cu coeficienft nenuii Sed exp coef next cons Fig.1.37. Reprezentarea potinoamelor rare Polinomul POX)=5X°"+1 3) Reprezentarea matricilor rare Matricile rare sunt matrcile cu foarte multe componente nule, deci teprezentarea lor in alocare staticd conduce la risips de spatiu Putem “folosi posibilititile alocdrii dinamice in felul urmétor: sh fmenfinem ficeare linie intr-o listt simph inlinquitt ce confine doar clemente nenule gi, analog. pentru coloane. Fiecare element nenul ay al ‘watricit va fi un nod care face pare din doud liste: lista lini + 3 Nsta 38 coloanei j, Pentru intreaga matrice vom avea astfel un set de liste ce rmenfin liniile gi un set de liste ce menfin coloanele, Pentru o matrice de dim-casiunc /000 x 1090 accasta inscamn& si ocuptim, in loc de 10% locatii ta clocarea statica, doar 2 « 1000 locapi ce costin pointeni c&tre lisicle linii i listele coloane, plus locajiile ocupate de componentele nenule, Pentru implementarea mai eficienta 2 algoriumilor de adunare si inmuljire de matrici este util sé fecem listele lini si listele coloane liste circular $1 cu nod marca). niin in rool = 7 [sa aoe Fig 1.3.8, Reprezentarea matricilor rare, Un nod. 4) Reprezentarea numerelor mari Numerele man sunt numere care depagese posibilitanle reprezentini in calculator. Pentru a le reprezenta si pentru a face operat pe ele putem folosi structuri de liste simply inlanfuite, reprezentind fecare cifrd (sau efte un grup de cifre) pe cdte un nod al Iistet. Stay GZ [oto 6 [eS [eo [at [8 lo} _ Fig1.3.9, Reprezentarea numererelor mari intregul 82564 se reprezinté cu lista de mai sus Exercitii 1. Sa se serie un program care s& facd adunarea gi produsul a dout polinoame reprezentate ca liste simplu inlénpuite, 2. Sa se sofie un program care si realizeze adunarea si inmuljites umerelor mari 3. Sse scrie un program pentru adunarea, respectiv produsu! scalar a doi vector rar 4. Sa se serie un program pentru adunarea, respectiv Inmultirea a dowd matici rare 4, Structuri lineare eu restricfii la intrare/iegire: stive yi cozi Vor numi structuri lineare eu restricfii In intrare gilsau iegire acele stmcturi lineare pent care operapile de inserare de clemente noi (intrace) qi'sau operatiile de extragere de elemente (iesire) $2 pot face rnumai la unul din cele dow capete ale structuril. Cele mat importante structun din accasté categorie sunt stiva, in care inseracile gstergerle se fac la acelasi capit, gi coada, in care inserinle se fac fa un capit iar sfergerile la celalat. ‘Aceste tipuri de stuctusi sunt caracterzate de operapile de inserare si stergere. Nu vom avea operafil de traversare sau de cautare, chiar daca pentru reprezentarea for folosim list: In alocare staticé sau dizamica, iat pe liste in general facem traversin §1 cdutin. Inspectarea unai element dintr-o stiva sau dintr-o coada se face numai la extragerea respectivultsi clement. iar pentru 2 putea face acest Iucru clementul trebuie “adus” in povitia de unde extagerea este posibilé, eventual prin extragerea altor elemente Puem folosi pentru structurile de up stivé st coada audt alocare statied edt 31 dinamic&, Yom menfine eventual snformatic in plus asupra Jocului unde se fac inseraile 31 stergerite, Stiva Suva.este w suustura tnwara in vase insted 51 pergeile se fan dows la tun singur eapst numit sdf stivei (sau daca stivel de edtre alfi autor) ‘Vom folosi pentru acest capit numele de vanabulé Top. ‘Se mai foloseste penuru stva 9\denummirea ds structurd de tp LIV'O. inigialele de la “Zast fa First Out” - in traducere “ultima intra, pritaul icgit” - care aratd model specific de functionare al aceste’ structurt llkiml element introdus va ft gi primul element extras din stv Pentru operafia de inssrare intr-o stiva s-2 ineetjenit denumirea Push, 0 procedur’ Push(Stack, Val) insereaza valoarea Val ia stiva Stack producind 0 nou stivi ce are in varf valoarea Val. incerearea de inserare intr-o stivi pln’ conduce la supradepdsire (Overflow). Penteu operajia de extragere dintt-o stiva s-a incetijenit denumicea Pop, Pop(Stack, 3) exteage din siva Stack 6 valoare pe care 0 depune in ia X gi produce o stivé care are un element rai pufin. Evident, este tnutil sh inceredm s2 extragem elermente dinte-o stiva goals, incereare ce poamta denumitea de subdepasire (Underflow). sree Die a al a Dat eek a a al — — cy Stiva in alocare statica Vom folosi componentcle unui vector pentrs a mentine 0 stivd, fie acesta vectorul Stack/l..Mex) Convenim sa umplem stiva in. sensul cresedtor al indicior, Atunct stiva este identificaté prin vectorul Stack si indicele Top al ultimului element introdus (in acelasi timp, primal ce poate fi extras), Locattile lui Stack de la Top/ pain la Mar sunt libere, deci putem insera in ele. Vom codifica stiva vid’ prin Yop=0, iar stva plina prin Top-Afax stiva loca bere Stack | 12 Top Max Fig. 141. Stiva Stack in alocere statica O procsdurd de inserare a valorii Val in stiva data prin Stuck $i Top, Procedurh care face testul de supradepigire in corpul ei, arata in fell urmator: Procedure Push (Stack. Top, Val) if Top=Max then ‘Overttow else Top:=Topt | Stack{Top]:=Val endproc Analog, avem procedura de extragere in variabila Aa unei valory din stiva procedure Pop(Steck, Top, X) if Top=0 then Underflow else X:=Stack{Top] Top=Top-1 endproc Putem serie procedurile de inserane si stergere astfel incit testele de supradepiisire, respectiv subdepagire si se faci tu afara lor, in procedira apelant®, Dac& testele se fac fn interiorul procedurilor, s iu iti of rezultatul lor trebuic transmis procedusilor apelante Stiva in alocare dinmies Jn slocare dinumiea stiva va fi Teprezentzta printt-o listé simplu inlanyuita Top, i ‘ cats locl pentru inserts ergen. Stva vida va toro oo list& vid3, Top=nil. ii - Het 1Top Fig 1.42. Stiva Top in alocare dinarsicd ‘Operatiile de inserare gi stergere se implememteaza dups cum wnmeazk: procedure Push’ Top, Val) new(Temp) if Tempenil then Overflow Else Tempt.info >= Val Tempy.neat:= Top Top = Temp endproc Procedure Pop(Top, X) if Top= nil then Underflow else X= Topt. info Temp = Top Top == Topf.next dispose( Temp} cendproc. a Coada Coada este o structuré linear in care inserdrile se fac la un capt, numit spatele sau nil thea QUINSERT (Queue, Root) endif while Queue #@ do QDELETE (Queue, NodCrt) {proceseazs NodCrtt. info} for K= | to NocCit Tnsfii_ do QINSERT(Queue, NodCr 1 Fi] ) endfor endwhile endproe procedure TravAd(Root) {traversarea in adncime a unui arbore, Root, fllosind o stiv’ STACK, cu procedurile PUSH (STACK, - } i POP (STACK, - ) pentnu introducere, respectiv extragere din stiva} STACK © {initializarea cozii} if Root nil then PUSH (STACK, Root endif while STACK =0 do POP (STACK, NedCr) {procescari NedCrtf. Info} for K= NodCn tnrfii downto 1 do PUSH (STACK, NodCrt fk) endfor endwhile endproe Exercitii 1. Si se scric un program care are ca datk de intrare un k-arbore gi s8 se creeze arborele binar canonic asociat Iu 2. SA se serie un program care are ca date de intrare un arbore binar ‘considerat canonic asociat unui Karbore gi care: (a) il determina pe & (b) construieste karborele 3. Si'se implementeze operas de traversare le unai iarbore (Kfxat), 8 2.2, Arbori binari Definitie. Un arbore binar este un 2-arbore ordonat. Pentru cei doi {ii ai unui arbore binar s-2 incctijenit denumirea de fiv sting. respeciv fiudrept Definifia cecursiv4 a arborelui binar: Un arbore binar T este (1) fie un arbore vid (T=0). (2) fice nevid, si atunci confine un nod mumit radacind, impreusil cu Goi subarbori binari disjuneti numiti subarborele sténg, respectiv subarborele drept Putem folosi structura de arbore binar pentrua reprezenta de exemplu: 1. arbori genealogici (pedigree): ficcare nod va reprezenta 0 persoand. {ar fiul sting -tata , ful drept ~ mama respeetivei persoane; 2. tumee: fiecare nod reprezinta cistigatorul urui meci, iar cei doi fit reprezinth participanti la respectivul meci, 3. expresii artmetice cu operaton binari Fig 22.1. Arborete binar ce ‘exprosia ariumeticd (a+(b/ €)*(d-{6*f) © roprezentare dinamici 2 arborilor binari in Pascal o putem face cu urmétoarele tipuri de date: \ ° nod info Jeg ~*n0d, ae nod = record. info ene right left: leg, ‘root = pointer e&tre ridicina arborelui right: Teg Teft= pointer cdtre subarborcle sting end right pointer clire subarborele rept ype ‘Un subarbore vid ¢ mareat prin valoarea mi! o pointerului roo! c3tre radacina ui ‘Traversiri de arbori bioari Pe land traversarea in lajime (care se face folosind a-couda) enista, wei tipo specifice de rraversin in adancime ae arboriox bina 1) in Prgordine (RSD) (Radacind Stanga Dreapt 2) in inordine (SRD) 3) in Postording(SDR) Prezentim inti versiunile iterative ale acestor traversini. Toate tret folosese un pointer curent p, cu care se incepe raversarea de la fidécins (p: = Root), $10 stiva pentru a fine minte nodunle rama de procesat Procedure PreOrdine(Root){ RSD} Stack — © {inifalizarea stivei Stack cu sia 0) p:~ Root {inijializare poimterului curent) waile p> nil do (A) repeat 1) (proceseazé pt info) 2). ifpptaight nil then PUSH (Siack, pf right) endif 3) pom ptileft until p~ nil (B) if Stack > O then ‘POP (Stack, p) endif endwhite endproc « (A) Pentru ficcare nod se repeta pasii 1-3: 1) se proceseazs nodul, 2) act are fiu drept nevid, se introduce fiul crept in stiva: 3) se merge un pas la stinga si se reia de la 1). (B) Cand nu mat pot merge la stinga 4) se extrage din stiva un nod si se reia de la (A) Procedure InOrdineoot); {SRD} Stack — 0 p= Root do while pS nil do (introdue flecare nod in stiva si ma duc la stn, efte un pas pana mu mai am unde} PUSH (Stack,p) P= ph lett endwhile repeat if Stack <> © then fextrag cite un nod din stiva sil procesee} POP(Stack, p) toroceseaz’ pt info} else retum ficsire din do. repeat} eudlit until pt-right-> nit (pana la primul eare are fiu drept} P= pi.neht {ma ducun pas la dreapia i reiau eich de.repewi! repeat endproe Procedure PostOrdine(Roct) (SOR} Stack — p=Root do (1) white p> ait and pr.teft > nit do PUSH (Stack, p) Pim phlet endwhile (2) while pt right = nil do repeat {proceseaza pt.into} 61 if Stack > 0 then Old: =p ee POP Sach ) lee return (iegite din a. lie turn (i peat) until Old = pr left endwhile (3) PUSH (Stack, p) (4) p= ptrighs repeat endproc a PosiOrdine apare o dificllate Ta plus fad de celelate dou tiger: Gnd extg un ned din ve, wam vol att proce ese St Merman Frocesarea filor, sing si drept, dacd exist Pentru ace an ren ie Genel un pointer cusent, Old, spre nodul procesat anterior one eat fig Hal sting (Old = pr.ten), fie fl rept (Ol! = pt right) al lului curent p 0 a #% ¢ se c 7 4 ny 5 Ne 7 Nee af 2% x L me Fig2.22, Traversarea in post ordine, ‘Cele doua situaii posibile sunt: > ; o 4 a 4 ou oe y ’ oe (a) Daca Od imi are cd vin de pe o ramus stings, Nur daca nodul Dat Care fu dzept, 1 introducer a lo in stva (3), mergem un Fas fa dreapia (3), $i sete ciolu do... repeat (b) Dac Old imi arata c& vin de pe o ramurl dreapid. ost trebuie s0 jprocesima nodul p extras din sti (se ceia repeat ‘until de 1a 2)) Cook ty consta din dovA stucturi repestive ana in alta, while controlat dde pt right = nil si repeat .. until O14 * pt Jef. Da ae eater (a) (vin din stinga) O14 ~ pt left exe adevirat, desi ack sat eat si eonolul se tansfera tut while, Desi, pe rammur Je tip i) (veal Fig. 22.2.) procesez fiecare nod extras din ‘iv pentru c& Bi (ore e erocesat ‘ar fu dept nu are. acd sunt in situatia (8) (Wit div dreapta) Old = pH left este falsa, {ui repeat, Pe ramuri de tip (2) (ve aa erin tive portra ci tocrai am trmirat procesarea ful crept Procedurile recwsive de traversare ¢ arborilor binart au 0 soarte simpla gi le prezentim in continuare, procedure Preowd (p: tes bes gin ifp nil then erin Proceseazd (P) Preord (pt lett) Preord (pi-night) end end procedure Inord (p: leg), in if p> ail then begin Inord (prem, Proceseaza (P): nord (ptsight) end end forma procedure Postord (p: lee); begin ifp> nil then begin Postord (pt let Postord (pt right); Procesear’ (p) end end; Arbori binari complet pe nivelurt Un arbore binar complet pe niveluri este un srbore binar care ate toate avelurile pine, eventual cu exceptia vltinlu nivel, unde nodurite par cel mai in stnE®. Tnaltamea unai asemenca arbore este egala cu (es Pe lings faptul cA are injime mnumd, avantajul avestui up de arbore este cf el se poste reprezenta neechivor in alocafe statics /.. Ipoteza de induetie este cd presupunem lema adevirata pentru orice arbore binar cum noduri, unde m 1) Si analizam pe rnd cele dout eazuri (@) fuy)~0 Rezultd c& uy rSdicina lui 7 are un singar flu nevid deci avem + fe (al): stg()= isi drt) @ ceea ce este echivaient cu //u)~ Osiruj=t = fie (a2): stg( #2 si dr()= ceca ce este echivalent ou iftu)=! sir(u) =O Raticnamentul este acelasi pentru oricare din cazurile (at) sau (22) Presupunem c& suntem in cazul (a!), adic& singural fiu nevid al lui Teste cel drept Atunci dH Z)= > uy tq Teprezinté percurgerea lui in preordine, dr(Z) ate n-) noduni si i putem aplica ipoteza de inductie ‘obginand relatile() si (i) pentru dr Ty (i) flux ~~ flug20, partes orice ke [2, 2) (uy Sey — ~ flug~-t La aceste relatii putem aduna /fuy cate are valoarca 0 si adiugim 3i relajia 'uy)-0 objinind relapile (i) pentru 7 Suy=0 flay flea)= > féas~flta)~..= fn)20, pentra orice ke[2, ny relajia (i) pentre T Sts) Fta)~ -* fg) fea)~ = fn) =I « iam tncheiat demonstrat in cazul (a) @) fup> I, Rezubs c4 7 are ambii fii nevizi, Dact ny este numiirul de noduri din fiul sting al Jui 7", atunci nodurile de tay la up, 7 Sunt nodurile lui stg/T) pescurs In preordine iar de le te, 9a up sunt nodurile lui dr(7) parcurs in preordine. Cu alte cuvinte, din parcurgerea in preordine a lui T objinem parcurgerile in preordine ale fillor sti = StQ(T) than 01 FECT) ™ Wy 2 ‘Suberborilor sig(7) si dr(P) le puter aplica ipoteza de inductie p 54 calculdm acum sumele parjale din entnful lemel pentru arborele T's sf le evaluam ket fluy= 170 kel2.m] fluy= flu)* + fad t+ fag)+ ~ > fia) 2 pentru cd ffuy)+ .. fla) 20 din relay (1) penteu seg(7) ka met flay Sta) fn, -) > 1 fy) + fn, Y= 1 0 pentru ch ffig)~ flim, od =-1 din relafia (i) pentra t@(P) (cuacesta am demonstrat relafia (ii) pentru 7) ke[nyt2n-l] Meas)» Has) .~ Hin, D> ft) — ~ fa) fal ~~ fad 2 0 pentru cd este relatie de tip (i) pentru dr(T) (cu aceasta am incheiat demonstrarea relatiilor (i) pentru D ben fle) Mi = feta, Mtn I~ ~~ Flt Ht litdd pentru cd este relajia (ii) pentru dr/T) (cu acesta am demonstrat si telafia (ii) pentru 7). qed ‘Teorema de caracterizare a similaritstii si echivatentet arborilor binari Teorema Fie To uy uy ue si Tuy) . u'y doi arbori binas dat in parcurgerile lor in preordine. Urtoarele afirreatii sunt adevarate: Va) Tsi 7" sunt similan (7'=7°) dact gi mumai dacd aver relile (8) Mu=téu') penta orice é aparindnd intervalutu (1, nf ru)=rfu')_ penta orice epartindnd intrvalului [7] (8) Psi 7” sunt echivalenti ("= 7") daca si numa dacd ever rela (©) Woalttu') pentru orice éapartindnd imtervalelul (1, fw)-=rw') pent orice { apartinind intervaluli (2, ) infotu)= infota') yertre orice ‘aparinénd intervalula 7, Demonstratie Este evident c& ¢ suficient sii demonstrim panctul (2), (6) ‘urménd imediat din definitia relafiei de echivalenid. ‘Vom face demonstrafia prin inductie dupi nm oumrul de nodur ale tui 7: n =O Dacé T'yi 7" suntsimilan, cam T= @ vom avea gi On" 0. Geci n= a" (Singura relatic din setul (S) care este de demonstrat in acest az) entra implicatia in sens contrar, din n= si =n" rezaltd n™0, deci tit 7 cit g) T° sunt viri, deci simian (primul cazal definitiei) nO Ipoteza de induetie ~ presupunem, pentru arbori cum nodurl, msn, 4, dacd sunt similar, atunct avem relanile (S) pentru nodule lor. Fic acum T'si 7" similari, 7 cu n noduri 1-0, Aceasta inseamnd ci plus avert (61) sig(D=sig(T) (b2)drrT=dr(T) Fie ny $i me numarul de noduri din sig() respectiv d(T), $i, analog 1 $1 1n', numarul de noduri din stg/1) respectiv dr(T"). Aver nol om $n l= | Din relatia de similaritate (01), aplicind ipoteza de induce (eaei serT) are mai putin de noduri) objinem relapale : np ‘tus Uw’) pentru orice tapartinand intervalutui (2, mr~ 1] iu) rha'y penta orice tapartindnd intervalulus /2,ne~ 1] Din relotia de similaritate (b2), aplicand ipoteza de inductic obtinem relaiile thug itu’ pentea orice ¢ apartinand intervalului fay 2. nj vig red) pentru oriee + aparinind intervaluhii [aye 2 2] Pundnd cap la cap aceste doud seturi de relati objinem pe de o parte non’, pe de alti parte toate egalitiile dorite intre functitle marca}, mai putin cele pentru primul nod 2, Si demonstrim 8 [/y= Iu’). Dac ((t)=0, atuned a0. deci nr 0, deci Ufu'y)~ 0, gi avem egalitatea dorit®. Dact IfnJ~ I atunei ye 0, dar n'e m),doci n'y # 0, deci Ifu'))= 7, si din now aver egalitatca dorit. Analog se demonstreazi ch rfu)= rfi'J. ceca ce inchcie dcmonsiralia unei implicati, Pentru implicafia in sens invers s& presupanem ca ipotczA de inducjic 2, dacd relatile de tip (S) sunt adevirate atunci arborii 7 st 7” sunt similar, unde T'are m noduri, iar 1. Pe de alth parte pentru 1pavem If")? si rfw's)=1. deci flu'y)=1, deci conform relatiei (ii) din Lema exist min(h: flu"). +ffi'yO}=m "1. Cum functile marcaj / si r sunt egale pe nodurile corespunaitoare din T si T*vorn avea si ft) -f(u'y pentru orice #« [,n), deci sumele parfiale pe ei doi arbori coincid, deci va coincide gi indicele pe care se amuleard prima oard, adic vom avea ny I= n'j=1,de unde n=’, QED. Teorema ne spune c& informafia completi despre strucuura unui arbore binar este cuprinst in vectoni infofl.n), Mtn] $ tft.n} mentionati ta ineepatul sectiunii, Cu alte cuvinte, din valorile acestor veetori se ponte reconsirui arborele, Mat mult, aver chiar 0 "metoda” de construct, care se poste transforma ugor in algoritm: calculém fii) Pentru fiecare nod, apoi sumele partiale pe rind, 1a prima care se anuleza am atlat ce nodunt confine Subarborele sting, ete Daca am avea doar sirul cdmputilor info de la parcurgerea arborelui binar in. preordine, informatia nu ar fi suficientt pentru a Teconstitul structura arborescenté. Lucrurile se schimbi insd dack am avea st lista cAmpurilor to ale parcurgent in inoedine, cu conditia ea arborele sa nu contind clei multipie Exeeeigit |. Serieyi un program care arc ca date de intrare vectorii mo, ! gir si constiuieste arborele binar corespunaitor. 2. Scrieit un program care are ca date de intrare un arbore binar $i construieste vector info, I gir. 3, Demonsiraji ca din parcurgerile in. preordine si inordine ale unui arbore binar se poate reconstitui structura arborescenta, 4, Sonefi un program care are ca date de intrare percurgerile in preerdine $i inordine ale unui arbore binar si construiaste arborele binar corespunzitor a 2.4. Arbori binari de cdotare Asborii binari sunt frecvent folosifi la reprezentarca unei multimi de date ale casei clemente sunt identificate printr-o cheie unica Daca aceasté cheie ia valori de un tip total ordonat, de exemplu intres sau caracter, ste posibils& “imbopitim” structura arborescent& cu rela de ordine intre chei. Daca am reprezenta aceleagi date print-o list, atunci 0 “imbogatie”” natural a structurii de list bazati pe ordinca dinwe chei ar fi lista ordoralt. Dupa cum am vizus, pe 0 list ordonatd se imbundtajeste performania operatic de clutare a une chei. Ea va fi ta camil media de doua ori mai mare pc o lista ordonata decat pe o list neordonata, ‘Ne punem intrebarea daca in cazul arborilor, in particular in cazul arborilor binar, exista un analog al listei ordonate. Un tip particular de bore biner, nuit arbore binar de efutare, este o stnictird conceputt ‘special pentru a imbundtiti operstia de cdutare a unei chei Definitie. Un arbore binar ale cérui chei iau valori de un Tip total ‘ordonat se aumeste urbore binar de céuare dack cheia fieckrui nod este mai mare decdit orice cheit din fiul stu sting si msi micé decht orice cheie din fiul su dept. Formal, intraun arbore bines ae elutare, pentru orice nod wal siiravem relstiile: G; infor] > infofv), penta orice ve tefifuj (2)infofuj < infolu), pesto orice weight) Si observim ef arf suficient ef impunem existenja tcestor celati de ordine intre un nod si descendensii sSi direefi. Cu alte suvinte, dac& 7 este tun arbore binar, cu chei de un tip total ordonat, gi cu proprictatea cd pentru orice nod wal sit avernrelaile= (U) infelul > infofreottefifuy)) (2°) infolu) < infofreotiright/u))) atunci relapiile (1) si (2) sunt adevarate si T este un arbore binar de cchutare, ‘Sa mai observim ed, din pricina inegalitfilor stricte de mai sus, intr? um arbore binar de ciutare asa cum a fost deGinit pan acum nu pot exista hei muliple; eu alte cuvinte, mu pot exista douk noduti care sf alba aceeasi valoare a cimpului info, Vom nami un asemenea arbore un arbore Dinar de cdutare strict. Problema cheilor multiple se poate rezolva in mai multe moduri, Daci cheile nu sunt insorte de alte date semnificative, ‘tunci am putca contoriza pur si simplu in fiecare nod numanul de aparitii " ale respectivei hei. Dacd inst cheile sunt insofite de alte date Semnificative si dorim s8 reprezentim efectiv cheile multiple in arbore ca noduri distincte, atunci puter folosi una din cele dous structuri de arbore binar de cfutare nestrict ‘Numim arbore binar de clutare nestrit fa stdnga un arbore binar 7 eu proptietatea c& in fecare nod wal stu avem relate: (3) énfolu) > info[), pentru orice ve let{u) (4) infofu) < infofw), pentru orice we right [ul ‘Analog, se defineste nojiunes de arbore binar de céulare nestrict la dreapta, ca whale: (5) infolu] > infol), portry orice ve lefiful (6) infofu} $ infolw), penta orice we right/u)- {a) Arbore binar de cutare strict (b) Arbore binar de clutare nestrict Ja dreapta. Cheile 22 si 44 suat chei multiple Fig.2.4.1. Exemple de arbon binari de cautare fin sfixpit, 0 alt proprictate important a arborilor binari de ciutare este aceea c& parcurgerea in inordine (SRD) a unui asemenea a:bore produce o listé ordonati crescator a cheilor. De aceca structura de arbore binar de cdutare este potriviti pentru setui de date pe care, De linga inceriri si stergeri, se cere destul de freevent ordcnarea totaléi a cheitor. (Ciutaren intr-un arbore binar de clutare intr-un arbore binar de chutare operajia de cdutare a unei chei se desfigoard in felul urmitor: se pomeyte de Ja ridicind in jos pe un drum. cate este determinat jn fiecare nod prin alegerea ramurii stingi saw ramurii drepte in funclie de reaultatul comparirit valerii edutate cu ‘cheia nodului respect. ‘Sd presupanem ci avem arborele binar de cautare reprezeatat in Pascal cu ajutorul tipurlor de date type pnod = T nod: ‘nod = record infosinteger, Teft, ight: prod end; © fimejie Pascal care implementeazi operatia de efutare a unet valori Yat, intr-un arbore binar de cdutare dat prin pointerul Root eétre radicina lui este urmatoarea function Los (Val: integer; Root: prod): pnod var found: boolean, besia found false, while (Root nil) and not found do begin if Root info = Val then found ~ true; else if Root? info > Val thea Root:= Root T lefi else Root Root T right end; Loc:= Root end. (function Loc} Functia Loc (Val, Root) va retuma valoarea mil daca cheia Val nu se piseste printre nodurile arborciui stu un pointer cltze nodul in care Sa gisit Fai in cazul coutarli eu succes. (Sa obseivim 6, fn acest din [- c % urmi caz programul returneazA prima apanitie 2 valori cAutate.) Ciutarea iterativa ce se desfigoari in ciclul while este aseminitoare clutiri de Ie liste infinquite. Ea este guvemath de dou condifii condifia de neterminare a structurii (pointeral Roor cu care facem parcurgerea si fie diferit de nil) si conditia de a nu fi gsit inc& valoares Clutaté, formulat’ cx ajutorul variabilei booleese found. SA ne reamintim faptul cd Ia structusi lineore aveam tehnica componente! rmarea) care ne permitea reducerea la jumtate a numénului de comperayii In cdutarea iterativa. O tehnicd similard se poste aplica si tn ‘azul arborilo:. Putem completa un arbore binar de cdutare cu un nod marca) la sfirsit, un nod la care sf fic legate toate ramurile arborelui, Completarea se poate face pur si simplu alocind spatiu pentra acest nou nod, mEnd si fcind tori pointer nl ai arborelui exalt cu mEnd. Fig.2.42. Arbore linar de clutare completat cu nod marcai la sfirsit La cdutare, se pune valoarea cautati in nedul marca). Procedura modificati de ciutare arata in felul ummator: function Loc (Val: integer, Root: pnod): pnd begin mEnd? info Val (se pune valoarea eluratd in nodal marcaj} while Root? info <> Val do if Val pt info then Searchlns (x, ptaighe) slee (aa fost gist gi se incrementeaza contorul) pheonter= pf.cortor + 1 cendproc (Searehlas) Procedura poate fi folosité de un program de copstrustic a unui arbore binar de clutare prin insert x je chei citite dintr-un figict, a cirui secventi principald este: begin {program constructie arbore binar de efutare prin inserdri repetate} Root ail {inifializarea arborclui cu arborele vid) while not cof do (dac& figierul este consola} begin read (x) Searchins (x, Root) end vy Dupa cum am vizut cdutarea se simplificd prin Iclositea unui nod marcaj la sfirgitul arborelui, mZnd. Daca folusim un asemenca nod, procedura de cfutare cu inserare devine: procedure Searchlns! (x: integer; var p: prod), begin if xpt info then Searchinc! (x, pt tight) else if p>mEnd then pl.contor= pf.contor+1 else (pr rnd, desi trebuie sh inserim} begin TON(p); with pf do begin right= mEnd end end, {Searchins Vor da in continuare okgisiune iteruiedls esutsni cu inserare. Ca $i in cera) inserdrii iterative ‘otro held ordonats. cButares trebuie fieutd parcurgind arborele cu doi pointen, p/ eatre nodul curent gi p? tot timpul ‘ou un pas in urma lui p/, e8ei inserarea propriv-zisf va fi ficutd cand p/ devine nil, caz in cate p2 va fi folosit pentru a lega nou! nod la restul arborelui O variabild suptimentars, d, va fi folositi pentnsa codifica direct care pleeim diatr-un nod pentru a gisi locul inseririi. Vor codifiea cut d=], dack am plecat fa stings i cu d-=+1, daci am plecat la dreapta ‘Astfel valoarea lui dine ve spune dad noul nod inserat apare ca fiu sting (d=-1) sau drept (d=~1) al lui p2. Deoarece lueraia tot pe varianta care contorizee24 cheile multiple putem folosi valoarea 6 a variabilei d pentru a codifica faptul cl valoarea x de inserat se piseste deja in arbore. a Procedure Scarchlastterativ (x: integer; root: pnod); var pl, p2; pnod; d: integer, begin {inipalizares pointerilor pentru parcuryere} p2= nil; pl: root, ‘while (p1 nil) and (d>0) do ifXp1} info then a= pl PL:= pl fight a=t else {x= phinfo} d=0 it plonil then (d°0 si am gisit x in arborele root deci trebuie incrementzt contonul| plf.contor == pf.contor+| else (p1=nil si ficem inserarea} beain newipt) with pif dobegin into x contor teft= nil right= nil end {legaces noului nod la tata} if p2=nil then {azul inserdnif intr-un arbore vid) root pl else if'd<0 then p2p left pl else p2p.right= pI end ‘endproc {procedura Searchinslterativ} Sa observam ca trebuie sf tratim separat cazul inseririi primului nod inarbore if p2=nil then root pl a Puter soipa de tratarca separatd a acestui caz Iuerind, ca $i in cazul istelor, ex arbori cu nod marca fa Inceput. Fointerul roor va indica catre acest nod marcaj, iar ful lui drept (de exemplu) va contine un pointer efire arborsle propriv-zis. inifializrea unui ascmenea arbore in Programul de creare prin inserini repetate se va face prin unmitoaren secventa: ‘new (Root Roott right := nil; Fa versiunea iterativa a cGuuirii cu inserare se va modifica initializarea parcurgeri si de asemenea se va simplifica legaree la tad a nou nod thusteam tn cele ce urmeaza crearea unui arbore binar de cAutare prin inserdri cepetete, GO © (3) @) (a) Se inserea2i 55 (b) Se insereaz 33 (c) Se insereazk 44 (6) Se insereazs 7 (e) Se insereaza 11 (0 Se insereazt 99 Fig2.4.3, Arborele binar de cautare rezultat din citirea 3i inseratea pe rinda cheilor : 55, 33, 44,77, 11,99, 65 (g) Se insereaz’ 66 Exercitii 1. Saise serie versiunea iterativa a cdutari cu inserare Intr-un arbore binar de cfutare cu nod marcaj la inceput. 2. Stise modifice procedurile de ciutare cu inserare astfe! inca rezultatul sa fie un arbore binar de cdutare nestrict la dreapta. Cu alte cuvinte cheile multiple sunt inserate efectiv (chiar daca gisim 0 che'e cu valoarea x in arbore contiavim sf efutim primul loc gol din subarborele drept $1 0 inserim efectiv acolo), iar cémpul contor dispare, 3. Scriefi o proceduri de cdutare intr-un arbore binar de cdutare nestrict la Greapta, care sf retumeze un pointer citre ukima aparifie a unei chei (prin ultima apanifie a unei chei multiple se infelege ultima cheie cu aceasté valoare care a fost inserath) 4. Dati o secventa de date de intrare care citite si inserate pe rind cu algoritmul de cdutare si inserare, sf conduct la arborele binar de cdutare din figura? 4.1 Alte operafii pe an arbore binar de cutare Reamintim cf un arbore binar de cdutare parcurs in inordine ne di © list ordonata crescitor a cheilor sale. De aceea arborele binar de ‘cdulare este o structuré de date potrivité si pentru sorta. Alte operatii care se implementeazd destul de ugor pe el sunt operatia de extragere a minimului si cea simetricd, de extragere 2 maximului, Dacd vera si psim nodul cu cheia cea mai mica dint-un 8 arbore binar de clutare trebuie s urmam cel mai hung drum de la radicind plecind mereu la stinga in fiecare nod, Similar, maximul se va isi in “extreitatea dreapid"2 arborelul ‘Unmndtoarea funciie retumeaz un pointer citre nodul care conjine ea mai mica cheie din arborcle binar de e&utare root function min (root: pod): prod: ‘var p: rnod: begin pe F00% ‘while ( p> il) and (pt Left <> nil) do poptlen nin end Dacé radicina roo! nu are fiv sting, functia va returna mi=root, ccdci in ridficind se giseste cea mai mica chee din arbore, Functia de fgésire 2 maximului este similard, decdt ci foce parcurgerca mergand ‘meres la éreapts Enercitit 1. Scrieii o Cunctie care retumneazd ua pointer eitre nodul eu valoarea maxims. 2 dengit 0 verstune seush arbore binar de cautare 3. Functioneaza algoritii de mai sus pe un arbore binar de cdutare restric? sBsied minimitoi (masientei) dintrain Stergeres unui nod dintr-vn arbore binar de ciutare Ne ocupam acum de probleme inversi inserisi, problema stergeril unui nod cu cheie data, x, dintr-un arbore binar de efutare. Dacé nodul cu ‘chela + nu are nici un fiu nevid sau are un singur fiu nevid, problema € simple singura fiu nevid (daca existd) se leagé la tatil nodulut cu chets ca Siu sting daca x a fost fu sting sau ca fiu drept daci x 2 fost fi rept. Diftcults}i apar cind avem de sters un nod care are ambit fi neviz © solusic care afseteaza cel mai putin forma generalii a arborclui ar fi si pstrdin nodul efectiv gi s8inlocuim doar valearea x cu 0 alt valoare, tot 8 din arbore, care si poatl jucs, ca gi x, colul de separator fntré valonie din subarborele stag si cele din subarborele drept al lui.x In continuare, prezentim 0 versiune recursivd 2 preceduii de ergere @ unui nod dinti-un arbore binar de cautare. Procedure Delete (x: integer, var p: lew), var q: leg, procedure Del (var ¢: leg); begin it right <> nil then Del (ef.right) else begin at.into: = info Qt-conior. = r].comtor qar r= rplet end end, (pr0e. Del} it then writela Nu am gisit’) else if pt info then Detete (x, pj right) lee begin (sterzcre pf} ane if qt right = nil then Pi ~gflett else if qi left = nil then B= qi-right else Del (q7.Lett) end end O variantd iterativi a cdutirii cu fergere @ unui nod dintr-un arbore binar de cdutare este implementatd de procedura SearchDel. Ee utilizenr! Proceducile Delete! 9i Delete? care sterg un nod cu un fiu, respectiv cu dot fii. s Procedure Search Del (x: integer; root: leg ); ‘var pl. p2, falseroot: leg: {(p1. p2 pointer eurenti,falzeroot pentru nod falstaainte de radacina } procedure Delete1(var p: leg) (Sterge un nod pf cu cel mult un succesor} begin if ph-teft= nit then P= phright else p:=pt.leh ‘end, (Delete 1} Procedure Delete 2(vat peg); (serge un nod pf eu doi suecesot ) {aut predeceserl in irordine al lui 9 jnfo mergand un pas a ste, apoi la dreapta cit se poste . Parcurgerea se face cur siq™ attr } wargcleg— (dl=-1<->r~at lef} | teger, dl =1 <>r~ gh right) an = prlef di;=-1 while 1 right <> nil do begin : aer ™ rhright; a=1 end (©) ph.infe =rtinfo; {Se copiac8 in pt valorile dia rt} pT contor = r7 contor, (©) [Se leap de tat, q, subarborele sting al lui r) if dl<0 then at left: = rt lef else af-right: = rf left } end; (Delete 2} begin (Search Del) new falseroot ); falsoroot} right: ~ root ; {adaugdm nod marcaj) pl: = root, pl = falsercot, @=1 found: = false while (p1e nil ) and not found do ‘begin “pl ifx pIt.info then begin =i plo plt.teft ani end; itvot found then “Naam gist * cise {found tue yi tebuic 98 sterg nodul p1t} tegin if (pl tleft=nil ) or (pl t-right = nil ) then Deletel (p1) {stergere caz |} else Delete 2(p1); {steraere caz 2} (legarea noulut nod pif de ati stu p21} ifa>0 then pat right: =p else pat tet = pt end end, {proceduie SearehDel} Cazull; Nodul de gters, p!f, are cel mult un fiu: *Noul” rod p!t retumat de Delete/, va fl acest fu (chiar dact este nil), Cazul 2: Nodul de sters pt, are doi fi: procedura Delete? v (@) cauth predecesonu in inordine al lui p2 info adic8 merge wn pas la stings, apoi le dreapta cit poate cu doi pointeri curenti r stg tatal Tur r, sia pentru codificat dacd fiul e stag sau orep. (b) copiaai in toate cimpurile lui p/, ott excepyia cmpunitor poimteri cktre Bi, valonile din r) {) leaga pe tatil fui rf, gt, de fiul sting al Ini r} (chiar daca © rif), in funette de valoarea Tui d7 La iesiree din Delete! sau Delete2, nodul pit este “noul” nod ‘obyinut prin Inlocuitea celui vechi dup caz El vebuie legat de tatil su, p2t, In funcyie de veloarea tui d ‘Se sterge 60. Unicul sku fu devine Se sterge 30. (@) Se cauth predecesonul in {nordine al Ini 50 in arbore, Eleste 40, @) Se steige predccesorul, care are col mult un fia uc’ 40 ca sicheie separatoare In Joout! lui $0. noul fiu sting al lui 70 88 5 QDS B @) © ©) @) @) C@QQ COO Se sierge30.Se inlocuiestecu —_Arborcle rezultat In uma ‘predecesonul in inondine, 20 ‘ergeri pe rind a cheilor 60, 30,30 Fig 244. Stergeri de noduri dintr-un arbore binar de cdutare Com plexitaten operatiitor pe un arbore binar de edutare Operatile de insesate st stergere de noduri inten arbore binar de =pt info) (i 9s inserarea cu teechlibrare pe ramura sting} if x>pt info then begin Search (x, pt-right, bh). ith then {2 cresout inflyunea ramurii crepte} case pT bal of fF; (cele dows ramuri ale lui pT audevenit egale} begin pt-bal=0, by end (0; (raxmura dreapaa © mai lung} pibal:=1 {hramane truc) 1: (reeckalibram} ‘begin false; gest sight: fat bale then (eazul simetric tui A ‘begin {rotatie DD} Ftvight= qT left ghieki-p: phbal~0, pa end else begin {rotatie DS raqliett aq -leftrt-ght, Tinght"9, pi night lef, Mlefi=p, if fT bal = +1 then begin pt babm-1, qT-bal=0 end else {gf bal =-1} bexin gf bal-+1, pT.bal:=0 end: por end phibal = 0; he=false; end; end{ease} end else (x= pt info gi incrementisn contoru!) ee re ae) Tainte de reasignazea tui p citte noua nidicind trebuie s8 caleulém nol Sector! de-echilibra in nodurile A (pt) si B (qt) in functie de ee amume $-2 inserat: nodul 4’sau nodul ¥, cu seeventa ifr} bal= 1 then (s-a inserat X} bevin at bs Ptba =} end flee {r1.bal=1, adick sa inscrat ‘Y) begin qf bal~-1 Pbal-~0 end (5) per {reasignarea poinerului cétre raddcina} payee spol caleulul factorului de echilibru pentru arborele din fizuce (B*) eechilibrat ptbat:=0 Feed de la sxborcie de tip (B) Ia (B*) poartd numele de rotaje SD (Stinga-Dreapta), Cele spuse mai sus se aplicd si pentru cazul in care se insercaza un rod nou pe subarborele drept al unui acbore de ridicina p* Vom aves Siurei ned dova cazuri in care trebuie sh facem recchilonses, Simetricele cazwrilor (A) gi (B), care se trateaz’ analog. Simevieu! cazulu (A) va conduce fa rorayie DD, iar al cazulni (B) Ia roterie DS 8 Procedura recursivt Search, p) care cauta sl eventual insereaz& un nod nou x in arborele de mdicina pf se va modifica In lista de Parametri mai apare o variabila booleand, 4, ce se transmite proceduriy apelatoare, cu semnificayia: ie { true, éact sa modifica inlhimes arborelui de radacing p * false, in caz contrat Observim ck in ambele cazuri de reechilitrase, inélyimea aiboretui feectilibrat este egala cu inilfimea arborelui dinsinte de inveqia care a stricat echilibrul, deci dupt reechilibrar A trobuic 8 la valoarea false Moditicarea procedurii Search re face in felul urnator: dupa flecare apel al ci, setesteaai h, iar dacd = rue, avem de traat cele tei valori ale lui p Mba Pentre nodurile unui arbore AVL vom folosi urmatoarele defini de tip: type leg = jmod, nod = record info:integer, left, ightleg bal1.1 end; Procedure rerursiva de incerare cu recchilibrare este prezentata in continuare. Ea este o modificare « procedurii recursive de clutare cu inserare Searchins prezentati in secjiunea 2.4 pentru arborele binar de lulare. Modifctrile apar la fatoarcerea dia apelutle recursive ewe (re inserari in subarborele sting, respectiv in cel dept Procedure Search (x:integer, var peg; var h boolean}; var quleg: begin ifp=nil then finserare ned} begin new(p), with pt do begin info, ket=nil, ‘Aight:=nil; ‘4 bal=0 {apere acim} end end | clse ifxpt info then begin ‘Search (x, pt-right,h); fh then {a creseut Infltimes ramurii drepte) case pl bal of Sy {cle dowd ranuri ale lui pT audevenit egale} begia pI.bal=0, hfal end ©; (ramura dreapia e rial tings} ptbal=1 (hrémane true} 1: {reechilibram} ‘begin gent cht, ifqi.bal=1 then {c begin {rotatie DI Phright™= aT lef gtieti=p phbal-0: pea end else begin (rotatie DS} ragi tert aq lettrT sight, rianght"a: plaright-*rh tent Plefi=p, ifrf.bal = +1 then begin ph bule=-1, qf bal:=0 end else {rT bal =-1} begin qf bal=+1; pT bal=0 end: per end pital =0; h=false; end; end {ease} end else (x - pt-info gi incrementim contorul) 3 simetric tut A} — Se insereazd 50 Se insereazt 40 Se insereaza 35 begin pfcontor=pcontor + 1, n=false Se insereaza 30, F nevoie de (eechilibrare in SO. Rotatie Ss, Se insereara 37. E nevoie de recchilibrare in 30. Rotatie DD. Se insereari 39. E nevoie de reechilibrare ‘in 40. Rotatie SD. Se insereazd 45 si 5S. Apoi se inserenzi 42. E nevoie do reechilibrare in 40, Rotatie DS. 7 Capitolul ILL Sortiri interne {Xe ocupim in acest capitol d= gresentares nor algoritml J& sonare mera Cu excephia algoritmului de sorare prin interelasar, “Sorts de sorare de vector din acest capitol au dows earatensts Comune esonfiale care fi grupeazA intr-o clast: Sater se fac an sx adi in aceleast Horan tn care 2 fost dat vector inifal Din acest moti algoritmal folosest= un numa’ math Ge toca! suplimentare (cite una pentru cei tei algoritm ect! # PERE Seared ou ansamble, i ceva mal emlte pentru sorarea Shel st Pes Quick Som) 3) eigorimii se bazsast pe compara sire ches, of1/S ai Pargegorimii care nu fae parte din aceasil clasd st 28 lgoritmel Bucket Sor: (cre sit in baza soni lexcouraice), Nerunes Tre trarsampl, sortarea prin nunrare,sortaren rin ifere Ase. Brtptdm inti tei algoritini direei de sortae: prin inser select qonimului (sau taaaimului) gi prin snterschimbareAnaliA% Seer orca deosebinle die eis! Ie evalusm complestatn in fURS1 asemantT Se comparati $1 sumarul de muti, oti te nt in cass Se Preaentém $i edieva inbanstijiny ale ler. dar Fontanini care nu pe scot din accasta clasa de cormplesiats ae ary rel algoritmi prezentali sunt mai performanli. Fiecare dintre of Le benencd pe unul cine algontraitdiecit Sutarcn Shell waic® Sioa oti qungand la performanya Of), Sortarea cu ansami’e 5° (zat pe seloctia minimuluimaxirmulut fotosind ponins secie® bessszts erboreseerth (arborele bina? partial ordomat si complet Pr sir mcamblul) de pe care extagerea minimalus e efectaaza in eee O11) Algocimal HeapSorsjunge atl 1s perfornanie O¢" Teg. aoe pide (QuickSort) se bazeazd pe interschimbsn # este de 80 SEO et Impera impirjind tol timpul vectorul de sortat in subvectot cave pot f soft independent. Cu prejul ura spatia fn psy hunge $ el Sn eazul mediu la performania O(i !og") ama sectiune prezintl operajia de iwerclasare a do! veclor! coedonati Este primal exemplu de operahie d¢ combinare = dowt Smetsht Spre deoscbire de algoritmii din clasa precedents, sonar bazat’ pe Spee esare foloseste spaliu suphmentar de cimensiunca spatial PEN inteclas cres iar operapile. de bazt sm mutinil, Mater fpregateste secfiunea $a capitolului unnitor 101 3.1. Sortarea prin insertie directa a primul pas iterativ al algoritmului se ia componenta 4/2/ si se insereaza la locul ei in vectoral sortat de lungime 7, A/1), producand un vector sortat de lungime 2. in general, la pasul iterativ jal algoritmului, vectonul este impaitit in douk: bueata 4/1), ... Afi) este sorta cresesior si se mumeste destinapie, ias Afi 1}, .., Afn] este nck nesortatd i se va numi sursd. Se i prima componentd din sursi, Afi+ J, $i se cautd sh se insereze la local ci in Gestinajie. Cautarea locului Tui Afi] in destinstie se face pareurgand destinapia de la dreapia la stinga si mutind pe rind cite o Pozitie la dreapta componertele care sunt mai mari decat valoarea de. Inserat, pind cind glsim locul valorit x ~ 4/++1) si o inser. Dupa executarea acestei operstii elementare numith pasd, dimensiuiea destinafei crests cu J, iar 2 sursei seade cu /. In fell acesta, dupa eXecutarea a 7-1 pag iterativ, intregul vector 4/).-n] va fi sont Algoritmul se serie in felul urmator Procedure InsDir (A) fori=2tonco x" Abi {s¢ caula locul valorii x in destinatie) jpsi-l; ‘while () > 0) and (x < A[j]) do Ali} AG) jae endwhile {inserarea lui x 1a locul lui} Alri=x endtor endgroc 102 nous destinajie noua sursi Fig3 1.1 La pasul a algortemaui prin insenare direct, pomim cu @ estinajic de ungime i. Se insereazi x de pe prima componentd a sursei la Jocul lui In destinefie, crescénd dimensiunea destinajil eu 1 Ne reamintim de la cdutarea secvengiala cd se poate elimina tostul de nedepisire al dimensiunii prin introducerea unei componente marca) fn cfargt s: plasarea valoni,cdutate pe aceasld component marca), Vorn introduce componenta 4/0) pe cate 0 vom folost drept components marca) pentru pasele ce parcurg destinatis. Programul modificat arata in felul urmator procedure InsDir lA} fori=2tondo (se introduce valoarea ia componenta mercaj} AO] Ali} {se cau lox! alr {in destinatie} isi, while (A[0] < AG) do AU+]= AG} init endwhile AG] Af} endfor eencineoe. 193 Cu utilizarea unci componente marca}, numdrul de comparat dintso pasa de inserhie sa redus la jumitate. ‘$4 mai observam ¢& accasif metodi de sortare este stabila: cheile gate apa in vocionul soriat In acceagiordne In care erau In vestont initial, Stabilitatea une ‘metode de sortare este « propnetate important eer iles cind sortim repetat dupa chei mall Complesitates sortiirii prin inserfie direct Vom estima complenitales acestui algoritm direct de sortare interna ce 7 pe algoritlor divest co urmeazi, in funciie de raat’ Ge compara C, simumdrul de mulisi de component, M,esima (CA Sie posi) fa fresare pas iteativ, chct commamagile i URE Sunt Speraile de bazk efectuate de acest algoritmi ‘Sc gecem acum la analiza vortini prin insertc direct. (a fiecare jean | (ou tel. -tel) al algoritmului, cind se insersans rae seven Affe ia Yul ei in destinafe sf notin eu Ci rama) te corner efecuat(presupunem ca lusim pe varianie eu Componctrt compara lavem cli o singura comparatic ce controlenz) cick] wile aa) esol inserani efecuand fi mui). C poate atinge o valoare sar wea, iJ, dach valoarea de inseral este cea si mist va Ven! T° Fritae componenth a sursei. poste ainge o valoae minimis To 1, Poi ara ge iment esie cea mai mare gi pezitia ei va fi ultima die ‘hous sures, iar valoarea medic a lui C, va fi +2. sas eam cu mumarul de mute efectuat de algoritm 1a pest stertiv caver regia M=Cr-1 intre mat gi compara, De fp veeeede din intenoral ciclului wile sunt in numar © C Tjgogd cele dout muta din afara Tui, plasarca valodi de ‘weet PS eee cas mara} la Ineeputul programului 3 plasarea te lod final Ja sfasital prograraul Tinknd cont de toate acestea, putem estima mumAne i maxim $i modu de compara si muti pe algontrwul in ansamble {avem rel pas, serativi) cx formutele Carl tbe domed pas! pas? past! umarol minim total de comparatii st atinge, dact se sunse aminimul la fecare pas, acrcare se itm dacd la fecare pes VARA aiarat ese cea rai rare, deci cind vector este deja ordonat recesion, Ave 104 Mau 2 2+ +2 = 2m) pas? pas2 pant Pentru numa minim de muta Nuroaru! maxim de compuratii si mutiri pe ansamblul algoritmilu se stinge decd avem mumnul maxim de comparai le eens Fas iteratv, deci in situaia in eae, la fiecare pas, valoarce ce insert coe ea mai mic’, deci vectoru! era sorta initial deso-eseator Insumand pentru cei n-/ pasi iterativi avern Cue deen MED Man 2346 tft MOOD. 1G, ofP 400d 2 Pentru numdrul mediu de comparafii si futini avem: nine) 1 _nen-2 - 2 9 ae ae Maan = Cnn + 801) = ™ EBR2 5 29q_ py) +9n=10 4 + 10s 3.2, Sortarea prin selectie direct Operatia pe care se bazeaz’ acest algoritm este cea de edutare liniard a minimului dintr-un vector, urmatt de plaserea acestui ruinimn Ia Nocul lui, adicd pe prima componenti, Este si ceca ce face algoritmul, I primul pas iteratv, Jn genera, la pasu iterativ/ al slgoritmului vectondl este imparit in doi subvecton: destinayia 4/1..i-1] ce Conyine titime puse la local lor de pasii anteriori, si sursa Aft), pe care se efectueazi 0 pasd, adic& se ‘autd secvential minimul din subvectorul surs8 si apoi se interschimba cu componenia 4/7). in felul ecesta dimensiunea destinatiei creste cur Jiara sursei scade corespunzdtor, Dupa n-f pasi iterativi vectorul 4 va fi somat erescitor, Un progam care implementeazi acest algoritm este de exemplu urmatorul: procedure SelDiqA) fori= 1 ton-l do {cdutarea seoventiala a minimului in A(i.n} } k= i mins Afi}, {initializeree minimului} forj= irl todo alg s4 if A{j] endif Tale endfor qe {schimbarea minimuui cu Ali} } ls Alk}= Afi} Al \= 0 Alil= min endfor endproe Evident, se poate aplica acelasi procedeu pentru selectarea prin lutare secvenjiala a maximului, urmsta de plasarea maximului la locul ‘sGu final in vector, caz in care destinayia se construiegte la eapStal din reapta al vectorului. : fof f= 84 resents 108 1 oa 4 OZ oe destnatie sus 1 Hii k a ©) QL noua destinajie noua urs Fig, 3.21. Sortarea prin selecte direct a minimulul, La pasul | $5 parcurge de ls stinga la drepta sursa,cdutind minimal (a) Dupl ce cesta sa gasit pe componenta fs interschimba A/] cu Afi | Sovtaea prin selestic dees a minimal pole fi considerata jnteun anume sens inversul sortdrii prin insertie direct. La flecare pas, inscnya duces ie wn element din sursl si inspecteazA o parte din lementcle din destinatie, pe cind selectia directh inspecteaza toate flementele din sursd gi plaseazd unul in destinatic. ‘Lungumea parcurgeni pe care o face insertia direct depinde de ‘yaloares de inserat, ca va fi maxima, deci toate elementele destirafici vor Mh inspectate, dacd valoarea de inserat este mai mica derattoste valorile din destinaic, In achimb, lungimen.parcurgerit pe care © face selectia Gieca pe sured este merou scezayi,egald cu dimensiunea Stsci Na vein nici o posiblitate de a evita aceasta, deoarece, pin nu terminam i parc rm ma stim dacd minimul local este si minim global pentr sus. ‘Complesitatea sortirii prin selectie direct La pasa! itemtiv (al algoritmulai se eavtd secvental minimul pe subvertorul 4(t.n),efecnsindurse compari cu toate elementele acestul Sibvector, comparayii in numir de ri, SA observim cf mumarul de eens eres indlenendert de ordinea initialé a componentelor, deci mu 107 sens, sortarea prin selectie directa se comport mai pula natural decit cea prin insertie directi. {ngumand pentru coi n-/ pai iterativi at Sigontnlu obfinem sumdrul tol de compara ee tu aver aceeasstusie tn cal mubiilor, al ror mumar deninge ¢¢ ‘Nu aver aceree! elon Pe de o parc, ln Score pa iteraiv i se fs co) seen ear (ele in afreclcl or fren. min “40 Mt at oe ate ARe~Ali) shale = min, Acosta ee sami Inceput, in se ainge dac8 in iferona cic or m = 25 286 ra ea ake cuvinte dach la parcurgrea subvecionul 4/47) toe mut, ou aN fame locale. zest Iya se intmp cd chile ile Tabs ae ewascy, ai deci Afi] este minim pen subreciow! silva po sung pens ee st ier ob nem Mane 3e de. 3°3(0-D. Men alts mai multe minime Toca in Afi] af 8) rule Seis 'wa face algorml, Caza cat rai netavorabil et 62) 12 eaten ponents ni steno vino locals eet care ieee crepe inarnpi ack cheils sunt date sil in foe ret, ao atune unr maxi de trie gsal v0 fe fda aeseresetcae A Tasumand pnt cei? asi tert bbe Muay LOVE S1 2183] 4A Last ain=tja t= suru mums mediu Ge mutie dim fr8 demonstra umBtoarcs estimane =n Y’ nde 7 este constanta lui Euler (= Bai 0,577 a pe ' 108 3.3, Sortarea prin interschimbare direct’ Pentru aceasta metodi de sonare directs operatia de baza (0 pas) este urmatoarea: parcurgem vectorul de la dreapta la stinga comparing doud clemente succesive A/i-I] si Afi), dac& Afi-1} < A[i] le Visim pe loc, dacd Afi-1)> Afi} le interschimbaim. Dup§ efectuarea unei asemenea pase pe intregul vectorul 4/7..n] vom avea pe comporenta 4//] rinimul in vector. De ce? Pentru c& minimul din vector ¢ intilnit la un moment dat de parcurgere gi interschimbat eu vecinul shu, din acest motiv intel st {in urmitoarea compwatie, ¢ din nou interschimbat, gi aga mai departe. fn felul acesta pasa fl impinge pana la locul lui final, pe componenta 4/7). Putem acum relua operapia pe 4/2.) gi, in urma efectuarit nei pase, minimul din acest subvector va fi plasat pe components 4/2. In general, la pasul iterativ ¢ al algoritmului aver subvectorul Alli] gata sortat si confinénd cele mai mici é-Ivalori din 4. Acest subvector se va juni destinatie. Efectuim o past de la dreapta la stinga pe sursa Afi.n]. iat rezultatul va fi impingerea minimului din acest ector pe pozitia Afi/. Crete fh felul acesta dimensiunea destinaliei cu /, iar cea a sursei sade corespunzitor. Dupd n-! past iterativi intregul Vector este sortat, Algoritmul sc mai numeste sonar cu bule (Bubble Som), denumirea fitnd inspirath de analogia dintre bulele unei baututi gazoase care se ridicd la suprafaga si clementele minime ale vectorutui ‘care “ured” la tocul lor. procedure InterschDi«(A} for j=2 to n do fori-=n downto j do if Afi-1] > Ail] then, interschimba (A[i-1}, Afi]) endif endfor endfor endproc, It wii a ‘A TAL Se cestinajie sts Fig. 33.1. Dupa /-! pagi iterativi destinapia are dimensiune i. Pasele se (ac pe sursé de la dreapta la sting 109 SA observa ef, daca ficem pase de la stings ia dreapta la acest algorim, atunci am pune maxim la locul lor final in vector in loc de minime. Cu alte cuvinte am constrai destinatia spre celllat capat al vectorului, L kok A 3 gurst destinatie aad Fig. 33.2. Algoritmul de sortare prin interschimbare direst, ‘cu pase de la stinga la dreapia, dupa n-k pasi iterati Sa observam cf, prin faptul c& face pase pe surst si au pe destinatie, cit si prin fapmulc& pune un minim: (sau maxim) la locul lui, algoritmol seaman cu cel de sortare prin selectie directi a minimului (respectiv » ‘maximului). ins, spre deoscbire de acesta din unm, care se mulfumeste sl plaseze minimul gi las pe loc toate celelate componente, cut excepfie celui cu care minimul este interschimbat, algoritmul de interschimbare direct face gi alte modifietri in structura sutsei, deplastind ji maxime, cite 0 component, spre locul lor final, Aceastd structure diferita. algoritmului ne permaitem s8-i aducem imbunatatin. (Una din imbundtitin se referd la posibilitatea reducerii numérului de /pagi Merativ, iar cealalté Ie scurtarea lungimii paselor, ambele imposibil dde efecruat Ia sortarea prin selectie directd. Le discutdm in continuare Observatia pe care se bazeaza prima imbunatitire a algoritmalui este Uurmitoarea: dacd la o pasd nui se face nici o interschimbare, atunci sursa este sortaid §i, cum si destinatia este, inseamni cf intregul vector A este sortat si este inatil si mai reluim pasele. Structura algoritmului se schimba. Vorn mengine o variebila suplimentari, Sch, in care contorizim interschimbirile efective de la 0 pas. Se trece lz pasa urmitoare numai acd la procedenta Scia fost diferit de 0. Ciclul respectiv exterior for din programul anterior devine acum un while care depinde si de aceasth variabild. procedure InterschDirl(A) {initializerca capétului din stinge al sursei) Sch= 1; {ca sd intrim in corpul wile la prima pas) while ( Aly] then interschimba (Afi-1], Ali) Sch:=Sch+ 1 endif endfor jie endwhile endproe Sa observim ca, la accastd versiune, ciclul for interior a rimas aproape neschimbat (cu exceptia contorizani interschimbérilor) In orice ccaz, a rimas de acceast lungime, fix, care este Iungimea sursei A/j.n). $i ea scade doar ou 1 de la un pas iteratiy le altul. O alta idee este sé tinem minte, nu numai faptul cA s-an ficut | efectiv interschimbir, dar si locul unde sa efectuat ultima interschimbare. Din acest loc, pan Ia destinafie, avem de-a face cu 0 bucata sortatd, deci e suficient s& reluim pasa urmnitoare de la n gi pind aici, Dach ultima interschimbare za fieut intre A/é-1] 91 A[k), atunci sursa pentru pasul unmator va fi A(k+ rt). Se schimbii deci si Iuagimea surselor. Codul care implementeaza gi aceasta modificare este | procedure interschDir2(A) 34; (nijiaizarea capatuiw din sig al sursei | while sn) co =m; while (12 j) do iC A(i-l}> A(i) then interschumba (A(i-l], Aft] ) ki. (finem minte locul interschimbiri) endif iid endwhile j= K+); {noul capat din stanga al sursei) endwhile endproc ultima interschimbare klk pe SSS =— cestinatie ‘noua surst Fig 33.3. Dimensianea noli surse in functie de loeul ultimei interschimbar. ‘Dupa cum observam mai devreme, pasele ce la dreapia la stinga duc valorile minime 12 local lor, iar valorile maxime avanseaza cu 0 pozilte spre locul lor final. Pasele fn sens invers, de la stings la dreapla ‘imping valon maxime la locul final si fac ca minimele sa avanseze cu 0 pozitie: O idee este s& alterndm directia pasclor. In felul acesta destinatia se construieste la ambele extremitafi ale vectonului, din minime. si ‘maxime puse la locul lor Sursa va fi A/lefi right) si, evident, vom tine cont gi de imbunititirea precedenta care micjoreaza sursa in functie de Jocul unde sa fSeut ultima interschimbare i left right 8 destinatie Su sestinane Fig. 3.34. La algoritmul ShakeSort, cu ditectia akernantd a paselor, destinatia se construieste la ambele capete ale vectonalu, procedure ShakeSori(A) left» 2: right:= n;{initiaizarea sursei} k= repeat (atita timp edt avem surs,adicd left < right) {pasa de la dreapta la sténga) for i= right downto left do 1 Afi] then interschimba (Ali-l}, Abi) kei endior left= k+1; {redefinirea extremei stingi a sursei} = cm na {pasd de ls stinga ta dreapta} for ism left to rightdo i€AG-1)> AG then interschima (Afi), Aly); ket endif endfor right= kel; {tedefinitea extremei drepte a sursei} until (lefi> right) endproc Complexitatea sortarii prin interschimbare direct Ca §i a sortarea prin selectie directh (si spre deoscbite de insenia direeta), numiirul de comparatii pe care-| face algoritmul Is Fiecare pas iterativ (este determinat de lungimea subvectonului sursa 4/i..n] pe care se fice 0 pasl si este independent de ordines cheilor. La pasul + algoritmul face C; = mJ comparatii, Insumind pentra cai m-/ pagi iterativi odtinem, =U riim I) 4 1 = 2 Inccea ce priveste numarul de mutiri, acesta depinde de ordinea initial a valorilor din vectori. Mutarile cunt dite da interschimbirile intre doud componente altiurate, care se fac daca relatin de ordire dintre ele ‘nu este cea dorita, Numnal minim de mutari la un pas iterativ este zero $1 se atinge dact nu se face nici o interschimbare, lueru care se inidmplé daca subvectonil sursi la acel pas iterativ este total orconat, Dacd vestonul era initial sortat cresedtor, atunei numdrul minim de muti se atinge Ia iecare pas iteratiy gi (sumind pe @ de n-J ori) objinem numrul minim total de muta Man~0. Pe de alth parte, numiinil maxim de rauiAri la pasul i se obfine cack se cfectueazs cite o interschimbare Ia ficcare compartic, lucru care se intimpli dack (ficénl pase de la dreapta la stinga) primul clement care intra fa compara, (nj, este minimul de pe aust Afton} si final est» pe components fi). Numirul maxim de muti la pasul f va fi dat de (-i)*3. Tnsumiind dup’ cei n-1 pasi iterativi cbjinem: in- 134i 234.4109 = 13 Numaul medi de mutiri la pasul 1 se atinge dacd doar pentra Jumitate din numarul de comparayi face imerschimbati, deci ver dee de formula ((m-1/-2}*2. Insumiind pentru cei n-1 pasi iteraivi objinem: f1-I) 4, (r~2) Ly4_3ntrl) Moog = Pa 93 4 Ogg bag a Smed 78a Fonte cab, STAM CH IN versiunea imbunstatitt ShakeSort, care schimbi si directa paselor, se atinge un aumdr minim de compari Coin = m-1 Tn cazul in care ‘vectorul este gata sortat creseaitor. us 3.4, Sortarea prin insertie cu micyorarea incrementului (Sortare Shell) in 1959 D.L. Shell a propus un algoritm de sortare bazat pe metoda prin inserjie dicectd, algeritm cu o performantl imbunititit decarece face comparsii intre chei mai distanjate din vector. Algoritmaul sorteaza mai inti prin insertic subvectori obtinufi din vectorul inifal prin extragerea componeatclor aflate la o distant h una de cealalss, distan}i care se numeste increment. Repetind procedeul pentru incrementi din ce in ce mai mici si, in final, pentru increracutul 7, s¢ obfine vestorul sortat, Mai precis, se considera un sir descrescator de numere naturale, numite incremenfi dinte care ultimul, f, este J: By > hy? 2 > hype Pm Le Algoritmul are umatoarea sructur (1) Se pomeste cu incrementul A,, (2) La pasul iterativ m se considerd incrementul fi . Se sorteazi prin inserfie directi subvectorii obtinuti din vectorul imjal ludnd elemente aflate la distanta /p, adic’ subvectoni ALL], Aftig= 1}, Al2hn? 1], AL2}, All 2]. Aha), Al Zh poi se reia pasul (2) pentru incremental hin Deoarece ultimul increment este Ay~/, ultimul pas iterativ ( se reduce la sortarea prin insertie ditecti, deci vectorul va fi sortat. Consideram incremenfii invodusi In componentele unui vector //7.t) Vom face sortirile prin insertie direct! folosind componente marca). Cum la pasul J vom avea de sonat //) subvectori, vom avea de alocat spaiu in plus de dimensiune 4/2). a4 3101 a ‘ 3 ‘patil pentra elementele Componentele marcaj de sortat Fie 34.1. Alocare de spatiu la sortarea Shell procedure SteliSort (A,h), form=1 totdo = h{m], (stabilim incremental} 5 fori k+1 1ondo xo ADT jek, if's =O thens=-k endif sas Als}= 8 while x ingofroorighi|uy)}, daca right fu) este nevid Se vede imediat c& putem caracteriza un arbore pamial max- cordon gi in modul urmator: pentru orice nod w avern relafile adevaate ‘infofy) > info[}, pentra oricare nod ve lefifu) tnfo[] > info}w], pentru oricare nad we right{u). © consecinji imediati a definitiei de mai sus este cA intron arbore partial max-ordonat elementul cu cheit maxima ce va afla in radicind, poate da o definitic analoagi nofiunii de arbore partial min- ordonat, $i intr-un asemenea arbore elementul cu cheia minima se va afla in midicing Reamintim din eapitolul If c& se numeste arbore (binar) complet Pe niveliri un arbore (binar) care ate toate nivelurile pline, eventual cu 7 exceptigultimului nivel, unde toate elementele sunt aliniste ce! mai la stings Arborii binasi compleri pe niveluri au aventajul e& pot fi Teprezentati neambiguu cu ajutoni! unui vector in care sunt menfinute cheile arborelui date in ordives pareurgerii lui in lajims: pe prima component ridicina, apoi elementele de pe nivelul urmaior in ordine de Ja stdnga la dreapta, g.a.m.d. Accast& reprezentarc ne permite 4 accesam din fiecare nod al arborelui atat fiul stang si cel drept, cft si tatél, Dack 4 este vectorul care menjine un asemenea arbore, atunei legitunie ‘menfionate sunt date de formulele simple: AfK] are ca fiu sting pe 4/2°k] ‘AfR] areca fiu drept pe A/2%% ~ 1) {atAl lui A/k/ este Afk av 2} De vreme ce avem $i legituri de tip “tats” insemna cl vam putea face, pe ‘ingA drumuri de le radcind i jos in arbore si rumuri de la un nod eate ‘édacina arborelui,Iucru pe care 1! vor exploata in cele ce urmeazi. In plus, idcina se ail pe componenta 4/1). ‘SA combintm acum cele dou proprictiti ale arborilor binari prezentate mai sus Definitic. Se numeste ansamblu (mai precis max-ansambiu) un srbore binar max-ordonat si complet pe niveluri, reprezentat ca vector. {Denumirea in limba engleza este Heap.) Analog se poate da definitia notiunii de min-asamblu In cele ce urmeaz& ne vom ocupa de studiul sructunii de max- ansamblu, cu operajiile specifice lui: inserarea, pe care se bazeaz’ si ‘operatia de creare, si mai ales operajia de extragete « maximului numité # decapitare, deoarece, maximul aflindu.se in ridicind, extragerea Iui revine la extragerea ridteinii, Taserarea intr-un ansamblu Algoritmul de inserare al unui nod now int-un ansamblu are ‘urmitoarea structurd simpl (1) Se pune nodul de inserat (nod) pe ultimul nivel al srborelui ali tai la sténga (in felul acesta arborele rimfine complet): (2) Se repeué (eventual pind la radacini) comparstie intre infofnod) gi infoftatefnod)) (2a) daca infofnod) < infoftotafnody} ature am terminst, e&ci am pisit locul lui ned in ansamblu (nous cheie nu violeaz’ condifia de arbore maxordonat) el ns (25) daca nu, interschimb nod eu fatalnod) si retutim de la (2a) ‘Dupi cum se vede, inserarea implicé o pareurgere, eventual incompleth, 2 unui dium de 1a ultimul nivel pnd la rédicinS, tn care numfrul de comparatil va fl propostional cu Iungimea drumului, Numarul de muti poate fi ficut aproape egal cu numénul de comparafii facand insererea ‘ropriu-zist a cheii abia cupé ce i-am glsitlocul final. Tlustrim in figurile urmatoare inserarea unei chei cu valoarea 70 intr-un ansamblu, punind in evident doar ramura pe care cheia isi cauté Jocul. La comparatia cu cheia 88 nu se mai continu crumul in sus, cheia 70 sica gisitlocul final ng © procedura care implementeaza algoritmal de inserare al valoni Vol in ansamblul Ans/1..n] este prezentata ia continuare. Ea parcurge ou un indice curent p o ramurd in sus, cdutand lecul fu Fal. procedure InsHeap(Ans, n, Val) {in ansamblul Ans/J..n] se insereazi Val) nwnri (creste dimensiunea ansamblului eu !) pon (p~ indice pentra nodul curent; ce inifializear) ‘while p>1 do {cat timp mu am ajuns la ridicind) Tata=p div 2 if ValeAns{Tata} then ‘Ans{p}:~Val {se insereaza} (cazul (e)) ext fam terminat} else ‘Ans(p}~Ans{Tata] (se coboaré ttal in lecul Gulu} pevTata {nodul curent se resctualizenz’} endif endwiil Ans[!]:-Val endpcoc wserarea in radicinij {eazal (h)} Uservatie: inserareu propriu-tisd a valorii Vai se face doar dupa ce iam ‘isitlocui. fie inu-un nod interior (cazul (a)), fie in radeind (cazul (b)}, Construirea uaui ansamblu, Asambiarea, Operajia de constructic a unui ansamblu se face, ca toate operayiile pe multimi dinamice discutate pind acum, prin insert repetat. ‘daca avem cel pujin o cheie, atunci ea se va insera in rAdacind (cAci un arbore eu un nod este ansamblu) “putt flecare valoore noul se apeleazd algoritmul de inserare InsHlea ‘© operatic specified cste constrairea unui ansamblu din inserari repetate de chei care se afi deja in locafiile unui vector. Ea se mumeste asamblare ¢ este implementatd de algoritmul urmitor -A(LJesteansamblu ja fiecare pas iterativ j se apeleaza procedura de inserare in ansamblot Allug] valor A[i+t], pentsa j= 1,1 procedure Asambiare (A, n) for}=1 ton-l do InsHeap (A, j, Afi*1]) endfor endproc llustrim in continuare construicea unui ansemblu din urmatoarele chei citite gi inserate pe rind: 44, 30, 50, 22, 60, Ultima valoare inseraté 60 trebuie €& urce pina la rid&cind m1 Extragerea maximului sau decapitarea unui ansamblu Evident, pe Tingl extragerea propriuwrist, ne intereseazA refacerea structurit de ansamblu: Algoritmaul de excragere are structura, (1) Se extrage valoarea din ridicind (in vederea unei proces&ri) (2) Se inlocuieste ridicina eu ultimal nod (srborele binar ramane complet, dar eventual na msi e max-ordonat) G) Se “coboart” nous ridacint la locul ci prin comparsfii cu cel mai ‘mare dintre fi procedure DelHfeap (Ans, n, Val) Val=Ans[1} {extragerea radacinii} (Lastultimui elemert din ansamblu ce trebuie inserat in r8dscing, spot tebuie sd clutim locul lui} Last:=Ans{a} ne=n-i {scade dimensiunea ansamblului} {c&utém locul lui Last in ansamblu, cu p indice nod curent, iat |, r indici Pentru fiu sting, respectiv drept} pol; [=2, r=3 (initializarea indicitor eurenti de te rédicina) “while (re=n) do (test de nedepagire a dimensiuni: ansemblului) ‘if (Las>=Aasfl}) and (Last>-~Ansfr)) then ‘Ans{p]--Last {inserarea} ‘exit {am terminat} enait if Ans(i}>-Ans{r] then (continuam pe ramura stinga) Ans{p]:"Aas[l] pr {reactualizarea lui p} else {continuam pe ramura dreapt} Ansfp]-=Ansfr] por {reactualizarea hui p} ; (reactualizarea flor lui p) if (I-n) and (Last x (b) Se pareurge de ta dreapta Ja stinga vectorul, lastnd pe loc corponenele 4 popritaes fj], pla primal nee / peas care Afi) <5 (3) Daca i x, pentru orice k €/j-1..n} si, de asemenca, fi relatile care rezultd din cele precedente: Ale] ~ x, pentru orice k e [j= 1.1]. Presupunem datd o proceduri care interschimbi dou valori date, w giv procedure Interschimba(u,v). var w.facelasi tip ea u si v}{locatia suplimentara} begin WU Uy Wy end 136 Procedura de partitic care implementeaza algoritmul de partijie deseris tani sus pe subvectorul d/Lef..Right/ este wmitoarea: procedure Partition(Len, Right: inci), {iLeft=indicele curent pentru parcurgerea (2a)} {iRigh’indicele cusent peniru pareurgerea (2b)} (nitializarea indicilor curenti pentru parcurger}) iLeft=Left; Right=Right, {algerea pivotulut in pozitie median) x=Al(Left+Right div 2]; (pastitia) repeat Qa)while AliLeft} x do ‘Right = iRight - 1; endwhile (3) if Left <= Right then Interschimba(AiLen}, AURigh)), iLeft= Left], | iRight:= iRaght-1; endif until (iLeft> iRight) endproc {Partition} e) (Qa). 1 (2b) go (ab) 1 wd Alo a ti valori x Fig3 6.1. Procedura de partitionare, Deoarece valearea pivot x a actionat ca un separator, putem acum si sortim in situ in mod independent cei doi subvecton’ objinuti pein radtitinmare efi valovile lor nu se mai amostecd, iar concatenarea eo rezaltatclor ve duce ta obfinerea vectorului 4 somtat, Ce meted si fplicam pe subvectosi obfiaufi prin partite? Putem aplica flecdruin provedurt de partie, apoi inca odat subvectorilor cezalati, si aga mai Scparte, pind ajungem la subvectori de lungime 1 eare sunt gata sorta ‘aceasta este ideea algoritmului QuickSort, care foloseste partifionarea, pentru sorta. Vorn avea mai multe versiuni ale algoritmulsi de sortare rapici in fanctie de alegerea pivotului $1 in functie de metods de prelucrare a subvectorilor rezultali din parufii. In ceea ce priveste alegerca valor pivot, putem opta intre: valoarez aflalé pe componenta mediand, © Naloare aleast in mod aleator de pe una din componente, sau 0 valoare eflotd la una din extremitafile vectorului, Prezentam deocamdata figoritmu! bazat pe alegerea valorii mediene ca pivot. Schimbiri Scnunificative in provedura de partie apar doar la alegerea pivotului la 0 extremitat, Th oces ce priveste modul de prelucrare al subvectoritor obfinuii din pamtiji avem de oplat intre: (o) a folosi recursia, facdind cate un ape - enttu fiocare subvector rezultat, (b) o versiune jterativa, in care si rrenfinem inif-0 stiva eapetcle subvectonler ce ramin de process (c) Combinafii intre prelucran iterative i preluorés, cu opeluri recursive ‘Alegerea nul tip de preiucrare sau al altuia dopinde de considerente fegate de spatiu, c&ci stiva, fie cea gestionais explicit in program, eft $1 cea impliciti westionati de Tecursie ocupa sputiu suplimentar, © caractenitic# a acestui tip de sortare cc trebuie Iuata in considerate Dam in continvare 0 provedurh QuickSortfec care implementeszs algoritmul de sortare rapid. Ea utlizeaza provedura recursiva QSordRee Care face parttia pe. subvectorul 4/Left. Right] si apoi foloseste apelus Feoursive pentru prelucratea subitervalelor rezuitate. In corpal principal al procedurii QuickSoriRec aver un singur apel, QSortKee(!.1). procedure QuickSorRec(A) procedure QSortRec(Leit, Right: indict) (partitia(codul din corpul procedurii Parttion)} aLefi; j=Right sc=Al(LofteRight)div 2); repeat while Afi] x do 3 fi ), {apelun recursive pentru subvectoriirezultati) if Left = until Stack = @ endproc {QuickSeriter]} ight Exercitit 1. Siise scrie in cod 0 procedurd Partition(Lefi, Right, i) care SB posta fi apelsta de procedutile QsoriRec (in versiunea din text este dat codul pentru partite), QuickSoritter si QuckSordtert. 2, Sh se modifice procedura QuickSoriter/ astfel tocat intervalele cecle mai lungi s& fic depuse in stivi, iar ecle mai scurte sa fie relate Ia preluerare dircet 3. Sh se serie in cod procedutile QuickSorlter si QuickSortiter!, nemodularizate, cu stiva Stack in alocare staticd reprezentatl printr-un vector eu componeite de tip. z ype interval ~ recdrd eR, right: indici; end 130 O alta slegere # pivotului penten sortarca rapids and acum am ales ca pivot valoarea mediand din vectorul pe care facem pattfia. Ce se intimpla daca alegem 0 valoare situara la una din cextrernitafi? SO presupunem 4, pentru partijionarea vectorului A/Left.Right) alegem x-A[Left]. Atunci pasul (22) din algoritmul de_partiionare (parcurgerea de la stinga la dreapta a vectorului pind le primul indice + pentru care Afi) > x) nu mai are sens, cfci acest indice este chiar Left Executim (9b), adied parcurgem de la dreapta la stinga vestorul pint le primal indice / pentru care A/j) lee) do isi end while if Aflce] > Abi] thes Inierschimbs(loc}, AU) loc j endif {parcurgerea de la stings la dreapta, urmata de iaterschimbare} while (Ali] <> Alloc}) and (1 > toe) do isitt end while Af ALJ > Afloc] then Interschimba (Afloc}, A[i]) loci endif end while end {Partition2) © veisiune recussivi a sortirii rapide ce foloseste procedura Partivon2, analoaga lui QSoreRec, este urmatoorca Procedure QSortRec2(Lef, Right) Partition2(Left, Right, loc), if Left <(loc-1) then QSortRec? (Left, loc-1), if (loc+1) < Right then QSortRec2(loc* 1, Right) endproc{QSortRec2} Pentru a sorta vectorul A se ice apelul QSortRec2/I.n). Exercitii 1. S& se serie versiunile iterative ale sortirii rapide ce folosesc procedura Partition? Complexitatea sortirii rapide Vor evalua complexitates acestui algoritm in funcie de timpul de rulare care depinde in mod esential de mumarul de comparafi, si im Funetie de necesititile de spatiu in plus Pentnu fiecare alegere a une! valori pivot x ficem la procedura de partifie us numir de n comparajii. Numérul acssta rimane constant la 2 fiecare pasi 2 algoritmului. Mai departe performenta lui depind: de uri de sub-intervale pe care le genereaz& parti, Daca fiecare partfie injumatajeste intervatul pe cate se face (cazul cel mai favorabil), atunei yom avea un numa total de /ogsn subintervale de procesat, deci numirul total de comparapii este de ordinul lui Ofntogm). Tot aceasta este performanta si in cazul medi, Putem uvea si cazul cel mai nefavorabil, clind fiecare pivot ales x este maximul sau minimul din subinterval, Atunci, la fiecare panttie se genereaza un subinterval de lungime 1 si unul de tungime »-/, deci avem ‘un numar total de intervale de prelucrat. Numfrul total de comparafi va fin acest caz de ontinul lui Ofn’), exact ca gi performanta algoritmilor ditecs alta caracteristic& « acestui algoritm este faptul ca necesita spari ‘in plus pentra menjinerea subintervalelor. Atit versitmile iterative, care sestioneaza explicit stiva ce menjine intervalete, cat si cele recursive, au nevoie de acest spafiu suplimentar, Aplicatic a procedurii de partitie la gasirea medianci Mediana unui vector este acea yaloare dintre componeatele sale care este mai mare decét jumatatea din componente si mai mica decat cealalta jumatate: Dac& am sorta intéi vertnnit, stunci mediana car gisi le mijlocul vectorului. Vrem si gisim insk aceasta valosre fir a sorta intregul veetor. Problema se gencralizeaza la pisirea valorii a ke dinte-un vecior, cea care este mai niare decit k- componente gi mai mic& deeit n-i componente, pe scurt, cea care ar ocupa locatia 4/k] in vectorul sortat, fird a sorta Thiregul vector. CA. R. Hoare a propus un algoritm care se bareasA pe procedura de partitie 2 sortini rapide. Se eplic& procedura de partie pe Tatrcgul vector, deci Left=! si Right=n, cu valonrea pivot x ~ A[k),Indieii gi eu care se termini partifia au proprietifile §> (cele dowd parcurgeri sau fntdlait) Afs] S x, pentru orice s<1 Als) & 5, pentru orice s >) ‘Aver tei cazuri posibile pentny indicele in raport cu indicii si y 3 () j Afk]. Panition (Left, Right, i,j); if} dimA then (s-a epuizatsurse A} {muté in C.componentcte simase ia B} fork = 0 to dimB - iB do C{iC + k] = BEB +] else (s-2 epuizat sursa B} (amuta in C componeatele ramase ia A} fork =0 to dimA - iA do CiC+ k}=AliA +] endif ‘endproc 6 Complexitatea algoritmului de iaterctasare: timp gi pati Estimdan complexitatea tnidi in functie de numinul de comparatit 1a fiecare comparatie se muti in C 0 Valoare, care nu va mai fi examinatt terior de algoritm. Pentru a completa toate cele dima + dimB locajit ale estinapiei C, vom face deci cel putin dima + dimB - 1 eomparasit (altima component ce muti in C, firk a mai fi comparat8), Tn felul acesia, numiral maxim de comparatii pe care Hl face algoritmul de interclasare este Cmax did + dimB - 1. Este camul cel mat nefwvorabil, care se atinge daci ultimele componente ale sursclor rebule si fie comparate intre cle, deci dack A/dimA] si BfdimB) vor fi cele mai mari clemente din C. Existi $f cazul cel mai favorabil, cu numfr minim de comparati Com = minidimA, dimB), caz care se atinge cud vectorul surst de dimensiune mai mici are toate componentele mai mici deedt cele din a doua sursi. Dact de exempha dimB < dima si B{dimB) sA-1} and (iB dimA + sA - 1 then (5-2 terminat vectorul A} {complettin pe C cu B} fork :~ 1.10 dimB + sB iB - t do CIC +k]-= BB + k] else (sa torminat vectorul B} {completem pe C cu A} fork: =I todimA +A -iA-1 do CLC +k}: = AGIA + K] ‘end; {procedure Merge) sh LEA, dima 5B Lia) ims xc dimASdimB procedure MergePass (n, |, A, Bl; (Se di vectorul 4, de dimensiune n, imp&ijit in subvectori de vectori de lungime / (eventual ca exceptis ukiimului, care poate f mai seurt) sorta Fiecare peteche de subvecior este ordonata prin interolasare folosind procedura Merge. Rezultatul se depuse in B.] beein @:= ni (shi |); (q~numarul perechilor de subvectori introgi } S:=(1*q)}shi i: (s=1* q*2 = numirul de elermente in cele perechi) rosn-s, (r= numinl de elemente rimase dup interclasarea celor 4 perechi) {interclasarea celor ¢ perechi de eubvectori intregi) fori:=1104d0 begin 19 SA: = ((-1)* 1) sall + 1; (indicele de la care incepe al i-les vector de interelasat} Merge (I, 1,58, SA + 1,34, A, A,B) end; {ce Cacem cu restal componenteior?) if <= | then {cazul in care mi-a rmas un singur subvector} for i:=1 todo Bis+i}:=A [+i] else (cazul in care mi-au rdmas2 subvectori ultimul incomplet) Merge (,r-1,s¢1,¢+1+ 1,541, 4,A,B) end {procedure MergePass} procedure MergeSont (dima, A), begin Let, while 1 m. Atborele Teste compus dintr-un nod ridacind, intern, i fiii sii sting 51 drept, 7° 9/ 7%, care sunt la rindul lor subarbori binari stricfi, Notind cu Ni, Me, Lf Let caracteristicile tui 7 si cu Mf, NA LS Lee ‘caracteristicile lui 7%, putem exprima caracteristicile lui T In functic de caracteristicile fllor sti prin urmatoarcle relayii (i) MMi + NFS (2) Ne=Ne + Nee Q) Les Lg + Ne + Le NE 4) Lim Li + Ni + LT + NE Ultimele dou’ relayii rezulta din faptul c& drumul in 7 pind la un nod x, de orice tip, x aparfinand de exemplu lui T*, este egal cu drumal de Ja ridicina lui 7* pana la x, la care se adauga arcul de la ridacina lui T la ridécina lui 7, Subarborii 7* gi 74 au un numér total de noduni strict mai mic cecit 7, deci lor le puter aplica ipoteza de inducjie gi avem relayile adevasate Calculn acum lungimea eaternd a lui 7, plecdnd de la reiatia (3) i aplicdnd inti (5) $1(6). Avern bg Le = Nem bel = NE =U MPO NP =o NP Lit unde, pentru ultima egalitate, am grupat termenii si am aplicat relajia stabilit& in propozijie | arborilor 7* si 7”. Tinand cont de expresia din prima paranteed, putem aplica (4) si avem deci in continua. Le= Ly + 2(Ni + Ni * 1) = Ly + 2Nr unde, pentru ultima egalitate am aplicat relafia (1). Roe incheie demonstratia prin inductie a formulei din enun}. aed. Propozitia 3. Intr-un arbore binar strict de adincime d avem urmétoarea inegalitate Ist ne ta demonstrarea Demonseragie, Incgalitatea din enun) urmatoarelor afirmasi {@) Dintre tof arbori binari strioji de edincims dati, d, cel cu oumsr smaxirn de franze este cel care are toate frunzelc la vitimel nivel (adid d}. (b) Un arbore cu toate frunzele la nivelul dare exact 2 frunze, adica New ‘Afirmatia (a) este imediats, Demonstrim (b) prin inductie dup valorile tui a Pentru d = 0 aver azul arborelut cu ua singur nod, de tip frunza gi relatia se verficd Pentru d ~ / avem un arbore binar strict cu un singur nod interior, ridicina ji dowd frunze gi din nou relalia se verifica Presupunem c& pentru d = &, numérul de frunze (aflate toate la nivelul &) eite Ne ~ Putem constrai dint-un asemenes arbore. in mod foarte simple si divect, un arbore binar strict care are adincime «/ = k + 1 si proprietatea cc toate frunzele sunt la nivelul k + J. Se Tnlocvieste ficeare frunza de la hivelul & cu un nod interior, iar acestora Ii se atngeasa cate dows Frunze, procedeu care produce un arbore cu de dou oni rai multe frunze cecit Precedentul. Deci, pentru arborele de udincime i ~ / gi toate frunzete la crest nivel avem Ne= 2° 2 = 2”!, coca ce inchcie demonstrat. qe. st este urmitorul Un corolar extrem de unt al rezultarului prece: Cotolar. Intrun arbore binar stot de adanctme d sven inegalitates Denonstrajte, Imediati din relajia stabilité in propozitia antenoaré, Nest? céreia fi aplicaim functia erescatoare fogs, iar apo! functia parte inveapa superioara $i objinem ceare ¢ chiar roletia din emmt qed (a) ®) Notiim cu Ze lungimes exter a {ui 7 $i cu Le" tungimen extern SMT Lepatura dintre 2," Fa di kseexprimns prin relajia bee “OE B+ PRAY. Gee yy lungimea extemd se minimiscaae Fr aay ate abori i céror funa Sunt Tepartizate pe-cel mult dou niveluri adiacente. ocd. Demonstratie. Aver de watat dous C#218i peotra care se atinge lungimes extema minima, 2 ,Cizulin care tonte func suet a atl nivel e Aniaei f= 24 SSSI d~ te (unde peste noua er Jogaritmul in taza 2) In azul acess, tungimen cece {ste datd de formate Le~i*d~i tig) Unde in parten dreapti aveascxace ate? expres’ din enw, deosrece Ano, QP Dict frimzele mu sunt toate Ip Scelasi nivel, arunci, conform He Pe dowd niveluri adiscente, dsid— J. Iy acest caz, sna pases 2 vom ava hed a ligt sid 1 = Lis? 154 Cand caleulim Ze, ajungem ta nivelul d ~ / si suma lungimilor drumurilor pint acolo se exprima prin Ifd ~ 1), Pentrs nodurile de la acest nivel, care sunt frunze, calcalul s-a terminat Mai trebuie sk estimam acum num&rul de frunze dela niveluld, deoarece Lg=U(d ~ 1) + nuemiral de frunze de la nivelul d Dar, numirul de frunze de la nivelul d este dublul numarului de nodurj interioare de la nivelul d — /, iar acesta din unn’ este egal ou 1-2") Talocuind in expresia de mai sus, objinem Le (d~ 1) + 20-P-') exact coca ce tcbuia demonstiat. qed. Urmatoru! rezultat ne dao margine inferioard penta lungimea exiemd medie a unui arbore binar strict In functie de numdrul total de frunze, Propozitia 6. inti-un arbore binar sinct avem urmatoorea inegalitate: Leet ital). Demonstratie, Prin \ungime medic intelegen media raponati la rhumirul de fume. Deoarecz am estimat in Propozitia $ turgimea ‘minima, putem estima acum media ei $i ebjinem LP > (gli - 20 2i*" 1 Ultimul termen al sumei este un numir pozit sinal de inegalitayi subunitar gi avem Lert > ayn > ligt (unde prima inegalitate este evident), ceea ce ne conduce la inegalitatea din enun, qed, 158 4.2. Limita inferioara a algoritmilor de sortare bazafi pe comparatii intre chei Compiexitatea unui slgoritm de sortare imterné este 0 miisuri a Nimpului de rulare al algoritmului ia functie de mn, numinil elementelor vectorului de sortat. Algortimii de sortare interna dintre care enumerai: sortarea direoth prin inserpie sortarca directé prin selectia minimului (sau maximului) sortarea directa prin interschimbare sortarea rapid (QuickSort) sortarca cu ansamble (HeapSort) efectucazé comparatii intere chei, interschimbari de chei si operatit de asignare ce valori. Ultimele douk operatii le-am evaluat in funetie de numiral de mutéri. Numénil mutirilor depinde in mod esential de rnumérul ce comparati, deci complexitatea algoritmilor e¢ estimeszs in ‘mod esential in funcfie de numarul de comparati Stim of primii trei algoritmi de mai sus au o complexitate de ordinul lui »?. Sunt algontaai dirccpi, simpli, dar relativ. neperformanti Unnitorii dei, sortarea rapida gi sorterea cu ansamble au performante ‘mult mai bune si anume de ordinul lui n fog Vom demonstra in continuare un rezultat care aratt cd: mu puter cobori sub limita n fogya, cu alte cuvinte, ca mu putem gisi algoritmi de sortare in clasa celor barati pe comparatiiintre chci_mai performanti Teorema, Orice algoritm de sortare a n chei, algoritm bazat pe Sonicare fate chei, va face cel putin a) {log. n!| comparatii in cazul cel mai nefavorabil by [Jog, n!] comparatii in cazul mediu. Demonstrapic. Cheia demonswani accsnul reaultat este structura de arbore binar strict cu proprietapile sale Presapunem ca lucrim cu algoritmi pentru care datele de intrare sunt vector: de lungime n, (ci, 22... 9), cu componentele presupuse distincte. Reamintim cd lucram cu algoritmi bazati pe compara de tipul +1 S 1% Unui asemenca algoritm i se asociaza un arbore de decizie in ‘modul urmator: a) ointructiune de iesite va fio frunzé ce confine vectorul sortat; ae sap emt eg tet 186 b) © comparafic x ~ 2 va fi un nod interior, al c&rui fis sting este un arbore asociat insiructiunilor ce sc excousl daca x; <4, cote adevareta, jar fiul drept este arborele asociatirsinicjiuailor ce se exccuta daca ay <4 este fas ©) Putem presupune c& acest arbore este binar strict, deoarece, dac un nod interior are un singur fiu, pute inlocui nodul cu acest fu, objinind arborele’ de decizie al unui algoritm eel putin Ia fel de ficient ea cel initial Numirul total al instrucfiunilor de iegire si deci al fronzelor ve fi numarul total de ordini posibile pe vectorul (xy, .. x9) deci n!. Pe un set particular de date de intrare, actiunca algoritmului este echivalenta cu parcurgerea unui drum de la ridiciaa péng ta frunza ce confine respectivul set de date ordonat. Numarul de comparafii efectuate este egal cu numirut de nodun interioare pe acest drum, care este egal cu lungimea acestu' drum masurata in arce, (Vezi fig 4.1.6 pentru n=3.) Dacd vrem si estimim numdrul de comparapii pe care il face slgoritmal in cazul mediv, aceasta revine la a estima numéral mediu de noduri interioate pe toate drumurile, cu alte cuvinte lungimea externé edie a arborelui binar strict de decizie asociat Daci vem si estimdm numérul de comperatit in cazul cel mai riefaverabil, sceasta revine Ia a estima namAnal de noduri interiosre pe drumul cel mai lung pana ia 0 frunza Daca vrem si estimam numanil de comperai in cazul cel mai favorabil, aceasta revine la a estima numarul de noduri inerioare pe drumul cel mai scurt ja 0 franz Reamintim cd arborele nostru de decizie este un arbore binar strict cu ni frunze. Din Propozijia G avem c3 lungimes exter medie @ unui asemenes arbore este mai mare decdt [log, m!| , deci in cazul mediu un algoritm de sonare bazat pe comparayit face-cel putin |Log, nl] ‘compara, cea ce incheie demonstrat airmatiei (b) Pentre a demonstra afirmafia (a), ne reamnintim ¢& drumucile eele wai pind la o frunv sunt aga pentru frunzele aflate ta cltimal nivel, d~adincimes arborelui, iar Corolaru! la Propozitia 3 stabileste cl dz fio; a], ceea ce incheie demostrajia afirmatiei (a) QED. 1st 43. Arbori binari strieti cu pouderi. Algoritmul Ini Huffman Fie un arbore binar strict, 7, cu mulfimea frunzelor E = =(aiya,..,@uJ. El se va mumi ex ponderi daca existh 0 funefie cu valori reale w:E > R, eu alte cuvinte, éack fiecare frunzi @, are asociat un rumir real w, aumit ponderea ei. ‘Reamintim cl lungimea extern& a lui Teste Sp /0, 1}* ca mai sus se prelungeste in mod ‘natural Ia muljimea cuvintelor peste ¥, adica a 0 funcyed:¥* > (0, 1}*, prin formula Ffaias nj “= eladelar) lay) Accasta Inseamné: codul asociat cuvintului ajay a, se obtine ‘concatendind codurile ieee litere in parte, evident in ordinea in care ele apar in cuvant. $1 functia extinsa ¢ are proprictatea de injectivitate gi o ‘vom numi cod binar peste P*, ‘In continuate, prin cod bisar vom injelege fie codul c peste V, fie extensia lui canonicd ¢ la V*, in functie de context, si ne vom referi ‘numai Ia astiel de coduri. Spunem eX un cod (binar) are proprietatea prefix dack pentru oricare doua litere x,» € V7, o(s) nu este prefix al lui of. Arborii binari pot fi folositi in mod natural la reprezentarea sau chiar 1a generarea codurilor binare cu. proprietatea prefix. Etichetim arcele erborelui binar eu convenfia: un arc de tip fiu sing are etichetn 0 jar un arc dc tip fiu drept are eticheta 7. Punem caracterele din Vin frunzele unui asemenea arbore iar codul c: V > (0, 1}* asociat va fi dst de ofa) = sina! de etichete al drumului (unic) de la ridacina arborslui Ia frunza in care este reprezentat caracterul a © ¥. Un asemenca cod este injectiy pentru ci dout litefe distincte din V ocupi frunze diferite gi este un cod cu proprietatea prefix pentru c& nu reprezentim earactere ia nodarile interioare. in ree ere eo en Soret te _,,_ Sinem c4.un cod este de lungime fixd dact toate in Vse cout eu sr de bide aceas lungine, aded doce ee {F(a = |e6)] pentmoricea, 6 « ¥, unde prin jo(e)| nottim lungimea sirului de biti cf) Un cod care nu are aceasté. pro; ua ea Proprictate se numeste cod de hungime Problemele pe care ni le punem sunt (2) De conseruit un cod binar eu proprictatea prefix peste un alfabet dat (0) SK codyicim cavinte peste V adic&: dat find orice euvint peste V 1a) .. dy © V4, sh producem cod ia 21a oe © Vs, prod ful asociat lui, din codunile literelor, E (aay .. dr) = cfayefay) .. clas) (©) 58 decodsficam sirur de biti, adick: dat find orice cuvant u ¢ (0, 1)* Sapien dacd exist sau nu un cuvint x © 7a cir cod ese 9, in ce tiv, SA spunem care este acest x (unic) eu propricta ely mn ee See Cele trei probleme sunt legate intre ele. in ir 7 Primul rind, in mod evident, codificarca $i decodificarea sunt opera inverse una altcia In al baile sto sorerets codului webuie fEeuik in aga fel incit st eplimizeze anumite performanje ale operatilor de codificare s{ dscodificare, Dupt cum reiese din discutia despre lngitara dintre arbos binart si codunle binare eu proprietatea prefix. problema constuchic i saad binar eu proprietatea prefix peste un alfabet dat, V, este cchivalentt cu problema construcjiei unui arbore binar strit ‘pentru o A implicit ungimea codului asociat caracterului respectiv, of item explosta inteligent scesstt ultima propriate in felul Un deziderat general al oricéte’ probleme de oricérel probleme de codific lenginea mesyjelor enditiente ale minind, Aust dencet nee epee 163 de considerente practice, cuin ar fi scurarea timpulul de transmiste fzica 8 mesajului codificat. ‘Unel din moduriie de a minimiza tungimea mesajelor codificate este de a face hungimea codulur fiecdrui caracter invers proportional ctz Srecventa ut de aperitie, Cu alte cuvinte, codul trebuic sk asocicze ‘caracterelor cu probebilitate mare de sparitic un cod cat mai scurt, iar celor mai putin freevente, coduri mai lungi Problema construcfiei unui cod binar peste V, care 6 aiba aceastl proprictate, se reformuleazd tn felul urmitor. in primul rind, allubetul de codificat, F, se d8 impreund ou 0 reparttie de probabilitate pe el; cualte cuvinte avem o functic woh 201] ou propritatea Toe) sneer. Pentru fiecare a & ¥, w(a) reprezinta protabilitatca aperitiei caracterului 4 sau frecvenfa lui relativa in anumite texte. Problema corstruciiei unui arbore binar strict cu frunze din 7 devine in felul acesta o problema de constructie a unui arbore binar strict, ponderat, avand ca frunze elementele lui {eu ponderile (probabilititile) associate, adicd, multimea frunzelor va fi E = f(a, wla)j ae V}. Unui asemenea set de frunze li putem aplica algoriumul lui Huffinan, consinuind din ei un arbore Dinar strict (mu neaparat unic) cu lungime externa ponderata minima, Minimizarea lungimit exteme ponders va satisface dezideran general de minimizare a lungimii mesajelor. in plus, din modul de fanctionare al algoritmului se vede cA acele caractere a € ¥ cu probabiltate de aparitie w/a) mica sunt legate prinelc in arbore, deci vor fi Ia nivelurile mai joase $i, in consecinfl, vor avea codurile ‘cele mat lungi, pe cand carectereie cu probabilitate mare de apariie vor fi legate sai téreiu la arbore, deci vor apirea pe niveluri mai mici, iar codurile lor asociate vor fi In consecinié mai scurt. ‘Un cod binar peste un alfabet 1 dat, impreund cu o probabiltate w 22 (0, 1), cod asociat unui arbore binar strict cu ponder: construit cu algoritmul lui Huffman se numeste cod Huffman, Cele tei probleme formulate in general pentru coduri devin in acest context L 164 (a) Constructia codulut: revine la aplicarea algoritmului lui Huffman pentru construirea unui arbore binar strict cu lungime exter ponderat minima pentru muliimea de frunze ponderate E=((a, w(a))\ a €¥}. (b) Codyfcarea, Fiecarui caracter a € Vi se asociaz4 cod! constind din sirul de etichete al arceior ce compun drumul de la ridicina le franza social caracterului a, (©) Decodificarea unui sir de biti revine la parcurgeni repetate ale cite ‘unui drum in arborele lui Huffman, incepand de Ia. ridicina,’ conform conventfiei: in cazul in care curactenil (bitul) curent este 0, parcurgerea continul pe fiul sting, daci este /, parcurgerea continul pe ful drept. De fiecare ditt cfind ajungem fntr-o franz, am terminat de decodificat un caracter 5i reluaim parcurgerea de Ia rfdacin& pentru restul sirului de biti. Daci o asemenea parcurgere se termina totr-un ned interior, atunci siral we (0, L}* de decodificat nu este valid, adica nu exista nici un cuvant xe V*,astfel incit @ (6) = w Exereitit |. Si se sorie codurite binare pentru alfabetl fa. A, ¢ d} asociate figurilor (A), (B). (C). (D), (E) din secjiunea 4.3, Care dintre ele sunt oda HulTinaar? 2. Care este lungimes minima in biti a cuvinteior unui cod binar de Jungime fixa, care si fie capabil sa codifice un alfabet cu n ceractere? 3. Serieti un algoritm care sa construiasca un arbore Huffman pentru un alfabet cu ponderi dat. arbore reprezentat In asa fel incit sA poatd fi folosit atat la codificare, c&t si la decodificare. Scriefi proceduri care fac, la ‘cerere, codificarea si decodificarea uss, 455. Interclasarea optimal a mai multor siruri Se dau n (n>2) sirwi ordonate erescdtor, S), Saves Sx 5 CU lungimite respective 1, fs, ly. Vem si le interelasim pe toate, obtinand ‘un gir S ordonat creseStor ce confine toate elementele sirurilor initiale. Putem face aceasta interclasind pe rind cite douk sini (operatic descrisi in capitolul 4 scefiunea 7). La fiecare pas se reduce eu J numirul sinurilor sursd, deci vom obfize ia cele din urmd un singur gir. Dar cu ce ? PS ap wala operajie de interclasare este costisitoare in termeni de mut&n: interclasarea lui S, cu 5, (si notim rerultatul cu S,&S)) ne cost +1, mutiri, iar dack rezultatul se interclaseazd cu Sy, adica facem operatia (S&S&S; costul total ve fi 2*/lyr1)~ le. ‘Costu total al interclasirii a n sirun depinde de strategia de interclasare folosita, adic& de ordinea in care interclasim doud cAte dou’ sirurile, ‘Si ilustrim cu un exemplu. Fie sirurile S,, 8, Sy de lungime 99, 40 gi respectiv 10. S& considerim unnitoarele douk strategii de interelasare, eu costurle lor: (1) SiS ye&Ss ate costul total (90+40}+((90+40)+10)490740)" (2) (S&S yéS; are costa tou) (40+10)+((40+10)+90)=(208 10)"2-90=190._ Deci a doua strategie este mult mai performanté decit prima, ‘Observim cd fiecdreia din strategiile de mai sus ii putem asocia tun arbore binar strict cu ponderi, iar costul total al strategici va fi lungimea extern’ ponderaté a arborelui asociat (1) a S: Si Gm») [§ ; 10-270 S31 S s2| | sy 90 40 40} | 10 -90+240 10270 Lg72°40+2"10+90-190 166 Jn geacral, flecdsei strategii de intcrolasare a n siruri i de asociaza ‘un arbore binar strict cu ponderi in care frunzele sunt asociate girunlor S,, Lt iat ponderile sunt lungimile Lungimes externa ponderatd a arborelui asociat unei strategii va fi ‘exact costul total in nunar de mutéri al respectivei strategii. Accst cost se minimizeazd dacd arborele asociat strategie este arborele Huffman. 67 TESTULI © Problema 1 {G1 ‘Se dau coud liste simplu inlanjuite c&tre care indicd pointer M1 i 2. avand cdmpul de legdturd next gi cimpul informatie: info. Se di urmatoarea secventd de instructiuni: piel; p12; while (p1>nil) and (p2nil) and (p1info=p2* info) do begin pl~pl*:next; p2—p2"\next, end; oe then ‘write Listele sunt identice!") else ‘write(* Listele nu sunt identice!”), Ce condifie trebuie pusd unde este spatiul liber astfel incat programul sa decida daca listelc sunt sau nu identice” 1A] (pi ™info=p2" info) {B] (p?*-info=p2* info) and (pi next=p2* next} IC] (pi=ail) and (p2=nil) [D] (pi*.next=p2" nent) FE] (pI? nent” info-p2 next info) V Problema 2iG1 ‘Cite interschimbiri sunt Gicute pentrua ordona crescitor folosind algoritmul de sortre prin interschimbare directa un vector de n elemente ordonate desereseator. fA]n [B] EE} los,n Me kn ns fo poy 2D Problema 3 [G1) Se di secventa: 88 99 66 33 44 22 Sé se afle care este rezultatul aplicdrii procedurii de partite din cadrul sortirii rapide (QUICK SORT) avand ca pivot valoarea 88 (de pe prima pozitic). _ Pe oO ve Ol ae ma a ~ ef et 168 1A] 44, 22; 66; 33, 88; 99. 1B] 22; 44; 33,99; 66, 88, IC] 22: 44: 66: 33. 88! 99 1D} 66; 88, 99, 44, 22:33, 18] 99; 44; 66; 33. 88; 22 Problema 4 {G1 ‘SB se indice care din urmatorii vecton repreprezini® un ansamblu. S4 se specifice tipul lui (max-ansamblu sau min-ansamblu), [A] 40, 35; 33; 25, 23, 31; 30, 11, (8) 40; 33; 31; 25; 23/30; 35: 11 {C] 11, 25, 22: 30; 33; 31: 35; 40, 1D] 11, 22; 25; 35; 33:30: 31; 40, UB] 11: 22; 30: 33; 35.31; 28; ata, Care sunt parcurgerile arborelui in preordine, inordine si postordine? JIA] pre = ROTVEX (BY pre: ORTVEX ink TOREXV in TORFXY post: TOXFVR post; TOXFVR IC] pre: ROTVFX pre: ROTVEX im OTREXY in OTREXV fos: TOXEVR post: TOFXVR IE] pre: ROTVFX is TOREXY post OTXEVR 169 Problema 6 {G1} (Care din urmatoarele numere estinvesz4 cel mai corect adncimea unui arbore binar complet pe niveluri cu m noduri? Justificatirispunsul, (ale BB] 108," ee 1D} Jog,n Problema 7 {Gal Care din umitoni vectori sunt obfinuti in urma execujiei « 3 (trei) pasi iterativi din algoritmul de sortare prin interschirabare (pentru varientele corecte precizati directia paselor) JA] 11; 22; 55; 33; 77, 44: 66. 55; 44:77, {C} 11; 77, 22; 33; 44: 55:66 55; 44; 77 [E] 22; 44,33; 11; 55; 66; 77, 1B] 22; 33, 44; 66; ID] 11, 22, 33; 66; Problema 8 [Gn) Sedavectorul: 22:33. S544 88 77 66 Care din umatoarele afirmatii sunt adevarate? [A] Vecioral a fost obtizut prin aplicarea a 2 (doi) past iterativi ai Algoritmului de sorare prin selecfie direct a maximului {B] Vectorul a fost objinut prin aplicarea a 2 (doi) pasiiterativi ai algoritmului de sortare prin selecfie direct a minimului. IC] Vectorul a fost obfitut prin eplicarea a 3 (trei) pas iterativi ai algoritmului de sortare prin selecfie direct a minimului [D] Veciorul fost obtinut prin aplicarea a 2 (doi) pasiterativi ai algoritmului de sortare prin interschimbare directs. TE] Vectoral 2 fost obtinut dup’ aplicarea a 2 (doi) pasi iterativi ai algoritmului de sortare prin insertie directa. 170 ‘J Problema 9 {Gu! Fic o lista simplu inlanyuité cu cdmpul de legdturd next. Se dé un pointer ‘p # nil cate un nod al liste, Care din urmatoarele seevente de instructiuni realizeazd adiugarea unui nod cu informayia & dupa nodul p new{q); [A] new(); Bh qh info=k, qinext=7: pinext=q: [el new) my qhinfok, @tnext=p.next; Prinext=g; TE] nema), next pr next; q’.infok, P’ next" aext V Brobtema 10 1D} ‘Se dau parcurgenile in preordine si ordine ale unui arbore binar: preodine’ §=BCDAFE inordine: =DCBAEF Care este arborele binar corespunzitor? Problema Ui 1D} Se considerd un arbore binar de cdutare, inifial vid. Arborele va avea in subarborele drept chei mai man decat cheia din ridicin8. Se introduc in arbore urmitoarele chei unice in ordinea de mai jos (de la stage la dreapta): 44 33 11 99 77 22 88 Care este arborele rezultat dupa introducerea cheilor? »/ Problema ‘St se constuiasci un arbore binar echilibrat AVL din urmitoarele cbei introduse pe rind. S& se slustreze pasii intermodiar, mai ales re- cechilibrarile 37 19 30 28 28 32 \/ Problema 13{D) 7 Si se construiasc& arborele binar corespunzator urmatourelor parcurger: inordine: postordine: BCEDRTSU EDCBTUSR Se considera schema de codificare Holfiman binara peste alfabetul A= { ‘A,B,C, D,E}, Probubilitgjile de aparite ale literclor din A sunt [Gites] Promatiinates | (a) S& se construiascé arborcle Hoffman A | 28% lasociat acestor date respectind regulile 8 9%] 1. Le compunerea a doi arbori cel cu C | 21% probabililates mai miei va deveni arbore Do 10% | sting [ep az% | 2 La etichetarea arborelui se foloseste cifra 0 pentru suburborele sting 9ieifra T pentru cei drops. (@) $8 se decodifice (folosind arborele consti! la punctul (a)) urmatoarea secventa de biti: 1001 100011110 Care sunt oaie numcicle naturele care pot reprecenta numfirul noduri tle unui arbore binar sinct? Justficati rispunsul tt es «J Broblema 16 {0} ‘Sé-se construfasca ua mir-ansamblu din urmatoarele chei inserate pe rand. Si se ilustreze pasii intermedian. 77 58 33 88 66 44 lt m TESTULH {Problems It (G1| Se considera urmitorul arbore bina: ®. ™ Care sunt pareurgerile arborelui in preordine, inordine 3i postordine? ENTLIO {Al Preordise 6 qnordine: vostord szo ona oor om von ao oz A} Preardine: B Inordine: N Postordin x x ic] Preordine Inordine: Postordine: E ecm ceG ozu 0 eet Rene eee W ip} Preordine Ey inordine: nN Postordine: zee wee p00 V0O DOD BGO NG 8 {E] Preordine: D Inordine: ™ Postordine: = E & c c E c B00 nO@ anz oa aon aon Heme HOZ rt ony 0 eee tt zo

Você também pode gostar