210 likes | 288 Views
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
E N D
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
Tömbök SILAN nyelven class Person { attribute String name; attribute Person [0..*] child;}; class Person { attribute String name; attribute Set(Person) children;};
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;
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
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
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
Vermek és sorokLast In First Out (LIFO) – First In First Out (FIFO)
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);} }
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ő
Sorok (tovább) • Másik megoldás két állapotjelzővel, de kicsit (talán) egyszerűbb algoritmussal Állapotjelző Állapotjelző
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);}
Láncolt listák A listaelemek nem feltétlenül helyezkednek el növekvő sorrendben!!! Megvalósítás? Házi feladat…
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
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
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
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
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)
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
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)
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