1 / 37

Algoritmi si Structuri de date

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

aidan-king
Download Presentation

Algoritmi si Structuri de date

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Algoritmi si Structuri de date

  2. 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

  3. 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

  4. ALGORITHMS + DATA STRUCTURES=PROGRAMS(N. Wirth, 1976)

  5. 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

  6. 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

  7. 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

  8. pseudo-cod; independenta de implementare

  9. 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.

  10. 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.

  11. 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.

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. Clase principale de structuri • Lineare • Nelineare • arborescente • grafuri

  20. 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)

  21. Structuri lineare in alocare statica • Traversare • Inserare • Stergere • Cautare

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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}

  28. 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}

  29. 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)

  30. 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

  31. 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

  32. 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}

  33. 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].

  34. 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}

  35. 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)

  36. Bibliografie

  37. 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

More Related