From: Martin Mares Date: Wed, 5 Dec 2007 08:54:02 +0000 (+0100) Subject: Prvni nastrel kapitoly o vyhledavani vice slov. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=98aab1fc3cb5026ff986a9069788752aabf03b9e;p=ads2.git Prvni nastrel kapitoly o vyhledavani vice slov. --- diff --git a/7-ac/7-ac.tex b/7-ac/7-ac.tex new file mode 100644 index 0000000..bbf79e7 --- /dev/null +++ b/7-ac/7-ac.tex @@ -0,0 +1,127 @@ +\input ../lecnotes.tex + +\prednaska{7}{Vyhledávání v textu}{(zapsali J. Kunèar, M. Demin a J. Chludil)} + +\h{Zopakujeme si základní znaèení} +\itemize\ibull +\:$\iota_1 \ldots \iota_k$ - jehly +\:$\sigma$ text (seno) +\endlist + +\h{Hledání výskytu v¹ech slov} +\itemize\ibull +\:Chceme najít v¹echny $(i,j)$ takové ¾e $\iota_i=\sigma[j:j+\vert\iota_i\vert]$ +\:Postavíme vyhledávací automat +\endlist + +\h{Vyhledávací automat} +Teï si popí¹eme, jak se takovýto vyhledávací automat vytváøí. Vyhledávací automat je vlastnì obecný $n$-ární strom, do kterého jsou pøidány zpìtné hrany. + +\s{Zpìtná hrana z$(\alpha)$ }:= nejdel¹í vlastní sufix slova $\alpha$, který je stavem. + +\figure{vyhl_automat_dopr.eps}{Vyhledávací automat}{1in} + +\h{Hledání jehel v kupì sena} +Konkrétní algoritmus vyhledávání by se dal popsat takto: +\algo +\:$s \leftarrow koren$ (zaèínáme v koøeni) +\:$\forall$ c písmenka $\sigma$ +\::$s \leftarrow krok(s,c)$ +\::je-li $slovo(s) \ne 0 \Rightarrow vypi¹(slovo(s))$ +\::$v \leftarrow out(s)$ +\::dokud $v \ne 0 $ +\:::vypi¹ $slovo(v)$ +\:::$v \leftarrow out(v)$ +\endalgo + +\s{krok($s$,$c$)}:= jeden $krok$ vytváøení vyhledávacího algoritmu + +\algo +\:dokud $\not\exists f(s,c) \wedge s \ne$ koøen: $s \leftarrow z(s)$ +\:pokud $\exists f(s,c) : s \leftarrow f(s,c)$ +\:vrátíme s +\endalgo + +\s{Výstup z automatu} +\itemize\ibull + +\:\s{BARBARA} - konèí \s{BARBARA} ale taky \s{ARA}, ale o tom nevíme. +\:Slovo mù¾e konèit i tehdy, pokud v automatu není zaznaèen konec. +\endlist +\>Øeknìme si nìkolik návrhù na vypisování nalezených slov a¾ se dostaneme k tomu nejlep¹ímu. + +\s{Vypisování nalezených slov} +\itemize\ibull +\:slovo, které v daném stavu konèí - nefunguje +\:projít v¹echy zpìtné hrany - funguje, ale pomalé +\:pøepoèítat mno¾iny - najít mno¾inu slov, aby celková velikost slov byla vìt¹í ne¾ lineární - nestihneme konstrukci +\:$slovo(s)$ = index $\iota_i$, která konèí ve stavu S, nebo $\emptyset$ +\par $out(s)$ = nejbli¾¹í vrchol , do kterého se dá z s dostat po zpìtných hranách a $slovo(v) \ne 0$ (konèí tam slovo) +\figure{Graphic2.eps}{Vyhledávací automat - se zpìtnýma hranama}{1.3in} +\endlist + +\h{Slo¾itost} +\itemize\ibull +\:kroky 2.-5. mají èasouvou slo¾itost $O(s)$, kterou jednodu¹e doká¾eme pomocí potenciálu - kroku nahoru $ \leq $ kroku dolu $= max(\vert \sigma \vert) $ +\:kroky 6.-8. mají èasovou slo¾itost $O($poèet výskytù$)$, co¾ je celkem logické, proto¾e rychleji opravdu nejdou vèechny výskyty vypsat +\endlist + +\s{Konstrukce automatu} (Aho, Coracisková) +\algo +\:postavíme strom dopøedných hran r $\leftarrow$ koøen +\:spoèteme $slovo(\ast)$ +\:spoèteme $z(\ast)$: $z(\beta)=\alpha(\beta[1:]) \{\beta[1:]$ slovo $\beta$ bez prvního písmene$\}$ +\itemize\ibull +\:$z(\beta) = \alpha(\beta[1:])$ - v¹echny zpìtné hrany vedou do vy¹¹ích hladin +\:$z(v) = krok(z(u),c)$ +\endlist +\figure{Graphic100.eps}{z(v)=Krok(z(u),c)}{0.7in} +\:$z(r) \leftarrow 0, Q \leftarrow \{ synové(r) \}, \forall v \in Q : z(v) \leftarrow r$ +\:dokud $ Q \ne 0$ +\::$u\leftarrow$ vyber z $Q$ (7-9 ¹ipka) +\::pro syny $v$ vrcholu $u$: +\:::$z \leftarrow krok(z(u)$, znak $n \geq uv)$ +\:::$z(v)\leftarrow R$ + +\figure{Graphic101.eps}{}{0.7in} +\:::je-li $slovo(z) \not= 0 \Rightarrow out(v) \leftarrow z$, jinak $out(v) = out(z)$ +\figure{Graphic102.eps}{}{0.7in} +\endalgo +\figure{vyhl_automat_full.eps}{Vyhledávací automat - kompletní}{1in} + +\s{Vìta:} +Algoritmus A-C najde v¹echny výskyty slov $\iota_1, \ldots, \iota_k$ ve slove $\sigma$ v èase $$O(\Sigma \vert \iota_i \vert + \vert \sigma \vert + \# výskytù)$$ + +\s{Reprezentace v pamìti} +\itemize\ibull +\:pole se seznamem synù +\:hashovací tabulka $(stav-znak) \rightarrow f(stav-znak)$ - pro velké abecedy +\endlist + +\h{Polynomy a násobení} +Mìjme dva polynomy definované jako +$$P(x) = \sum_{j=0}^{n-1} p_j x^j$$ +$$Q(x) = \sum_{j=0}^{n-1} q_j x^j$$ +Provedení operace $R=P*R$ je ekvivalentní s $R = \sum_{j,k} p_j q_k k^{j+k}$. Pøièem¾ na vypoèítání èlenu $r_l = \sum_{j=0}^l p_j q_{l-j}$ pou¾ijeme $\theta(n^2)$ operací. + +\s{Vìta:} Jsou-li $x_0, \ldots, x_k \in R$ navzájem ruzná a $y_0, \ldots, y_k \in R$, pak $\exists !$ polynom P stupnì $\leq k : \forall j: P(x_j) = y_j$ + +\figure{polynom.eps}{Polynom}{2in} + +\s{Vyhodnocováni polynomu} (metodou rozdìl a panuj) + +BÚNO $n=2^m$ +$$P(x_j) = p_0 x^0 + p_1 x^1 + \ldots + p_{n-1} x^{n-1}$$ +$$P(x_j) = (p_0 + p_2 x^2 + \ldots + p_{n-2}x^{n-2}) + (p_1 x^1 + p_3 x^3 + \ldots + p_{n-1} x^{n-1})$$ +$$P(x_j) = (p_0 + p_2 x^2 + \ldots + p_{n-2}x^{n-2}) + x(p_1 + p_3 x^2 + \ldots + p_{n-1} x^{n-2})$$ +$$ \vdots $$ +$$P(x) = L(x^2) + xN(x^2)$$ +$$P(-x) = L(x^2) + xN(x^2)$$ + +\>polynom s $n$ koeficienty v $n$ bodech $\rightarrow$ $2$ polynomy s $n/2$ koeficienty v $n/2$ bodech +$$T(n) = 2T(n/2) + O(n)$$ +$$T(n) = O(n \log n)$$ + +\bye + + diff --git a/7-ac/Graphic100.CDR b/7-ac/Graphic100.CDR new file mode 100644 index 0000000..8902f05 Binary files /dev/null and b/7-ac/Graphic100.CDR differ diff --git a/7-ac/Graphic100.eps b/7-ac/Graphic100.eps new file mode 100644 index 0000000..48260f0 Binary files /dev/null and b/7-ac/Graphic100.eps differ diff --git a/7-ac/Graphic101.CDR b/7-ac/Graphic101.CDR new file mode 100644 index 0000000..8e97c91 Binary files /dev/null and b/7-ac/Graphic101.CDR differ diff --git a/7-ac/Graphic101.eps b/7-ac/Graphic101.eps new file mode 100644 index 0000000..7f26d86 Binary files /dev/null and b/7-ac/Graphic101.eps differ diff --git a/7-ac/Graphic102.CDR b/7-ac/Graphic102.CDR new file mode 100644 index 0000000..58867d0 Binary files /dev/null and b/7-ac/Graphic102.CDR differ diff --git a/7-ac/Graphic102.eps b/7-ac/Graphic102.eps new file mode 100644 index 0000000..720e41b Binary files /dev/null and b/7-ac/Graphic102.eps differ diff --git a/7-ac/Graphic2.cdr b/7-ac/Graphic2.cdr new file mode 100644 index 0000000..a6689e6 Binary files /dev/null and b/7-ac/Graphic2.cdr differ diff --git a/7-ac/Graphic2.eps b/7-ac/Graphic2.eps new file mode 100644 index 0000000..a6e58f6 Binary files /dev/null and b/7-ac/Graphic2.eps differ diff --git a/7-ac/Graphic3.cdr b/7-ac/Graphic3.cdr new file mode 100644 index 0000000..63a57d1 Binary files /dev/null and b/7-ac/Graphic3.cdr differ diff --git a/7-ac/Makefile b/7-ac/Makefile new file mode 100644 index 0000000..c4b0c63 --- /dev/null +++ b/7-ac/Makefile @@ -0,0 +1,3 @@ +P=7-ac + +include ../Makerules diff --git a/7-ac/graf1.cdr b/7-ac/graf1.cdr new file mode 100644 index 0000000..565fa4f Binary files /dev/null and b/7-ac/graf1.cdr differ diff --git a/7-ac/polynom.eps b/7-ac/polynom.eps new file mode 100644 index 0000000..0690464 Binary files /dev/null and b/7-ac/polynom.eps differ diff --git a/7-ac/vyhl_automat_dopr.cdr b/7-ac/vyhl_automat_dopr.cdr new file mode 100644 index 0000000..b26b107 Binary files /dev/null and b/7-ac/vyhl_automat_dopr.cdr differ diff --git a/7-ac/vyhl_automat_dopr.eps b/7-ac/vyhl_automat_dopr.eps new file mode 100644 index 0000000..542623b Binary files /dev/null and b/7-ac/vyhl_automat_dopr.eps differ diff --git a/7-ac/vyhl_automat_full.eps b/7-ac/vyhl_automat_full.eps new file mode 100644 index 0000000..f6aa607 Binary files /dev/null and b/7-ac/vyhl_automat_full.eps differ diff --git a/all/Makefile b/all/Makefile index c32fc18..7b16831 100644 --- a/all/Makefile +++ b/all/Makefile @@ -1,5 +1,5 @@ P=ads2 -X:=$(shell for a in 1 2 3 4 6 ; do echo ../$$a-*/$$a-*.tex ; done) +X:=$(shell for a in 1 2 3 4 6 7 ; do echo ../$$a-*/$$a-*.tex ; done) %universe: all ChangeLog