From: Martin Mares Date: Sun, 15 Jan 2012 22:36:12 +0000 (+0100) Subject: KMP: Prechod na nova makra, jedno cviceni X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=c2a8a8e1c90f9c5cff4a59ba435c128b339b69ee;p=ads2.git KMP: Prechod na nova makra, jedno cviceni --- diff --git a/1-kmp/1-kmp.tex b/1-kmp/1-kmp.tex index a0d36fc..b18ed19 100644 --- a/1-kmp/1-kmp.tex +++ b/1-kmp/1-kmp.tex @@ -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 \= \(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 \= \(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 $\(I, x) = \emptyset~\&~I \ne \$: $I \= \(I)$. \:Pokud $\(I, x) \ne \emptyset$: $I \= \(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 \= \$. \:Pro znaky $x\in\sigma$ postupnì provádíme: -\::$I \= \(I, x)$. +\::$I \= \alg{AcKrok}(I, x)$. \::$K \= I$. \::Dokud $K \neq \emptyset$: \:::Je-li $\(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 $\$ ve~v¹ech stavech. +\:Vlo¾íme do~stromu slova $\iota_1 \dots \iota_N$, nastavíme $\$ ve~v¹ech stavech. \:$\(R) \= \emptyset$, $\(R) \= \emptyset$. \:Zalo¾íme frontu $F$ a~vlo¾íme do~ní syny koøene. \:Pro v¹echny syny~$K$ koøene: $\(K) \= R$, $\(K) \= \emptyset$. \:Dokud $F \neq \emptyset$: \::Vybereme $I$ z~fronty $F$. \::Pro v¹echny syny $K$ vrcholu $I$: -\:::$Q \= \(\(I), \hbox{písmeno na~hranì $IK$})$. +\:::$Q \= \alg{AcKrok}(\(I), \hbox{písmeno na~hranì $IK$})$. \:::$\(K) \= Q$. \:::Pokud $\(Q) \neq \emptyset$: $\(K) \= Q$. \:::Jinak $\(K) \= \(Q)$. \:::Vlo¾íme $K$ do~fronty $F$. +\algout Strom, pole \, \ a \. \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