Budeme chtít spoèítat jejich souèet $z_nz_{n-1}\ldots z_1z_0$.
\h{Algoritmus základní ¹koly}
-Pøenosy oznaèíme $c_0$ a¾ $c_{n-1}$ v krocích poèítání, dodefinujeme $c_{-1}=0$. Algoritmus probíhá zleva od místa s nejni¾¹í vahou, viz Obrázek 1.6.
+Pøenosy oznaèíme $c_0$ a¾ $c_{n-1}$ v krocích poèítání, dodefinujeme $c_{-1}=0$. Algoritmus probíhá zleva od místa s nejni¾¹í vahou, viz Obrázek 1.7.
-Výsledné èíslo $z_{n}...z_1z_0$ lze tedy vyjádøit pøedpisem $$z_i=x_i \oplus y_i \oplus c_{i-1}$$ kde $\oplus$ znaèí operaci XOR. Pøenos nastane, pokud je alespoò 1 èíslo jednièka, tedy
+Výsledné èíslo $z_{n}...z_1z_0$ lze tedy vyjádøit pøedpisem: $$z_i=x_i \oplus y_i \oplus c_{i-1},$$ kde $\oplus$ znaèí operaci XOR. Pøenos nastane, pokud je alespoò 1 èíslo jednièka, tedy
$$c_i=(x_i \land y_i)\lor((x_i \lor y_i) \land c_{i-1})$$.
-\figure{1_6_hloupe_scitani.eps}{Obrázek 1.7 sèítání}{8cm}
-Bohu¾el na to abychom spoèítali $z_i$ musíme znát hodnotu $c_{i-1}$, tedy mít spoèítané hodnoty pro v¹echny èísla men¹í ne¾ i. To dává lineární èasovou slo¾itost. Zamysleme se nad tím jak by se proces sèítání mohl zrychlit.
+\figure{1_6_hloupe_scitani.eps}{Obrázek 1.7 -- Sèítání}{8cm}
+Bohu¾el na to abychom spoèítali $z_i$ musíme znát hodnotu $c_{i-1}$, tedy mít spoèítané hodnoty pro v¹echny èísla men¹í ne¾ $i$. To dává lineární èasovou slo¾itost. Zamysleme se nad tím jak by se proces sèítání mohl zrychlit.
-\h{Trik - chování blokù souètu}
+\h{Trik -- chování blokù souètu}
-\figure{1_7_blok_scitani.eps}{Obrázek 1.8 - Blok souètu}{8cm}
+\figure{1_7_blok_scitani.eps}{Obrázek 1.8 -- Blok souètu}{8cm}
\>Blok se mù¾e chovat tøemi rùznými zpùsoby:
\numlist{\ndotted}
-\:V¾dy vydá pøenos 0
-\:V¾dy vydá pøenos 1
-\:Kopíruje (pøedá dál)
+\:V¾dy vydá pøenos 0,
+\:V¾dy vydá pøenos 1,
+\:Kopíruje (pøedá dál).
\endlist
\h{Rozdìlení a skládání blokù}
-Blok B lze rozdìlit na 2 bloky p,q (pokud B není trivální)
-\figure{1_10_konvence_deleni_bloku.eps}{Obrázek 1.9 - Dìlení blokù}{3cm}
+\>Blok B lze rozdìlit na dva bloky p, q (pokud B není trivální).
+\figure{1_10_konvence_deleni_bloku.eps}{Obrázek 1.9 -- Dìlení blokù}{3cm}
\h{Triviální bity}
-\figure{1_11_tabulka_kodovani.eps}{Obrázek 1.10 - Tabulka triviálních bitù}{3cm}
+\figure{1_11_tabulka_kodovani.eps}{Obrázek 1.10 -- Tabulka triviálních bitù}{3cm}
-\s{Tvrzení:} Ka¾dý blok mohu postavit z triviálních bitù.
+\s{Tvrzení:} Ka¾dý blok mohu postavit z~triviálních bitù.
\proof
Dùkaz indukcí z asociativity.
\h{Kódování typù chování blokù}
%\>{\I Sem tabulku prosím :)}
-\>Definujeme (a,x) :
+\>Definujeme (a,x):
\itemize\ibull
-\:$(1,*) = <$
-\:$(0,0) = 0$
+\:$(1,*) = <$,
+\:$(0,0) = 0$,
\:$(0,1) = 1$
\endlist
-\>a operaci skládání blokù $\sigma$ pro kterou platí
+\>a operaci skládání blokù $\sigma$ pro kterou platí:
-$(a,x) \sigma (b,y) = (c,z)$
+$(a,x) \sigma (b,y) = (c,z)$,
\>kde
-$c = a \land b$
+$c = a \land b$,
-$z = (\neg a \land x) \lor (a \land y)$
+$z = (\neg a \land x) \lor (a \land y)$.
\h{Lep¹í algoritmus sèítání}
-V na¹em pùvodním algoritmu ze základní ¹koly jsme mìli O(n) hradel v O(n) hladinách. Algoritmus tedy nebyl paralelní a trval èas O(n).
+V na¹em pùvodním algoritmu ze základní ¹koly jsme mìli $\O(n)$ hradel v~$\O(n)$ hladinách. Algoritmus tedy nebyl paralelní a trval èas $\O(n)$.
-\figure{1_9_deleni_bloku.eps}{Obrázek 1.11 - Výpoèet pøenosu}{8cm}
+\figure{1_9_deleni_bloku.eps}{Obrázek 1.11 -- Výpoèet pøenosu}{8cm}
Víme pro ka¾dý blok velikosti $2^k$ na pozici dìlitelné $2^k$ jeho chování.
-Teï, kdy¾ u¾ známe v¹echny zbytky $c_0$ a¾ $c_n$ mù¾eme u¾ jednodu¹e v konstantním èase spoèítat výsledek.
+Teï, kdy¾ u¾ známe v¹echny zbytky $c_0$ a¾ $c_n$, mù¾eme u¾ jednodu¹e v konstantním èase spoèítat výsledek.
\prednaska{10}{Pøevody problémù}{(zapsali Martin Chytil, Vladimír Kudelas)}
-Na této pøedná¹ce se budeme zabývat rozhodovacími problémy a pøevody mezi nimy.
+\>Na této pøedná¹ce se budeme zabývat rozhodovacími problémy a pøevody mezi nimi.
-\s{Definice:} {\I Rozhodovací problém} je takový problém, jeho¾ výstupem je v¾dy {\sc ano} nebo {\sc ne}
+\s{Definice:} {\I Rozhodovací problém} je takový problém, jeho¾ výstupem je v¾dy {\sc ano}, nebo {\sc ne}.
-\s{Pøíklad:} Je dán bipartitní graf $G$, $k \in N$. Existuje v $G$ párování, které obsahuje alespoò $k$ hran?
+\s{Pøíklad:} Je dán bipartitní graf $G$, $k \in {\bb N}$. Existuje v $G$ párování, které obsahuje alespoò $k$ hran?
-\s{Pøíklad:} Daný problém pøevedeme na jiný: Párování $\rightarrow$ (lze pøevést) $\rightarrow$ hledání maximálního toku.
-Tzn. Existuje v síti $G$ tok velikosti alespoò $k$?
+\s{Pøíklad:} Daný problém pøevedeme na jiný: Párování $\rightarrow$ hledání maximálního toku (¹ipka znamená \uv{lze pøevést}).
+Tzn. existuje v síti $G$ tok velikosti alespoò $k$?
\s{Obecnì se dá øici:} Pokud daný pro problém umíme rozhodnout, zda platí $\Rightarrow$ umíme najít øe¹ení problému.
-\s{Pøíklad:} Mìjme èernou skøíòku (fungující v polynomiálním èase), která odpoví, zda daný graf má nebo nemá perfektní párování. Odebereme hranu a zeptáme se, jestli i tento nový graf má pefektní párovaní. Kdy¾ má, tak tahle hrana nebyla potøebná pro párování, vyhodíme ji, proto¾e ji nepotøebujeme.
-Kdy¾ nemá (hrana patøí do párování), tak si danou hranu poznamenáme a odebereme ji i její vrcholy a také hrany, které vedli do tìchto vrcholù. Toto je korektní krok, proto¾e v pùvodním grafu tyto vrcholy byly navzájem spárované, a tedy nemohou být spárované s ¾ádnými jinými vrcholy.
-Tohle iterujeme dokud to jde. Výsledkem je mno¾ina hran, které patøí do maximálního párování. Tím jsme dané párování nalezli.
-Hran je polynomiálne mnoho a skøíòka funguje v polynomiálním èase, tak¾e algoritmus je polynomiální.
-\s{Definice:} Jsou-li A, B rozhodovací problémy, pak øíkáme, ¾e A lze redukovat na B ($A \rightarrow B$) $\Leftrightarrow$ existuje funkce $f$ spoèitatelná v polynomiálním èase, t¾. pro $\forall x: A(x) = B(f(x))$
+\s{Pøíklad:} Mìjme èernou skøíòku (fungující v polynomiálním èase), která odpoví, zda daný graf má nebo nemá perfektní párování. Odebereme hranu a zeptáme se, jestli i tento nový graf má pefektní párovaní. Kdy¾ má, tak tato hrana nebyla potøebná pro párování, vyhodíme ji, proto¾e ji nepotøebujeme.
+Kdy¾ nemá (hrana patøí do párování), tak si danou hranu poznamenáme a odebereme ji i její vrcholy a také hrany, které vedly do tìchto vrcholù. Toto je korektní krok, proto¾e v pùvodním grafu tyto vrcholy byly navzájem spárované, a tedy nemohou být spárované s~¾ádnými jinými vrcholy.
+Takto iterujeme, dokud to jde. Výsledkem je mno¾ina hran, které patøí do maximálního párování. Tím jsme dané párování nalezli.
+Hran je polynomiálnì mnoho a skøíòka funguje v polynomiálním èase, tak¾e algoritmus je polynomiální.
-\s{Pøíklad:} Bipartitní graf $\rightarrow$ Tok v síti
-funkce $f$ je funkce, která vezme bipartitní graf a vyrobí z nìj regulerní sí» (pøidá zdroj, stok, hrany + ohodnocení)
+\s{Definice:} Jsou-li A, B rozhodovací problémy, pak øíkáme, ¾e A lze redukovat na B ($A \rightarrow B$) $\Leftrightarrow$ existuje funkce $f$ spoèitatelná v polynomiálním èase taková, ¾e pro $\forall x: A(x) = B(f(x))$.
+
+\s{Pøíklad:} Bipartitní graf $\rightarrow$ Tok v síti.
+Funkce $f$ je funkce, která vezme bipartitní graf a vyrobí z~nìj regulerní sí» (pøidá zdroj, stok, hrany a ohodnocení).
\s{Nìco málo o slo¾itosti:}
-Kdy¾ $A$ lze redukovat na $B$ a $B$ umíme vyøe¹it v èase $O(\vert vstup \vert^l) = O(\vert f(x)\vert^l)$
-$ pro vstup x: \vert x \vert = n$
-$ \vert f(x)\vert = O(n^k)$ pro nìjaké k
-B poèíta v èase $O(n^{kl})$
-$f$ poèíta v polynomiálním èase $\rightarrow$ mù¾e vydat maximálne polynomiální výstup
+Kdy¾ $A$ lze redukovat na $B$ a $B$ umíme vyøe¹it v èase $\O(\vert $vstup$ \vert^l) = \O(\vert f(x)\vert^l)$
+ pro vstup $x: \vert x \vert = n$
+$ \vert f(x)\vert = \O(n^k)$ pro nìjaké $k$,
+B poèítá v~èase $\O(n^{kl})$,
+$f$ poèítá v polynomiálním èase $\rightarrow$ mù¾e vydat maximálnì polynomiální výstup.
-\s{Pozorování:} funkce $f$ je:
+\s{Pozorování:} Funkce $f$ je:
\itemize\ibull
-\:reflexivní (úlohu mù¾eme identicky pøevést na tu stejnou), $A \rightarrow A$
-\:tranzitivní, $A \rightarrow B$ funkcí $f$, $B \rightarrow C$ funkcí $g$, $A \rightarrow C$ slo¾enou funkcí $(f o g)$
+\:reflexivní (úlohu mù¾eme identicky pøevést na tu stejnou), $A \rightarrow A$,
+\:tranzitivní, $A \rightarrow B$ funkcí $f$, $B \rightarrow C$ funkcí $g$, $A \rightarrow C$ slo¾enou funkcí $(f \circ g)$.
\endlist
-\h{1.Problém: SAT}
-\itemize\ibull
-\:splnitelnost logických formulí
-\:tj. dosazení $0,1$ do logické formule tak, aby formule platila
-\endlist
+\h{1. problém: SAT}
+\>Splnitelnost logických formulí, tj. dosazení $0$ èi $1$ do logické formule tak, aby formule platila.
+
+\>Zamìøíme se na speciální formu zadání formulí, {\I konjunktivní normální formu} (CNF):
+$$(\ldots\lor\ldots\lor\ldots\lor\ldots) \land (\ldots\lor\ldots\lor\ldots\lor\ldots) \land \ldots $$
+
+\>{\I Vstup:} Formule v konjunktivní normální formì.
-Zamìøíme se na speciální formu zadání formulí - konjunktivní normální forma:
-$$(\ldots\lor\ldots\lor\ldots\lor\ldots\lor) \& (\ldots\lor\ldots\lor\ldots\lor\ldots\lor) \& \ldots $$
+\>{\I Výstup} $\exists$ dosazení $0$ a $1$ za promìnné takové, ¾e hodnota formule $\phi(\ldots) = 1$.
-{\I Vstup:} formule v konjunktivní normální formì (CNF)
-{\I Výstup} $\exists$ dosazení $0/1$ za promìnné t.¾. $\phi(\ldots) = 1$.
+$$ \phi(x, y, \ldots) = (x \lor \lnot y \lor \ldots) \land (\ldots\lor\ldots\lor\ldots\lor\ldots) \land \ldots $$
+
+\>Pro formuli platí následující podmínky:
-$$ \phi(x, y, \ldots) = (x \lor \lnot y \lor \ldots) \& (\ldots\lor\ldots\lor\ldots\lor\ldots\lor) \& \ldots $$
\itemize\ibull
-\:formule zadána pomocí klauzulí oddìlených \&,
+\:formule je zadána pomocí klauzulí oddìlených $\land$,
\:ka¾dá klauzule je slo¾ená z literálù oddìlených $\lor$,
-\:ka¾dý literál je slo¾ený z promìnných, nebo $\lnot$ promìnných
+\:ka¾dý literál je slo¾ený z promìnných, nebo negovaných promìnných.
\endlist
-Uká¾eme, ¾e staèí vyøe¹it jednodu¹¹í problém 3-SAT.
+\>Uká¾eme, ¾e staèí vyøe¹it jednodu¹¹í problém 3-SAT.
+
+\h{2. problém: 3-SAT}
+\s{Definice:} 3-SAT je takový SAT, kde ka¾dá klauzule obsahuje nejvý¹e tøi literály.
+
+\s{Pøevod 3-SAT na SAT:}
+Platí identita, 3-SAT splòuje vlastnosti SATu, proto 3-SAT = SAT (3-SAT je alespoò tak tì¾ký, jako SAT)
-\h{2.Problém: 3-SAT}
-{\I 3-SAT} je SAT, kde ka¾dá klauzule obsahuje nejvý¹e 3 literály
+\s {Pøevod SAT na 3-SAT:}
+Musíme formuli pøevést tak, abychom neporu¹ili splnitelnost.
-\s{Pøevod 3-SAT na SAT}
-platí identita, 3-SAT splòuje vlastnosti SATu, proto 3-SAT = SAT (3-SAT je alespoò tak tì¾ký, jako SAT)
+\>Trik pro dlouhé klauzule:
+$$(\alpha \lor \beta) \hbox{, t¾. } \vert\alpha\vert + \vert\beta\vert \ge 4$$
+pøepí¹eme na: $$(\alpha \lor x) \land (\beta \lor \lnot x),$$
+kde $x$ je nová promìnná, kterou nastavíme tak, abychom neovlivnili splnitelnost formule.
-\s {Pøevod SAT na 3-SAT}
-- musíme formuli pøevést tak, abychom neporu¹ili splnitelnost
-{\I trik pro dlouhé klauzule:}
-$$(\alpha \lor \beta) t¾. \vert\alpha\vert + \vert\beta\vert \ge 4$$
-pøepí¹eme na: $$(\alpha \lor x) \& (\beta \lor \lnot x)$$
-$x$ je nová promìnná, kterou nastavíme tak, abychom neovlivnili splnitelnost formule
-platí-li:
+\>Platí-li:
\itemize\ibull
-\:$\alpha \rightarrow x = 0$ (zajistí splnìní druhé poloviny nové formule)
-\:$\beta \rightarrow x = 1$ (zajistí splnìní první poloviny nové formule)
-\:$\alpha ,\beta / \lnot\alpha ,\lnot\beta \rightarrow x = 0/1$ (je nám to jedno, celkové øe¹ení nám to neovlivní)
-Hodnota x nám pùvodní formuli nijak neovlivní, proto¾e se v ní nevyskytuje, proto ji mù¾eme nastavit, jak chceme my.
-Tento trik opakujeme tak dlouho, dokud je to tøeba.
+\:$\alpha \Rightarrow x = 0$ (zajistí splnìní druhé poloviny nové formule),
+\:$\beta \Rightarrow x = 1$ (zajistí splnìní první poloviny nové formule),
+\:$\alpha ,\beta / \lnot\alpha ,\lnot\beta \Rightarrow x = 0/1$ (je nám to jedno, celkové øe¹ení nám to neovlivní).
+
+Hodnota $x$ nám pùvodní formuli nijak neovlivní, proto¾e se v ní nevyskytuje, proto ji mù¾eme nastavit, jak chceme.
\endlist
-{\I poznámka} u 3-SAT lze vynutit právì $3$ literály, pro krátké klauzule pou¾ijeme následující trik:
-$$(a) \rightarrow (a \lor x) \& (a \lor \lnot x) $$
+\>Tento trik opakujeme tak dlouho, dokud je to tøeba.
+
+\s{Poznámka:} U~3-SAT lze vynutit právì tøi literály, pro krátké klauzule pou¾ijeme následující trik:
+$$(a) \rightarrow (a \lor x) \land (a \lor \lnot x).$$
-\h{3. Problém: Hledání nezávislé mno¾iny v grafu}
-\s{Definice:} {\I Nezávislá mno¾ina:} je tvoøena vrcholy grafu, které spolu nemají spoleènou hranu
+\h{3. problém: Hledání nezávislé mno¾iny v grafu}
-{\I Vstup:} Neorientovaný graf G, $k \in N$
-{\I Výstup:} $\exists A \subseteq V(G)$, $\vert A \vert \ge k$, $u,v \in A \Rightarrow (uv) \not\in E(G)$ ?
+\>Existuje nezávislá mno¾ina vrcholù z~$G$ velikosti alespoò $k$?
-Úlohu øe¹íme tak, ¾e problém 3-SAT pøevedeme tuto úlohu.
+\s{Definice:} {\I Nezávislá mno¾ina} (NzMna) je tvoøena vrcholy grafu, které spolu nemají spoleènou hranu.
-\s{poznámka:} Ka¾dý graf má minimálnì jednu nezávislou mno¾inu, a tou je prázdná mno¾ina.
+\>{\I Vstup:} Neorientovaný graf G, $k \in N$.
+
+\>{\I Výstup:} $\exists A \subseteq V(G)$, $\vert A \vert \ge k$, $u,v \in A \Rightarrow (uv) \not\in E(G)$?
+
+\>Úlohu øe¹íme tak, ¾e problém 3-SAT pøevedeme tuto úlohu.
+
+\s{Poznámka:} Ka¾dý graf má minimálnì jednu nezávislou mno¾inu, a tou je prázdná mno¾ina.
-\s{øe¹ení úlohy:} Z ka¾dé klauzule vybereme $1$ literál tak, abychom v rùzných klauzulích nevybírali konfliktnì, tj. $x a \lnot x$
+\s{Øe¹ení úlohy:} Z ka¾dé klauzule vybereme jeden literál tak, abychom v rùzných klauzulích nevybírali konfliktnì, tj. $x$ a $\lnot x$.
-\s {pøíklad}
-$$(x \lor y \lor z) \& (x \lor \lnot y \lor \lnot z) \& (\lnot x \lor \lnot y \lor p) $$
-pro ka¾dou klauzuli sestrojíme graf (trojúhelník) + pøidáme "konfliktní" hrany tj. $x a \lnot x$
+\s{Pøíklad:}
+$(x \lor y \lor z) \land (x \lor \lnot y \lor \lnot z) \land (\lnot x \lor \lnot y \lor p) $.
-Princip je takový, ¾e z ka¾dé klauzule si vybereme promìnnou, která danou klauzuli splní a to, aby promìnné, které si vybereme nekolidovali, vyøe¹íme hranami mezi promìnnými a jejich negacemi.
+\>Pro ka¾dou klauzuli sestrojíme graf (trojúhelník) a pøidáme \uv{konfliktní} hrany, tj. $x$ a $\lnot x$.
-Existuje NzMna velikosti rovné poètu klauzulí?
+Princip je takový, ¾e z~ka¾dé klauzule si vybereme promìnnou, která danou klauzuli splní, a to, aby promìnné, které si vybereme, nekolidovaly, vyøe¹íme hranami mezi promìnnými a jejich negacemi.
+
+Existuje nezávislá mno¾ina velikosti rovné poètu klauzulí?
Pokud ano, tak dostaneme seznam promìnných, pomocí kterých splníme danou formuli.
-\h{4. Problém: Klika}
-{\I Vstup:} Graf $G, k \in N$
-{\I Výstup:} $\exists$ úplný podgraf grafu $G$ na $k$ vrcholech ?
-\s{øe¹ení:} prohodíme hrany a nehrany $\rightarrow$ hledání nezávislé mno¾iny
-\s{dùvod:} pokud existuje úplný graf na $k$ vrcholech, tak v "invertovaném" grafu tyto vrcholy nejsou spojeny hranou, tj. tvoøí nezávislou mno¾inu
+\h{4. problém: Klika}
+
+\>{\I Vstup:} Graf $G, k \in N$.
-\s{Pøíklad:} (viz obrázky)
+\>{\I Výstup:} $\exists$ úplný podgraf grafu $G$ na $k$ vrcholech?
-\s{Pøevod NzMna na SAT}
-Máme promìnné $v_1 \ldots v_n$ pro vrcholy
+\s{Øe¹ení:} Prohodíme hrany a nehrany $\rightarrow$ hledání nezávislé mno¾iny.
-pro ka¾dé $(i,j) \in E(G)$ pøidáme klauzuli $(\lnot vi \lor \lnot vj)$
+\s{Dùvod:} Pokud existuje úplný graf na $k$ vrcholech, tak v~\uv{invertovaném} grafu tyto vrcholy nejsou spojeny hranou, tj. tvoøí nezávislou mno¾inu.
+\s{Pøíklad:} (Viz obrázky.)
-prvek matice $x_{i,j} = 1 \Leftrightarrow i$-tý prvek je vrchol $j$, tj. $\forall i,j$, $x_{ij} \Rightarrow v_j$
+\s{Pøevod NzMna na SAT:}
+Máme promìnné $v_1, \ldots , v_n$ pro vrcholy.
+
+\itemize\ibull
+\:Pro ka¾dé $(i,j) \in E(G)$ pøidáme klauzuli $(\lnot vi \lor \lnot vj)$.
+\:Prvek matice $x_{i,j} = 1 \Leftrightarrow i$-tý prvek je vrchol $j$, tj. $\forall i,j$, $x_{ij} \Rightarrow v_j$.
+\:$\forall j,i,i^{'}, i\ne i^{'} : x_{ij} \Rightarrow x_{i^{'}j}$.
+\:$\forall i,j,j^{'}, j\ne j^{'} : x_{ij} \Rightarrow x_{ij^{'}}$.
+\endlist
-$\forall j,i,i^{'}, i\ne i^{'} : x_{ij} \Rightarrow x_{i^{'}j}$
-$\forall i,j,j^{'}, j\ne j^{'} : x_{ij} \Rightarrow x_{ij^{'}}$
+\h{5. problém: 3D párování (3D matching)}
+\>{\I Vstup:} Tøi mno¾iny, napø. K (kluci), H (holky), Z (zvíøátka) a mno¾ina kompatibilních trojic (tìch, kteøí se spolu snesou).
-\h{5. Problém: 3D -- párování (matching)}
-{\I Vstup:} Mno¾ina K, H, Z + mno¾ina kompatibilních 3-ic (ti, kteøí se spolu snesou)
-{\I Výstup:} Perfektní podmno¾ina 3-ic
-\s{Øe¹ení:} pøes 3,3-SAT (konkrétnìji viz dal¹í pøedná¹ka)
+\>{\I Výstup:} Perfektní podmno¾ina trojic.
+\s{Øe¹ení:} Pøes 3,3-SAT (konkrétnìji, viz dal¹í pøedná¹ku).
-\h{3,3-SAT}
-\s{Definice:} {\I 3,3-SAT} je speciální pøípad 3-SATu, kde ka¾dá promìnná se vyskytuje v maximálnì 3 literálech
-\s{Pøevod 3-SAT na 3,3-SAT}
-Pokud se promìnná $x$ vyskytuje v $k > 3$ literálech, tak nahradíme výskyty novými promìnnými $x_1 \ldots x_k$ a pøidáme klauzule
+\h{6. problém: 3,3-SAT}
+\s{Definice:} 3,3-SAT je speciální pøípad 3-SATu, kde ka¾dá promìnná se vyskytuje v~maximálnì tøech literálech.
+
+\s{Pøevod 3-SAT na 3,3-SAT:}
+Pokud se promìnná $x$ vyskytuje v~$k > 3$ literálech, tak nahradíme výskyty novými promìnnými $x_1, \ldots , x_k$ a pøidáme klauzule:
$$
(\lnot x_1 \lor x_2)
(\lnot x_2 \lor x_3)
(\lnot x_3 \lor x_4)
\ldots
(\lnot x_{k-1} \lor x_k)
-(\lnot x_k \lor x_1)
+(\lnot x_k \lor x_1),
$$
co¾ odpovídá:
(x_3 \Rightarrow x_4)
\ldots
(x_{k-1} \Rightarrow x_k)
-(x_k \Rightarrow x_1)
+(x_k \Rightarrow x_1).
$$
-tímto zaruèíme, ¾e v¹echny promìnné budou mít stejnou hodnotu.
+
+Tímto zaruèíme, ¾e v¹echny promìnné budou mít stejnou hodnotu.
\bye
Pro $k=0$ je urèitì $A_0(0)=0$, $A_0(c)=\infty$ pro $c>0$. Pokud ji¾ známe
$A_{k-1}$, spoèítáme $A_k$ následovnì: $A_k(c)$ odpovídá nìjaké podmno¾inì
pøedmìtù z~$1,\ldots,k$. V~této podmno¾inì jsme buïto $k$-tý pøedmìt nepou¾ili
-(a pak je $A_k(c)=A_{k-1}(c)$) nebo pou¾ili a tehdy bude $A_k(c) = A_{k-1}(c-c_k) + h_k$
+(a pak je $A_k(c)=A_{k-1}(c)$), nebo pou¾ili a tehdy bude $A_k(c) = A_{k-1}(c-c_k) + h_k$
(to samozøejmì jen pokud $c\ge c_k$). Z~tìchto dvou mo¾ností si vybereme tu,
která dává mno¾inu s~men¹í hmotností. Tedy:
$$
\s{Verze bez cen:} Na verzi s~cenami rovnými hmotnostem se dá pou¾ít
i jiný algoritmus zalo¾ený na~dynamickém programování: poèítáme mno¾iny
-$Z_k$, obsahující v¹echny hmotnosti men¹í ne¾~$H$, kterých nabývá
+$Z_k$ obsahující v¹echny hmotnosti men¹í ne¾~$H$, kterých nabývá
nìjaká podmno¾ina prvních~$k$ prvkù. Pøitom $Z_0=\{0\}$, $Z_k$
-spoèteme z~$Z_{k-1}$ a ze~$Z_n$ vyèteme výsledek. V¹echny tyto mno¾iny
+spoèteme ze~$Z_{k-1}$ a ze~$Z_n$ vyèteme výsledek. V¹echny tyto mno¾iny
mají nejvý¹e $H$ prvkù, tak¾e celková èasová slo¾itost algoritmu je~$\O(nH)$.
\h{Aproximaèní schéma pro problém batohu}
\h{Motivaèní úlohy:}
\itemize\ibull
\:Mìjme orientovaný graf se speciálními vrcholy ®elivka a Kanál pøedstavující pra¾ské vodovody. V tomto grafu budou vrcholy vodovodními stanicemi a hrany trubkami mezi nimi. Kolik vody proteèe ze ®elivky do Kanálu?
-\:Mìjme orientovaný graf pøedstavující ¾eleznièní sí»; graf má význaèné vrcholy Moskva a Fronta, ka¾dá hrana grafu má kapacitu, kterou mù¾e uvézt. Kolik vojákù je schopna sí» pøevézt z Moskvy a spotøebovat na Frontì?
+\:Mìjme orientovaný graf pøedstavující ¾eleznièní sí»; graf má význaèné vrcholy Moskva a Fronta, ka¾dá hrana grafu má kapacitu, kterou mù¾e uvézt. Kolik vojákù je schopna sí» pøevézt z~Moskvy a spotøebovat na Frontì?
\endlist
\s{Definice:} {\I Sí»} je uspoøádaná ètveøice $(G,z,s,c)$, kde $G$ je orientovaný graf, $z$~a~$s$~jsou jeho vrcholy ({\I zdroj} a {\I stok}) a $c$ je kapacita sítì, kterou pøedstavuje funkce $c:\break E(G)\to{\bb R}_{0}^{+}$.
\par\noindent {\sl Intuice:} Toky v sítích pøedstavují rozvr¾ení, jakým suroviny sítí poteèou.
-\s{Definice:} {\I Tok} je funkce $f:E(G)\to\bb R$ taková, ¾e platí:
+\s{Definice:} {\I Tok} je funkce $f:E(G)\to{\bb R}_{0}^{+}$ taková, ¾e platí:
\numlist{\ndotted}
\:Tok ka¾dé hrany je omezen její kapacitou: $0\le f(e)\le c(e)$.
\:Kirchhoffùv zákon -- \uv{sí» tìsní}: $$\sum_{xu \in E}{f(xu)}=\sum_{ux \in E}{f(ux)}\quad\hbox{pro ka¾dé }u\in V(G) \setminus \{z,s\}.$$
\s{Poznámka:} Pokud bychom se chtìli v definici toku u bodu 2 vyhnout podmínkám pro $z$ a $s$, mù¾eme zdroj a stok vzájemnì propojit (pak jde o tzv. cirkulaci).
-\s{Poznámka:} V angliètinì se obvykle zdroj znaèí \uv{$s$} a stok \uv{$t$} (zkratky source a~target).
+\s{Poznámka:} V angliètinì se obvykle zdroj znaèí \uv{$s$} a stok \uv{$t$} (jako source a~target).
\figure{tok.eps}{Pøíklad toku. Èísla pøedstavují ohodnocení funkcí toku a kapacity.}{4in}
-\s{Definice:} {\I Velikost toku} $f$ je: $$w(f)=\sum_{zx \in E}{f(zx)}-\sum_{xz \in E}{f(xz)}.$$
+\s{Definice:} {\I Velikost toku} $f$ je: $$w(f):=\sum_{zx \in E}{f(zx)}-\sum_{xz \in E}{f(xz)}.$$
\s{Vìta:} Pro ka¾dou sí» existuje maximální tok.
-\par\noindent {\sl Idea dùkazu:} Doká¾e se pomocí metod matematické analýzy s tím, ¾e mno¾ina tokù je kompaktní a funkce velikosti toku je spojitá (dokonce lineární).
+\par\noindent {\sl Idea dùkazu:} Doká¾e se pomocí metod matematické analýzy s~tím, ¾e mno¾ina tokù je kompaktní a funkce velikosti toku je spojitá (dokonce lineární).
-\par\noindent {\sl Intuice:} Øez v grafu je mno¾ina hran oddìlující zdroj a stok.
+\par\noindent {\sl Intuice:} Øez v~grafu je mno¾ina hran oddìlující zdroj a stok.
-\s{Definice:} {\I Øez} $R$ v síti $(G,z,s,c)$ je mno¾ina hran $R$ taková, ¾e neexistuje cesta ze $z$ do $s$ v grafu $(V(G),E(G)\setminus R)$.
+\s{Definice:} {\I Øez} $R$ v síti $(G,z,s,c)$ je mno¾ina hran $R$ taková, ¾e neexistuje cesta ze $z$~do $s$~v~grafu $(V(G),E(G)\setminus R)$.
\s{Definice:} {\I Kapacita øezu} $c(R)=\sum_{uv \in R}{c(uv)}$.
-\s{Vìta (Hlavní vìta o tocích, Ford-Fulkerson):} Mìjme $S$ sí». Platí: $$\max_{f\hbox{ tok}}{w(f)=\min_{R\hbox{ øez}}{c(R)}}.$$
+\s{Vìta (Hlavní vìta o tocích, Ford-Fulkerson):} Mìjme sí» $S$. Platí: $$\max_{f\hbox{ tok}}{w(f)=\min_{R\hbox{ øez}}{c(R)}}.$$
\proof
Dùkaz provedeme pomocí dokázání dvou neostrých nerovností.
-\>Pomocné znaèení: Jako $S(A,B)$ ({\I separátor}) znaèíme orientované hrany $uv$, $u\in A$, $v\in B$. $f(A,B)=\sum_{uv \in E,u\in A,v\in B}{f(uv)}.$
+\>Pomocné znaèení: Jako {\I separátor} $S(A,B)$ znaèíme orientované hrany $uv$, $u\in A$, $v\in B$. $f(A,B)=\sum_{uv \in E,u\in A,v\in B}{f(uv)}.$
{\narrower
\par\noindent {\sl Intuice:} Uvá¾íme-li mno¾inu kapacit v¹ech øezù, je zdola omezená mno¾inou hodnot tokù.
\figure{cesta.eps}{Pøíklad zplep¹ující cesty.}{3in}
-\s{Definice:} {\I Zlep¹ující cesta} $P$ ze $z$ do $s$ je {\I nasycená}, pokud
+\s{Definice:} {\I Zlep¹ující cesta} $P$ ze $z$ do $s$ je {\I nasycená}, pokud:
$$\exists\ e \in P\left\{{f(e)=c(e)\dots \hbox{orientovaná po smìru}}\atop{f(e)=0\dots \hbox{orientovaná proti smìru}}\right.$$
\>Jinak je zlep¹ující cesta nenasycená.
\>\uv{$\Leftarrow$} sporem: Mìjme tok $f$ maximální a nenasycený. Existuje tedy nenasycená zlep¹ující cesta $P$. Tuto cestu $P$ budeme vylep¹ovat.
\>Zvolíme:
-$$\varepsilon_1=\min_{e\in P,\hbox{ po smìru}}{\{c(e)-f(e)\}},$$
-$$\varepsilon_2=\min_{e\in P,\hbox{ proti smìru}}{\{f(e)\}},$$
-$$\varepsilon=\min{\{\varepsilon_1,\varepsilon_2\}}>0.$$
+$$\varepsilon_1:=\min_{e\in P,\hbox{ po smìru}}{\{c(e)-f(e)\}},$$
+$$\varepsilon_2:=\min_{e\in P,\hbox{ proti smìru}}{\{f(e)\}},$$
+$$\varepsilon:=\min{\{\varepsilon_1,\varepsilon_2\}}>0.$$
\>Poslední ostrá nerovnost vyplývá z definice nenasycené cesty. Nyní vylep¹íme tok $f$ o $\varepsilon$: $f\to f^{'}$:
$$f^{'}(e)=\left\{{\displaystyle f(e)+\varepsilon \dots e\in P\hbox{ po smìru}\hfill}\atop{{\displaystyle f(e)-\varepsilon \dots e\in P\hbox{ proti smìru}\hfill}\atop{\displaystyle f(e) \dots e\not\in P\hfill}}\right.$$
\>Nyní je potøeba ovìøit, ¾e $f^{'}$ je skuteènì tok:
$$0\le f^{'}(e)\le c(e)\dots\hbox{platí stále díky volbì }\varepsilon.$$
-\>Platnost Kirchhoffova zákonu ovìøíme rozborem pøípadù:
+\>Platnost Kirchhoffova zákona ovìøíme rozborem pøípadù:
\figure{kirch.eps}{Rozbor pøípadù.}{4in}
\>$f^{'}$ je tedy tok, ov¹em potom platí:
\qed
}
-Poslední vìta spolu s dùsledkem lemmatu dokazuje i hlavní vìtu o tocích. Pro ka¾dou sí» máme maximální tok a k nìmu øez stejné kapacity.
+\>Poslední vìta spolu s dùsledkem lemmatu dokazuje i hlavní vìtu o tocích. Pro ka¾dou sí» máme maximální tok a k nìmu øez stejné kapacity.
\qed
\figure{nenasyc.eps}{Rozdìlení $V(G)$ na mno¾inu $A$ a $V\setminus A$ v dùkazu hlavní vìty o tocích.}{2.5in}
-\s{Algoritmus:} (Fordùv-Fulkersonùv algoritmus hledání maximálního toku)
+\s{Algoritmus (hledání maximálního toku v síti, Ford-Fulkerson)}
\algo
-\:pøiøad $f$ nulový tok ($f(e) := 0$ pro v¹echny $e \in E$).
-\:while $\exists$ zlep¹ující cesta $P$, vylep¹i $f$ podél $P$ jako v dùkazu hlavní vìty.
+\:Pøiøad $f$ nulový tok ($\forall e \in E: f(e) \leftarrow 0 $).
+\:Dokud $\exists$ zlep¹ující cesta $P$: vylep¹i $f$ podél $P$ jako v~dùkazu hlavní vìty.
\:$f$ je maximální.
\endalgo
\h{Cvièení:}
\itemize\ibull
-\:Je pro pøirozené kapacity F-F algoritmus koneèný? Ano -- v ka¾dém zlep¹ujícím kroku algoritmu se celkový tok zvìt¹í aspoò o 1. Proto¾e máme horní odhad na maximální tok (napø. souèet kapacit v¹ech hran), máme i~horní odhad na dobu bìhu algoritmu.
+\:Je pro pøirozené kapacity F-F algoritmus koneèný? Ano -- v ka¾dém zlep¹ujícím kroku algoritmu se celkový tok zvìt¹í aspoò o jedna. Proto¾e máme horní odhad na maximální tok (napø. souèet kapacit v¹ech hran), máme i~horní odhad na dobu bìhu algoritmu.
\:Je F-F algoritmus koneèný pro racionální kapacity hran? Ano -- v¹echny kapacity vynásobíme spoleèným jmenovatelem a pøevedeme na pøedchozí pøípad (pro obecné kapacity ov¹em takto definovaný F-F algoritmus nemusí být koneèný).
\:Kolik krokù bude muset algoritmus na následující síti maximálnì udìlat, aby úspì¹nì dobìhl? ($2M$ krokù)
\endlist
\prednaska{3}{Dinicùv algoritmus}{(zapsali Jakub Melka, Petr Musil)\foot{\rm s~díky Bernardovi Lidickému za obrázky}}
-Na~minulé pøedná¹ce jsme si ukázali \s{Fordùv} algoritmus. Víme o~nìm, ¾e kdy¾ se zastaví, tak vydá maximální tok. Jen¾e zastavit se nemusí (napøíklad pro~sítì s~reálnými kapacitami), nebo trvá pøíli¹ dlouho.
+Na~minulé pøedná¹ce jsme si ukázali {\I Fordùv-Fulkersonùv} algoritmus. Víme o~nìm, ¾e kdy¾ se zastaví, tak vydá maximální tok. Jen¾e zastavit se nemusí (napøíklad pro~sítì s~reálnými kapacitami), nebo trvá pøíli¹ dlouho.
Uká¾eme si lep¹í algoritmus, {\I Dinicùv}, který má výraznì men¹í slo¾itost a zastaví se v¾dy.
Idea je následující: v~algoritmu budeme pou¾ívat {\I sí» rezerv}, která bude obsahovat rezervy -- kolik je¹tì po~dané hranì mù¾eme pustit, aby to nepøekroèilo její kapacitu.
Sí» rezerv pak budeme vyu¾ívat k~vylep¹ování toku.
-\s{Definice:} {\I Sí» rezerv }$R$ k síti $S=(V,E,z,s,c)$ a toku $f$ v $S$ je sí» $R=(V,E\cup\overleftarrow{E}, z,s, r)$, pro $\forall e\in E : $
+\s{Definice:} {\I Sí» rezerv }$R$ k síti $S=(V,E,z,s,c)$ a toku $f$ v $S$ je sí» $R=(V,E\cup\overleftarrow{E}, z,s, r)$, pro $\forall e\in E$:
\itemize\ibull
-\:$r(e)=c(e)-f(e)$
-\:$r(\overleftarrow{e})=f(e)$
+\:$r(e)=c(e)-f(e)$,
+\:$r(\overleftarrow{e})=f(e)$,
\endlist
-\>kde hrana $\overleftarrow{e}$ vznikne z~hrany $e$ tak, ¾e se zorientuje opaèným smìrem. V pøípadì, ¾e v~síti rezerv u¾ opaènì orientovaná hrana\foot{vznikne tak, ¾e v pùvodní síti jsou dvì opaènì orientované hrany mezi stejnými vrcholy.} je, pak vznikne multigraf\foot{graf, který mù¾e mít mezi dvìma vrcholy více stejnì orientovaných hran.} s~multiplicitou maximálnì 2.
+\>kde hrana $\overleftarrow{e}$ vznikne z~hrany $e$ tak, ¾e se zorientuje opaèným smìrem. V pøípadì, ¾e v~síti rezerv u¾ opaènì orientovaná hrana\foot{vznikne tak, ¾e v pùvodní síti jsou dvì opaènì orientované hrany mezi stejnými vrcholy.} je, pak vznikne multigraf\foot{graf, který mù¾e mít mezi dvìma vrcholy více stejnì orientovaných hran.} s~multiplicitou maximálnì dva.
\>Sí» rezerv budeme pou¾ívat v~algoritmu k~hledání vylep¹ujících tokù. K~tomu nám bude slou¾it následující vìta:
\s{Vìta:} Je-li $f$ tok v~síti $S$ a $g$ tok v~pøíslu¹né síti rezerv, pak $\exists$ tok $f'$ v $S$ takový, ¾e $\vert f'\vert = \vert f\vert + \vert g\vert$, co¾ znamená $\forall e \in E : f'(e) = f(e) + g(e) - g(\overleftarrow{e})$.
\proof
-Rozebereme si jednotlivé pøípady pro~$\forall e\in E$.
+Rozebereme si jednotlivé pøípady pro~$\forall e\in E$:
\numlist\nalpha
\:$g(e)=g(\overleftarrow{e})=0 \Rightarrow f'(e)=f(e) $.
\:$g(e)>0$ a zároveò $g(\overleftarrow{e})=0\Rightarrow f'(e) = f(e) + g(e)$.
\:$g(e)=0$ a zároveò $g(\overleftarrow{e})>0\Rightarrow f'(e) = f(e) - g(\overleftarrow{e})$.
-\:nastává cirkulace, tu snadno odstraníme: odeèteme $\varepsilon$ od obou hran $e$ a $\overleftarrow{e}$,
+\:Nastává cirkulace, tu snadno odstraníme: odeèteme $\varepsilon$ od obou hran $e$ a $\overleftarrow{e}$,
kde $\varepsilon=\min( g(e), g(\overleftarrow{e}) )$. Pøevedeme tím tento pøípad na jeden ze tøí uvedených vý¹e.
\endlist
-Je v¹ak $f'$ tok? Víme, ¾e $f'$ urèitì nemù¾e klesnout pod $0$, proto¾e se odeèítá jen v pøípadì c), a tam je z~definice vidìt, ¾e $f'$ pod $0$ klesnout nemù¾e. Kapacita také nemù¾e
+Je v¹ak $f'$ tok? Víme, ¾e $f'$ urèitì nemù¾e klesnout pod nulu, proto¾e se odeèítá jen v pøípadì c), a tam je z~definice vidìt, ¾e $f'$ pod nulu klesnout nemù¾e. Kapacita také nemù¾e
být pøekroèena, pøièítá se jen v~pøípadì b) a z~definice se nepokazí, proto¾e $g(e)=c(e)-f(e)$, tedy v~nejhor¹ím pøípadì $f'(e) = c(e)$.
Dále doká¾eme, ¾e $f'$ dodr¾uje Kirchhoffùv zákon. V~následujících sumách pøedpokládejme, ¾e v¹echny vrcholy jsou rozdílné od~zdroje a stoku. Musí platit, ¾e:
nebo» $f$ i $g$ jsou toky a musí splòovat Kirchhoffùv zákon.
\qed
-\>Tato vìta nám øíká, ¾e pokud existuje nenulový tok v~síti rezerv, pak lze tok v~pùvodní síti je¹tì zvìt¹it. Naopak pokud takový tok neexistuje, je tok v~pùvodní síti maximální.
+Tato vìta nám øíká, ¾e pokud existuje nenulový tok v~síti rezerv, pak lze tok v~pùvodní síti je¹tì zvìt¹it. Naopak pokud takový tok neexistuje, je tok v~pùvodní síti maximální.
\s{Definice:} $f$ je {\I blokující tok}, pokud na~ka¾dé orientované cestì $P$ ze~zdroje do~spotøebièe $\exists e\in P : f(e)=c(e)$.
-\s{Definice:} $C$ je {\I proèi¹tìná sí»}, pokus obsahuje pouze vrcholy a hrany na~nejkrat¹ích $z\rightarrow s$ cestách. Proèi¹tìná sí» nemá slepé ulièky, ani hrany vedoucí ze~stoku nìkam do~dal¹ího vrcholu.
+\s{Definice:} $C$ je {\I proèi¹tìná sí»}, pokud obsahuje pouze vrcholy a hrany na~nejkrat¹ích $z\rightarrow s$ cestách. Proèi¹tìná sí» nemá slepé ulièky, ani hrany vedoucí ze~stoku nìkam do~dal¹ího vrcholu.
\figure{dinic-cistasit.eps}{Pøíklad proèi¹tìné sítì}{0.5\hsize}
-\s{Dinicùv algoritmus}
+\s{Algoritmus (hledání maximálního toku v síti, Dinicùv)}
\algo
-\:$f\leftarrow$ nulový tok
+\:$f\leftarrow$ nulový tok.
\:Sestrojíme sí» rezerv $R$, vynecháme hrany s nulovou rezervou.
\:$l\leftarrow$ délka nejkrat¹í cesty $z\rightarrow s$ cesty v $R$.
\:Kdy¾ $l=\infty$, tak skonèíme.
-\:Sestrojíme proèi¹tìnou sí» $C$, a to následujícím zpùsobem:%\foot{Ponecháme vrcholy a hrany z $R$, které le¾í na nejkrat¹ích $z\rightarrow s$ cestách}
-\::spustíme BFS\foot{Breadth-First Search, standardní prohledávání do ¹íøky.} algoritmus ze zdroje
+\:Sestrojíme proèi¹tìnou sí» $C$, a to následujícím zpùsobem:%\foot{Ponecháme vrcholy a hrany z $R$, které le¾í na nejkrat¹ích $z\rightarrow s$ cestách}
+\::Spustíme BFS\foot{Breadth-First Search, standardní prohledávání do ¹íøky.} algoritmus ze zdroje.
\::BFS nám rozdìlí uzly do vrstev, vyhodíme hrany za spotøebièem a slepé ulièky.
\:$g\leftarrow$ blokující tok v $C$.
-\:Zlep¹íme tok $f$ podle $g$ a jdeme na bod 2.
+\:Zlep¹íme tok $f$ podle $g$ a jdeme na bod 3.
\endalgo
-\s{Postup tvorby proèi¹tìné sítì podrobnìji:} prohledáním do~¹íøky vytvoøíme vrstvy $C_i$, zahodíme ty za~spotøebièem, ponecháme
+\s{Postup tvorby proèi¹tìné sítì podrobnìji:} Prohledáním do~¹íøky vytvoøíme vrstvy $C_i$, zahodíme ty za~spotøebièem, ponecháme
pouze hrany mezi $C_i$ a $C_{i+1}$. Je¹tì musíme odstranit slepé ulièky -- cesty, které konèí v~$C_m : m < l$, proto¾e ty urèitì nejsou souèástí nejkrat¹í $z\rightarrow s$ cesty.
Proèi¹tìní zvládneme v~lineárním èase $\O(N+M)$, v~pøípadì souvislého grafu pouze $\O(M)$.
\s{Algoritmus hledání blokujícího toku}
\algo
-\:$g\leftarrow$ nulový tok
+\:$g\leftarrow$ nulový tok.
\:Dokud $\exists z\rightarrow s$ cesta $P$ v proèi¹tìné síti $C$:
-\::$\varepsilon \leftarrow \min\limits_{e\in P} (c(e)-f(e)) $
-\::$\forall e \in P :g(e)\leftarrow g(e)+\varepsilon$, pokud $g(e)$ vzroste na $r(e)$, tak sma¾eme hranu $e$,
+\::$\varepsilon \leftarrow \min\limits_{e\in P} (c(e)-f(e)) $.
+\::$\forall e \in P :g(e)\leftarrow g(e)+\varepsilon$, pokud $g(e)$ vzroste na $r(e)$, tak sma¾eme hranu $e$.
\::Doèistíme sí» tím, ¾e odstraníme slepé ulièky, které mohly vzniknout smazáním hrany $e$.
\endalgo
-Pøi ka¾dém prùchodu se sma¾e v¾dy alespoò 1 hrana, tedy maximálnì $M$-krát provádíme $\O(N)$ -- právì tolik trvá nalezení cesty $P$, proto¾e délka cesty bude krat¹í nebo rovna $N$. Èi¹tìní pak maximálnì sma¾e celý graf, jedno mazání nás stojí konstantní èas, tedy celková slo¾itost tohoto algoritmu bude $\O(MN)$.
+Pøi ka¾dém prùchodu se sma¾e v¾dy alespoò jedna hrana, tedy maximálnì $M$-krát provádíme $\O(N)$ -- právì tolik trvá nalezení cesty $P$, proto¾e délka cesty bude krat¹í nebo rovna $N$. Èi¹tìní pak maximálnì sma¾e celý graf, jedno mazání nás stojí konstantní èas, tedy celková slo¾itost tohoto algoritmu bude $\O(MN)$.
Doká¾eme si, ¾e poèet fází je men¹í nebo roven $N$. Algoritmus se ukonèí, pokud $l>N$, proto¾e pak u¾ neexistuje nejkrat¹í $z\rightarrow s$ cesta, pro¹li jsme v¹echny vrcholy.
Uva¾me sí» $R$, rozdìlenou na~vrstvy, je¹tì pøed~proèi¹tìním. Po~proèi¹tìní nìkteré hrany zmizí. Pøibýt\foot{Pøibudou tak, ¾e po~hranì s~nulovým tokem po¹leme nìjaký tok, v~opaèném smìru v~síti rezerv vytvoøíme z~nulové hrany nenulovou.} mohou jen zrcadlové
protìj¹ky ji¾ existujících hran.
-Uva¾me cestu $P$ délky $< l$ ze $z\rightarrow s$ a $e$ novou hranu vzniklou pøi~poslání toku po~hranì s~nulovým tokem:
+Uva¾me cestu $P$ délky $< l$ ze $z\rightarrow s$ a novou hranu $e$ vzniklou pøi~poslání toku po~hranì s~nulovým tokem:
\numlist\nalpha
-\:hrana $e \not\in P\Rightarrow$ -- zablokování, taková cesta neexistuje.
-\:hrana $e \in P\Rightarrow$ délka $ > l$, proto¾e hrana $e$ vede z nìjakého vrcholu ve vrstvì $C_i$ do vrcholu ve vrstvì $C_{i-1}$.
+\:Hrana $e \not\in P\Rightarrow$ zablokování, taková cesta neexistuje.
+\:Hrana $e \in P\Rightarrow$ délka $ > l$, proto¾e hrana $e$ vede z nìjakého vrcholu ve vrstvì $C_i$ do vrcholu ve vrstvì $C_{i-1}$.
\qeditem
\endlist
Cesta si pamatuje minimum rezerv a pøi vracení se rezerva sni¾uje.
-\>Problematika tokù v~sítích má velké uplatnìní v~kombinatorice a teorii grafù. Zde uvedeme jeden pøíklad :
+\>Problematika tokù v~sítích má velké uplatnìní v~kombinatorice a teorii grafù. Zde uvedeme jeden pøíklad:
-\>\s{Hledání maximálního párování v bipartitních grafech:} Zorientujeme v¹echny hrany zleva doprava a pøidáme zdroj, z~nìj
-vedou hrany do~1.~partity, a stok, do~nìj vedou hrany z~2.~partity, hrany mezi partitami mají kapacitu 1.
+\>\s{Hledání maximálního párování v bipartitních grafech:} Zorientujeme v¹echny hrany zleva doprava a pøidáme zdroj, z~nìho¾
+vedou hrany do první partity, a stok, do~nìho¾ vedou hrany z~druhé partity. Hrany mezi partitami mají jednotkovou kapacitu.
\bye
Pøedstavíme si nový algoritmus pro~hledání maximálního toku v~síti, který se uká¾e stejnì dobrý jako {\I Dinicùv algoritmus} ($\O(MN^{2})$) a po~nìkolika vylep¹eních bude i lep¹í.
\noindent
-Tento algoritmus narozdíl od~Dinicova algoritmu zaèíná s~pøebytky v~sousedních vrcholech zdroje a sna¾í se jich zbavit pomocí pøevádìní. Pokud bychom toto pøevádìní dìlali \uv{tupým zpùsobem}, mohl by se algoritmus zacyklit.Proto pro~ka¾dý vrchol budeme definovat vý¹ku a jak uvidíme, s~její pomocí se vyhneme zacyklení.
+Tento algoritmus narozdíl od~Dinicova algoritmu zaèíná s~pøebytky v~sousedních vrcholech zdroje a sna¾í se jich zbavit pomocí pøevádìní. Pokud bychom toto pøevádìní dìlali \uv{tupým zpùsobem}, mohl by se algoritmus zacyklit. Proto pro~ka¾dý vrchol budeme definovat vý¹ku, a jak uvidíme, s~její pomocí se vyhneme zacyklení.
\s{Definice:} Funkce $f:E \rightarrow {\bb R}_{0}^{+}$
-je {\I vlna} v~síti~$(V, E, z, s, c)$ tehdy, kdy¾ $ \forall uv \in E : f(uv) \leq c(uv) $, kde $c(uv)$ je kapacita hrany~$uv$, a $ \forall v \ne z, s : f^{\Delta}(v) \geq 0 $. Funkcí $f^{\Delta}(v)$ rozumíme pøebytek, který pøebývá ve~vrcholu~$v$, co¾ je souèet v¹eho, co do~vrcholu~$v$ pøiteèe, mínus souèet v¹eho, co z~$v$ odteèe. To mù¾eme zapsat jako
+je {\I vlna} v~síti~$(V, E, z, s, c)$ tehdy, kdy¾ $ \forall uv \in E : f(uv) \leq c(uv) $, kde $c(uv)$ je kapacita hrany~$uv$, a $ \forall v \ne z, s : f^{\Delta}(v) \geq 0 $. Funkcí $f^{\Delta}(v)$ rozumíme {\I pøebytek}, který pøebývá ve~vrcholu~$v$, co¾ je souèet v¹eho, co do~vrcholu~$v$ pøiteèe, mínus souèet v¹eho, co z~$v$ odteèe. To mù¾eme zapsat jako:
$$f^{\Delta}(v):=\sum_{uv \in E}{f(uv)} - \sum_{vu \in E}{f(vu)}.$$
Ka¾dý tok je vlna, kde $\forall v \ne z,s: f^{\Delta}(v) = 0$.
\s{Operace:} Pro~hranu~$uv \in E$ definujme {\I pøevedení pøebytku}:
\noindent
-Pokud platí, ¾e
+Pokud platí, ¾e:
\numlist \ndotted
\:ve~vrcholu~$u$ je nenulový pøebytek, tj. $f^{\Delta}(u) > 0$,
- \:vrchol~$u$ je vý¹ ne¾ vrchol~$v$, tj. $h(u) > h(v)$, a
+ \:vrchol~$u$ je vý¹ ne¾ vrchol~$v$, tj. $h(u) > h(v)$ a
\:hrana $uv$ má nenulovou rezervu, tj. $r(uv)>0$,
\endlist
\noindent pøevedeme tok o~velikosti $\delta:=\min(f^{\Delta}(u),r(uv))$ z~$u$ do~$v$ tímto zpùsobem:
\:$f^{\Delta}(u) \leftarrow f^{\Delta}(u)-\delta$ a $f^{\Delta}(v) \leftarrow f^{\Delta}(v)+\delta$,
\:$r(uv) \leftarrow r(uv)-\delta$ a $r(vu) \leftarrow r(vu)+\delta$.
\endlist
-Øekneme, ¾e pøevedení je {\I nasycené}, pokud je po~pøevodu rezerva na~hranì $uv$ nulová, tedy $r(uv)=0$.
+
+\s{Definice:} Øekneme, ¾e pøevedení je {\I nasycené}, pokud je po~pøevodu rezerva na~hranì $uv$ nulová, tedy $r(uv)=0$.
Naopak pøevedení je {\I nenasycené}, pokud po~pøevodu $f^{\Delta}(u) = 0$. Pokud $r(uv)=0$ a $f^{\Delta}(u) = 0$,
budeme pøevedení pova¾ovat za~{\I nasycené}.
\s{Operace:} Pro~vrchol~$u \in V$ definujme {\I zvednutí vrcholu}:
-Pokud bìhem výpoètu narazíme ve~vrcholu~$u$ na~pøebytek, který nelze nikam pøevést, zvìt¹íme vý¹ku vrcholu~$u$ o~$1$, tj. $h(u) \leftarrow h(u)+1$.
+Pokud bìhem výpoètu narazíme ve~vrcholu~$u$ na~pøebytek, který nelze nikam pøevést, zvìt¹íme vý¹ku vrcholu~$u$ o~jednièku, tj. $h(u) \leftarrow h(u)+1$.
-\s{Algoritmus:} (Goldbergùv)
+\s{Algoritmus (hledání maximálního toku v síti, Goldberg)}
\algo
-\:$\forall v \in V: h(v)\leftarrow 0$ (v¹em vrcholùm nastavíme poèáteèní vý¹ku na~$0$).
+\:$\forall v \in V: h(v)\leftarrow 0$ (v¹em vrcholùm nastavíme poèáteèní vý¹ku nula).
\:$h(z)\leftarrow N$ (zdroj zvedneme do~vý¹ky $N$).
\:$\forall e \in E: f(e)\leftarrow 0$ (po~hranách na~poèátku nenecháme protékat nic).
\:$\forall zu \in E : f(zu)\leftarrow c(zu)$ (ze~zdroje pustíme maximální mo¾nou vlnu).
\s{Invariant A:} Funkce $f:E \rightarrow \bb{R}$ je v~ka¾dém kroku algoritmu vlna, $h(v)$ nikdy neklesá, $h(z)=N$ a $h(s)=0$.
\proof
-Pro~první èást invariantu si staèí rozmyslet, ¾e v~¾ádném kroku algoritmu nepøekroèíme kapacity hran a nevytvoøíme záporný pøebytek. Pro~$v \in V \setminus \{z,s\}$ skuteènì vý¹ku pouze zvy¹ujeme a z~podmínky v~tøetím kroku algoritmu vyplývá, ¾e nás pøebytky v~$z$ a $s$ v~podstatì nezajímají, tudí¾ se $h(z)$ a $h(s)$ nemìní.
+Pro~první èást invariantu si staèí rozmyslet, ¾e v~¾ádném kroku algoritmu nepøekroèíme kapacity hran a nevytvoøíme záporný pøebytek. Pro~$v \in V \setminus \{z,s\}$ skuteènì vý¹ku pouze zvy¹ujeme a z~podmínky v~pátém kroku algoritmu vyplývá, ¾e nás pøebytky v~$z$ a $s$ v~podstatì nezajímají, tudí¾ se $h(z)$ a $h(s)$ nemìní.
\qed
\s{Invariant S (o~Spádu):} Neexistuje hrana se~spádem vìt¹ím ne¾ jedna a nenulovou rezervou, neboli $\forall uv \in E, r(uv)>0 : h(u) \leq h(v)+1$.
\proof %todo pøeformulovat:BEGIN OK
-Podívejme se, kdy by mohla vzniknout nenasycená hrana se~spádem vìt¹ím ne¾ 1. Bìhem inicializace k~tomu evidentnì nedojede, proto¾e v¹echny hrany jsou nenasycené nebo mají kapacitu nula, proto je mù¾eme vypustit. Bìhem práce algoritmu k~tomu v¹ak také nedojde, jak uvidíme z~rozebrání následujících pøípadù. Pokud ji¾ existuje vrchol~$v$ s~kladným pøebytkem, dále existuje nenasycená hrana $vu$ a $h(v)=h(u)+1$, vrchol~$v$ algoritmus nezvedne, ale pøebytek po¹le po~této hranì. Uva¾me tedy je¹tì druhý pøípad, kdy existuje nasycená hrana $uv$ se~spádem vìt¹ím ne¾ jedna a tuto hranu se pokusíme odsytit. Jen¾e pokud bychom chtìli nìco poslat v protismìru, sna¾ili bychom se o pøelití proti smìru funkce $h$.
+Podívejme se, kdy by mohla vzniknout nenasycená hrana se~spádem vìt¹ím ne¾ jedna. Bìhem inicializace k~tomu evidentnì nedojde, proto¾e v¹echny hrany jsou nenasycené nebo mají kapacitu nula, proto je mù¾eme vypustit. Bìhem práce algoritmu k~tomu v¹ak také nedojde, jak uvidíme z~rozebrání následujících pøípadù. Pokud ji¾ existuje vrchol~$v$ s~kladným pøebytkem, dále existuje nenasycená hrana $vu$ a $h(v)=h(u)+1$, vrchol~$v$ algoritmus nezvedne, ale pøebytek po¹le po~této hranì. Uva¾me tedy je¹tì druhý pøípad, kdy existuje nasycená hrana $uv$ se~spádem vìt¹ím ne¾ jedna a tuto hranu se pokusíme odsytit. Jen¾e pokud bychom chtìli nìco poslat v protismìru, sna¾ili bychom se o pøelití proti smìru funkce $h$.
\qed %todo pøeformulovat:END
\s{Lemma K (o~Korektnosti):} Kdy¾ se algoritmus zastaví, je $f$ maximální tok.
\proof
-Nejprve uká¾eme, ¾e $f$ je tok a pak jeho maximalitu. Vyjdìme z~toho, ¾e $f$ je vlna a algoritmus se mù¾e zastavit jen pokud nastanou oba následující pøípady souèasnì:
+Nejprve uká¾eme, ¾e $f$ je tok, a pak jeho maximalitu. Vyjdìme z~toho, ¾e $f$ je vlna a algoritmus se mù¾e zastavit, jen pokud nastanou oba následující pøípady souèasnì:
\itemize\ibull
-\:Ve~vrcholech grafu nejsou ¾ádné pøebytky (mimo~$z$ a $s$), proto¾e jinak by se algoritmus nezastavil a pokraèoval dále ve~výpoètu. Tudí¾ $f$ je tok. %todo check ? mimo~ ?
-\:Neexistuje nenasycená cesta ze~zdroje do~stoku, èím¾ {\I z~Ford-Fulkersonovy vìty} okam¾itì vyplývá, ¾e $f$ je tok maximální. A jak tuto neexistenci nahlédneme? Pro~spor pøedpokládejme, ¾e nìjaká nenasycená cesta~$P$ ze~$z$ do~$s$ existuje. Tato cesta mù¾e mít maximálnì $N-1$ hran. O~nich víme, ¾e v¹echny mají kladnou rezervu, a dále víme, ¾e po~celou dobu výpoètu je vý¹ka zdroje $N$ a vý¹ka stoku $0$. Tak¾e celkový spád cesty $P$ je $N$, co¾ ale znamená, ¾e na cestì $P$ existuje hrana s~kladnou rezervou, která má spád alespoò $2$. To je v¹ak v~rozporu s~Invariantem~S.
+\:Ve~vrcholech grafu nejsou ¾ádné pøebytky (mimo $z$ a $s$), proto¾e jinak by se algoritmus nezastavil a pokraèoval dále ve~výpoètu. Tudí¾ $f$ je tok. %todo check ? mimo~ ?
+\:Neexistuje nenasycená cesta ze~zdroje do~stoku, èím¾ z~{\I Ford-Fulkersonovy vìty} okam¾itì vyplývá, ¾e $f$ je tok maximální. A jak tuto neexistenci nahlédneme? Pro~spor pøedpokládejme, ¾e nìjaká nenasycená cesta~$P$ ze~$z$ do~$s$ existuje. Tato cesta mù¾e mít maximálnì $N-1$ hran. O~nich víme, ¾e v¹echny mají kladnou rezervu, a dále víme, ¾e po~celou dobu výpoètu je vý¹ka zdroje $N$ a vý¹ka stoku $0$. Tak¾e celkový spád cesty $P$ je $N$, co¾ ale znamená, ¾e na cestì $P$ existuje hrana s~kladnou rezervou, která má spád alespoò $2$. To je v¹ak v~rozporu s~invariantem~S.
\qeditem
\endlist
Potom definujme mno¾inu $A := \{ u \in V : \exists$ nenasycená cesta z~$v$ do~$u \}$.
Mìjme vrcholy $a \in A$ a $b \in V \setminus A$ takové, ¾e $ba\in E$. O~nich víme, ¾e $f(ba)=0$, proto¾e pokud by tomu tak nebylo, muselo by platit $r(ab)>0$, a tudí¾ by $b$ patøilo do~mno¾iny $A$.
-\noindent Seètìme pøebytky ve~v¹ech vrcholech mno¾iny $A$. Proto¾e pøebytek ka¾dého vrcholu se spoèítá jako souèet tokù do~nìj vstupujících minus souèet tokù z~nìj vystupujících a v¹echny hrany, jejich¾ oba vrcholy le¾í v~$A$, se jedenkrát pøiètou a jedenkrát odeètou, platí:
+Seètìme pøebytky ve~v¹ech vrcholech mno¾iny $A$. Proto¾e pøebytek ka¾dého vrcholu se spoèítá jako souèet tokù do~nìj vstupujících minus souèet tokù z~nìj vystupujících a v¹echny hrany, jejich¾ oba vrcholy le¾í v~$A$, se jednou pøiètou a jednou odeètou, platí:
$$\sum_{u \in A}f^{\Delta}(u)=\sum_{\scriptstyle{ab \in E \cap {\bb A}} \atop \scriptstyle{{\bb A} = \bar{A}\times A}} f(a,b)-\sum_{{\scriptstyle ba \in E \cap {\bb A}} \atop {\scriptstyle {\bb A} = A\times \bar{A}}} f(b,a).$$
My v¹ak víme, ¾e do~$A$ nic neteèe, a proto $\sum_{v \in A}{f^\Delta(v) \le 0}$. Zároveò v¹ak v~$A$ je vrchol s~kladným pøebytkem, toti¾ $v$, proto v~$A$ musí být také vrchol se záporným pøebytkem a jediný takový je $z$.
\qed
-\s{Invariant V (Vý¹ka):} $\forall v \in V$ platí $h(v)\le 2n$.
+\s{Invariant V (Vý¹ka):} $\forall v \in V$ platí $h(v)\le 2N$.
\proof
-Víme, ¾e poèet hran na~cestì ze~$z$ do~$\forall v \in V$ je maximálnì $n-1$. Pokud by existoval vrchol~$v$ s~vý¹kou $h(v)>2n$, museli jsme tento vrchol zvednout alespoò $(2n+1)$-krát. Snadno si uvìdomíme, ¾e $z$ nikdy nezvedáme, a tudí¾ by na cestì ze $z$ do $v$ musela být hrana se spádem vìt¹ím ne¾ $1$, co¾ je spor s~Invariantem~S.
+Víme, ¾e poèet hran na~cestì ze~$z$ do~$\forall v \in V$ je maximálnì $N-1$. Pokud by existoval vrchol~$v$ s~vý¹kou $h(v)>2N$, museli jsme tento vrchol zvednout alespoò $(2N+1)$-krát. Snadno si uvìdomíme, ¾e $z$ nikdy nezvedáme, a tudí¾ by na cestì ze $z$ do $v$ musela být hrana se spádem vìt¹ím ne¾ jedna, co¾ je spor s~invariantem~S.
\qed
-\s{Lemma Z (poèet Zvednutí):} Poèet v¹ech zvednutí je maximálnì $2n^{2}$.
+\s{Lemma Z (poèet Zvednutí):} Poèet v¹ech zvednutí je maximálnì $2N^{2}$.
\proof
-Staèí si uvìdomit, ¾e ka¾dý vrchol mù¾eme zvednout maximálnì $2n$-krát a vrcholù je $n$.
+Staèí si uvìdomit, ¾e ka¾dý vrchol mù¾eme zvednout maximálnì $2N$-krát a vrcholù je $N$.
\qed
-\s{Lemma S (naSycená pøevedení):} Poèet v¹ech nasycených pøevedení je maximálnì $NM$.
+\s{Lemma S (naSycená pøevedení):} Poèet v¹ech nasycených pøevedení je nejvý¹ $NM$.
\proof
Mìjme hranu~$uv \in E$, kterou jsme právì nasytili. Tedy platí $h(v)<h(u)$ a zároveò $r(uv)=0$. Aby se rezerva této hrany zmìnila, musel by ji nìkdo odsytit. Pro~odsycení hrany se musí otoèit nerovnost mezi~vý¹kami koncových vrcholù. Tedy $h(v)>h(u)$. Proto, abychom tuto hranu opìt nasytili, musíme opìt zmìnit nerovnost vý¹ek na~$h(v)<h(u)$. Mezi dvìma nasyceními hranami $uv$ proto probìhla minimálnì dvì zvednutí vrcholu~$u$. Algoritmus nikdy vý¹ku vrcholu nesni¾uje, a tedy poèet v¹ech nasycených pøevedení je skuteènì $NM$.
\s{Lemma N (Nenasycená pøevedení):} Poèet v¹ech nenasycených pøevedení je $\O(N^2M)$.
\proof
-Dùkaz provedeme pomocí potenciálu --- nadefinujme si následující potenciál (funkci):
- $$ \psi = \sum_{\scriptstyle{v: f^{\Delta}(v) > 0} \atop \scriptstyle{v \ne z,s}} h(v). $$
+Dùkaz provedeme pomocí potenciálu -- nadefinujme si následující funkci jako potenciál:
+ $$ \psi := \sum_{\scriptstyle{v: f^{\Delta}(v) > 0} \atop \scriptstyle{v \ne z,s}} h(v). $$
Nyní se podívejme, jak se ná¹ potenciál bìhem algoritmu vyvíjí a jaké má vlastnosti:
\itemize\ibull
\:Bìhem celého algoritmu je $ \psi \ge 0 $, nebo» je souètem nezáporných èlenù.
\:Na poèátku je $ \psi = 0 $.
-\:Zvednutí vrcholu zvý¹í $\psi$ o $1$. Ji¾ víme, ¾e za~celý prùbìh algoritmu je v¹ech zvednutí maximálnì $2N^2$, proto zvedáním vrcholù zvý¹íme potenciál dohromady nejvý¹e o~$2N^2$.
-\:Nasycené pøevedení zvý¹í $\psi$ nejvý¹e o~$2N$, proto¾e buï po~pøevodu hranou $uv$ v~$u$ zùstal nìjaký pøebytek, tak¾e se mohl potenciál zvý¹it a¾ o~$2N$, nebo je pøebytek v~$u$ po~pøevodu nulový a potenciál se dokonce o~$1$ sní¾il. Za~celý prùbìh tak dojde k~maximálnì $NM$ takovýmto pøevedením, díky nim¾ se potenciál zvý¹í maximálnì o~$2N^2M$.
-\:Koneènì kdy¾ pøevádíme po~hranì $uv$ nenasycenì, tak od~potenciálu urèitì odeèteme vý¹ku vrcholu~$u$ a mo¾ná pøièteme vý¹ku vrcholu~$v$. Jen¾e $h(v) = h(u) - 1$, a proto nenasycené pøevedení potenciál v¾dy sní¾í alespoò o~$1$.
+\:Zvednutí vrcholu zvý¹í $\psi$ o~jednièku. Ji¾ víme, ¾e za~celý prùbìh algoritmu je v¹ech zvednutí maximálnì $2N^2$, proto zvedáním vrcholù zvý¹íme potenciál dohromady nejvý¹e o~$2N^2$.
+\:Nasycené pøevedení zvý¹í $\psi$ nejvý¹e o~$2N$, proto¾e buï po~pøevodu hranou $uv$ v~$u$ zùstal nìjaký pøebytek, tak¾e se mohl potenciál zvý¹it a¾ o~$2N$, nebo je pøebytek v~$u$ po~pøevodu nulový a potenciál se dokonce o~jedna sní¾il. Za~celý prùbìh tak dojde k~maximálnì $NM$ takovýmto pøevedením, díky nim¾ se potenciál zvý¹í maximálnì o~$2N^2M$.
+\:Koneènì kdy¾ pøevádíme po~hranì $uv$ nenasycenì, tak od~potenciálu urèitì odeèteme vý¹ku vrcholu~$u$ a mo¾ná pøièteme vý¹ku vrcholu~$v$. Jen¾e $h(v) = h(u) - 1$, a proto nenasycené pøevedení potenciál v¾dy sní¾í alespoò o~jedna.
\endlist
-Z~tohoto rozboru chování potenciálu $\psi$ v~prùbìhu algoritmu získáváme, ¾e poèet v¹ech nenasycených pøevedení mù¾e být nejvý¹e $2N^2 + 2N^2M$, co¾ je $\O(N^2M)$.
+
+\>Z~tohoto rozboru chování potenciálu $\psi$ v~prùbìhu algoritmu získáváme, ¾e poèet v¹ech nenasycených pøevedení mù¾e být nejvý¹e $2N^2 + 2N^2M$, co¾ je $\O(N^2M)$.
\qed
\s{Implementace:}
-Budeme si pamatovat seznam $P$ v¹ech vrcholù $v \ne z,s$ takových, ¾e $f^{\Delta}(v) > 0$. Kdy¾ mìníme pøebytek nìjakého vrcholu, mù¾eme ná¹ seznam v~konstantním èase aktualizovat (napø. tak, ¾e si ka¾dý vrchol pamatuje pozici, na~které v~seznamu je). A v~konstantním èase také umíme odpovìdìt, zda existuje nìjaký vrchol s~pøebytkem. Dále si $\forall u \in V$ budeme pamatovat $L(u) := $ seznam $uv \in E$ takových, ¾e $r(uv) > 0$ a $h(v) < h(u)$. Díky tomu mù¾eme pøistupovat k~patøièným sousedùm $u$ v~èase $\O(1)$, stejnì jako provádìt operace pøidání do~$L(u)$ resp. smazání v~nìm. Ka¾dé pøevedení po~hranì $uv$ nás stojí konstantní èas na~aktualizaci rezerv hran $uv$ a $vu$, stejnì tak i na aktualizaci pøebytkù ve~vrcholech $u$ a $v$. V~pøípadì, ¾e se jedná o~nasycené pøevedení, musíme je¹tì odstranit hranu~$uv$ z~$L(u)$, co¾ také stihneme v~èase $\O(1)$. A koneènì zvedání vrcholu~$v$ nám zabere èas $\O(N)$, proto¾e musíme obejít v¹echny hrany~$uv$, kterých je $\O(N)$, porovnat vý¹ky a pøípadnì odebrat $uv$ z~seznamu $L(u)$ resp. pøidat do $L(v)$. Abysme pro odebrání hrany~$uv$ ze~seznamu $L(u)$ nemuseli procházet celý seznam, budeme si $\forall v \in V$ pamatovat je¹tì $L^{-1}(v) := $ seznam ukazatelù na~hrany~$uv$ v~seznamech $L(u)$.
+Budeme si pamatovat seznam $P$ v¹ech vrcholù $v \ne z,s$ takových, ¾e $f^{\Delta}(v) > 0$. Kdy¾ mìníme pøebytek nìjakého vrcholu, mù¾eme ná¹ seznam v~konstantním èase aktualizovat (napø. tak, ¾e si ka¾dý vrchol pamatuje pozici, na~které v~seznamu je). A v~konstantním èase také umíme odpovìdìt, zda existuje nìjaký vrchol s~pøebytkem. Dále si $\forall u \in V$ budeme pamatovat $L(u) := $ seznam $uv \in E$ takových, ¾e $r(uv) > 0$ a $h(v) < h(u)$. Díky tomu mù¾eme pøistupovat k~patøièným sousedùm $u$ v~èase $\O(1)$, stejnì jako provádìt operace pøidání do~$L(u)$, resp. smazání v~nìm. Ka¾dé pøevedení po~hranì $uv$ nás stojí konstantní èas na~aktualizaci rezerv hran $uv$ a $vu$, stejnì tak i na aktualizaci pøebytkù ve~vrcholech $u$ a $v$. V~pøípadì, ¾e se jedná o~nasycené pøevedení, musíme je¹tì odstranit hranu~$uv$ z~$L(u)$, co¾ také stihneme v~èase $\O(1)$. A koneènì zvedání vrcholu~$v$ nám zabere èas $\O(N)$, proto¾e musíme obejít v¹echny hrany~$uv$, kterých je $\O(N)$, porovnat vý¹ky a pøípadnì odebrat $uv$ z~seznamu $L(u)$ resp. pøidat do $L(v)$. Abychom pro odebrání hrany~$uv$ ze~seznamu $L(u)$ nemuseli procházet celý seznam, budeme si $\forall v \in V$ pamatovat je¹tì $L^{-1}(v) := $ seznam ukazatelù na~hrany~$uv$ v~seznamech $L(u)$.
\s{Vìta:} Goldbergùv algoritmus najde maximální tok v~èase $\O(N^2M)$.
Z~lemmatu~Z vyplývá, ¾e celkový poèet zvednutí je maximálnì $2N^2$, pøièem¾ ka¾dé zvednutí jsme schopni provést v~èase $\O(N)$. Tak¾e dohromady pro~zvedání spotøebujeme èas $\O(N^3)$, co¾ je pro souvislé sítì urèitì $\O(N^2M)$. Z~lemmatu~S pro~zmìnu vyplývá, ¾e nasycená pøevedení nás stojí $\O(NM)$, a na~závìr z~lemmatu~N dostáváme èasovou slo¾itost $\O(N^2M)$ pro~pøevedení nenasycená. Proto celková slo¾itost algoritmu je $\O(N^2M)$.
\qed %todo ? pro zmìnu vs. prozmenu ?
-Dokázali jsme, ¾e algoritmus má èasovou slo¾itost $\O(N^2M)$ pro libovolnou posloupnost zvedání a pøevádìni. Nabízí se otázka, zda není mo¾né vhodným výbìrem tìchto operací výpoèet zrychlit. Uká¾eme, ¾e pokud v~$5.$ kroku algoritmu budeme v¾dy brát vrchol~$u$ takový, ¾e $h(u)$ je maximální, poèet nenasycených pøevedení se sní¾í.
+Dokázali jsme, ¾e algoritmus má èasovou slo¾itost $\O(N^2M)$ pro libovolnou posloupnost zvedání a pøevádìní. Nabízí se otázka, zda není mo¾né vhodným výbìrem tìchto operací výpoèet zrychlit. Uká¾eme, ¾e pokud v~$5.$ kroku algoritmu budeme v¾dy brát vrchol~$u$ takový, ¾e $h(u)$ je maximální, poèet nenasycených pøevedení se sní¾í.
\s{Lemma N':} Poèet nenasycených pøevedení v~upravené verzi Goldbergova algoritmu je $\O(N^2\sqrt{M})$, co¾ je maximálnì $\O(N^3)$. Díky tomu je i slo¾itost celého algoritmu $\O(N^3)$.
\proof
-Viz. pøí¹tí pøedná¹ka.
+Viz pøí¹tí pøedná¹ku.
\bye
$\O(N^3)$.
\proof
-Definujme $H$~jako maximální vý¹ku vrcholù s~pøebytkem.
- $$H:=\max\{h(v);v \not= z,s, f^\triangle (v)\geq 0\}$$
+Definujme $H$~jako maximální vý¹ku vrcholù s~pøebytkem:
+ $$H:=\max\{h(v) : v \not= z,s, f^\triangle (v)\geq 0\}.$$
Bìh algoritmu $G'$ rozdìlíme na fáze tak, ¾e fáze skonèí po ka¾dé zmìnì
$H$. Odhadneme poèet nenasycených pøevedení v~jedné fázi: bude jich
-nanejvý¹ stejnì, jako vrcholù, které se na zaèátku fáze nacházely na
-nejvy¹¹í hladinì -- z~jiných vrcholù v~prùbìhu fáze nic nepøevádíme,
+nanejvý¹ stejnì jako vrcholù, které se na zaèátku fáze nacházely na
+nejvy¹¹í hladinì -- z~jiných vrcholù v~prùbìhu fáze nic nepøevádíme
a~nenasycené pøevedení mù¾eme provést z~ka¾dého vrcholu nejvý¹e
jednou. Poèet nenasycených pøevedení za fázi je $\leq N$.
nebo zvý¹ením~$H$ a~odhadneme jejich poèty. Maximálnì $2N^2$ fází mù¾e
konèit zvý¹ením~$H$, proto¾e dle lemmatu Z~provedeme nanejvý¹ $2N^2$
zvednutí. Sní¾ením~$H$ mù¾e konèit nanejvý¹ $2N^2$ fází, proto¾e~$H$
-klesne v¾dy alespoò o~1, pùvodnì bylo 0 a~nikdy nemù¾e být záporné --
+klesne v¾dy alespoò o~jedna, pùvodnì bylo nula a~nikdy nemù¾e být záporné --
klesnout tedy nemù¾e víckrát ne¾ vzrùst.
Máme maximálnì $4N^2$ fází o~nejvý¹e~$N$ nenasycených pøevedení,
Nyní budeme zkoumat poèty pøevedení v~obou typech fází.
Jak víme z~minulého lemmatu, v¹ech fází je nanejvý¹ $4N^2$, tak¾e
v~laciných se provede nanejvý¹ $N^2K$ nenasycených pøevedení.
-Za úèelem zkoumání drahých fází definujeme potenciál
+Za úèelem zkoumání drahých fází definujeme potenciál:
$$\psi:=\sum_{v\not=z,s; f^\triangle(x)>0}{ p(v)\over K},$$ kde
$p(v):= \vert\{u : h(u) \leq h(v)\}\vert$, èili poèet vrcholù ve stejné
nebo men¹í vý¹ce ne¾~$v$. Víme, ¾e na zaèátku bude $\psi \leq
Zvednutím vrcholu~$v$ se hodnota $p(v)$ zvý¹í maximálnì o~$N$, u~libovolného
jiného vrcholu~$w$ $p(w)$ klesne nebo se nezmìní, potenciál tedy
-vzroste maximálnì o~$N/K$. Pøedchozích èástí
+vzroste maximálnì o~$N/K$. %Pøedchozích èástí
Pøi sytém pøevedení po hranì z~$u$ do~$v$ (z~minula víme, ¾e se v¾dy
-provádí po hranì spádu nejvý¹e 1) se mohl potenciál zmen¹it o~$p(u)/K$
+provádí po hranì spádu nejvý¹e jedna) se mohl potenciál zmen¹it o~$p(u)/K$
a~mohl se zvìt¹it o~$p(v)/K$. Zvìt¹í se tedy nanejvý¹ o~$N/K$
Pøi nenasyceném pøevedení z~potenciálu urèitì ubyde o~$p(u)/K$
a~mo¾ná pøibyde $p(v)/K$. Celkovì se tedy sní¾í nanejvý¹
o~${p(u)/K} - {p(v)/K}$, co¾ je $1/K$~poètu prvkù na nejvy¹¹í
hladinì. Z~minulého lemmatu víme, ¾e poèet nenasycených pøevedení
v~jedné fázi je men¹í nebo roven poètu vrcholù na nejvy¹¹í hladinì na
-zaèátku fáze. Vzhledem k~tomu, ¾e zkoumáme drahé fáze v~nich¾ probìhne
+zaèátku fáze. Vzhledem k~tomu, ¾e zkoumáme drahé fáze, v~nich¾ probìhne
více ne¾~$K$ nenasycených pøevedení, vrcholù na nejvy¹¹í hladinì musí
být na zaèátku fáze také více ne¾~$K$, potenciál se tedy sní¾í o~více
ne¾ ${K/K}=1$.
\medskip
\h{Tøídìní}
-\s{Definice:} Komparátorová sí» je kombinaèní obvod jeho¾ hradla jsou
+\s{Definice:} {\I Komparátorová sí»} je kombinaèní obvod, jeho¾ hradla jsou
komparátory:
\centerline{\epsfbox{sortnet.0}}
-Výstupy komparátorù se nevìtví.
+\>Výstupy komparátorù se nevìtví.
\medskip
-{\>\sl Bubble sort}
+\s{Pøíklad:} {\sl Bubble sort}
\twofigures{sortnet.1}{Bubble.1}{143pt}{sortnet.2}{Bubble.2}{143pt}
$N^2$.
\medskip
-{\>\sl Merge sort}
+\s{Pøíklad:} {\>\sl Merge sort}
\centerline{\epsfbox{sortnet.4}}
\medskip
-\s{Definice:} Øekneme, ¾e posloupnost $x_0,\dots,x_{n-1} $ je èistì bitonická,
-pokud pro nìjaké $x_j\in\{1\dots n-1\} $ platí, ¾e
-$$x_0\leq x_1\leq \dots \leq x_j \geq x_{j+1}\geq\dots \geq x_{n-1}$$
-Posloupnost je bitonická, pokud existuje $k\in \{1\dots n-1\}$, pro
+\s{Definice:} Øekneme, ¾e posloupnost $x_0,\dots,x_{n-1} $ je {\I èistì bitonická},
+pokud pro nìjaké $x_j\in\{1, \dots, n-1\} $ platí:
+$$x_0\leq x_1\leq \dots \leq x_j \geq x_{j+1}\geq\dots \geq x_{n-1}.$$
+Posloupnost je {\I bitonická}, pokud existuje $k\in \{1\dots n-1\}$, pro
které platí, ¾e posloupnost
$x_k,x_{k+1 \bmod n},\dots, x_{k+n-1 \bmod n}$ je èistì bitonická.
-\s{Definice: Separátor $S_n$}
-Je sí», ve které jsou v¾dy~$i$-tý a~$i+1$-ní (pro $i=0,\dots,
-{n/2}-1$) prvek vstupu propojeny komparátorem, minimum bude~$i$-tým,
-maximum $i+1$-ním prvkem výstupu.
+\s{Definice:} {\I Separátor $S_n$}
+je sí», ve které jsou v¾dy~$i$-tý a~$(i+{n/2})$-tý prvek vstupu
+(pro $i=0,\dots, {n/2}-1$) propojeny komparátorem, minimum bude~$i$-tým,
+maximum $(i+1)$-ním prvkem výstupu.
\figure{sortnet.3}
{$(y_i, y_{i+{n/2}}) = CMP(x_i, x_{i+{n/2}})$} {300pt}
$y_0,\dots, y_{n-1}$ je posloupnost, která splòuje:
(i) $y_0,\dots, y_{n/2 -1}$ a~$y_{n/2},\dots, y_{n-1}$ jsou
-bitonické posloupnosti.
+bitonické posloupnosti,
-(ii) Pro v¹echna $i,j< {n/2}$ platí $y_i < y_j + {n/2}$
+(ii) Pro v¹echna $i,j< {n/2}$ platí $y_i < y_{j + {n/2}}$.
\proof
-(i) Nejprve nahlédneme, ¾e Lemma platí je-li vstupem èistì bitonická
+(i) Nejprve nahlédneme, ¾e lemma platí je-li vstupem èistì bitonická
posloupnost -- najdeme nejmen¹í~$k$ takové, ¾e $x_k$ a~$x_{k+{n/2}}$
se prohodí. Pokud ho nenajdeme, separátor neudìlá vùbec nic a~obì
tvrzení lemmatu zøejmì tedy platí. Øeknìme, ¾e $x_m$ je maximum
\centerline{\epsfbox{sortnet.7}}
\medskip
-\s{Definice: Bitonická tøídièka $B_n$}
+\s{Definice:} {\I Bitonická tøídièka $B_n$}
\centerline{\epsfbox{sortnet.5}}
Tøídièka se dá pou¾ít ke slévání, mù¾eme tak s~její pomocí sestavit
souèástky $M_n$ mergesortové sítì. Setøídìné posloupnosti
$x_0,\dots, x_{n-1}$ a~$y_0,\dots, y_{n-1}$ spojíme do jedné bitonické
-$x_0,\dots, x_{n-1},y_{n-1},\dots, y_0$. Z~takové posloupmosti pomocí
+$x_0,\dots, x_{n-1},y_{n-1},\dots, y_0$. Z~takové posloupnosti pomocí
$B_{2n}$ vytvoøíme setøídìnou posloupnost.
bude mít
${\O}(\log^2 N)$ hladin a~${\O}(N\log^2 N)$ hradel.
-Existuje tøídící algoritmus, kterému staèí ${\O}(\log N)$ hladin,
+Existuje tøídicí algoritmus, kterému staèí ${\O}(\log N)$ hladin,
ale jeho multiplikaèní konstanta je pøíli¹ veliká, tak¾e je v~praxi
nepou¾itelný.
\h{Hloupý algoritmus}
-Algoritmus prochází sekvenènì textem a hledaným vzorovým slovem. Pøi neshodì se ve vzorovem slovì vrací na zaèátek a v~textu pokraèuje znakem, v~kterém nastala neshoda. Èasová slo¾itost je $\O(S)$. Tento algoritmus funguje pouze jen pro vzorové slova bez opakujících se znakù.
+Algoritmus prochází sekvenènì textem a hledaným vzorovým slovem. Pøi neshodì se ve vzorovem slovì vrací na zaèátek a v~textu pokraèuje znakem, v~kterém nastala neshoda. Èasová slo¾itost je $\O(S)$. Tento algoritmus funguje pouze jen pro vzorová slova bez opakujících se znakù.
\s{Pøíklad:} Hledání vzorového slova |jehla| v~textu |vkupcejejehla|. Ve chvíli kdy máme prefix |je| a na vstupu dostaneme |j|, dochází k~neshodì a pokraèujeme v~hledání od tohoto znaku.
\:V~pøípadì, ¾e dostaneme jiný znak, v~textu se nevracíme a pokraèujeme dal¹ím znakem v~textu.
\endlist
-\s{Definice a znaèení pro øetìzce(slova):}
+\s{Definice a znaèení pro øetìzce (slova):}
\itemize\ibull
\s{Definice:}
\itemize\ibull
-\:{\I Abeceda $\Sigma$} je koneèná mno¾ina znakù, s~kterých tvoøíme text, øetìzece, slova jako koneèné posloupnosti znakù z $\Sigma$. Pøíkladem extrémních abeced je lineární abeceda slo¾ená s~nul a jednièek. Pøíklad s~druhého konce je abecade, která má jako znaky slova èeského jazyka. V algoritmech nebudeme uva¾ovat velikost abecedy (poèet znakù).
+\:{\I Abeceda $\Sigma$} je koneèná mno¾ina znakù, ze kterých tvoøíme text, øetìzece, slova jako koneèné posloupnosti znakù ze $\Sigma$. Pøíkladem extrémních abeced je lineární abeceda slo¾ená z~nul a jednièek. Pøíklad s~druhého konce je abeceda, která má jako znaky slova èeského jazyka. V algoritmech nebudeme uva¾ovat velikost abecedy (poèet znakù).
\:{\I $\Sigma$*} je mno¾ina v¹ech slov nad abecedou $\Sigma$.
\endlist
\s{Znaèení:}
\itemize\ibull
-\:{\I Slova} budeme znaèit malými písmeny øecké abecedy $\alpha$,$\beta$... a {\I znaky} velkými písmeny latinky $A$,$B$... .
+\:{\I Slova} budeme znaèit malými písmeny øecké abecedy $\alpha$, $\beta$, \dots,
+\:{\I Znaky} velkými písmeny latinky $A$, $B$, \dots
\:{\I Prázdné slovo} znaèíme písmenem $\varepsilon$.
\:{\I Délka slova} $\vert \alpha \vert$ pro $\alpha \in \Sigma^*$ je poèet znakù.
-\:{\I Zøetìzení} $\alpha\beta$ vznikne zapsáním slov $\alpha$ a $\beta$ za sebe. Platí $\alpha\varepsilon=\varepsilon\alpha=\alpha$, $\vert \alpha\beta \vert=\vert \alpha \vert+\vert \beta \vert$.
+\:{\I Zøetìzení} $\alpha\beta$ vznikne zapsáním slov $\alpha$ a $\beta$ za sebe. Platí: $\alpha\varepsilon=\varepsilon\alpha=\alpha$, $\vert \alpha\beta \vert=\vert \alpha \vert+\vert \beta \vert$.
\:$\alpha[i]$ je $i$-té písmeno slova $\alpha$, indexuje se od $0$.
\:$\alpha[i:j]$ je podslovo tvoøené písmeny $\alpha[i]$,...,$\alpha[j-1]$. Pøíklady: $\alpha[i:i+1]=\alpha[i]$, $\alpha[i:i]=\varepsilon$, $\alpha[:]=\alpha$.
\:$\alpha[:j]$ je prefix obsahující prvních $j$ znakù slova $\alpha$.
\:$\alpha[i:]$ je suffix obsahující znaky slova $\alpha$ poèínaje $i$-tým znakem.
-\:Ka¾dé slovo je prefixem i suffixem sebe sama, takovému prefixu/suffixu øíkáme {\I nevlastní}. V¹em ostatním {\I vlastní}.
+\:Ka¾dé slovo je prefixem i suffixem sebe sama, takovému prefixu resp. suffixu øíkáme {\I nevlastní}. V¹em ostatním {\I vlastní}.
\:Prázdné slovo je podslovem, prefixem i suffixem ka¾dého slova vèetnì prázdného slova.
\endlist
\endlist
\itemize\ibull
\s{IN:}
\itemize\ibull
-\:$\iota$ slovo (jehla) délky $J=\vert \iota \vert$
-\:$\sigma$ text (seno) délky $S=\vert \sigma \vert$
+\:$\iota$ slovo (jehla) délky $J=\vert \iota \vert$,
+\:$\sigma$ text (seno) délky $S=\vert \sigma \vert$.
\endlist
\s{OUT:}
\itemize\ibull
-\:v¹echny výskyty slova $\iota$ v textu $\sigma$: $\left\{ i \mid \sigma[i:i+J]=\iota \right\}.$
+\:V¹echny výskyty slova $\iota$ v textu $\sigma$: $\left\{ i : \sigma[i:i+J]=\iota \right\}.$
\endlist
\endlist
\h{Vyhledávací automat (Knuth, Morris, Pratt)}
-Vyhledávací automat bude vlastnì graf jeho¾ vrcholy reprezentují stavy. Jména stavù budou v¹echny prefixy slova $\iota$. Poèáteèný stav je prázdny slovo $\varepsilon$ a koneèný je samotná $\iota$. Dopøední hrany grafu budú popisovat pøechod mezi stavy v~smysle zvìt¹ení délky jména stavu (dopøedná funkce $d(\alpha , X)$), tedy ka¾dá taková hrana bude oznaèena písmenem $X$ a bude popisovat dané zvìt¹ení délky jména stavu, tedy $\alpha \rightarrow \alpha X$. Zpìtné hrany grafu budú popisovat pøechod ( zpìtná funkce $z(\alpha)$) mezi stavem $\alpha$ a nejdel¹ím vlastním suffixem $\alpha$, který je prefixem $\iota$, kdy¾ nastane neshoda.
+Vyhledávací automat bude vlastnì graf, jeho¾ vrcholy reprezentují stavy. Jmény stavù budou v¹echny prefixy slova $\iota$. Poèáteèní stav je prázdné slovo $\varepsilon$ a koneèný je samotná $\iota$. Dopøedné hrany grafu budou popisovat pøechod mezi stavy ve smyslu zvìt¹ení délky jména stavu (dopøedná funkce $d(\alpha , X)$), tedy ka¾dá taková hrana bude oznaèena písmenem $X$ a bude popisovat dané zvìt¹ení délky jména stavu, tedy $\alpha \rightarrow \alpha X$. Zpìtné hrany grafu budou popisovat pøechod (zpìtná funkce $z(\alpha)$) mezi stavem $\alpha$ a nejdel¹ím vlastním suffixem $\alpha$, který je prefixem $\iota$, kdy¾ nastane neshoda.
\figure{vautomat.eps}{Vyhledávací automat}{5.5in}
\s{Vyhledávaní:}
\algo
\:$\alpha \leftarrow \varepsilon$.
-\:pro $C\in\Sigma$ postupnì:
-\:$\indent$dokud $\neg \exists d(\alpha , C) \wedge \alpha\neq\varepsilon : \alpha \leftarrow z(\alpha)$
-\:$\indent$dokud $\exists d(\alpha , C) \Rightarrow \alpha \leftarrow d(\alpha , C)$
-\:$\indent$kdy¾ $\alpha = \iota \Rightarrow$ hledané slovo je v~textu
+\:Pro $C\in\Sigma$ postupnì:
+\:$\indent$Dokud $\neg \exists d(\alpha , C) \wedge \alpha\neq\varepsilon : \alpha \leftarrow z(\alpha)$.
+\:$\indent$Jestli¾e $\exists d(\alpha , C) \Rightarrow \alpha \leftarrow d(\alpha , C)$.
+\:$\indent$Jestli¾e $\alpha = \iota \Rightarrow$ hledané slovo je v~textu.
\endalgo
\s{Alternativa:}
\algo
\:$k \leftarrow 0$.
-\:pro $C\in\Sigma$ postupnì:
-\:$\indent$dokud $C\neq \iota[k] \wedge k>0: k \leftarrow z(k)$
-\:$\indent$dokud $C=\iota[k] \Rightarrow k++$
-\:$\indent$kdy¾ $k = J \Rightarrow$ hledané slovo je v~textu
+\:Pro $C\in\Sigma$ postupnì:
+\:$\indent$Dokud $C\neq \iota[k] \wedge k>0: k \leftarrow z(k)$.
+\:$\indent$Jestli¾e $C=\iota[k] \Rightarrow k++$.
+\:$\indent$Jestli¾e $k = J \Rightarrow$ hledané slovo je v~textu.
\endalgo
-\s{Invariant:} Stav po pøeètení vstupu $\beta$. $\alpha(\beta)$ $=$ nejdel¹í suffix $\beta$, který je prefixem $\iota$.
-S~invariantu vyplýva korektnost vyhledávací èásti KMP algoritmu.
+\s{Invariant:} Stav po pøeètení vstupu $\beta$: $\alpha(\beta)$ $=$ nejdel¹í suffix $\beta$, který je prefixem $\iota$.
+Z~invariantu vyplývá korektnost vyhledávací èásti algoritmu KMP.
\proof
-Dùkaz indukcí. Na zaèátku pro prázdny naètený vstup platí invariant, tedy prázdny suffix $\beta$ je prefixem $\iota$. V~kroku $n$ máme naètený vstup $\beta$ a k~nìmu naèteme znak $C$. Jestli si odmyslíme $C$, tedy kdy¾ si od jména stavu odmyslíme posledné písmenko, dostaneme znovu jméno stavu. Tak stav, který pasuje na konec vstupu bez toho $C$ je stav, který pasuje na konec pùvodního vstupu, toho o~jeden znak krat¹ího. Tím pádem to musí být nìco, co je maximálnì tak dlouhé jako pùvodní stav, u~kterého jsme byli, proto¾e to byl nejdel¹í, který pasoval. Staèí procházet postupnì v¹echny stavy, které pasují na konec toho vstupu od nejdel¹ího k~nejkrat¹ímu a vzít první, který se dá roz¹íøit o $C$. To je pøesnì to, co algoritmus dìlá. Preto¾e zpìtná funkce øekne nejbli¾¹í krat¹í jméné stavu. Tak¾e algoritmus iteruje pøes stavy, které tam pasují, a¾ najde jeden, který se dá roz¹íøit o~$C$ a jeliko¾ iteroval od ty nejdel¹í, tak to je logicky ten nejdel¹í, který tam pasuje.
+Dùkaz indukcí. Na zaèátku pro prázdný naètený vstup platí invariant, tedy prázdný suffix $\beta$ je prefixem $\iota$. V~kroku $n$ máme naètený vstup $\beta$ a k~nìmu naèteme znak $C$. Jestli¾e si odmyslíme $C$, tedy kdy¾ si od jména stavu odmyslíme poslední písmenko, dostaneme znovu jméno stavu. Tak stav, který pasuje na konec vstupu bez toho $C$, je stavem, který pasuje na konec pùvodního vstupu, toho o~jeden znak krat¹ího. Tím pádem to musí být nìco, co je maximálnì tak dlouhé jako pùvodní stav, u~kterého jsme byli, proto¾e to byl nejdel¹í, který pasoval. Staèí procházet postupnì v¹echny stavy, které pasují na konec toho vstupu od nejdel¹ího k~nejkrat¹ímu a vzít první, který se dá roz¹íøit o $C$. To je pøesnì to, co algoritmus dìlá, proto¾e zpìtná funkce øekne nejbli¾¹í krat¹í jméno stavu. Tak¾e algoritmus iteruje pøes stavy, které tam pasují, a¾ najde jeden, který se dá roz¹íøit o~$C$, a jeliko¾ iteroval od nejdel¹ího, tak to je logicky ten nejdel¹í, který tam pasuje.
\qed
\s{Lemma:} Vyhledávaní dobìhne v~èase $\O(S)$.
\proof
-Pro ka¾dý znak vstupního textu mohou nastat dva pøípady. Znak roz¹iruje aktuální prefix, nebo musíme pou¾ít zpìtnou funkci(ypìtnou hranu). Roz¹irování trvá konstantnì mnoho èasu, zatímco zpìtná funkce mu¾e být pro jeden znak volána a¾ $J$-krát. Pøi ka¾dém volání klesne délka aktuálního stavu minimálne o~jedna a zároven platí, ¾e kdykoliv stav prodlu¾ujeme, roste právì o~jeden znak. Proto v¹ech zkrácení dohromady mu¾e být nejvý¹e tolik, kolik bylo v¹ech prodlou¾ení, t.j. kolik jsme pøeèetli znaku textu. Celkem je tedy poèet krokù lineární vzhledem k~délce textu.
+Pro ka¾dý znak vstupního textu mohou nastat dva pøípady. Znak roz¹iøuje aktuální prefix, nebo musíme pou¾ít zpìtnou funkci (zpìtnou hranu). Roz¹irování trvá konstantnì mnoho èasu, zatímco zpìtná funkce mu¾e být pro jeden znak volána a¾ $J$-krát. Pøi ka¾dém volání klesne délka aktuálního stavu minimálnì o~jedna a zároveò platí, ¾e kdykoliv stav prodlu¾ujeme, roste právì o~jeden znak. Proto v¹ech zkrácení dohromady mu¾e být nejvý¹e tolik, kolik bylo v¹ech prodlou¾ení, t.j. kolik jsme pøeèetli znakù textu. Celkem je tedy poèet krokù lineární vzhledem k~délce textu.
\qed
\s{Konstrukce zpìtné funkce:}
\algo
-\:sestrojíme dopøedné hrany
-\:$z( \varepsilon ) \leftarrow 0$, $z( \iota [0]) \leftarrow \varepsilon $
-\:$\indent$ $\alpha \leftarrow \varepsilon$
-\:pro $i = 1$ do $J$
-\:$\indent$$\alpha \leftarrow krok( \alpha , \iota [i])$
-\:$\indent$$z( \iota [0:i+1]) \leftarrow \alpha$
+\:Sestrojíme dopøedné hrany.
+\:$z( \varepsilon ) \leftarrow \emptyset$, $z( \iota [0]) \leftarrow \varepsilon $.
+\:$\alpha \leftarrow \varepsilon$.
+\:Pro $i = 1$ do $J-1$:
+\:$\indent$$\alpha \leftarrow krok( \alpha , \iota [i])$.
+\:$\indent$$z( \iota [0:i+1]) \leftarrow \alpha$.
\endalgo
-\s{Vysvìtlení:} V¹imnìte si, ¾e $z(i)$ je pøesnì stav, do nej¾ se dostaneme pøi spu¹tìní na¹eho vyhledávacího algoritmu na øetìzec $\iota [2:i]$, èili na $i$-tý prefix bez prvního písmenka. Proè to tak je? Zpìtná funkce øíká, jaký je nejdel¹í vlastní suffix daného stavu, který je také stavem, zatímco $\alpha$ oznaèuje nejdel¹í suffix textu, který je stavem. Tyto dvì vìci se pøeci li¹í jen v~tom, ¾e ta druhá pøipou¹tí i nevlastní suffixy, a právì tomu zabráníme odstranìním prvního znaku. Tak¾e $z()$ získáme tak, ¾e spustíme vyhledávání na èást samotného slova $\iota$. Jen¾e k~vyhledávání zase potøebujeme zpìtnou funkci $z$. Proto budeme zpìtnou funkci vytváøet postupne od nejkrat¹ích prefixu. Zøejmì $z(1) = \varepsilon$. Pokud ji¾ máme $z(i)$, pak výpoèet $z(i+1)$ odpovídá spu¹tení automatu na slovo délky i a pritom budeme zpìtnou funkci potøebovat jen pro stavy délky $i$ nebo men¹í, pro které ji ji¾ máme hotovou.
+\s{Vysvìtlení:} V¹imnìte si, ¾e $z(i)$ je pøesnì stav, do nìho¾ se dostaneme pøi spu¹tìní na¹eho vyhledávacího algoritmu na øetìzec $\iota [2:i]$, èili na $i$-tý prefix bez prvního písmenka. Proè to tak je? Zpìtná funkce øíká, jaký je nejdel¹í vlastní suffix daného stavu, který je také stavem, zatímco $\alpha$ oznaèuje nejdel¹í suffix textu, který je stavem. Tyto dvì vìci se pøeci li¹í jen v~tom, ¾e ta druhá pøipou¹tí i nevlastní suffixy, a právì tomu zabráníme odstranìním prvního znaku. Tak¾e $z()$ získáme tak, ¾e spustíme vyhledávání na èást samotného slova $\iota$. Jen¾e k~vyhledávání zase potøebujeme zpìtnou funkci $z$. Proto budeme zpìtnou funkci vytváøet postupne od nejkrat¹ích prefixu. Zøejmì $z(1) = \varepsilon$. Pokud ji¾ máme $z(i)$, pak výpoèet $z(i+1)$ odpovídá spu¹tení automatu na slovo délky i a pritom budeme zpìtnou funkci potøebovat jen pro stavy délky $i$ nebo men¹í, pro které ji ji¾ máme hotovou.
Navíc nemusíme pro jednotlivé prefixy spou¹tìt výpoèet v¾dy znovu od zaèátku, proto¾e $(i+1)$-ní prefix
je prodlou¾ením $i$-tého prefixu o~jeden znak. Staèí tedy spustit algoritmus na celý øetìzec $\iota[1:J]$ a sledovat, jakými stavy bude procházet. A to budou pøesnì hodnoty zpìtné funkce. Vytvoøení zpìtné funkce se tak nakonec zredukovalo na jediné vyhledávání v~textu o~délce $J-1$, a proto pobe¾í v case $\O(J)$. Èasová slo¾itost celého algoritmu tedy bude $\O(S+J)$.
-\h{Algoritmus Rabin \& Karp}
-Tenhle algoritmus funguje tak, ¾e porovnává hash hledaného øetìzce s~hashem aktuálního podøetìzce v~textu a aktuální podøetìzec porovná se vzorkem pouze v~pøípadì, kdy¾ mají shodný hash. Kdy¾ si zvolíme tu správnou hashovací funkci, budeme moci vypoèítat hash následujíciho podøetìzce na základe hashe toho aktuálního. Jako hashovací funkci $h: \Sigma^J \rightarrow Z$ pou¾ijeme následující: $h(x_{0},...,x_{J-1}) = ( \sum_{i=0}^{J-1} x_{i}.p^{J-1-i}) \bmod N$, kde $N$ je velikost prostoru do kterého hashujeme. Jak zjistíme hash následujícího podøetìzce?
+\h{Algoritmus (Rabin, Karp)}
+Tenhle algoritmus funguje tak, ¾e porovnává hash hledaného øetìzce s~hashem aktuálního podøetìzce v~textu a aktuální podøetìzec porovná se vzorkem pouze v~pøípadì, kdy¾ mají shodný hash. Kdy¾ si zvolíme tu správnou hashovací funkci, budeme moci vypoèítat hash následujíciho podøetìzce na základe hashe toho aktuálního. Jako hashovací funkci $h: \Sigma^J \rightarrow {\bb Z}$ pou¾ijeme následující:
+$$h(x_{0},...,x_{J-1}) = ( \sum_{i=0}^{J-1} x_{i}.p^{J-i}) \bmod N,$$
+kde $N$ je velikost prostoru, do kterého hashujeme. Jak zjistíme hash $h{'}$ následujícího podøetìzce?
\itemize\ibull
\:$h = x_{0}.p^{J} + x_{1}.p^{J-1} + ... + x_{J-1}.p^{1}$
\:$h^{'} = x_{1}.p^{J} + x_{2}.p^{J-1} + ... + x_{J}.p^{1}$
\:$h^{'} = (h - x_{0}.p^{J}).p + x_{J}.p^{1}$
\endlist
-Tady mù¾eme vidìt, ¾e hash následujícího øetìzce lze pøepoèítat na základì toho pøedchozího v konstantním èase
-Èasová slo¾itost je v nejlep¹ím pøípadì lineární vzhledem k~délce textu, zatímco nejhor¹í pøípad mú¾e trvat a¾ $\O(JS)$.
+Tady mù¾eme vidìt, ¾e hash následujícího øetìzce lze pøepoèítat na základì toho pøedchozího v konstantním èase. Èasová slo¾itost je v nejlep¹ím pøípadì lineární vzhledem k~délce textu, zatímco nejhor¹í pøípad mù¾e trvat $\O(JS)$.
\bye
\h{Zopakujeme si základní znaèení}
\itemize\ibull
-\:$\iota_1, \ldots, \iota_k$ -- jehly
-\:$\sigma$ -- text (seno)
+\:$\iota_1, \ldots, \iota_k$ -- vyhledávaná slova (jehly)
+\:$\sigma$ -- text, kde se hledá (seno)
\endlist
\h{Hledání výskytu v¹ech slov}
-Nejprve si øeknìme, jak chceme aby vypadal výstup a poté jak ho dosáhnout. Výstupem pro nás budou v¹echny uspoøádané dvojice $(i,j)$ takové, ¾e $$\iota_i=\sigma[j:j+\vert\iota_i\vert]$$ Postavme si proto vyhledávací automat, který najde v¹echny takové uspoøádané dvojice.
+Nejprve si øekneme, jak chceme, aby vypadal výstup, a poté jak ho dosáhnout. Výstupem pro nás budou v¹echny uspoøádané dvojice $(i,j)$ takové, ¾e $$\iota_i=\sigma[j:j+\vert\iota_i\vert]$$ Postavme si proto vyhledávací automat, který najde v¹echny takové uspoøádané dvojice.
\h{Vyhledávací automat}
-Vyhledávací automat je vlastnì strom\foot{http://en.wikipedia.org/wiki/Trie}, kde ka¾dý vrchol mù¾e mít stupeò a¾ do velikosti abecedy a kde jednotlivé hrany odpovídají písmenùm této abecedy. Vrcholy, ve kterých konèí slovo, jsou oznaèené (na obrazcích èernì). Dále si èasem do tohto vyhledávacího stromu pøidáme zpìtné hrany a "zkratky".
+{\I Vyhledávací automat} je vlastnì strom\foot{http://en.wikipedia.org/wiki/Trie}, kde ka¾dý vrchol mù¾e mít stupeò a¾ do velikosti abecedy a kde jednotlivé hrany odpovídají písmenùm této abecedy. Vrcholy, ve kterých konèí slovo, jsou oznaèené (na obrazcích èernì). Dále si èasem do tohto vyhledávacího stromu pøidáme zpìtné hrany a \uv{zkratky}.
-\s{Stav} je pozice ve stromì, která odpovídá nejdel¹ímu prefixu vyhovující jehly v senì (platí rovnì¾ stejný \s{invariant} z pøedchozí pøedná¹ky).\par
-\s{Zpìtná hrana} $z$($\alpha$) := nejdel¹í vlastní suffix\foot{definováno na 6. pøedná¹ce} slova $\alpha$, který je stavem.\par
+\s{Definice:} {\I Stav} je pozice ve stromì, která odpovídá nejdel¹ímu prefixu vyhovující jehly v senì (platí rovnì¾ stejný invariant z pøedchozí pøedná¹ky).
+
+\s{Definice:} {\I Zpìtná hrana} $z$($\alpha$) := nejdel¹í vlastní suffix\foot{definováno na 6. pøedná¹ce} slova $\alpha$, který je stavem.
\figure{vyhl_automat_dopr.eps}{Vyhledávací automat}{1in}
\h{Výstup z automatu}
Pøi vypisování výsledkù mu¾eme narazit na urèité problémy, které jsou dobøe vidìt na následujícím obrázku. První problém urèitì nastane, proto¾e v automatu není pøesnì øeèeno, které slovo konèí v jakém vrcholu.
Napøíklad ve stavu, kde konèí slovo BARBARA, konèí také slovo ARA, ale o tom nevíme.
-Druhý problém nastává, kdy¾ v automatu není zaznaèen konec slova. Pøíkladem je seno BARAB (jednoduché k nahlédnutí viz. obrázek).
+Druhý problém nastává, kdy¾ v automatu není zaznaèen konec slova. Pøíkladem je seno BARAB (jednoduché k~nahlédnutí, viz obrázek).
Teï nám nezbývá nic jiného, ne¾ najít øe¹ení tìchto záludných problémù. Øe¹e¹í se nám naskýtá hned nìkolik:
\itemize\ibull
\:Projdeme v¹echy zpìtné hrany a vypí¹eme slova, jen¾ v daných stavech konèí. Toto øe¹ení funguje, ale je pomalé, proto¾e procházíme v¹echny zpìtné hrany.
\:Pøedpoèítání mno¾in. Najdeme mno¾inu slov tak, aby celková velikost slov byla vìt¹í ne¾ lineární. Funkèní, ale konstrukce je pomalá.
-\:\s{\<slovo>($s$)} = index slova $\iota$, které konèí ve stavu $s$, nebo $\emptyset$ \par
-\s{\<out>($s$)} = nejbli¾¹í vrchol, do kterého se lze z $s$ dostat po zpìtných hranách a \<slovo(v)> $\ne 0$ (konèí tam slovo)
+\:$\<slovo>(s) =$ index slova $\iota$, které konèí ve stavu $s$, nebo $\emptyset$, \par
+$\<out>(s) =$ nejbli¾¹í vrchol, do kterého se lze 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ými hranami}{1.3in}
\endlist
-\>Jako vhodné øe¹ení tohoto problému se naskýtá poslední bod. Podle nìho vytvoøíme algoritmus na vyhledávání "jehel v senì".
+\>Jako vhodné øe¹ení tohoto problému se naskýtá poslední bod. Podle nìho vytvoøíme algoritmus na vyhledávání \uv{jehel v senì}.
\algo
-\:$s \leftarrow$ \<koøen> ($s$ je aktuální stav vyhledávacího automatu).
+\:$s \leftarrow \<koøen>$ ($s$ je aktuální stav vyhledávacího automatu).
\:Procházíme v¹echny písmena $c$ v senì $\sigma$:
\::$s \leftarrow krok(s,c)$.
-\::Je-li \<slovo(s)> $\ne 0 \Rightarrow$ \<vypi¹(slovo(s))>.
+\::Je-li $\<slovo>(s) \ne 0 \Rightarrow$ vypí¹eme $\<slovo>(s)$.
\::$v \leftarrow out(s)$.
\::Dokud $v \ne 0 $:
-\:::Vypi¹ \<slovo(v)>.
-\:::$v \leftarrow$ \<out(v)>.
+\:::Vypí¹eme $\<slovo>(v)$.
+\:::$v \leftarrow \<out>(v)$.
\endalgo
-\s{\<krok(s,c)>}:= jeden \<krok> ve vyhledávacím automatu
+\>$\<krok>(s,c) :=$ jeden krok ve vyhledávacím automatu:
\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)>.
+\:Dokud $\neg \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
\h{Reprezentace v pamìti}
-První mo¾nost jak reprezentovat vyhledávací automat je pole se seznamem synù. Je to jednoduchá varianta, ale má nevýhodu pro velké abecedy, proto¾e procházení seznamu synù mù¾e trvat neúmìrnì dlouho. Proto se nabízí druhá mo¾nost a to hashovací tabulka \<(stav,znak)> $\rightarrow$ \<f(stav,znak)>, kde se "ztratí" pou¾ívání hashovací funkce.
+První mo¾nost jak reprezentovat vyhledávací automat je pole se seznamem synù. Je to jednoduchá varianta, ale má nevýhodu pro velké abecedy, proto¾e procházení seznamu synù mù¾e trvat neúmìrnì dlouho. Proto se nabízí druhá mo¾nost a to hashovací tabulka $(\<stav>,\<znak>) \rightarrow \<f>(\<stav>,\<znak>)$, kde se \uv{ztratí} pou¾ívání hashovací funkce.
\h{Slo¾itost}
\itemize\ibull
-\:kroky 2.--5. mají èasovou slo¾itost $O(\vert \sigma \vert)$, kterou jednodu¹e doká¾eme pomocí potenciálu -- poèet krokù nahoru $ \leq $ poèet krokù dolù je maximálnì $\vert \sigma \vert$, kde $\vert \sigma \vert$ je délka sena
-\:kroky 6.--8. mají èasovou slo¾itost $O$(\<poèet výskytù>), proto¾e rychleji opravdu nejdou v¹echny výskyty vypsat
+\:Kroky 2--5 mají èasovou slo¾itost $\O(\vert \sigma \vert)$, kterou jednodu¹e doká¾eme pomocí potenciálu -- poèet krokù nahoru $ \leq $ poèet krokù dolù $ \leq \vert \sigma \vert$, kde $\vert \sigma \vert$ je délka sena.
+\:Kroky 6--8 mají èasovou slo¾itost $\O(\<poèet výskytù>)$, proto¾e rychleji opravdu nelze v¹echny výskyty vypsat.
\endlist
-\s{Konstrukce automatu} (Aho, Corasicková)
+\s{Konstrukce automatu (Aho, Corasicková)}
\algo
\:Postavíme strom dopøedných hran, $r \leftarrow$ koøen stromu.
-\:Spoèteme \<slovo>($\ast$).
+\:Spoèteme $\<slovo>(\ast)$ (spoèteme funkci \<slovo> pro v¹chny stavy).
\:Spoèteme $z(\ast)$: $z(\beta)=\alpha(\beta[1:])$.
\itemize\ibull
-\:$z(\beta) = \alpha(\beta[1:])$ - v¹echny zpìtné hrany vedou do vy¹¹ích hladin
-\:\<z(v) = krok(z(u),c)>
+\:$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$, do fronty $Q$ pøiøadíme v¹echny syny $r$, pro v¹echny $v$ prvky $Q: z(v) \leftarrow r$
+\figure{Graphic100.eps}{$\<z>(v) = \<krok>(z(u),c)$}{0.7in}
+\:$z(r) \leftarrow 0$, do fronty $Q$ pøiøadíme v¹echny syny $r$, pro v¹echny $v$ prvky $Q: z(v) \leftarrow r$.
\:Dokud fronta $Q$ není prázdná:
-\::$u\leftarrow$ vyber z $Q$.
+\::$u\leftarrow$ vybereme z $Q$.
\::Pro syny $v$ vrcholu $u$:
-\:::$R \leftarrow$ \<krok>($z(u)$, znak na hranì \<uv>).
+\:::$R \leftarrow \<krok>(z(u)$, znak na hranì \<uv>).
\:::$z(v)\leftarrow R$.
\figure{Graphic101.eps}{}{0.7in}
-\:::Je-li $slovo(R) \not= 0 \Rightarrow out(v) \leftarrow R$, jinak $out(v) = out(R)$.
+\:::Je-li $slovo(R) \not= 0 \Rightarrow out(v) \leftarrow R$, jinak $out(v) \leftarrow out(R)$.
\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_i \vert \iota_i \vert + \vert \sigma \vert + \<poèet výskytù>)$$
+Algoritmus A-C najde v¹echny výskyty slov $\iota_1, \ldots, \iota_k$ ve slove $\sigma$ v èase: $$\O(\Sigma_i \vert \iota_i \vert + \vert \sigma \vert + \<poèet výskytù>).$$
\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$$
-Násobení dvou polynomù $R=P*Q$ je ekvivalentní s operací $R = \sum_{j,k} p_j q_k x^{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)$ operací, teda na spoèítaní celého polynomu $R$ potøebujeme $\Theta(n^2)$ operací.\par
+\>Mìjme dva polynomy definované jako:
+$$P(x) = \sum_{j=0}^{n-1} p_j x^j, \quad Q(x) = \sum_{j=0}^{n-1} q_j x^j.$$
+Násobení dvou polynomù $R=P \cdot Q$ je ekvivalentní s operací $R = \sum_{j,k} p_j q_k x^{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)$ operací, tedy na spoèítaní celého polynomu $R$ potøebujeme $\Theta(n^2)$ operací.
-Podíváme se na jinou mo¾nost, jak tento problém øe¹it. Poslou¾í nám k tomu následující vìta o jednoznaènosti existence polynomu nejvý¹e $k$-tého stupnì, pokud známe hodnoty v alespoò $k$ bodech.
+Podíváme se na jinou mo¾nost, jak tento problém øe¹it. Poslou¾í nám k~tomu následující vìta o jednoznaènosti existence polynomu nejvý¹e $k$-tého stupnì, pokud známe hodnoty v alespoò $k$ bodech.
-\s{Vìta:} Jsou-li $x_0, \ldots, x_k \in \bb{R} $ navzájem ruzná a $y_0, \ldots, y_k \in \bb{R}$, pak $\exists !$ polynom P stupnì $\leq k : \forall j: P(x_j) = y_j$
+\s{Vìta:} Jsou-li $x_0, \ldots, x_k \in \bb{R} $ navzájem ruzná a $y_0, \ldots, y_k \in \bb{R}$, pak $\exists !$ polynom $P$ stupnì $\leq k : \forall j: P(x_j) = y_j$.
\figure{polynom.eps}{Polynom}{2in}
-\s{Plán:}
-Nech» $k=2n-1$, zvolíme $x_0, \ldots, x_k$ libolné, ale rùzná a spoèteme $P(x_0), \ldots, P(x_k)$ a $P(y_0), \ldots, P(y_k)$.
+\ss{Plán:}
+\>Nech» $k=2n-1$, zvolíme $x_0, \ldots, x_k$ libolná, ale rùzná a spoèteme $P(x_0), \ldots, P(x_k)$ a $P(y_0), \ldots, P(y_k)$.
Poté $\forall j: y_j=P(x_j)Q(x_j)$
-musíme najít polynom $R$ stupnì $\leq k: \forall j: R(x_j)=y_j$
-
-\s{Vyhodnocování polynomù} (metodou Rozdìl a panuj)\par
-\>BÚNO $n=2^m$\par
-\>Uvá¾me polynom:
-$$P(x_j) = p_0 x^0 + p_1 x^1 + \ldots + p_{n-1} x^{n-1}$$
-Tento polynom si mu¾eme rozdelit, na 2 èasti. V levé budeme mít èleny s exponentem sudým a v pravé budou èleny s lichými koeficienty.
-$$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})$$
+musíme najít polynom $R$ stupnì $\leq k: \forall j: R(x_j)=y_j$.
+
+\s{Vyhodnocování polynomù} (metodou Rozdìl a panuj)
+
+\>BÚNO $n=2^m$. Uva¾me polynom:
+$$P(x_j) = p_0 x^0 + p_1 x^1 + \ldots + p_{n-1} x^{n-1}.$$
+Tento polynom si mu¾eme rozdìlit, na dvì èásti. V~levé budeme mít èleny se sudými exponenty a v~pravé budou èleny s exponenty lichými:
+$$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}).$$
Z pravé strany mù¾eme vytknout $x$ a dostaneme:
$$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)$$
-Kde $L(x)$ a $N(x)$ jsou polynomy stupnì $n/2$. Umonìním $x^2$ se nám poru¹í párování $x$ a $-x$, proto musíme poèítat v $\bb{C}$.
-Musíme si ale uvìdomit, ¾e tyto vztahy platí pouze, kdy¾ existuje pár $-x$ a $x$ v tìlese, nad kterým poèítáme. V tomto pøípade jsme z polynomu s $n$ koeficienty v $n$ bodech dostali $2$ polynomy s $n/2$ koeficienty v $n/2$ bodech. Z èeho¾ vyplývá èasová slo¾itost definována vztahem:
-$$T(n) = 2T(n/2) + O(n)$$
-Co¾ mù¾eme vyøeøit s pou¾itím Master Theoremu z ADS 1 a dostáváme
-$$T(n) = O(n \log n)$$
+$$P(x) = L(x^2) + xN(x^2),$$
+$$P(-x) = L(x^2) + xN(x^2),$$
+kde $L(x)$ a $N(x)$ jsou polynomy stupnì $n/2$. Umocnìním $x^2$ se nám poru¹í párování $x$ a $-x$, proto musíme poèítat v $\bb{C}$.
+Musíme si ale uvìdomit, ¾e tyto vztahy platí pouze, kdy¾ existuje pár $-x$ a $x$ v tìlese, nad kterým poèítáme. V~tomto pøípadì jsme z~polynomu s~$n$ koeficienty v~$n$ bodech dostali $2$ polynomy s~$n/2$ koeficienty v~$n/2$ bodech. Z~toho vyplývá èasová slo¾itost definována vztahem:
+$$T(n) = 2T(n/2) + \O(n).$$
+Ten mù¾eme vyøe¹it s pou¾itím Master Theoremu z~ADS~I a dostaneme:
+$$T(n) = \O(n \log n).$$
\bye
\input lecnotes.tex
\prednaska{8}{Fourierova transformace}{(K.Jakubec, M.Polák a G.Ocsovszky)}
-Násobení polynomù mù¾e mnohým pøipadat jako pomìrnì (algoritmicky) snadný problém. Asi ka¾dého hned napadne "hloupý" algoritmus - jednodu¹e vezmu koeficienty prvního polynomu a ka¾dým z nich pøenásobím v¹echny koeficienty toho druhého. Pokud øád prvního polynomu je $n$ a druhého $m$, tak èasová slo¾itost nám vyjde nìco jako $O(mn)$. To není a¾ tak ¹patné, v nejhor¹ím se dostaneme na $O(n^{2})$ (pokud $m = n$). Na první pohled se mù¾e zdát, ¾e rychleji to prostì nejde (pøeci musím v¾dy vynásobit "ka¾dej s ka¾dým"). Ve skuteènosti to ale rychleji fungovat mù¾e...ale k tomu je potøeba znát trochu tajemný algoritmus FFT neboli {\I Fast Fourier Transform}.
+Násobení polynomù mù¾e mnohým pøipadat jako pomìrnì (algoritmicky) snadný problém. Asi ka¾dého hned napadne \uv{hloupý} algoritmus -- jednodu¹e vezmeme koeficienty prvního polynomu a ka¾dým z nich pøenásobím v¹echny koeficienty toho druhého. Pokud øád prvního polynomu je $n$ a druhého $m$, tak èasová slo¾itost nám vyjde nìco jako $\O(mn)$. To není a¾ tak ¹patné, v nejhor¹ím pøípadì se dostaneme na $\O(n^{2})$ (pokud $m = n$). Na první pohled se mù¾e zdát, ¾e rychleji to prostì nejde (pøeci musíme v¾dy vynásobit \uv{ka¾dej s ka¾dým}). Ve skuteènosti to ale rychleji fungovat mù¾e, ale k~tomu je potøeba znát trochu tajemný algoritmus FFT neboli {\I Fast Fourier Transform}.
-\s{ Trochu algebry na zaèátek: }
-
-Libovolný polynom P øádu n mù¾eme mít reprezentován 2 rùznými zpùsoby:
+\ss{Trochu algebry na zaèátek:}
+\>Libovolný polynom $P$ øádu $n$ mù¾eme být reprezentován dvìma rùznými zpùsoby:
\itemize\ibull
-\: jeho koeficienty, èili èísly $a_{0}, a_{1}, \ldots ,a_{n}$
-\: jeho hodnotami v n + 1 rùzných bodech $x_{0}, x_{1}, \ldots , x_{n+1}$ èili èísly $P(x_{0} ), P(x_{1} ), \ldots ,P( x_{n+1} )$
-\:
+\:svými koeficienty, èili èísly $a_{0}, a_{1}, \ldots ,a_{n}$, nebo
+\:svými hodnotami v $n + 1$ rùzných bodech $x_{0}, x_{1}, \ldots , x_{n}$, èili èísly $P(x_{0}),$ $P(x_{1}),$ $\ldots , P(x_{n})$.
\endlist
-Pov¹imnìme si jedné skuteènosti - máme-li 2 polynomy $A$ a $B$ øádu $n$ a $x_{0}\ldots, x_{k}$ body, pak platí $C(x_{k}) = A(x_{k}) * B(x_{k}), k = 0,1,2 \ldots n+1.$ Toto èiní tento druhý zpùsob reprezentace polynomu velice atraktivním pro násobení. Problémem je, ¾e typicky máme polynom zadaný koeficienty a ne hodnotami v bodech. Tím pádem potøebujeme nìjaký hodnì rychlý algorimtus (= rychlej¹í ne¾ kvadratický, jinak bychom si nepomohli oproti hloupému algoritmu) na pøevod polynomu z jedné reprezentace do druhé a zase zpìt.
+\>Pov¹imnìme si jedné skuteènosti -- máme-li dva polynomy $A$ a $B$ øádu $n$ a body $x_{0}, \ldots, x_{k}$, pak platí $C(x_{k}) = A(x_{k}) \cdot B(x_{k}), k = 0,1,2, \ldots, n+1.$ Toto èiní tento druhý zpùsob reprezentace polynomu velice atraktivním pro násobení. Problémem je, ¾e typicky máme polynom zadaný koeficienty a ne hodnotami v bodech. Tím pádem potøebujeme nìjaký hodnì rychlý algorimtus (tj. rychlej¹í ne¾ kvadratický, jinak bychom si nepomohli oproti hloupému algoritmu) na pøevod polynomu z~jedné reprezentace do druhé a zase zpìt.
-Dále bychom si mìli uvìdomit, ¾e stupeò na¹eho výsledného polynomu C bude $\leq 2n+1$ (kde $n$ je stupnìm výchozích polynomù). To snad netøeba nijak vysvìtlovat, ka¾dý si to snadno ovìøí, jen dodáme, ¾e pokud chceme polynom C reprezentovat pomocí jeho hodnot v bodech, musíme vzít $2n + 2$ bodù. Tímto konèí malá algebraická vsuvka.
+Dále bychom si mìli uvìdomit, ¾e stupeò na¹eho výsledného polynomu $C$ bude $\leq 2n+1$ (kde $n$ je stupnìm výchozích polynomù). To snad netøeba nijak vysvìtlovat, ka¾dý si to snadno ovìøí, jen dodáme, ¾e pokud chceme polynom $C$ reprezentovat pomocí jeho hodnot v bodech, musíme vzít $2n + 2$ bodù. Tímto konèí malá algebraická vsuvka.
-\s{ Idea, jak by mìl algorimus pracovat: }
-\itemize\ibull
-\: vybereme 2n + 2 bodù $x_{0}, x_{1}, \ldots , x_{2n+2}$
-\: v tìchto bodech vyhodnotíme polynomy $A$ a $B$
-\: nyní ji¾ v lineárním èase získám polynom C (viz vý±e)
-\: invernznì pøevedu hodnoty polynomu C v 2n+2 bodech na jeho koeficienty
-\endlist
+\s{Idea, jak by mìl algoritmus pracovat:}
+\algo
+\:Vybereme $2n + 2$ bodù $x_{0}, x_{1}, \ldots , x_{2n+1}$.
+\:V~tìchto bodech vyhodnotíme polynomy $A$ a $B$.
+\:Nyní ji¾ v lineárním èase získáme polynom $C$ (viz vý¹e).
+\:Inverznì pøevedeme hodnoty polynomu $C$ v $2n+2$ bodech na jeho koeficienty.
+\endalgo
-Je asi vidìt, µe klíèové jsou kroky 2 a 4. Vybrání bodù jistì stihneneme pohodlnì v lineárním èas a vynásobení samotných hodnot té¾ (máme 2n+2 bodù, a $C(x_{k}) = A(x_{k}) * B(x_{k}), k = 0,1,2 \ldots 2n+2$, tak¾e na to nepotøebujeme více ne¾ $2n+2$ násobení).
+\>Je asi vidìt, ¾e klíèové jsou kroky 2 a 4. Vybrání bodù jistì stihneme pohodlnì v~lineárním èase a vynásobení samotných hodnot té¾ (máme $2n+2$ bodù a $C(x_{k}) = A(x_{k}) \cdot B(x_{k}), k = 0,1,2, \ldots , 2n+1$, tak¾e na to nepotøebujeme více ne¾ $2n+2$ násobení).
-Celý trik spoèívá v chytrém vybrání onìch bodù, ve kterých budeme polynomy vyhodnocovat. Je na to potøeba vìdìt pár zajímavostí o komplexních èíslech, na stránce Matrina Mar¹e jsou k dispozici slajdy, zde to bude zapsáno o trochu struènìji.
+Celý trik spoèívá v~chytrém vybrání onìch bodù, ve kterých budeme polynomy vyhodnocovat. Je na to potøeba vìdìt pár zajímavostí o~komplexních èíslech, na stránce Matrina Mar¹e jsou k dispozici slajdy, zde to bude zapsáno o~trochu struènìji.
-\s{ Vyhodnocení polynomu metodou rozdìl a panuj (algoritmus FFT): }
-Mìjme polynom P øádu $n$ a chceme jej vyhonotit v $n$ bodech. Vybereme si body tak, aby byly spárované, èili $\pm x_{0}, \pm x_{1} \ldots \pm x_{n/2-1} $. To nám výpoèet urychlí, proto¾e pak se druhé mocniny $x_{i}$ shodují s~druhými mocninami $-x_{i}$.
+\ss{Vyhodnocení polynomu metodou rozdìl a panuj (algoritmus FFT):}
+Mìjme polynom $P$ øádu $n$ a chceme jej vyhodnotit v $n$ bodech. Vybereme si body tak, aby byly spárované, èili $\pm x_{0}, \pm x_{1}, \ldots , \pm x_{n/2-1} $. To nám výpoèet urychlí, proto¾e pak se druhé mocniny $x_{i}$ shodují s~druhými mocninami $-x_{i}$.
-Polynom P rozlo¾íme na dvì èásti, první obsahuje èleny se sudými koeficienty, druhá s lichými:
+Polynom $P$ rozlo¾íme na dvì èásti, první obsahuje èleny se sudými exponenty, druhá s~lichými:
$P(x) = p_{0}x^{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}$
-$S(x^{2}) = p_{0}x^{0} + p_{2}x^{2} + ... + p_{n - 2}x^{n - 2}$
+$S(x^{2}) = p_{0}x^{0} + p_{2}x^{2} + ... + p_{n - 2}x^{n - 2}$,
$L(x^{2}) = p_{1}x^{1} + p_{3}x^{3} + ... + p_{n - 1}x^{n - 1}$
-Tak¾e obecnì $P(x) = S(x^{2}) + xL(x^{2})$ a $P(-x) = S(x^{2}) - xL(x^{2})$
-Jinak øeèeno, vyhodnocování P(x) v $n$ bodech se nám smrskne na vyhodnocení $S(x)$ a $L(x)$ (oba mají polovièní stupeò ne¾ P(x)) v $n/2$ bodech (proto¾e $(x_{i})^{2} = (-x_{i})^{2}$).
+\>Tak¾e obecnì $P(x) = S(x^{2}) + xL(x^{2})$ a $P(-x) = S(x^{2}) - xL(x^{2})$.
+Jinak øeèeno, vyhodnocování $P(x)$ v $n$ bodech se nám smrskne na vyhodnocení $S(x)$ a $L(x)$ (oba mají polovièní stupeò ne¾ $P(x)$) v $n/2$ bodech (proto¾e $(x_{i})^{2} = (-x_{i})^{2}$).
-Pøíklad:
-$3 + 4x + 6x^{2} + 2x^{3} + x^{4} + 10x^{5} = (3 + 6x^{2} + x^{4}) + x(4 + 2x^{2} + 10x^{4}):$
+\s{Pøíklad:}
+$3 + 4x + 6x^{2} + 2x^{3} + x^{4} + 10x^{5} = (3 + 6x^{2} + x^{4}) + x(4 + 2x^{2} + 10x^{4})$.
-Teï nám ov¹em vyvstane problém s oním párováním - druhá mocina pøece nemù¾e být záporná a tím pádem v u¾ v druhém levlu rekurze body spárované nebudou. Z tohoto dùvodu musíme pou¾ít komplexní èísla - tam druhé mocniny záporné býti mohou. Jako $x_{0} \ldots x_{n-1} $ si zvolíme n-tou komplexní odmocninu z 1. Máme n n-tých odmocnin z 1, rovnomìrnì rozesetých po jednotkové kru¾nici, búno $n=2^{k}, k \in N$ (jinak viz slajdy Martina Mare¹e). Jednotlivé odmociny vypadají takto: $1, \omega, \omega^{2} \ldots \omega^{n - 1} $, kde $\omega = e^{2 \pi i/ n}$. 2 poznámky:
+Teï nám ov¹em vyvstane problém s oním párováním -- druhá mocina pøece nemù¾e být záporná a tím pádem u¾ v~druhé úrovni rekurze body spárované nebudou. Z~tohoto dùvodu musíme pou¾ít komplexní èísla -- tam druhé mocniny záporné býti mohou. Jako $x_{0}, \ldots , x_{n-1} $ si zvolíme $n$-tou komplexní odmocninu z~jedné. Máme $n$ $n$-tých odmocnin z jednièky, rovnomìrnì rozesetých po jednotkové kru¾nici, BÚNO $n=2^{k}, k \in N$ (jinak viz slajdy Martina Mare¹e). Jednotlivé odmociny vypadají takto: $1, \omega, \omega^{2}, \ldots , \omega^{n - 1} $, kde $\omega = e^{2 \pi i/ n}$.
+
+\s{Dvì poznámky:}
\itemize\ibull
-\: n-té odmocniny z 1 jsou spárované, èili $\omega^{j} = -\omega^{n/2 + j} $
-\: umocníme-li v¹echny na druhou, vznikne nám n/2 n-pùltých odmocnin z 1, které jsou i nadále spárované
+\:$n$-té odmocniny z~jednièky jsou spárované, èili $\omega^{j} = -\omega^{n/2 + j}$,
+\:umocníme-li v¹echny na druhou, vznikne nám $n/2$ $n/2$-tých odmocnin z~jedné, které jsou i nadále spárované.
\endlist
-\s{Tak a teï koneènì ten slavný algoritmus: }
-FFT(P, $ \omega$)
-Vstup: $p_{0} \ldots p_{n-1}$ to jest vektor koeficientù polynomu P a $\omega$ co¾ je n-tá odmocina 1
-Výstup: Hodnoty polynomu v bodech $1, \omega, \omega^{2} \ldots \omega^{n - 1}$ èili èísla $P(1), P(\omega), P(\omega^{2}), \ldots P(\omega^{n - 1})$
+\ss{Tak a teï koneènì ten slavný algoritmus:}
+\>FFT($P$, $ \omega$)
+
+\>{\sl Vstup:} $p_{0}, \ldots , p_{n-1}$, koeficienty polynomu $P$, a $\omega$, $n-$tá odmocina z~jedné.
+
+\>{\sl Výstup:} Hodnoty polynomu v~bodech $1, \omega, \omega^{2}, \ldots , \omega^{n - 1}$, èili èísla $P(1), P(\omega), P(\omega^{2}),$ $\ldots , P(\omega^{n - 1})$.
+
\algo
-\: pokud n = 1, vra» $P_{0}$ a konec
-\: jinak rozdìl P na sudé a liché koeficienty a zarekurzi se FFT(S, $\omega^{2}$) a FFT(L, $\omega^{2}$)
-\: pro $j = 0 \ldots n - 1$ spoèítej: $P(\omega^{j}) = S(\omega^{2j}) + \omega^{j} * L(\omega^{2j})$
+\:Pokud $n = 1$, vra» $P_{0}$ a konec.
+\:Jinak rozdìl $P$ na sudé a liché koeficienty a zarekurzi se do FFT($S$, $\omega^{2}$) a FFT($L$, $\omega^{2}$).
+\:Pro $j = 0, \ldots , n - 1$ spoèítej: $P(\omega^{j}) = S(\omega^{2j}) + \omega^{j} \cdot L(\omega^{2j})$.
\endalgo
-\s{ Èasová slo¾itost:}
- $T(n)=2T({n \over 2} ) + O(n) \Rightarrow$ slouitost $O(n)$ ... stejnì jako MergeSort.
+\s{Èasová slo¾itost:}
+\>$T(n)=2T({n \over 2} ) + \O(n) \Rightarrow$ slo¾itost $\O(n \log n)$, stejnì jako MergeSort.
-Máme tedy algoritmus, který "pøevede" koeficienty polynomu na hodnoty tohoto polynomu v námi zadaných bodech. Ale potøebujeme také algoritmus, který doká¾e reprezentaci polynomu pomocí hodnot pøevést zpìt na koeficienty polynomu. Tedy nìjaký inverzní algoitmus.
-Definuje me si DFT algoritmus, která vyu¾ívá maticovou reprezentaci a s jeho¾ pomocí získáme hledaný algoritmus.
+Máme tedy algoritmus, který \uv{pøevede} koeficienty polynomu na hodnoty tohoto polynomu v~námi zadaných bodech. Ale potøebujeme také algoritmus, který doká¾e reprezentaci polynomu pomocí hodnot pøevést zpìt na koeficienty polynomu. Tedy nìjaký inverzní algoitmus.
+Definuje me si algoritmus DFT, která vyu¾ívá maticovou reprezentaci a s~jeho¾ pomocí získáme hledaný algoritmus.
\s{Definice:}
-
- {\sc Diskretní Fourierova transformace} $(DFT)$
-je funkce $f: { C ^n} -> { C ^n}$ , ze $y=f(x) \equiv \forall j \ y_{j} = \sum \limits ^{n-1}_{k=0} x_{k} . \omega ^{k} $
+\>{\I Diskretní Fourierova transformace} $(DFT)$
+je funkce $f: { {\bb C} ^n} \rightarrow { {\bb C} ^n}$, kde $y=f(x) \equiv \forall j \ y_{j} = \sum \limits ^{n-1}_{k=0} x_{k} . \omega ^{jk}$.
\s{Poznámka:}
+Vezmeme polynom, který má $x_{kj}$ jako koeficienty a vyhodnotíme ho v~bodì $\omega ^{j} [y_{j} = x(\omega^{j})] \Rightarrow {f}$ je linearní $\Rightarrow$ mù¾eme napsat $f(x) = \Omega_{x} ,\ \Omega _{jk} =\omega ^{jk}$, kde $\Omega$ je matice.
-Vezmeme polynom, který má $x_{kj}$ jako koeficienty a vyhodnotíme ho v bodì $\omega ^{j} [y_{j} = x(\omega^{j})] => {f}$ je linearní $=>$ mù¾eme napsat $f(x) = \Omega_{x} ,\ \Omega _{jk} =\omega ^{jk}$, kde $\Omega$ je matice
+\s{Jak najít inverzní matici?} Víme, ¾e $\Omega =\Omega ^{T}$ proto¾e $\omega ^{jk} = \omega ^{kj}$.
-\s{Jak najít inverzní matici?} Víme ¾e $\Omega =\Omega ^{T}$ protoue $\omega ^{jk} = \omega ^{kj}$ .
+\ss{Jak vypadají øádky této matice?}
+Vyu¾ijeme následující lemma, které si ale napøed doká¾eme :)
-\s{Jak vypadají øádky této matice?} Vyu¾ijeme následující lemma, které si ale napøed doká¾eme :)
+\ss{Lemma:}
-\s{Lemma:}
+\proof Souèin
+$$\Omega _{j} \Omega _{k} = \sum \limits ^{n-1}_{l=0} \Omega _{jl} \overline{\Omega _{kl}} = \sum \limits _{l} \omega ^{jl} \overline{\omega ^{kl}} = \sum \limits _{l} \omega ^{jl} \omega ^{-kl} = \sum \limits _{l} \omega ^{(j-k)l } = \sum \limits ^{n-1}_{l} (\omega^{j-k}) ^{l}, $$
-\proof souèin
-$$\Omega _{j} \Omega _{k} = \sum \limits ^{n-1}_{l=0} \Omega _{jl} \overline{\Omega _{kl}} = \sum \limits _{l} \omega ^{jl} \overline{\omega ^{kl}} = \sum \limits _{l} \omega ^{jl} \omega ^{-kl} = \sum \limits _{l} \omega ^{(j-k)l } = \sum \limits ^{n-1}_{l} (\omega^{j-k}) ^{l} $$
-Proto¾e $ \overline{\omega^{kl}} = \overline{\omega} ^{kl} = {({1 \over \omega} )}^{kl} = \omega ^{-kl}$.
+proto¾e $ \overline{\omega^{kl}} = \overline{\omega} ^{kl} = {({1 \over \omega} )}^{kl} = \omega ^{-kl}$.
\itemize\ibull
-\: Pokud $j\neq k$, pou¾ijeme vzoreèek pro souèet geometrické posloupnosti, kde $a_{1}=1$ a $q=\omega ^{(j-k) }$ a dostaneme ${{\omega^{(j-k)n} -1} \over {\omega^{(j-k)} -1}} ={1-1 \over @ -1} = {0 \over \neq 0} = 0$
+\:Pokud $j\neq k$, pou¾ijeme vzoreèek pro souèet geometrické posloupnosti, kde $a_{1}=1$ a $q=\omega ^{(j-k) }$ a dostaneme ${{\omega^{(j-k)n} -1} \over {\omega^{(j-k)} -1}} ={1-1 \over @ -1} = {0 \over \neq 0} = 0$.
-\: Pokud $j=k \sum \limits ^{n-1}_{l=0} (\omega ^{0}) ^{l} = n$.
+\:Pokud $j=k \sum \limits ^{n-1}_{l=0} (\omega ^{0}) ^{l} = n$.
\endlist
\qed
-a nyní slibované a u¾ i dokázané lemma
-
-\s{Lemma:} $\Omega _{j} . \Omega _{k} =$
+\>A nyní slibované a u¾ i dokázané lemma:
-\itemize\ibull
-\: $0$ pro $j\neq k$
-
-\: $1$ pro $j=k$
-\endlist
+\s{Lemma:} \quad $\Omega _{j} \cdot \Omega _{k} = \left\{
+{\displaystyle 0 \ldots j\neq k}\atop
+{\displaystyle 1 \ldots j=k}
+\right.$.
-\s{Dùsledek:}$$\Omega*\overline{\Omega} = nE $$
+\s{Dùsledek:} \quad $\Omega \cdot \overline{\Omega} = nE$.
-\>Jedná se o skalární souèin (jako pøedtím, èile prvek na pozici $ij$ je $0$ nebo $n$) $=>\Omega^{-1} = {1 \over n} \overline{\Omega}$
+\>Jedná se o skalární souèin (jako pøedtím, èili prvek na pozici $ij$ je $0$ nebo $n$) $\Rightarrow\Omega^{-1} = {1 \over n} \overline{\Omega}$.
-\>na¹li jsme inverzi
+\>Na¹li jsme inverzi:
-$\Omega({1 \over n} \overline{\Omega}) = {1 \over n}\Omega*\overline{\Omega} = E$
+$\Omega({1 \over n} \overline{\Omega}) = {1 \over n}\Omega \cdot \overline{\Omega} = E$, \quad
+$\Omega^{-1}_{jk} = {1 \over n}\overline{\omega^{jk}} = {1 \over n}\omega^{-jk} = {1 \over n} {(\omega^{-1})}^{jk}$, \quad
+kde $\omega^{-1}$ je $\overline{\omega}$.
-$\Omega^{-1}_{jk} = {1 \over n}\overline{\omega^{jk}} = {1 \over n}\omega^{-jk} = {1 \over n} {(\omega^{-1})}^{jk} $
-kde $\omega^{-1}$ je $\overline{\omega}$
+\>Ná¹ algoritmus poèítá tedy i inverzní transformaci, pouze místo $\omega_n$ pou¾ijeme $\overline{\omega_n}$ a vydìlíme $n$. Co¾ je skvìlé -- staèí znát pouze jeden algoritmus u~kterého staèí v~jednom pøípadì pou¾ít jinou matici a vydìlit $n$.
-
-\>Ná¹ algoritmus poèítá tedy i inverzní transformaci, akorát místo $\omega_n$ pou¾ijeme $\overline{\omega_n}$ a vydìlíme $n$. Co¾ je skvìlé - staèí znát pouze jeden algoritmus u kterého staèí v jednom pøípadì po¾ít jinou matici a vydìlit $n$!
-
-\s{Vìta:} pro $n= 2^k$ lze $DFT$ na $C^n$ spoèítat v èase $O(n \log n)$ a $DFT^{-1}$ takté¾
+\s{Vìta:} Pro $n= 2^k$ lze DFT na ${\bb C}^n$ spoèítat v~èase $\O(n \log n)$ a DFT$^{-1}$ takté¾.
\s{Dùsledek:}
-Polynomy stupnì $n$ lze násobit v èase $O(n \log n)$.
-
-$O(n \log n)$ pro vyhodnocení, $O(n)$ pro vynásobení a $O(n \log n)$ pro pøevedení zpìt
+\>Polynomy stupnì $n$ lze násobit v èase $\O(n \log n)$:
+$\O(n \log n)$ pro vyhodnocení, $\O(n)$ pro vynásobení a $\O(n \log n)$ pro pøevedení zpìt.
\s{Pou¾ití:}
\itemize\ibull
-\: zpracování signálu - rozklad na $\sin$ a $\cos$ o rùzných frekvencích $=>$ spektrální rozklad
-\: JPEG
-\: násobení dlouhých èísel v èase $O(n \log n)$
+\:Zpracování signálu -- rozklad na siny a cosiny o~rùzných frekvencích $\Rightarrow$ spektrální rozklad.
+\:JPEG.
+\:Násobení dlouhých èísel v èase $\O(n \log n)$.
\endlist
\figure{img.eps}{Pøíklad prùbìhu algoritmu na vstupu velikosti 8}{3in}
-Je to schéma zapojení kombinaèního obvodu (tzv. "motýlek")
+\>To je schéma zapojení kombinaèního obvodu (tzv. \uv{motýlek}).
\s{Z toho:}
\itemize\ibull
-\: kombinaèní obvod pro DFT
- s $O(\log n)$ hladinami
- a $O(n)$ hradly na hladinì
-\: nerekurzivní algoritmus (postupujeme z leva) v èase $O(n \log n)$
-
-èísla vstupu jsou èísla v binárním tvaru 0-7 pøeètená pozpátku
+\:Kombinaèní obvod pro DFT
+ s~$\O(\log n)$ hladinami
+ a $\O(n)$ hradly na hladinì.
+\:Nerekurzivní algoritmus (postupujeme zleva) v~èase $\O(n \log n)$.
+ Èísla vstupu jsou èísla v~binárním tvaru pøeètená pozpátku.
\endlist