Datov´ e struktury ´ 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). To vede k detailn´ı anal´ yze 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´ı. ˇ s´ıme tzv. slovn´ıkov´ Reˇ 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. Efektivita algoritmu: ˇcasov´a sloˇzitost, prostorov´a sloˇzitost; ˇ v nejhorˇs´ım pˇr´ıpadˇe nebo v pr˚ vyˇsetˇren´e bud 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
1
2
´ n´ı Haˇ sova Pomoc´ı bitov´eho 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 Dumney z roku 1956, prvn´ı anal´ yza haˇsov´an´ı poch´ az´ı od Petersona z roku 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) = ∅,
P (7) =< 7 >,
P (3) =< 53, 73 >,
P (1) =< 1, 141, 11, 161 > .
Seznamy nemus´ı b´ yt uspoˇr´adan´e. Algoritmy operac´ı. MEMBER(x): Spoˇc´ıt´ame i := h (x), t := N IL 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 if t = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x): Spoˇc´ıt´ame i := h (x), t := N IL 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 if t 6= x then vloˇz´ıme x do i-t´eho seznamu endif
3
DELETE(x): Spoˇc´ıt´ame i := h (x), t := N IL 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 if t = x then odstran´ıme x z i-t´eho seznamu endif
Předpoklad: Složitost v nejhorším případě:
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 reprezentace prvku s ∈ S vyˇzaduje pamˇeˇt O (1)) pamˇeˇt nen´ı efektivnˇe vyuˇzit´a
Předpoklady analýzy oček. délky řetězců:
Spoˇc´ıt´ame oˇcek´avanou d´elku ˇretˇezc˚ u za pˇredpoklad˚ u
Značení:
Pouˇzit´e znaˇcen´ı: |S| = n, m =poˇcet ˇretˇezc˚ u, |U | = N , n ` (i) =d´elka i-t´eho ˇretˇezce, α = m faktor naplnˇen´ı (load factor)
Důsledky předpokladů:
D˚ usledky pˇredpoklad˚ u:
(1) h je rychle spoˇcitateln´a (tj. O (1)) a nemˇenn´a bˇehem v´ ypoˇctu; −1 (2) h rozdˇeluje univerzum U rovnomˇernˇe (tj. −1 ≤ |h (i) | − |h−1 (j) | ≤ 1 pro i, j ∈ {0, 1, . . . , m − 1}); (3) S je n´ahodnˇe vybran´a z univerza U (tj. pro dan´e n = |S| jsou vˇsechny podmnoˇziny U o velikosti n reprezentovanou mnoˇzinou S se stejnou pravdˇepodobnost´ı); (4) kaˇzd´ y prvek z U m´a stejnou pravdˇepodobnost b´ yt argumentem operace; (5) velikost reprezentovan´e mnoˇziny je v´ yraznˇe menˇs´ı neˇz velikost univerza.
1 m
pro vˇsechna x ∈ U a vˇsechna i = 0, 1, . . . , m − 1; 1 l 1 n−l Prob (` (i) = l) = pn,l = nl m 1− m pro vˇsechna i = 0, 1, . . . , m − 1.
Prob (h (x) = i) =
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 l ) a pro kaˇzd´e x ∈ S \ A plat´ı h (x) 6= i (pravdˇepodobnost tohoto jevu je jevu je m 1 n−l 1− m ). To znamen´a, ˇze jev m´a binomi´aln´ı rozdˇelen´ı.
4
Oˇ cek´ avan´ a d´ elka ˇ retˇ ezc˚ u. n X
l n−l n X 1 1 n 1− = E (l) = lpn,l = l m m l l=0 l=0 l n−l n X 1 1 n! 1− = l l! (n − l)! m m l=0 l−1 n−l n n X 1 1 (n − 1)! 1− = m (l − 1)! (n − l)! m m l=1 l−1 (n−1)−(l−1) n 1 1 n X n−1 1− = l−1 m m m l=1 l n−1−l n−1 n X n−1 1 1 1− = l m m m l=0 n−1 n 1 n 1 = . [Tj. faktor naplnění +1− m m m m
\alpha]
Toto je standardn´ı element´arn´ı v´ ypoˇcet oˇcek´avan´e hodnoty binomi´aln´ıho rozdˇelen´ı. V´ ypoˇ cet druh´ eho momentu. E l2 =E (l (l − 1)) + E (l) , n−l l n X 1 1 n 1− = E(l(l − 1)) = l (l − 1) m m l l=0 (n−2)−(l−2) l−2 n n (n − 1) X n − 2 1 1 1− = m2 m m l−2 l=2 l n−2−l n−2 1 1 n (n − 1) X n − 2 1− = l m2 m m l=0
n (n − 1) Sečte se na 1 podle , 2 m n−1 n n n (n − 1) 2 1+ . + = E l = m2 m m m
binomické věty.
V´ ypoˇ cet rozptylu.
2 2 var (l) =E (l − E (l)) = E l2 − (E (l)) = n n−1 1 n n 2 1+ − 1− . = m m m m m
5
Shrneme v´ ysledky: n 1 n a rozptyl d´elky ˇretˇezc˚ u je m 1− m . Toto jsou standardn´ı Oˇcek´avan´a d´elka ˇretˇezc˚ u je m element´arn´ı odvozen´ı druh´eho momentu a rozptylu binomi´aln´ıho rozdˇelen´ı. Oˇ cek´ avan´ y nejhorˇ s´ı pˇ r´ıpad. Spoˇc´ıt´ame E (N 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
(#1)
i
Pak m˚ uˇzeme poˇc´ıtat: E (N P ) =
X j
(#1) j Prob max ` (i) = j = i
X j Prob max ` (i) ≥ j − Prob max ` (i) ≥ j + 1 = i
j
X j
X j
X j
X j
[Roztrhnu na dvě sumy]
i
X j Prob max ` (i) ≥ j + 1 = j Prob max ` (i) ≥ j − i
i
j
j Prob max ` (i) ≥ j − i
X j
(j − 1) Prob max ` (i) ≥ j =
(j − j + 1) Prob max ` (i) ≥ j =
i
[Přeindexoval jsem]
i
Prob max ` (i) ≥ 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) = i
Prob (` (1) ≥ j ∨ ` (2) ≥ j ∨ · · · ∨ ` (m − 1) ≥ j) ≤ j X 1 n Prob (` (i) ≥ j) ≤ m = j m i Qj−1 j−1 n j−1 1 1 k=0 (n − k) ≤n . 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 alespoˇ n j, jakmile existuje podmnoˇzina A ⊆ S takov´a, ˇze |A| = j (tˇechto moˇznost´ı je nj ) 1 j a pro kaˇzd´e x ∈ A plat´ı h (x) = i (pravdˇepodobnost tohoto jevu je m ).
6
D˚ usledek. n j−1 1 Prob max (` (i)) ≥ j ≤ min 1, n . i m j! Pˇredpoklad: α =
n m
(#2)
≤ 1. Uk´aˇzeme, ˇze pro dostateˇcnˇe velk´a n pro
n j−1 1 j0 = min j | n ≤1 m j! plat´ı j0 ≤
8 log n log log n .
Z
n m
j 2
≤1az
2j
≤ j! plyne
( 2j ) n j−1 1 n j min j | n ≤ 1 ≤ min j | ≤ 1 ≤ min j | n ≤ m j! j! 2
Výraz zanedbáváme, protože <= 1.
(#3)
pro kaˇzd´e n ≥ 1, kde j prob´ıh´a pˇrirozen´a ˇc´ısla. Pro pevn´e n oznaˇcme 2j ) j k + 1 = min j | n ≤ , 2 (
pak k2 k+1 k k+1 2
Jde odhadout shora výrazem 2 log((k+1)/2)
Za pˇredpokladu, ˇze k ≥ 3, tak dost´av´ame, ˇze log log n < 2 log k log k2 k log n < < , k+1 8 4 log 2 log log n
k+1 2
, a odtud plyne
1/2 < ^^
protoˇze pro k ≥ 3 je
1 2
<
( )
log k 2 log k+1 2
. Pˇri sofistikovanˇejˇs´ı metodˇe, kdyˇz se pouˇzije Stirlingova ( ) aproximace log j!, lze dok´ azat, ˇze j0 < (1 + aj ) logloglogn n , kde limj7→∞ aj = 0.
7
Toto pouˇzijeme pˇri odhadu E (N P ). X
E (N P ) =
j
X j
[Počítáme stále očekávanou délku nejdelšího řetězce]
Prob max (` (i)) ≥ j ≤ i
n j−1 1 min 1, n = m j!
j0 X
∞ ∞ X X n n j−1 1 ≤ j0 + = n 1+ m j! j! j=j0 +1 j=1 j=j0 +1 ∞ X 1 j−j0 n X j0 ! j0 + = ≤ j0 + j0 ! j=j +1 j! j + 1 0 j=j +1 0
j0 +
1 j0 +1 − j01+1 +
0
1
= j0 +
1 = O (j0 ) . j0
n ≤ 1, pˇri tˇret´ı nerovnosti jsme pouˇzili, Vysvˇetlen´ı: Pˇri druh´e nerovnosti jsme pouˇzili, ˇze m n ˇze j0 ! ≤ 1 a j−j0 1 j0 ! 1 . = Qj ≤ j! j0 + 1 k=j0+1 k
Shrneme z´ıskan´ y v´ ysledek
n m
≤ 1 je pˇri haˇsov´ ymi ˇretˇezci horn´ı odhad an´ı se separovan´ 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. [Bez důkazu] Vˇ eta. Za pˇredpokladu α =
Oˇ cek´ avan´ y poˇ cet test˚ u. Def:
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´ı – argument operace je mezi prvky reprezentovan´e mnoˇziny, ne´ uspˇeˇsn´e vyhled´av´an´ı – 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 Prob (` (i) = l) =
l
pn,0 +
X
lpn,l =
l
n n 1 + ≈ e−α + α. 1− m m
8
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. ´ eˇ Uspˇ sn´ e vyhled´ 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 Oˇcek´avan´ y poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v nˇejak´em ˇretˇezci je X l + 1 X l+1 pn,l . Prob (` (i) = l) = 2 2 l
l
Oˇcek´an´ y poˇcet test˚ u pˇri vyhled´an´ı vˇsech prvk˚ u v tabulce je m
P
l+1 l 2
Oˇcek´avan´ y poˇcet test˚ u pro vyhled´an´ı jednoho prvku je ! n n n X m X 2 mX l+1 pn,l = l pn,l + lpn,l = 2 n 2n l=0
m 2n
l=0 n X l=1
pn,l .
l=0
l (l − 1) pn,l + 2
n X l=1
lpn,l
!
=
n−1 n (n − 1) 2n = + +1≈ 2 m m 2m α 1 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 1X n−1 1+ =1+ . n i=0 m 2m m 2n
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 vyhled´ 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
9
Příklad:
Volba \alpha:
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 m 2 testy pro ˇretˇezce d´elky 2 – tˇechto pˇr´ıpad˚ u je 6 . 7 1 m Oˇcek´avan´ y poˇcet test˚ u je m 1 5m 6 + 2 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 . n 4 Oˇcek´avan´ y poˇcet test˚ u je n1 1 2n 3 + 2 3 = 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. ´ n´ı s uspor ˇa ´ dany ´ mi separovany ´ mi r ˇetˇ Haˇ sova ezci 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´ı tyt´eˇz 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 avan´ y poˇcet test˚ u pˇri u ´spˇeˇsn´em vyhˇretˇezci je pˇribliˇznˇe e−α + 1 + α2 − α1 (1 − e−α ). Oˇcek´ led´ av´ an´ı pro haˇsov´ an´ı s uspoˇra ´dan´ ymi ˇretˇezci je pˇribliˇznˇe 1 + α2 . [bez důkazu] Uvedeme algoritmy pro operace s uspoˇr´adan´ ymi ˇretˇezci. Algoritmy. MEMBER(x): Spoˇc´ıt´ame i := h (x), t := N IL 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 if t = x then x ∈ S else x ∈ / S endif INSERT(x): Spoˇc´ıt´ame i := h (x), t := N IL if i-t´ y seznam je nepr´azdn´ y then t :=prvn´ı prvek i-t´eho seznamu
10
while t < x a t 6=posledn´ı prvek i-t´eho seznamu do t :=n´asleduj´ıc´ı prvek i-t´eho seznamu enddo endif if t 6= x then if x < t then [Může se stát jen když t je poslední prvek] vloˇz´ıme x do i-t´eho seznamu pˇred prvek t else vloˇz´ıme x do i-t´eho seznamu za prvek t endif endif DELETE(x): Spoˇc´ıt´ame i := h (x), t := N IL 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 if t = x then odstran´ıme x z i-t´eho seznamu endif Nev´ yhody haˇsovan´ı se separovan´ ymi ˇretˇezci – nevyuˇzit´ı alokovan´e pamˇeti (nehospod´arn´e) pouˇz´ıv´an´ı ukazatel˚ u (cache). ˇ 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ředpoklad o datech:
Druhy hašování:
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. ´ n´ı s pr ˇ em´ıst ˇova ´ n´ım Haˇ sova Poloˇzky pro pr´aci s tabulkou: next, previous poloˇzka next – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı n´asleduj´ıc´ı poloˇzku seznamu poloˇzka previous – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı pˇredch´azej´ı poloˇzku seznamu. 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},
11
ˇ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 previous
1
9
73
6
161 53 7 11 141
[Jednotlivé seznamy]
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). Algoritmy. MEMBER(x): Spoˇc´ıt´ame i := h (x) if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then V´ ystup: x ∈ / S, stop endif while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif DELETE(x): Spoˇc´ıt´ame i := h (x) if i.previous 6=pr´azdn´e nebo i.key =pr´azdn´e then stop endif [Nejsem na začátku seznamu] while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo [Hledám prvek x] if i.key = x then [Nalezl jsem prvek x] if i.previous 6=pr´azdn´e then (i.previous) .next := i.next [Můj předchůdce musí ukazovat na mého následníka] if i.next 6=pr´azdn´e then (i.next) .previous := i.previous endif [Můj následník musí ukazovat x po sobě smaže na mého předchůdce] i.key := i.next := i.previous := pr´azdn´e [Prvek svůj řádek v tabulce] else [Předchůdce prvku x není, takže x je první prvek v seznamu] if i.next 6=pr´azdn´e then i.key := (i.next) .key, i.next := (i.next) .next [Zkopíruju následníka na řádek, kde je nyní x] if ((i.next) .next) 6=pr´azdn´e then ((i.next) .next) .previous := i endif [Po přesunutí následníka na (i.next) .key := (i.next) .next := (i.next) .previous := pr´azdn´e pozici x by mohl mít následník else následníka špatnou i.key := pr´azdn´e [Prvek x nemá ani předchůdce ani následníka, mažu klíč] hodnotu previous] endif endif endif
12
INSERT(x): Spoˇc´ıt´ame i := h (x) if i.previous 6= N IL nebo i.key = N IL then [Prázdný seznam nebo neprázdný předek] if i.key = N IL then i.key := x [Do prázdného seznamu jen přidám klíč a hotovo] mám již nějaký prvek v seznamu nebo hůř: do mého seznamu else [Buď prorostl jiný seznam] if neexistuje pr´azdn´ y ˇr´adek tabulky then V´ ystup: pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek tabulky j.key := i.key, j.previous := i.previous, j.next := i.next (j.previous) .next := j if j.next 6= N IL then (j.next) .previous := j endif i, .key := x, i.next := i.previous :=pr´azdn´e endif endif stop endif while i.next 6= N IL a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then V´ ystup: pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek tabulky i.next := j, j.key := x, j.previous := i, stop endif 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 previous
1
9
73 11 161 53 7 28 141
6 5
4
9 4 3
1
První případ. Všimněte si příkazu STOP, tedy toto je jedna větev algritmu. Z nějakého důvodu není použito ELSE, což by bylo přehlednější.
[Přemísťujeme prvek i, protože patří do jiného seznamu, musíme tedy udělat místo pro prvek našeho nového jednoprvkového seznamu.]
[Dojedu si na konec seznamu /nebo najdu vkládaný prvek a končím.]
13 Očekávaný počet testů:
Oˇcek´avan´ y poˇcet test˚ u je stejn´ y jako pro haˇsov´an´ı se separovan´ ymi ˇretˇezci: α + 1 ≈ 1 + u ´spˇeˇsn´e vyhled´av´an´ı: n−1 2m 2 1 n n ne´ uspˇeˇsn´e vyhled´av´an´ı: 1 − m +m ≈ e−α + α, kde m = velikost tabulky, n = velikost S tj. poˇcet uloˇzen´ ych prvk˚ u, α = zaplnˇen´ı.
n m
= faktor
´ n´ı s dvˇ Haˇ sova ema ukazateli Nevýhoda hašování s přemísť. je přemístování:
Nev´ yhoda haˇsov´an´ı s pˇrem´ısˇtov´an´ım je krok 5) v operaci INSERT. Vyˇzaduje v´ıce ˇcasu – operace s pˇrem´ıstˇen´ım poloˇzky. Toto odstraˇ nuje 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´ı poloˇzku seznamu Poloˇzka begin – ˇc´ıslo ˇr´adku tabulky obsahuj´ıc´ı prvn´ı poloˇzku seznamu s touto adresou Stejn´a data jako v minul´em pˇr´ıpadˇe Haˇsovac´ı tabulka:
Pozn:
ˇ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). Algoritmy. MEMBER(x): Spoˇc´ıt´ame i := h (x) if i.begin = pr´azdn´e then V´ ystup: x ∈ / S, stop else i := i.begin endif while i.next 6= pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then
14
V´ ystup: x ∈ S else V´ ystup: x ∈ /S endif DELETE(x): Spoˇc´ıt´ame i := h (x) if i.begin =pr´azdn´e then stop else j := i, i := i.begin endif [j je jakýsi předchozí prvek pro while i.next 6=pr´azdn´e a i.key 6= x do j := i, i := i.next enddo [Hledám klíč x] if i.key = x then if i = j.begin then [Chceme správně nastavit hodnotu begin, pokud by byla smazáním prvku i ovlivněna] if i.next 6=pr´azdn´e then j.begin := i.next else j.begin :=pr´azdn´e endif else j.next := i.next endif i.key := i.next :=pr´azdn´e [Promažeme řádku i] endif INSERT(x): Spoˇc´ıt´ame i := h (x) if i.begin =pr´azdn´e then Přidáváme do prázdného if i.key =pr´azdn´e then i.key := x, i.begin := i else if neexistuje pr´azdn´ y ˇr´adek tabulky then V´ ystup: pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek tabulky j.key = x, i.begin := j endif endif else i := i.begin while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then V´ ystup: pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek tabulky, i.next := j, j.key := x, stop endif endif endif
seznamu.
i]
15 Příklad:
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 begin
1
9
1
73 28 161 7 53 11 141
7
3
5 8
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 test˚ u: 2 u ´spˇeˇsn´ y pˇr´ıpad: 1 + (n−1)(n−2) + n−1 ≈ 1 + α6 + α2 6m2 2m 2 ne´ uspˇeˇsn´ y pˇr´ıpad: ≈ 1 + α2 + α + e−α (2 + α) − 2. ´ n´ı Sr˚ ustaj´ıc´ı haˇ sova Terminologie:
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´ı (kter´e se naz´ yva 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 seznamu. Z´akladn´ı idea: ˇretˇezec zaˇc´ın´a na sv´em m´ıstˇe, ale 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. To znamen´a, ˇze prvky ˇretˇezce, kter´ y zaˇc´ın´a na tomto m´ıstˇe budou uloˇzeny v ˇretˇezci, kter´ y uˇz je uloˇzen na tomto m´ıstˇe, ale jen od tohoto m´ısta d´al. 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´ı ideje: 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´adkem h (x).
16 Příklad:
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
Algoritmy. Algoritmus operace MEMBER je pro obˇe metody stejn´ y. MEMBER(x): Spoˇc´ıt´ame i := h (x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif
5 4 8
17
Metoda LISCH – INSERT(x): Spoˇc´ıt´ame i := h (x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo [Dojedu na konec seznamu] if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then V´ ystup: pˇreplnˇen´ı, stop else nechˇt j je pr´azdn´ y ˇr´adek, j.key := x, i.next := j [Přidám prvek na konec seznamu] endif endif Metoda EISCH – INSERT(x): Spoˇc´ıt´ame k := i := h (x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo [Dojedu na konec seznamu] if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then V´ ystup: pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek tabulky j.next := k.next, k.next := j, j.key := x [Posledním prvkem je nyní druhý prvek a prvkem je vkládaný prvek x] endif endif Operace DELETE:
druhým
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. V´ ybˇer pr´azdn´eho ˇr´adku je pevnˇe dan´ y, to znamen´a, ˇze pˇri stejnˇe obsazen´ ych ˇradc´ıch dostaneme vˇzdy stejn´ y pr´azdn´ y ˇr´adek. Ne´ uspˇ eˇ sn´ e vyhled´ av´ an´ı (sn+1 ∈ / S)..
Oznaˇcen´ı: C (a1 , a2 , . . . , an ; an+1 ) oznaˇcuje poˇcet test˚ u pro zjiˇstˇen´ı, ˇze sn+1 ∈ / S. Plat´ı: oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı v mnoˇzinˇe S je P Def:
C (a1 , a2 , . . . , an ; an+1 ) , mn+1
kde se sˇc´ıt´a pˇres vˇsechny posloupnosti a1 , a2 , . . . , an+1 – 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 ˇ r etˇ e zci, pak poˇ cet P test˚ u je l − i + 1. Proto ˇretˇezec d´elky C (a1 , a2 , . . . , an ; an+1 ) celkem l pˇrispˇel k souˇctu l [Součet aritmetické posloupnosti: L/2 (1+L) = (L over 2) poˇctem test˚ u 1+2+···+l = l + 2 .
+ L]
Pozn: l = L, jen rozdíl mezi l a 1 není vidět, tak používám L.
18 Def: Výpočet pro počet testů v neúsp. př.
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 n X X l cn (l) C(a1 , a2 , . . . , an ; an+1 ) = cn (0) + l+ [Rozdělím na dvě 2 l=1 n n X X l cn (l) , = cn (0) + lcn (l) + Počet testů pro 2 délky l. l=1
sumy]
řetězec
l=1
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, [Nemůžu mít n > m prvků, protože by se mi do tabulky nevešly] n [m^n je počet možností, jak se mohou prvky S vˇsech posloupnost´ı n-adres je m , proto zahašovat do tabulky, každá taková tabulka má cn (0) = (m − n) mn .
Pn
m n prázdných řádků; to že se prázdné řádky opakují nám nevadí, protože počítáme stále součet (SUMU) a ne průměr.]
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 = l=1 2 cn (l). Nejprve rekurentn´ı vztah pro cn (l). Pˇrid´av´ame prvek s 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 l 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
Poslední člen první
n X l cn (l) = Sn = 2 l=1 n X l l (l − 1) cn−1 (l − 1) = [Použili jsme rekurentní vztah] (m − l) cn−1 (l) + 2 2 l=1 ! ! n−1 n X l + 1 X l lcn−1 (l) = [Rozdělili jsme na dvě sumy] (m − l) cn−1 (l) + 2 2 l=0 l=1 n (m − n) cn−1 (n) + první člen druhé sumy 2 0 sumy ! 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
,
19
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 l m − lm + 2l2 = 2 1 2 l m − lm + 2 l2 − l + l = 2 l + l. (m + 2) 2 Rekurence pro Sn d´av´a Sn = (m + 2) Sn−1 + (n − 1) mn−1 = 2
(m + 2) Sn−2 + (m + 2) (n − 2) mn−2 + (n − 1) mn−1 = 3
2
(m + 2) Sn−3 + (m + 2) (n − 3) mn−3 + (m + 2) (n − 2) mn−2 + (n − 1) mn−1 = n−1
0
(m + 2)
S0 +
n−1 X i=0
n−1
(m + 2)
n−1 X
(n − 1 − i)
i=0
n−1
(m + 2)
i
(m + 2) (n − 1 − i) mn−1−i =
n−1 X
i
i=1
m m+2
i
m m+2
(c −
=cTcn
−
Tcn
ncn+1 +
=
n+1 X
i=2 n X i=2
ncn+1 +
n X i=2
ncn+1 − n+2
nc
n X i=1
=
[Je jedno zda suma pojede od "začátku" či "od konce".]
,
kde jsme ˇze S0 = 0. Spoˇc´ıt´ame souˇcet Tcn = Pnvyuˇzili, n i+1 plyne cTc = i=1 ic 1) Tcn
n−1−i
Pn
i=1
i
ici pro n = 1, 2, . . . a c 6= 1. Z
(i − 1) c −
n X
ici =
i=1
! −c= (i − 1) ci − ici
−ci
!
Sečetl jsem pár členů geom. řady
−c=
ci = ncn+1 −
− (n + 1) cn+1 + c . c−1
cn+1 − c = c−1
20
Tedy plat´ı Tcn = Protoˇze
m m+2
2
(c − 1)
6= 1, dost´av´ame, ˇze
Sn = (m + 2)
n−1
(n − 1) "
Výsledný odhad počtu testů při neúspěšném vyhledávání:
ncn+2 − (n + 1) cn+1 + c
m m+2
n+1
−n
m m+2
m m+2 2
−1 n+1
n
.
+
m m+2
= [Zůstalo stejné]
n
m m 1 n+1 −n (m + 2) (n − 1) 4 m+2 m+2 1 n (n − 1) mn+1 − n (m + 2) mn + m (m + 2) = 4 1 n m (m + 2) − mn+1 − 2nmn . 4
# m = + m+2
Oˇcek´avan´ y poˇcet test˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je
n m (m + 2) − mn+1 − 2nmn = mn+1 n mn+1 + 41 m (m + 2) − mn+1 − 2nmn = mn+1 n 2 2n 1 2α 1 1+ −1− ∼1+ e − 1 − 2α . 1+ 4 m m 4 (m − n) mn + nmn +
1 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ˇ Uspˇ sn´ y pˇ r´ıpad (sn+1 ∈ S). 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˚ ua ˇ se pouˇzije l − i + 2 test˚ ted u. Podle pˇredchoz´ı ˇc´asti anal´ yzy dostaneme, ˇze oˇcek´avan´ y poˇcet porovn´an´ı kl´ıˇc˚ u pˇri ne´ uspˇeˇsn´em vyhled´av´an´ı je ! n X 1 l cn (l) = l+ mn+1 2 l=1 1 1 n n+1 n n m (m + 2) − m − 2nm = nm + mn+1 4 n 2 2n 1 1+ . −1+ 4 m m
21 Očekávaný počet testů v úspěšném případě pro metodu LISCH:
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 X i=0
i 1 2i 2 −1 + ] = [ 1+ 4 m m m 1+ 8
n 2 n −1 n 1 1+ m 2 − + = 2 4 1+ m 4 2m −1 n 2 n2 − n 2n + −1− . 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 m 1+ 8n Dtto pro metodu EISCH:
n α 2 n−1 2n 1 1+ + e2α − 1 − 2α + . −1− ∼1+ 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 m n
1 1+ m
n
−1
∼
1 α (e − 1) . α
V´ ypoˇcet je ale komplikovanˇejˇs´ı mus´ı se pouˇz´ıt sloˇzitˇejˇs´ı metoda (metoda EISCH d´av´ a nov´ y 1 prvek hned za m´ısto, kde m´a b´ yt uloˇzen). Chyba aproximace pro tyto odhady je O m .
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. Kdyˇz ˇretˇezec neobsahuje ˇz´adn´ y ˇr´adek z pomocn´e pamˇeti, tak se ˇr´adek s nov´ ym prvkem x vkl´ad´a hned za ˇr´ adek h (x). Idea: pomocn´ a ˇc´ast m´a zabr´anit rychl´emu sr˚ ust´an´ı ˇretˇezc˚ u. DELETE:
Tyto metody nepodporuj´ı pˇrirozen´e efektivn´ı algoritmy pro operaci DELETE.
22
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
Nepřístupná oblast pro hashovací fci: x mod 10
Haˇsovac´ı tabulka vznikla posloupnostmi operac´ı: Pro metodu LICH: INSERT(1), INSERT(73), INSERT(141), INSERT(53), INSERT(11), INSERT(161), INSERT(7). 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 zaplˇ nuj´ı ˇr´adky z pomocn´e ˇc´asti. Pˇri dodrˇzov´an´ı tohoto pravidla takov´ato 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) a 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.
23 LICH
ˇ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)
VICH
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)
EICH
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
Algoritmy. Algoritmus operace MEMBER je pro tyto metody stejn´ y jako pro LISCH a EISCH MEMBER(x): Spoˇc´ıt´ame i := h (x) while i.next 6=pr´azdn´e a i.key 6= x do i := i.next enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: 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. Metoda LICH – INSERT(x): Spoˇc´ıt´ame i := h (x) if i.next = N IL then i.next = x, stop endif while i.next 6= N IL a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then pˇreplnˇen´ı, stop else nechˇt j je pr´azdn´ y ˇr´adek, j.key := x, i.next := j endif endif Metoda EICH – Insert(x): Spoˇc´ıt´ame k := i := h (x) if i.next = N IL then i.next = x, stop endif while i.next 6= N IL a i.key 6= x do i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek tabulky then
24
pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek tabulky j.next := k.next, k.next := j, j.key := x endif endif Metoda VICH – INSERT(x): Spoˇc´ıt´ame i := h (x) if i.next = N IL then i.next = x, stop endif while i.next 6= N IL a i.key 6= x do [Zapamatuju si prvek, který není v if k nen´ı definov´ano a i.next < m then k := i endif pomocné části. ] Pozn´amka: Podm´ınka pro k je splnˇena, kdyˇz jsme byli na zaˇc´atku nebo v pomocn´e ˇca´sti, podm´ınka na i.next je splnˇena, kdyˇz i.next nen´ı v pomocn´e ˇc´asti. i := i.next enddo if i.key 6= x then if neexistuje pr´azdn´ y ˇr´adek then pˇreplnˇen´ı, stop else nechˇt j je voln´ y ˇr´adek, j.key := x if k nen´ı definov´ano then [Když poslední prvek seznamu je v pomocné části] i.next := j else j.next := k.next, k.next := j endif 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, m0 – velikost tabulky, α = mn0 – faktor zaplnˇen´ı, m ı faktor, β=m 0 – adresovac´ λ – jedin´e nez´aporn´e ˇreˇsen´ı rovnice e−λ + λ =
1 . β
Oˇcek´avan´ y poˇcet test˚ u pro metodu LICH ne´ uspˇeˇsn´ y pˇr´ıpad: α e− β + αβ , kdyˇz α ≤ λβ, α 2( β −λ) 1 1 1 α 2 e + + 2λ − − λ , kdyˇz α ≥ λβ − 1 3 − β 4 β 2 β u ´spˇeˇsn´ y pˇr´ıpad: α , kdyˇz α ≤ λβ, 1 + 2β α 1+ β e2( β −λ) − 1 − 2 α − λ 3 − 2 + 2λ + 1 α + λ + λ 1 − 8α
β
β
4
β
4
λβ α
, kdyˇz α ≥ λβ.
25
Oˇcek´avan´ y poˇcet test˚ u pro metodu EICH ne´ uspˇeˇsn´ y pˇr´ıpad: α e− β + αβ , kdyˇz α ≤ λβ, α α 1 α 1 e2( β −λ) 34 + λ2 − 2β + e β −λ β1 − 1 + 14 − 2β , kdyˇz α ≥ λβ + 2β u ´spˇeˇsn´ y pˇr´ıpad: α , kdyˇz α ≤ λβ, 1 + 2β α α α e β −λ − 1 (1 + λ) − αβ − λ ), kdyˇz α ≥ λβ. + αβ 1 + λ2 + 2β 1 + 2β Oˇcek´avan´ y poˇcet test˚ u pro metodu VICH ne´ uspˇeˇsn´ y pˇr´ıpad: −α β e + αβ , kdyˇz α ≤ λβ, α 2( β −λ) 1 1 α 2 1 − 1 3 − β + 2λ − 2 β − λ , kdyˇz α ≥ λβ β + 4 e u ´spˇeˇsn´ y pˇr´ıpad: α , kdyˇz α ≤ λβ, 1 + 2β α α α 1 + 2β e β −λ − 1 (1 + λ) − αβ − λ )+ + αβ 1 + λ2 + 2β kdyˇz α ≥ λβ. 0 Chyba aproximace pro tyto odhady je O log √mm0 .
1−β α
α β
α − λ − e β −λ + 1 ,
´ n´ı s linea ´ rn´ım pr ˇ ida ´ va ´ n´ım Haˇ sova 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. Tato metoda byla motivov´ana snahou o co nejvˇetˇs´ı vyuˇzit´ı pamˇeti. 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. Pˇri vyhled´av´an´ı je tˇreba testovat, zda nevyˇsetˇrujeme podruh´e prvn´ı vyˇsetˇrovan´ y ˇr´adek a pro zjiˇstˇen´ı pˇreplnˇen´ı je vhodn´e m´ıt uloˇzen poˇcet vyplnˇen´ ych ˇr´adk˚ u v tabulce. Pro standarn´ı pamˇeti nen´ı v´ yhodn´a. Pˇri pouˇziti cache-pamˇeti se v´ yraznˇe mˇen´ı jej´ı ohodnocen´ı, protoˇze minimalizuje poˇcet pˇrechod˚ u mezi r˚ uzn´ ymi typy pamˇet´ı. Proto se tato metoda doporuˇcuje pro poˇc´ıtaˇce s cache-pamˇet´ı. MEMBER(x): Spoˇc´ıt´ame i := h (x), h := i if i.key = x then V´ ystup x ∈ S, stop endif if i.key =pr´azdn´ y then V´ ystup: x ∈ / S, stop endif i := i + 1 while i.key 6=pr´azdn´ y a i.key 6= x a i 6= h do i := i + 1 mod m enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x): Spoˇc´ıt´ame i := h (x), j := 0
26
while i.key 6=pr´azdn´ y a i.key 6= x a j < m do i := i + 1 mod m, j := j + 1 enddo if j = m then V´ ystup: pˇreplnˇen´ı, stop endif if i.key =pr´azdn´ y then i.key := x 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. Insert 35
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key 1 11 73 141 161 53 7
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key 1 11 73 141 161 53 7 35
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 Oˇcek´avan´ y poˇcet test˚ u: t´eto metody. 2 1 ne´ uspˇeˇsn´ y pˇr´ıpad: ≈ 21 1 + 1−α , 1 . u ´spˇeˇsn´ y pˇr´ıpad: ≈ 21 1 + 1−α ´ n´ı Dvojit´ e haˇ sova
Nevýhoda lin. haš.:
Tabulka:
Pozn:
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 ˇr´adek (h1 (x) + ih2 (x)) mod m je pr´azdn´ y, 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 .
27
Algoritmy. MEMBER(x): Spoˇc´ıt´ame i := h1 (x), h := h2 (x), j := 0 while i.key 6=pr´azdn´ y a i.key 6= x a j < m do i := i + h mod m, j := j + 1 enddo if i.key = x then V´ ystup: x ∈ S else V´ ystup: x ∈ / S endif INSERT(x): Spoˇc´ıt´ame i := h1 (x), h := h2 (x), j := 0 while i.key 6=pr´azdn´ y a i.key 6= x a j < m do i := i + h mod m, j := j + 1 enddo if j = m then V´ ystup: pˇreplnˇen´ı, stop endif if i.key =pr´azdn´ y then i.key := x endif Komplik. předpis funkce h_2:
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. Insert 35
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key 11 1 73 141 7 53 161
ˇr´adek P(0) P(1) P(2) P(3) P(4) P(5) P(6) P(7) P(8) P(9)
key 11 1 35 73 141 7 53 161
Tabulka vznikla posloupnost´ı operac´ı: INSERT(1), INSERT(73), INSERT(53), INSERT(141), INSERT(161), INSERT(11), INSERT(7). 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 pro kaˇzd´e j = 0, 1, . . . , i − 1 je ˇr´adek h1 (x) + jh2 (x) obsazen. Pak n(n−1) n , q2 (n, m) = m(m−1) a obecnˇe q0 (n, m) = 1, q1 (n, m) = m Qi−1
j=0
qi (n, m) = Qi−1
(n − j)
j=0 (m − j)
.
28
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˚ ua n jich je obsazeno. Podle definice plat´ı: C (n, m) =
n X j=0
(j + 1) (qj (n, m) − qj+1 (n, m)) =
n X
qj (n, m) .
j=0
n D´ale plat´ı C (0, m) = 1 pro kaˇzd´e m a qj (n, m) = m qj−1 (n − 1, m − 1) pro vˇsechna j, n > 0 [q_{j 1}(n 1,m 1) ... nějak je závorka uskočená a m > 1. Odtud n−1 n X X n n qj (n − 1, m − 1) = 1 + C (n − 1, m − 1) . C (n, m) = qj (n, m) = 1 + m j=0 m j=0
m+1 m+1 Indukc´ı uk´aˇzeme, ˇze C (n, m) = m−n+1 . Kdyˇz n = 0, pak C (0, m) = m−0+1 = 1 a tvrzen´ı plat´ı. Pˇredpokl´ad´ame, ˇze tvrzen´ı plat´ı pro n − 1 ≥ 0 a pro kaˇzd´e m ≥ n − 1 a dok´ aˇzeme tvrzen´ı pro n a m ≥ n. Plat´ı n C (n, m) =1 + C (n − 1, m − 1) = m n ((m − 1) + 1) 1+ = m ((m − 1) − (n − 1) + 1) m+1 n = . 1+ m−n+1 m−n+1
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ˇ Uspˇ sn´ 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 1X 1 X m+1 C (i, m) = = n i=0 n i=0 m − i + 1 m+1 m−n+1 X 1 m + 1 X 1 ≈ − n j j j=1 j=1 1 1 m+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 0.999 100 1000 4.65 6.9
: ( ]
29
´ n´ı efektivity Porovna 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ˇ Uspˇ sn´ e vyhled´ av´ an´ı. 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´ı jsou metody VICH a LICH stejn´e a jsou o 8% lepˇs´ı neˇz EICH a o 15% neˇz metody LISCH a EISCH. 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. Oˇ cek´ avan´ y poˇ cet test˚ u pˇ ri u ´ plnˇ e zaplnˇ en´ e tabulce. ˇ Metoda s pˇrem´ıstov´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 Vliv β = m ri sr˚ ustaj´ıc´ım haˇsov´an´ı. 0 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 β).
30
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. ´ zky Dalˇ s´ı ota 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 vrcholu 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 pomocn´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´ e probl´ emy. 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´ı). Jakou metodu pouˇz´ıt pro operaci DELETE ve sr˚ ustaj´ıc´ım haˇsov´an´ı (probl´em je zachovat n´ahodnost uloˇzen´e mnoˇziny a t´ım platnost odhadu na sloˇzitost operac´ı). Jak nal´ezt druhou haˇsovac´ı funkci pro metodu dvojit´eho haˇsov´an´ı, aby vznikl´e posloupnosti adres pˇri operaci INSERT se chovaly jako n´ahodn´e? Z´ avˇ er. Pˇripomeˇ nme si pˇredpoklady pro pˇredchoz´ı uveden´e v´ ysledky o 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 i a j haˇsovac´ı funkce plat´ı −1 ≤ |h−1 (i) | − |h−1 (j) | ≤ 1); (3) Vstupn´ı data jsou rovnomˇernˇe rozdˇelen´a.
31
Diskutujme splnitelnost tˇechto pˇredpoklad˚ u. 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). V n´asleduj´ıc´ı tabulce jsou uveden´e spoˇc´ıtan´e a namˇeˇren´e v´ ysledky. Pouˇzila se metoda separovan´ ych ˇretˇezc˚ u. Byly teoreticky spoˇc´ıtan´e za naˇsich pˇredpoklad˚ u. Experiment byl prov´adˇen pomoc´ı haˇsovac´ı funkce, kter´a preferovala obvykl´e n´azvy identifik´ator˚ u. V´ ysledky byly mˇeˇreny, kdyˇz se pˇrekladaˇc FORTRANu pouˇzil pro standardn´ı v´ ypoˇcet. 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 0.9 1.34 1.38 1.40 1.45
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´ı. Hledal se postup, kter´ y by se vyhnul uveden´emu probl´emu s bodem 3). Nalezen´emu ˇreˇsen´ı je vˇenov´an n´asleduj´ıc´ı text. ´ ln´ı haˇ ´ n´ı Univerza sova ˇ sen´ı navrhli Carter a Wegman (1977), kdyˇz pˇriˇsli s metodou univerz´aln´ıho haˇsov´an´ı, kter´ Reˇ a obch´az´ı 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ˇzadavek 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.
Def:
Modifikace ideje. Ovˇeˇrov´an´ı vlastnost´ı vyˇzaduje znalost velikosti mnoˇziny H. Rychl´ a vyˇc´ıslitelnost h (x) vyˇzaduje analytick´e zad´an´ı funkc´ı v H, ale zjiˇstˇen´ı rovnosti dvou analyˇ sen´ım probl´emu je pouˇzit´ı inticky zadan´ ych funkc´ı na univerzu U je problematick´e. Reˇ dexov´e mnoˇziny. To znamen´a, ˇze H = {hi | i ∈ I} a dvˇe funkce jsou r˚ uzn´e, kdyˇz maj´ı r˚ uzn´e indexy. Pak velikost syst´emu bude velikost indexov´e mnoˇziny. M´ısto zvolen´ı haˇsovac´ı funkce budeme volit n´ahodnˇe index s rovnomˇern´ ym rozloˇzen´ım a kdyˇz zvol´ıme index i, pak budeme pracovat s haˇsovac´ı funkc´ı hi . Oˇcek´avan´ P a hodnota n´ahodn´e promˇenn´e f z mnoˇziny I do f (i) i∈I . re´aln´ ych ˇc´ısel bude pr˚ umˇer pˇres I, tj. |I| Form´alnˇe: Nechˇt U je univerzum. Soubor funkc´ı H = {hi | i ∈ I} 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´ı | {i ∈ I | hi (x) = hi (y)} | ≤
c|I| . m
32 Ekviv. def:
Jako ekvivalentn´ı definici lze pouˇz´ıt toto tvrzen´ı: syst´em funkc´ı H z univerza U do mnoˇziny {0, 1, . . . , m − 1} je c-univerz´aln´ı, kdyˇz vyb´ır´ame funkci h ∈ H s rovnomˇern´ ym rozdˇelen´ım, pak pro kaˇzd´e dvˇe r˚ uzn´a x, y ∈ U , plat´ı c Prob (h (x) = h (y)) ≤ . 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).
Def. mn. hašovacích funkcí:
Existence univerz´ aln´ıch syst´ em˚ u. Univerzum U = {0, 1, . . . , N − 1} pro prvoˇc´ıslo N , H = {ha,b | (a, b) ∈ U × U }, kde ha,b (x) = ((ax + b) mod N ) mod m (tj. indexov´a mnoˇzina je U × U a jej´ı velikost je N 2 ). 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) ∈ U ×U takov´e, ˇze ha,b (x) = ha,b (y). − 1 tak, ˇze plat´ı Mus´ı existovat i ∈ {0, 1, . . . , m − 1} a r, s ∈ 0, 1, . . . , N 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 Zn Dle Frobeniovy věty x 1 y 1 je regul´arn´ı, protoˇze x 6= y. Tedy existuje jedin´e ˇreˇsen´ı t´eto soustavy pro fixovan´a x, y, i, r hodnot. a s. Pro dan´a x a y, i nab´ yv´a m hodnot, r a s nab´ yvaj´ı N m N 2 Z´avˇer: pro kaˇzd´ a x, y ∈ U takov´a, ˇze x 6= y, existuje m m dvojic (a, b) ∈ U × U takov´ ych, ˇze ha,b (x) = ha,b (y). Vˇ eta. Mnoˇzina H je c-univerz´ aln´ı pro c=
N 2 m N 2 m
.
Skuteˇcnˇe, pro kaˇzd´e x, y ∈ U , x 6= y, je poˇcet (a, b) ∈ U × U takov´ ych, ˇze ha,b (x) = ha,b (y), nejv´ yˇse roven N 2 N 2 2 N2 |I| N 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 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.
33
Vlastnosti univerz´ aln´ıho haˇ sov´ an´ı. Def:
Pˇredpoklad: H = {hi | i ∈ I} je c-univerz´aln´ı syst´em funkc´ı Oznaˇcen´ı: Pro i ∈ I a prvky x, y ∈ U oznaˇcme δi (x, y) =
Def:
1 0
stejné hašovací kdyˇz x 6= y a hi (x) = hi (y) , [Na kolize mezi x a y] kdyˇz x = y nebo hi (x) 6= hi (y) .
funkci
Pro mnoˇzinu S ⊆ U , x ∈ U a i ∈ I definujme δi (x, S) =
X
δi (x, y) .
y∈S
Pro fixovanou mnoˇzinu S ⊆ U a pro fixovan´e x ∈ U seˇcteme δi (x, S) pˇres vˇsechna i ∈ I: X
δi (x, S) =
i∈I
XX
δi (x, y) =
XX
δi (x, y) =
i∈I y∈S
y∈S i∈I
X
| {i ∈ I | hi (x) = hi (y)} | ≤
X
|I| c = m
y∈S,y6=x
y∈S,y6=x
(
(|S| − 1) c |I| m |S|c |I| m
kdyˇz x ∈ S, kdyˇz x ∈ / S.
Protoˇze δi (x, S) d´av´a odhad na velikost ˇretˇezce hi (x) pˇri reprezentaci mnoˇziny S pomoc´ı funkce hi , dost´av´ame, ˇze oˇcek´avan´a d´elka ˇretˇezce pro fixovanou mnoˇzinu S ⊆ U a fixovan´e x ∈ U pˇres i ∈ I s rovnomˇern´ ym rozdˇelen´ım je nejv´ yˇse 1 X δi (x, S) ≤ |I| i∈I
(
c |S|−1 m
kdyˇz
c |S| kdyˇz m Jen vydělím |I|
x ∈ S, x∈ / S.
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 pro pevnou posloupnost n operac´ı MEMBER, INSERT a DELETE apn likovan´ ych na pr´ azdnou tabulku pro c-univerz´ aln´ı haˇsov´ an´ı je O 1 + 2c α n , kde α = m .
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 index i ∈ I je vybr´an s rovnomˇern´ ym rozdˇelen´ım, a nen´ı ˇz´ adn´ y pˇredpoklad na vstupn´ı data. V´ ybˇ er indexu i m˚ uˇ zeme ovlivnit, ale v´ ybˇ er vstupn´ıch dat nikoliv. M˚ uˇzeme zajistit rovnomˇern´e rozdˇelen´ı v´ ybˇeru i z I nebo se k tomuto rozdˇelen´ı hodnˇe pˇribl´ıˇzit.
34
Markovova nerovnost. Pˇredpoklady: Je d´ana mnoˇzina S ⊆ U , prvek x ∈ U . Oˇcek´avan´a velikost δi (x, S) je µ, a t ≥ 1. Uk´aˇzeme pro t > 1, ˇze pravdˇepodobnost, ˇze δi (x, S) ≥ tµ pro i ∈ I, je menˇs´ı neˇz (pˇredpoklad´ame, ˇze i je z I vybr´ano s rovnomˇern´ ym rozdˇelen´ım). Oznaˇcme I 0 = {i ∈ I | δi (x, S) ≥ tµ}. Pak plat´ı P P P |I 0 | 0 tµ i∈I δi (x, S) i∈I 0 δi (x, S) µ= > ≥ i∈I = tµ |I| |I| |I| |I| Odtud |I 0 | <
1 t
Kratím µ na obou stranách rovnice.
|I| . t
Z´avˇer: Pravdˇepodobnost, ˇze δi (x, S) ≥ tµ, je menˇs´ı neˇz tvrzen´ı.
1 t,
a odtud plyne poˇzadovan´e
Pozn´amka: Toto tvrzen´ı plat´ı obecnˇe a naz´ yv´a se Markovova nerovnost. Uveden´ y d˚ ukaz ilustruje jednoduch´e tvrzen´ı pro koneˇcn´ y pˇr´ıpad. Probl´ emy. Hlavn´ı probl´em: Zajiˇstˇen´ı rovnomˇern´eho rozdˇelen´ı v´ ybˇeru i z I. Proveden´ı v´ ybˇeru: Zak´odovat indexy z mnoˇziny I do ˇc´ısel 0, 1, . . . , |I| − 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 indexem, jehoˇz k´od je i. Abychom vybrali i, nalezneme nejmenˇs´ı j takov´e, ˇze 2j − 1 ≥ |I| − 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´ D˚ usledky: 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 = {hi | i ∈ I} je c-univerz´ aln´ı syst´em funkc´ı haˇsuj´ıc´ıch do tabulky velikosti m. M˚ uˇzeme pˇredpokl´adat, ˇze I = {0, 1, . . . , |I| − 1} . 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.
35
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. l m i−1 | Protoˇze haˇsujeme do tabulky velikosti m, plat´ı |Ui | ≥ |Um . Protoˇze |U0 | = N , indukc´ı N dostaneme, ˇze |Ui | ≥ mi pro kaˇzd´e i. Zvolme i = dlogm N e− 1. Pak i je nejvˇetˇs´ı pˇrirozen´e N ˇc´ıslo takov´e, ˇze m a aspoˇ n dva prvky, zvolme x, y ∈ Ui takov´a, ˇze x 6= y. i > 1. Tedy Ui m´ Pak hj (x) = hj (y) pro j = 0, 1, . . . , i − 1. Tedy c|I| (#1) . i ≤ | {j ∈ I | hj (x) = hj (y)} | ≤ m Vˇ eta. Kdyˇz H = {hi | i ∈ I} je c-univerz´ aln´ı syst´em pro univerzum U o velikosti N haˇsuj´ıc´ı do tabulky s m ˇra ´dky, pak m |I| ≥ (dlogm N e − 1) . c Posloupnosti 0 a 1 pˇri n´ ahodn´e volbˇe i z I mus´ı m´ıt d´elku alespoˇ n d(log m − log c + log log N − log log m)e
(zde vˇsechny logaritmy jsou o z´ akladu 2).
Def:
Mal´ y univerz´ aln´ı syst´ em. Zkonstruujeme c-univerz´aln´ı syst´em takov´ y, ˇze logaritmus z velikosti jeho indexov´e mnoˇziny 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. Nechˇt p1 , p2 , . . . je rostouc´ı posloupnost vˇsech prvoˇc´ısel. Mˇejme velikost tabulky m a univerzum U = {0, 1, . . . , N − 1} pro nˇejak´e pˇrirozen´e ˇc´ıslo N (nemus´ı b´ yt prvoˇc´ıslo). 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 kdyˇz m (ln m + ln ln m) < N , pak H1 je 3.25-univerz´aln´ı syst´em. Pozn:
Nejprve si pˇripomeneme zn´amou vˇetu o velikosti prvoˇc´ısel (zde ln je pˇrirozen´ y logaritmus, tj. o z´akladu e). Vˇ eta. Pro kaˇzd´e i = 1, 2, . . . plat´ı pi > i ln i a pro i ≥ 6 plat´ı pi < i (ln i + ln ln i).
Tedy pro i ≥ 6 plat´ı pi < 2i ln i.
(#2)
Velikost indexov´e mnoˇziny H1 . Indexov´a mnoˇzina H1 je (#3) Tedy
I = {(c, d, `) | c, d ∈ {0, 1, . . . , p2t − 1,} t < ` ≤ 2t}} .
|I| = tp22t . Odtud plyne |I| ≤ 16t3 ln2 2t a tedy
log (|I|) ≤ 4 + 3 log t + 2 log log t.
Pro dostateˇcnˇe velk´e t (takov´e, ˇze log t ≥ 2 log log t, tj. t ≥ 16) plat´ı, ˇze log (|I|) ≤ 4+4 log t. Z definice t plyne, ˇze t ≤ m ln N , kdyˇz ln pt ≥ 1 (tj. pt ≥ 3). Z´avˇer: log (|I|) ≤ 4 + 4 (log m + log log N ).
36
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´ı r, s ∈ {0, 1, . . . , m − 1} takov´a, ˇze
0, 1, . . . ,
p2t m
−1
a i ∈
(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 soustava line´arn´ıch 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 |G1 | ≤ tm
l p m2 2t
m
tp2 ≤ 2t m
2 2 m |I| m 1+ = 1+ . 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| t ln N ˇ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 ≤ Abychom odhadli 1 +
m p2t
2
tp22t |I| = . m m
, uk´aˇzeme si nejdˇr´ıv pomocn´e lemma.
Lemma. Kdyˇz t ≥ 6 a m (ln m + ln ln m) < N , pak m <
pt ln t .
D˚ ukaz. Pˇredpokl´adejme, ˇze tvrzen´ı neplat´ı. pak m ≥ lnptt . Z Vˇety o velikosti prvoˇc´ısel pak plyne m ≥ lnptt > tlnlntt = t. Kdyˇz pouˇzijeme, ˇze m (ln m + ln ln m) < N , tak dostaneme, ˇze ln m + ln (ln m + ln ln m) < ln N,
a odtud plyne, ˇze t ln pt < t ln (t (ln t + ln ln t)) ≤ m (ln m + ln (ln m + ln ln m)) < m ln N a to je spor s definic´ı t. Tedy m <
pt ln t .
Definice t
Nyn´ı zkombinujeme Vˇetu o odhadu velikosti prvoˇc´ısel, pˇredchoz´ı Lemma a fakt, ˇze ln 2t ≥ ln t ≥ ln ln t
pro vˇsechna t ≥ 1
37
Odhadujeme (1+m/p_{2t})^2
a dostaneme, ˇze p
t m t (ln t + ln ln t) 1 ≤ ln t < < p2t 2t ln 2t 2t ln t ln 2t ln 2t
ln ln t 1+ . ln t
zanedbame
1 2
Je zˇrejm´e, ˇze tento v´ yraz je menˇs´ı neˇz a kdyˇz konverguje k +∞ pak tento v´ yraz konverguje k 0. 2 Z toho plyne, ˇze 1 + pm2t ≤ 1.52 = 2.25 a tedy |{i ∈ I | hi (x) = hi (y)}| = |G1 | + |G2 | ≤ 2 |I| m |I| |I| |I| 1+ + ≤ (1 + 2.25) = 3.25 . m p2t m m m Shrnut´ı: Kdyˇz t ≥ 6 a m ln m ln ln m < N , pak H1 je 3.25-univerz´aln´ı. Bez jak´ ychkoliv pˇredpoklad˚ u lze uk´azat, ˇze H1 je 5-univerz´aln´ı. Odhad na velikost c. Vˇ eta. Kdyˇz H je c-univerz´ aln´ı syst´em univerza U o velikosti N haˇsuj´ıc´ı do tabulky s m m ˇra ´dky, pak c ≥ 1 − N . Nejprve dok´aˇzeme technick´e lemma. Lemma. Mˇejme re´ aln´ a ˇc´ısla bi pro i = 0, 1, . . . , m − 1 a nechˇt b = m−1 X
bi (bi − 1) ≥ b
i=0
b −1 . m
Pm−1 i=0
bi . Pak
D˚ ukaz lemmatu. Z Cauchyho-Schwarzovy nerovnosti
b^2
plyne Pm−1 i=0
P
m−1 i=0 bi
2
b2i . Odtud m−1 X i=0
m−1 X i=0
= b2 ≤ m
bi (bi − 1) =
a lemma je dok´az´ ano.
xi y i
!2
≤
P
m−1 X i=0
m−1 2 i=0 bi
b2i
−
m−1 X i=0
m−1 X
x2i
i=0
!
m−1 X i=0
yi2
!
nasčítáme m, protože každý člen je 1
, staˇc´ı poloˇzit xi = bi a yi = 1, a tedy
bi =
m−1 X i=0
b2i
b2 −b≥ −b =b m
b −1 m
b2 m
≤
38
D˚ ukaz Vˇety. Mˇejme funkci f : U − → S, kde U m´a velikost N a S m´a velikost m. Oznaˇcme A mnoˇzinu uspoˇr´adan´ ych dvojic u, v ∈ UPtakov´ ych, ˇze u 6= v a f (u) = f (v). Kdyˇz pro −1 s ∈ S oznaˇc´ıme ks = |f (s) |, pak |A| = s∈S ks (ks − 1). Z lemmatu plyne, ˇze |A| =
X
s∈S
ks (ks − 1) ≥ N
N −1 m
=N
N −m m
,
P protoˇze s∈S ks = N . Kdyˇz H = {hi | i ∈ I} je c-univerz´aln´ı syst´em funkc´ı z univerza U o velikosti N do tabulky o velikosti m, pak pomoc´ı lemmatu dost´av´ame
N −m m
|I|N ≤ X | {(x, y) ∈ U × U | hi (x) = hi (y) , x 6= y} | = i∈I
X
| {i ∈ I | hi (x) = hi (y)} | ≤
X
c
(x,y)∈U×U, x6=y
(x,y)∈U×U,x6=y
|I| |I| = N (N − 1) c . m m
Odtud plyne, ˇze N − m ≤ c (N − 1), a tedy c≥
Porovnavame pouze obe strany nerovnice
N −m N −m m > =1− . N −1 N N
Probl´ emy univerz´ aln´ıho haˇ sov´ an´ı. Pouˇz´ıt jin´e metody na ˇreˇsen´ı koliz´ı neˇz separovan´e ˇ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 < 3.25? Zde hraje roli fakt, ˇze pˇri c = 3.25 se oˇcek´avan´a d´elka ˇretˇezce m˚ uˇze pohybovat aˇz kolem hodnoty 7. ˇ 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?
Jiny model:
Jak pouˇz´ıt Markovou nerovnost a oˇcek´avanou d´elku maxim´aln´ıho ˇretˇezce pro odhad oˇcek´ avan´eho poˇctu voleb haˇsovac´ı funkce? Pro jak´e parametry lze pouˇz´ıt n´asleduj´ıc´ı model? Je d´ana z´akladn´ı velikost tabulky m a d´ale pro j = 0, 1, . . . ˇc´ısla (parametry) lj a c-univerz´aln´ı haˇsovac´ı syst´emy Hj = {hi | i ∈ Ij } z univerza do tabulky s m2j ˇr´adky. Mnoˇzina S ⊆ U je reprezentov´ana n´asledovnˇe: je d´ano j takov´e, ˇze kdyˇz j > 0, pak
39
m2j−2 ≤ |S| ≤ m2j , kdyˇz j = 0, pak |S| ≤ m, a je zvolen index i ∈ Ij . D´ale m´ ame prost´e ˇretˇezce r0 , r1 , . . . , rm2j −1 , jejichˇz d´elky jsou nejv´ yˇse lj , a ˇretˇezec rk obsahuje prvky {s ∈ S | hi (s) = k}. Operace INSERT(x) prohled´a ˇretˇezec rhi (x) a kdyˇz tento ˇretˇezec neobsahuje prvek x, pak ho pˇrid´a. Kdyˇz m2j−2 ≤ |S| ≤ m2j a d´elka ˇretˇezce rhi (x) je nejv´ yˇse lj , pak operace konˇc´ı. j Kdyˇz |S| > m2 , tak se nejdˇr´ıve zvˇetˇs´ı j o 1. Pak se n´ahodnˇe zvol´ı i ∈ Ij a zkonstruuj´ı se ˇretˇezce reprezentuj´ıc´ı S. Kdyˇz nˇekter´ y z nich m´a d´elku vˇetˇs´ı neˇz lj , tak se volba a konstrukce ˇretˇezc˚ u opakuje tak dlouho, dokud se nepovede zvolit i ∈ Ij takov´e, ˇze vˇsechny zkonstruovan´e ˇretˇezce maj´ı d´elku nejv´ yˇse lj . Operace DELETE se ˇreˇs´ı analogicky. Probl´em: 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|. V posledn´ı dobˇe se t´eto t´ematice vˇenuje pozornost a byla dosaˇzena ˇrada zaj´ımav´ ych v´ ysledk˚ u. ´ n´ı Perfektn´ı haˇ sova Jin´e ˇreˇsen´ı koliz´ı je perfektn´ı haˇsov´an´ı. Idea je nal´ezt pro danou mnoˇzinu haˇsovac´ı funkci, kter´a nevytv´ aˇr´ı kolize. Nev´ yhoda: Metoda nepˇripouˇst´ı operaci INSERT (pro nov´ y vstup nem˚ uˇzeme zaruˇcit, ˇze nevznikne 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). Tato metoda se pouˇz´ıv´a pˇri navrhov´an´ı kompil´ator˚ u. 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´ı d˚ uvod k pouˇzit´ı stejnˇe jako v bodˇe 2).
Kompenzace: Nalezen´ı haˇsovac´ı funkce m˚ uˇze spotˇrebovat v´ıce ˇcasu. Prov´ad´ı se jen na zaˇc´atku u ´lohy. Def:
Uveden´e poˇzadavky motivuj´ı zaveden´ı n´asleduj´ıc´ıho pojmu. 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). Protoˇze nev´ıme, zda takov´a h existuj´ı, nejprve vyˇsetˇr´ıme mnoˇziny perfektn´ıch haˇsovac´ıch funkc´ı. Vyˇsetˇr´ıme vlastnosti (N, m, n)-perfektn´ıch soubor˚ u funkc´ı.
40
Doln´ı odhady na velikost (N, m, n)-perfektn´ıho souboru. Pˇredpokl´adejme, ˇze H je (N, m, n)-perfektn´ı syst´em pro U = {0, 1, . . . , N − 1} a nejprve nalezneme doln´ı odhady na velikost |H|.
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 −1 |h (ij ) | | 0 ≤ i0 < i1 < · · · < in−1 < m . j=0
Vysvˇetlen´ı: h (S) = {ij | j = 0, 1, . . . , n − 1}.
zd´e i. Tedy h m˚ uˇze b´ yt perfektn´ı nejv´ yˇse Toto ˇc´ıslo je maxim´ aln´ı, kdyˇz |h−1 (i) | = N m pro kaˇ N n m m pro n m mnoˇzin (ˇc´ıslo n urˇcuje poˇcet posloupnost´ı 0 ≤ i0 < i1 < · · · < in−1 < m). Protoˇze n-prvkov´ ych podmnoˇzin universa je N , dost´av´ame, ˇze n N |H| ≥
m n
n N n . m
Jin´ y odhad velikosti (N, m, n)-perfektn´ıho souboru.
Induktivní definice množin U_i: t je počet hashovacích funkcí.
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 poˇctu prvk˚ u, takov´a, ˇze hi |Ui−1 | N je konstantn´ı na Ui . Pak |Ui | ≥ m pro vˇsechna i > 0. Z |U0 | = N plyne |Ui | ≥ m i. Pro kaˇzd´e 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 log N N (N, m, n)-perfektn´ı, mus´ı b´ yt |Ut | ≤ 1, a tedy m t ≤ 1. Proto t ≥ log m . Vˇ eta. Kdyˇz H je (N, m, n)-perfektn´ı soubor funkc´ı, pak ( ) N log N nN n , |H| ≥ max . m log m n m
Existence (N, m, n)-perfektn´ıho souboru. 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 pro x ∈ U a i = 1, 2, . . . , t je v x-t´em ˇr´ adku a i-t´em sloupci matice M (H) 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 !t t (pocet hash. n−1 Y n (N−n)t (m − i) m . m − i=0
fci)
h_i(x) prvky, kde
N
x \in U i \in {1,..,t}
Doplneni matice na matici typu N x n
41
Qn−1 Vysvˇetlen´ı: mn je poˇcet vˇsech funkc´ı z S do {0, 1, . . . , m − 1}, cet i=0 (m − i) je poˇ prost´ ych funkc´ı z S do {0, 1, . . . , m − 1}, a tedy poˇcet vˇsech podmatic s n ˇr´adky takov´ ych, t Qn−1 ˇze ˇz´adn´ y jejich sloupec nen´ı prost´ y, je mn − i=0 (m − i) . Tyto podmatice m˚ uˇzeme libovolnˇe doplnit na matici typu N × n a pro kaˇzdou matici je tˇechto doplnˇen´ı m(N−n)t . 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´ı nebo rovno !t n−1 Y N (m − i) m(N−n)t . mn − n i=0 Vˇsech matic je mNt a kdyˇz !t n−1 Y N mn − (m − i) m(N−n)t < mNt , n
(*)
i=0
Vyraz (*)
pak nutnˇe existuje (N, m, n)-perfektn´ı syst´em. N´asleduj´ıc´ı v´ yrazy jsou ekvivalentn´ı s nerovnost´ı (∗) !t Qn−1 ln N (m − i) N n i=0 . Qn−1 <1 ⇔ t≥ 1− (m−i) mn n vydeleny m^{Nt} i=0 − ln 1 − mn Protoˇze ln
N n
≤ n ln N a protoˇze − ln (1 − x) ≥ x pro x ∈ (0, 1) dost´av´ame
− ln 1 −
Qn−1
i=0 (m − i) mn
!
≥
n−1 Y i=0
i 1− m
Rn ln 1− x dx e 0 ( m)
Pn−1 i = e i=0 ln(1− m ) ≥
kde integr´al m˚ uˇzeme odhadnout m
h
1−
i h i > n2 n n n n 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´ı.
42
Hash. fce:
Konstrukce perfektn´ı haˇ sovac´ı funkce. Pˇredpoklady: U = {0, 1, . . . , N − 1}, kde N je prvoˇc´ıslo. Mˇejme S ⊆ U o velikosti n. Budeme uvaˇzovat funkce pro k = 1, 2, . . . , N − 1.
hk (x) = (kx mod N ) mod m Hodnoty b_i^k:
(#1)
Pro i = 0, 1, . . . , m − 1 a k = 1, 2, . . . , N − 1 oznaˇcme bki = | {x ∈ S | (kx mod N ) mod m = i} |. h_k(x) = i
V´ yznam bki : Hodnoty bki lze povaˇzovat za veliˇciny, kter´e ukazuj´ı odchylku od perfektnosti. Vˇsimnˇeme si, ˇze 2 kdyˇz bki ≥ 2, pak bki − bki ≥ 2, protoˇze a2 − a ≥ 2, kdyˇz a ≥ 2. Na druhou stranu bki ≤ 1 implikuje bki Tedy z
Pm−1 i=0
bki = n plyne
2
− bki = 0.
2 Pm−1 Vˇ eta. Funkce hk je perfektn´ı, pr´ avˇe kdyˇz i=0 bki − n < 2. PN−1 Pm−1 k 2 Nyn´ı odhadneme v´ yraz k=1 b − n . i i=0 N−1 X k=1
(
m−1 X i=0
N−1 X
k=1
bi
!
m−1 X i=0
k=1
N−1 X
k 2
− n) =
| {x ∈ S | hk (x) = i} |2
!
−n
!
=
| {(x, y) | x, y ∈ S, x 6= y, hk (x) = hk (y)} | =
X
x,y∈S,x6=y
| {k | 1 ≤ k < N, hk (x) = hk (y)} |.
x, y ∈ S takov´a, ˇze x 6= y. Pak hk (x) = hk (y), pr´avˇe kdyˇz existuje i = 0, 1, . . . , m−1 N a r, s = 0, 1, . . . , b m c takov´a, ˇze kx ≡ i+rm mod N a ky ≡ i+sm mod N a i+rm, i+sm < N . Odtud dost´av´ame, ˇze hk (x) = hk (y) implikuje kx − ky ≡ (r − s) m mod N . Protoˇze 0 < k < n a x 6= y, dost´av´ame, ˇze kx − ky 6= 0, a tedy hk (x) = hk (y) implikuje existenci N N q = −b N eho, ˇze kx−ky ≡ qm mod N , a to je ekvivam c, −b m c+1, . . . , −1, 1, 2, . . . , b m c takov´ N N lentn´ı s t´ım, ˇze k (x − y) ≡ qm mod N pro nˇejak´e q = −b N c, −b m c+1, . . . , −1, 1, 2, . . . , b m c. m
Rozebirame Zvolme h_k(x)=h_k(y):
N c existuje pr´avˇe jedno k takov´e, ˇze k (x − y) ≡ qm mod Pro x > y a pro jedno q = 0, 1, . . . , b m N N , protoˇze ZN je tˇeleso (tato rovnice m´a jedin´e ˇreˇsen´ı). Protoˇze pro q = −b m c, . . . , −1, 0
43
je rovnice k (x − y) ≡ qm mod N ekvivalentn´ı s rovnic´ı k (x − y) ≡ N + qm mod N , tak N−1 dost´av´ame, ˇze pro x, y ∈ S, x < y existuje nejv´ yˇse 2b N uzn´ ych k = 1, 2, . . . , N − m c = 2b m c r˚ 1, ˇze hk (x) = hk (y) (nen´ı pravda, ˇze kdyˇz k splˇ nuje rovnici k (x − y) ≡ qm mod N pro N N nˇejak´e q = −b m c, . . . , −1, 1, . . . , b m c, pak hk (x) = hk (y)). Stejn´ y odhad analogicky dostaneme, kdyˇz x < y (ale dost´av´ame jin´a ˇreˇsen´ı). Odtud ! ! N−1 m−1 X X X n (n − 1) N −1 2 k ≤ 2 (N − 1) . bi −n ≤ 2 m m i=0 x,y∈S,x6=y
k=1
Pocet dvojic {x,y}, kde x =/= y
Tedy existuje k takov´e, ˇze
Pm−1
≤
bki
2
bi
i=0
Uk´aˇzeme, ˇze existuje v´ıce neˇz
k 2
N−1 4 m−1 X
2 n(n−1) m
+ n.
(#3)
takov´ ych k, ˇze plat´ı
i=0
<3
n (n − 1) + n. m
V opaˇcn´em pˇr´ıpadˇe dost´av´ame, ˇze N−1 X k=1
m−1 X i=0
k 2
bi
!
−n
!
≥
3 (N − 1) 3n (n − 1) = 4 m 9 (N − 1) n (n − 1) > 4m 2 (N − 1) n (n − 1) , m
a to je spor s pˇredchoz´ım v´ ysledkem. Tedy pˇri n´ahodn´em rovnomˇern´em v´ ybˇeru k je (m−1 ) X 3n (n − 1) 1 2 bki < Prob + n | k ∈ {1, 2, . . . , N − 1} ≥ . m 4 i=0 Tvrzen´ı. Kdyˇz n = m, pak (a) existuje deterministick´ y algoritmus, jenˇz v ˇcase O (nN ) nalezne k takov´e, ˇze m−1 X i=0
bki
2
< 3n;
2 Pm−1 (b) existuje pravdˇepodobnostn´ı algoritmus, kter´ y nalezne takov´e k, ˇze i=0 bki < 4n v ˇcase O (n) – oˇcek´ avan´ y poˇcet iterac´ı v´ ypoˇctu je nejv´ yˇse 4. D´ ale (c) existuje deterministick´ y algoritmus, jenˇz v ˇcase O (nN ) pro m = n (n − 1)+1 nalezne takov´e k, ˇze hk je perfektn´ı; (d) existuje pravdˇepodobnostn´ı algoritmus, kter´ y pro m = 2n (n − 1) v ˇcase O (n) nalezne k takov´e, ˇze hk je perfektn´ı – oˇcek´ avan´ y poˇcet iterac´ı v´ ypoˇctu je nejv´ yˇse 4.
44
a)
Pm−1 k 2 D˚ ukaz. Mˇejme n = m. Protoˇze spoˇc´ıt´an´ı bi pro pevn´e k vyˇzaduje ˇcas O (n), i=0 prohled´an´ım vˇsech moˇznost´ı nalezneme k takov´e, ˇze m−1 X
bki
i=0
b)
2
2n (n − 1) + n = 3n − 2 < 3n, n
≤
Viz #3 z min. str., navic n = m.
v ˇcase O (nN ). T´ım je dok´ az´ano a). Pravdˇepodobnostn´ı algoritmus dokazuj´ıc´ı b) vol´ı 2 Pm−1 n´ahodnˇe k a v ˇcase O (n) ovˇeˇr´ı, zda i=0 bki ≤ 3 n(n−1) + n = 4n − 3 < 4n. Tuto akci n opakuje dokud poˇzadavek nen´ı splnˇen. Protoˇze pravdˇepodobnost, ˇze k splˇ nuje poˇzadavek, y poˇcet iterac´ı akce je nejv´ yˇse je alespoˇ n 41 , tak oˇcek´avan´ ∞ i−1 X 3 1 1 1 i = =4 4 4 4 1− 3 2 i=0 4
c)
a odtud plyne b). Kdyˇz m = n (n − 1) + 1, pak prohled´an´ım vˇsech moˇznost´ı nalezneme k takov´e, ˇze m−1 X i=0
bki
2
≤
2n (n − 1) + n < n + 2, n (n − 1) + 1
v ˇcase O (nN ) a c) plyne z pˇredchoz´ı vˇety. Kdyˇz m = 2n (n − 1), pak pro n´ahodnˇe zvolen´e k plat´ı s pravdˇepodobnost´ı ≤ 14 , ˇze m−1 X i=0
bki
2
≤
3n (n − 1) + n < n + 2. 2n (n − 1)
Algoritmus splˇ nuj´ıc´ı tvrzen´ı d) je stejn´ y jako v pˇr´ıpadˇe b) (jen m = 2n (n − 1)).
Pozn:
Def c_i:
Takto zkonstruovan´e perfektn´ı haˇsovac´ı funkce nesplˇ nuj´ı poˇzadavek 2) (plat´ı m = Θ n2 ). Pouˇzijeme n´asleduj´ıc´ı postup. 2 2 Pm−1 Pm−1 1) Nalezneme k takov´e, ˇze pro m = n plat´ı i=0 bki < 3n (respektive i=0 bki < 4n). Pro i = 0, 1, . . . , m − 1 nalezneme mnoˇziny 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 + |Si | (|Si | − 1) (respektive m = 1 + 2|Si | (|Si | − 1)) takov´e ki , ˇze hki je perfektn´ı na Si . Definujme ci = 1 + |Si | (|Si | − 1) (respektive ci = 2|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ˇ poloˇz´ıme g (x) = dl + hkl (x). 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 < 6n 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.
45
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 zbytku pˇri dˇelen´ı a jedno sˇc´ıt´an´ı (hodnoty di jsou uloˇzeny 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 pro 2 Si 6= ∅, m´ame |Si | (|Si | − 1)+1 ≤ |Si |2 = bki , dost´av´ame v deterministick´em pˇr´ıpadˇe dm = Pm−1 Pm−1 k 2 bi < 3n a k nalezneme v ˇcase O (nN ). v ˇcase i=0 ci ≤ i=0 Protoˇ ze ki nalezneme Pm−1 Pm−1 O (|Si |N ), lze g zkonstruovat v ˇcase O nN + i=0 |Si |N = O nN + N i=0 |Si | = O (2nN ) = O (nN ). V pravdˇepodobnostn´ım pˇr´ıpadˇe je dm =
m−1 X i=0
ci ≤
m−1 X i=0
2
2|Si | − 2|Si | = 2
m−1 X i=0
2 bki
−2
m−1 X i=0
bki < 8n − 2n = 6n
Pm−1 (protoˇze |Si | = bki a i=0 bki = n). Protoˇze k nalezneme v ˇcase O (n) a ki v ˇcase O (|Si |) dostaneme, ˇze ˇze g nalezneme v ˇcase O (n). Zbytek je jasn´ y. Pozn:
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 nechˇt q je poˇcet vˇsech prvoˇc´ısel dˇel´ıc´ıch m (p1 , p2 , . . . je rostouc´ı posloupnost vˇsech prvoˇc´ısel). Pak m≥
q Y
i=1
Rq Pq q q ln xdx ln i q ln( eq )+1 i=1 1 pi > q! = e ≥e =e ≥ . e
Proto existuje konstanta c, ˇze q ≤ c lnlnlnmm . Plat´ı tedy Vˇ eta. Nechˇt δ (m) =poˇcet prvoˇc´ısel, kter´ a dˇel´ı m. Pak δ (m) = O
Def φ_p(x):
log m log log m
.
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 velikosti prvoˇc´ısel pt ≤ 2t ln t pro kaˇzd´e t ≥ 6, tedy ln D ln D p ≤2 1 + c ln 1 + c ≤ ln ln D ln ln D ln D ln D ≤ ln 2c 4c ln ln D ln ln D ln D ln D ln D = + 4c ln 4c (ln 2c) ln ln D ln ln D ln ln D 4c ln D + o (ln D) = O (ln D) = O n2 ln N .
(#1)
46
Vˇ eta. Pro kaˇzdou n-prvkovou mnoˇzinu S ⊆ U existuje prvoˇc´ıslo p o velikosti O n2 ln N takov´e, ˇze funkce φp (x) = x mod p je perfektn´ı pro S. Složitost determinist. algoritmu:
Krok pstního algoritmu:
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. Pro dostateˇcnˇe velk´e n mezi prvn´ımi 9c ln D 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 ˇc´ıslo p mezi prvn´ımi 9cn2 ln N ˇc´ısly a otestujme, zda p je prvoˇc´ıslo a φ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 ≤ 9cn ln N je prvoˇc´ıslo s pravdˇepodobnost´ı Θ ln(9cn12 ln N) a pro prvoˇc´ıslo p je φp perfektn´ı s pravdˇepodobnost´ ı ≥
1 . 2
Tedy n´ahodnˇe zvolen´e ˇc´ıslo , a proto oˇcek´avan´ y poˇcet
1 ln(9cn2 ln N)
2
p ≤ 9cn ln N splˇ nuje test s pravdˇepodobnost´ı Θ ne´ uspˇeˇsn´ ych test˚ u je O ln 9cn2 ln N . Tedy oˇcek´avan´ y ˇcas algoritmu je Ocekavan pocet neuspesnych testu
ma byt log n^2??
O (n log n (log n + log log N )) . Otestovani vybraneho p
Vˇ eta. Pro danou mnoˇzinu S ⊆ U takovou, ˇze |S| = n, deterministick´ y algoritmus nalezne 2 prvoˇc´ıslo p = O n log N takov´e, ˇze φp (x) = x mod p je perfektn´ı pro S, a pracuje v 3 2 ˇcase O n log n log N . Pravdˇepodobnostn´ı algoritmus nalezne prvoˇc´ıslo p = O n log N takov´e, ˇze φp je perfektn´ı, v oˇcek´ avan´em ˇcase O (n log n (log n + log log N )). Výsledná p pro deter. a nedeter. algoritmus:
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 2 je omezena 9cn log N . 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 n (n − 1) < q1 ≤ 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) D´ale zkonstruujme perfektn´ı haˇsovac´ı funkci g pro mnoˇzinu S2 ⊆ {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ˇzaduje ˇ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
47
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ˇeˇt o velikosti O (log n + log log N + n log n) = O (n log n + log log N ) . 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 = 3 O n (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 6n ˇ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. Dynamick´ e perfektn´ı haˇ sov´ an´ı. Jedna z velk´ ych nev´ yhod perfektn´ıho haˇsovan´ı je neznalost efektivn´ıch aktualizaˇcn´ıch operac´ı. Existuj´ı sice obecn´e metody na dynamizaci deterministick´ ych operac´ı – viz letn´ı pˇredn´aˇska, ale tato metoda v tomto pˇr´ıpadˇe neposkytuje efektivn´ı dynamizaˇcn´ı operace, protoˇze deterministick´ y algoritmus pro ˇreˇsen´ı perfektn´ıho haˇsov´an´ı je pro aktualizaˇcn´ı operace pˇriliˇs pomal´ y. To vedlo k n´avrhu, kter´ y kombinuje pravdˇepodobnostn´ı algoritmus pro perfektn´ı haˇsov´an´ı s obecnou metodou dynamizace a tyto metody jsou upraveny pro konkr´etn´ı situaci. Nejprve uvedeme modifikaci v´ ysledk˚ u z pˇredchoz´ı ˇc´asti, na kter´ ych je tato metoda zaloˇzena. Pˇredpokl´ad´ame, ˇze U = {0, 1, . . . , N − 1} je univerzum, kde N je prvoˇc´ıslo, a ˇze je d´ano ˇc´ıslo s < N . Oznaˇcme Hs = {hk | k = 1, 2, . . . , N − 1} mnoˇzinu funkc´ı z U do {0, 1, . . . , s − 1}, kde hk (x) = (kx mod N ) mod s pro kaˇzd´e x ∈ U . Kdyˇz zvol´ıme n´ahodnˇe k = 1, 2, . . . , N −1, pak s pravdˇepodobnost´ı alespoˇ n 12 plat´ı s−1 X i=0
bki
2
<
8n2 + 2n. s
Budeme pˇredpokl´adat, ˇze takov´e k m´ame, a pak pro kaˇzd´e i = 0, 1, . . . , s−1 pˇredpokl´ad´ ame, ˇze n´ahodnˇe zvol´ıme ji ∈ H2(bk )2 takov´e, ˇze hji je prost´a na mnoˇzinˇe Si = {s ∈ S | hk (s) = i} i
(z pˇredchoz´ıho textu v´ıme, ˇze kdyˇz zvol´ıme n´ahodnˇe ji = 0, 1, . . . , N − 1, pak hji je prost´ a na Si s pravdˇepodobnost´ı alespoˇ n 21 ). Pro jednoduchost pˇredpokl´ad´ame, ˇze mnoˇziny Si pro i = 0, 1, . . . , s − 1 uloˇz´ıme do tabulek Ti a tabulky T0 , T1 , . . . , Ts−1 budou uloˇzeny v tabulce T . Kdyˇz s = O (|S|), pak tato metoda vyˇzaduje O (|S|) prostoru. Abychom urˇcili s, √ zvolme c > 1 a poloˇzme s = σ (|S|), kde σ (n) = 43 6 (1 + c) n pro kaˇzd´e n. Nyn´ı pop´ıˇseme algoritmy.
48
Algoritmy. INSERT(x): n := n + 1 if n ≤ m then j := h (x), |Sj | := |Sj | + 1 if |Sj | ≤ m (j) a pozice hj (x) v Tj je pr´azdn´a then vloˇz´ıme x do tabulky Tj na pozici hj (x) else if |Sj | ≤ m (j) a pozice hj (x) v Tj je obsazen´a then vytvoˇr´ıme seznam Sj prvk˚ u v tabulce Tj vypr´azdn´ıme tabulku Tj Volíme funkci h_j zvol´ıme n´ahodnˇe funkci hj ∈ H2m(j)2 while hj nen´ı prost´a na mnoˇzinˇe Sj do zvol´ıme n´ahodnˇe funkci hj ∈ H2m(j)2 enddo for every y ∈ Sj do vloˇz´ıme y do Tj na pozici hj (y) enddo else [Platí |S_j| > m(j)] [Zdvojnásobíme prostor pro tabulku T_j] m (j) := 2m (j) if nen´ı dost prostoru pro tabulku Tj nebo σ(m)−1
X i=0
[Přehashujeme prvky]
8m2 + 2m 2 (m (i)) ≥ σ (m) 2
then RehashAll else alokujeme prostor pro novou pr´azdnou tabulku Tj vytvoˇr´ıme seznam Sj prvk˚ u ze star´e tabulky Tj a zruˇs´ıme ji zvol´ıme n´ahodnˇe funkci hj ∈ H2m(j)2 Volíme náhodně funkci while hj nen´ı prost´a na mnoˇzinˇe Sj do zvol´ıme n´ahodnˇe funkci hj ∈ H2m(j)2 enddo for every y ∈ Sj do vloˇz´ıme y do Tj na pozici hj (y) enddo endif endif else RehashAll endif endif
h_j
[Přehashujeme prvky]
RehashAll: projdeme tabulku T a tabulky Ti a vytvoˇr´ıme seznam prvk˚ u z mnoˇziny S m := (1 + c) |S| zvolme n´ahodnˇe h ∈ Hσ(m)
49
for every i = 0, 1, . . . , σ (m) − 1 do Si := {x ∈ S | h (x) = i} enddo Pσ(m)−1 2 8m2 while i=0 2 (|Si |) < σ(m) + 2m do (#1) zvolme n´ahodnˇe h ∈ Hσ(m) for every i = 0, 1, . . . , σ (m) − 1 do Si := {x ∈ S | h (x) = i} enddo enddo Koment´aˇr: zde Si jsou mnoˇziny vytvoˇren´e n´ahodnˇe zvolenou funkci h n := 0 for every i = 0, 1, . . . , σ (m) − 1 do m (i) := |Si | zvol´ıme n´ahodnˇe hi ∈ H2m(i)2 Volíme funkci h_i while hi nen´ı prost´a na mnoˇzinˇe Si do zvol´ıme n´ahodnˇe hi ∈ H2m(i)2 enddo enddo for every x ∈ S do INSERT(x) enddo
Dokud neni splnena podminka #1, tak pomoci nahodne hash. funkce rozdeluju do mnozin S_i.
DELETE(x): j := h (x), n := n − 1, |Sj | := |Sj | − 1 odstran´ıme x z pozice hj (x) v tabulce Tj , pozice bude pr´azdn´a m then RehashAll endif if n < 1+2c MEMBER(x): j := h (x) if x je na hj (x)-t´e pozici v tabulce Tj then V´ ystup: x je prvek S else V´ ystup: x nen´ı prvkem S endif Algoritmy pˇedpokl´adaj´ı, ˇze pˇri operaci INSERT(x) prvek x nepatˇr´ı do S a pˇri operaci DELETE(x) x je prvkem S. Pak n znamen´a velikost reprezentovan´e mnoˇziny. Uvedu sloˇzitost t´eto metody bez d˚ ukazu. Vˇ eta. Popsan´ a metoda vyˇzaduje line´ arn´ı pamˇeˇt (neuvaˇzuje se pamˇeˇt potˇrebn´ a pro zak´ odov´ an´ı haˇsovac´ıch funkc´ı), operace MEMBER v nejhorˇs´ım pˇr´ıpadˇe vyˇzaduje ˇcas O (1) a oˇcek´ avan´ a amortizovan´ a sloˇzitost operac´ı INSERT a DELETE je tak´e O (1). Toto zobecnˇen´ı Fredman-Koml´os-Szemer´ediho metody navrhli Dietzfelbinger, Karlin, Mehlhorn, Meyer auf der Heide, Rohnert a Tarjan. Dalˇs´ı nev´ yhoda Fredman-Koml´os-Szemer´ediho 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
50
Def:
navrhuje perfektn´ı haˇsovac´ı funkci pro S ⊆ U a pro |S| = n. 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 nˇekolik definic. Dvojice (X, E), kde X je mnoˇzina a E je syst´em r-prvkov´ ych podmnoˇzin X, se naz´ yv´ a r-hypergraf. Prvky v E se naz´ yvaj´ı hrany r-hypergrafu. Cyklus je hypergraf (X, E), kde kaˇzd´ y vrchol leˇz´ı alespoˇ n ve dvou r˚ uzn´ ych hran´ach. Naopak r-hypergraf (X, E) se naz´ yv´ a y jeho podhypergraf nen´ı cyklus. acyklick´ y, kdyˇz ˇz´adn´ 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´ı g:V − → {0, 1, . . . , n − 1} Pr takov´e, ˇze funkce h : E − → {0, 1, . . . , n − 1} definovan´a h (e) = i=1 g (vi ) mod n, kde e = {v1 , v2 , . . . , vr }, je prost´a (m´ısto sˇc´ıt´an´ı modulo n m˚ uˇzeme pouˇz´ıt libovolnou grupovou operaci na mnoˇzinˇe {0, 1, . . . , n − 1}). Pro acyklick´ y r-hypergraf lze funkci g zkonstruovat n´asleduj´ıc´ım postupem. Zvol´ıme bijekci h : E − → {0, 1, . . . , n − 1} a pak definujeme g n´asledovnˇe: kdyˇz e = {v1 , v2 , . . . , vr } a g (vi ) je definov´ano pro i = 2, 3, . . . , r, pak g (v1 ) = h (e) −
r X
g (vi ) mod n.
i=2
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 : U − → V takov´ ych, ˇze (V, E), kde E = {{f1 (x) , f2 (x) , . . . , fr (x)} | x ∈ S} , je acyklick´ y r-hypergraf. Pak haˇsovac´ı funkce f je definov´ana f (x) = kaˇzd´e x ∈ U . Z konstrukce vypl´ yv´a, ˇze je perfektn´ı na mnoˇzinˇe S.
Pr
i=1
g (fi (x)) pro
Autoˇri dok´azali, ˇze nejvhodnˇejˇs´ı alternativa je, kdyˇz zobrazen´ı f1 , f2 , . . . , fr jsou n´ahodnˇe zvolen´a n´ahodn´a zobrazen´ı. 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.
51
´ n´ı Extern´ı haˇ sova Navrˇzen´ y postup je tak´e zn´am pod n´azvem Fagin˚ uv algoritmus. T´ımto probl´emem se prvn´ı asi zab´ yval Larsson. ˇ s´ıme jin´ Reˇ y probl´em – uloˇzen´ı dat na extern´ı pamˇeˇt. Hlavn´ı probl´em – minimalizovat poˇcet pˇr´ıstup˚ u 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´ı. ∗
Def:
Pˇredpokl´adejme, ˇze h : U − → {0, 1} je prost´e zobrazen´ı takov´e, ˇ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 | α je prefix h (s)} .
Def:
ˇ zd´ y vlastn´ı prefix α0 slova α Rekneme, ˇze α je kritick´e slovo, kdyˇz 0 < |h−1 S (α) | ≤ b a pro kaˇ 0 zd´e s ∈ S existuje pr´avˇe jedno kritick´e slovo α, kter´e je prefixem plat´ı |h−1 S (α ) | > b. Pro kaˇ h (s). Definujme d (s) pro s ∈ S jako d´elku kritick´eho slova, kter´e je prefixem h (s) a d (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 prefixem α, pak k α je pˇriˇrazena str´anka koresponduj´ıc´ı s β, jinak je k α pˇriˇrazena str´anka N IL – speci´aln´ı pr´azdn´a str´anka. −1 zd´e Korektnost: Pro r˚ uzn´a kritick´a slova β a γ plat´ı h−1 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 avˇe jedno kritick´e slovo β, kter´e je (1) h−1 S (α) 6= ∅, pak 0 < |hS (α) | ≤ b a existuje pr´ prefixem α; 0 0 y, ˇze 0 < |h−1 (2) h−1 S (α ) | ≤ b, pak existuje S (α) = ∅ a existuje prefix α slova α takov´ 0 pr´avˇe jedno kritick´e slovo, kter´e je prefixem α (a tedy tak´e prefixem α); ˇ h−1 (α0 ) = ∅ nebo |h−1 (α0 ) | > b zd´ y prefix α0 slova α plat´ı bud (3) h−1 S S S (α) = ∅ a pro kaˇ (pak k α je pˇriˇrazena str´anka N IL. Mˇejme slovo α o d´elce d (S). Oznaˇcme c (α) nejkratˇs´ı prefix α0 slova α takov´ y, ˇze str´ anka 0 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 α.
52
Vˇsimnˇeme si, ˇze kdyˇz hS−1 (α) 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 N IL; (2) c (α) je kritick´e slovo; (3) nˇejak´ y prefix α je kritick´e slovo. 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α0 a β = γ1β 0 pro nˇejak´a slova γ, α0 a β 0 . 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→ N IL.
Opˇet plat´ı c (00) = 00, c (01) = 01 a c (10) = c (11) = 1. V adres´aˇri je tak´e uloˇzeno d (S). Algoritmy. 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 naˇ cteme 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 N IL, pak x ∈ /S a konec, jinak pokraˇcujeme krokem 2). 2) Naˇ cteme 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 naˇ cteme 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 N IL, pokraˇcujeme krokem 3), v opaˇcn´em pˇr´ıpadˇe pokraˇcujeme krokem 2). 2) Naˇ cteme 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.
53
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) Naˇ cteme 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. DELETE(x): 1) Spoˇc´ıt´ame h (x) a naˇ cteme 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 0 k α je N IL, 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 (β) = β 0 , pak str´anka pˇriˇrazen´a k β je kandid´at. 2) Naˇ cteme 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 dohromady obsahuj´ı 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 naˇ cteme 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) Naˇ cteme adres´aˇr, kde zaktualizujeme adresy str´anek. Pokud jsme slouˇcili dvˇe str´ anky, mus´ıme nal´ezt nov´e c (α) (je to nejkratˇs´ı prefix α0 slova α takov´ y, ˇze ke kaˇzd´emu slovu β o d´elce d (S), kter´e m´a α0 za prefix, je pˇriˇrazena jedna z tˇechto adres: adresa str´anky pˇriˇrazen´ a k α, adresa str´anky kandid´ata, N IL) 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. Pro jednoduchost pˇredpokl´ad´ ame, ˇze adres´aˇr je tak´e uloˇzen na extern´ı pamˇeti a ˇze v intern´ı pamˇeti nem˚ uˇze b´ yt uloˇzen spolu s nˇejakou jinou str´ankou. 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
54
je 0001. Takˇze d (S) = 4 a adres´aˇr vypad´a 0000 7→ {00000, 00001} , 0001 7→ {00010} , 0010 7→ 0011 7→ N IL,
0100 7→ 0101 7→ 0110 7→ 0111 7→ {0100} ,
1000 7→ 1001 7→ 1010 7→ 1011 7→ {10000} ,
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} , tj. 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´ı Vˇ eta. Kdyˇz velikost reprezentovan´e mnoˇziny je n, pak oˇcek´ avan´ y poˇcet pouˇzit´ ych str´ anek e n 1+ 1b avan´ a velikost adres´ aˇre je b ln 2 n . je b ln 2 a oˇcek´ 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´ı.