Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Hasonló dokumentumok
Programozási nyelvek Java

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

OOP: Java 8.Gy: Abstract osztályok, interfészek

Collections. Összetett adatstruktúrák

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Programozási technológia

Programozási nyelvek II.: JAVA

Java és web programozás

Java és web programozás

Programozási nyelvek II.: JAVA

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

Szoftvertechnolo gia gyakorlat

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Segédanyag: Java alkalmazások gyakorlat

C#, OOP. Osztályok tervezése C#-ban

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Programozási nyelvek II.: JAVA, 4. gyakorlat

Algoritmusok és adatszerkezetek II.

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

BME MOGI Gépészeti informatika 4.

3. Határozza meg és írja ki a minta szerint, hogy a forrásállományban hány kémiai elem felfedezési adatai

Reader /Writer InputStreamReader, OutputStreamWriter

Osztályok. 4. gyakorlat

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

117. AA Megoldó Alfréd AA 117.

Szoftvertechnológia alapjai Java előadások

Bánsághi Anna

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

OOP: Java 8.Gy: Gyakorlás

4. Gy: JAVA osztályok

OOP: Java 4.Gy: Java osztályok

Programozási technológia

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Java és web programozás

Programozási nyelvek II.: JAVA, 4. gyakorlat

ZH mintapélda. Feladat. Felület

A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a feladat sorszámát (például: 3. feladat:)!

Adatszerkezetek 2. Dr. Iványi Péter

Generikus osztályok, gyűjtemények és algoritmusok

és az instanceof operátor

Algoritmusok és adatszerkezetek II.

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Önszervező bináris keresőfák

C# osztályok. Krizsán Zoltán

Programozás II. labor

OOP: Java 1.Gy: Java alapok

Java és web programozás

Programozási nyelvek II.: JAVA, 11. gyakorlat

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Java és web programozás

Kalapácsvetés 2016 szöveges

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozási nyelvek II.: JAVA

JAVA PROGRAMOZÁS 3.ELŐADÁS

Java programozási nyelv

Programozási nyelvek II.: JAVA, 3. gyakorlat

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Programozási nyelvek II.: JAVA

Algoritmusok és adatszerkezetek II.

Algoritmusok és adatszerkezetek gyakorlat 07

Programozás alapjai. 5. előadás

Programozási nyelvek Java

Java és web programozás

3. Osztályok II. Programozás II

hiányzott szeptemberben vagy A tanuló nem hiányzott szeptemberben szöveget

Java és web programozás

7. K: JAVA alapok Konzultáció

Programozási nyelvek Java

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

OOP: Java 5.Gy: Osztály, referencia, konstruktor

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Java II. I A Java programozási nyelv alapelemei

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

OOP: Java 7.Gy: Öröklődés, referenciák

INFORMATIKAI ALAPISMERETEK

Bánsághi Anna

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Smalltalk 2. Készítette: Szabó Éva

INFORMATIKA javítókulcs 2016

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

Magas szintű programozási nyelvek 2 Előadás jegyzet

Elemi adatszerkezetek

3. Gyakorlat Ismerkedés a Java nyelvvel

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Programozás BMEKOKAA146. Dr. Bécsi Tamás 5. előadás

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Segédanyag: Java alkalmazások gyakorlat

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

A lista adatszerkezet A lista elemek egymásutániságát jelenti. Fajtái: statikus, dinamikus lista.

BME MOGI Gépészeti informatika 8.

Programozás I. Első ZH segédlet

Programozási nyelvek Java

Átírás:

Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák Gelle Kitti 2017. 10. 25. Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 1 / 20

Hasítótáblák T 0 h(k 2) mod N h(k 5) mod N U S k 5 k 2 k 4 h(k 1) mod N = h(k 4) mod N k 1 k 3 h(k 3) mod N mod N N 1 Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 2 / 20

Ütközésfeloldás - Chaining U S k 2 k 5 k 4 k 1 k 3 T 0 k 2 k 5 N 1 k 1 k 4 k 3 Load factor: vödrök száma / elemek száma Ha ez túl nagy több vödör és hash-eljük újra az összes eddigi elemet Kétszer (vagy konstansszor) annyi vödröt éri meg létrehozni Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 3 / 20

Érdekesség: amikor a több vödör nem segít Ha ugyanaz a hash code println( "AaBBAa".hashCode() ) //1952508096 println( "BBAaAa".hashCode() ) //1952508096 println( "BBBBAa".hashCode() ) //1952508096 println( "AaAaAa".hashCode() ) //1952508096 println( "AaBBBB".hashCode() ) //1952508096 println( "BBAaBB".hashCode() ) //1952508096 println( "BBBBBB".hashCode() ) //1952508096 println( "AaAaBB".hashCode() ) //1952508096 Java-ban a String.hashCode(): s[0] 31 n 1 + s[1] 31 n 2 +... + s[n 1] "Aa".hashCode() == 31 65 + 97 == 2112 == 31 66 + 66 == "BB".hashCode() Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 4 / 20

Open adressing Minden vödörbe max egy kulcsot teszünk A hash kód alapján számolt index csak kiindulópont Ha foglalt, akkor valamilyen módszerrel végigpróbálunk másokat. Jelölés: probe(h(k),i): a h(k) kulcs i. próbája - linear probing: probe( h(k), i ) = (h(k) + i) mod N - quadratic probing: probe( h(k), i ) = h(k) + c 1 i + c 2 i 2 mod N - double hashing: probe( h(k), i ) = h 1 (k) + i h 2 (k) mod N Ha a load factor kb. 0.7-re növekszik, mindegyik módszer meglassul Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 5 / 20

