Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
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 sorok Last In First Out (LIFO) – First In First Out (FIFO)
8
int tomb[] = new int[max]; int teteje=0; public boolean ures() {
Vermek, megvalósítása 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);} } int: teteje; (az első üres helyre mutat)
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) Állapotjelző Állapotjelző Másik megoldás két állapotjelzővel, de kicsit (talán) egyszerűbb algoritmussal
11
Sorok (programkód) 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);} } 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
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
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 Ellenőrizhető mutatók Ellenőrizhetetlen mutatók
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 Employee 1 Employee
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.