From: Martin Mares Date: Mon, 10 Sep 2007 12:34:09 +0000 (+0200) Subject: Prvni rozumna verze zapisu o hashovani. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=531276c1a45482cb12d1ec6b1752da4bd1cee296;p=ads1.git Prvni rozumna verze zapisu o hashovani. --- diff --git a/13-hash/13-hash.latex b/13-hash/13-hash.latex deleted file mode 100644 index 1165c0a..0000000 --- a/13-hash/13-hash.latex +++ /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 index 0000000..0609629 --- /dev/null +++ b/13-hash/13-hash.tex @@ -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 index 0000000..fc04eaf --- /dev/null +++ b/13-hash/Makefile @@ -0,0 +1,3 @@ +P=13-hash + +include ../Makerules