From: Martin Mares Date: Sat, 29 Dec 2007 14:10:45 +0000 (+0100) Subject: Korektury vsech kapitol od Bohumira Zamecnika. Diky moc! X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=6935403607728a64c5b6ca3b3de348705e0aa3b6;p=ads2.git Korektury vsech kapitol od Bohumira Zamecnika. Diky moc! --- diff --git a/1-hradla/1-hradla.tex b/1-hradla/1-hradla.tex index e1ecbae..7c79e04 100644 --- a/1-hradla/1-hradla.tex +++ b/1-hradla/1-hradla.tex @@ -101,33 +101,33 @@ M 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. @@ -137,31 +137,31 @@ D \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. diff --git a/10-prevody/10-prevody.tex b/10-prevody/10-prevody.tex index d09827b..286c100 100644 --- a/10-prevody/10-prevody.tex +++ b/10-prevody/10-prevody.tex @@ -2,144 +2,160 @@ \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á: @@ -150,8 +166,9 @@ $$ (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 diff --git a/12-apx/12-apx.tex b/12-apx/12-apx.tex index f3739aa..2635b3d 100644 --- a/12-apx/12-apx.tex +++ b/12-apx/12-apx.tex @@ -22,7 +22,7 @@ podmno 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: $$ @@ -47,9 +47,9 @@ Takov \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} diff --git a/2-toky/2-toky.tex b/2-toky/2-toky.tex index af29d1d..4b375d2 100644 --- a/2-toky/2-toky.tex +++ b/2-toky/2-toky.tex @@ -5,7 +5,7 @@ \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}^{+}$. @@ -14,7 +14,7 @@ \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\}.$$ @@ -22,28 +22,28 @@ \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ù. @@ -77,7 +77,7 @@ $$w(f)=f(A,V\setminus A)-f(V\setminus A,A)\le f(A,V\setminus A)\le c(A,V\setminu \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á. @@ -89,15 +89,15 @@ $$\exists\ e \in P\left\{{f(e)=c(e)\dots \hbox{orientovan \>\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í: @@ -110,22 +110,22 @@ V \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 diff --git a/3-dinic/3-dinic.tex b/3-dinic/3-dinic.tex index 74b589c..1621602 100644 --- a/3-dinic/3-dinic.tex +++ b/3-dinic/3-dinic.tex @@ -2,19 +2,19 @@ \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: @@ -22,16 +22,16 @@ S \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: @@ -45,30 +45,30 @@ $$+\underbrace{\sum\limits_{uv\in E}g(uv)-g(\overleftarrow{uv})-\sum\limits_{vu\ 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)$. @@ -86,14 +86,14 @@ blokuj \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. @@ -103,10 +103,10 @@ Dok 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 @@ -125,10 +125,10 @@ minim 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 diff --git a/4-goldberg/4-goldberg.tex b/4-goldberg/4-goldberg.tex index 3dcdfac..6d22bba 100644 --- a/4-goldberg/4-goldberg.tex +++ b/4-goldberg/4-goldberg.tex @@ -10,10 +10,10 @@ J. Z 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$. @@ -26,10 +26,10 @@ D \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: @@ -37,17 +37,18 @@ Pokud plat \:$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). @@ -63,22 +64,22 @@ Nyn \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 @@ -89,23 +90,23 @@ M 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)$. Proto, abychom tuto hranu opìt nasytili, musíme opìt zmìnit nerovnost vý¹ek na~$h(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)$. @@ -136,10 +138,10 @@ Budeme si pamatovat seznam $P$ v 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 diff --git a/5-sortnet/5-sortnet.tex b/5-sortnet/5-sortnet.tex index fb047a1..5a6d994 100644 --- a/5-sortnet/5-sortnet.tex +++ b/5-sortnet/5-sortnet.tex @@ -16,12 +16,12 @@ p $\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$. @@ -29,7 +29,7 @@ Odhadneme po 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í, @@ -53,7 +53,7 @@ provede maxim 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 @@ -61,16 +61,16 @@ nebo men 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$. @@ -88,15 +88,15 @@ $\O(N^2\sqrt M)$. \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} @@ -106,22 +106,22 @@ rozm $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} @@ -129,12 +129,12 @@ maximum $i+1$-n $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 @@ -166,7 +166,7 @@ bitoni \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}} @@ -177,7 +177,7 @@ $\log N$ hladin s~${\O}(N\log N)$ hradly. 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. @@ -187,7 +187,7 @@ Z~bitonick 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ý. diff --git a/6-kmp/6-kmp.tex b/6-kmp/6-kmp.tex index 23d9f4f..5304176 100644 --- a/6-kmp/6-kmp.tex +++ b/6-kmp/6-kmp.tex @@ -6,7 +6,7 @@ \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. @@ -26,24 +26,25 @@ znakem vzorov \: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 @@ -52,74 +53,75 @@ znakem vzorov \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 diff --git a/7-ac/7-ac.tex b/7-ac/7-ac.tex index 09fe571..d377c31 100644 --- a/7-ac/7-ac.tex +++ b/7-ac/7-ac.tex @@ -6,120 +6,121 @@ Na minul \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{\($s$)} = index slova $\iota$, které konèí ve stavu $s$, nebo $\emptyset$ \par -\s{\($s$)} = nejbli¾¹í vrchol, do kterého se lze z $s$ dostat po zpìtných hranách a \ $\ne 0$ (konèí tam slovo) +\:$\(s) =$ index slova $\iota$, které konèí ve stavu $s$, nebo $\emptyset$, \par +$\(s) =$ nejbli¾¹í vrchol, do kterého se lze z $s$ dostat po zpìtných hranách a $\(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$ \ ($s$ je aktuální stav vyhledávacího automatu). +\:$s \leftarrow \$ ($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 \ $\ne 0 \Rightarrow$ \. +\::Je-li $\(s) \ne 0 \Rightarrow$ vypí¹eme $\(s)$. \::$v \leftarrow out(s)$. \::Dokud $v \ne 0 $: -\:::Vypi¹ \. -\:::$v \leftarrow$ \. +\:::Vypí¹eme $\(v)$. +\:::$v \leftarrow \(v)$. \endalgo -\s{\}:= jeden \ ve vyhledávacím automatu +\>$\(s,c) :=$ jeden krok ve vyhledávacím automatu: \algo -\:Dokud $\not\exists f(s,c) \wedge s \ne$ koøen: $s \leftarrow$ \. -\:Pokud $\exists f(s,c)$: $s \leftarrow$ \. +\:Dokud $\neg \exists f(s,c) \wedge s \ne$ koøen: $s \leftarrow \(s)$. +\:Pokud $\exists f(s,c)$: $s \leftarrow \(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$ \, 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 $(\,\) \rightarrow \(\,\)$, 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$(\), 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(\)$, 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 \($\ast$). +\:Spoèteme $\(\ast)$ (spoèteme funkci \ 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(\beta) = \alpha(\beta[1:])$ -- v¹echny zpìtné hrany vedou do vy¹¹ích hladin +\:$z(v) = \(z(u),c)$ \endlist -\figure{Graphic100.eps}{\}{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}{$\(v) = \(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$ \($z(u)$, znak na hranì \). +\:::$R \leftarrow \(z(u)$, znak na hranì \). \:::$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 + \)$$ +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 + \).$$ \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 diff --git a/8-fft/8-fft.tex b/8-fft/8-fft.tex index 2b9da46..55aac08 100644 --- a/8-fft/8-fft.tex +++ b/8-fft/8-fft.tex @@ -1,165 +1,161 @@ \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