ALGORITMI Algoritm =procedur de calcul (en.

computationalprocedure ) bine definit care prime te o anumit valoare / mul ime de valori ca intrare i produce o anumit valoare / mul ime de valori ca ie ire Problem (computa ional ) = rela ie cerut între intrare i ie ire Algoritm = instrument pentru rezolvarea unri probleme = procedur de calcul care realizeaz rela ia cerut între intrare i ie ire Un algoritm este corect (rezolv problema dat ) dac
-

i numai dac

se opre te

- produce ie irea dorit

Complexitatea/performan a algoritmilor, clase de complexitate Pentru o problem pot exista mai mul i algoritmi care s o rezolve. Ace ti algoritmi sunt diferi i dîn punctul de vedere al performan ei, care, pentru algoritmi se evalueaz în func ie de complexitate. Complexitatea unui algoritm este consumul de resuse în func ie de m rimea intr rii. Resursele avute de obicei în vedere sunt timpul i spa iul de memorie. Timpul/spa iul necesar pentru ca algoritmul s produc ie irea pentru o in trare de m rime n exprimat ca func ie de n reprezint complexitatea în timp/spa iu a algoritmului. Cu cât acest func ie cre te mai încet, performan a este mai bun . Fiind dat o func ie f definit pentru numere naturale, faptul c raportul dintre complexitatea unui algoritm i f(n) tinde spre o constant este numit complexitate de ordîn f(n) . Se spune c algoritmul are clasa (sau ordinul) de complexitate O(f(n)). Exemple O(log n) , O(n) , O(nlog n), O(n 2). Dac f(n) este polinom, se spune c algoritmul are complexitate polinomial În cele mai multe cazuri exist mai multe tipuri de complexitate, dup mul imea valorilor de intrare avut în vedere:

-

complexitatea ca medie a m rimilor resursei consumate pentru toate intr rile de m rime n (de exemplu, pentru to i vectorii de lungime n); complexitatea în cazul cel mai defavorabil (de exemplu, pentru anumi i algoritmi de sortare, cazul cel mai defavorabil este cel în care vectorul de intrare es te ordonat descresc tor);

-

- complexitatea în cazul cel mai favorabil (de exemplu, pentru anumi i algoritmi de sortare, cazul cel mai favorabil este cel în care vectorul de intrare este ordonat cresc tor);

un Din p cate nota ia se folose te în uzajul comun în mod gre it. iar complexitatea lui poate fi indicat cu semnul Ÿ(n2). atunci tiu mult mai mult. De exemplu. care se numesc ``intratabile''.. asta spune ceva. chiar între problemele care pot fi rezolvate. atunci mul imea func iilor dominate de f se noteaz cu O(f) i se define te astfel: În cuvinte. tiu de exemplu c algoritmul este ``mai prost'' decît un algoritm O(n). scriindu f = O(g) în loc de -se : O(g) este o mul ime de func ii. e ex e e ''? Î se c e s ce c e c e e to în Din considerentele indicate. cresc toare în m rime. Complex e e probleme es e complex e celui mai ``rapid'' algoritm care o poate re olva. De exemplu.. teoreticienii trag o linie imaginar între problemele care au rezolv ri ``rezonabil'' de rapide.. dac tiu despre un algoritm doar c este O(n2).Ce se ec c e e c esc ec e e es e mai mic e Nota ia cu O indic numai limita superioar a unei func ii. Pentru a indica i faptul c limita se atinge. i restul problemelor. se folose te o alt nota ie. . Pe de alt parte. Din cauza c analizeaz aceast comportare spre infinit complexitatea algoritmilor se nume te ``complexitate asimptotic ''. Dar dac mi se spune i c exist o serie de instan e. . astfel încît de la un rang încolo f(n) > 0. În general. ee 7 7 8 4 34 32 7 3 2 65 4 34 32 . $#  #!   $$   $#!   $ %$#&$   $# !    $ &#  ! $ "   $  %$ $$ %  ! %% $  &   % ") "#! %(' 1 %0 % !&# # $  %$# "!       %   ¡¤ ¢ ¤ ¡   ¤ £ ¢ ¦¢¨ ¤ ¨¡¥ ¡ ¡ ¡  ¡ ¡ ¡¤ ¤ §¤ ¢   ¨ ¡ ¤ §     ¡ ¡ ¡ © ¡ ¢ ¨¡ ¡ ¡¤ ¢ ¡  ¡ ¡ ¢¤ ¡ ¡ ¤ §  ¢¨ ¡¨ ¡ §¦¢¡ ¢¥¡ ¡ ¤   ¤ £ ¢ ¢   ¡ ¢¡ ¢ ¡   Co pl xit t d ti p l o it ilo s l nt f tu t d x plu nu ul unui l o it d so t lu ul d d obi i nu o p i înt l d op ii nt l unui Defini ie: fie dat o func ie f : N -->N. Complexitatea unei probleme este deci o limit inferioar a eficacit ii cu care putem re olva o problem : orice algoritm care va re olva acea problem va fi mai complex dec t complexitatea problemei. observa i c atît cît i . Numai informa ia c f i g sunt în aceea i clas nu ne permite de fapt s le compar m între ele. pentru c polinom de grad mai mic decit k este în mul imea O(n^k). cu Ÿ. func ia g(n) = n este în mul imea O(n2). toate dominate de g. metoda preferat pentru a indica complexitatea unui algoritm este de a o face prin ordinul de m rime al func iei sale de complexitate. `` e c . pe care algoritmul face c n2 + . o func ie este în mul imea O(f) dac la ``cre te mai încet'' decît f la infinit.

