440 likes | 810 Views
Algoritmi si Structuri de date. Cuprins (Structuri elementare):. Structuri lineare in alocare statica in alocare dinamica - liste structuri lineare cu restrictii la i/o: stive si cozi Structuri arborescente arbori oarecari arbori binari cautare folosind arbori binari Sortari interne
E N D
Cuprins (Structuri elementare): • Structuri lineare • in alocare statica • in alocare dinamica - liste • structuri lineare cu restrictii la i/o: stive si cozi • Structuri arborescente • arbori oarecari • arbori binari • cautare folosind arbori binari • Sortari interne • Arbori binari stricti. Aplicatii. • Conf. Dr. Rodica Ceterchi • “Structuri de date si algoritmi: aspecte matematice si aplicatii”, Ed. Univ. Buc. 2001
Cuprins (alta abordare): • tipuri de date structurate • lineare • ne-lineare: arbori si grafuri • tehnici de sortare • clasa algoritmilor de sortare bazati pe comparatii intre chei • sortare prin interclasare (merging) • alte tipuri de sortari • tehnici de cautare • cautare lineara • cautare bazata pe comparatii intre chei…. • structuri arborescente pt. cautare: arbori binari de cautare, arbori binari de cautare echilibrati AVL, … • tabele de dispersie • alte structuri
avem de reprezentat multimi (finite, de date omogene) • statice - componenta nu se schimba in timp • dinamice - componenta se schimba in timp • multimi … pe care facem diverse operatii • … in scopul rezolvarii unor probleme
Algoritmi • Algorithm = well-defined computational procedure that • Takes some value/set of values as input, and • Produces some value/set of values as output • (computational) Problem = a desired input/output relationship, • specified in general terms • Algorithm = tool for solving a problem • = computational procedure which achieves the desired input/output relationship
Example of Problem: sorting • Input: a sequence (a1, a2, …, an) • Output: a permutation p of the set {1,…,n} such that in (ap(1), ap(2), …, ap(n)) we have • ap(1) <= ap(2)<= …<= ap(n) • (we can add further constraints, such as: • -the space occupied by the input and the output data should be the same • -the algorithm is essentially based on direct comparisons of keys, ai < aj • which will be the case for the algorithms considered in the sequel) • For any i in [1..n]ai belongs to X a totally ordered set • all inputs of size n = Xn • an input instance = an element (a1, a2, …, an) of Xn • An algorithm is correct (solves the given problem) iff • -it halts • -it produces the desired output
Sortarea prin insertie directa • pas iterativ (1): se ia componenta A[2] şi se inserează la locul ei în vectorul sortat de lungime 1, A[1], producând un vector sortat de lungime 2. • pas iterativ (i): (pasă) vectorul este împărţit în două părţi: A[1], …, A[i] este sortată crescător şi se numeşte destinaţie, iar A[i+1], …, A[n] este încă nesortată şi se va numi sursă. Se ia prima componentă din sursă, A[i+1], şi se caută să se insereze la locul ei în destinaţie. Căutarea locului lui A[i+1] în destinaţie se face linear, parcurgând destinaţia de la dreapta la stânga şi mutând pe rând câte o poziţie la dreapta componentele care sunt mai mari decât valoarea de inserat, până când găsim locul valorii x =A[i+1] şi o inserăm.
Sortarea prin insertie directa procedure InsDir (A) {sortare prin insertie directa a vectorului A[1..n]} for i:= 2 to n do x:= A[i]; {se caută locul valorii x în destinaţie} j:= i- 1; while (j > 0) and (x < A[j]) do A[j+1]:= A[j] j:= j- 1 endwhile {inserarea lui x la locul lui} A[j+1]:= x endfor endproc.
Sortarea prin insertie directa (cont.) procedure InsDir1(A) {s. prin insertie directa a vectorului A[1..n] cu componenta marcaj A[0]} for i:= 2 to n do {se introduce valoarea în componenta marcaj} A[0]:= A[i]; {se caută locul valorii în destinaţie} j:= i-1; while (A[0] < A[j]) do A[j+1]:= A[j] j:= j-1 endwhile A[j+1]:= A[0] endfor endproc.
Colectii finite, de date omogene • fiecare data (element al colectiei) identificata printr-o cheie • structura de date - mentinerea unei asemenea colectii, cu o anumita organizare interna • operatii specifice de efectuat pe elementele structurii
Operatii de baza • Traversarea • operatia care acceseaza fiecare element al structurii, o singura data, in vederea procesarii (vizitarea elementului) • Cautarea • se cauta un element cu cheie data in structura • cu sau fara succes • consta dintr-o traversare - eventual incompleta a structurii, in care vizitarea revine la comparatia cu elementul cautat • problema cheilor multiple - gasirea primei aparitii, a tuturor aparitiilor
Operatii de baza (cont.) • Inserarea • adaugarea unui nou element structurii, cu pastrarea tipului structurii • Stergerea • extragerea unui element al structurii (eventual in vederea unei procesari), cu pastrarea tipului structurii pe elementele ramase • Inserarea si Stergerea - reprezentarea multimilor cu caracter dinamic • costuri mici
Operatii (cont.) • (1) iniţializarea structurii cu structura vidă • (2) un ciclu repetitiv (de lungime variabilă) • (a) se ia câte un element dintr-un fişier de intrare; • (b) pentru fiecare asemenea element se apelează o procedură ce implementează operaţia de inserare. • Initializarea structurii cu structura vida • Crearea - prin inserari repetate
Operatii (cont.) • Combinare (merge) • din doua structuri de acelasi tip se produce o alta structura, de acelasi tip, ce contine reuniunea elementelor structurilor de intrare • ex: interclasarea a doua str. liniare ordonate • Sortarea • ordonarea totala a elementelor • sortarea multimilor statice • sortarea multimilor dinamice
Observatii • Legatura operatiilor intre ele • inserare/stergere - inverse una alteia • inserare/stergere - sunt precedate de cautarea locului in care se fac • cautarea - traversare (eventual incompleta) • NU toate operatiile se implementeaza pe toate structurile! • fiecare structura are operatii specifice
Structura de date • Colectie finita de date omogene… • o anume organizare - structura • un anumit tip de acces la date • impreuna cu o multime de operatii specifice - gestionarea structurii • algoritmi specifici ce implementeaza aceste operatii
Clase principale de structuri • Lineare • Nelineare • arborescente • grafuri
Structuri Lineare • In alocare • statica - vectori • dinamica - liste inlantuite • Operatii de i/o (inserari/stergeri) • fara restrictii i/o • cu restrictii la i/o (stive si cozi)
Structuri lineare in alocare statica • Traversare • Inserare • Stergere • Cautare
Traversarea(unei str. liniare in alocare statica) procedure Traversare(A, 1, n) k := 1; {iniţializarea indicelui pentru traversare} while k <= n do {test pentru nedepăşirea structurii} vizitează A[k]; k := k+1; {trecem la componenta următoare} endwhile endproc
Inserarea (intr-o str. liniara in alocare statica) procedure Insert(A, 1, n, k, Elem) {inserează în structura liniară A[1 .. n], pe poziţia k, 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; while i >= k do A[i+1] := A[i]; i := i-1; endwhile {inserarea propriu-zisă} A[k] := Elem; {creşte dimensiunea structurii} n := n+1; endproc
Stergerea (dintr-o str. liniara in alocare statica) procedure Delete(A, 1, n, k, X) {extrage în X valoarea A[k] şi reface vectorul} {extragerea propriu-zisă} X := A[k]; {refacerea structurii de vector} for i := k to n-1 do A[i] := A[i+1]; endfor {scade dimensiunea structurii} n := n-1; endproc
Costuri - inserare pi = probabilitatea evenimentului de a insera o valoare nouă pe componenta i, i [1..n]. La inserarea pe poziţia i trebuie să mutăm n-i+1 componente. Numărul mediu de mutări la inserare M = pi (n - i+1) . Dacă p1 = …= pn = 1/n atunci M = (1/n) ( n + ( n –1) + …. + 1 ) =(n+1)/2 • In functie de mutari de componente
Costuri - stergere pi = probabilitatea evenimentului de a sterge componenta i, i [1..n]. La stergerea lui A[i] trebuie să mutăm n-i componente. Numărul mediu de mutări la stergere M = pi (n - i) . Dacă p1 = …= pn = 1/n atunci M = (1/n) ( ( n –1) + …. + 1 ) =(n-1)/2 • In functie de mutari de componente
Cautarea(unei valori date intr-o str. lineara in alocare statica) procedure SearchLin ( A, 1, n, Val, Loc) {caută liniar valoarea Val în A[1..n] şi returnează Loc = 0 dacă nu o găseşte, şi o valoare Loc [1..n] dacă o găseşte pe componenta A[Loc]} Loc: = 0 i:= 1; while (i <= n) and (A[i] <> Val) do i:= i+1 endwhile if i<= n then Loc:= i endif endproc {SearchLin}
Cautarea lineara - componenta marcaj procedure SearchLin1 ( A, 1, n, Val, Loc) {Căutare lineară de la stanga la dreapta} A[n+1]: = Val {introducem Val pe componenta marcaj, care va fi la capatul din dreapta} Loc: = 1 while A[Loc] <> Val do Loc: =Loc +1 endwhile if Loc = n+1 then "Căutare fără succes" else "Am găsit pe componenta Loc" endif endproc; {SearchLin1}
Complexitate (costuri) - cautare lineara pi = probabilitatea evenimentului Val=A[i] (gasim valoarea căutată pe componenta i), i [1..n]. q = probabilitatea ca Val să nu se găsească în A[1..n]. Avem pi + q = 1 . Pentru fiecare i [1..n+1], pentru a decide căprima apariţie a lui Val este pe componenta A[i], facem i comparaţii. Numărul mediu de comparaţii va fi: C = pi i + q(n+1) . • In functie de componente accesate (comparatii)
Complexitate (costuri) - căutare lineară(cont.) Cazul căutării cu succes: - Val se găseşte precis în vector, i.e. q=0 - se găseşte cu probabilitate egală pe oricare din componente, i.e. p1 = …= pn = 1/n C = (1/n) ( 1 + 2 + ……. + n) = (n+1)/2 numărul mediu de comparaţii în cazul căutării cu succes. Cazul căutării fără succes: - se traversează toata structura, se accesează n+1 comp. C = n+1
Caz particular - vector ordonat crescător A[1] A[2] … A[n] • Structură lineară in alocare statica (secventiala) • organizare suplimentara • Informatie in plus • permite imbunatatirea cautarii • lineare • alta cautare - cautarea binara • necesita modificarea algoritmilor de inserare
Cautarea lineara intr-un vector sortat procedure SearchLinOrd (A, 1, n, Val, Loc) Loc:= 0 i:= 1 while (i <= n) and (A[i] < Val) do i:=i+1 endwhile if i <= n then if A[i] = Val then {căutare cu succes} Loc:= i else {A[i] > Val} {căutare fără succes**} endif else {căutare fără succes} endif endproc{ SearchLinOrd}
Cautarea binara (intr-un vector sortat) A[1..n] un vector cu A[1] A[2] … A[n] Algoritmul de căutare binară: (1) Se începe cu segmentul definit de indicii Left:= 1 şi Right:= n (2) Pentru fiecare subvector A[Left..Right] se repetă: (a) Se calculează mijlocul segmentului Mid:= (Left + Right) div 2 (b) Se compară Val cu A[Mid]: - dacă Val = A[Mid] căutarea se termină cu succes; - dacă Val < A[Mid] se reia pasul (2) pe [Left..Mid-1]; - dacă Val > [Mid] se reia pasul (2) pe [Mid+1..Right].
procedure SearchBin(A, 1, n, Val, Loc) • Left:= 1; Right:= n; • Mid:=(Left + Right) div 2; • Loc:= 0 • while (Left <= Right) and (Val <> A[Mid] ) do • if Val < A[Mid] then {se continuă pe subintervalul din stânga} • Right:= Mid-1 • else {Val > A[Mid]} {se continuă pe subintervalul din dreapta} • Left:= Mid+1 • endif • Mid:= (Left + Right) div 2 • endwhile • if A[Mid] = Val then • Loc:= Mid {căutare cu succes} • else Loc:= 0 {căutare fără succes} • endif • endproc{SearchBin}
Cautarea binara - complexitate C(n) = numărul de comparaţii pe care îl necesită căutarea binară pe un vector cu n componente. După fiecare comparaţie dimensiunea segmentului pe care căutăm se reduce la jumătate. Dacă după C(n) comparaţii am încheiat căutarea, atunci 2C(n) > n > 2C(n)-1 de unde C(n) = log2 n +1 complexitatea căutării binare - O(log2 n) complexitatea căutării lineare (secventiale) - O(n)
Bibliografie 1. D.E. Knuth :"Tratat de programarea calculatoarelor", vol. I si III 2. T. H. Cormen, C. E. Leiserson, R. L. Rivest: "Introduction to Algorithms", The MIT Press, 1990 3. N. Wirth: "Algorithms + Data Structures = Programs", Prentice Hall Inc., 1976 4. A. V. Aho, J. E. Hopcroft, J. D. Ullman: "Data Structures and Algorithms", Addison-Wesley Publ. Comp., 1983 5. S. Baase: "Computer Algorithms: Introduction to Design and Analysis", Addison-Wesley Publ. Comp., 1988 6. L. Nyhoff, S. Leestma: "Advanced programming in Pascal with Data Structures", MacMillan Publ. Comp. N.Y., 1988 7. L. Livovschi, H. Georgescu: "Sinteza si analiza algoritmilor", Ed. Stiintifica si Enciclopedica, Bucuresti, 1986 8. C. Ionescu Texe, I. Zsako: "Structuri arborescente cu aplicatiile lor", Ed. Tehnica, Bucuresti, 1990 9. I. Tomescu: "Data Structures", Editura Univ. din Bucuresti, 1997 10. Rodica Ceterchi "Structuri de date", Editura Univ. din Bucuresti, 2001