740 likes | 837 Views
V. Adatszerkezetek, kollekciók. 20. Klasszikus adatszerkezetek 21. Kollekció keretrendszer. V. Adatszerkezetek, kollekciók. 20. Klasszikus adatszerkezetek 1. Az adatszerkezetek rendszerezése 2. Absztrakt tárolók 3. Tömb 4. Tábla 5. Verem 6. Sor 7. Fa 8. Irányított gráf, hálózat.
E N D
V. Adatszerkezetek, kollekciók 20. Klasszikus adatszerkezetek 21. Kollekció keretrendszer
V. Adatszerkezetek, kollekciók 20. Klasszikus adatszerkezetek 1. Az adatszerkezetek rendszerezése 2. Absztrakt tárolók 3. Tömb 4. Tábla 5. Verem 6. Sor 7. Fa 8. Irányított gráf, hálózat
Adatszerkezetek • Adatmodell, eljárásmodell • Adatszerkezet: egymással kapcsolatban álló adatok, objektumok összessége • Elemei: csomóponti adatok, kapcsolatok • Reprezentáció: gráffal • csomóponti adatok: gráf csúcsai • kapcsolatok: gráf élei • Műveletek • Konstrukciós műveletek • Szelekciós műveletek
Boldog Boglárka Fekete Farkas Madár Aladár Madár Aladár Boldog Boglárka Fekete Farkas Példa: Hallgató objektumok összekapcsolása
ADATSZERKEZETEK Hierarchikus Asszociatív Szekvenciális Hálós Tömb Tábla Sor Fa Ir. gráf Hálózat Verem Adatszerkezetek rendszerezése azelemek közötti kapcsolatok alapján
Asszociatív csoport Asszociatív adatszerkezet Szekvenciális adatszerkezet
Hierachikus adatszerkezet Hálós adatszerkezet
Absztrakt tárolók • Címezhető tárolókon absztrakt tárolási lehetőségek: • Egydimenziós tömb • Láncolt lista • Absztrakt tároló helye: bármilyen címezhető hardver elem (pl. memória, lemezes egység) • Az adatszerkezetek leképezhetők absztrakt tárolókra Egydimenziós tömb • A tárolt objektumok közvetlenül egymás után helyez-kednek el, ugyanolyan távolságra egymástól • Elemei indexeléssel közvetlenül címezhetők
1 2 3 n ... L Adat Mutató Végjel Láncolt lista • Elemei mutatókon keresztül össze vannak kapcsolva • A listát az első listaelem mutatója (L) meghatározza • Egy listaelem: adat + mutató Egyirányú nyíltvégű láncolt lista
Láncolt lista (folyt.) • Elemei fizikailag bárhol elhelyezkedhetnek • Előnye: beszúrás, törlés egyszerű • Változatai: • Nyíltvégű lista • Cirkuláris (zárt) lista • Rendezett lista • Kétirányú (szimmetrikus) lista • Fejelt lista • Multilista (többszörös lista)
Tömb • Asszociatív adatszerkezet • Fajtái: • Általános tömb • Ritka mátrix Általános tömb • Elemei indexeléssel közvetlenül elérhetők • Hátrányai • méretét előre meg kell adni • indexhatárok dimenziónként kötöttek • Tárolás: egydimenziós tömbben(az adatszerkezet általában maga a tároló)
Ritka mátrix • Olyan többdimenziós tömb, ahol a tömb nagy része kihasználatlan • Tárolás: láncolt listában
Kérem azt az adatot, melynek kulcsa ... Tábla • Asszociatív adatszerkezet • Egy elem: egyedi kulcs + adat • Tárolás: egydimenziós tömbben vagy láncolt listában
Táblák osztályzása (tárolási mód alapján) • Soros tábla • Önátrendező tábla • Rendezett tábla • Hasító (kulcstranszformációs) tábla Hasítótábla (hash table) • Hasítófüggvény (kulcstranszformációs függvény):kulcs elem fizikai címe • Hasonlítgatások száma minimális • Legjobb táblaszervezési mód: egyértelmű leképezés a kulcsok és a fizikai címek között • Szinonímák • azonos címre leképezett kulcsok • megvalósítás: láncolt listával
Hasítófüggvény Kulcs Hasító(Kulcs) Kulcs+Adat Kulcs Kulcs+Adat Kulcs+Adat Kulcs+Adat Kulcs+Adat Hasítótábla egyértelmű leképezéssel Hasítótábla szinonímákkal
PUSH POP Legfiatalabb Legidősebb Verem (stack) • Szekvenciális adatszerkezet • LIFO (Last In First Out) szerkezet • Műveletei: PUSH, POP, TOP
Verem (folyt.) • Tárolás: általában egydimenziós tömbben • Alkalmazásai: • Elemek sorrendjének megfordítása • Visszatérési utak megjegyzése • Memóriaverem: metódusok hívásakor a visszatérési címek és lokális változók tárolása
GET ... PUT Utolsó Legfiatalabb Első Legidősebb Sor (queue) • Szekvenciális adatszerkezet • FIFO (First In First Out) adatszerkezet • Műveletei: PUT, GET, FIRST
1. 2. 3. 4. 5. ... Max — 34 66 2 999 7 — — Első Utolsó Sor (folyt.) • Tárolás: egydimenziós tömbben vagy láncolt listában Ciklikus tárolás egydimenziós tömbben: • Alkalmazása: elemek feldolgozása érkezési sorrendbenPéldául: pufferek (billentyűzetpuffer, nyomtatópuffer)
Gyökér 0. szint 1. szint Elágazás (3 fokú) Részfa Levél (0 fokú) 3. szint e f a b g c d Fa • Hierarchikus adatszerkezet • Elemei: csomópontok és egyirányú kapcsolatok • Rekurzív definíció, rekurzív algoritmusok
e f a b g c d Fával kapcsolatos fogalmak • Kezdőpont, végpont • Gyökér, elágazás, levél • Csomópont foka, fa foka • Szülő, gyerek • Szintszám • Fa magassága • Rendezett fa • Kiegyensúlyozott fa
e f a b g c d Fa bejárása • Gyökérkezdő (preorder) a b c d g e f • Gyökérvégző (postorder) b c a b d e f c a b g d e f c a
e d a j i c b f h g Bináris fa Gyökeréből legfeljebb két részfa ágazik: baloldali és jobboldali részfa Bejárása • Gyökérkezdő (preorder) a b d c e g h i j f • Gyökérközepű (inorder) d b a g e i h j c f • Gyökérvégző (postorder) d b g i j h e f c a
4 13 12 5 3 7 1 9 8 11 14 15 10 2 6 Rendezett bináris fa • Keresési fa (kereső fa, rendező fa) • A baloldali részfa összes eleme kisebb, mint a szülő • A jobboldali részfa összes eleme nagyobb, mint a szülő • Egy n szintű fa elemeinek száma maximum 2n+1-1 • Egy elemet maximum n+1 lépésben megtalálunk
4 13 12 5 3 7 1 9 8 11 14 15 10 2 6 Kiegyensúlyozott bináris fa Elemek beszúrási sorrendje: 8, 4, 12, 10, 9, 14, 2, 3, 6, 1, 15, 5, 7, 13, 11
13 12 3 4 5 8 1 2 6 14 9 10 11 7 15 Degenerált bináris fa Elemek beszúrási sorrendje: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
a b c d g e f Fa tárolása multilistában
e d a c b d 4 1 c 7 2 a 9 2 b Hálós adatszerkezetek Irányított gráf Hálózat
V. Adatszerkezetek, kollekciók 21. Kollekció keretrendszer 1. A kollekció keretrendszer felépítése 2. A Collection interfész és leszármazottai 3. A HashSet osztály – hasítási technika 4. A TreeSet osztály – Comparator 5. Iterátor 6. A List interfész implementációi 7. A Map és a SortedMap interfész 8. A Hashtable osztály 9. A TreeMap osztály
Kollekció keretrendszer (Collections Framework) • Interfészeket és osztályokat definiál különböző konténerek hatékony létrehozása céljából • Elemei: • Interfészek • kollekció • térkép • iterátor • Implementációk (osztályok) • Algoritmusok (Collections osztály)
Interfészek Osztályok «interfész» Collection ArrayList «interfész» Set «interfész» List HashSet Stack Vector LinkedList «interfész» SortedSet TreeSet Algoritmusok Hashtable Collections «interfész» Map «interfész» Iterator HashMap «interfész» SortedMap «interfész» ListIterator TreeMap Kollekció keretrendszer
«interfész» Collection ArrayList «interfész» Set «interfész» List HashSet Stack Vector LinkedList «interfész» SortedSet TreeSet A Collection interfész és leszármazottai
«interfész» Collection size(): int isEmpty(): boolean contains(elem: Object): boolean containsAll(c: Collection): boolean add(elem: Object): boolean addAll(c: Collection): boolean remove(elem: Object): boolean removeAll(c: Collection): boolean retainAll(c: Collection): boolean clear() equals(o: Object): boolean toArray():Object[] toArray(Object a[]):Object[] iterator(): Iterator Collection interfész (kollekció) • Objektumokat tárol • Van legalább két konstruktora: • paraméter nélküli • kollekcióval paraméterezett • Nincs példányosítható implementációja a keretrendszerben • Bejárás iterátorral
«interfész» Set «interfész» SortedSet first(): Object last(): Object comparator(): Comparator headSet(toElement: Object): SortedSet tailSet(fromElement: Object): SortedSet subSet(fromElement: Object, toElement: Object): SortedSet Set interfész (halmaz) • Elemei • egyediek • nem rendezettek • Implementációja:HashSet SortedSet interfész (rendezett halmaz) • Elemei • egyediek • rendezettek • Implementációja:TreeSet
«interfész» List get(index: int): Object set(index: int, elem: Object): Object add(index: int, elem: Object) addAll(index: int, c: Collection): boolean remove(index: int): Object indexOf(o: Object): int lastIndexOf(o: Object): int listIterator():ListIterator listIterator(index: int): ListIterator List interfész (lista) • Elemei • nem egyediek • egy meghatározott sorrendben követik egymást • indexelhetők • Implementációi:ArrayList, Vector,LinkedList, Stack
n e o H t a 0 1 2 ... 6 7 ... 9 "Hottentotta" karaktereinek hasítása Csoportindex A HashSet osztály – hasítási technika • Hasítókód (hashCode, hasítófüggvény) • Kapacitás: hasítással előállított csoportok száma • Hasítókód normalizálása:csoportindex = obj.hashCode() % kapacitás • Telítettség: elemszám / kapacitás • Telítettségi küszöb Character kar = new Character('H'); kar.hashCode() == 72 csoportindex == kar.hashCode()%10 == 2 Kapacitás: 10 Elemszám: 6 Telítettség: 0.6 Telítettségi küszöb: 0.9
Hasítófüggvény készítésének szabályai • Egy objektumnak mindig ugyanazt a hasítókódot kell generálnia • o1.equals(o2) hashCode(o1)==hashCode(o2) • Egyenletes eloszlásra törekvés • Hashset-be beteendő objektumok osztályában (szükség esetén) átírandó metódusok: • hashCode • equals
HashSet osztály • Halmaz (Set interfész implementációja) • Megvalósítás: hasítási technikával (hasítótáblával) • Gyors műveletek, megjósolhatatlan bejárás • Alkalmazás • Egyedi, rendezetlen elemeket tartalmazó kollekció • Nagy elemszám esetén nagyon hatékony! • Konstruktorok, metódusok • HashSet()HashSet(int initialCapacity)HashSet(int initialCapacity, float loadFactor)HashSet(Collection c) • String toString() [elem,elem,...]
szoveg:String charAt() :Character betuk: HashSet :Character HashSetBetuk :Character add() contains()? • Feladat – HashSetBetuk • Kérjünk be konzolról egy karakterláncot! Írjuk ki a benne szereplő betűket ábécérendben (mindegyiket csak egy-szer)! Együttműködési diagram
… public class HashSetBetuk { public static void main(String[] args) { HashSet betuk = new HashSet(); String szoveg = Console.readLine("Szöveg= "); for (int i=0; i<szoveg.length(); i++) betuk.add(new Character(szoveg.charAt(i))); System.out.println(betuk); for (char c=0; c<Character.MAX_VALUE; c++) if (betuk.contains(new Character(c))) System.out.print(c); System.out.println(); } }
Feladat – HashTorpe • Az emberre jellemző a neve és a magassága: e két adattal inicializáljuk őket. Tartsunk nyilván embereket, de két ugyanolyan nevű ember nem szerepelhet a nyil-vántartásban! • Vegyük nyilvántartásba a hét törpét! Végül listázzuk ki a felvitt emberek adatait (név, magasság) egymás után!
... ... ... ... ... ... H K M S T V Hapci Tudor Szundi Vidor Kuka Szende Morgó 122 126 146 126 128 104 112 A 26 felé hasított hét törpe
… class Ember { private String nev; private int magassag; public Ember(String nev, int magassag) { this.nev = nev; this.magassag = magassag; } public String getNev() { return nev; } public int getMagassag() { return magassag; }
public int hashCode() { if (nev.length() == 0) return 0; return Character.toUpperCase(nev.charAt(0)); } public boolean equals(Object obj) { if ((obj != null) && (obj instanceof Ember)) return nev.equals(((Ember)obj).getNev()); return false; }
public String toString() { return Format.left(nev,10) + Format.right(magassag,3); } } // Ember public class HashTorpe { public static void main(String[] args) { HashSet torpek = new HashSet(26); torpek.add(new Ember("Morgó",112)); torpek.add(new Ember("Szende",104)); torpek.add(new Ember("Hapci",122));
torpek.add(new Ember("Kuka",126)); torpek.add(new Ember("Tudor",126)); torpek.add(new Ember("Szundi",146)); torpek.add(new Ember("Vidor",128)); torpek.add(new Ember("Hapci",100)); // Hatástalan torpek.add(new Ember("Tudor",128)); // Hatástalan System.out.println("Törpék száma: "+torpek.size()); System.out.println(torpek); } } // HashTorpe
A TreeSet osztály - Comparator • Rendezett halmaz (SortedSet interfész impl.) • Megvalósítás: kiegyensúlyozott fával • Halmazba tett objektumok összehasonlíthatóakKét eset: • Osztályuk implementálja a Comparable interfészt (természetes össszehasonlítás) • TreeSet konstruktorában megadunk egy összehasonlító (comparator) objektumot • Alkalmazás • Egyedi, rendezett elemeket tartalmazó kollekció • Nagy elemszámnál a keresés nagyon hatékony!
Konstruktorok, metódusok • TreeSet() • TreeSet(Collection c)TreeSet(SortedSet s) • TreeSet(Comparator comp) • Comparator comparator() Comparator interfész • Céljai: • más rendezettség megadása(a természetes rendezettségen túl) • rendezettség megadása kívülről • Implementációjának példánya egy összehasonlító objektum, mely átadható a TreeSet konstruktorának • Metódusa • public int compare(Object a, Object b)
Feladat – TreeSetNevek • Tegyünk be keresztneveket egy konténerbe! Ne vigyünk be egyforma neveket! Írjuk ki a neveket először névsor szerint, azután névhosszúság szerinti rendezettségben! import java.util.*; public class TreeSetNevek { public static void main(String[] args) { TreeSet nevsor = new TreeSet(); nevsor.add("Soma"); nevsor.add("Jeremiás"); nevsor.add("Janka");
// Kiírás névsorban: System.out.println(nevsor); TreeSet nevek = new TreeSet(new Comparator() { public int compare(Object a, Object b) { return ((String)a).length() - ((String)b).length(); } } ); nevek.addAll(nevsor); System.out.println(nevek); } }