Feladat Szúrjuk be egy 10 hosszú hash táblába a következő objektumokat chaining és linear probing módszerekkel. Az elemek h1 hash függvény által adott hash kódjai a következők: h1("cím") = 210 h1("foo") = 130 h1("bar") = 65 h1("fák") = 188 h1("bin") = 785 h1("one") = 960 Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 6 / 20

Megvalósításuk Halmaz Egy elem csak egyszer kerülhet be Csak kulcsot tárol HashSet: hasítótáblával megvalósítva TreeSet: keresőfával megvalósítva Map / Dictionary / Associative array Kulcs-érték párok tárolása HashMap: hasítótáblával megvalósítva TreeMap: keresőfával megvalósítva Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 7 / 20

Feladat Szavak gyakoriságának leszámolása Az input egy hosszú szöveget tartalmazó String. A feladat az, hogy adjuk meg a benne található összes szó előfordulásainak számát. Írjunk rá pszeudokódot! Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 8 / 20

Feladat - ugyanez javaban public static Map<String, Integer> wordfrequencies(string[] words) { Map<String, Integer> result = new HashMap<>(); for (String word : words) { int n = 1; if (result.containskey(word)) { n = result.get(word) + 1; result.put(word, n); return result; Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák 2017. 10. 25. 9 / 20

Keresőfa vs Hasítótábla Keresőfa Keresés: O(log n) Beszúrás: O(log n) Rendezés: van (A kulcsok egy teljesen rendezett halmazból KELL jöjjenek) Megelőző/rákövetkező elem keresése: gyors Hasítótábla Keresés: O(1) Beszúrás: O(1) Rendezés: nincs Megelőző/rákövetkező elem keresése: nem lehetséges Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 10 / 20

HashSet Feladat Adott a következő 2D-s kordinátákat megvalósító osztály, melyeket egy HashSet-be szeretnénk gyűjteni. public class Coord { int x; int y; public Coord(int x, int y) { this.x = x; this.y = y; Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 11 / 20

HashSet Feladat public static void main(string[] args) { Set<Coord> s = new HashSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); System.out.println(s.contains(p)); Coord q = new Coord(100,100); System.out.println(s.contains(q)); Coord r = p; System.out.println(s.contains(r)); Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 12 / 20

HashSet Feladat public static void main(string[] args) { Set<Coord> s = new HashSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); System.out.println(s.contains(p)); //true Coord q = new Coord(100,100); System.out.println(s.contains(q)); //false Coord r = p; System.out.println(s.contains(r)); //true Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 13 / 20

HashSet Feladat public class Coord {... public int hashcode() { return x ^ y; public boolean equals(object o) { if (o == null) return false; if (!(o instanceof Coord)) return false; Coord oc = (Coord)o; return x == oc.x && y == oc.y; Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 14 / 20

HashSet Feladat public static void main(string[] args) { Set<Coord> s = new HashSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); System.out.println(s.contains(p)); //true Coord q = new Coord(100,100); System.out.println(s.contains(q)); //true :) Coord r = p; System.out.println(s.contains(r)); //true Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 15 / 20

HashSet Feladat public static void main(string[] args) { Set<Coord> s = new HashSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); System.out.println(s.contains(p)); p.x = 50; System.out.println(s.contains(p)); Coord q = new Coord(50,100); System.out.println(s.contains(q)); Coord r = new Coord(100,100); System.out.println(s.contains(r)); Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 16 / 20

HashSet Feladat public static void main(string[] args) { Set<Coord> s = new HashSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); System.out.println(s.contains(p)); //true p.x = 50; System.out.println(s.contains(p)); //false Coord q = new Coord(50,100); System.out.println(s.contains(q)); //false Coord r = new Coord(100,100); System.out.println(s.contains(r)); //false wtf Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 17 / 20

HashSet Feladat - tanulságok A hashcode és az equals metódusokat mindig párban kell felülírni A hashcode soha ne változhasson az objektum életciklusa alatt Ha két objektum lehet equals bármikor élettartamuk során, akkor a hashcode-juk ugyanaz kell legyen Tehát hashcodeot csak immutable mezőkből (olyan adattagok, amiken nem tudunk változtatni) szabad számítani, különben ez ( ) lesz Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 18 / 20

TreeSet Feladat public static void main(string[] args) { Set<Coord> s = new TreeSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 19 / 20

TreeSet Feladat public static void main(string[] args) { Set<Coord> s = new TreeSet<Coord>(); Coord p = new Coord(100, 100); s.add(p); Exception in thread main java.lang.classcastexception: Coord cannot be cast to java.lang.comparable Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 19 / 20

TreeSet Feladat public class Coord implements Comparable<Coord> {... // Sorfolytonos osszehasonlitas public int compareto(coord o) { int comp_y = Integer.compare(y, o.y); if (comp_y == 0) { return Integer.compare(x, o.x); return comp_y; Tanulság: a TreeSet kulcsai mindig egy rendezett halmazból kell jöjjenek. Az osztály elemeit összehasonlító metódust meg kell írjuk! Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 2017. Hasítótáblák 10. 25. 20 / 20