1 / 21

Egyenesvonalú ( lineáris ) adatszerkezetek

Egyenesvonalú ( lineáris ) adatszerkezetek. Absztrakt  Konkrét adatszerkezetek Specifikáció  Megvalósítás Szekvenciális elérés (fájl. perifériák) Véletlen elérés (vektor, fájl, perifériák, RDBMS-ek, Random Access Memory) (Alap)műveletek és hatékonyságuk Olvasás (Szelektor) Beírás

crevan
Download Presentation

Egyenesvonalú ( lineáris ) adatszerkezetek

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. Egyenesvonalú (lineáris) adatszerkezetek • Absztrakt  Konkrét adatszerkezetek • Specifikáció  Megvalósítás • Szekvenciális elérés (fájl. perifériák) • Véletlen elérés (vektor, fájl, perifériák, RDBMS-ek, Random Access Memory) • (Alap)műveletek és hatékonyságuk • Olvasás (Szelektor) • Beírás • Létrehozás (Konstruktor) és Beszúrás • Törlés • Keresés • Rendezés

  2. Tömbök SILAN nyelven class Person { attribute String name; attribute Person [0..*] child;}; class Person { attribute String name; attribute Set(Person) children;};

  3. Példa: tömbök Java nyelven • tipus[] nevek; //tömbhivatkozás • nevek = new tipus [12]; //helyfoglalás • int[] szamok = {1, 2, 3}; //kezdőértékezés (konstruktor) • DE!! HIBÁS!! szamok = {1, 2, 3}; • szam = szamok[4]; //kiolvasás – szelektor • szamok[4] = szam; //beírás • Keresést, beszúrást, törlést ciklussal be kell programozni!! Többdimenziós tömbök • Kétdimenziós tömb: egydimenziós tömbök tömbje. Pl: m méretű tömbökből felépített n méretű tömb: • tipus[n][m] nevek;

  4. Rekordszerkezet • Több, esetleg különböző részekből összetett adattípus • Osztály, függvények nélkül, csak látható tagokkal • Véges, ha az összetevők végesek, és ha nem rekurzív • Pascal: változtatható rekord: típusegyesítés • Feltehetőleg: helytakarékosság célzatából • type geographicalLocation =record case kind:(WGS,EOV) of WGS:(lat:Real,long:Real); EOV:(x,y:Real)end

  5. A Pascal halmazfogalma • type halmazom = set of tipusom • … ahol „tipusom” egy véges számosságú típus • ábrázolása: karakterisztikus függvény, bitvektor

  6. A Pascal fájl-fogalma • type filem = file of tipusom Tetszés szerint növekedő sorozatok leírására • type file2m = file of file of tipusom Szegmentált fájlok leírására • type text = file of char standard szövegfájlok

  7. Vermek és sorokLast In First Out (LIFO) – First In First Out (FIFO)

  8. Vermek, megvalósítása int: teteje; (az első üres helyre mutat) public class verem { int max = 100; int tomb[] = new int[max]; int teteje=0; public boolean ures() { return (teteje == 0);} public void beszur(int elem) { tomb[teteje++]=elem;} public int kivesz() { return (tomb[--teteje]);} public boolean tele() { return (teteje==max);} }

  9. Sorok int: farka; (az első üres helyre mutat, ide állítjuk az új elemet) int: feje; (a legelső tele elemre mutat) int: feje; (a legelső tele elemre mutat) int: farka; (az első üres helyre mutat, ide állítjuk az új elemet) • Hogy néz ki az üres sor- Hogy néz ki a tele sor- Hogy valósítható meg az állapotdiagram Újabb állapotjelző

  10. Sorok (tovább) • Másik megoldás két állapotjelzővel, de kicsit (talán) egyszerűbb algoritmussal Állapotjelző Állapotjelző

  11. public void beszur(int elem) { tomb[farka]=elem; ures = false; if (farka<max-1) farka++; else farka=0; if (farka == feje) tele = true;} public int kivesz() { int elem; elem = tomb[feje]; tele = false; if (feje<max-1) feje++; else feje = 0; if (feje == farka) ures = true; return (elem);}} Sorok (programkód) public class sor {int max = 100;int tomb[] = new int[max];int feje=0;int farka=0;boolean ures=true;boolean tele=false; public boolean ures() {return (ures);} public boolean tele() {return (tele);}

  12. Láncolt listák A listaelemek nem feltétlenül helyezkednek el növekvő sorrendben!!! Megvalósítás? Házi feladat…

  13. Változók helyfoglalása Hely szerint:- helyi- globális Mód szerint:- változó értékét tároljuk- változó hivatkozást tároljuk public static int RFactorial(int n) { if (n==0) return 1; return RFactorial(n-1)*n;} public static void main (String[] args) {… int n=5; int [] szamok = new int[5]; System.out.println(RFactorial(n)); …} Eljárás belépéskor a vermen helyet foglalunk Helyi változók Dinamikus memória (heap) Eljárásból kilépéskor a vermet ürítjük, és elengedjük a globálisan foglalt területeket

  14. Dinamikus memóriakezelés • Lefoglalás(C): malloc(int size):long • Elengedés: mfree(long address) • Meglehetősen gyakori művelet (átlag: 40% proc. idő!!) • Megvalósítás: szabad memória (növekvő) láncolt listában • Malloc: a szabadlistán megkeressük az első megfelelő méretű szegmenst • Mfree: a szabadlistába beszúrjuk az új szabad szegmenst • (+ esetleg egyesítjük a mellette levővel, ha van ilyen) • Multi-tasking/Multi-threading környezetekben (ha a heap közös/globális erőforrás), ronthatja a hatékonyságot

  15. Lefoglalási stratégiák: (malloc(1000)) - cím szerinti sorrendben - az első megfelelőt keressük - a legjobban illeszkedőt keressük • Problémák: - feltöredezés: bár még van hely, egy darabban mégsincs elegendő - lassú: régóta futó alkalmazások esetén végig kell futni a láncon, az pedig hosszú • Felszabadítási stratégiák: (mfree) - megkeressük a közvetlen előtte ill. utána levő szabad blokkot - megvizsgáljuk, hogy van-e illeszkedő szabad blokk - a szabad blokkokat egyesítjük

  16. Ellenőrizhetetlen mutatók Ellenőrizhető mutatók Szemétgyűjtés • Ötlet: elmozdítva a foglalt mezőket a szabad mezők egyesíthetők • Probléma: ellenőrizhetetlen mutatók • Megoldás lényege: ellenőrizhetetlen mutatók ellenőrzése • Pl: mutatótáblával

  17. Programfutás/memóriahasználat lokalitása • Mennyi a valószínűsége annak, hogy két egymás utáni utasítás/memória adathozzáférés egymástól ennyi távolságban van… • Jó lokalitás: hegyes (pl. program), rossz lokalitás (lapos)

  18. MicroQuill:SmartHeap Dinamikus memóriakezelés • Többféle lefoglalási stratégia (kicsi, közepes, nagy szegmensekre) • Idő-Tárhely (bizonytalansági reláció) • Fix méretű szegmensek 256byte alatt (a legelső elemet vehetjük) / (a leggyakoribb foglalási méret <256!) / fix méretű struktúrákhoz • Minden mérethez külön szabad lánc! • Középméret (256-64kB) • Virtuális memória / swapping  szabadlista végigjárása • Laptáblában a szabad memória méretét is tároljuk, laponként külön szabad lista csak 1 lapon belül keresünk szabad helyet egymás utáni foglalások lehetőleg ugyanarra a lapra esnek  jobb a program lokalitása • Nagy szegmensekre (ami nagyobb, mint a lapméret) normál foglalási algoritmus

  19. Dinamikus memóriakezelés tipikus hibái • Lefoglalt terület előtti vagy mögötti tilos területre írás (pl. string összefűzéskor) • Felszabadított terület írása/olvasása mfree(pointer); mfree(pointer); //dupla felszabadítás pointer=malloc(1000); Pointer=0; //memória-lyuk (leaking memory, Speicherloch)

  20. Dinamikus memóriakezelés referenciaszámlálóval (pl. Java, VB) Employee munkas = new Employee; Employee dolgozo = munkas; dolgozo = new Employee; munkas = new Employee; munkas 1 Employee munkas 2 Employee dolgozo munkas 1 Employee dolgozo 1 Employee munkas 1 Employee dolgozo 0 Employee 1 Employee

More Related