Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaBéla Sipos Megváltozta több, mint 10 éve
1
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ő: Imre Mihály, műszaki informatikus hallgató
2
Hash (K-Key, A-Address), hashing – tördelő, az argumentum felvagdalására utal. Alapvetően új, egyszerű, gazdaságos, de vannak hátrányai is. Kulcs tömbindex : kulcstranszformáció Nehézség: a lehetséges kulcsértékek halmaza általában jóval nagyobb, mint a rendelkezésre álló tárolási címek halmaza. Pl.:26 betűs ABC, maximum 10 betűs kulcs, 1000 ember 26 10 10 3 ; a H így nyilvánvalóan nem egyértelmű függvény, bizonyos kulcsokhoz azonos címet rendel. 2 és utána ellenőriz, hogy
3
Hash függvények A H függvény megválasztásának szempontjai: - a kulcsokat egyenletesen szórja szét az indextartományon, - gyorsan lehessen kiszámítani. 1. Osztásos módszer: Ha az ord(k) megadja a k kulcs sorszámát az összes lehetséges kulcsból álló halmazon, és az i tömbindex tartománya a [0..N-1] egész számok intervalluma: 3 Ez egyenletesen terít, gyakran alkalmazzák. Gyors, ha N kettő hatványa, de a kevés karakterben különböző szavak nagyobb valószínűséggel kapnak azonos indexet, nem egyenletes.
4
Hash függvények Tanácsosabb N-nek prímszámot választani: pl. 4 vagy A [0, 1) intervallumon a fgv. alapja egyenletes eloszlású (Knuth). (Rendes osztást kell végezni!) 2. Középnégyzet módszer: k 2 mindkét végéről törlünk kellő számú számjegyet, pl. N=100, {00, …, 99} k320571482345 k2k2 1027202551093904549925 H(k)729399
5
Hash függvények 3. Hajtogatásos módszer: a kulcsot k 1, k 2, k 3, … részre osztjuk, az értékeket összeadjuk, az elejét ha kell levágjuk; hossza a cím hossza, a páros sorszámú elem jegyeit megcserélhetjük: H(3205)=32+05=3732+50=82 H(7148)=71+48=1971+84=55 H(2345)=23+45=6823+54=77 4. Logikai műveletre alapozott tördelő függvény: A 4 byte-os részstringeket logikai XOR-ral összeadjuk, az eredményt számként értelmezzük -> i és H(s) = i mod N. 5
6
Hash függvények 5. Tökéletes (perfect) hashing A H(k) függyvény egy-egy típusú leképezést valósít meg, azaz az előforduló kulcsokat egy kezelhető egész tartományra képezi le. Az H függvény a K-ra akkor és csak akkor tökéletes, ha ∀ j, k ∈ K H(j) = H(k) → j = k 6. Univerzális hashing Egy rosszindulatú ellenség mindíg tud olyan kulcsokat választani, hogy azok mindegyike ugyanarra a helyre képeződjék le, ami O(N) keresési időhöz vezet. Az univerzális hashing (Cormen) egy hash függvény- készletből véletlenszerűen választ. 6
7
Hash függvények 7. Lineáris (sorrend megőrző) hash Olyan H függvény, amely megtartja az input kulcsok sorrendjét, miközben megváltoztatja térközét: k1, k2 ∈ K ∧ k1 > k2 → H(k1) > H(k2) 8. Dinamikus hash A hash tábla növekszik, hogy egyre több elemet tudjon kezelni, miközben a hash függvénynek is változnia kell. Bizonyos sémák esetén a törléseket követően a tábla mérete csökkenhet is. (Speciális esete a bővíthető hash.) 7
8
Hash függvények 9. Kakukk (cuckoo) hash Két hash táblát: T 1,T 2 és két hash függvényt: H 1,H 2 használ. Az egyes k kulcsok bármely táblában lehetnek: T 1 [H 1 (k)] vagy T 2 [H 2 (k)]. A k új kulcsot a T 1 [H 1 (k)] helyre tesszük. Ha ezt egy I kulcs már foglalja, akkor azt a T 2 [H 2 (l)] helyre tesszük és így tovább, míg üres helyet találunk, vagy elértünk egy korlátot. Ekkor új hash függvényt választunk és újraszámoljuk a táblát. 8
9
Hash függvények 10. Minimális tökéletes (perfect) hash Minden különböző kulcsot különböző egészre képez le és a lehetséges egészek száma ugyanaz, mint a kulcsoké. A H függvény akkor és csak akkor minimális tökéletes hash függvény a K kulcshalmazra nézve, ha ∀ j, k ∈ K H(j) = H(k) → j = k a H(k) értékkészlete 1.. |K| Speciális esete a sorrend megőrző minimális tökéletes (perfect) hash. 9
10
Hashing alkalmazása - Compiler így tartja nyilván a deklarált változókat a szimbólum táblában. A hashing ideális mivel a fordításhoz csak a beszúrás és a keresés műveletek szükségesek. - Gráfok csúcspontjai nevének keresése. - Játékok. - Helyesírás (online) ellenőrzése. (Ha nem kell névsorban adni a hibákat.) - Adatbáziskezelés, indexfájlok. - Digitális aláírás. 10
11
Hash: ütközés kezelése Ütközés: a hash tábla adott indexű eleme (slot, rés) már foglalt. Ütközés kezelése 1. Nyílt hash tábla Az ugyanazon elsődleges indexhez tartozó elemeket felfűzzük egy láncolt listára (lista tömb). Közvetlen láncolás, ha a hash tábla csak címeket tartalmaz. A plusz tároló helyeket túlcsordulási területnek nevezzük (overflow area). A kétszeresen láncolt lista hatékonyabb. Előnye: "korlátlan" számú elem és ütközés kezelhető. Hátránya: a láncolt listával kapcsolatos többletmunka. 11
12
Hash: ütközés kezelése 2. Fix túlcsordulási terület A hash táblát elsődleges és túlcsordulási területre osztjuk és indexláncot képezünk. Probléma: a két terület arányának optimális megválasztása. Előnye: gyors hozzáférés, az ütközések nem használják az elsődleges területet. Nehézség: a tábla felosztási arányának előzetes meghatározása. Továbbfejlesztés: többszörös túlcsordulási területek alkalmazása. 12
13
Hash: ütközés kezelése 3. Nyílt címzés (open addressing) Magában a hash táblában keres még nem foglalt helyet. h:= H(k) ; i:= 0; repeat IF T[h].kulcs = k THEN a tétel szerepel ELSE IF T[h].kulcs = szabad THEN a tétel nem szerepel ELSE begin ütközés i:= i+1; h:= H(k)+ G(i) end; until szerepel, nincs a táblában (vagy tele a tábla); 13
14
Hash: ütközés kezelése 3.a. Lineáris pótvizsgálat (Morris) 14 i = 1,..., N-1 pl.: {89,18,49,58,69} (N=10, nem prímszám) Üres8918495869 049 158 269 3 4 5 6 7 818 989
15
Hash: ütközés kezelése 3.b. Négyzetes pótvizsgálat (Morris) 15 i > 0 pl.: {89,18,49,58,69} Üres8918495869 049 1 258 369 4 5 6 7 818 989
16
Hash négyzetes pótvizsgálat Előfordulhat, hogy nem derít fel minden szabad helyet a táblában, de ha N prímszám, akkor mindíg használni tudja legalább a tábla felét. Tegyük fel, hogy egy i-edik és egy j-edik pótvizsgálat a tábla ugyanazon helyéhez vezet: 16 Mivel,, ezért i és j közül legalább az egyik nagyobb N/2-nél, hiszen csak így teljesülhet valamilyen C természetes számra.
17
Hash négyzetes pótvizsgálat A hash függvény számításának gyorsítására a négyzetre emelés helyett: h i = i 2 ; d i = 2i+1i = 1;h 1 = 1; d 1 = 3; h i+1 =h i + d i h 2 = 4; d 2 = 5; d i+1 =d i + 2 (i > 0)h 3 = 9; d 3 = 7; 17
18
Hash: ütközés kezelése Bokrosodás (clustering) A lineáris pótvizsgálat a bokrosodás jelenségétől szenved: az egy helyről induló újrahash-elések egy blokkot foglalnak el és a többi kulcsoknak megfelelő helyek felé nőnek. Ez fokozza az ütközésveszélyt és egyre több újrahash-elést eredményez. A négyzetes pótvizsgálatnál a másodlagos bokrosodás kevésbé súlyos probléma, mint a lineárisnál. A hash tábla telítettségével a többszörös ütközések egyre valószínűbbek. 18
19
Dupla hashing G(i) = i H 2 (k); H 2 –t is jól kell megválasztani, nem adhat zérust. A bokrosodás esélye minimális. Pl. H 2 (k)=R-(k mod R) R < N prímszám 19 Üres8918495869 0 1 2 358 4 5 649 7 818 989 Pl.: R=7 H 2 (49) =7-0=7 H 2 (58) =7-2=5 H 2 (69) =7-6=1
20
Rehashing Ha a tábla túlságosan telített, a futási idő egyre nő és a beszúrás nem sikerül. Megoldás: felépítünk egy kétszer akkora táblát, az eredetiből átvisszük a még érvényes bejegyzéseket. Pl.: {13, 15, 24, 6}; N=7; H(k)=k mod 7, lineáris pótvizsgálat 20 0123456 615232413 Az új tábla mérete: 17 (a következő kétszeres prímszám). Rehashing, ha pl. a tábla félig telt; vagy a beszúrás nem sikerült, vagy fáradságos; vagy a tábla valamilyen %-ig telt (telítettségi tényező).
21
Bővíthető hashing Az egész tábla nem fér a központi memóriába, így lényeges a disk hozzásférések (műveletek) száma. A nyílt vagy a zárt hashing esetén számos blokkot meg kell vizsgálni. A bővíthető (extendible) hashing lehetővé teszi, hogy a keresés 2 diszk művelettel megoldható legyen. Pl. M=4 21 00011011 (2) 000100 001000 001010 001011 (2) 010100 011000 (2) 100000 101000 101100 101110 (2) 111000 111001
22
Bővíthető hashing Az 100100 beszúrásához, a 3. tele van, ezért kettévágjuk és az első 3 bit lesz a meghatározó, a directory mérete 3 lesz, a teljes directory-t átírjuk. 22 000001010011100101110111 (2) 000100 001000 001010 001011 (2) 010100 011000 (3) 100000 100100 (3) 101000 101100 101110 Előfordul, hogy nagyobbat kell ugrani, pl. 2-ről 4-re: Pl.: D=2; 111010, 111011, 111100 beszúrása után már csak az első 4 bit tud különbséget tenni. Nem lehet M -nél több azonos kulcs. (2) 111000 111001
23
Hashing: törlés Legcélszerűbb megoldás: a törölni szándékozott elem bejegyzését nem töröljük, csak törlésre jelöljük, így a keresés, beszúrás változatlan módon folytatható. 23
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.