From: Martin Mares Date: Tue, 9 Feb 2010 10:54:12 +0000 (+0100) Subject: Korektury od Honzy Michelfeita. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=78191b0a5cffe76987b83c2cfbfda1f9a6423aa8;p=ads2.git Korektury od Honzy Michelfeita. --- diff --git a/1-toky/1-toky.tex b/1-toky/1-toky.tex index b179aec..38286d4 100644 --- a/1-toky/1-toky.tex +++ b/1-toky/1-toky.tex @@ -186,7 +186,7 @@ M Existuje toti¾ bijekce mezi párováním a~celoèíselnými toky pøi~zachování velikosti. Z ka¾dého toku na~vý¹e zmínìném grafu (viz obrázek) lze sestrojit párování o~stejné velikosti (velikost toku zde odpovídá poètu hran bipartitního grafu, po~kterých poteèe 1) a~naopak. Dùle¾ité je si uvìdomit, ¾e~definice toku (omezení toku kapacitou a~Kirchhoffovy zákony) nám zaruèují, ¾e~hrany s~nenulovým tokem (tedy jednièkovým) budou tvoøit párování (nestane se, ¾e~by dvì hrany zaèínaly nebo konèily ve~stejném vrcholu, nebo» by se~nutnì poru¹ila jedna ze~dvou podmínek definice toku). Potom i~maximální tok bude odpovídat maximálnímu párování a~naopak. -V~bipartitním grafu najdeme maximální párování v~èase $\O(n \cdot (m+n))$. Forùv-Fulkersonùv algoritmus stráví jednou iterací èas $\O(m+n)$ (za~prohledání do~¹íøky) a~pøi~jednotkových kapacitách bude iterací nejvý¹e~$n$, proto¾e ka¾dou se~tok zvìt¹í alespoò o~1 a v¹echny toky jsou omezené øezem kolem zdroje, který má kapacitu nejvý¹e~$n$. Výsledná èasová slo¾tost hledání maximálního párování bude tedy $\O(n \cdot (m+n))$. +V~bipartitním grafu najdeme maximální párování v~èase $\O(n \cdot (m+n))$. Fordùv-Fulkersonùv algoritmus stráví jednou iterací èas $\O(m+n)$ (za~prohledání do~¹íøky) a~pøi~jednotkových kapacitách bude iterací nejvý¹e~$n$, proto¾e ka¾dou se~tok zvìt¹í alespoò o~1 a v¹echny toky jsou omezené øezem kolem zdroje, který má kapacitu nejvý¹e~$n$. Výsledná èasová slo¾tost hledání maximálního párování bude tedy $\O(n \cdot (m+n))$. \bye diff --git a/10-prevody/10-prevody.tex b/10-prevody/10-prevody.tex index b30e31e..4721c29 100644 --- a/10-prevody/10-prevody.tex +++ b/10-prevody/10-prevody.tex @@ -99,8 +99,8 @@ $$\psi = (\ldots\lor\ldots\lor\ldots\lor\ldots) \land (\ldots\lor\ldots\lor\ldot zpùsobit, ¾e $\chi$ je exponenciálnì velká vùèi $\psi$. Pozdìji uká¾eme, ¾e lze podniknout pøevod na takovou formuli $\chi'$ v~CNF, která sice není ekvivalentní s $\psi$ (pøibydou nám promìnné, a ne ka¾dý roz¹íøený model -$\psi$ je modelem $\chi'$), ale je splnitelná právì tehdy, kdy¾ je splnitelná $\psi$ --- co¾ nám -pøesnì staèí --- a je lineárnì velká vùèi $\psi$. +$\psi$ je modelem $\chi'$), ale je splnitelná právì tehdy, kdy¾ je splnitelná $\psi$ -- co¾ nám +pøesnì staèí -- a je lineárnì velká vùèi $\psi$. \h{2. problém: 3-SAT} \s{Definice:} 3-SAT je takový SAT, v nìm¾ ka¾dá klauzule obsahuje nejvý¹e tøi literály. @@ -194,7 +194,7 @@ vadit nebudou. indikovat, zda se $i$-tý vrchol vyskytuje v~nezávislé mno¾inì (tedy pøíslu¹né ohodnocení promìnných bude vlastnì charakteristická funkce nezávislé mno¾iny). \:Pro ka¾dou hranu $ij \in E(G)$ pøidáme klauzuli $(\lnot v_i \lor \lnot v_j)$. Tyto klauzule - nám ohlídají, ¾e vybraná mno¾ina je vskutku nezávislá.. + nám ohlídají, ¾e vybraná mno¾ina je vskutku nezávislá. \:Je¹tì potøebujeme zkontrolovat, ¾e je mno¾ina dostateènì velká, tak¾e si její prvky oèíslujeme èísly od~1 do~$k$. Oèíslování popí¹eme maticí promìnných $x_{ij}$, pøièem¾ $x_{ij}$ bude pravdivá právì tehdy, kdy¾ v~poøadí $i$-tý prvek nezávislé mno¾iny je vrchol~$v_j$ @@ -203,7 +203,7 @@ vadit nebudou. (jen dodejme, ¾e $a\Rightarrow b$ je definované jako $\neg a\vee b$). \:Je¹tì potøebujeme zajistit, aby byla v~ka¾dém øádku i sloupci nejvý¹e jedna jednièka: $\forall j,i,i^{'}, i\ne i^{'} : x_{ij} \Rightarrow \lnot x_{i^{'}j}$ a - $\forall i,j,j^{'}, j\ne j^{'} : x_{ij} \Rightarrow \lnot x_{ij^{'}}$.. + $\forall i,j,j^{'}, j\ne j^{'} : x_{ij} \Rightarrow \lnot x_{ij^{'}}$. \:A~nakonec si ohlídáme, aby v~ka¾dém øádku byla alespoò jedna jednièka, klauzulí $\forall i : x_{i1} \lor x_{i2} \lor \ldots \lor x_{in}$. \endlist diff --git a/11-np/11-np.tex b/11-np/11-np.tex index bbe61b8..17b50d5 100644 --- a/11-np/11-np.tex +++ b/11-np/11-np.tex @@ -257,7 +257,7 @@ vzhledem k~$n$. \s{Poznámka:} Pro dùkaz následující vìty si dovolíme drobnou úpravu v~definici tøídy NP. -Budeme chtít, aby nápovìda byla +Budeme chtít, aby nápovìda mìla pevnou velikost, závislou pouze na~velikosti vstupu (tedy: $\vert y \vert = g(\vert x \vert)$ namísto $\vert y \vert \le g(\vert x \vert)$). Proè je taková úprava BÚNO? Jistì si dovedete pøedstavit, diff --git a/12-apx/12-apx.tex b/12-apx/12-apx.tex index 25697a7..193bb49 100644 --- a/12-apx/12-apx.tex +++ b/12-apx/12-apx.tex @@ -8,8 +8,8 @@ probl \h{Co dìlat, kdy¾ potkáme NP-úplný problém} \algo -\:Nepanikaøit -\:Spokojit se s~málem +\:Nepanikaøit. +\:Spokojit se s~málem. \:Rozmyslet, jestli opravdu potøebujeme obecný algoritmus. Mnohdy potøebujeme pouze speciálnìj¹í pøípady, které mohou být øe¹itelné v~polynomiálním èase. \:Spokojit se s~pøibli¾ným øe¹ením, (pou¾ít aproximaèní algoritmus). @@ -120,7 +120,7 @@ pomoct t \s{Problém: Obchodní cestující} -\>{\I Vstup:} neorientovaný graf~$G$, ka¾dá hrana +\>{\I Vstup:} Neorientovaný graf~$G$, ka¾dá hrana je ohodnocená funkcí $w: E(G)\rightarrow {\bb R }^+_0$. \>{\I Výstup:} Hamiltonovská kru¾nice (obsahující v¹echny vrcholy grafu), a~to ta nejkrat¹í @@ -159,7 +159,7 @@ hamiltonovsk Kdy¾ máme hamiltonovskou kru¾nici $C$ a z~ní vy¹krtneme hranu, dostaneme kostru grafu~$G$ s~váhou men¹í ne¾ $C$ -- ale ka¾dá kostra je alespoò tak tì¾ká -jako minimální kostra $T$. Tedy optimální Hamiltonovská kru¾nice je urèitì tì¾¹í +jako minimální kostra $T$. Tedy optimální hamiltonovská kru¾nice je urèitì tì¾¹í ne¾ minimální kostra $T$. Kdy¾ tyto dvì nerovnosti slo¾íme dohromady, algoritmus nám vrátí hamiltonovskou kru¾nici $T'$ s~váhou nanejvý¹ dvojnásobnou vzhledem k optimální hamiltonovské kru¾nici ($T' \leq 2T < 2C$). Takovéto @@ -188,7 +188,7 @@ $G$ na~ \: $w(e) = c \gg 1$, kdy¾ $e \not\in E(G)$ \endlist \>Konstantu $c$ potøebujeme zvolit tak velkou, abychom jasnì poznali, jestli -je ka¾dá hrana z nalezené Hamiltonovské kru¾nice hranou grafu $G$ (pokud by +je ka¾dá hrana z nalezené hamiltonovské kru¾nice hranou grafu $G$ (pokud by nebyla, bude kru¾nice obsahovat aspoò jednu hranu s váhou $c$, která vy¾ene souèet poznatelnì vysoko). Pokuï existuje hamiltonovská kru¾nice v~$G'$ slo¾ená jen z~hran, které byly @@ -202,7 +202,7 @@ $$ } $$ \>Kdyby takový algoritmus existoval, máme polynomiální algoritmus -na~Hamiltonovsku kru¾nici. +na~hamiltonovskou kru¾nici. \qed \s{Poznámka:} O existenci pseudopolynomiálního algoritmu diff --git a/2-dinic/2-dinic.tex b/2-dinic/2-dinic.tex index af9931d..311609e 100644 --- a/2-dinic/2-dinic.tex +++ b/2-dinic/2-dinic.tex @@ -71,7 +71,7 @@ Pro ka $$\leq f(e) + \left[ c(e) - f(e) + f(\overleftarrow{e}) \right] - f(\overleftarrow{e}) = c(e).$$ Vyu¾ili jsme, ¾e~$g$ je tok v~síti rezerv, tedy $g(e) \leq c(e) - f(e) + f(\overleftarrow{e})$. - Pro tok $f'(\overleftarrow{e})$ platí, ¾e $\varepsilon \leq f(\overleftarrow{e})$. Proto $f'(\overleftarrow{e}) = f(\overleftarrow{e}) - \varepsilon \geq 0$. Zároveò $f'(\overleftarrow{e}) \leq f'(\overleftarrow{e}) \leq c(\overleftarrow{e})$. + Pro tok $f'(\overleftarrow{e})$ platí, ¾e $\varepsilon \leq f(\overleftarrow{e})$. Proto $f'(\overleftarrow{e}) = f(\overleftarrow{e}) - \varepsilon \geq 0$. Zároveò $f'(\overleftarrow{e}) \leq f(\overleftarrow{e}) \leq c(\overleftarrow{e})$. Tím jsme dokázali, ¾e~$f'(e)$ i~$f'(\overleftarrow{e})$ dodr¾ují kapacity. @@ -189,7 +189,7 @@ Hled \:Skok na~2. krok \dots $\O(1)$. \endlist -Zbývá nám jen urèit, kolikrát projdeme vnìj¹ím cyklem (fází). Doká¾eme si~lemma, ¾e hodnota~$l$ vzroste mezi prùchody vnìj¹ím cyklem (fázemi) alespoò o~1. Z~toho plyne, ¾e vnjì¹ím cyklem mù¾eme projít nejvý¹e $n$-krát, nebo» cesta v síti na~$n$ vrcholech mù¾e být dlouhá nejvý¹e $n$. +Zbývá nám jen urèit, kolikrát projdeme vnìj¹ím cyklem (fází). Doká¾eme si~lemma, ¾e hodnota~$l$ vzroste mezi prùchody vnìj¹ím cyklem (fázemi) alespoò o~1. Z~toho plyne, ¾e vnìj¹ím cyklem mù¾eme projít nejvý¹e $n$-krát, nebo» cesta v síti na~$n$ vrcholech mù¾e být dlouhá nejvý¹e $n$. Uvìdomme si, ¾e uvnitø vnìj¹ího cyklu pøevládá èlen $\O(m \cdot n)$, tak¾e celková èasová slo¾itost bude $\O(n^2 \cdot m)$. diff --git a/3-goldberg/3-goldberg.tex b/3-goldberg/3-goldberg.tex index 6e528c9..9c5db3b 100644 --- a/3-goldberg/3-goldberg.tex +++ b/3-goldberg/3-goldberg.tex @@ -52,7 +52,7 @@ Pokud b \:$\forall e \in E: f(e)\leftarrow 0$ (po~hranách nejdøíve nenecháme protékat nic) a~$\forall zu \in E : f(zu)\leftarrow c(zu)$ (ze~zdroje pustíme maximální mo¾nou vlnu). \:Dokud $\exists u \in V \setminus \{z,s\}: f^{\Delta}(u)>0$: \::Pokud $\exists v \in V: uv \in E,~r(uv)>0$ a~$h(u)>h(v)$, pak pøevedeme pøebytek po~hranì z~$u$ do~$v$. -\::V~opaèném pøípadì zvedneme $u$:~$h(u) \leftarrow h(u) + 1$.. +\::V~opaèném pøípadì zvedneme $u$:~$h(u) \leftarrow h(u) + 1$. \:Vrátíme tok~$f$ jako výsledek. \endalgo @@ -218,7 +218,7 @@ Dohromady m \s{Vìta:} Goldbergùv algoritmus najde maximální tok v~èase $\O(N^2M)$. -\s{Pozorování:} Pokud bychom volili v¾dy nejvy¹¹í z~vrcholù s~pøebytkem, tak by se~mohl algoritmus chovat lépe. Podívejme se~na~to pozornìji a~vylep¹ený Goldebrgùv algoritmus oznaème G'.. +\s{Pozorování:} Pokud bychom volili v¾dy nejvy¹¹í z~vrcholù s~pøebytkem, tak by se~mohl algoritmus chovat lépe. Podívejme se~na~to pozornìji a~vylep¹ený Goldebrgùv algoritmus oznaème G'. \s{Algoritmus (Vylep¹ený Goldbergùv algoritmus)} diff --git a/5-addsort/5-addsort.tex b/5-addsort/5-addsort.tex index 827d105..1bc41dd 100644 --- a/5-addsort/5-addsort.tex +++ b/5-addsort/5-addsort.tex @@ -39,7 +39,7 @@ bude $z_i$ a~$c_{i+1}$. V¹imìme si, ¾e~ka¾dá krabièka závisí na~výstupu té pøedcházející. Jednotlivé krabièky tedy musí urèitì le¾et na~rùzných hladinách. Celkovì bychom museli pou¾ít -$\Theta{(n)}$ hladin a~jeliko¾ je ka¾dá krabièka konsantnì velká, také $\Theta{(n)}$ hradel. To dává +$\Theta{(n)}$ hladin a~jeliko¾ je ka¾dá krabièka konstantnì velká, také $\Theta{(n)}$ hradel. To dává lineární èasovou i~prostorovou slo¾itost, èili oproti sekvenènímu algoritmu jsme si nepomohli. Zamysleme se nad tím, jak by se proces sèítání mohl zrychlit. @@ -94,9 +94,9 @@ rozmyslet, jak~bychom takovouto v popisovat pouze nìkolika bity? Evidentnì nám k tomuto binárnímu zakódování tøí stavù budou staèit bity dva. -Oznaème si je jako $p$ a $q$. Tato dvojice mù¾e nábývat hned ètyø mo¾ných hodnot, +Oznaème si je jako $p$ a $q$. Tato dvojice mù¾e nabývat hned ètyø mo¾ných hodnot, kterým pøiøadíme tøi mo¾ná chování bloku. Toto kódování mù¾eme zvolit zcela -libovolnì, ale pokud si ho zvolíme ¹ikovnì, u¹etøime si dále práci pøi kompozici. +libovolnì, ale pokud si ho zvolíme ¹ikovnì, u¹etøíme si dále práci pøi kompozici. Zvolme si tedy kódování takto: \itemize\ibull @@ -183,7 +183,7 @@ tvo Formálnì zapsáno musí platit, ¾e: $$x_0\leq x_1\leq \dots \leq x_k \geq x_{k+1}\geq\dots \geq x_{n-1}.$$ -\s{Definice:} Posloupnost $x_0 \dots x_{n-1}$je {\I bitonická}, právì kdy¾ $\exists~j\in \{0,\dots ,n-1\}$, pro +\s{Definice:} Posloupnost $x_0 \dots x_{n-1}$ je {\I bitonická}, právì kdy¾ $\exists~j\in \{0,\dots ,n-1\}$, pro které je rotace pùvodní posloupnosti o $j$ prvkù, tedy posloupnost $$x_j,x_{(j+1) \bmod n},\dots, x_{(j+n-1) \bmod n},$$ èistì bitonická. diff --git a/6-kmp/6-kmp.tex b/6-kmp/6-kmp.tex index 9121c4d..288b2a2 100644 --- a/6-kmp/6-kmp.tex +++ b/6-kmp/6-kmp.tex @@ -88,7 +88,7 @@ Poj \s{Invariant:} Pokud algoritmus pøeète nìjaký vstup, nachází se ve~stavu, který je nejdel¹ím suffixem pøeèteného vstupu, který je nìjakým stavem. $\alpha(\tau) =$ nejdel¹í stav (nejdel¹í prefix jehly), který je suffixem $\tau$ (pøeèteného vstupu). -Pojïme si rozmyslet, ¾e z~tohoto invariantu ihnet plyne, ¾e algoritmus najde to, co má. Kdykoli toti¾ ohlásí nìjaký výskyt, tak tam tento výskyt opravdu je. Kdykoli pak má nìjaký výskyt ohlásit, tak se v~této situaci jako suffix toho právì pøeèteného textu vyskytuje hledané slovo, pøièem¾ hledané slovo je urèitì stav a~zároveò nejdel¹í ze v¹ech existujících stavù. Tak¾e invariant opravdu øíká, ¾e jsme právì v~koncovém stavu a~algoritmus nám tedy ohlásí výskyt. +Pojïme si rozmyslet, ¾e z~tohoto invariantu ihned plyne, ¾e algoritmus najde to, co má. Kdykoli toti¾ ohlásí nìjaký výskyt, tak tam tento výskyt opravdu je. Kdykoli pak má nìjaký výskyt ohlásit, tak se v~této situaci jako suffix toho právì pøeèteného textu vyskytuje hledané slovo, pøièem¾ hledané slovo je urèitì stav a~zároveò nejdel¹í ze v¹ech existujících stavù. Tak¾e invariant opravdu øíká, ¾e jsme právì v~koncovém stavu a~algoritmus nám tedy ohlásí výskyt. \proof {\I (invariantu)} Indukcí podle kroku algoritmu. Na~zaèátku pro prázdný naètený vstup invariant triviálnì platí, tedy prázdný suffix $\tau$ je prefixem $\iota$. V~kroku $n$ máme naètený vstup $\tau$ a~k~nìmu pøipojíme znak $x$. Invariant nám øíká, ¾e nejdel¹í stav, který je suffixem, je nejdel¹í suffix, který je stavem. Nyní se ptáme, jaký je nejdel¹í stav, který se dá \uv{napasovat} na~konec øetìzce $\tau x$. Kdykoli v¹ak takovýto suffix máme, tak z~nìj mù¾eme $x$ na~konci odebrat, èím¾ dostaneme suffix slova $\tau$. @@ -149,7 +149,7 @@ Za \s{Vìta:} Algoritmus KMP najde v¹echny výskyty v~èase $O(J+S)$. \proof -Linéární èas s~délkou jehly potøebujeme na~postavení automatu, lineární èas s~délkou sena pak potøebujeme na~samotné vyhledání. +Lineární èas s~délkou jehly potøebujeme na~postavení automatu, lineární èas s~délkou sena pak potøebujeme na~samotné vyhledání. \h{Rabinùv-Karpùv algoritmus} @@ -181,7 +181,7 @@ M Pøedtím, ne¾ se pustíme do~vlastního vyhledávacího algoritmu, mo¾ná bychom si mìli ujasnit, co vlastnì bude jeho výstupem. U problému hledání jedné jehly to bylo jasné -- byla to nìjaká mno¾ina pozic v~senì, na~kterých zaèínaly výskyty jehly. Jak tomu ale bude zde? Sice bychom také mohly vrátit pouze mno¾inu pozic, ale my budeme chtít malièko víc. Budeme toti¾ chtít vìdìt i~to, která jehla se na~které pozici vyskytuje. Výstup tedy bude vypadat následovnì: $V = \{(i,j)~\vert~\sigma[i:i+J_j]= \iota_j \}$. -Zde se v¹ak skrývá jedna drobná zrada. Budeme se asi muset vzdát nadìje, ¾e najdeme algoritmus, jeho¾ slo¾itost je lineární v~celkové délce v¹ech jehel a~sena. Výstup toti¾ mù¾e být del¹í ne¾ lineární. Mù¾e se nám klidnì stát, ¾e na~jedné pozici v~senì se bude vyskytovat více rùzných jehel -- pokud bude jedna jehla prefixem jiné (co¾ jsme nikde nezakázali), tak máme povinost ohlásit oba výskyty. Vzhledem k~tomu budeme hledat takový algoritmus, který bude lineární v~délce vstupu plus délce výstupu, co¾ je evidentnì to nejlep¹í, èeho mù¾eme dosáhnout. +Zde se v¹ak skrývá jedna drobná zrada. Budeme se asi muset vzdát nadìje, ¾e najdeme algoritmus, jeho¾ slo¾itost je lineární v~celkové délce v¹ech jehel a~sena. Výstup toti¾ mù¾e být del¹í ne¾ lineární. Mù¾e se nám klidnì stát, ¾e na~jedné pozici v~senì se bude vyskytovat více rùzných jehel -- pokud bude jedna jehla prefixem jiné (co¾ jsme nikde nezakázali), tak máme povinnost ohlásit oba výskyty. Vzhledem k~tomu budeme hledat takový algoritmus, který bude lineární v~délce vstupu plus délce výstupu, co¾ je evidentnì to nejlep¹í, èeho mù¾eme dosáhnout. Algoritmus, který si nyní uká¾eme, vymysleli nìkdy v~roce 1975 pan Aho a~paní Corasicková. Bude to takové zobecnìní Knuthova-Morrisova-Prattova algoritmu. @@ -241,12 +241,12 @@ Nejprve si nadefinujeme, jak vypad \::Dokud $\beta \neq \emptyset$: \:::Je-li $\(\beta) \neq \emptyset$: \::::Ohlásíme $\(\beta)$. -\::::$\beta \leftarrow \(\beta)$. +\:::$\beta \leftarrow \(\beta)$. \endalgo Algoritmus hledání vlastnì není nic jiného, ne¾ prosté projití po~zelených zkratkových hranách ze stavu $\alpha$, ve~kterém právì jsme, a~ohlá¹ení v¹eho, co po~cestì najdeme. -V ka¾dém okam¾iku se automat nachází ve~stavu, který odpovídá nejmen¹ímu mo¾nému suffixu toho, co jsme u¾ pøeèetli. Dùkaz tohoto invariantu je stejný jako u verze automatu pro hledání pouze jedné jehly, nebo» vychází pouze z~definice zpìtných hran. Podobnì nahlédneme, ¾e èasová slo¾itost vyhledávací procedury je lineární v~délce sena plus to, co spotøebujeme na~hlá¹ení výskytù. Nejprve na~chvíli zapomeneme, ¾e nìjaké výskyty hlásíme a~spoèítáme jenom kroky. Ty mohou vést dopøedu a~zpátky. Krok dopøedu prodlu¾uje jméno stavu o~jedna, krok dozadu zkracuje aspoò o~jedna. Tudí¾ krokù dozadu je maximálnì tolik, co krokù dopøedu a~krokù dopøedu je maximálnì tolik, kolik je délka sena. V¹echny kroky dohromady tedy trvají $\O(S)$. Hlá¹ení výskytù pak trvá $\O(S~+ \vert V \vert)$. Velé hledání tedy trvá lineárnì v~délce vstupu a~výstupu. +V ka¾dém okam¾iku se automat nachází ve~stavu, který odpovídá nejmen¹ímu mo¾nému suffixu toho, co jsme u¾ pøeèetli. Dùkaz tohoto invariantu je stejný jako u verze automatu pro hledání pouze jedné jehly, nebo» vychází pouze z~definice zpìtných hran. Podobnì nahlédneme, ¾e èasová slo¾itost vyhledávací procedury je lineární v~délce sena plus to, co spotøebujeme na~hlá¹ení výskytù. Nejprve na~chvíli zapomeneme, ¾e nìjaké výskyty hlásíme a~spoèítáme jenom kroky. Ty mohou vést dopøedu a~zpátky. Krok dopøedu prodlu¾uje jméno stavu o~jedna, krok dozadu zkracuje aspoò o~jedna. Tudí¾ krokù dozadu je maximálnì tolik, co krokù dopøedu a~krokù dopøedu je maximálnì tolik, kolik je délka sena. V¹echny kroky dohromady tedy trvají $\O(S)$. Hlá¹ení výskytù pak trvá $\O(S~+ \vert V \vert)$. Celé hledání tedy trvá lineárnì v~délce vstupu a~výstupu. Zbývá nám u¾ jen konstrukce automatu. Opìt vyu¾ijeme faktu, ¾e zpìtná hrana ze stavu $\beta$ vede tam, kam by se dostal automat pøi hledání $\beta$ bez prvního písmenka. Tak¾e zase chceme nìco, jako simulovat výpoèet toho automatu na~slovech bez prvního písmenka a~doufat v~to, ¾e si vystaèíme s~tou èástí automatu, kterou jsme u¾ postavili. Tentokrát to v¹ak nemù¾eme dìlat jedno slovo po~druhém, proto¾e zpìtné hrany mohou vést køí¾em mezi jednotlivými vìtvemi automatu. Mohlo by se nám tedy stát, ¾e pøi hledání nìjakého slova potøebujeme zpìtnou hranu, která vede do~jiného slova, které jsme je¹tì nezkonstruovali. Tak¾e tento postup sel¾e. Mù¾eme v¹ak vyu¾ít toho, ¾e ka¾dá zpìtná hrana vede ve~stromu alespoò o~jednu hladinu vý¹. Mù¾eme tak strom konstruovat po~hladinách. Lze si to tedy pøedstavit tak, ¾e paralelnì spustíme vyhledávání v¹ech slov bez prvních písmenek a~v¾dycky udìláme jeden podkrok ka¾dého z~tìch hledání, co¾ nám dá zpìtné hrany z~dal¹ího patra stromu. @@ -264,9 +264,10 @@ Zb \:::$z(v) \leftarrow q$. \:::Pokud $slovo(q) \neq \emptyset$, pak $out(v) \leftarrow q$. \::::Jinak $out(v) \leftarrow out(q)$. +\:::Vlo¾íme $v$ do~fronty $F$. \endalgo -To, ¾e tento algoritmus zkonstruuje zpìtné hrany jak má, vyplývá z~toho, ¾e nedìláme nic jiného, ne¾ ¾e spou¹tíme výpoèty po~hladinách na~v¹echna hledaná slova bez prvního písmenka. Stejnì tak to, ¾e dobìhne v~lineárním èase je takté¾ dùsledkem toho, ¾e efektivnì spou¹tíme v¹echny tyto výpoèty. Jen nìkdy udìláme najednou krok dvou èi více výpoètù (napøíklad |araba| a~|arbara| se poèítají na~zaèátku, dokud jsou stejné, jen jednou). Èasová slo¾itost této konstrukce je tedy men¹í nebo rovna souètu èasových slo¾itostí výpoètù nad v¹emi tìmi slovy. To u¾ ale víme, ¾e je lineární v~celkové délce tìchto slov. Konstrukce automatu tedy trvá nejvý¹e tolik, co hledání v¹ech $\iota_i$, co¾ je $\O(\sum_{i} \iota_i)$. +To, ¾e tento algoritmus zkonstruuje zpìtné hrany jak má, vyplývá z~toho, ¾e nedìláme nic jiného, ne¾ ¾e spou¹tíme výpoèty po~hladinách na~v¹echna hledaná slova bez prvního písmenka. Stejnì tak to, ¾e dobìhne v~lineárním èase, je takté¾ dùsledkem toho, ¾e efektivnì spou¹tíme v¹echny tyto výpoèty. Jen nìkdy udìláme najednou krok dvou èi více výpoètù (napøíklad |araba| a~|arbara| se poèítají na~zaèátku, dokud jsou stejné, jen jednou). Èasová slo¾itost této konstrukce je tedy men¹í nebo rovna souètu èasových slo¾itostí výpoètù nad v¹emi tìmi slovy. To u¾ ale víme, ¾e je lineární v~celkové délce tìchto slov. Konstrukce automatu tedy trvá nejvý¹e tolik, co hledání v¹ech $\iota_i$, co¾ je $\O(\sum_{i} \iota_i)$. \s{Vìta:} Algoritmus Aho-Corasicková najde v¹echny výskyty v~èase $$\O\left(\sum_i~\iota_i~+~S~+~\sharp\\right).$$ diff --git a/7-geom/7-geom.tex b/7-geom/7-geom.tex index 115f674..87e9471 100644 --- a/7-geom/7-geom.tex +++ b/7-geom/7-geom.tex @@ -113,7 +113,7 @@ projdeme v do konvexního obalu patøí. Po $h$ krocích dostaneme zpìt k nejlevìj¹ímu bodu a výpoèet ukonèíme. V ka¾dém kroku potøebujeme projít v¹echny body a vybrat následníka, co¾ doká¾eme v èase $\O(n)$. Celková slo¾itost algoritmu je tedy $\O(n \cdot h)$. -\twofigures{7-geom6_provazkovy_algoritmus.eps}{Provázkový algoritmus.}{1.25in}{7-geom7_naslednik_pres_konvexni_obal.eps}{Hledání kandidáta v pøedpoèítaném obalu}{2.5in} +\twofigures{7-geom6_provazkovy_algoritmus.eps}{Provázkový algoritmus.}{1.25in}{7-geom7_naslednik_pres_konvexni_obal.eps}{Hledání kandidáta v pøedpoèítaném obalu.}{2.5in} Provázkový algoritmus funguje, ale má jednu obrovskou nevýhodu -- je toti¾ ukrutnì pomalý. Ký¾eného zrychlení dosáhneme, pokud pou¾ijeme pøedpoèítané konvexní obaly. Ty umo¾ní rychleji hledat následníka. Pro ka¾dou z mno¾in $Q_i$ najdeme zvlá¹» kandidáta a poté z nich vybereme toho nejlep¹ího. diff --git a/8-geom2/8-geom2.tex b/8-geom2/8-geom2.tex index 7939d7a..a7f765f 100644 --- a/8-geom2/8-geom2.tex +++ b/8-geom2/8-geom2.tex @@ -114,7 +114,7 @@ Zkus mnoho vrcholù, hran a stìn -- pro $v$ vrcholù, $e$ hran a $f$ stìn je $e \le 3v-6$ a navíc $v+f = e+2$. Tedy slo¾itost diagramu je lineární vzhledem k poètu zadaných bodù $n=f$, $\O(n)$. Navíc Voroného diagram lze zkonstruovat v èase $\O(n \log n)$, napøíklad pomocí zametání roviny nebo metodou rozdìl a panuj. Tím se v¹ak zabývat nebudeme,\foot{Pro zvídavé, kteøí nemají zkou¹ku druhý den ráno: Detaily naleznete v zápiscích z pøedloòského -ADSka.} místo toho si uká¾eme, jak v ji¾ spoèteném Voroného diagramu rychlé hledat nejbli¾¹í body. +ADSka.} místo toho si uká¾eme, jak v ji¾ spoèteném Voroného diagramu rychle hledat nejbli¾¹í body. \h{Lokalizace bodu uvnitø mnohoúhelníkové sítì} diff --git a/9-fft/9-fft.tex b/9-fft/9-fft.tex index d20bff6..0143020 100644 --- a/9-fft/9-fft.tex +++ b/9-fft/9-fft.tex @@ -225,7 +225,7 @@ P(\omega^{n - 1})$. \algo \:Pokud $n = 1$, vrátíme $p_{0}$ a~skonèíme. -\:Jinak rozdìlíme $P$ èleny se sudými a lichými exponenty (jako v pùvodní +\:Jinak rozdìlíme $P$ na èleny se sudými a lichými exponenty (jako v pùvodní my¹lence) a~rekurzivnì zavoláme FFT($P_s$, $\omega^{2}$) a~FFT($P_l$, $\omega^{2}$) -- $P_l$ i~$P_s$ jsou stupnì max. $n/2-1$, $\omega^2$ je $n/2$-tá primitivní odmocnina, a mocniny $\omega^2$ jsou stále po dvou @@ -316,7 +316,7 @@ $\Theta(n \log n)$ pro vyhodnocen \:Zpracování signálu -- rozklad na~siny a~cosiny o~rùzných frekvencích $\Rightarrow$ spektrální rozklad. -\:komprese dat -- napøíklad formát JPEG. +\:Komprese dat -- napøíklad formát JPEG. \:Násobení dlouhých èísel v~èase $\Theta(n \log n)$. \endlist