]> mj.ucw.cz Git - ads2.git/commitdiff
KMP: Prechod na nova makra, jedno cviceni
authorMartin Mares <mj@ucw.cz>
Sun, 15 Jan 2012 22:36:12 +0000 (23:36 +0100)
committerMartin Mares <mj@ucw.cz>
Sun, 15 Jan 2012 22:36:12 +0000 (23:36 +0100)
1-kmp/1-kmp.tex

index a0d36fca0cf438f1d0020402bd44616dde5aa0b3..b18ed19f229083886e99ce96c8ad9d092e2954ec 100644 (file)
@@ -128,18 +128,18 @@ bude nedefinovan
 Kdybychom takový automat mìli, mohli bychom pomocí nìj inkrementální algoritmus
 z~pøedchozí sekce popsat následovnì:
 
-\s{Krok($I$, $x$):} \cmt{Jeden krok automatu: jsme ve stavu~$I$, pøeèetli jsme znak~$x$.}
-\algo
+\proc{KmpKrok} \cmt{Jeden krok automatu}
+\algin Jsme ve~stavu~$I$, pøeèetli jsme znak~$x$.
 \:Dokud $\iota[I] \neq x~\&~I \neq 0: I \= Z[I]$.
 \:Pokud $\iota[I] = x$, pak $I \= I + 1$.
-\:Vrátíme nový stav~$I$.
+\algout Nový stav~$I$.
 \endalgo
 
-\s{Hledej($\sigma$):} \cmt{Spu¹tìní automatu na øetìzec~$\sigma$.}
-\algo
+\algo{Kmp} \cmt{Spu¹tìní automatu na øetìzec~$\sigma$.}
+\algin Seno~$\sigma$, zkonstruovaný automat.
 \:$I \= 0$.
 \:Pro znaky $x\in\sigma$ postupnì provádíme:
-\::$I \= \<Krok>(I,x)$.
+\::$I \= \alg{KmpKrok}(I,x)$.
 \::Pokud $I = J$, ohlásíme výskyt.
 \endalgo
 
@@ -213,16 +213,17 @@ cel
 
 Hotový algoritmus mù¾eme zapsat následovnì:
 
-\s{Konstrukce zpìtných hran:}
-\algo
+\algo{KmpKonstrukce}
+\algin Jehla~$\iota$ délky~$J$.
 \:$Z[0] \= ?$, $Z[1] \= 0$.
 \:$I \= 0$.
 \:Pro $K = 2, \ldots, J-1$:
-\::$I \= \<Krok>(I, \iota[K])$.
+\::$I \= \alg{KmpKrok}(I, \iota[K])$.
 \::$Z[K] \= I$.
+\algout Pole zpìtných hran~$Z$.
 \endalgo
 
-A~jsme hotovi výsledky shrnout do následující vìty:
+\>Výsledky mù¾eme shrnout do následující vìty:
 
 \s{Vìta:} Algoritmus KMP najde v¹echny výskyty v~èase $O(J+S)$.
 
@@ -329,18 +330,18 @@ ulo
 
 \>Celý algoritmus pro zpracování sena automatem pak bude vypadat takto:
 
-\s{Krok($I$, $x$):} \cmt{Jeden krok automatu: jsme ve stavu~$I$, pøeèetli jsme znak~$x$.}
-\algo
+\proc{AcKrok} \cmt{Jeden krok automatu}
+\algin Jsme ve~stavu~$I$, pøeèetli jsme znak~$x$.
 \:Dokud $\<Dopøedu>(I, x) = \emptyset~\&~I \ne \<koøen>$: $I \= \<Zpìt>(I)$.
 \:Pokud $\<Dopøedu>(I, x) \ne \emptyset$: $I \= \<Dopøedu>(I,x)$.
-\:Vrátíme nový stav~$I$.
+\algout Nový stav~$I$.
 \endalgo
 
