Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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

Hasonló előadás


Az előadások a következő témára: "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ő."— Előadás másolata:

1 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ő Nagy Tibor

2 H A S H E L É S, M I N T T Í P U S S L I D E 02 k4 k3 k1 k2 k5 U (kulcsuniverzum) K (aktuális kulcsok halmaza) T [0] T [m-1] h : U {0, 1, …, m-1}

3 N Y Í L T C Í M Z É S Ű H A S H E L É S | K U L C S – Ü T K Ö Z É S E K S L I D E 03 k4 k3 k1 k2 k5 U (kulcsuniverzum) K (aktuális kulcsok halmaza) T [0] T [m-1] h : U {0, 1, …, m-1} h(k3) = h(k4)

4 N Y Í L T C Í M Z É S Ű H A S H E L É S | K U L C S – Ü T K Ö Z É S E K S L I D E 04 k4 k3 k1 k2 k5 U (kulcsuniverzum) K (aktuális kulcsok halmaza) T [0] T [m-1] h’( 1, h(k3) ) != h’( 0, h(k3) ) h’( 0, h(k3) ) = h’( 0, h(k4) ) h : U {0, 1, …, m-1} h’ : {0, 1, …, m-1} x U {0, 1, …, m-1}  k1, k2 : h(k1) = h(k2)  k1 != k2 Lineáris kipróbálás: h’ ( i, k ) := ( i + h(k) ) mod m i = (0, 1, …, m-1 ) - Négyzetes kipróbálás - Szorzásos hasítás - Dupla hasítás

5 N Y Í L T C Í M Z É S Ű H A S H E L É S | T Ö R L É S I & K E R E S É S I P R O B L É M Á K S L I D E 05 T [0] T [m-1] Delete / Törlés T [0] T [m-1] 5429 Ekkor a Search / Keresés például abnormálisan viselkedik. Hisz a h( i, k ) függvény, idő előtt megakad.

6 N Y Í L T C Í M Z É S Ű H A S H E L É S | M E G O L D Á S : G R A V E S T O N E A V A G Y S Í R K Ő S L I D E 06 T [0] T [m-1] Delete / Törlés T [0] T [m-1] 5429 GraveStone Ekkor a Search / Keresés „tudja”, hogy elem volt eltárolva az adott helyen.

7 N Y Í L T C Í M Z É S Ű H A S H E L É S M Ű V E L E T E I | Ú J H A S H T Ö M B K R E Á L Á S A S L I D E 07 T [0] T [m-1] Empty(T) T := [NIL, …, NIL] NE := 0 New(GraveStone) GraveStone NE: Number of Elements A T tömbben tárolt elemek száma GaveStone: Sírkő. Törölt elem jelzésére szolgáló objektum. Empty() műveletigénye: O(1) vagy O(n) a tömb kitöltésének műveletigényétől függően.

8 N Y Í L T C Í M Z É S Ű H A S H E L É S M Ű V E L E T E I | Ú J E L E M B E S Z Ú R Á S A S L I D E 08 GraveStone 24 T [0] T [m-1] h(0, 6) GraveStone 24 T [0] T [m-1] 8 GraveStone 24 T [0] T [m-1] 68 a, b, a 2, b 2 h(2, 6) h(0, 6) h(2, 6)

9 N Y Í L T C Í M Z É S Ű H A S H E L É S M Ű V E L E T E I | Ú J E L E M B E S Z Ú R Á S A S L I D E 09 Insert(T, k) i := 0 IsFull(T) j := h(i,k) T[j] != NIL  T[j] != GraveStone ++i, j := h(i,k) T[j] := k, ++NE ERRORERROR Insert(T, k): jelen esetben, egy elem többször is bekerülhet a tömbbe. Ezt megakadályozandó, szúrjunk be egy Search(T, k) feltételű elágazást a telítettségi vizsgálat elé. Insert(T,k) műveletigénye: Legjobb esetben O(1), de legrosszabb esetben is O(n)-s. Általános esetben, nagyban függ a használt h(i,k) függvénytől és a T tömb kitöltöttségi mutatójától, de nagyságrendileg így is 0(n) marad.

10 N Y Í L T C Í M Z É S Ű H A S H E L É S M Ű V E L E T E I | E L E M K E R E S É S E S L I D E 10 Search(T, k) i := 0 IsEmpty(T) j := h(i,k) T[j] != NIL  i < m  T[j] != k ++i j := h(i,k) T[j] = k Return ( j ) Return ( -1 ) R e t u r n (-1) Search(T, k) műveletigénye: Legjobb esetben O(1), de legrosszabb esetben is O(n)-s. Általános esetben, nagyban függ a használt h(i,k) függvénytől és a T tömb kitöltöttségi mutatójától, de nagyságrendileg így is 0(n) marad. (Bővebben Új Algoritmusok) Search(T, k): visszaadja a keresett elem indexét, -1 -t különben.

