You are on page 1of 16

4.

Hash-els s szekvencilis keress


Hny haj tkztt itt ssze; jllehet voltak jelzfnyeik, krtjeik s vszharangjaik! JULES VERNE (A Nemo kapitny elbeszljnek tndse j-Fundland vizein.)

Ebben a fejezetben elszr egy olyan mdszercsaldot ismertetnk, amely a keress, beszrs, trls s mdosts gyors s egyszer megvalstst teszi lehetv. A keresfkhoz kpest fontos eltrs, hogy nem ttelezzk fel a lehetsges kulcsok sszessgnek (az U univerzumnak) a rendezettsgt. Ennek megfelelen itt nem lesznek rendezshez kapcsold elrsi ignyek, mint pl. a MIN. A cl egy S C U kulcshalmazzal azonostott llomny megszervezse gy, hogy a fenti mveletek hatkonyak legyenek. A megoldsok, amelyekkel megismerkednk, tlagos rtelemben igen gyorsak. A legrosszabb esetekben viszont nagyon lassak is lehetnek. Olyan alkalmazsoknl jnnek teht szba, ahol az tlagosan j teljestmny az igazn fontos, s a ritkn elfordul rosszabb vlaszidk nem okoznak gondot. Elszr egy rvid pldval szeretnnk szemlltetni a hash-els httert, alaptlett s a felmerl problmkat. Tegyk fel, hogy magyar llampolgrok adatait szeretnnk trolni. Az llomny egy rekordjban olyan adatok (mezk) szerepelhetnek, mint pldul nv, lakcm, szemlyi szm, stb. A rekordokat azonost kulcsknt a szemlyi szm szolglhat. A szemlyi szm 11 jegy, ebbl egy redundns, s a tovbbi ismert korltozsokat is figyelembe vve (a hnapok szma, a hnapok napjainak szma, stb.) mintegy 2 102 12 31 103 74 milli kulcs lehetsges. Ugyanakkor mg j adag demogrfiai optimizmus esetn sem kell tbb, mint 11 milli tnyleges rekorddal szmolnunk a kzeljvben. Nagyvonalan - ami mint ksbb ltni fogjuk, has 2 n o s ebben az sszefggsben is - gondolkodhatunk gy, hogy 12 milli rekord szmra foglalunk helyet. Legyen a rekordok

4.1. A HASH-ELS ALAPJAI

87

(logikai) cmeinek tartomnya a [0,12 106 - l] intervallum egszeinek I halmaza. Ezutn a feladatot felfoghatjuk gy is, hogy egy olyan megfeleltetst keresnk, mely minden kulcshoz egy cmet rendel. Olyan h fggvnyre gondolunk, amelynek az rtelmezsi tartomnya a lehetsges kulcsok halmaza, rtkkszlete pedig I, a logikai cmek tartomnya. Knyelmes volna, ha K ^ K' esetn h(K) j h(K') teljeslne. Ez azonban kptelensg, hiszen az rtelmezsi tartomny jval nagyobb, mint az rtkkszlet, ezrt h nem lehet injektv. Az ilyen tkzsek teht elkerlhetetlenek. St, bizonyos rtelemben elg gyakran elfordulnak. Erre vilgt r a szletsnap-paradoxon (szoks mg von Mises-paradoxonnak is nevezni): egy legalbb 23 tag trsasgban legalbb 1/2 valsznsggel van kt szemly, akiknek megegyezik a szletsnapjuk. ltalban megmutathat, hogy ha a h fggvny rtkkszlete M elem, akkor \/2 In 2 M vletlenl vlasztott argumentum kztt legalbb 1/2 valsznsggel lesz kett, melyre h ugyanazt az rtket adja. E tny azt sugallja, hogy j esly van tkzsre mg akkor is, amikor cmtartomny mrethez kpest viszonylag kevs rekordunk van a trolt llomnyban. A hash-els vagy hash-kdols mdszert hasznl trolsi technikk alapvet kzs vonsa, hogy egy alkalmas h fggvny, az gynevezett hash-fggvny segtsgvel ksrlik meg kiszmtani a beillesztend rekord (logikai) cmt. A h fggvny a K kulcshoz a h(K) cmet rendeli. A mdszerek els kzeltsben a K kulcs rekordot a h(K) cmnek megfelel helyre prbljk tenni. Ez nem lehetsges tkzs esetn: amikor egy msik K' rekord rkezik, melyre h(K) = h(K'). A teendk fontos rsze ppen ezrt az tkzsek feloldsa. Olyan megoldsokrl van itt sz, amelyek tkzskor helyet tallnak a ksbb jtt rekordoknak. Az egyes mdszereket az tkzsek kezelse alapjn szoks osztlyozni. Ezt tesszk mi is. A msik alapvet krdst a megfelel hash-fggvny tallsa, kivlasztsa jelenti. Olyan knnyen szmthat h fggvnyeket keresnk, amelyek az alkalmazs sorn felmerl kulcshalmazokon minl kevesebb tkzst okoznak. Ennek a mikntjeivel is foglalkozunk. A szekvencilis keresssel mr tallkoztunk a rendezsek trgyalsakor. Ott rendezett llomnyokban val keressre hasznltuk a mdszert. A fejezet vgn ejtnk nhny szt arrl az esetrl, amikor az llomny nem felttlenl rendezett.

4.1. A hash-els alapjai


Kt igen szertegaz mdszer legegyszerbb vltozatait ismertetjk. Ezek a vdrs hash-els s a nyitott cmzs. Az els technikt, a vdrs hash-elst elssorban kls tron lev nagymret llomnyok kezelsre hasznljk. Szinte minden komoly adatbziskezel rendszer ad ilyen jelleg trolsi lehetsget. A nyitott cm-

