Sunteți pe pagina 1din 10

1. Cutarea informaiei textuale. Specificul problemei : a) Programarea algoritmului de cutare a modelului n text dup Metoda direct .

Se considera urmatoarele declaratii: var s:array [0..n-1] of char; p:array [0..m-1] of char; {0 < m <=n} Se cere sa se determine pozitia primei aparitii in sirul s a sirului ( modelului ) p. In cautarea directa, modelul e "deplasat paralel" cu sirul, cu cite o pozitie, pina la gasirea lui sau pina cind numarul pozitiilor netestate din sir e mai mic decit lungimea modelului. b) Programarea algoritmului Knuth-Morris Pratt. Algoritmul Knuth-Morris-Pratt reprezinta o metoda avansata de cautare a unui sir de caractere model(pattern) P[0..m] intr-un sir de caractere sursa T[0..n], evident n>=m. Construit pe functia-prefix (P), algoritmul este un exemplu clasic de programare dinamica, cu eficienta nu de O(N*M), ci de O(N+M). Spre deosebire de metodele liniare, algoritmul KMP propune ca deplasarea modelului P dea lungul sursei T sa fie efectuata cu un numar mai mari de pozitii si ca in acelasi timp sa se memoreze partea de text care coincide cu modelul. Acest lucru ne va permite sa evitam comparatiile inutile si, astfel, va creste considerabil viteza de cautare. Functia-prefix (P) determina prefixul maxim a lui P, care este, defapt, si sufixului lui P. Cum se aplica aceasta functie si pentru ce? Se aplica pentru a ne ajuta sa construim o matrice k a lungimilor acestor prefixe, dupa care vom putea determina daca modelul se contine in sursa sau/si cu cite pozitii trebuie sa deplasam modelul spre dreapta pentru a cauta o noua potrivire.

2. Grafuri. a) Noiuni de baz. Modalitatea de prezentare n memoria calculatorului utiliznd diferite structuri de date. Un graf,poate fi definit ca fiid o colecie de noduri i arce. Un graf este o pereche G = < V, M > , unde V este o multime de virfuri si nu poate sa fie vida , iar M V*V este o multime de muchii. Doua virfuri unite printr-o muchie sunt adiacente. Un drum este o succesiune de muchii Lungimea drumului este egala cu numarul muchiilor care il constituie. Drum simplu drum in care nici un virf nu se repeat. Un ciclu este un drum care este simplu, cu exceptia primului si ultimului virf care coincide. Graf aciclic este un graf fara cicluri. Un subgraf a lui G este un graf <VM>, unde V<=V, iar M este formata de muchiile M care unesc virfuri din V. Moduri de reprezentare: -listarea efectiva a tuturor nodurilor si arcelor -geometric(desen pe plan unde nodul-cerc, arce-sageti) -matrice patratica booleana de dim. Egala cu nr de nod., in care o pozitie aij=1 daca exista arcul (xi,xj) Si 0 in caz contrar -noduri reprezentare de 2 ori,

b) Programarea algoritmilor pentru determinarea drumului minim (maxim): Ford simplificat ( pentru grafuri fr circuite). c) Programarea algoritmilor de verificare a existenei ciclurilor n grafuri. Programarea algoritmilor pentru determinarea drumului minim : Dijkstra Cutarea n adncime permite de asemenea verificarea simpl a existenei ciclurilor ntr-un graf. Astfel, un graf conine un ciclu, dac i numai dac procedura CautInAdncime descoper o valoare diferit de zero n tabloul marc. Aceast nseamn c se parcurge un arc care conduce la un nod care a mai fost vizitat, deci graful conine un ciclu. n cazul grafurilor neorientate trebuie ns s se in cont de reprezentarea dubl a fiecrui arc, care poate produce confuzii. Pentru reprezentarea grafurilor prin pdure de arbori de cutare, liniile punctate sunt acelea care nchid ciclurile.