De exemplu. o problem se nume te ``i tratabil '' dac complexitatea ei este xpo ial î m rim a dat lor d i trar . de un grad oricît de mare. ce con ine reuniunea elementelor structurilor de intrare ‡ ex: i t rclasar a a dou structuri liniare ordonate Sortarea ± ordonarea total a elementelor ‡ sortarea mul imilor statice ‡ sortarea mul imilor dinamice ‡ ‡ ‡ ‡ @ A @ A A 9 Opera ii de baz structurii) . Mul imea tuturor problemelor de deci ie (adic a problemelor la care r spunsul este da sau nu) cu complexitate polinomial se noteaz cu P (de la polinom). cu p strarea tipului structurii pe elementele r mase Ini ializarea structurii cu structura vid Crearea . Structur d dat Colec ie finit de date omogene. ( u uita i. împreun cu o mul ime de opera ii specifice ( gestionarea ‡ ‡ ‡ ‡ - Traversarea ± opera ia care acceseaz fiecare element al structurii o singura dat în vederea proces rii (vizitarea elementului) c utarea ± se caut un element cu cheie dat în structura ± cu sau f r succes ± const dintr-o traversare .eventual incomplet a structurii în care vizitarea revine la compara ia cu elementul c utat ± problema cheilor multiple . este vorba de complexitate ``worst-case'' asimptotic . dar nu ne-justi i abil. problema de a g si dac o valoare se afl într-un vector este în clasa P.prin inserari repetate Combinare (en.În mod arbitrar. de acela i tip.) O problem este ``tratabil '' dac putem scrie complexitatea ei sub forma unui polinom. ³merge´) ± din dou structuri de acela i tip se produce o alt structur .g sirea primei apari ii a tuturor apari iilor Inserarea ± ad ugarea unui nou element structurii cu p strarea tipului structurii tergerea extragerea unui element al structurii (eventual în vederea unei proces ri).

sunt precedate de c utarea locului în care se fac ‡ c utarea . k := k+1. {trecem la componenta urm toare} endwhile endproc B B . {ini ializarea indicelui pentru traversare} while k <= n do {test pentru nedep irea structurii} viziteaz A[k].Observatii: ‡ ‡ Leg tura opera iilor între ele ‡ inserare/ tergere .traversare (eventual incomplet ) NU toat opera iile se implementeaz pe toat structurile! ‡ fiecare structur are opera ii specific Clase principale de structuri ‡ ‡ Lineare Nelineare ‡ ‡ arborescente grafuri Structuri Liniare ‡ ‡ Reprezentare ‡ secven ial .vectori ‡ înl n uit liste Opera ii de i/o (inser ri/ tergeri) ‡ f r restric ii i/o ‡ cu restric ii la i/o (stive i cozi) Structuri liniare în reprezentaresecven ial Traversarea (unei structuri liniare în reprezentare secven ial ) procedure Traversare(A 1 n) k := 1.inverse una alteia ‡ inserare/ tergere .

Val. Loc) {caut liniar valoarea Val în A[1 n] i returneaz Loc = 0 dac nu o g se te. X) {e trage în X valoarea A[k] i reface vectorul} {e tragerea propriu-zis } X := A[k]. endfor {scade dimensiunea structurii} n := n-1. endwhile {inserarea propriu-zis } A[k] := Elem. while (i <= n) and (A[i] <> Val) do i:= i+1 endwhile if i<= n then Loc:= i endif endproc {SearchLin} Complexitatea c ut rii binare este de ordinul O(log2 n). i o valoare Loc [1 n] dac o g se te pe componenta A[Loc]} Loc: = 0 i:= 1.Inserarea (într-o structur liniar în reprezentare secven ial ) procedure Insert(A 1 n k Elem) {insereaz în structura liniar A[1 n] pe pozi ia k. endproc C utarea (unei valori date într-o structur liniara în reprezentare secven ial ) procedure SearchLin ( A. n. ceea ce reprezint o îmbun t ire substan ial fa de O(n). valoarea lui Elem} {mut pe rând elementele de la A[n] pân la A[k] câte o loca ie la dreapta} i := n. 1. {refacerea structurii de vector} for i := k to n-1 do A[i] := A[i+1]. while i >= k do A[i+1] := A[i]. n. endproc tergerea (dintr-o structur liniar în reprezentare secven ial ) procedure Delete(A. i := i-1. performan a c ut rii secven iale FF G C DD FF CC C C E E . 1. {cre te dimensiunea structurii} n := n+1. k.

) în algoritmii care urmeaz putem presupune c elementul ocup un singur câmp. inf next Start o « Liste simplu înl n uite Defini ie recursiv : O list L de un anume tip de baz este: (a) fie lista vid (L = ). ne t: pnod end typedef struct nlsi { int data. (de obicei vom indentifica elementul cu valoarea de pe un singur câmp. next Liste simplu înl n uite type pnod =nod.Structuri liniare în reprezentare înl n uit : liste (liste simplu înl n uite) ‡ ‡ elementele listei se numesc noduri fiecare nod con ine: ‡ (1) un câmp. info. pe care se reprezint un element al mul imii. } lnod. numit câmp cheie. i atunci con ine un nod numit capul listei. iar câmpurilenext asociate vor con ine indicele elementului urm tor Reprezentarea înl n uit care utilizeaz acest mod de alocare se nume te reprezentarea cu cursori a listei 1 Info Next 2 Y n k X 2 n Z 0 Q P H R R I . urmat de o alt list de acela i tip de baz . ‡ (2) un pointer c tre nodul urm tor. nod = record info: integer. struct nlsi *urm. unde prin tip de baz ne referim la tipul de date de pe câmpul info Observa ie:Pentru listele simplu înl n uite se poateutiliza i alocarea secven ial Câmpurile info ocup anumite loca ii ale unui vector(alocat static sau dinamic). (b) fie este nevid .

se returneaz Loc=nil } Loc:=Start. Loc.Liste simplu înl n uite opera ii TRAVERSAREA: la liste simplu înl n uite -.nu putem parcurge structura decât într-un singur sens.primul nod. pointer curent} p:= Start. cu proprietatea Loc. având o valoare dat x întreag . pentru o list de întregi. while (Loc<>nil) and (Loc info<>Val) do Loc:=Loc ne t endwhile if Loc<>nil then {c utare cu succes} else {Loc=nil}{c utare f r succes} endif endproc{Search_List} INSERAREA UNUI NOU NOD: Opera ia de creare a nodului noueste cea care face alocare dinamic de spa iu Crearea unui nod nou.next procedure Trav_Lista (Start) {aceeasi structura ca la aloc St -. Val. legarea noului nod la list se face simplu realocând doi pointeri (sau schimbând dou leg turi) W S X V V W a WV T T W ` a U T Y Y ` . Val. într-un loc anume în list . Loc) {Inlista Start se caut o valoare dat . Start i. {ini ializarea pointerului curent pentru traversare} while p<>nil do {test pentru nedep irea structurii} {viziteaz nodul p} p:=p ne t {trecem la componenta urm toare} endwhile endproc{ Trav_Lista} CAUTAREA: procedure Search_List (Start.info=Val Daca nu e ist . din fiecare nod curent p accesînd nodul urm tor cu ajutorul adresei p. care trebuie determinat în func ie de natura problemei Odat determinat locul inser rii. se face cu secven a de instruc iuni : new(Nou) {alocarea de spa iu pentru noul nod} {malloc} Nou info:= {setarea câmpului info la valoarea dorit } Nou ne t:=nil {setarea câmpului de leg tur la nil} (b) Opera ia de inserare propriu-zis într-o list simplu înl n uit este opera ia care leag nodul nou creat de celelalte noduri din list .in loc de indice curent. Dac un asemanea nod e ista. accesînd primul nod. se returneaza in variabila Loc adresa lui -.

eputând accesa odul precede t. Traversarea p. difi ultatea const (2) faptul c . u putem în ecesare. atunci in (b1) Dac pointerul curent travers al se opre te înaintea opre te înaint ea inserarea se face cu secven a de instruc iuni secven a de instruc iuni Nouo.deci legarea se face dup lo ul inser riicare traversarea seodurile oldo icurent ppe nodul înainte de care trebuie s old ca i cum inser m -.. ca r mânând întotdeauna un pas în urma lui pe odul precede t. . se fac inserarea. legatde de natura locului de func ie de acest func iecondi acest a doua condi una traversarea se o din urm toarele dou situa ii : ii : urm toarel e dou situa (b1) Nodul pe care peste cel dup care cel dup care urmeaz (b1) Nodul pe care s-a oprits-a oprit p este urmeaz s se fac inserarea.. fie old un alt pointer.next:=po. s se (b2) Nodul pe care care peste cel înaintea c ruia înaintea ruia trebuie (b2) Nodul pes-a oprits-a oprit p este cel trebuie s secfac inserarea s (b1) Dac pointerulalcurent rii p travers rii p selocului de inserat. q .. la te (b2) n cazul în este între opre te cu pointerul po.în figur cum este ilustrat i în fig care realizeaz noile leg turi la la stânga (1) i cum este ilustrat dup ta rt .Cazul inser rii în capul listei trebuie luat în considerare separat: Nou ne t:=Start (1) Start:=Nou (2) În general.next:=Nou (2) p ne t:=Nou care realizeaz noile leg turi la dreapta (1) idreapta (2).. .. determinarea locului inser eventual incomplet a listei. . o traversare eventual in Determinarea locului inser rii în list se face cu o traversare rii în list se face cucu un cu uncurent p. ac p este pointerul care Nou e traversarea. dup la stânga (2). op (b2) Î azul în are traversarea se opre te u pointerul ure t p pe odul înainte (1) inser m.. fi guvernat de o condi ieguvernat de structurii i oie de ie pointer pointer curent va Traversarea va fi de neterminare a o condi condi neterminare a struc legat natura locului de inserat n inserat. traversarea se opre te în ie. o old (1) o Nou op (2) i f r ed p i h g h g c b fac inserarea. . În a doua de ie. old si p dup cum ilustreaz i figura : Start .traversare cu doi pointeri succesivi. atuncilocului de inserat. Î cazul acesta.next (1) Nou ne t:=p ne t (1) (2) po. ifi ultatea acesta se dep e te f când traversarea cu doi pointeri su o condu singur.

traversare guvernat de condi ia de nedep ire a structurii i de înc o condi ie specific problemei Aceast a doua condi ie face ca traversarea s se opreasc într-una din urm toarele dou situa ii : (a1) tergerea se face dup nodul p cu care am terminat traversarea. pozi ia nodului de ters se g se te în urma unei travers ri eventual incomplete a listei cu un pointer curent p. old cu un pas în urma lui p v sss v u s w s t s t s vw v t s x .procedure Insert1 (Start.. eventual nu inserez } else {inserarea între old i p} { (1) leg tura la stânga} if old = nil then {inser m în capul listei} Start:= Nou else {inserare dup old} old ne t:= Nou endif { (2) leg tura la dreapta } Nou ne t:= p endif endproc{Insert1} tergerea (extragerea) unui nod ‡ ‡ Refacerea structurii de list simplu înl n uit pe nodurile r mase eventual dealocare de spa iu pentru nodul e tras (sau alte opera ii cu el) Ca i în cazul inser rii... loca ie eliberat . p:=Start {traversarea incomplet } while(p<>nil) and (p info<>Val) do old:= p. ca i la inserare. Nou.. dac este cazul} if p = nil then {nu am g sit loca ia. adic trebuie ters nodul pne t Start . Val) {inserarea lui Nou înainte de primul p pentru care p info=Val} old:=nil. p:= p ne t endwhile {inserarea. traversarea cu doi pointeri curen i succesivi. noua leg tur (a2) pointerul curent p termin traversarea e act pe nodul ce trebuie ters n cazul acesta vom face.

va con ine în variabila Start adresa acestui nod.tart .. iar lista efectiv . în care în fiecare nod avem reprezentat un element al mul imii de date. ‡ cu nod marcaj : O list .parcurgeri în ambele sensuri -.temp) p:= Start old:= nil while (p<>nil) and{condi ia de oprire este false} do old:= p p:= p ne t endwhile if p<>nil then {traversarea s-a terminat. trebuie ters nodul p} {salv m în temp adresa nodului e tras} temp:= p {refacerea structurii de list pe nodurile r mase} if old = nil then {cazul tergerii primului nod al listei} Start:=p ne t else old ne t:= p ne t endif endif endproc { Del_2} Alte tipuri de liste.inser ri/ tergeri: parcurgerea cu c utarea locului se poate face cu un singur pointer -.next ‡ ‡ ‡ circulare dublu înl n uite alte înl n uiri ± liste de liste ± masive Liste circulare -. va fi Start. de sters .cost: loca ii în plus ! € € y € y  € y € y . o ol op procedure Del_2 (Start... -. Start. cu nod marcaj..util pentru aplica iile în care este nevoie s facem parcurgeri repetate ale listei -.testul de nedep ire al structurii nu va mai fi de tipul p nil Liste dublu înl n uite.

baz (Top) ‡ Push(Stack. Val) if Top=Max then Overflow else Top:=Top+1 Stack[Top]:=Val endproc procedure Pop(Stack. procedure Push (Stack. accesul fiind permis numai pe la varf ‡ Trebuie sa stim in orice moment adresa varfului.inserare în stiva plin ‡ Pop(Stack.prev next LIFO ( Last In First Out ): ultimul introdus este primul extras Campul de legatura al noului element contine adresa celui peste care se asaza si devine varf ‡ Extremitatile se numesc baza si varf.Dc stiva e vida vf=baza si au ca adresa nil ‡ locul unic pentru inser ri/stergeri: vârf. X) .inserarea valorii Val în stiva Stack ‡ Overflow (supradep ire) .extragere din stiva goal Elem n E n-1 VARF STIVA LIFO Elem n-1 E n-2 Elem n-2 E n-3 Elem 2 E1 Elem 1 nil BAZA Stiva ‡ ‡ . X) if Top=0 then Underflow else X:=Stack[Top] Top:=Top-1 endproc Stiva in reprezentare inlantuita procedure Push(Top.next := Top Top := Temp . Val) new(Temp) if Temp=nil then Overflow Else Temp. Val) .stergerea/extragerea din stiva Stack a unei valori care se depune în X Underflow (subdep ire) . Top. Top.info := Val Temp.

.inserare în coada plin ‡ Delete(Queue.... Coada cu un singur element: Rear=Front nil... Val) new(p) if p=nil then {Overflow} ....extragere din coada goal Elem1 E2 CAP COADA FIFO Elem2 E3 Elem3 E4 E n-1 ....deci sa stim capul cozii. Coada: ‡ FIFO ( First In First Out ): primul introdus este primul extras ‡ Campul de legatura al elementului precedent se schimba din nil in adresa elementului care se asaza in continuare la coada.. primul care a fost asezat la coada ‡ Extremitatile se numesc cap si sfarsit .Rear Stergeri -. Rear...info Temp := Top Top := Top. spate (Rear) ‡ cap t pentru tergeri: început. adica adresa acestui nou element... Rear. En En nil Sfarsit Inserari -.. Front..endproc procedure Pop(Top... Front.. Rear..inserarea ‡ Overflow (supradep ire) ....Dc coada e vida cap=sfarsit=nil ca adrese alocate ‡ cap t pentru inser ri: sfâr it.next dispose(Temp) endproc. Val) .. fa (Front) ‡ Insert(Queue.Front Coada vid : Front=Rear=nil...... X) if Top= nil then Underflow else X := Top.. X) .....intrarea numai pe la extremitatea sfarsit iar iesirea numai pe la cap ‡ Trebuie cunoscut mereu capul cozii...tergerea/extragerea ‡ Underflow (subdep ire) .. Coada in reprezentare inlantuita procedure Insert(Front.

pornind de la un vîrf dat nu putem ajunge din nou la el folosind muchii. . T2. plus un num r finit de structuri disjuncte de arbori de acela i tip.. Un graf neorientat este un graf în care perechea (x. cone . if Front = nil then {Underflow} else {e tragerea valorii. (b) fie este nevid . x. unde o muchie v  V este o pereche ordonat de noduri v=(x. f r cicluri.. Rear. pe care-l vom numi r d cin i îl vom nota root(T). numite descenden i direc i (sau fiii) lui x. mul imea X a nodurilor sau vîrfurilor grafului.x). Reprezentare arbori „ ƒ ‚ ƒ ‚‚ ƒ ‚ ‚ ƒ ARBORI . T. if Front = nil then {coada avea un singur element. Tk. Defini ie. Definitie recursiva: O structur de arbore (k-arbore).. T1. numi i subarborii lui T (sau fiii lui root(T)). Se nume te grafG = (X. X).y  X.y) se identific cu perechea (y. Un graf f r cicluri este un graf în care.. Pentru orice vârf xX . V) care este neorientat. deci con ine un nod de tipul de baz . i mul imea V a muchiilor grafului. exist un num r finit de vârfuri x1. iar acum e vid } Rear:= nil endif endif endproc Defini ie.else {with pdo} p info:=Val p ne t:=nil {endwith} if Rear=nil then {coada era vid } Front:=p else Rear ne t:=p endif Rear:=p endif endproc procedure Delete (Front. Se nume te arbore un graf H = (X. cu un nod precizat numit r d cin .xn X asociate lui x. de un anume tip de baz este (a) fie o structur vid (adic T = ˆ).y). V) o pereche format din dou mul imi. cu eliberarea spa iului care a fost ocupat de nodul Front} X:= Front info p:= Front Front:= Front ne t dispose(p).

Se nume te terminal sau frunz un nod f r descenden i. arbori în care nu e ist o rela ie de ordine între descenden ii unui nod gradul arborelui = întregul k care reprezint num rul ma im de fii ai unui nod. (fiu stâng. respectiv fiu drept. Fiec rui nod al arborelui îi vom asocia unnivel în felul urm tor: (a)r d cina se afl la nivelul 0. (b)dac un nod se afl la nivelul i atunci fiii s i sunt la nivelul i+1. Se nume te nod interior orice nod care nu e terminal.arborii ordona i. Numim în l ime(sau adâncime) a unui arbore nivelul ma im al nodurilor sale. arbori în care e ist o rela ie de ordine între descenden ii unui nod arborii neordona i. Un2-arbore ordonat se nume te arbore binar.) … … … … .