88

4. HASH-ELS S SZEKVENCILIS KERESS

zs mdszerek ezzel szemben fleg a bels memriban lev llomnyok gyors kezelst hivatottak biztostani. Jellegzetes alkalmazsknt emlthetjk a programok fordtsakor keletkez szimblumtblk kezelst vagy a ksbb bemutatand Lempel-Ziv-Welcfi-mdszer sztrnak a trolst. A tovbbiakban mindkt esetre rvnyesen feltesszk, hogy van egy h hashfggvnynk, amely a K kulcshoz a h(K) logikai cmet rendeli. A h(K) cm egy egsz a [0, M 1] intervallumbl. Azrt beszlnk logikai cmekrl, mert a h(K) rtkek tbbnyire nem jelentenek tnyleges fizikai helymegjellseket. Ugyanakkor feltehetjk, hogy a rendszer biztost egy mechanizmust, amely a [0, M 1] intervallum egszeit a tnyleges adatmozgatst vgz rteg szmra rtelmezhet cmekk fordtja.

4.1.1.

Vdrs hash-els

A mdszert szoksos tncolsnak is nevezni. Lnyeges eleme a V[0 : M - l ] vdrkatalgus. Amint a jells is sugallja, V-t hasznos egy a h rtkkszletnek elemeivel indexelt tmbnek elkpzelni. A kp nem teljesen hsges, mert V nagy is lehet. Elfordulhat, hogy rszben vagy egszben httrtron kell elhelyezni. A V elemei mutatk, pontosabban laplncok fejei. A laplncokat szoks vdrknek nevezni. A vdrk lapjain helyezkednek el a trolni kvnt rekordok. Nevezetesen a V[i] mutatval kezdd vdrbe kerlnek azok a rekordok, amelyek K kulcsaira h(K) i teljesl. Vegyk szemgyre ezutn a szerkezet algoritmusait! Tegyk fel, hogy a K kulcs rekordot akarjuk beilleszteni. Elszr kiszmtjuk a h(K) rtket, majd megnzzk a vdrkatalgus V[h(K)} bejegyzst. Ez egy mutat arra a vdrre (laplncra), melyben a h(K) hash-rtk rekordokat kvnjuk trolni. A vdr ltalban egy kicsi, legfeljebb nhny lapbl ll llomny. Ebben elhelyezzk a trolni kvnt rekordot. A kvetkez brn a V vdrkatalgust fggleges helyzetben mutatjuk; a vdrk a lapokbl ll vzszintes sorok.

.
egy vdr lapjai

h(K)

K
V

M - 1

I A HASH-ELS ALAPJAI

89

A rekordnak a vdrben val elhelyezse tbb mdon is trtnhet. Gyakran hasznlatos s egyszer megolds, hogy a rekordot az els szabad helyre tesszk. Ha szksges, j lap hozzfzsvel bvtjk a lncot. Msik szoksos eljrs, hogy a rekordokat kulcs szerint rendezve tartjuk a vdrben. Ekkor - a beszrsos rendezsnl tapasztaltakhoz hasonlan - elfordulhat, hogy tbb rekordot is mozgatni kell a vdrn bell. A keress mdszere ezek utn nyilvnval. A K kulcs rekord keresse avval kezddik, hogy kiszmtjuk a h(K) rtket. Ha a rekord a trolt llomnyunkban van, akkor csak a V[h(K)] mutattl indul vdrben lehet. Ezutn teht a vdrkatalgus V[h(K)] mutatjt kvetve a vdr els lapjra lpnk. A vdrben szekvencilis keresssel dolgozhatunk. Addig megynk a laplnc mentn, amg vagy megtalljuk a rekordot, vagy pedig kiderl, hogy az nincs a trolt llomnyban. A trlssel s a mdostssal kapcsolatos teendk a keress utn mr kzenfekvek, gy nem rszletezzk ket. Csak annyit jegyznk meg, hogy ha a mdosts a kulcsot is rinti, akkor trls, majd jbli beilleszts vlhat szksgess, hiszen a kulcs mdosulsval annak /i-rtke is vltozhat. A vdrs hash-els kitnen alkalmazhat kls trakon elhelyezked llomnyok kezelsre. A mdszer tlete jl illeszthet a hasznlt fizikai trolsi mdium sajtossgaihoz. A vdrk gyakran megvalsthatk a laplncnl alacsonyabb, hatkonyabb szinten. Egy vdr lehet pl. a mgneslemez egy svja (track) vagy annak rs/olvass szempontjbl folytonos rsze. Ilyenkor az utols sv szolglhat a tlcsordulsok kezelsre:

~ ~ |

nnnn DDDJ nn i nnnrT


DDLU ,

nnnn
Mi mondhat a mdszer kltsgrl? Mivel kls tras adatszerkezetrl van z, a lapelrsek szmt kell vizsglnunk. Ezt szem eltt tartva vilgos, hogy a lncolsi mdszer idignyt (kltsgt) a laplncok hossza hatrozza meg. Tegyk fel, hogy M vdr van, s /-lapnyi rekordot trolunk. Ekkor egy vdrbe tlagosan K, l/M lap kerl. Ennyi lesz teht az tlagos lnchossz. Ha a keress sorn minden vdrhz ugyanakkora esllyel fordulunk, akkor a keress tlagos kltsge legfeljebb 1 + l/M lapelrs. Itt azzal a felttelezssel ltnk, hogy a
s

