Datov´e struktury – haˇsov´ an´ı Pˇredn´ aˇska 1 ´ Uvod Z´akladn´ı probl´em: Reprezentace mnoˇzin a operace s nimi. V ˇradˇe u ´loh a algoritm˚ u je tento podprobl´em rozhoduj´ıc´ı pro sloˇzitost ˇreˇsen´ı, protoˇze tyto operace se mnohokr´at opakuj´ı. Proto je tˇreba navrhnout pro tyto u ´lohy co nejefektivnˇejˇs´ı algoritmy (kaˇzd´ y uˇsetˇren´ y ˇcas mnohon´asobn´ ym opakov´an´ım zaˇcne hr´at d˚ uleˇzitou roli). Proto je tˇreba detailn´ı anal´ yza sloˇzitosti v z´avislosti na vnˇejˇs´ıch okolnostech. Nelze ˇr´ıct, ˇze nˇekter´ y algoritmus je nejlepˇs´ı, protoˇze za urˇcit´ ych okolnost´ı m˚ uˇze b´ yt ‘m´enˇe efektivn´ı’ algoritmus v´ yhodnˇejˇs´ı. Z´akladn´ı probl´em je slovn´ıkov´ y probl´em: D´ano univerzum U , m´ame reprezentovat S ⊆ U a navrhnout algoritmy pro n´asleduj´ıc´ı operace MEMBER(x) – zjist´ı, zda x ∈ S, a nalezne jeho uloˇzen´ı INSERT(x) – kdyˇz x ∈ / S, pak vloˇz´ı x do struktury reprezentuj´ıc´ı S DELETE(x) – kdyˇz x ∈ S, pak odstran´ı x ze struktury reprezentuj´ıc´ı S. ˇ v nejhorˇs´ım pˇr´ıpaEfektivita algoritmu: ˇcasov´a sloˇzitost, prostorov´a sloˇzitost vyˇsetˇren´a bud dˇe nebo v pr˚ umˇern´em pˇr´ıpadˇe nebo amortizovanˇe. Literatura: K. Mehlhorn: Data Structures and Algorithms 1: Sorting and Searching, Springer 1984 http://www.mpi-sb.mpg.de/∼ mehlhorn/DatAlgbooks.html J. S. Vitter, W.-Ch. Chen: Design and Analysis of Coalesced Hashing, Oxford Univ. Press, 1987
Haˇsov´ an´ı Pomoc´ı pole m˚ uˇzeme rychle implementovat operace MEMBER, INSERT a DELETE. Nev´ yhoda: kdyˇz je velk´e univerzum, pak je prostorov´a sloˇzitost v nejlepˇs´ım pˇr´ıpadˇe ohromn´a, ve ˇspatn´em pˇr´ıpadˇe nelze pole zadat do poˇc´ıtaˇce. Haˇsov´an´ı chce zachovat rychlost operac´ı, ale odstranit pamˇeˇtovou n´aroˇcnost. Prvn´ı publikovan´ y ˇcl´anek o haˇsov´an´ı je od Petersona 1957, ale existuje technick´a zpr´ava od IBM o haˇsov´an´ı z roku 1953. Z´akladn´ı idea: D´ano univerzum U a mnoˇzina S ⊆ U tak, ˇze |S| << |U |. M´ame funkci h:U − → {0, 1, . . . , m − 1} a mnoˇzinu S reprezentujeme tabulkou (polem) s m ˇr´adky tak, ˇze s ∈ S je uloˇzen na ˇr´adku h(s). Nev´ yhoda: mohou existovat r˚ uzn´a s, t ∈ S takov´a, ˇze h(s) = h(t) - tento jev se naz´ yv´ a kolize. Hlavn´ı probl´em: ˇreˇsen´ı koliz´ı. Z´akladn´ı ˇreˇsen´ı: pouˇzijeme pole o velikosti [0..m − 1] a i-t´a poloˇzka pole bude spojov´ y seznam obsahuj´ıc´ı vˇsechny prvky s ∈ S takov´e, ˇze h(s) = i. Toto ˇreˇsen´ı se naz´ yv´a haˇsov´ an´ı se separovan´ ymi ˇretˇezci. Pˇr´ıklad: U = {1, 2, . . . , 1000}, S = {1, 7, 11, 53, 73, 141, 161} a funkce je h(x) = x mod 10. Pak P (0) = P (2) = P (4) = P (5) = P (6) = P (8) = P (9) jsou pr´azdn´e seznamy, P (7) =< 7 >, P (3) =< 53, 73 >, P (1) =< 1, 141, 11, 161 >. Seznamy nemus´ı b´ yt uspoˇr´adan´e. 1
2
Algoritmy operac´ı MEMBER(x) 1) Spoˇc´ıt´ame i := h(x); 2) if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t 6= x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif 3) if t = x then x ∈ S else x ∈ / S endif INSERT(x) 1) Spoˇc´ıt´ame i := h(x); 2) if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t 6= x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif 3) if t 6= x then vloˇz´ıme x do i-t´eho seznamu endif DELETE(x) 1) Spoˇc´ıt´ame i := h(x); 2) if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t 6= x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif 3) if t = x then odstran´ıme x z i-t´eho seznamu endif V n´asleduj´ıc´ı anal´ yze pˇredpokl´ad´ame, ˇze hodnota funkce h(x) je spoˇcitateln´a v ˇcase O(1). V nejhorˇs´ım pˇr´ıpadˇe operace vyˇzaduj´ı ˇcas O(|S|) (vˇsechny prvky jsou v jednom seznamu). Poˇzadovan´a pamˇeˇtov´a n´aroˇcnost O(m + |S|) (pˇredpokl´ad´ame, ˇze s ∈ S vyˇzaduje pamˇeˇt O(1)). Pamˇeˇt vˇsak nen´ı efektivnˇe vyuˇzit´a Spoˇc´ıt´ame oˇcek´avanou d´elku ˇretˇezc˚ u za pˇredpoklad˚ u 1) h je rychle spoˇcitateln´a (a pevn´a bˇehem v´ ypoˇctu) 2) h rozdˇeluje univerzum U rovnomˇernˇe (tj. −1 ≤ |h−1 (i)| − |h−1 (j)| ≤ 1 pro i, j ∈ {0, 1, . . . , m − 1}) 3) S je n´ahodnˇe vybran´a z univerza U (tj. kaˇzd´ y prvek z U je v S se stejnou pravdˇepodobnost´ı) 4) kaˇzd´ y prvek z U m´a stejnou pravdˇepodobnost b´ yt argumentem operace. Pouˇzit´e znaˇcen´ı: |S| = n, m =poˇcet seznam˚ u, |U | = N , n faktor naplnˇen´ı (load factor) ℓ(i) =d´elka i-t´eho ˇretˇezce, α = m D˚ usledky pˇredpoklad˚ u: 1 Prob(h(x) = i) = m pro vˇ x ∈ U a vˇsechna i = 0, 1, . . . , m − 1 sechna n 1 n−l 1 l ) pro vˇsechna i = 0, 1, . . . , m − 1. Prob(ℓ(i) = l) = pn,l = l ( m ) (1 − m Vysvˇetlen´ı: i-t´ y ˇretˇezec m´a d´ a, ˇze elku l, pr´avˇe kdyˇz existuje podmnoˇzina A ⊆ S takov´ |A| = l (tˇechto moˇznost´ı je nl ), pro kaˇzd´e x ∈ A plat´ı h(x) = i (pravdˇepodobnost tohoto 1 n−l 1 l ) ) a pro kaˇzd´e x ∈ S\A plat´ı h(x) 6= i (pravdˇepodobnost tohoto jevu je (1− m ) . jevu je ( m
3
Oˇcek´avan´ a d´elka ˇretˇezc˚ u E(l) =
n X
lpn,l
l=0
n n X n 1 l 1 n−l X n! 1 1 ( ) (1 − ) = l = l ( )l (1 − )n−l = l m m l!(n − l)! m m l=0
l=0
n (n − 1)! 1 1 n X ( )l−1 (1 − )n−l = m (l − 1)!(n − l)! m m l=1 n n X n − 1 1 l−1 1 ( ) (1 − )(n−1)−(l−1) = l−1 m m m l=1 n−1 1 n 1 1 n n X n−1 1 l ( ) (1 − )n−1−l = ( + 1 − )n−1 = . l m m m m m m m l=0
V´ ypoˇcet druh´eho momentu 2
E(l ) =E(l(l − 1)) + E(l)E(l(l − 1)) =
n X l=0
n X
n 1 l 1 ( ) (1 − )n−l = l(l − 1) l m m
1 n − 2 1 l−2 n(n − 1) ( ) (1 − )(n−2)−(l−2) = 2 l−2 m m m l=2 n−2 1 n−2−l n(n − 1) n(n − 1) X n − 2 1 l ( ) (1 − ) = l m2 m m m2 l=0
E(l2 ) =
n(n − 1) n n n−1 + = (1 + ) 2 m m m m
V´ ypoˇcet rozptylu var(l) = E(l − E(l))2 = E(l2 ) − (E(l))2 = Shrneme v´ ysledky: Oˇcek´avan´a d´elka ˇretˇezc˚ u je
n m
n−1 n n 1 n (1 + ) − ( )2 = (1 − ). m m m m m
a rozptyl d´elky ˇretˇezc˚ u je
n m (1
−
1 m ).
Oˇcek´avan´ y nejhorˇs´ı pˇr´ıpad Spoˇc´ıt´ame EN P oˇcek´avanou d´elku maxim´aln´ıho ˇretˇezce. Oznaˇcme ℓ(i) d´elku i-t´eho ˇretˇezce. Pak Prob(max ℓ(i) = j) = Prob(max ℓ(i) ≥ j) − Prob(max ℓ(i) ≥ j + 1). i
i
i
4
Pak m˚ uˇzeme poˇc´ıtat: X X j(Prob(max ℓ(i) ≥ j) − Prob(max ℓ(i) ≥ j + 1)) = j Prob(max ℓ(i) = j) = EN P = i
j
X
j Prob(max ℓ(i) ≥ j) − i
j
X
X
X
i
X
i
(j − 1) Prob(max ℓ(i) ≥ j) = i
j
(j − j + 1) Prob(max ℓ(i) ≥ j) = i
j
i
j Prob(max ℓ(i) ≥ j + 1) =
j
j Prob(max ℓ(i) ≥ j) −
j
i
j
X
Prob(max ℓ(i) ≥ j)
j
i
Vysvˇetlen´ı: Pˇri ˇctvrt´e rovnosti se v druh´e sumˇe zvˇetˇsil index, pˇres kter´ y sˇc´ıt´ame, o 1, v p´ at´e rovnosti se k sobˇe daly koeficienty pˇri stejn´ ych pravdˇepodobnostech ve dvou sum´ach. Odtud Prob(max ℓ(i) ≥ j) = Prob(ℓ(1) ≥ j ∨ ℓ(2) ≥ j ∨ · · · ∨ ℓ(m − 1) ≥ j) ≤ i X n 1 j ( ) = Prob(ℓ(i) ≥ j) ≤ m j m i Qj−1 1 n k=0 (n − k) 1 j−1 ( ) ≤ n( )j−1 . j! m m j! Vysvˇetlen´ı: Prvn´ı nerovnost plyne z toho, ˇze pravdˇepodobnost disjunkce jev˚ u je menˇs´ı neˇz souˇcet pravdˇepodobnost´ı jev˚ u, druh´a nerovnost plyne z toho, ˇze i-t´ y ˇretˇezec m´a d´elku j, jakmile existuje podmnoˇzina A ⊆ S takov´a, ˇze |A| = j (tˇechto moˇznost´ı je nj ) a pro kaˇzd´e 1 j x ∈ A plat´ı h(x) = i (pravdˇepodobnost tohoto jevu je ( m ) ). n j−1 1 D˚ usledek. Prob(maxi ℓ(i) ≥ j) ≤ min{1, n( m ) }. j!
Pˇredpoklad: α =
n m
n j−1 1 ≤ 1. Pak pro j0 = min{j | n( m ) ı j! ≤ 1} plat´
j j n j−1 1 ) ≤ 1} ≤ min{j | n ≤ j!} ≤ min{j | n ≤ ( ) 2 } = m j! 2 j 2 log n 2 log n j ≤ j} ≤ min{j | }= min{j | log n ≤ log( )} = min{j | j log n 2 2 log( 2 ) log( log( j ) )
j0 = min{j | n(
2
min{j |
2 log n 2 log n ≤ j}, ≤ j} ≤ min{j | j log log n log log n − log log( 2 )
odtud dost´av´ame, ˇze j0 = O( logloglogn n ). j
Vysvˇetlen´ı: Druh´a nerovnost plyne z faktu, ˇze j! ≥ ( 2j ) 2 a tˇret´ı nerovnost jsme dostali dosazen´ım nerovnosti pro j do j ve jmenovateli v pˇredchoz´ım v´ yrazu charakterizuj´ıc´ım j. V ostatn´ıch u ´prav´ach jsme pouˇzili jen algebraick´e u ´pravy.
5
Toto pouˇzijeme pˇri odhadu EN P . EN P =
X
Prob(max ℓ(i) ≥ j) ≤
X
1+
X
i
j
j0
j
j=j0 +1
j=1
j0 +
∞ X
X
(
j=j0 +1
min{1, n(
∞ ∞ X n j−1 1 n n X j0 ! n( ) ≤ j0 + = j0 + ≤ m j! j! j ! j! 0 j=j +1 j=j +1 0
0
1 )j−j0 ≤ j0 + j0 + 1
1 j0 +1 − j01+1 +
Vysvˇetlen´ı: Pˇri druh´e nerovnosti jsme pouˇzili, ˇze ˇze jn0 ! ≤ 1, pˇri ˇctvrt´e nerovnosti jsme pouˇzili 1 j0 ! = Qj j! k=j
0+1
Shrneme z´ıskan´ y v´ ysledek
n j−1 1 ) }= m j!
k
≤(
n m
1
= j0 +
1 = O(j0 ) j0
≤ 1, pˇri tˇret´ı nerovnosti jsme pouˇzili,
1 )j−j0 . j0 + 1
n Vˇ eta. Za pˇredpokladu α = m ≤ 1 je pˇri haˇsov´ an´ı se separuj´ıc´ımi ˇretˇezci horn´ı odhad log n oˇcek´ avan´e d´elky maxim´ aln´ıho ˇretˇezce O( log log n ). Kdyˇz 0.5 ≤ α ≤ 1, je to z´ aroveˇ n i doln´ı odhad.
Oˇcek´avan´ y poˇcet test˚ u Test je porovn´an´ı argumentu operace s prvkem na dan´em m´ıstˇe ˇretˇezce nebo zjiˇstˇen´ı, ˇze vyˇsetˇrovan´ y ˇretˇezec je pr´azdn´ y. Budeme rozliˇsovat dva pˇr´ıpady u ´spˇeˇsn´e vyhled´av´an´ı, kdyˇz argument operace je mezi prvky reprezentovan´e mnoˇziny, ne´ uspˇeˇsn´e vyhled´av´an´ı, kdyˇz argument operace nen´ı mezi prvky reprezentovan´e mnoˇziny.
Ne´ uspˇeˇsn´e vyhled´ av´an´ı Oˇcek´avan´ y poˇcet test˚ u: E(T ) = Prob(ℓ(i) = 0) +
X l
l Prob(ℓ(i) = l) = pn,0 +
X l
lpn,l = (1 −
1 n n ) + ≈ e−α + α. m m
Vysvˇetlen´ı: Zjiˇstˇen´ı, zda ˇretˇezec je pr´azdn´ y, vyˇzaduje jeden test, tj. Prob(ℓ(i) = 0 nen´ı s koeficientem 0, ale 1. Protoˇze pravdˇepodobnosti jsou stejn´e pro P vˇsechny ˇretˇezce, nemus´ıme specifikovat ˇretˇezec, kter´ y vyˇsetˇrujeme, staˇc´ı ps´at obecnˇe i. c´ıtali pˇri l lpn,l jsme spoˇ v´ ypoˇctu oˇcek´avan´e d´elky ˇretˇezce.
6
´ eˇsn´e vyhled´ Uspˇ av´an´ı Zvolme jeden ˇretˇezec prvk˚ u o d´elce l. Poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v tomto ˇretˇezci je l+1 . 1+2+···+l = 2 P Oˇcek´avan´ y poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v nˇejak´em ˇretˇezci je l l+1 Prob(ℓ(i) = 2 P l+1 l) = l 2 pn,l . P Oˇcek´an´ y poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v tabulce je m l l+1 pn,l . 2 Oˇcek´avan´ y poˇcet test˚ u pro vyhled´an´ı jednoho prvku je
n n n X mX l+1 m X 2 pn,l = l pn,l + lpn,l = n n 2n l=0
m 2n
l=0 n X l=1
l=0
l(l − 1)pn,l + 2
n X l=1
lpn,l =
m n(n − 1) 2m n−1 ( + )= +1 ≈ 2 2n m n 2m α 1+ . 2 Jin´ y postup: Poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı prvku x ∈ S je 1+poˇcet porovn´ an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı x v operaci INSERT(x). Poˇcet porovn´an´ı kl´ıˇc˚ u je d´elka ˇretˇezce, a proto oˇcek´avan´ y poˇcet porovn´an´ı kl´ıˇc˚ u je oˇcek´avan´a d´elka ˇretˇezce. Tedy oˇcek´ avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı x je 1+oˇcek´avan´a d´elka ˇretˇezce v okamˇziku vkl´ ad´ an´ı x, neboli n−1 i n−1 1X (1 + ) = 1 + . n i=0 m 2m Vˇ eta. Pˇri haˇsov´ an´ı se separovan´ ymi ˇretˇezci je oˇcek´ avan´ y poˇcet test˚ u pˇri ne´ uspeˇsn´em vyα −α hled´ avan´ı pˇribliˇznˇe e + α a pˇri u ´spˇeˇsn´em vyhled´ av´ an´ı pˇribliˇznˇe 1 + 2 . N´asleduj´ıc´ı tabulka d´av´a pˇrehled oˇcek´avan´eho poˇctu test˚ u pro r˚ uzn´e hodnoty α α ne´ usp. u ´spˇeˇs. α ne´ usp. u ´spˇeˇs.
vyh. vyh. vyh. vyh.
0 0.1 0.2 0.3 0.4 0.5 0.6 1 1.005 1.019 1.041 1.07 1.107 1.149 1 1.05 1.1 1.15 1.2 1.25 1.3 0.7 0.8 0.9 1 2 3 1.196 1.249 1.307 1.368 2.135 3.05 1.35 1.4 1.45 1.5 2 2.5
7
Vˇsimnˇete si, ˇze oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je menˇs´ı neˇz oˇcek´ avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı, kdyˇz α ≤ 1. Na prvn´ı pohled vypad´a tento v´ ysledek nesmyslnˇe, ale d˚ uvod je, ˇze poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı pr˚ umˇerujeme proti n, kdeˇzto pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı proti m. Ilustrujeme to na n´asleduj´ıc´ım pˇr´ıkladu: ˇ Nechˇt n = m azdn´ ych ˇretˇezc˚ u m´a d´elku 1 a polovina m´a d´elku 2. 2 a necht polovina nepr´ Oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´avan´ı – 1 test pro pr´azdn´e ˇretˇezce a ˇretˇezce d´elky 1; tˇechto pˇr´ıpad˚ u je 5m 6 . – 2 testy pro ˇretˇezce d´elky 2; tˇechto pˇr´ıpad˚ u je m 6 m 7 1 (1 5m + 2 ) = . Oˇcek´avan´ y poˇcet test˚ u je m 6 6 6 Oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı – 1 test pro prvky na prvn´ım m´ıstˇe ˇretˇezce; tˇechto pˇr´ıpad˚ u je 2n 3 – 2 testy pro prvky, kter´e jsou na druh´em m´ıstˇe ˇretˇezce; tˇechto pˇr´ıpad˚ u je n3 . + 2 n3 ) = 34 . Oˇcek´avan´ y poˇcet test˚ u je n1 (1 2n 3 Velikost α je doporuˇcov´ana menˇs´ı neˇz 1, ale nem´a b´ yt hodnˇe mal´ a, protoˇze by pamˇeˇt nebyla efektivnˇe vyuˇzita. medskip Vylepˇsen´ı metody: haˇsov´an´ı s uspoˇr´adan´ ymi ˇretˇezci. Rozd´ıl proti p˚ uvodn´ı metodˇe – ˇretˇezce jsou uspoˇr´adan´e ve vzr˚ ustaj´ıc´ım poˇrad´ı. Protoˇze ˇretˇezce obsahuj´ı stejn´e prvky, je poˇcet oˇcek´avan´ ych test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı stejn´ y jako u neuspoˇr´adan´ ych ˇretˇezc˚ u. Pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı konˇc´ıme, kdyˇz argument operace je menˇs´ı neˇz vyˇsetˇrovan´ y prvek v ˇretˇezci, tedy konˇc´ıme dˇr´ıv. N´asleduj´ıc´ı vˇeta (bez d˚ ukazu) uv´ad´ı oˇcekavan´ y poˇcet test˚ uv ne´ uspˇeˇsn´em pˇr´ıpadˇe. Vˇ eta. Oˇcek´ avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´ av´ an´ı pro haˇsov´ an´ı s uspoˇra ´dan´ ymi α 1 −α −α ˇretˇezci je pˇribliˇznˇe e + 1 + 2 − α (1 − e ). Oˇcek´ avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´ av´ an´ı pro haˇsov´ an´ı s uspoˇra ´dan´ ymi ˇretˇezci je pˇribliˇznˇe 1 + α2 .
8
Na z´avˇer uvedeme algoritmy pro operace s uspoˇr´adan´ ymi ˇretˇezci.
Algoritmy MEMBER(x) 1) Spoˇc´ıt´ame i := h(x); 2) if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif 3) if t = x then x ∈ S else x ∈ / S endif INSERT(x) 1) Spoˇc´ıt´ame i := h(x); 2) if i-t´ y seznam je nepr´azdn´ y then t:=prvn´ı prvek i-t´eho seznamu while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif 3) if t 6= x then vloˇz´ıme x do i-t´eho seznamu za prvek t endif DELETE(x) 1) Spoˇc´ıt´ame i := h(x); 2) if i-t´ y seznam je nepr´azdn´ y then t:=prvn´ı prvek i-t´eho seznamu while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif 3) if t = x then odstran´ıme x z i-t´eho seznamu endif
9
Pˇredn´ aˇska 2 Nev´ yhody haˇsovan´ı se separovan´ ymi ˇretˇezci – nevyuˇzit´ı alokovan´e pamˇeti (nehospod´arn´e) pouˇz´ıv´an´ı ukazatel˚ u ˇ Reˇsen´ı: vyuˇz´ıt pro ˇretˇezce p˚ uvodn´ı tabulku. Poloˇzky tabulky: key, odkaz na uloˇzen´a data, poloˇzky pro pr´aci s tabulkou Pˇredpokl´ad´ame, ˇze data jsou velk´a, v tom pˇr´ıpadˇe se ukl´adaj´ı mimo tabulku. V tabulce je jen odkaz na uloˇzen´a data. Pˇri popisu pr´ace s tabulkou tuto ˇc´ast budeme vynech´avat (tj. data budou pouze kl´ıˇc). Podle ˇreˇsen´ı kolize dˇel´ıme d´al haˇsov´an´ı: haˇsov´an´ı s pˇrem´ısˇtov´an´ım, haˇsov´an´ı s dvˇema ukazateli, sr˚ ustaj´ıc´ı haˇsov´an´ı, dvojit´e haˇsov´an´ı a haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım.
Haˇsov´ an´ı s pˇrem´ısˇtov´ an´ım Poloˇzky pro pr´aci s tabulkou: next, previous poloˇzka next – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı u ´daj poloˇzka previous – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı pˇredchoz´ı u ´daj Pˇr´ıklad: U = {1, 2, . . . , 1000}, h(x) = x mod 10, uloˇzen´a mnoˇzina S = {1, 7, 11, 53, 73, 141, 161}, ˇretˇezce: P (1) = (1, 141, 11, 161), P (3) = (73, 53), P (7) = (7). Haˇsovac´ı tabulka: ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
1
9
73
6
161 53 7 11 141
previous
8 3 5 8
9 1
Tabulka vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(141), INSERT(11), INSERT(73), INSERT(53), INSERT(7), INSERT(161).
10
1) 2) 3) 4)
MEMBER(x): Spoˇc´ıt´ame i := h(x), if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then goto 4) endif while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then x ∈ S else x ∈ / S endif
DELETE(x): 1) Spoˇc´ıt´ame i := h(x), 2) if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then stop endif 3) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 4) if i.key = x then (i.previous).next := i.next, (i.next).previous := i.previous, i.key := i.next := i.previous :=pr´azdn´e endif Insert(x): 1) Spoˇc´ıt´ame i := h(x), 2) if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then goto 5) endif 3) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 4) if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı else nechˇt j je voln´ y ˇr´adek tabulky i.next := j, j.key := x, j.previous := i, stop endif 5) if i.key =pr´azdn´e then i.key := x else if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı ˇ else necht j je voln´ y ˇr´adek tabulky j.key := i.key, j.previous := i.previous, j.next := i.next, (j.previous).next := j, (j.next).previous := j, i.key := x, i.next := i.previous :=pr´ azdn´e endif endif V pˇr´ıkladu provedeme Insert(28), nov´ y ˇr´adek je 4. ˇr´adek – v´ ysledn´a haˇsovac´ı tabulka ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
1
9
73 11 161 53 7 28 141
6 5
4
previous
9 4 3
1
Oˇcek´avan´ y poˇcet porovn´an´ı je stejn´ y jako pro haˇsov´an´ı se separuj´ıc´ımi ˇretˇezci: n−1 u ´spˇeˇsn´e vyhled´av´an´ı: 2m + 1 ≈ 1 + α2 n 1 n ) +m ≈ e−α + α ne´ uspˇeˇsn´e vyhled´av´an´ı: (1 − m n kde m – velikost tabulky, n – velikost S tj. poˇcet uloˇzen´ ych prvk˚ u, α = m – faktor zaplnˇen´ı
11
Haˇsov´ an´ı s dvˇema ukazateli Nev´ yhoda haˇsov´an´ı s pˇrem´ısˇtov´an´ım krok 5) v operaci INSERT. Vyˇzaduje v´ıce ˇcasu – operace s pˇrem´ıstˇen´ım poloˇzky. Dalˇs´ı implementace haˇsov´an´ı se separuj´ıc´ımi ˇretˇezci. Poloˇzky pro pr´aci s tabulkou – next, begin Poloˇzka next – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı u ´daj begin – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı prvn´ı prvek ˇretˇezce tohoto m´ısta Stejn´a data jako v minul´em pˇr´ıpadˇe Haˇsovac´ı tabulka: ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
begin
1
9
1
73
7
3
161 7 53 11 141
6 5 8
Tabulka vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(141), INSERT(11), INSERT(73), INSERT(53), INSERT(7), INSERT(161). MEMBER(x): 1) Spoˇc´ıt´ame i := h(x), 2) if i.begin =pr´azdn´e then goto 4) else i := i.begin endif 3) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 4) if i.key = x then x ∈ S else x ∈ / S endif DELETE(x): 1) Spoˇc´ıt´ame i := h(x), 2) if i.begin =pr´azdn´e then stop else j := i, i := i.begin endif 3) while i.next 6=pr´azdn´e a i.key 6= x do j := i, i := i.next enddo 4) if i.key = x then if i = j.begin then j.begin := i.key :=pr´azdn´e else j.next := i.next, i.key := i.next :=pr´azdn´e endif endif
12
Insert(x): 1) Spoˇc´ıt´ame i := h(x), 2) if i.begin =pr´azdn´e then goto 5) endif 3) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 4) if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı else nechˇt j je voln´ y ˇr´adek tabulky i.next := j, j.key := x, stop endif 5) if i.key =pr´azdn´e then i.key := x, i.begin := i else if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı ˇ else necht j je voln´ y ˇr´adek tabulky j.key = x, i.begin := j endif endif V pˇr´ıkladu provedeme Insert(28), nov´ y ˇr´adek je 4. ˇr´adek – v´ ysledn´a haˇsovac´ı tabulka ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
1
9
1
73 28 161 7 53 11 141
7
3
5 8
begin
6 4
Algoritmus pˇri pr´aci s poloˇzkami je rychlejˇs´ı neˇz pˇri haˇsov´an´ı s pˇrem´ısˇtov´an´ım, ale zaˇc´ atek ˇretˇezce v jin´em m´ıstˇe tabulky pˇrid´av´a jeden test. V´ ysledek bez odvozov´an´ı: Oˇcek´avan´ y poˇcet porovn´an´ı: α2 α u ´spˇeˇsn´ y pˇr´ıpad: 1 + (n−1)(n−2) + n−1 6m2 2m ≈ 1 + 6 + 2 2 ne´ uspˇeˇsn´ y pˇr´ıpad: ≈ 1 + α2 + α + e−α (2 + α) − 2
Sr˚ ustaj´ıc´ı haˇsov´ an´ı Sr˚ ustaj´ıc´ı haˇsov´an´ı se dˇel´ı podle pr´ace s pamˇet´ı na standardn´ı a na sr˚ ustaj´ıc´ı haˇsov´ an´ı s pomocnou pamˇet´ı (budeme naz´ yvat jen sr˚ ustaj´ıc´ı haˇsov´an´ı) a podle zp˚ usobu pˇrid´ av´ an´ı dalˇs´ıho prvku. Pop´ıˇseme metody: Standardn´ı sr˚ ustaj´ıc´ı haˇsov´an´ı: LISCH, EISCH Sr˚ ustaj´ıc´ı haˇsov´an´ı: LICH, VICH, EICH Vˇsechny metody pro pr´aci s tabulkou pouˇz´ıvaj´ı jen poloˇzku next – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı poloˇzku.
13
Z´akladn´ı idea: ˇretˇezec zaˇc´ın´a na sv´em m´ıstˇe (jako v haˇsov´an´ı s pˇrem´ısˇtovan´ım), pokud uˇz tam byl uloˇzen nˇejak´ yu ´daj, pak ˇretˇezec tohoto u ´daje sroste s ˇretˇezcem zaˇc´ınaj´ıc´ım na tomto ˇr´adku.
Metody EISCH a LISCH EISCH – early-insertion standard coalesced hashing LISCH – late-insertion standard coalesced hashing Organizace tabulky je stejn´a jako v pˇredchoz´ıch pˇr´ıpadech. Z´akladn´ı idee: LISCH pˇrid´av´a nov´ y prvek na konec ˇretˇezce, EISCH pˇrid´av´a nov´ y prvek x do ˇretˇezce za ˇr´adlem h(x). Pˇr´ıklad: U = {1, 2, . . . , 1000}, h(x) = x mod 10 mnoˇzina S = {1, 7, 11, 53, 73, 141, 171} je uloˇzena v haˇsovac´ı tabulce ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
1
9
73
6
7 53 161 11 141
5 7 8
Tabulka pro metodu LISCH vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(141), INSERT(11), INSERT(73), INSERT(53), INSERT(161), INSERT(7). Pro metodu EISCH tabulka vznikla n´asleduj´ıc´ı posloupnost´ı operac´ı: INSERT(1), INSERT(161), INSERT(11), INSERT(73), INSERT(53), INSERT(7), INSERT(141). Provedeme INSERT(28), pˇrid´av´ame do ˇcvrt´eho r´adku v´ ysledn´a tabulka vlevo je pro metodu LISCH vpravo pro metodu EISCH. ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
1
9
73 28 7 53 161 11 141
6 4 5 7 8
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key
next
1
9
73 28 7 53 161 11 141
6 7
5 4 8
14
Algoritmus operace MEMBER je pro obˇe metody stejn´ y. MEMBER(x): 1) Spoˇc´ıt´ame i := h(x), 2) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 3) if i.key = x then x ∈ S else x ∈ / S endif Metoda LISCH – INSERT(x): 1) Spoˇc´ıt´ame i := h(x), 2) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 3) if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı else nechˇt j je pr´azdn´ y ˇr´adek j.key := x, i.next := j endif Metoda EISCH – Insert(x): 1) Spoˇc´ıt´ame k := i := h(x), 2) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 3) if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı ˇ else necht j je voln´ y ˇr´adek tabulky j.next := k.next, k.next := j, j.key := x endif Efektivn´ı operace DELETE nen´ı zn´am´a, ale i primitivn´ı algoritmy pro operaci DELETE maj´ı rozumnou oˇcek´avanou ˇcasovou sloˇzitost. Anal´ yza sloˇzitosti tˇechto algoritm˚ u. Popis situace: Uloˇzena mnoˇzina S = {s1 , s2 , . . . , sn } do tabulky velikosti m, je d´an prvek sn+1 a m´ame zjistit, zda sn+1 ∈ S. Oznaˇcme ai = h(si ) pro i = 1, 2, . . . , n + 1, kde h je pouˇzit´a haˇsovac´ı funkce. Pˇredpoklad: vˇsechny posloupnosti a1 , a2 , . . . , an+1 jsou stejnˇ e pravdˇ epodobn´ e.
Ne´ uspˇeˇsn´e vyhled´ av´an´ı Oznaˇcen´ı: C(a1 , a2 , . . . , an ; an+1 ) oznaˇcuje poˇcet test˚ u pˇri ne´ uspˇeˇsn´em hled´an´ı adresy an+1 v S. Plat´ı: oˇcek´avan´ y poˇcet test˚ u pˇri neuspˇeˇsn´em vyhled´av´ an´ı v mnoˇzinˇe S je P
C(a1 , a2 , . . . , an ; an+1 ) , mn+1
kde se sˇc´ıt´a pˇres vˇsechny posloupnosti a1 , a2 , . . . , an – a tˇech je mn+1 . ˇ ezec d´elky l v mnoˇzinˇe S je maxim´aln´ı posloupnost adres (b1 , b2 , . . . , bl ) takov´ Retˇ a, ˇze bi .next = bi+1 pro i = 1, 2, . . . , l−1. Kdyˇz adresa an+1 je i-t´ y prvek v ˇretˇezci, pak poˇcet test˚ u P l ˇ je l − i + 1. Retˇezec d´elky l pˇrispˇel k souˇctu C(a1 , a2 , . . . , an ; an+1 ) 1 + 2 + · · · + l = l + 2 testy.
15
cn (l) – poˇcet vˇsech ˇretˇezc˚ u d´elky l ve vˇsech reprezentac´ıch n-prvkov´ ych mnoˇzin (ztotoˇzn ˇujeme dvˇe mnoˇziny, kter´e mˇely stejnou posloupnost adres pˇri ukl´adan´ı prvk˚ u), pak X
C(a1 , a2 , . . . , an ; an+1 ) =cn (0) +
n X l=1
= cn (0) +
l )cn (l) (l + 2
n X
lcn (l) +
l=1
n X l l=1
2
cn (l).
kde cn (0) je poˇcet pr´azdn´ ych ˇr´adk˚ u ve vˇsech reprezentac´ıch. Reprezentace S m´a m − n pr´azdn´ ych ˇr´adk˚ u, vˇsech posloupnost´ı n-adres je mn , proto cn (0) = (m − n)mn . Pn
lcn (l) je celkov´a d´elka vˇsech ˇretˇezc˚ u ve vˇsech tabulk´ach reprezentuj´ıc´ıch vˇsechny nprvkov´e mnoˇziny a proto n X lcn (l) = nmn . l=1
l=1
Pn l Spoˇc´ıt´ame Sn = ı vztah pro cn (l). Pˇrid´av´ame prvek s l=1 2 cn (l). Nejprve rekurentn´ adresou an+1 . Pak ˇretˇezec d´elky l v reprezentaci S z˚ ustal stejn´ y, kdyˇz adresa an+1 neleˇzela v tomto ˇretˇezci, v opaˇcn´em pˇr´ıpadˇe se d´elka ˇretˇezce zvˇetˇsila na l + 1. Proto pˇrid´an´ı jednoho prvku vytvoˇrilo z ˇretˇezce d´elky l celkem m−l ˇretˇezc˚ u d´elky a l ˇretˇezc˚ u d´elky l+1. Vysˇc´ıt´ an´ım pˇres vˇsechny n-prvkov´e posloupnosti adres), dost´av´ame cn+1 (l) = (m − l)cn (l) + (l − 1)cn (l − 1). Odtud n n X X l l l (l − 1)cn−1 (l − 1) = (m − l)cn−1 (l) + cn (l) = Sn = 2 2 2 l=1 l=1 n−1 n X l + 1 X n l (m − n)cn−1 (n)+ lcn−1 (l) = (m − l)cn−1 (l) + 2 2 2 l=0 l=1 n−1 X l 1 l+1 0cn−1 (0) = l)cn−1 (l) + (m − l) + ( 2 2 2 l=1 n−1 n−1 X X l (m + 2)cn−1 (l) + lcn−1 (l) 2 l=1
l=1 n−1
= (m + 2)Sn−1 + (n − 1)m
,
16
kde jsme pouˇzili, ˇze cn−1 (n) = 0, a identitu 1 l+1 l = (l2 m − lm − l3 + l2 + l3 + l2 ) = +l (m − l) 2 2 2 1 2 1 (l m − lm + 2l2 ) = (l2 m − lm + 2(l2 − l)) + l = 2 2 l + l. (m + 2) 2 Rekurence pro Sn d´av´a Sn =(m + 2)Sn−1 + (n − 1)mn−1 = (m + 2)2 Sn−2 + (m + 2)(n − 2)mn−2 + (n − 1)mn−1 = (m + 2)3 Sn−3 + (m + 2)2 (n − 3)mn−3 + (m + 2)(n − 2)mn−2 + (n − 1)mn−1 = (m + 2)
n−1
S0 +
n−1 X
(m + 2)i (n − 1 − i)mn−1−i =
i=0
(m + 2)n−1 = (m + 2)
n−1 X
(n − 1 − i)
i=0 n−1 X n−1
i
i=1
m n−1−i m+2
m i , m+2
kde jsme ˇze S0 = 0. Spoˇc´ıt´ame souˇcet Tcn = Pnvyuˇzili, n i+1 cTc = i=1 ic plyne (c − 1)Tcn =cTcn − Tcn = ncn+1 + ncn+1 −
n+1 X
(i − 1)ci −
−ci − c =
ci = ncn+1 −
i=1
i=1
ici pro n = 1, 2, . . . a c 6= 1. Z
ici = ncn+1 +
i=1
i=2 n X
i=2 n X
n X
Pn
n X i=2
((i − 1)ci − ici ) − c =
cn+1 − c ncn+2 − (n + 1)cn+1 + c = . c−1 c−1
Tedy plat´ı Tcn = m m+2
ncn+2 − (n + 1)cn+1 + c . (c − 1)2
6= 1, dost´av´ame, ˇze n+1 n m m m (n − 1) m+2 − n m+2 + m+2 n−1 Sn =(m + 2) = 2 m m+2 − 1 1 m m n m n+1 −n + = (m + 2)n+1 (n − 1) 4 m+2 m+2 m+2 1 1 (n − 1)mn+1 − n(m + 2)mn + m(m + 2)n = m(m + 2)n − mn+1 − 2nmn . 4 4
Protoˇze
17
Oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je (m − n)mn + nmn +
1 4
m(m + 2)n − mn+1 − 2nmn = mn+1 mn+1 + 41 m(m + 2)n − mn+1 − 2nmn = mn+1 2 1 1 2n ∼ 1 + (e2α − 1 − 2α), 1 + (1 + )n − 1 − 4 m m 4 Tento odhad je stejn´ y pro obˇe metody – LISCH i EISCH, protoˇze maj´ı stejn´e posloupnosti adres (liˇs´ı se jen poˇrad´ım prvk˚ u v jednotliv´ ych ˇretˇezc´ıch).
´ eˇsn´ Uspˇ y pˇr´ıpad Oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı v modelu LISCH spoˇc´ıt´ame stejnou metodou jako pro haˇsov´an´ı se separuj´ıc´ımi ˇretˇezci. Pro vyhled´an´ı prvku sn+1 ∈ S je poˇcet test˚ u roven 1+poˇcet porovn´an´ı kl´ıˇc˚ u pˇri operaci INSERT(sn+1 ). Kdyˇz sn+1 je vloˇzen na m´ısto h(sn+1 ), nebyl porovn´av´an ˇz´adn´ y kl´ıˇc a test bude 1, kdyˇz h(sn+1 ) byl na na i-t´em m´ıstˇe v ˇ ˇretˇezci d´elky l, pak bylo pˇri operaci INSERT(sn+1 ) pouˇzito l − i + 1 porovn´an´ı kl´ıˇc˚ u a ted se pouˇzije l − i + 2 test˚ u. Oˇcek´avan´ y poˇcet porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı je n 1 1 l 1 X )cn (l)) = n+1 (nmn + m(m + 2)n − mn+1 − 2nmn ) = ( (l + n+1 2 m m 4 l=1
1 2 2n (1 + )n − 1 + . 4 m m
Tedy oˇcek´avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhled´ av´an´ı v n-prvkov´e mnoˇzinˇe je podle pˇredchoz´ı anal´ yzy roven 1+ n-tina souˇctu oˇcek´avan´eho poˇctu porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı v i-prvkov´e mnoˇzinˇe, kde i prob´ıh´a ˇc´ısla 0, 1, . . . , n − 1. Podle pˇredchoz´ıch v´ ysledk˚ u je hledan´ y souˇcet n−1 n 2 n X 1 ) −1 n 2 i 2i 1 (1 + m 2 (1 + ) − 1 + = − + = 2 4 m m 4 1+ m 4 2m −1 i=0 m 2 2n n2 − n (1 + )n − 1 − + . 8 m m 4m
Tedy oˇcek´avan´ y poˇcet test˚ uvu ´spˇeˇsn´em pˇr´ıpadˇe pro n-prvkovou mnoˇzinu je 1+
m 2 2n n − 1 1 2α α (1 + )n − 1 − + ∼1+ (e − 1 − 2α) + . 8n m m 4m 8α 4
Pro metodu EISCH je oˇcek´av´an´ y poˇcet test˚ uvu ´spˇeˇsn´em pˇr´ıpadˇe 1 1 m (1 + )n − 1 ∼ (eα − 1). n m α
1 ). Mus´ı se pouˇz´ıt sloˇzitˇejˇs´ı metoda. Chyba aproximace pro tyto odhady je O( m
18
Pˇredn´ aˇska 3 Metody LICH, EICH, VICH LICH – late-insertion coalesced hashing EICH – early-insertion coalesced hashing VICH – varied-insertion coalesced hashing Z´akladn´ı idea: Metody pouˇz´ıvaj´ı pomocnou pamˇeˇt. Tabulka je rozdˇelen´a na adresovac´ı ˇc´ ast ˇ a na pomocnou pamˇet, kter´a nen´ı dostupn´a pomoc´ı haˇsovac´ı funkce, ale pom´ah´a pˇri ˇreˇsen´ı koliz´ı. Metody se liˇs´ı operac´ı INSERT. Vˇsechny metody pˇri kolizi nejprve pouˇzij´ı ˇr´ adek tabulky z pomocn´e ˇc´asti a teprve, kdyˇz je pomocn´a ˇc´ast zaplnˇena, pouˇz´ıvaj´ı adresovac´ı ˇc´ ast. Metoda LICH: pˇri INSERTu vkl´ad´a prvek vˇzdy na konec ˇretˇezce. Metoda EICH: pˇri INSERTu vkl´ad´a prvek x do ˇretˇezce vˇzdy na m´ısto hned za ˇr´ adkem h(x). Metoda VICH: Pˇri INSERTu, kdyˇz nov´ y ˇr´adek je z pomocn´e ˇc´asti, tak je vloˇzen s nov´ ym prvkem na konec ˇretˇezce, kdyˇz je pomocn´a ˇc´ast pamˇeti vyˇcerp´ana, tak se ˇr´adek s nov´ ym prvkem vkl´ad´a do ˇretˇezce za posledn´ı ˇr´adek z pomocn´e ˇc´asti tabulky. Idea: pomocn´ a ˇc´ast m´a zabr´anit rychl´emu sr˚ ust´an´ı ˇretˇezc˚ u. Tyto metody nepodporuj´ı pˇrirozen´e efektivn´ı algoritmy pro operaci DELETE. Pˇr´ıklad: U = {1, 2, . . . , 1000}, h(x) = x mod 10, S = {1, 7, 11, 53, 73, 141, 161}. Tabulka m´a 12 ˇr´adk˚ u a m´a tvar ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key
next
1
10
73
11
7 161 11
5 7
141 53
8
Haˇsovac´ı tabulka vznikla posloupnostmi operac´ı: Pro metodu LICH: INSERT(1), INSERT(73), INSERT(141), INSERT(53), INSERT(11), INSERT(161), INSERT(7).
19
Pro metodu EICH: INSERT(1), INSERT(73), INSERT(161), INSERT(53), INSERT(11), INSERT(141), INSERT(7) ale nedodrˇzovalo se, ˇze se nejdˇr´ıv d´avaj´ı ˇr´adky z pomocn´e ˇc´asti. Pˇri dodrˇzov´an´ı tohoto pravidla tabulka nem˚ uˇze vzniknout. Pro metodu VICH: INSERT(1), INSERT(73), INSERT(141), INSERT(53), INSERT(161), INSERT(11), INSERT(7). Aplikujeme operace INSERT(28) 2a INSERT(31), nov´e ˇr´adky budou ˇr´adky ˇc´ıslo 4 a 9. Tabulka vytvoˇren´a pomoc´ı metody LICH je na lev´e stranˇe, metodou VICH je v prostˇredku a metodou EICH je na prav´e stranˇe. ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key
next
1
10
73 28 7
11 9 4
161 11 31 141 53
5 7 8
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key
next
1
10
73 28 7
11 7
161 11 31 141 53
5 4 8 9
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9) P(10) P(11)
key
next
1
9
73 28 7
11 7
161 11 31 141 53
5 4 10 8
Algoritmus operace MEMBER je pro tyto metody stejn´ y jako pro LISCH a EISCH MEMBER(x): 1) Spoˇc´ıt´ame i := h(x), 2) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 3) if i.key = x then x ∈ S else x ∈ / S endif Algoritmus operace INSERT je pro metodu LICH stejn´ y jako pro metodu LISCH a pro metodu EICH je stejn´ y jako pro metodu EISCH s jedin´ ym doplˇ nkem, pokud existuje pr´ azdn´ y ˇr´adek v pomocn´e ˇc´asti, tak j-t´ y ˇr´adek je z pomocn´e ˇc´asti. Tento pˇredpoklad je i pro algoritmus INSERT pro metodu VICH.
20
Metoda LICH – INSERT(x): 1) Spoˇc´ıt´ame i := h(x), 2) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 3) if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı else nechˇt j je pr´azdn´ y ˇr´adek, j.key := x, i.next := j endif Metoda EICH – Insert(x): 1) Spoˇc´ıt´ame k := i := h(x), 2) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo 3) if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı ˇ else necht j je voln´ y ˇr´adek tabulky j.next := k.next, k.next := j, j.key := x endif Metoda VICH – INSERT(x) 1) Spoˇc´ıt´ame k := i := h(x); 2) while i.next 6=pr´azdn´e a i.key 6= x do if i ≥ m (je v pomocn´e ˇc´asti) a i.next < m (nen´ı v pomocn´e ˇc´asti) then k := i endif i := i.next enddo 3) if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek then pˇreplnˇen´ı else if j ≥ m (tj. j je v pomocn´e ˇc´asti) then i.next := j else j.next:=k.next, k.next:=j endif j.key := x endif endif Sloˇzitost algoritm˚ u pro sr˚ ustaj´ıc´ı haˇsov´an´ı. Znaˇcen´ı: n – velikost uloˇzen´e mnoˇziny, m – velikost adresovac´ı ˇc´asti tabulky, m′ – velikost tabulky, α = mn′ – faktor zaplnˇen´ı, m ı faktor, β=m ′ – adresovac´ λ – jedin´e nez´aporn´e ˇreˇsen´ı rovnice e−λ + λ =
1 β.
21
Oˇcek´avan´ y poˇcet test˚ u pro metodu LICH α ne´ uspˇeˇsn´ y pˇr´ıpad: e− β + α z α ≤ λβ, β , kdyˇ α
+ 14 (e2( β −λ) − 1)(3 − β2 + 2λ) − 21 ( α − λ), kdyˇz α ≥ λβ β α u ´spˇeˇsn´ y pˇr´ıpad: 1 + 2β , kdyˇz α ≤ λβ, 1 β
1+
α β (e2( β −λ) 8α
− 1 − 2( α − λ))(3 − β
2 β
+ 2λ) + 41 ( α + λ) + λ4 (1 − β
λβ ), α
kdyˇz α ≥ λβ.
Oˇcek´avan´ y poˇcet test˚ u pro metodu EICH −α z α ≤ λβ, ne´ uspˇeˇsn´ y pˇr´ıpad: e β + α β , kdyˇ α
α
1 e2( β −λ) ( 43 + λ2 − 2β ) + e β −λ ( β1 − 1) + ( 14 − α u ´spˇeˇsn´ y pˇr´ıpad: 1 + 2β , kdyˇz α ≤ λβ,
1+
α 2β
α
α 2β
β +α ((e β −λ − 1)(1 + λ) − ( α − λ))(1 + β
+ λ 2
1 2β ),
+
kdyˇz α ≥ λβ
α )), 2β
kdyˇz α ≥ λβ.
Oˇcek´avan´ y poˇcet test˚ u pro metodu VICH −α ne´ uspˇeˇsn´ y pˇr´ıpad: e β + α , kdyˇz α ≤ λβ, β α
+ 14 (e2( β −λ) − 1)(3 − β2 + 2λ) − 21 ( α z α ≥ λβ β − λ), kdyˇ α , kdyˇz α ≤ λβ, u ´spˇeˇsn´ y pˇr´ıpad: 1 + 2β 1 β
α
α
β 1−β α α λ α β −λ + 1), kdyˇ 1 + 2β +α ((e β −λ − 1)(1 + λ) − ( α z α ≥ λβ. β − λ))(1 + 2 + 2β )) + α ( β − λ − e ′
Chyba aproximace pro tyto odhady je O(log √mm′ ).
Haˇsov´ an´ı s line´arn´ım pˇrid´ av´an´ım Tabulka m´a jedinou poloˇzku – key Z´akladn´ı idea: Pˇri operaci INSERT(x) vloˇz´ıme x na ˇr´adek h(x), kdyˇz je pr´azdn´ y, v opaˇcn´em pˇr´ıpadˇe nalezneme nejmenˇs´ı i takov´e, ˇze ˇr´adek h(x) + i mod m je pr´azdn´ y, a tam vloˇz´ıme x. Koment´aˇr: Metoda vyˇzaduje minim´aln´ı velikost pamˇeti. V tabulce se vytv´aˇrej´ı shluky pouˇzit´ ych ˇr´adk˚ u, a proto pˇri velk´em zaplnˇen´ı metoda vyˇzaduje velk´e mnoˇzstv´ı ˇcasu. Metoda nepodporuje efektivn´ı implementaci operace DELETE. Pro zjiˇstˇen´ı pˇreplnˇen´ı je vhodn´e m´ıt uloˇzen poˇcet vyplnˇen´ ych ˇr´adk˚ u a testovat, zda nevyˇsetˇrujeme podruh´e prvn´ı vyˇsetˇrovan´ y ˇr´adek.
22
MEMBER(x): 1) Spoˇc´ıt´ame i := h(x); 2) if poˇcet zaplnˇen´ ych ˇr´adk˚ u je menˇs´ı neˇz m then while i.key 6=pr´azdn´ y a i.key 6= x do i := i + 1 mod m enddo else j := i, while i 6= j a i.key 6= x do i := i + 1 mod m enddo endif 3) if i.key = x then x ∈ S else x ∈ / S endif INSERT(x): 1) Spoˇc´ıt´ame i := h(x); 2) if poˇcet zaplnˇen´ ych ˇr´adk˚ u je menˇs´ı neˇz m then while i.key 6=pr´azdn´ y a i.key 6= x do i := i + 1 mod m enddo else j := i, while i 6= j a i.key 6= x do i := i + 1 mod m enddo if i = j then pˇreplnˇen´ı, stop endif endif 3) if i.key =pr´azdn´ y then i.key := x, poˇcet zaplnˇen´ ych ˇr´adk˚ u zvˇetˇsit o 1 endif Pˇr´ıklad: M´ame universum U = {1, 2, . . . , 1000}, haˇsovac´ı funkci h(x) = x mod 10 a mnoˇzinu S = {1, 7, 11, 53, 73, 141, 161}. Tato mnoˇzina je uloˇzena v lev´e tabulce. Provedeme operaci INSERT(35). V´ ysledek je uloˇzen v prav´e tabulce. ˇr´adek key P(0) P(1) 1 P(2) 11 P(3) 73 P(4) 141 P(5) 161 P(6) 53 P(7) 7 P(8) P(9)
ˇr´adek key P(0) P(1) 1 P(2) 11 P(3) 73 P(4) 141 P(5) 161 P(6) 53 P(7) 7 P(8) 35 P(9)
Tabulka vznikla posloupnost´ı operac´ı: INSERT(1), INSERT(11), INSERT(73), INSERT(141), INSERT(161), INSERT(53), INSERT(7). Na z´avˇer uvedeme sloˇzitost t´eto metody. Oˇcek´avan´ y poˇcet test˚ u: 2 1 1 Ne´ uspˇeˇsn´ y pˇr´ıpad: ≈ 2 (1 + 1−α ), 1 ´ eˇsn´ Uspˇ y pˇr´ıpad: ≈ 12 (1 + 1−α ).
23
Dvojit´e haˇsov´ an´ı Z´akladn´ı nev´ yhoda pˇredchoz´ı metody je zp˚ usob v´ ybˇeru dalˇs´ıho ˇr´adku. Je velmi determinov´an a d˚ usledkem je vznik shluku ˇr´adk˚ u, kter´ y vede k v´ yrazn´emu zpomalen´ı metody. Idea jak odstranit tuto nev´ yhodu: Pouˇzijeme dvˇe haˇsovac´ı funkce h1 a h2 a pˇri operaci INSERT(x) nalezneme nejmenˇs´ı i = 0, 1, . . . takov´e, ˇze (h1 (x)+ih2 (x)) mod m je pr´ azdn´ y ˇr´adek, a tam uloˇz´ıme prvek x. Tabulka m´a jedinou poloˇzku – key. Poˇzadavky na korektnost: Pro kaˇzd´e x mus´ı b´ yt h2 (x) a m nesoudˇeln´e (jinak prvek x nem˚ uˇze b´ yt uloˇzen na libovoln´em ˇr´adku tabulky). m−1 Pˇredpoklad pro v´ ypoˇcet oˇcekavan´eho poˇctu test˚ u: posloupnost {h1 (x) + ih2 (x)}i=0 je n´ahodn´a permutace mnoˇziny ˇr´adk˚ u tabulky. Nev´ yhoda: Uveden´a metoda nepodporuje operaci DELETE. Pˇreplnˇen´ı se ˇreˇs´ı stejn´ ym zp˚ usobem jako v metodˇe haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım. Pozn´amka: Metoda haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım je speci´aln´ı pˇr´ıpad dvojit´eho haˇsov´ an´ı, kde h2 (x) = 1 pro kaˇzd´e x ∈ U . MEMBER(x): 1) Spoˇc´ıt´ame i := h1 (x) a h2 (x); 2) if poˇcet zaplnˇen´ ych ˇr´adk˚ u je menˇs´ı neˇz m then while i.key 6=pr´azdn´ y a i.key 6= x do i := i + h2 (x) mod m enddo else j := i, while i 6= j a i.key 6= x do i := i + h2 (x) mod m enddo endif 3) if i.key = x then x ∈ S else x ∈ / S endif INSERT(x): 1) Spoˇc´ıt´ame i := h1 (x) a h2 (x); 2) if poˇcet zaplnˇen´ ych ˇr´adk˚ u je menˇs´ı neˇz m then while i.key 6=pr´azdn´ y a i.key 6= x do i := i + h2 (x) mod m enddo else j := i, while i 6= j a i.key 6= x do i := i + h2 (x) mod m enddo if i = j then pˇreplnˇen´ı, stop endif endif 3) if i.key =pr´azdn´ y then i.key := x, poˇcet zaplnˇen´ ych ˇr´adk˚ u zvˇetˇsit o 1 endif Pˇr´ıklad: Mˇejme universum U = {1, 2, . . . , 1000}. Haˇsovac´ı funkce jsou h1 (x) = x mod 10 a h2 (x) = 1 + 2(x mod 4), kdyˇz x mod 4 ∈ {0, 1}, h2 (x) = 3 + 2(x mod 4), kdyˇz x mod 4 ∈ {2, 3}. Mnoˇzina je S = {1, 7, 11, 53, 73, 141, 161}. Tato mnoˇzina je uloˇzena v lev´e tabulce. Aplikujme INSERT(35). Pak h2 (35) = 9, tedy posloupnost pro x = 35 je (5, 4, 3, 2, 1, 0, 9, 8, 7, 6). V´ ysledek je uloˇzen v prav´e tabulce, kter´a vznikla posloupnost´ı operac´ı:
24
INSERRT(1), INSERT(73), INSERT(53), INSERT(141), INSERT(161), INSERT(11), INSERT(7). ˇr´adek key P(0) 11 P(1) 1 P(2) P(3) 73 P(4) 141 P(5) 7 P(6) 53 P(7) 161 P(8) P(9)
ˇr´adek key P(0) 11 P(1) 1 P(2) 35 P(3) 73 P(4) 141 P(5) 7 P(6) 53 P(7) 161 P(8) P(9)
Anal´ yza vyhled´av´an´ı v dvojit´em haˇsov´an´ı. Ne´ uspˇeˇsn´ y pˇr´ıpad: Znaˇcen´ı: qi (n, m) – kdyˇz tabulka m´a m ˇr´adk˚ u a je v n´ı obsazeno n ˇr´adk˚ u, tak je to pravdˇepodobnost, ˇze za pro kaˇzd´e j = 0, 1, . . . , i − 1 je ˇr´adek h1 (x) + jh2 (x) obsazen. n(n−1) n Pak q0 (n, m) = 1, q1 (n, m) = m , q2 (n, m) = m(m−1) a obecnˇe Qi−1
j=0 (n
qi (n, m) = Qi−1
− j)
j=0 (m − j)
.
C(n, m) – oˇcek´avan´ y poˇcet test˚ u v ne´ uspˇeˇsn´em vyhled´av´ an´ı, kdyˇz tabulka m´a m ˇr´adk˚ uan jich je obsazeno. Podle definice plat´ı: C(n, m) =
n X
(j + 1)(qj (n, m) − qj+1 (n, m)) =
qj (n, m).
j=0
j=0
D´ale plat´ı C(0, m) = 1 pro kaˇzd´e m a qj (n, m) = a m > 1. Odtud
n X
n m qj−1 (n
− 1, m − 1) pro vˇsechna j, n > 0
n X
n−1 n X n C(n, m) = qj (n, m) = 1 + ( qj (n − 1, m − 1) = 1 + C(n − 1, m − 1). m j=0 m j=0 m+1 m+1 . Kdyˇz n = 0, pak C(0, m) = m−0+1 = 1 a tvrzen´ı Indukc´ı uk´aˇzeme, ˇze C(n, m) = m−n+1 plat´ı. Pˇredpokl´ad´ame, ˇze plat´ı pro n − 1 ≥ 0 a pro kaˇzd´e m ≥ n − 1 a dok´aˇzeme tvrzen´ı pro n. Plat´ı
n n((m − 1) + 1) C(n − 1, m − 1) = 1 + = m m((m − 1) − (n − 1) + 1) m+1 n = . 1+ m−n+1 m−n+1
C(n, m) =1 +
25
Oˇcek´avan´ y poˇcet dotaz˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı v tabulce s m ˇr´adky, z nichˇz n je m+1 . obsazeno, je m−n+1 ´ eˇsn´ Uspˇ y pˇr´ıpad. Pouˇzijeme metodu ze separuj´ıc´ıch ˇretˇezc˚ u. Poˇcet dotaz˚ u pˇri vyhled´av´an´ı x pro x ∈ S je stejn´ y jako byl poˇcet dotaz˚ u pˇri vkl´ad´an´ı x do tabulky. Tedy oˇcek´avan´ y poˇcet dotaz˚ u pˇri u ´spˇeˇsn´em vyhled´av´an´ı v tabulce s m ˇr´adky, z nichˇz n je obsazeno, je n−1 n−1 m+1 m−n+1 X 1 1X 1 X m+1 m+1 X 1 C(i, m) = ≈ = − n i=0 n i=0 m − n + 1 n j j j=1 j=1
m+1 1 1 1 ln( ) ≈ ln( ). α m−n+1 α 1−α
N´asleduj´ıc´ı tabulka ukazuje tyto hodnoty v z´avislosti na velikosti α. hodnota α 1 α
1 1−α
1 ln( 1−α )
0.5 2 1.38
0.7 3.3 1.70
0.9 10 2.55
0.95 20 3.15
0.99 100 4.65
0.999 1000 6.9
Porovn´ an´ı efektivity Poˇrad´ı metod haˇsov´an´ı podle oˇcek´avan´eho poˇctu test˚ u: Ne´ uspˇeˇsn´e vyhled´av´an´ı: Haˇsov´an´ı s uspoˇr´adan´ ymi ˇretˇezci, Haˇsovan´ı s ˇretˇezci=Haˇsov´an´ı s pˇrem´ısˇtov´an´ım, Haˇsov´an´ı s dvˇema ukazateli, VICH=LICH, EICH, LISCH=EISCH, Dvojit´e haˇsov ´an´ı, Haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım. ´ eˇsn´e vyhled´av´an´ı: Uspˇ Haˇsov´an´ı s uspoˇr´adan´ ymi ˇretˇezci=Haˇsov´an´ı s ˇretˇezci=Haˇsov´an´ı s pˇrem´ısˇtov´an´ım, Haˇsov´an´ı s dvˇema ukazateli, VICH, LICH, EICH, EISCH, LISCH, Dvojit´e haˇsov´an´ı, Haˇsov´an´ı s line´arn´ım pˇrid´av´an´ım. Pozn´amka: Metoda VICH pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı pro α < 0.72 a pˇri u ´spˇeˇsn´em vyhled´av´an´ı pro α < 0.92 vyˇzaduje menˇs´ı oˇcek´avan´ y poˇcet test˚ u neˇz metoda s dvˇema ukazateli. Pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı m´a VICH a LICH stejnou sloˇzitost a je o 8% lepˇs´ı neˇz EICH a o 15% neˇz LISCH a EISCH, kter´e maj´ı stejnou sloˇzitost. Pˇri u ´spˇeˇsn´em vyhled´av´ an´ı je VICH nepatrnˇe lepˇs´ı neˇz LICH a EICH o 3% lepˇs´ı neˇz EISCH a o 7% lepˇs´ı neˇz LISCH.
26
Oˇcek´avan´ y poˇcet test˚ u pˇri u ´plnˇe zaplnˇen´e tabulce: Metoda s pˇrem´ısˇtov´an´ım: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.5, u ´spˇeˇsn´e vyhled´av´an´ı 1.4. Metoda s dvˇema ukazateli: u ´spˇeˇsn´e i ne´ uspˇeˇsn´e vyhled´av´an´ı 1.6. VICH: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.79, u ´spˇeˇsn´e vyhled´av´an´ı 1.67, LICH: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.79, u ´spˇeˇsn´e vyhled´av´an´ı 1.69, EICH: ne´ uspˇeˇsn´e vyhled´av´an´ı 1.93, u ´spˇeˇsn´e vyhled´av´an´ı 1.69, EISCH: ne´ uspˇeˇsn´e vyhled´av´an´ı 2.1, u ´spˇeˇsn´e vyhled´av´an´ı 1.72, LISCH: ne´ uspˇeˇsn´e vyhled´av´an´ı 2.1, u ´spˇeˇsn´e vyhled´av´an´ı 1.8. Metodu s line´arn´ım pˇrid´av´an´ım je dobr´e pouˇz´ıt jen pro α < 0.7, metodu s dvojit´ ym haˇsov´an´ım pro α < 0.9, pak ˇcas pro ne´ uspˇeˇsn´e vyhled´av´an´ı rychle nar˚ ust´a. m ri sr˚ ustaj´ıc´ım haˇsov´an´ı. Vliv β = m ′ pˇ Pˇri u ´spˇeˇsn´em vyhled´av´an´ı je optim´aln´ı hodnota β = 0.85, pˇri ne´ uspˇeˇsn´em vyhled´av´ an´ı je optim´aln´ı hodnota β = 0.78. V praxi se doporuˇcuje pouˇz´ıt hodnotu β = 0.86 (uveden´e v´ ysledky byly pro tuto hodnotu β).
Koment´aˇr: Metody se separuj´ıc´ımi ˇretˇezci a sr˚ ustaj´ıc´ı haˇsov´an´ı pouˇz´ıvaj´ı v´ıce pamˇeti (pˇri sr˚ ustaj´ıc´ım haˇsov´an´ı souˇcet adresovac´ı a pomocn´e ˇc´asti). Metoda s pˇrem´ısˇtov´an´ım a metoda dvojit´eho haˇsov´an´ı vyˇzaduji v´ıce ˇcasu – na pˇrem´ıstˇen´ı prvku a na v´ ypoˇcet druh´e haˇsovac´ı funkce.
Dalˇs´ı ot´azky
Jak nal´ezt voln´ y ˇr´adek. Za nejlepˇs´ı metodu se povaˇzuje m´ıt seznam (z´asobn´ık) voln´ ych ˇr´adk˚ u a z jeho kraje br´ at voln´ y ˇr´adek a po u ´spˇeˇsn´e operaci DELETE tam zase ˇr´adek vloˇzit (pozor pˇri operaci DELETE ve struktur´ach kter´e nepodporuj´ı DELETE). Jak ˇreˇsit pˇreplnˇen´ı. Standardn´ı model: D´ana z´akladn´ı velikost tabulky m a pracuje se s tabulkami s 2i m ˇr´ adky 1 pro vhodn´e i = 0, 1, . . . . Vhodn´e i znamen´a, ˇze faktor zaplnˇen´ı α je v intervalu < 4 , 1 > (s vyj´ımkou i = 0, kde se uvaˇzuje pouze horn´ı mez). Pˇri pˇrekroˇcen´ı meze se zvˇetˇs´ı nebo zmenˇs´ı i a vˇsechna data se pˇrehaˇsuj´ı do nov´e tabulky. V´ yhoda: Po pˇrehaˇsov´an´ı do nov´e tabulky, poˇcet operac´ı, kter´e vedou k nov´emu pˇrehaˇsov´ av´an´ı, je alespoˇ n polovina velikosti uloˇzen´e mnoˇziny. Praktick´e pouˇzit´ı: Nedrˇzet se striktnˇe mez´ı, pouˇz´ıvat mal´e tabulky pˇri pˇreplnˇen´ı a posunout velk´e pˇrehaˇsov´an´ı na dobu klidu (aby syst´em nenechal uˇzivatele v norm´aln´ı dobˇe ˇcekat). Jak ˇreˇsit DELETE v metod´ach, kter´e ho nepodporuj´ı. Pouˇz´ıt ideu tzv. ‘faleˇsn´eho DELETE’. Odstranit prvek, ale ˇr´adek neuvolnit (i v kl´ıˇci nechat nˇejakou hodnotu, kter´a bude znamenat, ˇze ˇr´adek je pr´azdn´ y, poloˇzky podporuj´ıc´ı pr´ aci s ˇ adek nebude v seznamu voln´ tabulkami nemˇenit). R´ ych ˇr´adk˚ u, ale operace INSERT, kdyˇz testuje tento ˇr´adek, tak tam m˚ uˇze vloˇzit nov´ y prvek. Kdyˇz je alespoˇ n polovina pouˇzit´ ych ˇr´adk˚ u takto blokov´ana, je vhodn´e celou strukturu pˇrehaˇsovat. Pravdˇepodobnostn´ı anal´ yzu tohoto modelu nezn´am.
Otevˇren´ y probl´em
Jak vyuˇz´ıt ideje z haˇsov´an´ı s uspoˇr´adan´ ymi ˇretˇezci pro ostatn´ı metody ˇreˇsen´ı koliz´ı (jmenovitˇe pro sr˚ ustaj´ıc´ı haˇsov´an´ı.
27
Pˇredn´ aˇska 4 Pˇredpoklady pro uvedenou anal´ yzu haˇsov´an´ı: 1) Haˇsovac´ı funkce se rychle spoˇc´ıt´a (v ˇcase O(1)) 2) Haˇsovac´ı funkce rovnomˇernˇe rozdˇeluje univerzum (to znamen´a, ˇze pro dvˇe r˚ uzn´e hodnoty −1 −1 i a j haˇsovac´ı funkce plat´ı −1 ≤ |h (i)| − |h (j)| ≤ 1); 3) Vstupn´ı data jsou rovnomˇernˇe rozdˇelen´a. Pˇredpoklad 1) je jasn´ y. Pˇredpoklad 2) – je v´ yhodn´e, kdyˇz rozdˇelen´ı univerza haˇsovac´ı funkc´ı kop´ıruje zn´am´e rozdˇelen´ı vstupn´ıch dat. Pouˇzilo se pˇri n´avrhu pˇrekladaˇce pro FORTRAN (Lum 1971). Porovn´ an´ı v´ ysledku: hodnota α experiment teorie
0.5 1.19 1.25
0.6 1.25 1.30
0.7 1.28 1.35
0.8 1.34 1.40
0.9 1.38 1.45
Pouˇzila se metoda separuj´ıc´ıch ˇretˇezc˚ u. Z´avˇer: Podm´ınky 1) a 2) m˚ uˇzeme splnit, kdyˇz zn´ame rozloˇzen´ı vstupn´ıch dat, m˚ uˇzeme dos´ahnout jeˇstˇe lepˇs´ıch v´ ysledk˚ u. Nev´ yhoda: Rozloˇzen´ı vstupn´ıch dat nem˚ uˇzeme ovlivnit a obvykle ho ani nezn´ame. Je re´aln´e, ˇze rozdˇelen´ı vstupn´ıch dat bude nevhodn´e pro pouˇzitou haˇsovac´ı funkci. D˚ usledek – na poˇc´atku 70. let se zaˇcalo ustupovat od haˇsov´an´ı.
Univerz´aln´ı haˇsov´ an´ı Tuto metodu navrhli Carter a Wegman (1977), aby obeˇsli poˇzadavek 3). To vedlo k nov´emu rozs´ahl´emu pouˇz´ıv´an´ı haˇsov´an´ı. Z´akladn´ı idea: M´ısto jedn´e funkce m´ame mnoˇzinu H funkc´ı z univerza do tabulky velikosti m takov´ ych, ˇze pro kaˇzdou mnoˇzinu S ⊆ U , |S| ≤ m se vˇetˇsina funkc´ı chov´a dobˇre v˚ uˇci S (tj. S splˇ nuje poˇzdavek 3)). Haˇsovac´ı funkci zvol´ıme n´ahodnˇe z H (s rovnomˇern´ ym rozdˇelen´ım) a haˇsujeme pomoc´ı takto zvolen´e funkce. Form´alnˇe: Nechˇt U je univerzum. Mnoˇzina funkc´ı H z univerza U do mnoˇziny {0, 1, . . . , m− 1} se naz´ yv´a c-univerz´aln´ı, (c je kladn´e re´aln´e ˇc´ıslo), kdyˇz ∀x, y ∈ U, x 6= y plat´ı |{f ∈ H | f (x) = f (y)}| ≤
c|H| . m
Probl´emy: existence c-univerz´aln´ıch syst´em˚ u, vlastnosti c-univerz´aln´ıch syst´em˚ u (zda splˇ nuj´ı poˇzadovan´e ideje).
Existence univerz´aln´ıch syst´em˚ u Univerzum U = {0, 1, . . . , N − 1} pro prvoˇc´ıslo N , H = {ha,b | a, b ∈ U }, kde ha,b (x) = ((ax + b) mod N ) mod m V´ yhoda: funkce z mnoˇziny H um´ıme rychle vyˇc´ıslit. Zvolme x, y ∈ U takov´a, ˇze x 6= y. Chceme nal´ezt a, b z U tak, ˇze ha,b (x) = ha,b (y).
28 N ⌉ − 1} tak, ˇze plat´ı Mus´ı existovat i ∈ {0, 1, . . . , m − 1} a r, s ∈ {0, 1, . . . , ⌈ m
(ax + b ≡ i + rm) mod N (ay + b ≡ i + sm) mod N Kdyˇz x, y, i, r a s jsou konstanty a a a b jsou promˇenn´e, je to syst´em line´arn´ıch rovnic v tˇelese Z/ mod N , kde Z jsou cel´a ˇc´ısla. Matice soustavy je
x 1 y 1
a je regul´arn´ı, protoˇze x 6= y. Tedy existuje jedin´e ˇreˇsen´ı t´eto soustavy pro fixovan´a x, y, i, r a s. Pro dan´e x a y, i nab´ yv´a m hodnot, r a s nab´ yvaj´ı ⌈ N m ⌉ hodnot. 2 Z´avˇer: pro kaˇzd´ a x, y ∈ U takov´a, ˇze x 6= y, existuje m ⌈ N ⌉ dvojic a, b takov´ ych, ˇze m a, b ∈ U a ha,b (x) = ha,b (y). Velikost H. Mˇejme a, b, a′ , b′ ∈ U . Protoˇze ha,b (0) = b a ha′ ,b′ (0) = b′ , dost´av´ame, ˇze b 6= b′ implikuje ha,b 6= ha′ ,b′ . Kdyˇz b = b′ , pak ha,b (1) = a + b a ha′ ,b (1) = a′ + b. Tedy a 6= a′ implikuje ha,b 6= ha′ ,b . Odtud (a, b) 6= (a′ , b′ ) implikuje, ˇze ha,b 6= ha′ ,b′ . Proto |H| = N 2 . Vˇ eta. Mnoˇzina H je c-univerz´ aln´ı pro 2 ⌈N m⌉ c= . N 2 m
Skuteˇcnˇe, pro kaˇzd´e x, y ∈ U , x 6= y, je poˇcet a, b ∈ U takov´ ych, ˇze ha,b (x) = ha,b (y), roven 2 2 N 2 ⌈N ⌈ ⌉ ⌉ N 2 N |H| m ⌈ ⌉ = m 2 = m 2 . N N m m m m
m
Z´avˇer: Dok´azali jsme existenci c-univerz´aln´ıch syst´em˚ u pro c bl´ızk´e 1. Staˇc´ı si uvˇedomit, ˇze bez ztr´aty obecnosti, kaˇzd´e univerzum m˚ uˇzeme povaˇzovat za univerzum tvaru {0, 1, . . . , N − 1} pro nˇejak´e N a ˇze mezi ˇc´ısly N a 2N vˇzdy existuje nˇejak´e prvoˇc´ıslo.
Vlastnosti univerz´aln´ıho haˇsov´ an´ı Pˇredpoklad: H je c-univerz´aln´ı syst´em funkc´ı Oznaˇcen´ı: Pro funkci h ∈ H a prvky x, y ∈ U oznaˇcme δh (x, y) = 1
kdyˇz x 6= y a h(x) = h(y)
δh (x, y) = 0 kdyˇz x = y nebo h(x) 6= h(y).
29
Pro mnoˇzinu S ⊆ U , x ∈ U a h ∈ H definujme X δh (x, S) = δh (x, y). y∈S
Pro fixovanou mnoˇzinu S ⊆ U a pro fixovan´e x ∈ U seˇcteme δh (x, S) pˇres vˇsechny h ∈ H: X XX XX X δh (x, y) = δh (x, y) = |{h ∈ H | h(x) = h(y)}| ≤ δh (x, S) = h∈H
h∈H y∈S
X
y∈S,y6=x
y∈S,y6=x
y∈S h∈H
|H| c = m
(
(|S| − 1)c |H| m
if x ∈ S,
|S|c |H| m
if x ∈ / S.
Oˇcek´avan´a d´elka ˇretˇezce pro fixovanou mnoˇzinu S ⊆ U a fixovan´e x ∈ U pˇres h ∈ H s rovnomˇern´ ym rozdˇelen´ım je |S| − 1 kdyˇz x ∈ S, m |S| c kdyˇz x ∈ / S. m Vˇ eta. Oˇcek´ avan´ y ˇcas operac´ı MEMBER, INSERT a DELETE pˇri c-univerz´ aln´ım |S| haˇsov´ an´ı je O(1 + cα), kde α je faktor naplnˇen´ı (tj. α = m ). Oˇcek´ avan´ y ˇcas posloupnosti n operac´ı MEMBER, INSERT a DELETE aplikovan´ ych c na pr´ azdnou tabulku pˇri c-univerz´ aln´ım haˇsov´ an´ı je O(1 + 2 α). c
V´ yznam v´ ysledku: Vzorec se jen o multiplikativn´ı konstantu c liˇs´ı od vzorce pro haˇsov´ an´ı se separovan´ ymi ˇretˇezci. Pˇritom c m˚ uˇze b´ yt jen o m´alo menˇs´ı neˇz 1 a ve vˇsech zn´ am´ ych pˇr´ıkladech je c ≥ 1. Takˇze, co jsme dos´ahli? Rozd´ıl je v pˇredpokladech. Zde je pˇredpoklad 3) nahrazen pˇredpokladem, ˇze funkce h ∈ H je vybr´ana s rovnomˇern´ ym rozdˇelen´ım, a nen´ı ˇz´adn´ y pˇredpoklad na vstupn´ı data. V´ ybˇ er funkce h m˚ uˇ zeme ovlivnit, ale v´ ybˇ er vstupn´ıch dat nikoliv. M˚ uˇzeme zajistit rovnomˇern´e rozdˇelen´ı v´ ybˇeru h z H nebo se k tomuto rozdˇelen´ı hodnˇe pˇribl´ıˇzit.
Markovova nerovnost Pˇredpoklady: Vybran´a mnoˇzina S ⊆ U , prvek x ∈ U . Oˇcek´avan´a d´elka ˇretˇezce S, kter´ y by mˇel obsahovat x, je µ, a t ≥ 1. Uk´aˇzeme, ˇze pravdˇepodobnost, ˇze pro h ∈ H je d´elka ˇretˇezce alespoˇ n tµ, je menˇs´ı neˇz (pˇredpoklad´ame, ˇze h je z H vybr´ana s rovnomˇern´ ym rozdˇelen´ım).
1 t
Oznaˇcme H ′ = {h ∈ H | δh (x, S) ≥ tµ}. Pak plat´ı P P P |H ′ | ′ tµ h∈H δh (x, S) h∈H ′ δh (x, S) µ= > ≥ h∈H = tµ |H| |H| |H| |H| Odtud
|H| . t Z´avˇer: Pravdˇepodobnost, ˇze δh (x, S) ≥ tµ, je menˇs´ı neˇz |H ′ | <
1 t
a odtud plyne poˇzadovan´e tvrzen´ı.
Pozn´amka: Toto tvrzen´ı plat´ı obecnˇe a naz´ yv´a se Markovova nerovnost. Uveden´ y d˚ ukaz ilustruje jednoduchou ideu pro koneˇcn´ y pˇr´ıpad.
30
Probl´emy Hlavn´ı probl´em: Zajiˇstˇen´ı rovnomˇern´eho rozdˇelen´ı v´ ybˇeru h z H. Proveden´ı v´ ybˇeru: Zak´odovat funkce z mnoˇziny H do ˇc´ısel 0, 1, . . . , |H| − 1. Zvolit n´ahodnˇe ˇc´ıslo i z tohoto intervalu s rovnomˇern´ ym rozdˇelen´ım, a pak pouˇz´ıt funkci s k´odem i. Abychom vybrali i, nalezneme nejmenˇs´ı j takov´e, ˇze 2j − 1 ≥ |H| − 1. Pak ˇc´ısla v intervalu {0, 1, . . . , 2j − 1} jednoznaˇcnˇe koresponduj´ı s posloupnostmi 0 a 1 d´elky j. Budeme vyb´ırat n´ahodnˇe posloupnost 0 a 1 d´elky j. K v´ ybˇeru posloupnosti pouˇzijeme n´ahodn´ y gener´ ator rovnomˇern´eho rozdˇelen´ı. Z´avada: Skuteˇcn´ y n´ahodn´ y gener´ator pro rovnomˇern´e rozdˇelen´ı je prakticky nedosaˇziteln´ y (nˇekter´e fyzik´aln´ı procesy). K dispozici je pouze pseudogener´ator. ˇ ım je j vˇetˇs´ı, t´ım je posloupnost pravidelnˇejˇs´ı (tj. m´enˇe n´ahodn´a). Jeho nev´ yhoda: C´ Z´amˇer: Nal´ezt co nejmenˇs´ı c-univerz´aln´ı syst´emy. Nal´ezt doln´ı odhady na jejich velikost.
Doln´ı odhady na velikost Pˇredpoklady: Nechˇt U je universum velikosti N a nechˇt H je c-univerz´aln´ı syst´em funkc´ı haˇsuj´ıc´ıch do tabulky velikosti m. Pˇredpokl´adejme, ˇze H = {h0 , h1 , . . . , }. Indukc´ı definujme mnoˇziny U0 , U1 , . . . tak, ˇze U0 = U . Nechˇt U1 je nejvˇetˇs´ı podmnoˇzina U0 vzhledem k poˇctu prvk˚ u takov´a, ˇze h0 (U1 ) je jednoprvkov´a mnoˇzina. Nechˇt U2 je nejvˇetˇs´ı podmnoˇzina U1 vzhledem k poˇctu prvk˚ u takov´a, ˇze h1 (U2 ) je jednoprvkov´a mnoˇzina. Nechˇt U3 je nejvˇetˇs´ı podmnoˇzina U2 vzhledem k poˇctu prvk˚ u takov´a, ˇze h2 (U3 ) je jednoprvkov´a mnoˇzina. Obecnˇe, nechˇt Ui je nejvˇetˇs´ı podmnoˇzina Ui−1 vzhledem k poˇctu prvk˚ u takov´a, ˇze hi−1 (Ui ) je jednoprvkov´a mnoˇzina. |U
|
i−1 Protoˇze haˇsujeme do tabulky velikosti m, plat´ı|Ui | ≥ ⌈ m ⌉. Protoˇze |U0 | = N , dost´ av´ ame N indukc´ı, ˇze |Ui | ≥ ⌈ mi ⌉ pro kaˇzd´e i. Zvolme i = ⌈logm N ⌉ − 1. Pak i je nejvˇetˇs´ı pˇrirozen´e N a aspoˇ n dva prvky, zvolme x, y ∈ Ui takov´e, ˇze x 6= y. ˇc´ıslo takov´e, ˇze m i > 1. Tedy Ui m´ Pak hj (x) = hj (y) pro j = 0, 1, . . . , i − 1. Tedy
i ≤ |{h ∈ H | h(x) = h(y)}| ≤
c|H| . m
Vˇ eta. Kdyˇz H je c-univerz´ aln´ı syst´em pro univerzum U o velikosti N haˇsuj´ıc´ı do tabulky s m ˇra ´dky, pak m |H| ≥ (⌈logm N ⌉ − 1). c Posloupnosti 0 a 1 pˇri n´ ahodn´e volbˇe h z H mus´ı m´ıt d´elku ⌈(log m − log c + log log N − log log m)⌉.
Mal´ y univerz´aln´ı syst´em Zkonstruujeme c-univerz´aln´ı syst´em takov´ y, ˇze logaritmus z jeho velikosti pro velk´a univerza je aˇz na aditivn´ı konstantu menˇs´ı neˇz 4(log m + log log N ), kde N je velikost univerza a m je poˇcet ˇr´adk˚ u v tabulce.
31
Nechˇt p1 , p2 , . . . je rostouc´ı posloupnost vˇsech prvoˇc´ısel. Pˇredpoklady: D´ano univerzum U = {0, 1, . . . , N − 1}, kde N je pˇrirozen´e ˇc´ıslo N a ˇc´ıslo m. Nechˇt t je nejmenˇs´ı ˇc´ıslo takov´e, ˇze t ln pt ≥ m ln N . Definujme H1 = {gc,d (hℓ ) | t < ℓ ≤ 2t, c, d ∈ {0, 1, . . . , p2t − 1}}, kde hℓ (x) = x mod pℓ a gc,d (x) = ((cx + d) mod p2t ) mod m. Uk´aˇzeme, ˇze H1 je 5-univerz´aln´ı syst´em. Velikost H1 . Protoˇze gc,d (hℓ ) 6= gc′ d′ (hℓ′ ) jakmile (c, d, ℓ) 6= (c′ , d′ , ℓ′ ), dost´av´ame, ˇze |H1 | = tp22t (protoˇze c a d prob´ıhaj´ı p2t ˇc´ısel a ℓ prob´ıh´a t ˇc´ısel). Z vˇety o rozloˇzen´ı prvoˇc´ısel plyne existence konstanty a takov´e, ˇze pi ≤ ai ln i pro kaˇzd´e i, tedy p2t ≤ 2at ln 2t. Tedy |H1 | ≤ 4a2 t3 ln2 2t. Z toho dost´av´ame log(|H1 |) ≤ 2 + 2 log a + 3 log t + 2 log log t. Pro dostateˇcnˇe velk´e t (takov´e, ˇze log t ≥ 2 log log t) existuje aditivn´ı konstanta b, ˇze log(|H1 |) ≤ b + 4 log t. Z definice t plyne, ˇze t ≤ m ln N , kdyˇz ln pt ≥ 1 (tj. pt ≥ 3). Z´avˇer: log(|H1 |) ≤ b + 4(log m + log log N ).
Univerzalita mal´eho syst´emu Zvolme r˚ uzn´a x a y z univerza U . Oznaˇc´ıme G1 = {(c, d, ℓ) | gc,d (hℓ (x)) = gc,d (hℓ (y)), hℓ (x) 6= hℓ (y)}, G2 = {(c, d, ℓ) | gc,d (hℓ (x)) = gc,d (hℓ (y)), hℓ (x) = hℓ (y)} a odhadneme velikost G1 a G2 . Odhad velikosti G1 . Kdyˇz (c, d, ℓ) ∈ G1 , pak existuj´ı i ∈ {0, 1, . . . , m − 1} a r, s ∈ {0, 1, . . . , ⌈ pm2t ⌉ − 1} takov´a, ˇze (c(x mod pℓ ) + d ≡ i + rm) mod p2t (c(y mod pℓ ) + d ≡ i + sm) mod p2t . Kdyˇz c a d povaˇzujeme za nezn´ am´e, pak je to line´arn´ı soustava rovnic s regul´arn´ı matic´ı (protoˇze x mod pℓ 6= y mod pℓ ), a tedy pro kaˇzd´e ℓ, i, r a s existuje nejv´ yˇse jedna dvojice (c, d). Proto tp2 m 2 |H1 | m 2 p2t ) = ) . (1 + |G1 | ≤ tm(⌈ ⌉)2 ≤ 2t (1 + m m p2t m p2t Q Odhad velikosti G2 . Oznaˇcme L = {ℓ | t < ℓ ≤ 2t, x mod pℓ = y mod pℓ } a P = ℓ∈L pℓ . Protoˇze P dˇel´ı |x − y|, dost´av´ame, ˇze P ≤ N . Protoˇze pt < pℓ pro kaˇzd´e ℓ ∈ L, dost´av´ ame, |L| ln N t ˇze P > pt . Tedy |L| ≤ ln pt ≤ m z definice t. Protoˇze (c, d, ℓ) ∈ G2 pr´avˇe kdyˇz ℓ ∈ L a c, d ∈ {0, 1, . . . , p2t − 1}, shrneme, ˇze |G2 | ≤ |L|p22t ≤
tp22t |H1 | = . m m
32
Kdyˇz m ≥ p2t , pak t ln pt < pt ln p2t < m ln m < m ln N
(protoˇze m ≤ N ),
a to je spor s definic´ı t. Tedy m < p2t a odtud {h ∈ H1 | h(x) = h(y)}| = |G1 | + |G2 | ≤
|H1 | m 2 |H1 | |H1 | |H1 | (1 + ) + ≤ (1 + 22 ) = 5 . m p2t m m m
Shrnut´ı: H1 je 5-univerz´aln´ı. Odhad na velikost c. Kdyˇz H je c-univerz´aln´ı syst´em univerza U o velikosti N haˇsuj´ıc´ı do m . tabulky s m ˇr´adky, pak c ≥ 1 − N
Probl´emy univerz´aln´ıho haˇsov´ an´ı Pouˇz´ıt jin´e metody na ˇreˇsen´ı koliz´ı neˇz separuj´ıc´ı ˇretˇezce. Jak to ovlivn´ı pouˇzitelnost univerz´aln´ıho haˇsov´an´ı? Plat´ı podobn´e vztahy jako pro pevnˇe danou haˇsovac´ı funkci? Jak´ y vliv na efektivnost m´a nepˇr´ıtomnost operace DELETE? Existuje c-univerz´aln´ı haˇsovac´ı syst´em pro c < 1. Jak´ y je vztah mezi velikost´ı c-univerz´ aln´ıho haˇsovac´ıho syst´emu a velikost´ı c? Lze zkonstruovat mal´ y c-univerz´aln´ı syst´em pro c < 5? Zde hraje roli fakt, ˇze pˇri c = 5 se oˇcek´avan´a d´elka ˇretˇezce m˚ uˇze pohybovat aˇz kolem hodnoty 10. ˇ Pouˇzit´ı Cebyˇ sevovy nerovnosti m´ısto Markovovy nerovnosti d´av´ a kvadratick´ y odhad pravdˇepodobnosti, ˇze d´elka ˇretˇezce je o t vˇetˇs´ı neˇz oˇcek´avan´a hodnota. Za jak´ ych okolnost´ı d´ av´ a lepˇs´ı odhad? Lze pouˇz´ıt i vyˇsˇs´ıch moment˚ u. Jak pouˇz´ıt Markovou nerovnost a oˇcek´avanou d´elku maxim´aln´ıho ˇretˇezce pro volbu haˇsovac´ı funkce. Pro jak´e parametry lze pouˇz´ıt n´asleduj´ıc´ı model? D´ano m, z´akladn´ı velikost tabulky, pro i = 0, 1, . . . c-univerz´aln´ı haˇsovac´ı syst´em Hi z univerza do tabulky s m2i ˇr´adky a koeficienty li . Uloˇzen´ı S ⊆ U : d´ano i takov´e, ˇze kdyˇz i > 0, pak plat´ı m2i−2 ≤ |S| ≤ m2i , kdyˇz i = 0, pak plat´ı |S| ≤ m, a je zvolen´a hi ∈ Hi . Prvek s ∈ S je uloˇzen v ˇretˇezci hi (s) a kaˇzd´ y ˇretˇezec m´a d´elku nejv´ yˇse li . Pˇri operaci INSERT, kdyˇz se poruˇs´ı poˇzadavek na velikost |S|, pak se zvˇetˇs´ı i o 1 a n´ahodnˇe se zvol´ı hi ∈ Hi . Kdyˇz se poruˇs´ı poˇzadavek na d´elku ˇretˇezc˚ u, pak se vol´ı nov´e hi ∈ Hi . V obou pˇr´ıpadech se volba opakuje tak dlouho, dokud nen´ı splnˇena podm´ınka na ˇretˇezce. Operace DELETE se ˇreˇs´ı stejnˇe. Probl´emy: Jak volit parametry li ? V pˇr´ıpadˇe ˇreˇsen´ı koliz´ı dvojit´ ym haˇsov´an´ım nebo haˇsov´an´ım s line´arn´ım pˇrid´av´an´ım je tˇreba d´at silnˇejˇs´ı podm´ınky na velikost |S|. Jak´e? S jakou pravdˇepodobnost´ı se pˇrepoˇc´ıt´av´a uloˇzen´ı S s novou haˇsovac´ı funkc´ı?
33
Perfektn´ı haˇsov´ an´ı Jin´e ˇreˇsen´ı koliz´ı je perfektn´ı haˇsov´an´ı. Idea je nal´ezt pro danou mnoˇzinu haˇsovac´ı funkci, kter´a nem´a kolize. Nev´ yhoda: Metoda nepˇripouˇst´ı operaci INSERT (pro nov´ y vstup nem˚ uˇzeme zaruˇcit, ze nebude kolize). Metodu lze prakticky pouˇz´ıt pro u ´lohy, kde lze oˇcek´avat hodnˇe operac´ı MEMBER a operace INSERT se t´emˇeˇr nevyskytuje (kolize se ˇreˇs´ı pomoc´ı mal´e pomocn´e tabulky, kam se ukl´adaj´ı koliduj´ıc´ı data). Zad´an´ı u ´lohy: Pro danou mnoˇzinu S ⊆ U chceme nal´ezt haˇsovac´ı funkci h takovou, ˇze 1) pro s, t ∈ S takov´e, ˇze s 6= t, plat´ı h(s) 6= h(t) (tj. h je perfektn´ı haˇsovac´ı funkce pro S); 2) h haˇsuje do tabulky s m ˇr´adky, kde m je pˇribliˇznˇe stejnˇe velk´e jako |S| (nen´ı praktick´e haˇsovat do pˇr´ıliˇs velk´ ych tabulek – ztr´ac´ı se jeden ze z´akladn´ıch d˚ uvod˚ u pro haˇsov´an´ı); 3) h mus´ı b´ yt rychle spoˇcitateln´a – jinak haˇsov´an´ı nen´ı rychl´e; 4) uloˇzen´ı h nesm´ı vyˇzadovat moc pamˇeti, nejv´ yhodnˇejˇs´ı je analytick´e zad´an´ı (kdyˇz zad´ an´ı h bude vyˇzadovat moc pamˇeti, napˇr. kdyˇz by byla d´ana tabulkou, pak se ztr´ac´ı stejn´ y d˚ uvod k pouˇzit´ı jako v bodu 2). Kompenzace: Nalezen´ı haˇsovac´ı funkce m˚ uˇze potˇrebovat v´ıce ˇcasu. Prov´ad´ı se jen na zaˇc´atku u ´lohy. Uveden´e poˇzadavky motivuj´ı n´asleduj´ıc´ı pojem. Mˇejme univerzum U = {0, 1, . . . , N − 1}. Soubor funkc´ı H z U do mnoˇziny {0, 1, . . . , m − 1) se naz´ yv´a (N, m, n)-perfektn´ı, kdyˇz pro kaˇzdou S ⊆ U takovou, ˇze |S| = n, existuje h ∈ H perfektn´ı pro S (tj. h(s) 6= h(t) pro kaˇzd´a dvˇe r˚ uzn´a s, t ∈ S). Tento pojem budeme vyˇsetˇrovat v n´asleduj´ıc´ı pˇredn´aˇsce.
34
Pˇredn´ aˇska 5 Perfektn´ı haˇsov´ an´ı Pˇripomenut´ı: U = {0, 1, . . . , N − 1} pro nˇejak´e pˇrirozen´e ˇc´ıslo N , S ⊆ U . Funkce h : U − → {0, 1, . . . , m − 1} je perfektn´ı pro mnoˇzinu S, kdyˇz h(s) 6= h(t) pro kaˇzdou dvojici r˚ uzn´ ych prvk˚ u z S. Naˇs´ım c´ılem je pro mnoˇzinu S nal´ezt m a funkci h : U − → {0, 1, . . . , m − 1} takovou, ˇze 1) h je perfektn´ı haˇsovac´ı funkce pro S; 2) m je pˇribliˇznˇe stejnˇe velk´e jako |S| (nen´ı praktick´e haˇsovat do pˇr´ıliˇs velk´ ych tabulek – ztr´ac´ı se jeden ze z´akladn´ıch d˚ uvod˚ u pro haˇsov´an´ı, efektivn´ı vyuˇzit´ı pamˇeti); 3) h mus´ı b´ yt rychle spoˇcitateln´a – jinak haˇsov´an´ı nen´ı rychl´e; 4) uloˇzen´ı h nesm´ı vyˇzadovat moc pamˇeti, nejv´ yhodnˇejˇs´ı je analytick´e zad´an´ı (kdyˇz zad´ an´ı h bude vyˇzadovat moc pamˇeti, napˇr. kdyˇz by byla d´ana tabulkou, pak se ztr´ac´ı stejn´ y d˚ uvod k pouˇzit´ı jako v bodu 2). Tyto n´aroky jsou kompenzov´any menˇs´ımi n´aroky na ˇcas pˇri hled´an´ı h a m. Protoˇze nev´ıme, zda takov´a h existuj´ı, nejprve vyˇsetˇr´ıme mnoˇziny perfektn´ıch haˇsovac´ıch funkc´ı. Definujeme: Mˇejme univerzum U = {0, 1, . . . , N − 1}. Soubor funkc´ı H z U do mnoˇziny {0, 1, . . . , m − 1) se naz´ yv´a (N, m, n)-perfektn´ı, kdyˇz pro kaˇzdou S ⊆ U takovou, ˇze |S| = n, existuje perfektn´ı h ∈ H pro S. Vyˇsetˇr´ıme vlastnosti (N, m, n)-perfektn´ıch soubor˚ u funkc´ı.
Doln´ı odhady na velikost Mˇejme funkci h z U do mnoˇziny {0, 1, . . . , m−1}. Nalezneme poˇcet mnoˇzin S ⊆ U takov´ ych, ˇze h je perfektn´ı funkce pro S a |S| = n. Funkce h je perfektn´ı pro S ⊆ U , pr´avˇe kdyˇz pro kaˇzd´e i = 0, 1, . . . , m − 1 je |h−1 (i) ∩ S| ≤ 1. Odtud poˇcet tˇechto mnoˇzin je X n−1 Y { |h−1 (ij )| | 0 ≤ i0 < i1 < · · · < in−1 < m}. j=0
Vysvˇetlen´ı: h(S) = {ij | j = 0, 1, . . . , n − 1}. Toto ˇc´ıslo je maxim´ aln´ı, kdyˇz |h−1 (i)| = N pro kaˇzd´e i. Tedy h m˚ uˇze b´ yt perfektn´ı nejv´ yˇse m m N n m pro n ( m ) mnoˇzin (ˇc´ıslo n urˇcuje poˇcet posloupnost´ı 0 ≤ i0 < i1 < · · · < in−1 < m). n-prvkov´ ych podmnoˇzin universa je N , tedy n N |H| ≥
m n
nN . ( m )n
Pˇredpokl´adejme, ˇze H = {h1 , . . . , ht } je (N, m, n)-perfektn´ı soubor funkc´ı. Definujme indukc´ı soubor mnoˇzin Ui : U0 = U a pro i > 0 je Ui nejvˇetˇs´ı podmnoˇzina Ui−1 , co do velikosti, takov´a, ˇze hi je konN i−1 | pro vˇsechna i > 0. Z |U0 | = N plyne |Ui | ≥ m zd´e stantn´ı na Ui . Pak |Ui | ≥ |Um i . Pro kaˇ i = 1, 2, . . . , t je hj (Ui ) jednobodov´a mnoˇzina pro kaˇzd´e j ≤ i. Proto ˇz´adn´a hj pro j ≤ i nen´ı perfektn´ı pro mnoˇzinu S ⊆ U takovou, ˇze |S ∩ Ui } ≥ 2. Protoˇze H je (N, m, n)-perfektn´ı, log N N mus´ı b´ yt |Ut | ≤ 1, a tedy m t ≤ 1. Proto t ≥ log m .
35
Vˇ eta. Kdyˇz H je (N, m, n)-perfektn´ı soubor funkc´ı, pak |H| ≥ max{
N n m N n, n (m)
log N }. log m
Existence Mˇejme univerzum U = {0, 1, . . . , N − 1} a soubor funkc´ı H = {h1 , h2 , . . . , ht } z univerza U do mnoˇziny {0, 1, . . . , m − 1}. Reprezentujeme tento soubor pomoc´ı matice M (H) typu N × t s hodnotami {0, 1, . . . , m − 1} tak, ˇze v x-t´em ˇr´adku a i-t´em sloupci matice M (H) pro x ∈ U a i = 1, 2, . . . , t je hodnota hi (x). Pak ˇz´adn´a funkce z H nen´ı perfektn´ı pro mnoˇzinu S = {s1 , s2 , . . . , sn } ⊆ U , pr´avˇe kdyˇz podmatice M (H) tvoˇren´a ˇr´adky s1 , s2 , aˇz sn a vˇsemi sloupci nem´a prost´ y sloupec. Takov´ ych matic je nejv´ yˇse n
(m −
n−1 Y
(m − i))t m(N−n)t .
i=0
Qn−1 Vysvˇetlen´ı: mn je poˇcet vˇsech funkc´ı z S do {0, 1, . . . , m−1}, i=0 (m−i) je poˇcet prost´ ych funkc´ı z S do {0, 1, . . . , m − 1}, a tedy poˇcet vˇsech podmatic s n ˇr´adky takov´ ych, ˇze ˇz´ adn´ y Qn−1 n t jejich sloupec nen´ı prost´ y, je (m − i=0 (m − i)) . Tyto podmatice m˚ uˇzeme libovolnˇe (N−n)t doplnit na matici typu N × n a pro kaˇzdou matici je tˇechto doplnˇen´ı m . Podmnoˇzin U velikosti n je N , tedy poˇcet vˇsech matic, kter´e nereprezentuj´ı (N, m, n)n perfektn´ı syst´em, je menˇs´ı neˇz n−1 Y N n (m − i))t m(N−n)t . (m − n i=0
Vˇsech matic je mNt a kdyˇz n−1 Y N n (m − (m − i))t m(N−n)t < mNt , n i=0
(*)
pak nutnˇe existuje (N, m, n)-perfektn´ı syst´em. N´asleduj´ıc´ı v´ yrazy jsou ekvivalentn´ı s nerovnost´ı (∗) Qn−1 ln N N n i=0 (m − i) Qn−1 )<1 ⇔ t≥ . (1 − (m−i) mn n i=0 − ln(1 − ) mn Protoˇze ln N ze n ≤ n ln N a protoˇ − ln(1 −
Rn n−1 Pn−1 Y x i (m − i) i )dx ln(1− m ln(1− m ) i=0 0 ) ≥ (1 − ) = e ≥ e n m m i=0
Qn−1 i=0
36
kde integr´al je roven m[(1 −
n n n n n2 )(1 − ln(1 − )) − 1] ≥ m[(1 − )(1 + ) − 1] = m m m m m n2
dost´av´ame, ˇze kdyˇz t ≥ n(ln N )e m , pak (*) plat´ı, a tedy existuje (N, m, n)-perfektn´ı soubor funkc´ı. Existence (N, m, n)-perfektn´ıho souboru funkc´ı ale nezaruˇcuje splnˇen´ı poˇzadavk˚ u 2), 3) a 4). Abychom uspˇeli, pouˇzijeme ideu z metody univerz´aln´ıho haˇsov´an´ı. Pˇredpoklady: U = {0, 1, . . . , N − 1}, kde N je prvoˇc´ıslo. Mˇejme S ⊆ U o velikosti n. Budeme uvaˇzovat funkce hk (x) = (kx mod N ) mod m
pro k = 0, 1, . . . , N − 1.
Pro i = 0, 1, . . . , m − 1 a k = 0, 1, . . . , N − 1 oznaˇcme bki = |{x ∈ S | (kx mod N ) mod m = i}|. V´ yznam bki : Hodnoty bki lze povaˇzovat za veliˇciny, kter´e ukazuj´ı odchylku od perfektnosti. Vˇsimnˇeme si, ˇze kdyˇz bki ≥ 2, pak (bki )2 − bki ≥ 2, protoˇze n2 − n ≥ 2, kdyˇz n ≥ 2. Na druhou stranu bki ≤ 1 implikuje (bki )2 − bki = 0. Tedy z
Pm−1 i=0
bki = n plyne
Pm−1 Vˇ eta. Funkce hk je perfektn´ı, pr´ avˇe kdyˇz i=0 (bki )2 − n < 2. PN−1 Pm−1 Nyn´ı odhadneme v´ yraz k=1 ( i=0 (bki )2 ) − n . N−1 X k=1
(
m−1 X
(bki )2 )
i=0
N−1 X
−n =
N−1 X k=1
(
m−1 X i=0
|{x ∈ S | hk (x) = i}|2 ) − n =
|{(x, y) | x 6= y, x, y ∈ S, hk (x) = hk (y)}| =
k=1
X
|{k | 1 ≤ k < N, hk (x) = hk (y)}|.
x,y∈S,x6=y
Zvolme x, y ∈ S takov´a, ˇze x 6= y. Pak hk (x) = hk (y), pr´avˇe kdyˇz (kx mod N −ky mod N ) = N N 0 mod m, a to je ekvivalentn´ı s t´ım, ˇze k(x − y) ≡ rm mod N pro nˇejak´e r = −⌈ m ⌉, −⌈ m ⌉+ N 1, . . . , −1, 1, 2, . . . , ⌈ m ⌉.
37
Vysvˇetlen´ı: Kdyˇz x > y, pak k(x − y) > 0, a tedy hk (x) = hk (y) je ekvivalentn´ı s t´ım, N ˇze k(x − y) ≡ rm mod N pro r = 1, 2, . . . , ⌈ m ⌉. Kdyˇz x < y, pak k(x − y) < 0, a tedy N hk (x) = hk (y) je ekvivalentn´ı s t´ım, ˇze k(x − y) ≡ rm mod N pro r = −1, −2, . . . , −⌈ m ⌉. Protoˇze pro r˚ uzn´a x a y a pro jedno r existuje pr´avˇe jedno k takov´e, ˇze k(x−y) ≡ rm mod N (protoˇze ZN je tˇeleso, tato rovnice m´a jedin´e ˇreˇsen´ı), dost´av´ame, ˇze pro x, y ∈ S, x 6= y N existuje nejv´ yˇse 2 m − 1 r˚ uzn´ ych k = 1, 2, . . . , N − 1. Odtud N−1 X k=1
(
m−1 X i=0
(bki )2 ) − n ≤
X
x,y∈S,x6=y
2⌈
n(n − 1) N ⌉ − 1 ≤ (N − 1)2 . m m
Pm−1 Pm−1 Proto existuje k takov´e, ˇze i=0 (bki )2 ≤ 2 n(n−1) + n. Protoˇze i=0 (bki )2 ≥ n pro vˇsechna m Pm−1 ych k, ˇze i=0 (bki )2 ≤ 4 n(n−1) + n. k, existuje alespoˇ n N2 takov´ m
Tvrzen´ı. Kdyˇz n = m, pak Pm−1 (a) existuje deterministick´ y algoritmus, kter´ y nalezne k takov´e, ˇze i=0 (bki )2 < 3n ˇcase O(nN ); Pm−1 (b) existuje pravdˇepodobnostn´ı algoritmus, kter´ y nalezne k takov´e, ˇze i=0 (bki )2 < 5n v ˇcase O(n). D´ ale (c) existuje deterministick´ y algoritmus, kter´ y pro m = 1+n(n−1) v ˇcase O(nN ) nalezne k takov´e, ˇze hk je perfektn´ı; (d) existuje pravdˇepodobnostn´ı algoritmus, kter´ y pro n = 1 + 2n(n − 1) v ˇcase O(n) nalezne k takov´e, ˇze hk je perfektn´ı. Pm−1 k 2 D˚ ukaz. Mˇejme n = m. Protoˇze spoˇc´ıt´an´ı e k vyˇzaduje ˇcas O(n), i=0 (bi ) pro pevn´ Pm−1 k 2 + n = 3n − 2 < systematick´ ym prohled´an´ım nalezneme k takov´e, ˇze i=0 (bi ) ≤ 2 n(n−1) n 3n, v ˇcase O(nN ). T´ım je dok´ az´ano a). Pro n´ahodnˇe zvolen´e k, Prob(
m−1 X
(bki )2 ≤ 4
i=0
n(n − 1) 1 + n = 5n − 2 < 5n) ≤ n 2
a dost´av´ame tvrzen´ı b). (Vol´ıme n´ahodnˇe k, dokud nen´ı splnˇeno tvrzen´ı). Kdyˇz m = 1 + n(n − 1), pak systematick´ ym prohled´an´ım vˇsech moˇznost´ı nalezneme k Pm−1 k 2 n(n−1) takov´e, ˇze i=0 (bi ) ≤ 2 1+n(n−1) + n < n + 2, v ˇcase O(nN ) a c) plyne z pˇredchoz´ı vˇety. Kdyˇz m = 1 + 2n(n − 1), pak pro n´ahodnˇe zvolen´e k plat´ı s pravdˇepodobnost´ı ≤ 12 , ˇze Pm−1 k 2 2n(n−1) ı d) plyne z pˇredchoz´ı vˇety. i=0 (bi ) ≤ 1+2n(n−1) + n < n + 2. Nyn´
Takto zkonstruovan´e perfektn´ı haˇsovac´ı funkce nesplˇ nuj´ı poˇzadavek 2) (m = Θ(n2 )). Pouˇzijeme n´asleduj´ıc´ı postup. Pm−1 Pm−1 1) Nalezneme k takov´e, ˇze pro m = n plat´ı i=0 (bki )2 < 3n (respektive i=0 (bki )2 < 5n). Pro i = 0, 1, . . . , m − 1 nalezneme mnoˇzinu Si = {s ∈ S | hk (s) = i}; 2) Pro kaˇzd´e i = 0, 1 . . . , m−1 takov´e, ˇze Si 6= ∅, nalezneme pro m = 1+n(n−1) (respektive m = 1 + 2n(n − 1)) takov´e ki , ˇze hki je perfektn´ı na Si . Definujme ci = 1 + |Si |(|Si | − 1), kdyˇz Si 6= ∅, a ci = 0, kdyˇz Si = ∅. Pi−1 3) Pro i = 0, 1, . . . , m definujme di = cme hk (x) = l. Pak j=0 cj a pro x ∈ U oznaˇ g(x) = dl + hkl (x).
38
Vˇ eta. Zkonstruovan´ a funkce g je perfektn´ı, hodnota g(x) se pro kaˇzd´e x ∈ U spoˇc´ıt´ a v ˇcase O(1), v deterministick´em pˇr´ıpadˇe haˇsuje do tabulky velikosti < 3n a je nalezena v ˇcase O(nN ), v pravdˇepodobnostn´ım pˇr´ıpadˇe haˇsuje do tabulky velikosti < 9n a je nalezena v ˇcase O(n). Pro jej´ı zak´ odov´ an´ı jsou tˇreba hodnoty k a ki pro i = 0, 1, . . . , m − 1. Tyto hodnoty jsou v rozmez´ı 1, 2, . . . , N − 1, a tedy vyˇzaduj´ı O(n log N ) pamˇeti. D˚ ukaz. Protoˇze g(Si ) pro i = 0, 1, . . . , m − 1 jsou navz´ajem disjunktn´ı a hki je perfektn´ı na Si , dost´av´ame, ˇze g je perfektn´ı. Pro v´ ypoˇcet hodnoty g(x) jsou tˇreba dvˇe n´asoben´ı, dvoj´ı v´ ypoˇcet zbyteku pˇri dˇelen´ı a jedno sˇc´ıt´an´ı (hodnoty di jsou uloˇzen´e v pamˇeti). Proto v´ ypoˇcet g(x) vyˇzaduje ˇcas O(1). D´ale dm je horn´ı odhad na poˇcet ˇradk˚ u v tabulce. Protoˇze 2 k 2 pro Si 6= ∅ m´ame |Si |(|Si | − 1) + 1 ≤ |Si | = (bi ) , dost´av´ame v deterministick´em pˇr´ıpadˇe Pm−1 Pm−1 dm = i=0 ci ≤ i=0 (bki )2 < 3n a k nalezneme v ˇcase O(nN ). Protoˇze ki nalezneme v ˇcase O(|Si |N ), lze g zkonstruovat v ˇcase O(nN +
m−1 X i=0
|Si |N ) = O(nN + N
m−1 X
|Si |) = O(2nN ) = O(nN ).
i=0
Pm−1 V pravdˇepodobnostn´ım pˇr´ıpadˇe je 2|Si |(|Si |−1)+1 ≤ 2|Si |2 −|Si | a odtud dm = i=0 ci ≤ Pm−1 k Pm−1 k 2 case O(n) a ki v ˇcase O(|Si |). To i=0 bi < 10n − n = 9n a k nalezneme v ˇ i=0 2(bi ) − znamen´a, ˇze g nalezneme v ˇcase O(n). Zbytek je jasn´ y. Tedy zkonstruovan´a haˇsovac´ı funkce splˇ nuje poˇzadavky 1), 2) a 3), ale poˇzadavek 4) nen´ı splnˇen. Mˇejme pˇrirozen´e ˇc´ıslo m a q je poˇcet vˇsech prvoˇc´ısel, kter´e dˇel´ı m. (p1 , p2 , . . . je rostouc´ı posloupnost vˇsech prvoˇc´ısel). Pak q Y
Rq Pq q q ln xdx ln i pi > q! = e i=1 m≥ ≥e 1 = eq ln( e )+1 ≥ ( )q . e i=1 nme tento fakt Proto existuje konstanta c, ˇze q ≤ c lnlnlnmm . Shrˇ Vˇ eta. Nechˇt δ(m) =poˇcet prvoˇc´ısel, kter´e dˇel´ı m. Pak δ(m) = O( logloglogmm ). Mˇejme S = {s1 < s2 < · · · < sn } ⊆ U . Oznaˇcme di,j = sj − si pro 1 ≤ i < j ≤ n, pak Q 2 si mod p 6= sj mod p, pr´avˇe kdyˇz di,j 6= 0 mod p. Oznaˇcme D = 1≤i<j≤n di,j ≤ N (n ) . Pak poˇcet prvoˇc´ıseln´ ych dˇelitel˚ u ˇc´ısla D je nejv´ yˇse c lnlnlnDD a tedy mezi prvn´ımi 1 + c lnlnlnDD prvoˇc´ısly existuje prvoˇc´ıslo p takov´e, ˇze si mod p 6= sj mod p pro kaˇzd´e 1 ≤ i < j ≤ n. To znamen´a, ˇze funkce φp (x) = x mod p je perfektn´ı pro S. Podle vˇety o rozloˇzen´ı prvoˇc´ısel existuje konstanta a takov´a, ˇze pt ≤ at ln t pro kaˇzd´e t, tedy ln D ln D ln D ln D ) ln(1 + c ) ≤ 2ac ln(2c )≤ ln ln D ln ln D ln ln D ln ln D ln D ln D ln D + 2ac ln( ) = O(ln D) = O(n2 ln N ). 2ac ln 2c ln ln D ln ln D ln ln D
p ≤a(1 + c
39
Vˇ eta. Pro kaˇzdou n-prvkovou mnoˇzinu S ⊆ U existuje prvoˇc´ıslo p o velikosti O(n2 ln D) takov´e, ˇze funkce φp (x) = x mod p je perfektn´ı pro S. Test, zda funkce φp (x) = x mod p je perfektn´ı pro S, vyˇzaduje ˇcas O(n log n). Tedy systematick´e hled´an´ı nejmenˇs´ıho p, ˇze φp je perfektn´ı pro S, vyˇzaduje ˇcas O(n3 log n log N ). Nejmenˇs´ı p takov´e, ˇze φp je perfektn´ı pro S, je prvoˇc´ıslo. Navrhneme pravdˇepodobnostn´ı algoritmus pro nalezen´ı p. Existuje konstanta a takov´a, ˇze mezi prvn´ımi an2 ln N prvoˇc´ısly je alespoˇ n polovina takov´ ych prvoˇc´ısel p, ˇze φp je perfektn´ı pro S. Algoritmus pak opakuje n´asleduj´ıc´ı krok, dokud nenalezne perfektn´ı funkci vyberme n´ahodnˇe prvoˇc´ıslo p mezi prvn´ımi an2 ln N prvoˇc´ısly a otestujme, zda φp je perfektn´ı Odhad oˇcek´avan´eho poˇctu ne´ uspˇeˇsn´ ych krok˚ u. 2 N´ahodnˇe zvolen´e ˇc´ıslo p ≤ an ln N je prvoˇc´ıslo s pravdˇepodobnost´ı Θ( ln(an21 ln N) ) a pro prvoˇc´ıslo p je φp perfektn´ı s pravdˇepodobnost´ı ≥ 12 . Tedy n´ahodnˇe zvolen´e ˇc´ıslo p ≤ an2 ln N y poˇcet ne´ uspˇeˇsn´ ych test˚ u splˇ nuje test s pravdˇepodobnost´ı Θ( ln(an21 ln N) ), a proto oˇcek´avan´ 2 je O(ln(an ln N ). Tedy oˇcek´avan´ y ˇcas algoritmu je O(n log n(log n + log log N )). Vˇ eta. Pro danou mnoˇzinu S ⊆ U takovou, ˇze |S| = n, deterministick´ y algoritmus nalezne prvoˇc´ıslo p = O(n2 log N ) takov´e, ˇze φp (x) = x mod p je perfektn´ı pro S, a pracuje v ˇcase O(n3 log n log N ), a pravdˇepodobnostn´ı algoritmus nalezne prvoˇc´ıslo p = O(n2 log N ) takov´e, ˇze φp je perfektn´ı, v oˇcek´ avan´em ˇcase O(n log n(log n + log log N ). Deterministick´ y algoritmus nalezne nejmenˇs´ı prvoˇc´ıslo s poˇzadovanou vlastnost´ı. Pravdˇepodobnostn´ı algoritmus nalezne prvoˇc´ıslo, kter´e m˚ uˇze b´ yt podstatnˇe vˇetˇs´ı, ale jeho velikost je 2 omezena an log N pro konstantu a, kter´a je vˇetˇs´ı neˇz konstanta v odhadu na velikost p v deterministick´em algoritmu. Nyn´ı navrhneme postup na konstrukci perfektn´ı haˇsovac´ı funkce pro mnoˇzinu S ⊆ U . 1) Nalezneme prvoˇc´ıslo q0 ∈ O(n2 log N ) takov´e, ˇze φq0 (x) = x mod q0 je perfektn´ı funkce pro S. Poloˇzme S1 = {φq0 (s) | s ∈ S}. 2) Nalezneme prvoˇc´ıslo q1 takov´e, ˇze 1 + n(n − 1) ≤ q1 ≤ 2 + 2n(n − 1). Pak existuje l ∈ {1, 2, . . . , q0 − 1} takov´e, ˇze hl (x) = ((lx) mod q0 ) mod q1 je perfektn´ı pro S1 ⊆ {0, 1, . . . , q0 − 1}. Poloˇzme S2 = {hl (s) | s ∈ S1 }. 3) Podle pˇredchoz´ı vˇety zkonstruujme perfektn´ı haˇsovac´ı funkci g pro podmnoˇzinu S2 univerza {0, 1, . . . , q1 − 1} do tabulky s m´enˇe neˇz 3n ˇr´adky. Poloˇzme f (x) = g(hl (φq0 (x))). Konstruovan´a haˇsovac´ı funkce je f . V´ ysledek: f je perfektn´ı haˇsovac´ı funkce pro S, protoˇze sloˇzen´ı perfektn´ıch haˇsovac´ıch funkc´ı je zase perfektn´ı funkce, a tedy poˇzadavek 1) je splnˇen. f haˇsuje S do tabulky s m´enˇe neˇz 3n ˇr´adky, a tedy splˇ nuje poˇzadavek 2). Protoˇze kaˇzd´ a z funkc´ı g, hl , φq0 se vyˇc´ısl´ı v ˇcase O(1), i vyˇc´ıslen´ı funkce f vyˇzduje ˇcas O(1) a poˇzadavek 3) je splnˇen. Funkce φq0 je jednoznaˇcnˇe urˇcena ˇc´ıslem q0 ∈ O(n2 log N ). Funkce hl je urˇcena ˇc´ısly q1 ∈ O(n2 ) a l ∈ O(q0 ). Funkce g je urˇcena n + 1 ˇc´ısly velikosti O(q1 ). Tedy zad´an´ı f vyˇzaduje pamˇet o velikosti O(log n + log log N + n log n) = O(n log n + log log N ).
40
Lze ˇr´ıct, ˇze poˇzadavek 4) je splnˇen. V´ ypoˇcet φq0 vyˇzaduje ˇcas O(n3 log n log N ). V´ ypoˇcet hl vyˇzaduje ˇcas O(n(n2 log N )) = O(n3 log N ) (pouˇzit´e univerzum je {0, 1, . . . , q0 }). V´ ypoˇcet g vyˇzaduje ˇcas O(nn2 ) = O(n3 ) (zde univerzum je {0, 1, . . . , q1 }). Celkovˇe, v´ ypoˇcet f vyˇzaduje ˇcas O(n3 log n log N ). Lze pouˇz´ıt i pravdˇepodobnostn´ı algoritmy pro nalezen´ı g, hl a φq0 . Pak haˇsujeme do tabulky s m´enˇe neˇz 9n ˇr´adky, ale oˇcek´avan´ y ˇcas pro nalezen´ı f je O(n log n(log n + log log N )). Tuto metodu navrhli Fredman, Koml´ os a Szemer´edi.
41
Pˇredn´ aˇska 6 Nev´ yhody navrˇzen´e metody: Navrˇzen´a metoda pracuje pro m < 3n, ale nezajist´ı m = n. Lze ˇr´ıct, ˇze pamˇeˇt je efektivn´ı vyuˇzit´a? Existuje metoda, kter´a by umoˇznila n´avrh perfektn´ı haˇsovac´ı funkce pro m = n? Z v´ ysledk˚ u pro (N, m, n)-perfektn´ı soubory funkc´ı plyne existence (N, n, n)perfektn´ıho souboru pro nN > en+ln(n) ln(N ). Zm´ın´ıme se orientaˇcnˇe o parametrizovan´e metodˇe, kter´a navrhuje perfektn´ı haˇsovac´ı funkci pro S ⊆ U a pro m = |S|. Parametr bude pˇrirozen´e ˇc´ıslo r, kter´e urˇcuje, jak´e hypergrafy jsou uˇzity pˇri konstrukci funkce. Proto nejdˇr´ıve pˇripomeneme p´ar definic. Dvojice (X, E), kde X je mnoˇzina a E je syst´em r-prvkov´ ych podmnoˇzin X, se naz´ yv´ a yvaj´ı hrany r-hypergrafu. Cyklus je hypergraf (X, E), kde r-hypergraf. Prvky v E se naz´ kaˇzd´ y vrchol leˇz´ı alespoˇ n ve dvou r˚ uzn´ ych hran´ach. Naopak r-hypergraf (X, E) se naz´ yv´ a acyklick´ y, kdyˇz ˇz´adn´ y jeho podhypergraf nen´ı cyklus. Nyn´ı pop´ıˇseme metodu, kter´a je rozdˇelena do dvou krok˚ u. Je d´ano S ⊆ U takov´e, ˇze |S| = n. Krok 1) Mˇejme r-hypergraf (V, E), kde |E| = n. Nalezneme zobrazen´P ıg :V − → {0, 1, . . . , m− r 1} takov´e, ˇze funkce h : E − → {0, 1, . . . , m − 1} definovan´a h(e) = i=1 g(vi ) mod m, kde e = {v1 , v2 , . . . , vr }, je prost´a (m´ısto sˇc´ıt´an´ı modulo m m˚ uˇzeme pouˇz´ıt libovolnou grupovou operaci na mnoˇzinˇe {0, 1, . . . , m − 1}). Pro acyklick´ y r-hypergraf lze funkci g zkonstruovat n´asleduj´ıc´ım postupem. Zvol´ıme bijekci h : E − → {0, 1, . . . , m − 1} a pak definujeme g n´asledovnˇ e : kdyˇ z e = {v , v , . . . , v } a g(v ) je definov´ ano pro i = 2, 3, . . . , r, pak g(v1 ) = 1 2 r i Pr h(e) − i=2 g(vi ) mod m. Protoˇze pro kaˇzd´ y acyklick´ y r-hypergraf existuje vrchol, kter´ y leˇz´ı v jedin´e hranˇe, lze tento postup pouˇz´ıt ke konstrukci g pomoc´ı indukce (a tedy m´ ame algoritmus pro konstrukci g). Krok 2) Nalezneme r funkc´ı f1 , f2 , . . . , fr : S − → V takov´ ych, ˇze (V, E), kde E = {{f1 (x), f2 (x), . . . , fr (x)} | x ∈ S}, je acyklick´ y r-hypergraf. Autoˇri dok´ azali, ˇze nejvhodnˇejˇs´ı alternativa je, kdyˇz zobrazen´ı f1 , f2 , . . . , fr jsou n´ahodn´a zobrazen´ı n´ahodnˇe zvolen´a. Bohuˇzel takov´a zobrazen´ı neum´ıme zkonstruovat, ale autoˇri uk´azali, ˇze pro tyto u ´ˇcely lze pouˇz´ıt n´ahodn´ y v´ ybˇer funkc´ı z nˇejak´eho c-univerz´aln´ıho souboru funkc´ı. Autoˇri uk´azali, ˇze jejich algoritmus vyˇzaduje O(rn+|V |) ˇcasu a O(n log n+r log |V |) pamˇeti. Tento metapostup navrhli Majewski, Wormald, Havas a Czech (1996). Pro praktick´e pouˇzit´ı je problematick´a reprezentace r-hypergrafu a i n´ahodn´a volba funkc´ı f1 , f2 , . . . , fr (viz pˇredchoz´ı diskuze o c-univerzalitˇe). Z poˇzadavk˚ u na perfektn´ı haˇsovac´ı funkci je opˇet probl´emem splnˇen´ı poˇzadavku 4). Nev´ım, jak je uveden´a metoda prakticky pouˇziteln´a a zda se nˇekde pouˇz´ıv´a.
42
Metoda navrˇzen´a Fredmanem, Komlosem a Szemeredim nepodporuje operaci INSERT. To vedlo k navrˇzen´ı modifikace, kter´a by INSERT podporovala. Navrˇzen´a metoda je kombinac´ı metody Fredmana, Komlose a Szemerediho s metodou, kter´a ˇreˇs´ı pˇreplnˇen´ı, a obecnou metodou dynamizace vyhled´avac´ıho probl´emu (viz letn´ı semestr). Operace DELETE realizujeme principem faleˇsn´eho DELETE. Popis reprezentace: Je d´ana konstanta c takov´a, ˇze 0 < c < 1, a funkce σ takov´ a, ˇze σ(n) ∈ Θ(n). Reprezentovan´a mnoˇzina S ⊆ U = {0, 1, . . . , N − 1} takov´a, ˇze |S| = n. D´ana ˇc´ısla q ˇ i = 0 a n ≤ q, nebo i > 0 a 2i−1 q ≤ n ≤ 2i q. Zvol´ıme ˇc´ıslo a ∈ a i takov´a, ˇze bud {1, 2, . . . , N − 1} takov´e, ˇze σ(2i q)−1 X (bai ) < n i=0
(zde uvaˇzujeme funkce ha (x) = (ax mod N ) mod σ(2i q) a modifikac´ı pˇredchoz´ıho postupu dostaneme, ˇze existuje funkce σ takov´a, ˇze alespoˇ n polovina a splˇ nuje tuto nerovnost). qi Pro kaˇzd´e i je d´ano qi takov´e, ˇze 2 ≤ |Si | ≤ qi pro kaˇzd´e i = 0, 1, . . . , σ(2i q) − 1, kde Si = {s ∈ S | ha (s) = i}. Poloˇz´ıme si = 2qi (qi − 1). Pˇredpokl´ad´ame, ˇze je splnˇeno σ(2i q)−1
(∗)
X i=0
si ≤
32(2i q)2 + 4(2i q) σ(2i q)
a pro kaˇzd´e i = 0, 1, . . . , σ(2i q)−1 je zvoleno ai takov´e, ˇze funkce hai (x) = (ai x mod N ) mod qi je perfektn´ı pro Si . Kaˇzd´a mnoˇzina Si je uloˇzena do tabulky s si ˇr´adky. D´ale je uloˇzena promˇenn´a count takov´a, ˇze 0 ≤ count ≤ (1 + c)2i q. Neform´aln´ı popis operac´ı: Operace INSERT(x). Kdyˇz x nen´ı prvkem mnoˇziny S a |Si |+1 > qi nebo count ≥ (1+c)2i q, pak pˇrid´ame x do S a nalezneme celou novou reprezentaci. Kdyˇz x nen´ı prvkem mnoˇziny S a |Si | + 1 ≤ qi a count < 2i q, pak spoˇc´ıt´ame i = ha (x) a vloˇz´ıme x do tabulky reprezentuj´ıc´ı Si . Pokud na m´ıstˇe hai (x) je oznaˇcen´ y prvek nebo pokud je m´ısto pr´azdn´e, vloˇz´ıme tam x a odstran´ıme oznaˇcen´ı. Pokud tam je nˇejak´ y prvek Si , pak nalezneme nov´e ai takov´e, aby hai bylo perfektn´ı pro mnoˇzinu Si ∪ {x}, a spoˇc´ıt´ame reprezentaci mnoˇziny Si ∪ {xi } vzhledem k nov´e funkci hai (pˇritom odstran´ıme oznaˇcen´e prvky). Zvˇetˇs´ıme count o 1. DELETE(x). Kdyˇz x ∈ S, pak oznaˇc´ıme x. Kdyˇz count ≥ (1 + c)2i q, pak nalezneme celou novou reprezentaci, jinak zvˇetˇs´ıme count o 1. Nov´a reprezentace: Vytvoˇr´ıme seznam prvk˚ u v S (odstran´ıme oznaˇcen´e prvky). Nalezneme ˇ ˇc´ıslo i takov´e, aby bud i = 0 a |S| ≤ q, nebo 2i−1 q ≤ |S| ≤ 2i q, pak nalezneme a takov´e, aby platilo (*). Nalezneme Si = {s ∈ S | ha (s) = i}. Poloˇz´ıme qi = 2|Si | a nalezneme ai takov´e, aby hai bylo perfektn´ı pro Si , a spoˇc´ıt´ame reprezentaci Si pomoc´ı hai . Poloˇz´ıme count = 0. Uveden´a metoda vyˇzaduje O(n) prostoru, operace MEMBER vyˇzaduje O(1) ˇcasu v nejhorˇs´ım pˇr´ıpadˇe a oˇcek´avan´a amortizovan´a sloˇzitost operac´ı INSERT a DELETE je tak´e O(1). Dokonce byly nalezeny doln´ı odhady, kter´e ukazuj´ı, ˇze uveden´a metoda je optim´ aln´ı.
43
Extern´ı haˇsov´ an´ı ˇ s´ıme jin´ Reˇ y probl´em – uloˇzen´ı dat na extern´ı pamˇeˇt. Hlavn´ı probl´em – minimalizovat pˇr´ıstup na extern´ı pamˇeˇt. Pˇredpoklady: Extern´ı pamˇeˇt je rozdˇelena na str´anky, kaˇzd´a str´anka obsahuje b poloˇzek (dat) (pˇredpokl´ad´ame, ˇze b > 1, jinak to nem´a smysl). Vˇzdy v jednom kroku naˇcteme celou str´anku do intern´ı pamˇeti nebo celou str´anku v intern´ı pamˇeti v jednom kroku zap´ıˇseme na extern´ı medium. Tyto operace jsou ˇr´adovˇe pomalejˇs´ı neˇz oprace v intern´ı pamˇeti. N´aˇs c´ıl: Nal´ezt zp˚ usob ukl´ad´an´ı dat do str´anek extern´ı pamˇeti, aby se minimalizoval poˇcet operac´ı s extern´ı pamˇet´ı. Pˇredpokl´adejme, ˇze h : U − → {0, 1}∗ je prost´a funkce takov´a, ˇze d´elka h(u) je stejn´ a pro vˇsechny prvky univerza U . Oznaˇcme k d´elku h(u) pro u ∈ U . Pak h je haˇsovac´ı funkce. Nechˇt S ⊆ U , pak pro slovo α d´elky menˇs´ı neˇz k definujme h−1 S (α) = {s ∈ S | −1 ˇ α je prefix h(s)}. Rekneme, ˇze α je kritick´e slovo, kdyˇz 0 < |hS (α)| ≤ b a pro kaˇzd´ y −1 ′ ′ vlastn´ı prefix α slova α plat´ı |hS (α )| > b. Pro kaˇzd´e s ∈ S existuje pr´avˇe jedno kritick´e slovo α, kter´e je prefixem h(s). Definujme d(s) pro s ∈ S jako d´elku kritick´eho slova, kter´e je prefixem h(s) a (.S) = max{d´elka(α) | α je kritick´e slovo} = max{d(s) | s ∈ S}. Mnoˇzinu S reprezentujeme tak, ˇze je jednoznaˇcn´a korespondence mezi kritick´ ymi slovy a str´ankami extern´ı pamˇeti slouˇz´ıc´ımi k reprezentaci S. Na str´ance pˇr´ısluˇsej´ıc´ı kritick´emu slovu α je reprezentov´an soubor h−1 S (α). Probl´em: jak nal´ezt str´anku kritick´eho slova α? ˇ sen´ı: Adres´aˇr je funkce, kter´a kaˇzd´emu slovu α o d´elce d(S) pˇriˇrad´ı adresu str´ Reˇ anky pˇredpisem kdyˇz kritick´e slovo β je prefizem α, pak k α je pˇriˇrazena str´anka koresponduj´ıc´ı s β, jinak je k α pˇriˇrazena str´anka NIL – speci´aln´ı pr´azdn´a str´anka. −1 Korektnost: Pro r˚ uzn´a kritick´a slova β a γ plat´ı h−1 zd´e S (β) ∩ hS (γ) = ∅, a tedy pro kaˇ slovo α d´elky d(S) existuje nejv´ yˇse jedno kritick´e slovo, kter´e je prefixem α. Kdyˇz α je slovo d´elky d(S), pak nastane jeden z tˇechto tˇr´ı pˇr´ıpad˚ u: −1 e slovo β, kter´e je prefixem α; (1) h−1 S (α) 6= ∅, pak 0 < |hS (α)| ≤ b a existuje kritick´ ′ ′ (α) = ∅ a existuje prefix α slova α takov´ y , ˇ z e o < |h−1 (2) h−1 S S (α )| ≤ b, pak existuje kritick´e slovo, kter´e je prefixem α′ (a tedy tak´e prefixem α); ˇ h−1 (α′ ) = ∅ nebo |h−1 (α′ )| > b zd´ y prefix α′ slova α plat´ı bud (3) h−1 S S S (α) = ∅ a pro kaˇ (pak k α je pˇriˇrazena str´anka NIL.
Mˇejme slovo α o d´elce d(S). Oznaˇcme c(α) nejkratˇs´ı prefix α′ slova α takov´ y, ˇze str´ anka pˇriˇrazen´a slovu β o d´elce d(S), kter´e m´a α′ za prefix, je stejn´a jako str´anka pˇriˇrazen´ a α. −1 Vˇsimnˇeme si, ˇze kdyˇz hS (α) 6= ∅, pak c(α) je kritick´e slovo. Plat´ı silnˇejˇs´ı tvrzen´ı, kter´e tvrd´ı, ˇze n´asleduj´ıc´ı podm´ınky jsou ekvivalentn´ı: (1) str´anka pˇriˇrazen´a slovu α je r˚ uzn´a od NIL; (2) c(α) je kritick´e slovo; (3) nˇejak´ y prefix α je kritick´e slovo.
44
Vˇsimnˇeme si, ˇze znalost adres´aˇre umoˇzn ˇuje nal´ezt slovo c(α) pro kaˇzd´e slovo o d´elce d(S). Line´arn´ı uspoˇr´ad´an´ı na slovech d´elky n nazveme lexikografick´e, kdyˇz α < β, pr´avˇe kdyˇz α = γ0α′ a β = γ1β ′ pro nˇejak´a slova γ, α′ a β ′ . Lexikografick´e uspoˇr´ad´an´ı vˇzdy existuje a je jednoznaˇcn´e. Reprezentace adres´aˇre: Je to seznam adres str´anek o d´elce 2d(S) takov´ y, ˇze adresa na i-t´em m´ıstˇe odpov´ıd´a i-t´emu slovu d´elky d(S) v lexikografick´em uspoˇr´ad´an´ı. Pˇr´ıklad: U je mnoˇzina vˇsech slov nad {0, 1} o d´elce 5, h je identick´a funkce a b = 2. Reprezentujme mnoˇzinu S = {00000, 00010, 01000, 10000}. Pak d(00000) = d(00010) = d(01000) = 2, d(10000) = 1, kritick´a slova jsou 00, 01 a 1 a adres´aˇr je (m´ısto adresy str´ anky uvedeme mnoˇzinu, kter´a je na t´eto str´ance uloˇzena) 00 7→ {00000, 00010},
01 7→ {01000},
10 7→ 11 7→ {10000}.
Tedy c(00) = 00, c(01) = 01 a c(10) = c(11) = 1. Kdyˇz odstran´ıme prvek 10000, pak 1 pˇrestane b´ yt kritick´e slovo a adres´aˇr bude m´ıt tvar 00 7→ {00000, 00010},
01 7→ {01000},
10 7→ 11 7→ NIL .
Zase plat´ı c(00) = 00, c(01) = 01 a c(10) = c(11) = 1. V adres´aˇri je tak´e uloˇzeno d(S). Slovn´ı popis operac´ı. Pˇredpokl´ad´ame, ˇze adres´aˇr je uloˇzen v extern´ı pamˇeti na jedn´e str´ ance. MEMBER(x) 1) Spoˇc´ıt´ame h(x) a nat´ ahneme adres´aˇr do intern´ı pamˇeti. Vezmeme prefix α slova h(x) o d´elce d(S) a nalezneme adresu str´anky pˇr´ısluˇsej´ıc´ı k α. Kdyˇz je to str´anka NIL, pak x ∈ /S a konec, jinak pokraˇcujeme krokem 2). 2) Nat´ ahneme str´anku pˇr´ısluˇsej´ıc´ı k α do intern´ı pamˇeti. Prohled´ame ji a pokud neobsahuje x, pak x ∈ / S a konec. Kdyˇz obsahuje x, pak provedeme poˇzadovan´e zmˇeny a str´ anku uloˇ z´ıme do extern´ı pamˇeti na jej´ı p˚ uvodn´ı m´ısto. Konec. INSERT(x) 1) Spoˇc´ıt´ame h(x) a nat´ ahneme adres´aˇr do intern´ı pamˇeti. Vezmeme prefix α slova h(x) o d´elce d(S) a nalezneme adresu str´anky pˇr´ısluˇsej´ıc´ı k α a slovo c(α). Kdyˇz str´anka pˇriˇrazen´ a k α je NIL, pokraˇcujeme krokem 3), v opaˇcn´em pˇr´ıpadˇe pokraˇcujeme krokem 2). 2) Nat´ ahneme str´anku pˇriˇrazenou slovu α. Kdyˇz x je uloˇzeno na t´eto str´ance, pak skonˇc´ıme. Kdyˇz x nen´ı na t´eto str´ance, pak tam pˇrid´ame slovo x. Pokud na str´ance je nejv´ yˇse b prvk˚ u, pak uloˇ z´ıme str´anku na jej´ı p˚ uvodn´ı m´ısto a skonˇc´ıme. Kdyˇz na str´ance je v´ıce neˇz b prvk˚ u, pak nalezneme nov´a kritick´a slova, kter´a n´am str´anku rozdˇel´ı, a vytvoˇr´ıme dvˇe str´anky – jednu uloˇ z´ıme na m´ısto p˚ uvodn´ı str´anky a druhou uloˇ z´ıme na novou str´ anku. Pokraˇcujeme krokem 4). 3) Vytvoˇr´ıme v intern´ı pamˇeti novou str´anku, kter´a obsahuje x, nalezneme novou str´anku v extern´ı pamˇeti a tam uloˇ z´ıme vytvoˇrenou str´anku (vˇsem slov˚ um, kter´a maj´ı c(α) za prefix, bude pˇriˇrazena tato str´anka) a pokraˇcujeme krokem 4). 4) Nat´ ahneme opˇet adres´aˇr do intern´ı pamˇeti, aktualizujeme adresy pˇriˇrazen´ ych str´ anek a pˇr´ıpadnˇe zvˇetˇs´ıme adres´aˇr (to nastane, kdyˇz nˇejak´e nov´e kritick´e slovo m´a d´elku vˇetˇs´ı neˇz d(S), pak nov´e d(S) je pr´avˇe d´elka tohoto slova – obˇe kritick´a slova vznikl´a v kroku 2) maj´ı stejnou d´elku). Aktualizovan´ y adres´aˇr uloˇ z´ıme do extern´ı pamˇeti. Konec.
45
DELETE(x) 1) Spoˇc´ıt´ame h(x) a nat´ ahneme adres´aˇr do intern´ı pamˇeti. Vezmeme prefix α slova h(x) o d´elce d(S) a nalezneme adresu str´anky pˇr´ısluˇsej´ıc´ı k α a slovo c(α). Kdyˇz str´anka pˇriˇrazen´ a k α je NIL, pak skonˇc´ıme. Oznaˇcme β ′ slovo, kter´e m´a stejnou d´elku jako c(α) a liˇs´ı se od c(α) pouze v posledn´ım bitu. Kdyˇz existuje slovo β d´elky d(S) takov´e, ˇze c(β) = β ′ , pak str´anka pˇriˇrazen´a k β je kandid´at. 2) Nat´ ahneme str´anku pˇr´ısluˇsnou k slovu α do intern´ı pamˇeti. Kdyˇz tato str´anka neobsahuje x, pak skonˇc´ıme. Kdyˇz tato str´anka obsahuje x, pak odstran´ıme x z t´eto str´ anky. Kdyˇz neexistuje kandid´at nebo kdyˇz nov´a str´anka a str´ anka kandid´ata obsahuje v´ıce neˇz b prvk˚ u, pak novou str´anku uloˇ z´ıme na jej´ı p˚ uvodn´ı m´ısto a skonˇc´ıme. 3) Kdyˇz nov´a str´anka a str´anka kandid´ata maj´ı dohromady b prvk˚ u, pak nat´ ahneme str´anku kandid´ata do intern´ı pamˇeti. V intern´ı pamˇeti tyto str´anky spoj´ıme do jedn´e a tuto str´anku pak uloˇ z´ıme do extern´ı pamˇeti. 4) Nat´ ahneme adres´aˇr, kde zaktualizujeme adresy str´anek. Pokud jsme slouˇcili dvˇe str´ an′ ky, mus´ıme nal´ezt nov´e c(α) (je to nejkratˇs´ı prefix α slova α takov´ y, ˇze ke kaˇzd´emu slovu β o d´elce d(S), kter´e m´a α′ za prefix, je pˇriˇrazena jedna z tˇechto adres: adresa str´ anky pˇriˇrazen´a k α, adresa str´anky kandid´ata, NIL) a kaˇzd´emu slovu o d´elce d(S), kter´e m´ a nov´e c(α) za prefix, bude pˇriˇrazena adresa nov´e (spojen´e) str´anky. Otestujeme, zda se adres´ aˇr nem˚ uˇze zkr´atit (to nastane, kdyˇz adresy str´anek pˇriˇrazen´e (2i + 1)-´ımu slovu a (2i + 2)-´emu slovu o d´elce d(S) jsou stejn´e pro vˇsechna i, pak se tato slova spoj´ı a d(S) se zmenˇs´ı o 1). Upraven´ y adres´aˇr uloˇ z´ıme. Konec. N´asleduj´ıc´ı vˇeta ukazuje, ˇze jsme n´aˇs hlavn´ı c´ıl splnili. Vˇ eta. Operace MEMBER vyˇzaduje nejv´ yˇse tˇri operace s extern´ı pamˇet´ı. Operace INSERT a DELETE vyˇzaduj´ı nejv´ yˇse ˇsest operac´ı s extern´ı pamˇet´ı. V naˇsem pˇr´ıkladu provedeme operaci INSERT(00001). Po pˇrid´an´ı prvku str´anka p˚ uvodnˇe pˇriˇrazen´a k slovu 00 vypad´a takto {00000, 00001, 00010}. Tuto str´anku rozdˇel´ıme na str´ anky {00000, 00001} a {00010}. Pˇritom kritick´e slovo prvn´ı str´anky je 0000 a druh´e str´ anky je 0001. Takˇze d(S) = 4 a adres´aˇr vypad´a 0000 7→ {00000, 00001}, 0001 7→ {00010}, 0010 7→ 0011 7→ NIL, 0100 7→ 0101 7→ 0110 7→ 0111 7→ {0100}, 1000 7→ 1001 7→ 1010 7→ 1011 7→ 1100 7→ 1101 7→ 1110 7→ 1111 7→ {10000}. To znamen´a, ˇze kromˇe adresy 00 se ostatn´ı slova rozdˇelila na ˇctyˇri slova, ale adresy z˚ ustaly stejn´e. Jen u slova 00 vznikl´a slova dostala r˚ uzn´e adresy. V p˚ uvodn´ım pˇr´ıkladu provedeme operaci DELETE(01000). Pak kandid´at je 00 a po odstranˇen´ı prvku 01000 nastane spojen´ı tˇechto dvou str´anek. Po aktualizaci adres dostane adres´aˇr tvar 00 7→ 01 7→ {00000, 00010}, 10 7→ 11 7→ {10000} Pak k prvn´ımu a druh´emu slovu je pˇriˇrazena stejn´a str´anka a stejnˇe tak k tˇret´ımu a ˇctvrt´emu slovu. Takˇze m˚ uˇzeme adres´aˇr zmenˇsit. Pak d(S) = 1 a adres´aˇr m´a podobu 0 7→ {00000, 00010}, 1 7→ {10000}. Vznik´a ot´ azka, jak je tato metoda efektivn´ı. Hlavnˇe jak efektivnˇe vyuˇz´ıv´a pamˇeˇt. Plat´ı
46
Vˇ eta. Pˇri reprezentaci mnoˇziny S o velikosti n je oˇcek´ avan´ y poˇcet pouˇzit´ ych str´ anek e 1+ 1b a oˇcek´ avan´ a velikost adres´ aˇre b ln 2 n .
n b ln 2
Prvn´ı tvrzen´ı ˇr´ık´a, ˇze oˇcek´avan´ y poˇcet prvk˚ u na str´ance je b ln 2 ≈ 0.69b. Tedy zaplnˇeno je asi 69% m´ıst. Tento v´ ysledek nen´ı pˇrekvapuj´ıc´ı a je akceptovateln´ y. Horˇs´ı je to s adres´ aˇrem, jak ukazuje n´asleduj´ıc´ı tabulka
velikost S 2 10 50 100
105 6.2 · 107 1.2 · 105 9.8 · 103 4.4 · 103
106 1.96 · 108 1.5 · 106 1.0 · 106 4.5 · 104
108 1.96 · 1011 2.4 · 108 1.1 · 108 4.7 · 106
1010 1.96 · 1014 3.9 · 1010 1.2 · 1010 4.9 · 108
kde jednotliv´e ˇr´adky odpov´ıdaj´ı hodnot´am b uveden´ ych v prvn´ım sloupci. Protoˇze oˇcek´ avan´ a 1 avat, velikost adres´aˇre se zvˇetˇsuje rychleji neˇz line´arnˇe (exponent u n je 1+ b ), tak nelze oˇcek´ ˇze tuto metodu lze vˇzdy pouˇz´ıt. V´ ypoˇcty i experimenty ukazuj´ı, ˇze pouˇziteln´a je do velikosti |S| = 1010 , kdyˇz b ≈ 100. V tomto rozmez´ı je n´ar˚ ust adres´aˇre jen kolem 5%. Pro vˇetˇs´ı n je tˇreba, aby b bylo jeˇstˇe vˇetˇs´ı.