11 N Y Í L T C Í M Z É S Ű H A S H E L É S M Ű V E L E T E I | E L E M T Ö R L É S E S L I D E 11 Delete(T, k) j := Search(T,k) j = -1 T[j] := GraveStone --NE ERROR T [0] T [m-1] 264 Delete(T,4) T [0] T [m-1] 26 GraveStone Delete(T, k): a Search(T, k) függvényhívás miatt megegyezik a Search(T, k) műveletigényével.

12 N Y Í L T C Í M Z É S Ű H A S H E L É S M Ű V E L E T E I | Ü R E S – E & T E L E – E ? S L I D E 12 IsFull(T) NE = m Return(FALSE) Return(TRUE) IsFull(T) és az is IsEmpty(T) 0(1) műveletigénnyel rendelkeznek. IsEmpty(T) NE = 0 Return(FALSE) Return(TRUE)

13 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A S L I D E 13 VERSENYFELADAT EGY MEGOLDÁSA Készítette Juhász Zoltán Gyakorlatvezető Nagy Tibor

14 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A F E L A D A T S L I D E 14 Egyenletes hash függvény keresése: Adott egyedi nevet tartalmazó szövegfájl. Képezzük le [0..996] hosszúságú tömbbe, minél egyenletesebben. 1. verseny: az átlagtól (16,5095) való eltérések abszolút értékének az átlaga legyen a legkisebb, ahol az x i az i. slot-ba eső elemek száma, x = 16, verseny: 16 és 17 db elemet tartalmazó slot-ok száma legyen a legnagyobb. _

15 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A S T R A T É G I A S L I D E 15 Sikertelen próbálkozások: - MD5 hash függvény felhasználása az egyenletes kulcsok kreálására - Egy kulcs készítő függvény alkalmazása a teljes névsorra A stratégia: - A neveket 11 halmazba rendezzük, melyek páronként diszjunktak. Az elrendezés a nevek kezdőbetűjének azonosságára épít. - Az egyes halmazokra ugyan az a kulcs készítő függvényt alkalmazzuk, csak adott halmazra optimalizált paraméterekkel - A kulcsokat a szorzásos módszerrel szétosztani a 997 slot / cella között

16 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A K U L C S K É S Z Í T É S S L I D E 16 A kulcsok készítésének elve: h1 h2 h11 F és G betűvel Kezdődő nevek UniqKey TempKeyName Friss Tamás Frivalszki Tamás Frohner Ákos Frucht Éva Katalin Frész Róbert

17 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A K U L C S K É S Z Í T É S S L I D E 17 A kulcsok készítésének elve: F r o h n e r _ Á k o s ASCII kódja: TempKey számítása: n a név hossza spaccel, x i a betű ASCII kódja: 1026

18 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A K U L C S K É S Z Í T É S S L I D E 18 UniqKey számítása: ASCII[]: Az adott névhez tartozó ASCII kódok tömbje. MD5key[]: Az adott névhez tartozó MD5 szám 16. helyi értékén álló karakter ASCII kódja. (0,..., 9, A,..., E) vAsciiSecond() UniqKey := TempKey j := 1 j < ASCII[].size() UniqKey := UniqKey + ASCII[j+2] * MD5key[16] ++j UniqKey: 64353

19 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A H A S H F Ü G G V É N Y S L I D E 19 A HASH függvény: A Hash függvény a szorzásos módszert épít. Beszorozzuk a k kulcsot valamely A (0 < A < 1) állandóval, majd vesszük a kA törtrészét. Legvégül beszorozzuk a slotok / cellák számával (m). Jelen esetben: k = m = 86A  = …

20 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A H A S H F Ü G G V É N Y S L I D E 20 Jelen esetben: k = m = 86A  = … Az m azért csak 86 és nem 997, mert nem csak a neveket osztottuk fel 11 részre, hanem cellákat is rendeltünk ehhez a halmazhoz. A 2. halmazhoz például 86-t. Az A állandó elvileg minden értékre működik, de egyes értékekre különösen jó eredményeket kapunk. pl 0.5-re olyannyira nem hatékony, hogy 0 db slot van, esetén is csupán 199 optimális slot van. Knuth szerint a … állandó, valószínűleg jól fog működni.

21 V E R S E N Y F E L A D A T E G Y M E G O L D Á S A | A Z E R E D M É N Y S L I D E 21 Eredmény:


Letölteni ppt "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ő."

Hasonló előadás


Google Hirdetések