90

4. HASH-ELS S SZEKVENCILIS KERESS

vdrkatalgus is httrtron helyezkedik el, s V[h(K)} olvassa egy lapelrsbe kerl. Az tlagszmtsban hallgatlagosan feltettk mg azt is, hogy a h fggvny elg egyenletesen szrja szt az rkez kulcsokat a [0, M - 1] intervallumban. A mdszer alkalmazsa eltt fontos mretezsi feladat a katalgus elemszmnak, az M paramternek a meghatrozsa. ltalban ismerjk (esetleg csak kzeltleg) a trolni kvnt llomny nagysgt kifejez / rtket. Ennek birtokban az M rtkt clszer gy vlasztani, hogy a vrhat l/M hnyados kzel legyen l-hez. Nem szokatlan a 20 szzalkos rtarts, vagyis tbblethely lefoglalsa sem. Plda: Tegyk fel, hogy egy maximum 1 000 000 rekordbl ll llomnyt szeretnnk lncolsos mdszerrel kezelni. Tegyk fel, hogy egy lapon 5 rekord fr el. Ekkor / = 1 000 000/5 = 200 000. Az M paramter rtkt 220 000 - 240 000 krlinek rdemes vlasztani. Ha a katalgus elemei is diszken vannak, s egyenknt elrhetk 1 lpsben, akkor a keress tlagos kltsge valamivel 2 lapelrs alatt marad. Vgezetl megemltjk, hogy a lncols mdszere bels memris megoldsknt is versenykpes. Az elbbiekhez viszonytva az eltrs annyi, hogy itt nem lapokat, hanem rekordokat lncolunk. Egy vdr teht egy rekordokbl ll lncot jelent.

4.1.2.

Nyitott cmzs

