210 likes | 299 Views
Learn about linear data structures, sequential and random access, basic operations, arrays, records, classes, stacks, memory management, and more. Dive into examples and programming concepts in SILAN and Java languages.
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