3. Arbori. Exemple de reprezentare: a) Reprezentarea prin liste generalizate. Se considera ca nodurile terminale sunt elemente atomice, iar nodurile de grad 1 sunt subliste. Deci, fie arborele de mai sus scris sub forma : A( B (E (K, L), F), C (G), D (H (M), I, J)) cu reprezentarea: b) Reprezentare prin structuri nlnuite. O manier important i util de implementare a arborilor generalizai este aceea de a crea pentru fiecare nod al arborelui o list a fiilor si. Datorit faptului c numrul fiilor poate fi variabil, o variant potrivit de implementare o reprezint utilizarea listelor nlnuite Aceasta reprezentare are calitatea ca, atunci cnd conteaza ordinea descendentilor, ea poate surprinde structura diferita. De exemplu: structura x este diferita de structura x x x /|\ /|\ vid y vid y vid vid Metodele de reprezentare expuse permit sa putem identifica legatura nod-descendent (succesor). Dar, exista aplicatii n care este nevoie de legatura nod-predecesor. Asadar, pare utila reprezentarea arborelui sub forma nodului (data, parent). Avnd adresa unui nod, se gasesc toti predecesorii, obtinndu-se o lista nlantuita
Un arbore este o structur de date ierarhizat n care elementele structurii, numite noduri, suntlegate ntre ele prin rela ii de tip tata-fiu. Nodul f r nici un predecesor(tat) este numit rdcin ,iar nodul care nu are nici un succesor(fiu) este numit frunz.Gradul unui nod este numrul de fii pe care i are acel nod. Nodurile care au grad zero se numesc frunz sau noduri terminale. Gradul unui arbore este valoarea maxima a gradelornodurilor sale, sau, cu atte cuvinte, gradul unui arbore este egal cu numrul maxim de fii pe care iare un nod.

4. Arbori. Specificul programrii problemei. Programarea algoritmilor care determin arborele de cost minim ntr-un graf dup algoritmii: a) Algoritmul PRIM, b) Algoritmul KRUSCAL. Un arbore este o structur de date ierarhizat n care elementele structurii, numite noduri, suntlegate ntre ele prin rela ii de tip tata-fiu. Nodul f r nici un predecesor(tat) este numit rdcin ,iar nodul care nu are nici un succesor(fiu) este numit frunz.Gradul unui nod este numrul de fii pe care i are acel nod. Nodurile care au grad zero se numesc frunz sau noduri terminale. Gradul unui arbore este valoarea maxima a gradelornodurilor sale, sau, cu atte cuvinte, gradul unui arbore este egal cu numrul maxim de fii pe care iare un nod.

lgoritmul lui Kruskal este una dintre metodele cunoscute de rezolvare a problemei determinrii arborelui parial de cost minim. Paii acestui algoritm sunt urmtorii: -se alege nti muchia de cost minim, -se adaug repetat muchia de cost minim nealeas anterior i care nu formeaz cu precedentele un ciclu, -se vor alege n-1 muchii.

Algoritmul Prim incrementeaz mrimea unui arbore, pornind de la un nod, pn cnd sunt incluse toate nodurile.

Intrare: Un graf conex ponderat cu nodurile V i muchiile E. Initializare: Vnou = {x}, unde x este un nod arbitrar (punct de plecare) din V, Enou= {} repet pn cnd Vnou=V:

Alege muchia (u,v) din E de cost minim astfel nct u este n Vnou i v nu e (dac exist mai multe astfel de muchii, se alege arbitrar)

Se adaug v la Vnou, (u,v) la Enou

Ieire: Vnou i Enou descriu arborele parial de cost minim

5. Arbori binari. Operaii asupra arborilor binari. Un arbore binar este un arbore n care fiecare vrf are cel mult doi descendeni fcndu-se distincie ntre descendentul drept i descendentul stng al fiecrui vrf. Caracteristici: fiecare element este numit nod; primul element dintr-un arbore se numete rdcin;

