1 / 23

Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós

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ó. Hash.

terena
Télécharger la présentation

Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 2610 103; a H így nyilvánvalóan nem egyértelmű függvény, bizonyos kulcsokhoz azonos címet rendel. és utána ellenőriz, hogy 2

  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: 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. 3

  4. Hash függvények Tanácsosabb N-nek prímszámot választani: pl. 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: k2 mindkét végéről törlünk kellő számú számjegyet, pl. N=100, {00, …, 99} 4

  5. Hash függvények 3. Hajtogatásos módszer: a kulcsot k1, k2, k3, … 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=37 32+50=82 H(7148)=71+48=19 71+84=55 H(2345)=23+45=68 23+54=77 4. Logikai műveletre alapozott tördelő függvény: A 4 byte-os részstringeket logikaiXOR-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: T1,T2 és két hash függvényt: H1,H2 használ. Az egyes k kulcsok bármely táblában lehetnek: T1[H1(k)] vagy T2[H2(k)]. A k új kulcsot a T1[H1(k)]helyre tesszük. Ha ezt egy I kulcs már foglalja, akkor azt a T2[H2(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 ∈ KH(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: alá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) i = 1, ..., N-1 pl.: {89,18,49,58,69} (N=10, nem prímszám) 14

  15. Hash: ütközés kezelése 3.b. Négyzetes pótvizsgálat (Morris) i > 0 pl.: {89,18,49,58,69} 15

  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: 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. 16

  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: hi = i2; di = 2i+1 i = 1; h1 = 1; d1 = 3; hi+1 =hi + di h2 = 4; d2 = 5; di+1 =di + 2 (i > 0) h3 = 9; d3 = 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 H2(k);H2 –t is jól kell megválasztani, nem adhat zérust. A bokrosodás esélye minimális. Pl. H2(k)=R-(k mod R)R < N prímszám Pl.: R=7 H2(49)=7-0=7 H2(58)=7-2=5 H2(69)=7-6=1 19

  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 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ő). 20

  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

  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. 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. 22

  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

More Related