]> mj.ucw.cz Git - ads1.git/commitdiff
Prvni rozumna verze zapisu o hashovani.
authorMartin Mares <mj@ucw.cz>
Mon, 10 Sep 2007 12:34:09 +0000 (14:34 +0200)
committerMartin Mares <mj@ucw.cz>
Mon, 10 Sep 2007 12:34:09 +0000 (14:34 +0200)
13-hash/13-hash.latex [deleted file]
13-hash/13-hash.tex [new file with mode: 0644]
13-hash/Makefile [new file with mode: 0644]

diff --git a/13-hash/13-hash.latex b/13-hash/13-hash.latex
deleted file mode 100644 (file)
index 1165c0a..0000000
+++ /dev/null
@@ -1,274 +0,0 @@
-\documentclass[12pt]{article}
-\usepackage[czech]{babel}
-\usepackage[latin2]{inputenc}
-\begin{document}
-
-
-
-{\large \bf Tøídìní}
-
-Víme-li nìco o hodnotách, mù¾eme najít lep¹í tøídící algoritumus, napø. v lineárním èase.
-
-Na mno¾inì máme tyto operace:
-
-\medskip
-
-Insert(x)
-
-Delete(x)
-
-Find(x)
-
-\medskip
-
-Víme-li, ¾e je uspoøádaná - vyhledávací strom: $\Theta(\log n)$ na operaci
-
-\medskip
-
-$n$ ... poèet prvkù
-
-$U$ ... velikost universa (mno¾ina ze které prvky vybíráme)
-
-$[U] = {0, 1, 2,\ldots,U-1}$
-
-\bigskip
-
-{\bf 1. Pole indexované $0..U-1$}
-
-\medskip
-
-Insert/Delete/Find v èase $O(1)$
-
-\medskip
-
-pamì» $O(U)$
-
-\bigskip
-
-{\bf 2. Èíslicový strom (radix tree) }
-
-Zvolíme $b$ základ soustavy
-
-prvky $U$ zapisujeme jako $k$-tice èíslic
-
-èili $x\in U \mapsto [b]^{k}, k=[\log_b U]$
-
-Tedy vznikne strom (hloubka $k$), na $k$-té úrovni podle $k$-té èíslice
-
-\medskip
-
-Find: $O(\log_b U)$
-
-Insert, Delete: $O(b \log_b U)$
-
-pamì»: $O(nb\log_b U)$
-
-\medskip
-
-$b$ malá - lep¹í pamì», hor¹í èasová slo¾itost a obrácenì
-
-$\Rightarrow$ vy¾aduje peèlivé nastavení parametrù
-
-
-\bigskip
-
-{\bf 3. Pro øetìzce }
-
-Za $b$ zvolíme abecedu
-
-$|x|$ ... délka øetìzce
-
-\medskip
-
-Find, Insert, Delete: $O(|x|)$
-
-pamì»: $O(\sum_{i} |x|)$
-
-\bigskip
-
-{\bf 4. Hashování }
-
-
-$h: [U] \rightarrow [m]$ hashovací funkce
-
-Perfektní hashovací funkce - do ka¾dé z $n$ pøihrádek jediný prvek z $[U]$
-
-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: $m = cn^2$)
-
-$m$ ... poèet pøihrádek
-
-$h$ ... hashovací funkce $[U] \rightarrow [m]$
-
-v ka¾dé pøihrádce spoják
-
-\medskip
-Find: pou¾ít hashovací funkci k urèení pøihrádky a projít spojákem
-
-Insert
-\medskip
-
-{\bf Hashování se separovými øetezci}
-
-\medskip
-Insert, Delete, Find pracují v èase $O(|x|)$
-
-pamì»: $O(m+n)$
-\medskip
-
-vlo¾ili jsme $x_1 \ldots x_n \in [U]$
-
-nyní pracujeme s $x \in [U]$
-
-pøedpokládejme, ¾e $h(x_i)$ a $h(x)$ jsou náhodné
-
-$p:=h(x)$
-
-$N_p:=\sharp$ : $h(x_1)=h(x)$
-
-$N_{i,p} := 0$ pokud $h(x_i)\neq p$
-
-$N_{i,p} := 1$ pokud $h(x_i)= p$
-
-$N_p = \sum_{i=1}^n N_{i,p}$
-
-$E N_{i,p} = Pr[h(x_i)=p] = \frac{1}{m} $
-
-$E N_p = n \frac{1}{m} = \frac{n}{m} $
-
-\medskip
-
-Za pøedpokladu, ¾e hash pøidìluje náhodnou pøihrádku, je v ka¾dé pøihrádce $\frac{n}{m}$ prvkù.
-
-\bigskip
-
-\noindent {\sc Vìta:} {\it Pokud jsme do hashovací tabulky vlo¾ili
-hodnoty $x_1,\dots,x_m$ tak, ¾e $h_{x_i}$ jsou v¹echny stejnì
-pravdìpodobné, pak následující Insert, Delete, Find pracují v èase
-${\cal O}\,(\frac{n}{m}+1)$. (Za pøedpokladu, ¾e výpoèet $h$ trvá
-${\cal O}\,(1)$.)}
-
-\medskip
-
-{\it Insert}: Spoèítá si $h(x)$ a vlo¾í jej do spojového seznamu v patøièné pøihrádce.
-
-{\it Delete}: Spoèítá si $h(x)$ a najde jej v spojovém seznamu v patøièné pøihrádce a
-odstraní jej.
-
-{\it Find}: Spoèítá si $h(x)$ a najde jej v spojovém seznamu v patøièné pøihrádce.
-
-\medskip
-
-\noindent Tato metoda má dva háèky:
-
-1. vysoká koliznost
-
-2. musíme dopøedu vìdìt, kolik prvkù budeme vkládat
-
-\bigskip
-
-{\large \bf Nafukovací hashovací tabulka}
-
-na poèátku: $n=0;m=4$
-
-v ka¾dém okam¾iku budeme udr¾ovat pomìr $\frac{n}{m}\in \langle
-\frac{1}{2},1)$
-
-tedy: (pokud nastane)
-$$n=4 \Rightarrow m:=8 $$
-$$n=8 \Rightarrow m:=16$$
-Pøi ka¾dém zvìt¹ování tabulky musíme zvìt¹it obor hodnot hashovací funkce a v¹echny prvky ji¾
-v tabulce ulo¾ené znovu "zhashovat".
-
-Nafukování trvá ${\cal O}\, (n)$, ale mezi dvìma nafouknutími je
-minimálnì $ \frac {n}{2} $ Insertù.
-
-Pokud tedy ka¾dý Insert pøispìje konstantou, tak to máme zadarmo!
-
-\bigskip
-
-PROBLÉM: Jak udìlat funkci Delete? Jednoduché zmen¹ování tabulky pøi pomìru
-$\frac{n}{m}=\frac{1}{2}$ není dostaèující, nebo» by se mohlo stát, ¾e bychom nafukovali a
-zfukovali hned po sobì.
-
-\bigskip
-
-{\bf Verze s Insert a Delete}
-
-Udr¾ujeme $\frac{n}{m}\in \langle \frac{1}{4},1)$
-
-pøi zfukování tabulku pùlíme, pøi nafukování zdvojnásobujeme
-
-\medskip
-
-Po pøehashování je pomìr $\frac{n}{m}=\frac{1}{2} \Rightarrow$mezi dvìma pøehashováními
-nastane minimálnì $\frac{m}{2}$ Insertù èi $\frac{m}{4}$ Deletù, tedy alespoò $\frac{m}{4}$
-operací.
-
-Zároveò zabereme v¾dy lineárnì prostoru vzhledem k $n$.
-
-\bigskip
-
-\noindent {\sc Vìta:} {\it Nafukovací hashování (se separovanými øetìzci) za pøedpokladu
-rovnomìrné pravdìpodobnosti pracuje v prùmìrném èase ${\cal O}\,(1)$ na operaci a v prostoru
-${\cal O}\,(n)$ (kde $n$ je poèet pøítomných prvkù).}
-
-\medskip
-
-Kde pøijít k rovnomìrné hashovací funkci?
-
-\medskip
-
-\noindent Dìdeèkovo vyprávìní:
-
-a) $h(x)= x$ $mod (m)$ -rychlá, snadná kolize, sudé x v¾dy v sudých pøihrádkách. Na náhodných
-èíslech funguje v pohodì.
-
-\bigskip
-
-\noindent POZOROVÁNÍ: $\alpha \in(0,1)$ iracionální;
-
-$x \in{\sc N}$ pak $\alpha x $ $ mod (1)$ se chová "náhodnì".
-
-\medskip
-
- b) $h(x)=\lfloor m(\alpha x $ $mod(1))\rfloor$
- $$ \frac {A}{W} \sim \alpha \Rightarrow h(x)= \lfloor m(Ax \ mod(W)) \rfloor $$
-
- \medskip
-
- Jako velmi výhodné se jeví pou¾ívat $\alpha = \frac {\sqrt{5} -1}
- {2} $ - pøevrácená hodnota zlatého øezu.
-
-\medskip
-
-c) funkce k hashování øetìzcù
-$$ h(\emptyset)=0 $$
-$$ h(x_1, \dots , x_n)=c(h(x_1, \dots ,x_{n-1})+x_n)$$
-$$ \Rightarrow h(x_1, \dots , x_n)=x_n + cx_{n-1} + c^2 x_{n-2} +
-\dots $$ (polynom)
-
-\medskip
-
-d)Pokud $x$ je $k$-tice (celých) èísel. Pak mù¾eme jako hashovací funkci pou¾ít skalární
-souèín s náhodnì vybraným prvkem z vektorového prostoru $Z_p^k$ (nad koneèným tìlesem):
-$$ h(x)= \overrightarrow{a} * \overrightarrow{x}   mod (p) $$
-
-\medskip
-
-Pravdìpodobnost pøes v¹echny volby $\overrightarrow{a}$, ¾e  $x,y$ se zahashují stejnì je
-pak:
-$$ p[h(x)=h(y)] = p[\overrightarrow{a}*\overrightarrow{x} =
-\overrightarrow{a}*\overrightarrow{y}]= p[\overrightarrow{a}*
-(\overrightarrow{x}-\overrightarrow{y})=0)] $$
-
-Pokud platí $p[\overrightarrow{a}* (\overrightarrow{x}-\overrightarrow{y}=0)]$, pak
-$\overrightarrow{a}$ je prvkem ortogonálního doplòku k $(x-y)$, ten má $ dim (W^\bot) =
-(k-1)$
-
-$$ p= \frac{W^\bot}{Z_p^k}= \frac{p^{k-1}}{p^k} = \frac {1}{p}=\frac{1}{m}$$
-
-kde $m$ je poèet pøihrádek. Co¾ je dostaèující.
-
-\end{document}
diff --git a/13-hash/13-hash.tex b/13-hash/13-hash.tex
new file mode 100644 (file)
index 0000000..0609629
--- /dev/null
@@ -0,0 +1,255 @@
+\input lecnotes.tex
+
+\prednaska{13}{Hashování}{(zapsal Martin Francù a Bohdan Maslowski)}
+
+
+\h{Tøídìní}
+
+V kapitole 5 jsme si ukázali, ¾e tøídìní pomocí porovnávání se dá zvládnout nejlépe v èase $O(n)$. Víme-li v¹ak nìco o hodnotách, mù¾eme najít lep¹í tøídící algoritumus, který pracuje napø. v lineárním èase.
+
+\>Na mno¾inì máme tyto operace:
+
+\itemize\ibull
+\:Insert(x)
+\:Delete(x)
+\:Find(x)
+\endlist
+
+\>Víme-li, ¾e je mno¾ina uspoøádaná, mù¾eme pou¾ít vyhledávací strom, tedy $\Theta(\log n)$ na operaci.
+
+\medskip
+
+\>Znaèíme
+
+\itemize\ibull
+\:$n$ ... Poèet prvkù
+\:$U$ ... Velikost universa (mno¾ina ze které prvky vybíráme)
+\:$[U] = {0, 1, 2,\ldots,U-1}$
+\endlist
+
+
+\bigskip
+
+\h{1. Pole indexované $0$ a¾ $U-1$}
+
+Insert, Delete i Find pracují v èase $O(1)$, pamì»ová slo¾itost je $O(U)$.
+
+
+\h{2. Èíslicový strom (radix tree) }
+
+Zvolíme základ soustavy $b$, prvky universa zapisujeme jako $k$-tice èíslic. Èili:
+
+$$x\in U \mapsto [b]^{k}, k=[\log_b U]$$
+
+Tedy vznikne strom (s hloubkou $k$), na $k$-té úrovni podle $k$-té èíslice
+
+\medskip
+
+
+Find: $O(\log_b U)$
+
+Insert, Delete: $O(b \log_b U)$
+
+Pamì»ová nároènost: $O(nb\log_b U)$
+
+\medskip
+
+Èím bude základ $b$ men¹í, tím lep¹í pamì»ová a hor¹í èasová slo¾itost, a obrácenì. Èíslicový strom tedy vy¾aduje peèlivé nastavení parametrù.
+
+\bigskip
+
+\h{3. Písmenkový strom }
+
+Pou¾ívá se pro øezìzce, za základ soustavy $b$ zvolíme abecedu.
+
+\medskip
+
+$\vert x\vert $...délka øetìzce
+
+Find, Insert, Delete: $O(\vert x\vert )$
+
+Pamì»: $O(\sum_{i} \vert x\vert )$
+
+\bigskip
+
+\h{4. Hashování }
+
+
+$h$ ... hashovací funkce $[U] \rightarrow [m]$ 
+
+$m$ ... poèet pøihrádek, v ka¾dé pøihrádce spojový seznam.
+
+\medskip
+
+Perfektní hashovací funkce pøiøadí do ka¾dé z $m$ pøihrádek jediný prvek z $[U]$.
+
+\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$
+
+
+
+
+\h{Hashování se separovými øetezci}
+
+\medskip
+Insert, Delete i Find pracují v èase $O(\vert x\vert )$, pamì»ová slo¾itost je $O(m+n)$
+\medskip
+
+vlo¾ili jsme $x_1 \ldots x_n \in [U]$
+
+nyní pracujeme s $x \in [U]$
+
+pøedpokládejme, ¾e $h(x_i)$ a $h(x)$ jsou náhodné
+
+$p:=h(x)$
+
+$N_p:=\sharp$ : $h(x_1)=h(x)$
+
+$N_{i,p} := 0$ pokud $h(x_i)\neq p$
+
+$N_{i,p} := 1$ pokud $h(x_i)= p$
+
+$N_p = \sum_{i=1}^n N_{i,p}$
+
+$E N_{i,p} = Pr[h(x_i)=p] = {1 \over m} $
+
+$E N_p = n {1\over m} = {n \over m} $
+
+\medskip
+
+Za pøedpokladu, ¾e hash pøidìluje náhodnou pøihrádku, je v ka¾dé pøihrádce ${n \over m}$ prvkù.
+
+\bigskip
+
+
+\h{Druhá pùlka}
+
+
+\noindent {\sc Vìta:} {\it Pokud jsme do hashovací tabulky vlo¾ili
+hodnoty $x_1,\dots,x_m$ tak, ¾e $h_{x_i}$ jsou v¹echny stejnì
+pravdìpodobné, pak následující Insert, Delete, Find pracují v èase
+${\cal O}\,({n \over m}+1)$. (Za pøedpokladu, ¾e výpoèet $h$ trvá
+${\cal O}\,(1)$.)}
+
+\medskip
+
+{\it Insert}: Spoèítá si $h(x)$ a vlo¾í jej do spojového seznamu v patøièné pøihrádce.
+
+{\it Delete}: Spoèítá si $h(x)$ a najde jej v spojovém seznamu v patøièné pøihrádce a
+odstraní jej.
+
+{\it Find}: Spoèítá si $h(x)$ a najde jej v spojovém seznamu v patøièné pøihrádce.
+
+\medskip
+
+\noindent Tato metoda má dva háèky:
+
+1. vysoká koliznost
+
+2. musíme dopøedu vìdìt, kolik prvkù budeme vkládat
+
+\bigskip
+
+{\large \bf Nafukovací hashovací tabulka}
+
+na poèátku: $n=0;m=4$
+
+v ka¾dém okam¾iku budeme udr¾ovat pomìr ${n\over m}\in \langle
+{1\over 2},1)$
+
+tedy: (pokud nastane)
+$$n=4 \Rightarrow m:=8 $$
+$$n=8 \Rightarrow m:=16$$
+Pøi ka¾dém zvìt¹ování tabulky musíme zvìt¹it obor hodnot hashovací funkce a v¹echny prvky ji¾
+v tabulce ulo¾ené znovu "zhashovat".
+
+Nafukování trvá ${\cal O}\, (n)$, ale mezi dvìma nafouknutími je
+minimálnì $ {n\over 2} $ Insertù.
+
+Pokud tedy ka¾dý Insert pøispìje konstantou, tak to máme zadarmo!
+
+\bigskip
+
+PROBLÉM: Jak udìlat funkci Delete? Jednoduché zmen¹ování tabulky pøi pomìru
+${n\over m}={1\over 2}$ není dostaèující, nebo» by se mohlo stát, ¾e bychom nafukovali a
+zfukovali hned po sobì.
+
+\bigskip
+
+{\bf Verze s Insert a Delete}
+
+Udr¾ujeme ${n\over m}\in \langle {1\over 4},1)$
+
+pøi zfukování tabulku pùlíme, pøi nafukování zdvojnásobujeme
+
+\medskip
+
+Po pøehashování je pomìr ${n\over m}={1\over 2} \Rightarrow$mezi dvìma pøehashováními
+nastane minimálnì ${m\over 2}$ Insertù èi ${m\over 4}$ Deletù, tedy alespoò ${m\over 4}$
+operací.
+
+Zároveò zabereme v¾dy lineárnì prostoru vzhledem k $n$.
+
+\bigskip
+
+\noindent {\sc Vìta:} {\it Nafukovací hashování (se separovanými øetìzci) za pøedpokladu
+rovnomìrné pravdìpodobnosti pracuje v prùmìrném èase ${\cal O}\,(1)$ na operaci a v prostoru
+${\cal O}\,(n)$ (kde $n$ je poèet pøítomných prvkù).}
+
+\medskip
+
+Kde pøijít k rovnomìrné hashovací funkci?
+
+\medskip
+
+\noindent Dìdeèkovo vyprávìní:
+
+a) $h(x)= x$ $mod (m)$ -rychlá, snadná kolize, sudé x v¾dy v sudých pøihrádkách. Na náhodných
+èíslech funguje v pohodì.
+
+\bigskip
+
+\noindent POZOROVÁNÍ: $\alpha \in(0,1)$ iracionální;
+
+$x \in{\sc N}$ pak $\alpha x $ $ mod (1)$ se chová "náhodnì".
+
+\medskip
+
+ b) $h(x)=\lfloor m(\alpha x $ $mod(1))\rfloor$
+ $$ {A\over W} \sim \alpha \Rightarrow h(x)= \lfloor m(Ax \ mod(W)) \rfloor $$
+
+ \medskip
+
+ Jako velmi výhodné se jeví pou¾ívat $\alpha = {{\sqrt{5} -1}\over{2}} $ - pøevrácená hodnota zlatého øezu.
+
+\medskip
+
+c) funkce k hashování øetìzcù
+$$ h(\emptyset)=0 $$
+$$ h(x_1, \dots , x_n)=c(h(x_1, \dots ,x_{n-1})+x_n)$$
+$$ \Rightarrow h(x_1, \dots , x_n)=x_n + cx_{n-1} + c^2 x_{n-2} +
+\dots $$ (polynom)
+
+\medskip
+
+d)Pokud $x$ je $k$-tice (celých) èísel. Pak mù¾eme jako hashovací funkci pou¾ít skalární
+souèín s náhodnì vybraným prvkem z vektorového prostoru $Z_p^k$ (nad koneèným tìlesem):
+$$ h(x)= \overrightarrow{a} * \overrightarrow{x}   mod (p) $$
+
+\medskip
+
+Pravdìpodobnost pøes v¹echny volby $\overrightarrow{a}$, ¾e  $x,y$ se zahashují stejnì je
+pak:
+$$ p[h(x)=h(y)] = p[\overrightarrow{a}*\overrightarrow{x} =
+\overrightarrow{a}*\overrightarrow{y}]= p[\overrightarrow{a}*
+(\overrightarrow{x}-\overrightarrow{y})=0)] $$
+
+Pokud platí $p[\overrightarrow{a}* (\overrightarrow{x}-\overrightarrow{y}=0)]$, pak
+$\overrightarrow{a}$ je prvkem ortogonálního doplòku k $(x-y)$, ten má $ dim (W^\bot) =
+(k-1)$
+
+$$ p= {{W^\bot}\over{Z_p^k}}= {{p^{k-1}}\over{p^k}} = {1\over p}={1\over m}$$
+
+kde $m$ je poèet pøihrádek. Co¾ je dostaèující.
+
+\bye
+
diff --git a/13-hash/Makefile b/13-hash/Makefile
new file mode 100644 (file)
index 0000000..fc04eaf
--- /dev/null
@@ -0,0 +1,3 @@
+P=13-hash
+
+include ../Makerules