celelalte noduri formeaz fiecare cte un arbore; aceti arbori se numesc subarbori; ntr-un arbore exist noduri crora nu le mai corespund subarbori; un astfel de nod se numete nod terminal sau frunz; un nod rdcin este numit nod tat; rdcina unui subarbore se numete nod fiu; rdcina unui arbore se afl pe nivelul 0; dac un nod are nivelul m atunci fii lui au nivelul m + 1, prin nivel se nelege poziia ocupat fa de nodul rdcin; prin nlimea arborelui nelegem nivelul cel mai mare al nodurilor terminale. Un arbore binar n care fiecare nod care nu este terminal are exact doi d``` escendeni se numete arbore binar complet. Structura de baza a unui arbore binar: rad / \ / \ / \

/ \ / \ / SAS \ / SAD \ /______ \ /_______\ SAS subarborele stng (binar) SAD subarborele drept (binar) Operatii curente: selectia cmpului de date dintr-un nod si selectia descendentilor; inserarea unui nod; stergerea unui nod.

6. Strategii de traversare a arborilor binari: a) Traversarea n Preordine: prelucrare n ordinea: rad, SAS, SAD; b) Traversarea n Inordine: prelucrare n ordinea: SAS, rad, SAD; c) Traversarea n Postordine: prelucrare n ordinea: SAS, SAD, rad. Traversarea consta n "vizitarea" tuturor nodurilor unui arbore ntr-un scop anume, de exemplu, listare, testarea unei conditii pentru fiecare nod, sau alta prelucrare. O traversare realizeaza o ordonare a nodurilor arborelui (un nod se prelucreaza o singura data).

Exemplu de traversare: / b / d

a \ c \ e / \ g h \ f

preordine : A B D E G H C F inordine : D B G E H A C F postordine : D G H E B F C A

7. Arbori binari de cutare (BST). a) Tabelele Hashing.


Vom considera o multime "atomi". Pentru fiecare element din aceasta multime avem: a atomi, este definita o functie numita cheie de cautare: key(a) k cu proprietatea ca doi atomi distincti au chei diferite de cautare: a1 a2 key(a1) key(a2). Un arbore binar de cautare este un arbore T ale carui noduri sunt etichetate cu atomii continuti la un moment dat n dictionar. T = (V, E) , V = n. (n atomi n dictionar) Considernd r V (radacina arborelui), Ts subarborele stng al radacinii si Td subarborele drept al radacinii, atunci structura acestui arbore este definita de urmatoarele proprietati: 1) un nod x Ts atunci key(data(x)) < key(data(r)); 2) x Td atunci key(data(x)) > key(data(r)); 3) Ts si Td sunt BST.

b) Funcii: Search, Insert, Delete. Exemple de programe.


Un dictionar este o colectie S de atomi pentru care se definesc operatiile: insert(S,a) insereaza atomul a n S daca nu exista deja; delete(S,k) sterge atomul cu cheia k din S daca exista; search(S,k) cauta atomul cu cheia k n S si-l returneaza sau determina daca nu este.

Search: search(rad,k) // rad . pointer la radacina arborelui { // k . cheia de cautare a arborelui cautat if (rad = 0) then return NULL else if key (data (rad)) > k then return search (lchild (rad)) else if key (data (rad)) < k then return search (rchild (rad)) else return rad } Insert: Se va crea un nod n arbore care va fi plasat la un nou nod terminal. Pozitia n care trebuie plasat acesta este unic determinata n functie de valoarea cheii de cautare. insert(rad,a) // rad - referinta la pointerul la radacina // arborelui { if (rad= 0) then rad= make_nod(a) else if key (data (rad)) > key(a) then insert(lchild(rad),a) else if key (data(rad)) < key(a)then insert (rchild (rad),a) } Delete: { // k - cheia de cautare a atomului care trebuie sters de noi if rad = 0 then return // nodul cu cheia k nu se afla n arbore else if key(data(rad)) > k then delete(lchild(rad),k) else if key(data(rad)) < k then delete(rchild(rad),k) else delete_root(rad) }

c) Detaarea celui mai mic ( celui mai mare nod) din arborele BST.
Pentru a gasi cel mai mare nod dintr-un arbore binar de cautare, se nainteaza n adncime pe ramura dreapta pna se gaseste primul nod care nu are descendent dreapta. Acesta va fi cel mai mare. remove_greatest(rad) //rad -referinta la pointer la //radacina: un pointer la radacina de poate //fi modificat de catre functie { if rchild (rad)= 0 then | p= rad | rad= lchild (rad) |_ return(p) else return (remove_greatest (rchild(rad))) }

d) Crearea unui BST pornind de la secvena de atomi. (a1, a2, ..an) gen_BST (va fi n programul principal) | rad= 0 | for i= 1 to n | insert (rad, ai) Calculam complexitatea medie a generarii BST: Complexitatea n cazul cel mai defavorabil este: ( ) ( ) Notam cu T(k) - numarul de comparatii mediu pentru crearea unui BST pornind de la o secventa de k elemente la intrare. Ordinea celor k elemente se considera aleatoare. Pentru problema T(n) avem de creat secventa (a1 a2 ... an) cu observatia ca a1 este radacina arborelui. T(n)= (n - 1) + val.med.SAS + val.med.SAD

8. Arbore binar de cutare dinamic echilibrat (AVL). Transformarea structurii arborelui dup nserare pentru a conserva proprietatea de arbore binar echilibrat: a) Imaginea oglind a rotaiei dreapta - stnga.
Un arbore binar este echilibrat daca si numai daca, pentru fiecare nod din arbore, diferenta dintre adncimile SAS si SAD n modul este 1. Exemple: a a / \ / \ b c b c / \ / \ / \ \ d e f g d e f / \ g h arbore binar arbore binar complet echilibrat echilibrat Adncimea unui arbore echilibrat cu n noduri este O(ln n). Fie arborele echilibrat A / B depth(T3) / \ T1 T2 Consideram arborii T1, T2, T3 echilibrati. Insernd un nod prin rotatie simpla, rezulta structurile rotit simplu la dreapta si rotit simplu la stnga imaginea oglinda a rotatiei dreapta: / B A \ T3 A / \ T3 B / T2 \ T1 \ T3 h = depth(T1) = depth(T2) =

/ \ T1 T2

a) nserarea prin rotaii duble.


Caz 2: Inserarea se face prin rotatii duble: / B / T1 Fie primul caz: A \ T3

A / \ T3 B / \ T2 T1 rotatie dubla la stnga A / B \ T3 este BST: T1 < B < T2 < A < T3

\ T2

rotatie dubla la dreapta

/ T1

\ T2

9. Structuri de date elementare i abstracte. Exemple ( pe baza elementelor din teoria grafurilor). - Vezi referat din lecia 6. Structuri de date elementare Liste O lista este o colectie de elemente de informatie (noduri) aranjate ntr-o anumita ordine. Lungimea unei liste este numarul de noduri din lista. Structura corespunzatoare de date trebuie sa ne permita sa determinam ecient care este primul/ultimul nod n structura si care este predecesorul/succesorul unui nod dat (daca exista). Iata cum arata cea mai simpla lista, lista liniara: capul listei coada listei O stiva este o lista liniara cu proprietatea ca operatiile de inserare/extragerea nodurilor se fac n/din coada listei. Daca nodurile A, B, C sunt inserate ntr-o stiva n aceasta ordine, atunci primul nod care poate sters/extras este C.In mod echivalent, spunem ca ultimul nod inserat este singurul care poate sters/extras. Din acest motiv, stivele se mai numesc si liste LIFO (Last In First Out). O coada este o lista liniara n care inserarile se fac doar n capul listei, iar stergerile/extragerile se fac doar din coada listei. Din acest motiv, cozile se mai numesc si liste FIFO (First In First Out). Un graf este o pereche G =< V , M >, unde V este o multime de varfuri, iar M V V este o multime de muchii. O muchie de la virful a la virful b este notata cu perechea ordonata (a, b), daca graful este orientat, si cu multimea {a, b},daca graful este neorientat. Un arbore este un graf neorientat, aciclic si conex. Sau, echivalent, un arbore este un graf neorientat n care exista exact un drum ntre oricare doua varfuri. Heap-uri Structuri de multimi disjuncte Structuri de date abstracte Abstractizarea datelor reprezinta d e f a p t c o n c e n t r a r e a a s u p r a esentialului , ignorind detaliile (sau altfel spus, conteaza ce nu cum). Stapinirea aplicatiilor complexe se obtine prin descompunerea in module. Un modul trebuie sa e simplu, cu complexitatea ascunsa in interiorullui,si sa aiba o interfata simpla care sa permita folosirea lui fara a cunoaste implementarea. O structura de date abstracta e s t e u n modul consta n d d i n date si operatii .Datele sunt ascunse n interiorul modulului si pot accesate prin intermediuloperatiilor. Structura de date este abstract a deoarece este cunoscuta numai interfata structurii,nusi implementarea (operatiile sunt date explicit, valorile sunt denite implicit, prin intermediul operatiilor)

S-ar putea să vă placă și