A nyitott cmzst hasznl mdszerek ltalban - az itt bemutatsra kerl technikk pedig klnsen is - csak bels memris mdszerknt hasznosak. A rekordokat a T[0 : M - 1] tblban (tmbben) kvnjuk elhelyezni. A T tmbt teht a h fggvny rtkkszletnek elemeivel, a [0, M - 1] intervallum egszeivel indexeljk. A T elemei pedig rekordok. A K kulcs rekordnak a T[h(K)\ helyet sznjuk, feltve, hogy az nem foglalt. Ellenkez esetben, amikor a T[h(K)] cellban mr egy korbban beillesztett rekord van, akkor valamilyen szisztematikus mdon prblunk helyet keresni a T tovbbi celliban. A nyitott cmzs mdszerek tkzsfeloldsra a 0 , 1 , . . . , M 1 szmok egy 0, h\ (K), fi2{K),..., hM-i{K) permutcijt hasznljk. Pontosabban fogalmazva sorra vgigprbljuk a h{K) + hi(K) sorszm cellkat (i = 0 , 1 , . . . , M 1) az els res helyig, ahol a rekordot elhelyezzk. Itt az sszeads modulo M rtend, vagyis az sszeg mindig 0 s M 1 kztti egsznek vehet. Permutcira azrt van szksg, hogy a h(K) + hi(K) sorszm cellk kiadjk a tbla minden helyt. Ha nem talltunk res helyet a sorozat mentn, akkor arra kvetkeztethetnk, hogy a tbla betelt, az j rekordot mr nincs

4,1. A HASH-ELES ALAPJAI

91

hov tenni. A hi(K) szmok jellsben azrt tntettk fel K-t, hogy rzkeltessk: a prbasorozat fgghet a kulcstl is.
K

\z

IXI
h(K)

|X[
h(K)+hz{K) M-l

h(K) + hx(K) h(K) + h2{K)

Az elz bekezdsben tulajdonkppen elmondtuk a beilleszts algoritmust. A keress itt is egyszer. Ha a keresett rekord kulcsa K, akkor sorra megnzzk a h(K) + hi(K) sorszm cellkat (i 0,1,...), amg megtalljuk a keresett rekordot, vagy res cellhoz rnk, vagy pedig i = M - 1. Az utbbi kt esetben a keresett rekord nincs a tblban. A trls rdemi rsze is vilgos ezutn. Megkeressk az eltvoltand rekordot, majd trljk a tblbl. Ez utbbi fzis a szoksosnl tbb krltekintst ignyel. Ksbb egy plda kapcsn mg foglalkozunk ezzel a krdssel. A mdszerek sszehasonltshoz, hatkonysguk elemzshez hasznosak lesznek a kvetkez jellsek: N - a tblban lev rekordok szma M - a tbla cellinak szma a = jtf -ateltettsgi (betltttsgi) tnyez Cjv - a sikeres keressek (amikor a keresett rekord megtallhat T-ben) sorn megvizsglt cellk tlagos szma CN - a sikertelen keressek (a keresett rekord nincs T-ben) sorn megvizsglt cellk tlagos szma. A CJV meghatrozsban az tlagos" gy rtend, hogy a tblban lev mindegyik elemre egyenl esllyel rkezik keressi igny. A Cjv' esetben pedig arrl van sz, hogy a h(K) rtk ugyanakkora esllyel lehet a 0 , 1 , . . . , M - 1 szmok brmelyike. Mindeme elkszletek utn lssunk nhny fontosabb prbamdszert: Lineris prbls Itt hi(K) := i. A K kulcs rekord beillesztse sorn a h(K) cm celltl indulva addig lpkednk egyesvel balra, amg res helyet nem tallunk. A T[0] cella utn pedig, ha kell, a T [ M - 1 ] cellval folytatjuk. A keress kltsgre rvnyesek a kvetkezk (nem bizonytjuk):

92

4. HASH-ELS S SZEKVENCILIS KERESS

CN

1+

es

Nhny a rtkre tblzatba foglaltuk a formulkbl add keressi idket. Lthat, hogy 80 szzalkos teltettsg felett a sikertelen keressek mr elg sok idt ignyelnek. a
CN

CN

2/3 2 5

0,8 3 13

0,9 5,5 50,5

Plda: Tegyk fel, hogy a kulcsok termszetes szmok, s a rekordjaink csak ebbl az egyetlen mezbl llnak. Legyen a tblamret M = 7, s legyen a hashfggvny h(K) := K (mod 7). Tegyk fel mg azt is, hogy az tkzsek feloldsra lineris prblst hasznlunk. gy nz ki a tbla a 3, 11 s 9 kulcsok beillesztse utn: 0 1 2 9 3 3 4 11 5 6

Ha most a i = 4 kulcsot szeretnnk beilleszteni, akkor mivel a T[4], T[3] s T[2] helyek is foglaltak, hrmat kell lpnnk a prbasorozat mentn. A ngyes a Tfll-be kerl: 0 1 2 4 9 3 3 4 11 5 6

Trljk most a 9 kulcsot. Els gondolatunk az lenne, hogy a sikeres keress utn felszabadtjuk a T[2] helyet ugyanolyan NULL rtket adva neki, mint ami a mg res T[0], T[5] s T[6] cellkban van. Ez azonban bajt okozhat, hiszen ezutn a K = 4 kulcs keresse sikertelen lenne. A prbasorozat mentn NULL rtk cellhoz jutnnk, amibl azt hihetnnk, hogy a ngyes nincs a tblban. A megolds egy a NULL-tl klnbz TRLT jel hasznlata (ez lehet pl. *). A keressek sorn ezek a cellk tlphetk; gy tekinthetjk ket, mintha foglaltak volnnak. j rekord beillesztsekor termszetesen egy ilyen hely resnek tekinthet, s ismt hasznlhat. A trls utn a helyzet teht gy alakul:

4.1. A HASH-ELS 0 1 2 4 * 3 3

ALAPJAI 4 5 11 6

93

Ezutn mr nem lesz baj, amikor a ngyest keressk. A T[2]-ben lev * jelbl tudni fogjuk, hogy tovbb kell lpnnk a prbasorozat mentn. A trlssel kapcsolatban itt vzolt problma ltalnos a nyitott cmzst hasznl mdszereknl. A javasolt megolds, a TRLT jel hasznlata, mkdik ms prbasorozatok esetn is. A plda egybknt mutatja a lineris prbls f htrnyt is. Ha sok rekord van a tblban, akkor hossz, egybefgg csomk" alakulnak ki, megnvelve a keressi utak hosszt. Mondjuk a 18 keressekor elg nagy utat kell megtenni, mire kiderl az igazsg. Ezt a kellemetlen jelensget elsdleges csomsodsnak (klaszterezdsnek) szoks nevezni. A csomsods oka abban van, hogy ha egy R1 rekord beillesztse sorn elrjk a mr trolt R rekord keressi tjt, akkor azt rendszerint vgig is kell jrnunk. A lineris prblssal ismerkedk gyakran krdezik, hogy mirt visszafel lpkednk a tblban, s nem elre. A magyarzat programozstechnikai termszet. Az eljrsokban (sokszor) ellenriznnk kell, hogy a lpkeds sorn nem rtk-e el a tbla vgt. Ha visszafel, a tbla eleje fel megynk, akkor a nullval val egyenlsget kell vizsglni; ha a msik irnyt vlasztannk, akkor egy M krli egsz szerepelne a tesztekben. Az elbbi tpus tesztek idignye jval kisebb, amitl a visszafel lpked kd szmotteven gyorsabb az elre mennl. lvletlen prbls Ezeknl a mdszereknl a 0, hi{K), h2(K), , hM-i(K) prbasorozat a 0 , 1 , . . . , M - 1 szmoknak egy a K kulcstl fggetlen lvletlen permutcija. A sorozatnak termszetesen gyorsan s hatkonyan reproduklhatnak kell lennie, hiszen minden adatelrsi mveletnl hasznlni akarjuk. Ez a kikts ppensggel ellenttes a vletlenszersggel. Msfell viszont ha a sorozat elgg vletlenszer", elg szeszlyesen ugrabugrl, akkor a tblban nem tapasztalunk elsdleges csomsodst. A kt trekvs egymssal ellenttesnek tnik, de mint pldk mutatjk, sszebkthetk. Az lvletlen prbls sem mentes teljesen a csomsodstl, br ez kisebb mrtkben rontja a hatkonysgot, mint a lineris prblsra jellemz elsdleges csomsods. Arrl van sz, hogy ha a K s L kulcsokra h{K) h(L), akkor a K s L kulcsok teljes prbasorozata is megegyezik. Ha teht sok azonos cmre kerl kulcs van, akkor a kzs prbasorozatuk mentn alakul ki csomsods. Ezt a jelensget msodlagos csomsodsnak nevezzk. Az lvletlen prblsra egy hasznos s mutats plda a kvadratikus maradk prba. Legyen M egy 4k + 3 alak prmszm, ahol k egy egsz. Ekkor a prbaso-

94 rozat legyen

4. HASH-ELS S SZEKVENCILIS KERESS

o.i J ,- ( 1 .,, J ,- ( 2 ),...,(^) 1 ,.(zi) a .


Egy kis szmolgats (az M = 19-et javasoljuk az olvasnak) rzkelteti, hogy a sorozat tnyleg elg szeszlyesen lpked. Elmleti rvek is szlnak a vletlenszersge" mellett; ezeket most mellzzk. Megmutatjuk viszont, hogy a sorozat a modulo M maradkosztlyok egy permutcijt adja. Ez knnyen kvetkezik az albbi tnybl. llts: Ha M egy 4k + 3 alak prmszm, akkor nincs olyan n egsz, melyre r? = - 1 (mod M). Bizonyts: Indirekt rvelve tegyk fel, hogy n egy egsz szm s n 2 = 1 (mod M). Ekkor
. M-l o Ml

Jl/f

-1 = ( - 1 ) ~ = n

~ =nM~x

= 1

(modM).

Az utols lpsnl a kis Fermat-ttelt hasznltuk. Az elejt a vgvel sszevetve 1 = 1 (mod M) addik, ami kptelensg. D Nyilvnval mrmost, hogy ha 0 < i < j < ^ p s akkor i 2 ^ j 2 (mod M). Ugyanis a j 2 i2 {j ~ i)(j + i) felbonts egyik tnyezje sem lehet oszthat M-mel, teht a szorzatuk sem. Ugyangy kapjuk, hogy i2 ^ - j 2 (mod M). Az i2 = - j 2 (mod M) kongruencibl pedig (ij^1)2 = - 1 (mod M) kvetkezne, ahol j ~ 1 jelli a j multiplikatv inverzt modulo M. Ez a kongruencia pedig az elz llts szerint nem lehetsges. A prbasorozatban tnyleg nincs ismtlds. Ami a keress kltsgt illeti, a legjobb vltozatok idignye gy alakul (nem bizonytjuk): CW 1 - log(l - a) - ~ a sikeres keressre, s ~ M ~ a " Xo^1 ~ a ) (1 - a j a sikertelen keress sorn megvizsglt cellk tlagos szmra. Ezek az sszefggsek valamivel ltalnosabban rvnyesek az olyan mdszerekre, amelyekre hi(K) fi(h(K)); vagyis ahol a h(K) rtk mr az egsz prbasorozatot meghatrozza.
C

'N

4.2.

HASH-FGGVNYEK

95

Ketts hash-els (G. deBalbine, J. R. Bell, C. H. Kaman, 1970 krl.) A recept lnyege, hogy a h mellett egy msik ti hash-fggvnyt is hasznlunk. Utbbival szemben kvetelmny, hogy a h'(K) rtkek relatv prmek legyenek az M tblamrethez. A K kulcs prbasorozata ekkor hi(K) := ih'(K). Ha M s h'{K) relatv prmek, akkor a 0, -t{K), -2t{K),... ,-(M l)t{K) sorozat elemei mind klnbzk modulo M, gy alkalmas lesz prbasorozatnak. E mdszerek fontos sajtossga, hogy a klnbz K s K' kulcsok prbasorozatai j esllyel akkor is klnbzk lesznek, ha h(K) = h(K'). A legjobb ismert implementcik idignye (empirikus adatok alapjn) CN - log es C/v N ~ a (l-a) " 1-a' A ketts hash-els hatkony, a gyakorlatban is j viselkedst mutat mdszer. Ezzel kapcsolatos tovbbi tapasztalati szrevtelek a kvetkezk: 1. A ketts hash-els kikszbli mindktfle csomsodst. 2. Sikertelen keress esetn minden rdekes a-ra gyorsabb, mint a lineris prbls. 3. Sikeres keresskor csak az a > 0, 8 tartomnyban lesz gyorsabb a lineris prblsnl. Vgezetl bizonyts nlkl megemltnk nhny tnyt a vdrs hash-els bels memris vltozatrl. Ekkor rekordokat (cellkat) lncolunk. Egy vdr teht cellkbl ll lnc lesz. Jellje M a vdrkatalgus mrett. Tegyk fel, hogy a rekordok a kulcs szerint nem cskken sorrendben vannak a listjukra fzve. Ekkor igazolhat, hogy ha 0 < a < 1, akkor CN w 1 + -a s C'N a 1 + ~ a 2 .

A lncois ltalban jval helyignyesebb a nyitott cmzs mdszereknl. A megvizsglt cellk szmt tekintve - ezt mrik a CN s C'N mennyisgek - viszont hatkonyabb azoknl mind a sikeres, mind a sikertelen keresseket illeten. Valdi idben mrve az sszevets mr nem ennyire egyrtelm, mert a listk kezelse nehzkesebb, mint a tmbszer tblk. Feladat: Igazoljuk a bels memris lncois sikeres keressnek idejt megad formult.

4.2.

Hash-fggvnyek

A hash-elst hasznl mdszerek hatkonysga nagymrtkben fgg a h hashfggvny minsgtl. A h fggvnnyel szemben kt alapvet kvetelmny van:

96

4. HASH-ELS S SZEKVENCILIS KERESS

legyen knnyen (gyorsan) szmthat, s minl kevesebb tkzst okozzon. Az els kvetelmny magtl rtetd: a mdszer alkalmazsa sorn minden rekordelrs egy h(K) rtk kiszmtsa alapjn trtnik, ahol K egy kulcs. A msodik kvetelmny elg nehezen megfoghat, mert a gyakorlatban elfordul kulcshalmazok egyltaln nem vletlenszerek (a fejezet elejnek pldjhoz kapcsoldva mondjuk a Kovcs nv sokkal gyakoribb, mint az Erdgh). Kevs elmleti eredmny van, viszont jelents tapasztalati htter ismeret halmozdott fel. Ilyen hasznos empirikus tancsok pldul, hogy h(K) rtke lehetleg a K kulcs minden bitjtl fggjn, s a h rtkkszlete a teljes [0, M 1] cmtartomny legyen. Fontossgt tekintve kt mdszer emelkedik ki a meznybl. Ezeket ismertetjk a kvetkezkben. Osztmdszer Legyen h(K) := K (mod M), ahol M a tbla vagy a vdrkatalgus mrete. Itt s a tovbbiakban is feltesszk, hogy a kulcsok egsz szmok. Ez nem jelent lnyegi korltozst. A gyakorlatban elfordul kulcsok ltalban knnyen s gyorsan konvertlhatk egszekk. Legtbbszr arrl van sz, hogy valamilyen bitsorozatot szmknt rtelmeznk. A h(K) szmtsa gyors s egyszer: mindssze egy maradkos osztst ignyel. A lineris prblsnl szerepl pldban az osztmdszert alkalmaztuk. Az osztmdszer hasznlatakor M, a tbla mrete sem teljesen kzmbs. Pldul ha M a 2 egy hatvnya, akkor h(K) csak a kulcs utols nhny bitjtl fgg. A j M rtkeket illeten van egy szles krben elfogadott recept, amit a szakma D. E. Knuth javaslataknt tart szmon. Eszerint megfelel, ha M-et prmnek vlasztjuk, gy, hogy M nem osztja rk_a-t, ahol r a karakterkszlet elemszma (pl. 128, vagy 256) s a, k kicsi" egszek. Az, hogy M prm, lnyeges felttel a kvadratikus maradk prbnl. Ugyancsak elnye az ilyen szmoknak, hogy knny hozzjuk relatv prm szmot tallni. Az utbbi tulajdonsg a ketts hash-elsnl jut szerephez. Szorzmdszer Ennl az eljrsnl egy rgztett 0 paramter hasznlatos, ami egy vals szm. Ennek birtokban legyen

h(K):=[M.{PK}\.
A formulban {x} jelli az x vals szm trtrszt. Szemlletesen az trtnik, hogy {f3K} kiszmtsval a K kulcsot vletlenszeren" beljk a [0,1) intervallumba, majd az eredmnyt felsklzzuk a cmtartomnyba.

42.

HASH-FGGVNYEK

97

Hatkonyan szmthat specilis eset a kvetkez: legyen a tblamret l/l = 2*, jellje w a gpnk szkapacitst (pl. w = 232), s legyen A egy a tu-hez relatv prm egsz. Ekkor (3 = ^ vlaszts mellett h(K) igen jl szmolhat. A szmok binris brzolsval dolgozva lnyegben egy szorzst s egy eltolst kell elvgezni. A szorzmdszer (s az osztmdszer is) jl viselkedik szmtani sorozatokon, azaz {K,K + d,K + 2d,...} alak kulcshalmazokon. Ilyenek knnyen addnak gyakorlati adatkezelsi feladatokbl, amint azt a termkl, termk!, termeld, ... s a hasonl szerkezet kulcshalmazok mutatjk. Megmutathat, hogy a h(K), h(K+d), h(K+2d)... sorozat kzeltleg szmtani sorozat lesz, azaz h jl sztdobja" a kulcsok szmtani sorozatait. Ennek a tnynek szp elmleti httere van. Tegyk fel, hogy (3 egy irracionlis szm, s nzzk a 0, {/?}, {2/3},... , {nf3} sorozat eloszlst [0, l)-ben. Nagy n rtkre ez egyenletes: egy z hosszsg (0 < z < 1) rszintervallumba krlbell zn elem esik, ha n > oo. Ez addik az albbi csodaszp eredmnybl. Ttel (T. Ss Vera, 1957): Legyen (3 irracionlis szm, s nzzk a 0, {(3}, {2(3} ,..., {nf3} pontok ltal meghatrozott n + 1 rszintervallumot [0, l)-ben. Ezek hosszai legfeljebb 3 klnbz rtket vehetnek fel, s {(n + l)(3} a leghosszabbak egyikt fogja kt rszre vgni. Ismert mg, hogy a [0, l)-beli szmok kzl a legegyenletesebb eloszlst a 0 = <-! = & = 0.618033988 ... s a (3 = 4>~2 = 1 - 4>~l rtkek adjk. Ekkor ha {(n + 1)(3} a korbbi osztpontok ltal meghatrozott / rszintervallumba esik, s azt a, valamint b hosszsg rszekre osztja, akkor \ < f < 2 mindig teljesl. Eszerint rdemes a szorzmdszernl az A egszet gy vlasztani, hogy ~ kzel legyen </>_1-hez. A (3 ilyen vlasztsval kapott mdszereket Fibonaccihash-elsnek nevezzk. A ketts hash-els msodik fggvnye A ketts hash-elsnl olyan h! fggvnyre van szksg, melynek rtkei a [ 0 , M - l ] intervallumba esnek, s relatv prmek az M tblamrethez. Ha M prm, akkor a kvetkez fggvny megteszi: h'{K) :=K ( m o d M - l ) + l. Az els tag 0 s M - 2 kz es egsz, ezrt a t rtkei 1 s M - 1 kztt lesznek, st az rtkkszlete ppen az [1, M - l ] intervallum egszeibl ll. Ebbl kt hasznos dolog kvetkezik. Egyrszt az, hogy h'(K) s M relatv prmek. Msrszt az is teljesl, hogy elg sok - szm szerint M - l - klnbz prbasorozatot ad.

98

4. HASH-ELS S SZEKVENCILIS KERESS

4.3.

Hash-els kontra keresfk

Kt erteljes s gazdag mdszercsaldot ismertnk meg a keress, beszrs, trls s az ezekre pl mveletek megvalstsra; divatos kifejezssel lve: dinamikus halmazok kezelsre. Az egyik megkzelts a hash-elt szervezs, a msik pedig a keresfa adatszerkezet. Termszetesen vetdik fel a krds, hogy milyen szempontok szerint vlasszunk a kett kzl. Ez felmerlhet gy, hogy neknk kell egy dinamikus halmazokat kezel programot rni, de gy is, hogy egy kszen kaphat rendszer (pl. adatbziskezel) ltal nyjtott lehetsgek kzl kell vlasztani. Hrom szempontot emltnk, amelyek segtenek az eligazodsban.

tlagos viselkeds - legrosszabb eset A hash-elt szervezsnl az alapmveletek (keress, beszrs, trls) tlagos rtelemben gyorsabbak, mint a keresfknl. Ezt tkrzi az a tny, hogy a hash-elsnl rgztett a < 1 teltettsgi tnyeznl a megvizsglt lapok, illetve cellk szma tlagosan konstans korlt alatt marad. Szmos alkalmazsnl ppen az tlagos sebessg, ami igazn szmt. Pldul az gyviteli alkalmazsok egy jelents rsznl csak az a fontos, hogy nagy mennyisg teendt sszessgben kedvez id alatt elvgezznk, s nem rdekes, ha ezek kzl nhny hosszabb ideig tart, mint a tbbi. Az ilyen esetekben a hash-els fel billen a mrleg nyelve. Vannak ezzel szemben olyan helyzetek, ahol a legrosszabb, legkedveztlenebb esetekben is elg gyorsnak kell lenni. A legdrmaibb pldk ebbl a szempontbl az n. vals idej feladatok. Ezek jellemzje, hogy a programnak meg kell felelnie valamilyen kls folyamatok fesztett idbeli knyszereinek. Mondjuk egy erm kaznjnak szelepeit vezrl rendszertl elvrjuk, hogy a megnvekedett hmrskletre mg azeltt reagljon, nyissa ki a szelepeket, mieltt sztrobban a kazn. Groteszk lenne a katasztrfa utn azzal takarzni, hogy a program ppen egy hossz vdrben kotorszott valami adat utn. Az ilyen krlmnyek kztt add dinamikus halmazokat keresfkban kell trolnunk, mert azok a legrosszabb esetek idejre is garancit nyjtanak.

Rendezs a felhasznli ignyekben Elfordul, hogy az adatok rendezsre vonatkoz felttelek komoly szerepet jtszanak a felhasznli ignyekben, pldul sok MIN, MAX, s/vagy TOLIG-tpus krdsre kell vlaszolni. Ekkor a keresfk ajnlhatk, hiszen j megoldsokat nyjtanak az ilyen feladatokra. A hash-elt szervezsek nem, vagy csak meglehetsen bonyolult kiegszt megoldsokkal tudjk figyelembe venni a rendezettsget.

4.4. SZEKVENCILIS KERESS

99

pinamika A hash-elt szervezs nem tmogatja az llomny nagyon dinamikus nvekedst. Ha a tbla betelik, vagy ha a mr tl nagy, akkor j, nagyobb tblval (vdrkatalgussal) jra kell szervezni az llomnyt. A keresfk ezzel szemben rendkvl rugalmasan, tg hatrok kztt tudjk vltoztatni a mretket. Ha teht gy ltjuk, hogy a troland llomny mrete erteljesen vltozni fog, vagy nem tudunk a mretre realisztikus fels korltot adni, akkor inkbb a keresfk ajnlhatk.

4.4. Szekvencilis keress


Gyakran elfordul, hogy egy llomny (tmb, lista, stb.) szegnyes szerkezet. Ez alatt azt rtjk, hogy nincs benne elg rendszer, s ezrt a keressre nincs jobb mdszernk, mint a szerkezetet elejtl a vgig" bejrni, vagy legalbbis addig, amg a keresett adatot meg nem talljuk. Az ilyen esetekben szekvencilis keressrl beszlnk. A modell, amit hasznlunk, a rekordokbi ll tbla. R\ i?2 R$ -Rjv-i RN

A feladat az R rekord megtallsa a tblban, ha egyltaln benne van. A keress gy trtnik, hogy a tbla elejtl kezdve sorra sszehasonltjuk az R rekordot az R rekordokkal (i = 1,2,...). A keress befejezdik, ha R = R, vagy i = N. A keress kltsge a tbla megvizsglt cellinak szma. Ha semmifle tovbbi feltvssel nem lnk, akkor a sikeres keress tlagos kltsge 1 + 2 + --- + N _ N + l N 2 Az tlag gy rtend, hogy az R = R esemnyek egyenl eslyek. Sikertelen keresskor, amikor az R rekord nincs a tblban, a kltsg mindig N. Ha a tbla a rekordokat egyrtelmen meghatroz kulcs szerint rendezett, akkor sikeres keressnl a helyzet vltozatlan, ^ ^ az tlagos kltsg. A sikertelen keress idignye cskkenhet, hiszen a tblt csak akkor kell vgignzni, ha R kulcsa nagyobb az RN kulcsnl. Beszlhetnk tlagos kltsgrl is: a beszrsos rendezs elemzsben hasznlt felttelhez hasonlan tegyk fel, hogy az R egyenl esllyel kerl az R rekordok ltal meghatrozott N + l rendezsi intervallum brmelyikbe. Ekkor a megvizsglt cellk tlagos szma 1 + 2 + ... + N-l N +l +N +N N . N 2 N +1 K 2 i

100

4. HASH-ELS S SZEKVENCILIS KERESS

Tegyk fel a tovbbiakban, hogy csak sikeres keressekkel van dolgunk, s legyen pi annak a valsznsge, hogy az R rekordot keressk. Ekkor pi + p2 + + PN = 1, s a keress vrhat kltsge CN = Pi + 2p2 + 3>3 H 1 - NpN.

Feladat: Mutassuk meg, hogy adott valsznsgek mellett CN akkor minimlis, ha pi > p2 > > PN- (Ha i < j s p,- < pj, akkor az R O RJ csere utn C/v kisebb lesz.) A feladat szerint a rekordokat a keressi gyakorisgok szerint nem nvekv sorrendben rdemes a tblban tartani. Elfordul, hogy a {pi} eloszlst, vagy annak elg j kzeltst ismerjk, s ezrt ki tudjuk alaktani az optimlis sorrendet. Olyan alkalmazsoknl fordul ez el, ahol a tbla statikus, a tartalma nem vltozik, s kizrlag keressi ignyek merlnek fel. Ilyen alkalmazsra elg j plda egy archv szvegeket (mondjuk rgi folyiratok tartalmt) trol rendszer. Nzzk meg ezutn, hogy miknt alakul a CN rtke nhny rdekes eloszls esetn, amikor a rekordok ap; rtkek szerint nem nvekv sorrendben vannak a tblban. Egyenletes eloszls: Itt p; = -^ minden i-re. Ekkor, ahogy azt az elbb mr lttuk, CN = ^ p - tlagosan teht a tbla cellinak a felt kell megnzni. Egy nagyon ferde eloszls: Legyen p; = ^ ha 1 < i < N 1, s pjv = pr^rA kupacpts elemzsnl hasznlt hromszg alak tblzat sszegezsvel belthat, hogy CN rtke nagyon kicsi: CN = 2 - ^hr- EZ nem meglep, hiszen a pi sorozat rohamosan cskken. Jellje Hn az n-edik harmonikus szmot: 1 1 1 2 o n Ahogy azt a gyorsrendezs elemzsnl mr emltettk, Hn = logn + 7 + o(l), ahol 7 = 0.55721... az Euler-lland. A Zipf eloszls valsznsgei pi = j , ahol c = -jj. A Zipf eloszls elfordul tbb, az adatkezels szempontjbl rdekes sszefggsben. Kzeltleg ilyen eloszlst kvet pldul egy tlagos (angol nyelv) szvegben az i-edik leggyakoribb sz gyakorisga. Egyszeren addik, hogy Zipf eloszls:

A keress vrhat kltsge teht N/ log JV krl van.

4.4. SZEKVENCILIS

KERESS

101

80-20 szably: Arrl a szmtgpes gyakorlatban megfigyelt, sok esetben rvnyes jelensgrl van sz, hogy az adatelrsi ignyek 80%-a a rekordoknak krlbell csak 20%-t rinti. Erre a 20%-ra ugyanez a szably rvnyes. Ebbl kvetkezik, hogy az ignyek 64%-a az llomnynak mindssze 4%-t rinti. A 80-20 szably szerint viselked eloszlsra minden 1 < m < N esetn
P1+P2 P\ + + P0,2m +Pm

0, v-

Ekvetelmnyeknek megkzelten eleget tev eloszlst kapunk api = -r^ lasztssal, ahol 0 = Iog0,8 log0,2 1 7' c = 1
(l-tf) HN
eS H

(1-t) N

1
2(1-^)

+ Ni1-**)'

A sikeres keress vrhat idejre megmutathat, hogy CN ~ 0, 122N. Egy ilyen eloszlst kvet llomnyban az optimlis sorrend mellett a keress mintegy ngyszer gyorsabb, mint a rekordok (egyenletes eloszls szerinti) vletlen sorrendje esetn. nszervez mdszerek Mit tehetnk abban az esetben, ha a pi keressi valsznsgeket nem ismerjk, vagy esetleg azok idvel vltoznak? Ilyenkor a sikeres keress utn rdemes vltoztatni a rekordok sorrendjn. Az S-fknl mr lttunk pldt arra, hogy visszacsatolson alapul egyszer vltoztatsok jelentsen javthatjk egy adatszerkezet hatkonysgt. A jelen esetben a keressek sorozatt gy is felfoghatjuk, hogy mintt vesznk a {pi} eloszlsbl, vagyis nzzk az R = R esemnyek q, tapasztalati gyakorisgt. A qi gyakorisg n, ha az ppen megtallt rekord R, ezrt ekkor i?,-t elbbre visszk a tblban, feltve, hogy i > 1. Kt alapvet tletet emltnk. (a) A keresett (s megtallt) R elemet a tbla elejre visszk. Az eredmny:
R

R\

Ro

...

RN

(b) A keresett (s megtallt) R elemet felcserljk a megelzvel. R ...


R

Ri-i

...

RN

Ha az eloszls idben vltozik, akkor az (a) megolds ajnlatos. Ha a {pi} eloszls stabil, azaz idben nem vltozik, akkor a (b) heurisztika eredmnyesebb. A (b) vltozatrl azt sejtik, hogy optimlis megoldst ad az olyan esetekben, amikor e gy ismeretlen statikus eloszlssal van dolgunk, s nem ll mdunkban nyilvntartani a q elrsi gyakorisgokat.

You might also like