Algoritmusok és Adatszerkezetek I.

Slides:



Advertisements
Hasonló előadás
Nevezetes algoritmusok
Advertisements

Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Programozás III KOLLEKCIÓK 2..
Adatszerkezetek Az adatokat két fő csoportra oszthatjuk: egyszerű és összetett adatok.  Az egyszerű adatot egy érték jellemez, tovább nem bontható. (szám,
Prímtesztelés Témavezető: Kátai Imre Komputeralgebra Tanszék Nagy Gábor:
4. VÉGES HALMAZOK 4.1 Alaptulajdonságok
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Hatékony gyorsítótár használata legrövidebb utak kereséséhez Bodnár István, Fodor Krisztián, Gyimesi Gábor Jeppe Rishede Thomsen, Man Lung Yiu, Christian.
Programozási alapismeretek 8. előadás. ELTE 2/  További programozási tételek További programozási tételek 
Turbo Pascal Változók.
1 Hash-elés. 2 Mi a hash-elés? Gyorsan teszi lehetővé a keresést, törlést, beszúrást, módosítást Nem szükséges az elemek rendezettsége Nincsenek rendezéshez.
Sztringek.
Adatbázis-kezelés.
Bevezetés a Java programozásba
7. előadás (2005. április 12.) Láncolt lista File kezelés 1.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Készítette: Pető László
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Leszámoló rendezés Készítette: Várkonyi Tibor Zoltán VATNABI.ELTE
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
H A S H E L É S M Ű V E L E T E I N Y Í L T C Í M Z É S S E L S L I D E 01 HASHELÉS MŰVELETEI NYÍLT CÍMZÉSSEL Készítette Juhász Zoltán Gyakorlatvezető.
Tökéletes Hash függvények keresése Kasler Lóránd-Péter.
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő:
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
Ficsor Lajos Miskolci Egyetem Általános Informatikai Tanszék
Nevezetes algoritmusok Beszúrás Van egy n-1 elemű rendezett tömbünk. Be akarunk szúrni egy n-edik elemet. Egyik lehetőség, hogy végigszaladunk a tömbön,
Programozási Nyelvek (C++) Gyakorlat Gyak 02.
Adatszerkezetek 1. előadás
Egyirányban láncolt lista
Rendezések és szövegkezelő függvények
V. Adatszerkezetek, kollekciók
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 AAO folytatás ++ Csink László. 2 Rekurzív bináris keresés (rendezett tömbben) public static int binker(int[] tomb, int value, int low, int high) public.
Fák.
Visual Basic 2008 Express Edition
Egyenesvonalú (lineáris) adatszerkezetek
Kulcsok meghatározása a táblákban
Adatbázis alapfogalmak
HTML ÉS PHP (Nagyon) rövid áttekintés. ADATBÁZISRENDSZEREK MŰKÖDÉSI SÉMÁJA Felh. interakció DB Connector MySQL ? A gyakorlaton:
Dodekaéder Hamilton köre
Gráfok ábrázolása teljesen láncoltan
Adatbáziskezelés. Adat és információ Információ –Új ismeret Adat –Az információ formai oldala –Jelsorozat.
Programozási alapismeretek 8. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 8.2/  További programozási.
Bináris kereső fák Itterátorok.
Diszjunkt halmazok adatszerkezete A diszjunkt halmaz adatszerkezet diszjunkt dinamikus halmazok S={S 1,…,S n } halmaza. Egy halmazt egy képviselője azonosít.
Algoritmusok és adatszerkezetek
Memóriakezelés feladatok Feladat: 12 bites címtartomány. 0 ~ 2047 legyen mindig.
Prim algoritmus Algoritmusok és adatszerkezetek 2. Újvári Zsuzsanna.
(Bináris) Kupac (heap) adattípus
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Alapvető programozási tételek megvalósítása Czigléczky Gábor 2009.
Script nyelvek előadás
Mediánok és rendezett minták
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Halmazműveletek.
Piros-fekete fák Beszúrás, ill. törléskor a fa elveszítheti az egyensúlyát. A piros-fekete fák: az egyensúly megtartását biztosítják. +1 bit információ.
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Adatbázis-kezelés 2. Relációs adatbázisok.
Informatikai gyakorlatok 11. évfolyam
Algoritmusok és Adatszerkezetek I.
Dijkstra algoritmusa: legrövidebb utak
Dijkstra algoritmusa: legrövidebb utak
Dijkstra algoritmusa: legrövidebb utak
2-3-fák A 2-3-fa egy gyökeres fa az alábbi tulajdonságokkal:
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Algoritmusok és Adatszerkezetek I.
Előadás másolata:

Algoritmusok és Adatszerkezetek I. Hasító táblák 2017. október 17.

Halmaz Egy elem legfeljebb egyszer szerepelhet benne (ellentétben a sorozattal/listával/tömbbel) Alapvető műveletek: KERES(k) BESZÚR(k), TÖRÖL(k) Egyéb halmazműveletek: METSZET, UNIÓ

Halmaz Javában Set<Object> s = new TreeSet<>(); unió metszet

Java TreeSet

Keresési feladat Mi „Gipsz Jakab” e-mailcíme? Név Felhasználónév Aba Abdul kismardar aabdul92@freemail.hu … Gibson Mel madmax mel@gibson.com Gipsz Jakab gyors_kotes jani_cim_spameknek@gmail.com Zsuzsi Zsuzsa enishateis97 abc@xyz.com Mi „Gipsz Jakab” e-mailcíme?

Szótárban keresési feladat Szótár: egy halmaza elemeihez (kulcs) egy érték adat tartozik Bemenet: egy szótár és egy keresett kulcs Kimenet: Ha a kulcs szerepel a szótárban akkor a hozzá tartozó érték Ha nem szerepel kulcs a szótárban akkor NIL

Szótár (dictionary) = = asszociatív tömb = map Minden kulcs legfeljebb egyszer szerepel (kulcsok halmaza), de egy érték tetszőleges számban előfordulhat “Asszociatív tömb”: egészek helyett bármilyen típussal indexelhetünk “map”: egy kulcs→érték leképezés

Példák szótár használatára DNS szerver Gyakoriság leszámolás freq["alma"]++; (C++) Helyesírás ellenörző+javító Bármilyen nagy adathalmaz, ahol a gyors keresés a kritikus!

python: Java: Map<String, Integer> tel = new HashMap<>(); tel.put("jack",4098); tel.put("sape",4139); tel.put("guido",4127); System.out.println(tel); > {guido=4127, sape=4139, jack=4098} System.out.println(tel.get("jack")); > 4098 tel.remove("sape"); tel.put("irv", 4127); > {guido=4127, irv=4127, jack=4098} System.out.println(tel.keySet()); > [guido, irv, jack] System.out.println(tel.containsKey("guido")); > true

Adatszerkezetek választó Ha egy elem többször is előfordulhat, sorrendiség fontos: tömb, lista, verem, sor, prioritási sor Halmaz, csak az számít, hogy tartalmaz-e egy elemet vagy sem: halmaz (Set) Ha kulcs-érték párokat tárolunk: szótár (dictionary, Map)

Hasító táblák Halmazok (és szótárak) KERES(), BESZUR(), TOROL() legyen hatékony! átlagos esetben O(1) Keresőfa legrosszabb esetben O(logn) és egyéb műveletek is hatékonyak (KÖVETKEZŐ/ELÖZŐ, MIN/MAX)

Közvetlen címzésű táblázat

Közvetlen címzésű táblázat KERES O(1), BESZUR/TOROL O(1) tár: O(|univerzum|) Rendezett tömb (Közvetlen elérésű memória): KERES O(logn), BESZUR/TOROL O(n) tár: O(n) 1 4 5 10 1 4 5 10

Hasító (hash) táblázatok Általában a szótárban tárolt kulcsok halmaza (n) sokkal kisebb a lehetséges kulcsok univerzumánál… h hasító függvény a kulcsok U univerzumát képezi le a T [0…m − 1] hasító táblázat réseire: h : U → {0, 1, . . . , m−1} (a k kulcsú elem a h(k) résre képződik le h(k) a k kulcs hasított értéke)

Hasító táblázatok ütközés Mivel |U|>m ezért az ütközés elkerülhetetlen! Cél: ütközések számának minimalizálása

Ütközésfeloldás láncolással

Ütközésfeloldás láncolással O(1) (+ T(KERES)) ??? legrosszabb esetben egy résben az n elem → Θ(n) (T(KERES)+) O(1) https://visualgo.net/en/hashtable

Láncolt-Hasító-Keresés futásideje átlagos esetben m méretű T tömb, n elem kitöltési tényező α=n/m (=láncok átlagos hossza) bármely j-re a T[j] lista hosszának várható értéke E[nj]=n/m=α Tfh. h(k) hasított érték O(1) idő alatt számítható ki

Láncolt-Hasító-Keresés futásideje átlagos esetben egyszerű egyenletes hasítási feltétel: minden elem egyforma valószínűséggel képződik le bármely résre, függetlenül attól, hogy a többiek hova kerültek ha n=O(m) → α=n/m=O(m)/m=O(1) azaz a KERES, BESZUR, TOROL O(1)

Hogyan válasszunk hasítófüggvényt? Egy jó hasító függvény (közelítőleg) kielégíti az egyszerű egyenletességi feltételt, azaz minden kulcs egyforma valószínűséggel képződikle az m rés bármelyikére saját hasítófüggvény kellhet új típusú adatokra várhatóan független legyen az adatokban esetleg meglévő mintáktól

Hogyan válasszunk hasítófüggvényt? heurisztika: “közel” lévő kulcsokhoz tartozó értékek távol legyenek egymástól Pl. vonalas telefonszámoknál +36-62-541234 +36-62-549876 Hasítás első számjegyek alpján nem egyszerű egyenletes, utolsó számjegyek alapján jobb!

Kulcsok természetes számokkal Ha nem természetes számok a kulcsok akkor célszerű először átalakítani természetes számra Pl. String esetén ascii karakterek 128-as számrendszerbeli számoknak tekinthetjük Természetes számokra számtalan hasító függvény lett kidolgozva…

Osztásos módszer h(k) = k mod m ha m = 12 és k = 100, akkor h(k) = 4 Jó általában ha m kettő hatványhoz nem túl közeli prímek Pl. n=2000 és α=3 ekkor érdemes m=701-re választani (prím)

Szorzásos módszer 0<A<1 h(k)=m(kA mod 1) m nem kritikus, általában kettő hatvány → gyorsan számolható A választása még befolyásolja az egyenletességet, de nem annyira kritikus

Hasító táblák Javaban Set<Object> s = new HashSet<>(); Map<String,Object> m = new HashMap<>(); Hasító tábla láncolásos ütközésfeloldással [src] “This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time. ”

Hasító függvények Javaban int Object.hashCode() public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; return h;

Nyílt címzés Listák helyett a tömbben “egymás után” tároljuk a megegyező hasított értékű elemeket Nincs szükség mutatókra (kétszeresen láncolt lista), a megtakarított memórián nagyobb lehet a tömb

Nyílt címzés kipróbálás: h : U x {0,1, … ,m−1} → {0,1, … ,m−1}

Nyílt címzés TÖRLÉS() Ha NIL-el írjuk felül a törlendő értéket megszakad a kipróbálási sorozat Írjuk felül TÖRÖLT címkével! BESZÚR írhat a TÖRÖLT cellákba, KERES nem változik TÖRÖLT címkék esetén a keresési idő már nem csak α–tól függ!!!

Nyílt címzés – lineáris és négyzetes kipróbálás h’ egy (közönséges) hasító függvény Lineáris kipróbálás: h(k,i)=( h’(k)+i ) mod m hátrány: elsődleges klaszterezés Négyzetes kipróbálás: h(k,i)=( h’(k)+ c1i + c2i2 ) mod m http://www.cs.rmit.edu.au/online/blackboard/chapter/05/documents/contribute/chapter/05/linear-probing.html

Nyílt címzés - Dupla hasítás h(k,i)=( h1(k)+i h2(k)) mod m véletlen permutációk sok tulajdonságával rendelkezik Jól működik például (m’ m-nél kicsivel kissebb) h1(k) = k mod m h2(k) = 1 + (k mod m’)

Nyílt címzés - Dupla hasítás https://visualgo.net/en/hashtable

Ütközés feloldás láncolással vagy nyílt címzéssel? Nyílt címzés kevesebb memóriát használ Futásidő átlagos esetben aszimptotikusan megegyezik (gyakorlatban nyílt címzés gyorsabb) Törlés problémás nyílt címzésnél Nyílt címzés érzékenyebb a hasító függvény(ek) jó megválasztására

Hasító tábla implementációk Java HashSet: ütközésfeloldás láncolással Python dict: nyílt címzés négyzetes kipróbálás

KeresőFa vs Hasító táblák Legrosszabb eset Átlagos eset rendezett műveletek? KERES BESZÚR TÖRÖL rendezett tömb log n n n/2 piros-fekete fa 2 log n hasító tábla 1

KeresőFa vs Hasító tábla Javában Set<MyClass> s = new TreeSet<>(); class MyClass implements Comparable<MyClass> int MyClass.compareTo(MyClass c) Set<MyClass> s = new HashSet<>(); boolean MyClass.equals(Object o) int MyClass.hashCode() HashSet általában gyorsabb, de ha rendezett műveletekre is szükségünk van, akkor TreeSet!

Hasítás a kriptográfiában Egy rendszer felhasználónév-jelszó párjait hogyan tároljuk? Ha a jelszavakat magukat eltároljuk akkor az komoly biztonsági rés!!! Csak a jelszavak hasított értékét tároljuk. Egyirányú hasító függvényt használjunk!

Összegzés Halmaz, szótár Hasító táblák ha csak KERES és BESZÚR/TÖRÖL átlagos esetben O(1) műveletigény Vigyázat: ha más művelet is kell költséges lehet hasító függvény jó választása fontos nincs biztosíték az iterátor determinisztikusságára