1 / 34

Algoritmi in podatkovne strukture

Algoritmi in podatkovne strukture. Uvodno predavanje k vajam Roman Gumzej. Laboratorij za sisteme v realnem času http://www.rts.uni-mb.si. Nekateri algoritmi so tako pogosto uporabljeni, da se jih je smiselno naučiti;

doane
Download Presentation

Algoritmi in podatkovne strukture

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 in podatkovne strukture Uvodno predavanje k vajam Roman Gumzej Laboratorij za sisteme v realnem času http://www.rts.uni-mb.si

  2. Nekateri algoritmi so tako pogosto uporabljeni, da se jih je smiselno naučiti; Podatkovne strukture so sistematična in urejena predstavitev podatkov; Uporaba vnaprej definiranih algoritmov in podatkovnih struktur; Pravilna izbira algoritmov in podatkovnih struktur glede na naravo problema. Algoritmi in Podatkovne Strukture ?

  3. Objektno Orientirano Programiranje Koncepti in konstrukti

  4. Razred objektov Razred: - združuje sorodne lastnosti objektov; - je skupek lastnosti in metod. Objekt: - je primerek razreda; - življenjski cikel objektov določajo metode razreda.

  5. Od točke do lika TOČKA KROG ELIPSA a C C C r b p=*r2 o=2*r* p= *a*b o=*(a+b) p=0 o=0

  6. Enkapsulacija Razred je abstrakten tip - definira vse potrebne operacije za spremenljivke tega tipa. Abstrakten tip uvedemo v C++ s strukturo. Dodatne možnosti, kot je na primer skrivanje podatkov, pa nam omogoča tip razred - class. Odslej bomo govorili samo še o razredih in objektih in nič več o tipih in spremenljivkah. Primer: točka v ravnini struct Točka { float x, y; void init(float x_k, float y_k) { x=x_k; y=y_k; } double ploščina() {return 0}; double obseg() {return 0}; }; class Točka { float x, y; public: void init(float x_k, float y_k) { x=x_k; y=y_k; } double ploščina() {return 0}; double obseg() {return 0}; };

  7. Točka Krog Elipsa Dedovanje Dedovanje: je postopek, po katerem izpeljani razred pridobi lastnosti in metode baznega razreda. class Krog : public Točka { float r; public: void init(int x, int, y, int a) { Točka::init(x,y); r=a; } double ploščina() { return pi*pow(r,2); } double obseg() { return 2*pi*r; } }; class Elipsa : public Točka { float a, b; public: void init(int x, int y, int d1, int d2) { Točka::init(x,y); a=d1; b=d2; } double ploščina() { return pi*a*b; } double obseg() { return pi*(a+b); } };

  8. Večličnost (polimorfizem) Večličnost: razrede, ki imajo identičen vmesnik, lahko pa jih uporabimo v različnem kontekstu, imenujemo večlične ali polimorfne. class Lik { float x, y; public: Lik(int x_k, int y_k) { x=x_k; y=y_k; } virtualdouble ploščina()=0; virtualdouble obseg()=0; virtualvoid nariši(); }; Razred je polimorfen, če deklarira ali deduje vsaj eno virtualno metodo. class Krog : public Lik { float r; public: Krog(int x, int, y, int a):Lik(x,y) {r=a;} virtualdouble ploščina() { return pi*pow(r,2); } virtualdouble obseg() { return 2*pi*r; } virtualvoid nariši(); }; class Elipsa : public Lik { float a, b; public: Elipsa(int x, int y, int d1, int d2):Lik(x,y) { a=d1; b=d2; } virtualdouble ploščina() { return pi*a*b; } virtualdouble obseg() { return pi*(a+b); } virtualvoid nariši(); };

  9. 8 ploščina obseg nariši 12 ploščina obseg nariši 16 ploščina obseg nariši Tabela virtualnih metod (VMT) l Lik *l=new Lik(x,y); Krog *k=new Krog(x,y,r); Elipsa *e=new Elipsa(x,y,a,b); … k->nariši(); … l=k; l->nariši(); ... x y k x y r e x y a b VMT

  10. Čiste virtualne funkcije in abstraktni razredi V primeru, da določena funkcija v baznem razredu ni definirana, vemo pa, da bo definirana v vseh izvedenih razredih, jo definiramo brez telesa v abstraktnembaznemrazredu. V tem primeru gre za čistovirtualnometodo (npr.: metodi ploščina() in obseg() v razredu Lik nimata pomena). Zanjo se rezervira samo vstop v VMT (tabeli virtualnih metod). Primer: class X { ... virtual void fun1 (); // virtualna metoda virtual void fun2() = 0; // čista virtualna metoda ... }

  11. Konstruktorji & Destruktorji Konstruktorji in destruktorji razredov določajo način, kako bodo objekti teh razredov ustvarjeni, inicializirani, kopirani in uničeni. • Ne vračajo rezultata (niti void); • Ni jih mogoče dedovati, čeprav konstruktorji in destruktorji izpeljanih razredov lahko kličejo konstruktorje in destruktorje baznega razreda; • Konstruktorji lahko imajo privzete argumente ali sezname inicializacijskih spremenljivk; • Destruktorji so lahko virtualni, konstruktorji pa ne; • Destruktorje lahko kličemo kot navadno funkcijo z navedbo celotnega imena, konstruktorjev pa ne; • Prevajalnik ustvari avtomatske klice konstruktorjev in destruktorjev pri kreiranju in uničevanju objektov; • Konstruktorje in destruktorje lahko implicitno kličeta operatorja new in delete, če je potrebno dodeljevanje oz. sproščanje spomina za ustrezen objekt; • Če razred vsebuje konstruktorje, se eden od njih kliče vsakič, ko definiramo objekt x razreda X.

  12. Delo z objekti v spominu Definiramo lahko različne tipe objektov razreda X: X x; // x je statični objekt razreda X (kot pri struct) X &x; // x je referenca na objekt razreda X X *x; // x je kazalec na objekt razreda X X x[10]; // x je polje objektov razreda X velikosti 10 elementov.

  13. “new” in “delete” Operatorja new in delete sta v C++ nadomestila malloc in free iz standardnega C jezika. new rezervira prostor za nov objekt, delete pa ga sprosti. int *ki=(int*) malloc(4); // je enako: int *ki=newint(1); … *ki=5; printf(“%d”,*ki); … free(ki); // je enako: delete ki; … Izpis: 5 … Lik *l=new Lik(x,y); Krog *k=new Krog(x,y,r); Elipsa *e=new Elipsa(x,y,a,b); … k->nariši(); … l=k; l->nariši(); … delete l; delete k; delete e;

  14. Priprava na vaje Sortirni algoritmi in Osnovne podatkovne strukture

  15. Algoritmi Sortiranje

  16. Navadno izbiranje Algoritem: na vsakem koraku izberemo najmanjši podatek (med ne-sortiranimi preostalimi) in ga umestimo na ustrezno mesto v sortiranem polju void straightselection (int a[], int n) { int i,j,k; int x; for (i=0; i<(n-1); i++) { k=i; x=a[i]; for (j=i+1; j<n; j++) if (a[j]<x) { k=j; x=a[j]; } a[k]=a[i]; a[i]=x; } } ZAMENJAVA PRIMERJAVA Primer: 44 55 12 42 94 18 06 67 06 5512 42 94 18 44 67 06 12 55 42 94 18 44 67 06 12 18 42 94 55 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 9467 06 12 18 42 44 55 67 94

  17. Sortiranje s premenami Algoritem: na vsakem koraku primerjamo vse še neurejene sosednje člene in jih med sabo zamenjamo če ugotovimo, da so v napačnem vrstnem redu. void bubblesort (int a[], int n) { int i,j; int x; for (i=1; i<n; i++) { for (j=n-1; j>=i; j--) if (a[j-1] > a[j]) { x=a[j-1]; a[j-1]=a[j]; a[j]=x; } } } PRIMERJAVA ZAMENJAVA Primer: 44 55 12 42 941806 67 06 44 5512429418 67 06 12 44 5518 42 9467 06 12 18 44 5542 67 94 06 12 18 42 44 55 67 94 06 12 18 42 44 55 67 94 06 12 18 42 44 55 67 94 06 12 18 42 44 55 67 94

  18. Sortiranje s porazdelitvami Algoritem: izberemo "srednji" element in nato zamenjamo vse elemente na desni, ki so manjši od izbranega s tistimi na levi, ki so večji. Rekurzivno na enak način uredimo tudi po dve delni polji, ki na ta način nastaneta. void sort (int a[], int l, int r) { int i,j; int x,w; i=l; j=r; x=a[(l+r) / 2]; do { while (a[i] < x) i++; while (x < a[j]) j--; if (i<=j) { w=a[i]; a[i]=a[j]; a[j]=w; i++; j--; } } while (i<j); if (l<j) sort(a,l,j); if (i<r) sort(a,i,r); } void quicksort (int a[], int n) { sort(a,0,n-1); } PRIMERJAVA ZAMENJAVA Primer: 4455 12 42 94 1806 67 06 1812|42|945544 67 06 12|18|42|44 55|94 67 06|12|18|42|44|55|67|94

  19. Osnovne podatkovne strukture Sklad

  20. vstavi odstrani globina začetek S Sklad Sklad je urejena LIFO podatkovna struktura. Do njenih členov dostopamo samo na vrhu. Lahko mu pripišemo globino n. Operacije: pripravi(S) pripravi novi sklad, vstavi(p,S) vstavi podatek p v sklad, briši(S) odstrani podatek na vrhu iz sklada, vrh(S) vrne podatek na vrhu sklada, prazno(S) vrne true ali false.

  21. Element: • podatek • naslednji Sklad: - začetek Sklad - implementacija Dinamična implementacija zahteva dve podatkovni strukturi: sklad sam in njegovi elementi. Vstavljanje na sklad: Novi element povežemo s prejšnjim začetkom. Nato kazalec na začetek preusmerimo na novi element. Odstranjevanje iz sklada: Začetek sklada prestavimo na naslednji element, tistega, na katerega je kazal, pa izbrišemo.

  22. Osnovne podatkovne strukture Vrsta

  23. rep glava odstrani vstavi začetek Vrsta Vrsta je urejena FIFO podatkovna struktura. Elemente dodajamo na repu (koncu) in jih jemljemo iz glave (začetka) vrste. Lahko ji pripišemo dolžino n. Operacije: pripravi(V) pripravi novo vrsto, vstavi(p,V) vstavi podatek p v vrsto, briši(V) odstrani podatek iz začetka vrste, začetek(V) vrne podatek na začetku vrste, prazno(V) vrne true ali false.

  24. Element: • podatek • naslednji • Vrsta: • Začetek • Konec Vrsta - implementacija Dinamična implementacija zahteva dve podatkovni strukturi: vrsto in njene elemente. Vstavljanje v vrsto: Če je prazna, ustvarimo nov element in nanj postavimo tako začetek kot konec vrste. Sicer ustvarimo nov element in ga vstavimo na koncu (element na koncu pokaže nanj kot na naslednje vozlišče, nato pa nanj prestavimo še kazalec na konec). Odstranjevanje iz vrste: Če ni prazna, element iz vrste odstranimo tako, da odstranimo element na začetku, kazalec na začetek pa pokaže na naslednjega.

  25. Vrsta Statična implementacija -krožna vrsta

  26. rep glava Krožna vrsta Vstavi: - vstavi člen - rep := (rep+1) mod dolžina_vrste Briši: - glava := (glava+1) mod dolžina_vrste Polna: - ali velja (rep+1) mod dolžina_vrste = glava Prazna: - ali rep in glava kažeta na isto mesto

  27. Osnovne podatkovne strukture Seznam

  28. Začetek 0 pod[0] 1 pod[1] 2 pod[2] dolžina Seznam Seznam je linearno urejena podatkovna struktura. Lahko mu pripišemo dolžino n. Seznam je urejen, kar pomeni, da pri vstavljanju vanj upoštevamo vrstni red indeksov ali podatkov, ki so v njem vpisani. V slednjem primeru govorimo o asociativnem seznamu. Operacije: pripravi(S) pripravi nov seznam, vstavi(S,i,p) vstavi podatek p na i-to mesto, vrini(S,i,p) vrini podatek p na i-to mesto, briši(S,i) odstrani podatek na i-tem mestu, vrni(S,i) vrne podatek z i-tega mesta,išči(S,p) vrne mesto podatka v seznamu, prazno(S) vrne true ali false.

  29. Element: - podatek - naslednji • Seznam: • Začetek Seznam - implementacija Dinamična implementacija zahteva dve podatkovni strukturi: seznam in njegove elemente. Vstavljanje v seznam: Element vstavimo v seznam glede na indeks, ki smo ga podali kot parameter. Element vstavimo tako, da prepišemo vsebino elementa, če se le-ta na izbranem indeksu že nahaja. Sicer gre za napako pri vstavljanju. Izjema je prvi element. Vrivanje v seznam: Element vrinemo na izbrano mesto v seznamu tako, da element na indeksu "i-1" prevežemo na novi element. Kazalec na naslednji element novega elementa prevežemo na element na indeksu "i", ki se z vrivanjem prestavi na indeks "i+1". Vrivanje elementa na indeks, ki je enak velikosti seznama, pomeni dodajanje na koncu. Če je ta indeks večji od za eno zvečanega števila vozlišč, gre za napako. Brisanje iz seznama: Če seznam ni prazen in element, na katerega se sklicujemo v seznamu obstaja, ga izbrišemo, tako da povežemo njegovega predhodnika in naslednika. Iskanje elementa v seznamu: Operacije lahko razširimo z operacijo iskanja elementa v seznamu. Ta nam vrne indeks elementa v seznamu na podlagi iskanega podatka. Na ta način ugotovimo na katerem indeksu je podatek, ki ga želimo npr. izbrisati.

  30. Seznam Začetek Element Podatek Naslednji Sklad Vrsta Konec Linearne podatkovne strukture (izpeljava) Pristop: 1. implementacija seznama; 2. Implementacija sklada in vrste z dedovanjem iz seznama.

  31. Osnovne podatkovne strukture Binarno drevo

  32. p levi desni Binarno drevo Drevo je ne-linearna podatkovna struktura. Binarno drevo ima v vsakem vozlišču (očetu) dve povezavi na naslednji vozlišči (levi in desni sin) enake strukture - rekurzivna definicija. Vozlišče, kjer začnemo drevesno strukturo je koren drevesa, vozlišča brez sinov pa so listi drevesa. Binarno iskalno drevo ali binarni slovar je drevo, za katerega velja, da je ključ v vozlišču večji od ključa v levem sinu in manjši od ključa v desnem sinu za vsako vozlišče v drevesu, ki ni list. Operacije: pripravi(D) pripravi novo drevo, vstavi(D,p) vstavi podatek p v drevo, odstrani(D,p) odstrani podatek p iz drevesa, išči(D,p) vrne true ali false glede na to ali je podatek p v drevesu ali ne, prazno(D) vrne true ali false, preorder(), inorder(), postorder()izpisdrevesa. levi->p < p < desni->p

  33. Element: • podatek, • levi sin, • desni sin. Drevo: - koren Binarno drevo-implementacija Dinamična implementacija zahteva dve podatkovni strukturi: drevo in njegove elemente. Vstavljanje v binarni slovar: Če je drevo prazno ustvarimo samo koren in vanj vpišemo ustrezni podatek. Sicer poiščemo ustrezno mesto za novi podatek. Po levi veji se pomaknemo, če je podatek manjši in po desni, če je večji od podatka v trenutnem vozlišču. Ko pridemo do vozlišča, ki ustreznega levega oziroma desnega vozlišča nima, ga ustvarimo in vanj vpišemo novi podatek. Odstranjevanje iz binarnega slovarja: Iz binarnega slovarja odstranjujemo tako, da najprej ugotovimo ali vsebuje podatek, ki ga želimo odstraniti. Ko ga najdemo, ga nadomestimo z največjim levim sinom ali z najmanjšim desnim sinom (če gre za notranje vozlišče in ima oba sina); nato pa rekurzivno izbrišemo še tega. Če je brisano vozlišče list, ga lahko enostavno odstranimo in izbrišemo povezavo nanj, sicer pa ima samo levega ali desnega sina in ga preprosto nadomestimo z njim.

  34. Pravila igre Vaje predstavljajo praktični del izpita. Materiale za vaje najdete na naslovu “www.rts.uni-mb.si”. Na voljo je demonstracijski program, vsebina predavanj in predloge za vaje. Pri izdelavi vaj uporabite programski jezik C++. Za pozitivno oceno je potrebno izdelati obvezne naloge. Teoretični del izpita je mogoče opraviti s pisnim izpitom ali s kolokvijema. Rezultati teoretičnega izpita veljajo do naslednjega izpitnega roka.

More Related