]> mj.ucw.cz Git - ads1.git/blob - 13-hash/13-hash.tex
Prvni nastrel.
[ads1.git] / 13-hash / 13-hash.tex
1 \input lecnotes.tex
2
3 \prednaska{13}{Hashování}{(zapsali Martin Francù a Bohdan Maslowski)}
4
5 V~pøedchozích kapitolách jsme ukázali, ¾e aèkoliv v~obecném pøípadì
6 nelze tøídit rychleji ne¾ v~èase $\Theta(n\log n)$, pro nìkteré speciální
7 druhy hodnot (malá celá èísla, øetìzce apod.) existuje efektivnìj¹í lineární
8 algoritmus. Nyní si podobným zpùsobem posvítíme na~reprezentaci mno¾in --
9 navrhneme datovou strukturu, která bude umìt s~vhodnými typy prvkù provádìt
10 základní mno¾inové operace (\<Insert>, \<Delete>, \<Find>) v~{\I prùmìrnì}
11 konstantním èase (pomocí vyhledávacích stromù jsme to zatím umìli v~èase $\O(\log n)$
12 na operaci).
13
14 Jaké máme mo¾nosti? Zaènìme od~tìch nejjednodu¹¹ích a oznaème si~$n$ velikost
15 mno¾iny a $U$ velikost univerza, z~nìj¾ prvky mno¾iny vybíráme.
16
17 \s{1. Pole indexované od $0$ do $U-1$}
18
19 \indent \<Insert>, \<Delete> i \<Find> pracují v~èase $\O(1)$, ale platíme za~to
20 pamì»ovou slo¾itostí $\Theta(U)$.
21
22 \s{2. Èíslicový strom (radix tree)}
23
24 Zvolíme základ soustavy $b$, prvky universa zapisujeme jako $k$-tice èíslic. Èili:
25 $$x\in U \mapsto [b]^{k}, k=\lceil\log_b U\rceil.$$
26 Tím nám vznikne strom s~hloubkou $k$, na $k$-té úrovni se rozhodujeme podle $k$-té èíslice.
27
28 Operace \<Find> bude trvat $O(\log_b U)$, operace \<Insert> a \<Delete> pak
29 $O(b \log_b U)$. Strom zabere prostor velikosti $O(nb\log_b U)$.
30
31 Èím bude základ $b$ men¹í, tím lep¹í pamì»ová a hor¹í èasová slo¾itost,
32 a obrácenì. Èíslicový strom tedy vy¾aduje peèlivé nastavení parametrù.
33
34 \h{3. Písmenkový strom }
35
36 Pou¾ívá se pro øezìzce, za základ soustavy $b$ zvolíme abecedu.
37
38 \medskip
39
40 $\vert x\vert $...délka øetìzce
41
42 Find, Insert, Delete: $O(\vert x\vert )$
43
44 Pamì»: $O(\sum_{i} \vert x\vert )$
45
46 \bigskip
47
48 \h{4. Hashování }
49
50
51 $h$ ... hashovací funkce $[U] \rightarrow [m]$ 
52
53 $m$ ... poèet pøihrádek, v ka¾dé pøihrádce spojový seznam.
54
55 \medskip
56
57 Perfektní hashovací funkce pøiøadí do ka¾dé z $m$ pøihrádek jediný prvek z $[U]$.
58
59 \s{Pøíklad:} Jaká je pravdìpodobnost, ¾e 2 z k lidí mají narozeniny ve stejný den? Staèí 23 lidí, aby nastala kolize s pravdìpodobností vìt¹í ne¾ jedna polovina. Aby nenastala, potøebovali bychom vìt¹í poèet pøihrádek: $p = cm^2$
60
61
62
63
64 \h{Hashování se separovými øetezci}
65
66 \medskip
67 Insert, Delete i Find pracují v èase $O(\vert x\vert )$, pamì»ová slo¾itost je $O(m+n)$
68 \medskip
69
70 vlo¾ili jsme $x_1 \ldots x_n \in [U]$
71
72 nyní pracujeme s $x \in [U]$
73
74 pøedpokládejme, ¾e $h(x_i)$ a $h(x)$ jsou náhodné
75
76 $p:=h(x)$
77
78 $N_p:=\sharp$ : $h(x_1)=h(x)$
79
80 $N_{i,p} := 0$ pokud $h(x_i)\neq p$
81
82 $N_{i,p} := 1$ pokud $h(x_i)= p$
83
84 $N_p = \sum_{i=1}^n N_{i,p}$
85
86 $E N_{i,p} = Pr[h(x_i)=p] = {1 \over m} $
87
88 $E N_p = n {1\over m} = {n \over m} $
89
90 \medskip
91
92 Za pøedpokladu, ¾e hash pøidìluje náhodnou pøihrádku, je v ka¾dé pøihrádce ${n \over m}$ prvkù.
93
94 \bigskip
95
96
97 \h{Druhá pùlka}
98
99
100 \noindent {\sc Vìta:} {\it Pokud jsme do hashovací tabulky vlo¾ili
101 hodnoty $x_1,\dots,x_m$ tak, ¾e $h_{x_i}$ jsou v¹echny stejnì
102 pravdìpodobné, pak následující Insert, Delete, Find pracují v èase
103 ${\cal O}\,({n \over m}+1)$. (Za pøedpokladu, ¾e výpoèet $h$ trvá
104 ${\cal O}\,(1)$.)}
105
106 \medskip
107
108 {\it Insert}: Spoèítá si $h(x)$ a vlo¾í jej do spojového seznamu v patøièné pøihrádce.
109
110 {\it Delete}: Spoèítá si $h(x)$ a najde jej v spojovém seznamu v patøièné pøihrádce a
111 odstraní jej.
112
113 {\it Find}: Spoèítá si $h(x)$ a najde jej v spojovém seznamu v patøièné pøihrádce.
114
115 \medskip
116
117 \noindent Tato metoda má dva háèky:
118
119 1. vysoká koliznost
120
121 2. musíme dopøedu vìdìt, kolik prvkù budeme vkládat
122
123 \bigskip
124
125 {\large \bf Nafukovací hashovací tabulka}
126
127 na poèátku: $n=0;m=4$
128
129 v ka¾dém okam¾iku budeme udr¾ovat pomìr ${n\over m}\in \langle
130 {1\over 2},1)$
131
132 tedy: (pokud nastane)
133 $$n=4 \Rightarrow m:=8 $$
134 $$n=8 \Rightarrow m:=16$$
135 Pøi ka¾dém zvìt¹ování tabulky musíme zvìt¹it obor hodnot hashovací funkce a v¹echny prvky ji¾
136 v tabulce ulo¾ené znovu "zhashovat".
137
138 Nafukování trvá ${\cal O}\, (n)$, ale mezi dvìma nafouknutími je
139 minimálnì $ {n\over 2} $ Insertù.
140
141 Pokud tedy ka¾dý Insert pøispìje konstantou, tak to máme zadarmo!
142
143 \bigskip
144
145 PROBLÉM: Jak udìlat funkci Delete? Jednoduché zmen¹ování tabulky pøi pomìru
146 ${n\over m}={1\over 2}$ není dostaèující, nebo» by se mohlo stát, ¾e bychom nafukovali a
147 zfukovali hned po sobì.
148
149 \bigskip
150
151 {\bf Verze s Insert a Delete}
152
153 Udr¾ujeme ${n\over m}\in \langle {1\over 4},1)$
154
155 pøi zfukování tabulku pùlíme, pøi nafukování zdvojnásobujeme
156
157 \medskip
158
159 Po pøehashování je pomìr ${n\over m}={1\over 2} \Rightarrow$mezi dvìma pøehashováními
160 nastane minimálnì ${m\over 2}$ Insertù èi ${m\over 4}$ Deletù, tedy alespoò ${m\over 4}$
161 operací.
162
163 Zároveò zabereme v¾dy lineárnì prostoru vzhledem k $n$.
164
165 \bigskip
166
167 \noindent {\sc Vìta:} {\it Nafukovací hashování (se separovanými øetìzci) za pøedpokladu
168 rovnomìrné pravdìpodobnosti pracuje v prùmìrném èase ${\cal O}\,(1)$ na operaci a v prostoru
169 ${\cal O}\,(n)$ (kde $n$ je poèet pøítomných prvkù).}
170
171 \medskip
172
173 Kde pøijít k rovnomìrné hashovací funkci?
174
175 \medskip
176
177 \noindent Dìdeèkovo vyprávìní:
178
179 a) $h(x)= x$ $mod (m)$ -rychlá, snadná kolize, sudé x v¾dy v sudých pøihrádkách. Na náhodných
180 èíslech funguje v pohodì.
181
182 \bigskip
183
184 \noindent POZOROVÁNÍ: $\alpha \in(0,1)$ iracionální;
185
186 $x \in{\sc N}$ pak $\alpha x $ $ mod (1)$ se chová "náhodnì".
187
188 \medskip
189
190  b) $h(x)=\lfloor m(\alpha x $ $mod(1))\rfloor$
191  $$ {A\over W} \sim \alpha \Rightarrow h(x)= \lfloor m(Ax \ mod(W)) \rfloor $$
192
193  \medskip
194
195  Jako velmi výhodné se jeví pou¾ívat $\alpha = {{\sqrt{5} -1}\over{2}} $ - pøevrácená hodnota zlatého øezu.
196
197 \medskip
198
199 c) funkce k hashování øetìzcù
200 $$ h(\emptyset)=0 $$
201 $$ h(x_1, \dots , x_n)=c(h(x_1, \dots ,x_{n-1})+x_n)$$
202 $$ \Rightarrow h(x_1, \dots , x_n)=x_n + cx_{n-1} + c^2 x_{n-2} +
203 \dots $$ (polynom)
204
205 \medskip
206
207 d)Pokud $x$ je $k$-tice (celých) èísel. Pak mù¾eme jako hashovací funkci pou¾ít skalární
208 souèín s náhodnì vybraným prvkem z vektorového prostoru $Z_p^k$ (nad koneèným tìlesem):
209 $$ h(x)= \overrightarrow{a} * \overrightarrow{x}   mod (p) $$
210
211 \medskip
212
213 Pravdìpodobnost pøes v¹echny volby $\overrightarrow{a}$, ¾e  $x,y$ se zahashují stejnì je
214 pak:
215 $$ p[h(x)=h(y)] = p[\overrightarrow{a}*\overrightarrow{x} =
216 \overrightarrow{a}*\overrightarrow{y}]= p[\overrightarrow{a}*
217 (\overrightarrow{x}-\overrightarrow{y})=0)] $$
218
219 Pokud platí $p[\overrightarrow{a}* (\overrightarrow{x}-\overrightarrow{y}=0)]$, pak
220 $\overrightarrow{a}$ je prvkem ortogonálního doplòku k $(x-y)$, ten má $ dim (W^\bot) =
221 (k-1)$
222
223 $$ p= {{W^\bot}\over{Z_p^k}}= {{p^{k-1}}\over{p^k}} = {1\over p}={1\over m}$$
224
225 kde $m$ je poèet pøihrádek. Co¾ je dostaèující.
226
227 \bye
228