-\s{Hledej($\sigma$):} \cmt{Spu¹tìní automatu na øetìzec~$\sigma$.}
-\algo
+\algo{AcHledej} \cmt{Spu¹tìní automatu na daný øetìzec}
+\algin Seno~$\sigma$, zkonstruovaný automat.
 \:$I \= \<koøen>$.
 \:Pro znaky $x\in\sigma$ postupnì provádíme:
-\::$I \= \<Krok>(I, x)$.
+\::$I \= \alg{AcKrok}(I, x)$.
 \::$K \= I$.
 \::Dokud $K \neq \emptyset$:
 \:::Je-li $\<Slovo>(K) \neq \emptyset$:
@@ -375,21 +376,22 @@ vrcholu. Pokud vede zp
 musí vést zkratka z~$K$ také do~$Q$. Pokud v~$Q$ ¾ádné slovo neskonèí, musí
 zkratka z~$K$ vést do tého¾ vrcholu, jako zkratka z~$Q$.
 
-\s{Algoritmus: Konstrukce automatu}
-\algo
+\algo{AcKonstrukce}
+\algin Slova $\iota_1,\ldots,\iota_N$.
 \:Zalo¾íme prázdný strom, $R \=$ jeho koøen.
-\:Vlo¾íme do~stromu slova $\iota_1 \dots \iota_n$, nastavíme $\<Slovo>$ ve~v¹ech stavech.
+\:Vlo¾íme do~stromu slova $\iota_1 \dots \iota_N$, nastavíme $\<Slovo>$ ve~v¹ech stavech.
 \:$\<Zpìt>(R) \= \emptyset$, $\<Zkratka>(R) \= \emptyset$.
 \:Zalo¾íme frontu $F$ a~vlo¾íme do~ní syny koøene.
 \:Pro v¹echny syny~$K$ koøene: $\<Zpìt>(K) \= R$, $\<Zkratka>(K) \= \emptyset$.
 \:Dokud $F \neq \emptyset$:
 \::Vybereme $I$ z~fronty $F$.
 \::Pro v¹echny syny $K$ vrcholu $I$:
-\:::$Q \= \<Krok>(\<Zpìt>(I), \hbox{písmeno na~hranì $IK$})$.
+\:::$Q \= \alg{AcKrok}(\<Zpìt>(I), \hbox{písmeno na~hranì $IK$})$.
 \:::$\<Zpìt>(K) \= Q$.
 \:::Pokud $\<Slovo>(Q) \neq \emptyset$: $\<Zkratka>(K) \= Q$.
 \:::Jinak $\<Zkratka>(K) \= \<Zkratka>(Q)$.
 \:::Vlo¾íme $K$ do~fronty $F$.
+\algout Strom, pole \<Slovo>, \<Zpìt> a \<Zkratka>.
 \endalgo
 
 Jeliko¾ tento algoritmus pouze napøeskáèku hledá v¹echny jehly, musí být jeho
@@ -440,7 +442,8 @@ Pokud si mocninu $P^J$ p
 
 Celý algoritmus pak bude vypadat následovnì:
 
-\algo
+\algo{RabinKarp}
+\algin Jehla $\iota$ délky~$J$, seno~$\sigma$ délky~$S$.
 \:$X \= H(\iota)$. \cmt{he¹ jehly}
 \:$Y \= H(\sigma[{}:J])$. \cmt{he¹ první pozice okénka}
 \:Zvolíme~$P$ a~$N$ a pøedpoèítáme $P^J \bmod N$.
@@ -465,7 +468,11 @@ V~pr
 nalezených výskytù. Pokud nám bude staèit najít první výskyt a zvolíme $N > SJ$,
 algoritmus pobì¾í v~prùmìrném èase $\O(S)$.
 
+\exercises
 
-%% Cvièení: velké abecedy
+\ex{Rozmyslete si, jak algoritmy z~této kapitoly upravit, aby si poradily
+s~velkými abecedami.}
+
+\endexercises
 
 \bye