From: Martin Mares Date: Thu, 27 Jan 2011 23:33:20 +0000 (+0100) Subject: APSP: Prepsana cast o regularnich vyrazech a nasobeni matic X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=cee26f1e4732079cb1b3353e3b840f8c3eb0f33b;p=ga.git APSP: Prepsana cast o regularnich vyrazech a nasobeni matic Nyni je snad znaceni o neco prehlednejsi. --- diff --git a/14-floyd/14-floyd.tex b/14-floyd/14-floyd.tex index af0a867..d61913d 100644 --- a/14-floyd/14-floyd.tex +++ b/14-floyd/14-floyd.tex @@ -1,7 +1,5 @@ \input ../sgr.tex -\def\alt{\mathop{\vert}} - \prednaska{13}{Nejkrat¹í cesty: Maticové metody}{} V~pøedchozí kapitole jsme se zabývali algoritmy pro hledání nejkrat¹ích @@ -72,38 +70,43 @@ dvojic z~teorie automatù. Zadaný orientovaný graf pøitom mù¾e obsahovat i smyèky a násobné hrany. -\s{Definice:} {\I Sledový regulární výraz} pro vrcholy $u$ a~$v$ (zkrácenì -{\I $uv$-výraz}) kóduje mno¾inu sledù z~vrcholu~$u$ do vrcholu~$v$. Mno¾inu -kódovanou výrazem~$\psi$ budeme znaèit $S(\psi)$. Ka¾dý $uv$-výraz má jeden -z~tìchto tvarù: +\s{Definice:} {\I Svazek} je mno¾ina sledù, které mají spoleèný poèáteèní +a koncový vrchol. {\I Typem} svazku nazveme uspoøádanou dvojici tìchto vrcholù. +Místo \uv{svazek typu $(u,v)$} budeme obvykle øíkat prostì {\I $uv$-svazek.} -\itemize\ibull -\:$\emptyset$ -- prázdná mno¾ina sledù, -\:$e$ -- identifikátor nìkteré hrany z~$u$ do~$v$, -\:$\alpha\alt\beta$ (kde $\alpha$ i $\beta$ jsou $uv$-výrazy) -- -{\I sjednocení:} $S(\alpha\alt\beta) = S(\alpha) \cup S(\beta)$, -\:$\alpha\beta$ (kde $\alpha$ je $uw$-výraz a $\beta$ je $wv$-výraz pro nìjaké~$w$) -- -{\I zøetìzení:} $S(\alpha\beta)$ je mno¾ina v¹ech sledù, které vzniknou -napojením nìjakého sledu z~$S(\beta)$ za nìjaký sled z~$S(\alpha)$, -\endlist +Triviálními pøípady svazkù jsou prázdná mno¾ina~$\emptyset$, hrana~$uv$ a pro +$u=v$ také sled~$\varepsilon$ nulové délky. Svazky mù¾eme kombinovat +následujícími operacemi: -\>Pokud $u=v$, pak navíc: \itemize\ibull -\:$\varepsilon$ -- mno¾ina obsahující pouze sled nulové délky, -\:$\alpha^*$ (kde $\alpha$ je $uu$-výraz) -- {\I iterace:} -$\alpha^* = \varepsilon \alt \alpha \alt \alpha\alpha \alt \alpha\alpha\alpha \alt \ldots$ +\:$A\cup B$ -- {\I sjednocení} dvou svazkù tého¾ typu, +\:$AB$ nebo $A\cdot B$ -- {\I zøetìzení} $uv$-svazku~$A$ s~$vw$-svazkem~$B$: výsledkem je $uw$-svazek +obsahující v¹echna spojení sledu z~$A$ se sledem z~$B$, +\:$A^*$ -- {\I iterace} $uu$-svazku: výsledkem je $uu$-svazek +$\varepsilon \cup A \cup AA \cup AAA \cup \ldots$ (tedy v¹echna mo¾ná +spojení koneènì mnoha sledù z~$A$). \endlist -\>Operace sjednocení a zøetìzení jsou asociativní, tak¾e je obvykle nebudeme -závorkovat; operace sjednocení má ve~výrazech ni¾¹í prioritu ne¾ zøetìzení. -Pro ka¾dou dvojici vrcholù $i$,~$j$ nyní budeme hledat výraz $R_{ij}$ popisující -v¹echny sledy z~$i$ do~$j$. Podobnì jako u~Floydova-Warshallova algoritmu zavedeme -$R^k_{ij}$ coby výraz popisující sledy z~$i$ do~$j$ pøes 1 a¾~$k$ a nahlédneme, -¾e platí: +\>Ve~výrazu definujícím~$A^*$ jsme vyu¾ili, ¾e operace sjednocení a zøetìzení +jsou asociativní, tak¾e je nemusíme závorkovat. Navíc sjednocení má ve~výrazech +ni¾¹í prioritu ne¾ zøetìzení. + +\>Svazky budeme obvykle reprezentovat {\I sledovými výrazy,} co¾ jsou +výrazy koneèné délky sestávající se z~triviálních svazkù a vý¹e uvedených +operací. + +\s{Pozorování:} Sledy mù¾eme reprezentovat øetìzci nad abecedou, její¾ +symboly jsou identifikátory hran. Sledové výrazy pak odpovídají regulárním +výrazùm nad touto abecedou. + +Uká¾eme, jak pro v¹echny dvojice vrcholu $i,j$ sestrojit sledový výraz $R_{ij}$ +popisující svazek v¹ech sledù z~$i$ do~$j$. Podobnì jako u~Floydova-Warshallova +algoritmu zavedeme $R^k_{ij}$ coby výraz popisující sledy z~$i$ do~$j$ pøes 1 a¾~$k$ +a nahlédneme, ¾e platí: $$\eqalign{ R^0_{ij} &= \hbox{mno¾ina v¹ech hran z~$i$ do~$j$}, \cr R^n_{ij} &= \hbox{hledané $R_{ij}$}, \cr -R^k_{ij} &= R^{k-1}_{ij} \alt R^{k-1}_{ik}(R^{k-1}_{kk})^*R^{k-1}_{kj}. \cr +R^k_{ij} &= R^{k-1}_{ij} \cup R^{k-1}_{ik}(R^{k-1}_{kk})^*R^{k-1}_{kj}. \cr }$$ První dvì rovnosti opìt dostaneme pøímo z~definice (mno¾inu v¹ech hran zapí¹eme buï jako prázdnou nebo ji vytvoøíme sjednocováním z~jednoprvkových mno¾in). Tøetí @@ -122,10 +125,19 @@ M výrazy, staèí umìt vyhodnotit: \itemize\ibull \:výsledek pro triviální výrazy $f(\emptyset)$, $f(\varepsilon)$ a $f(e)$ pro hranu~$e$, -\:hodnoty $f(\alpha\alt\beta)$, $f(\alpha\beta)$ a $f(\alpha^*)$, známe-li ji¾ $f(\alpha)$ a $f(\beta)$. +\:hodnoty $f(\alpha\cup\beta)$, $f(\alpha\beta)$ a $f(\alpha^*)$, známe-li ji¾ $f(\alpha)$ a $f(\beta)$. \endlist \>Pro výpoèet v¹ech $f(R_{ij})$ nám pak staèí $\Theta(n^3)$ vyhodnocení funkce~$f$. +\s{Poznámka pro ctitele algebry:} Vý¹e uvedená konstrukce není nic jiného, ne¾ popis +homomorfismu~$f$ z~algebry $({\cal S},\emptyset,\varepsilon_1,\ldots,\varepsilon_n, +e_1,\ldots,e_m,\cup,\cdot,{}^*)$ nad mno¾inou~${\cal S}$ v¹ech svazkù do~nìjaké +algebry $(X,{\bf 0},c_1,\ldots,c_n,h_1,\ldots,h_m,\oplus,\otimes,\circledast)$, kde~$X$ je mno¾ina +v¹ech ohodnocení sledù, {\bf 0}, $c_1,\ldots,c_n$ a $h_1,\ldots,h_m$ jsou konstanty, +$\oplus$ a~$\otimes$ binární operace a $\circledast$ unární operace. Prùbìh výpoètu +upraveného algoritmu je pak homomorfním obrazem prùbìhu výpoètu pùvodního algoritmu +pracujícího pøímo se svazky. + \s{Pøíklady:} \>{\I Nejkrat¹í sled:} @@ -133,7 +145,7 @@ $$\eqalign{ f(\emptyset)&=+\infty \cr f(\varepsilon)&=0 \cr f(e)&=\ell(e) \hbox{\quad (délka hrany)} \cr -f(\alpha\alt\beta) &= \min(f(\alpha),f(\beta)) \cr +f(\alpha\cup\beta) &= \min(f(\alpha),f(\beta)) \cr f(\alpha\beta) &= f(\alpha) + f(\beta) \cr f(\alpha^*) &= \cases{0 & \hbox{pro $f(\alpha)\ge 0$} \cr -\infty & \hbox{pro $f(\alpha)<0$} \cr} \cr }$$ @@ -145,16 +157,16 @@ $$\eqalign{ f(\emptyset)&=0 \cr f(\varepsilon)&=\infty \cr f(e)&=w(e) \hbox{\quad (¹íøka hrany)} \cr -f(\alpha\alt\beta) &= \max(f(\alpha),f(\beta)) \cr +f(\alpha\cup\beta) &= \max(f(\alpha),f(\beta)) \cr f(\alpha\beta) &= \min(f(\alpha),f(\beta)) \cr f(\alpha^*) &= \infty \cr }$$ \>{\I Pøevod koneèného automatu na regulární výraz:} Vrcholy multigrafu budou odpovídat stavùm automatu, hrany mo¾ným pøechodùm mezi stavy. Ka¾dou hranu ohodnotíme symbolem -abecedy, po jeho¾ pøeètení automat pøechod provede. Funkce~$f$ pak pøiøadí $uv$-výrazu~$\psi$ +abecedy, po jeho¾ pøeètení automat pøechod provede. Funkce~$f$ pak pøiøadí $uv$-svazku~$\psi$ regulární výraz popisující mno¾inu v¹ech øetìzcù, po jejich¾ pøeètení automat pøejde -ze~stavu~$u$ do stavu~$v$ po pøechodech z~mno¾iny $S(\psi)$. Vyhodnocování funkce~$f$ +ze~stavu~$u$ do stavu~$v$ po pøechodech z~mno¾iny~$\psi$. Vyhodnocování funkce~$f$ odpovídá pøímoèarým operacím s~øetìzci. \h{Násobení matic} @@ -191,28 +203,22 @@ C_{ij} = \bigoplus_{k=1}^n A_{ik}\otimes B_{kj}. $$ Klasické násobení matic je tedy $(+,\cdot)$-souèin. -Uva¾ujme nyní podobnì jako v~pøedchozí sekci nìjakou funkci~$f$, která pøiøazuje -mno¾inám sledù nìjaké hodnoty. Nech» $\oplus$ a $\otimes$ jsou operace, -pro nì¾ platí $f(\alpha\alt\beta) = f(\alpha) \oplus f(\beta)$ -a $f(\alpha\beta) = f(\alpha) \otimes f(\beta)$. +\s{Pozorování:} Pokud $A$ a~$B$ jsou matice svazkù ($A_{ij}$ a $B_{ij}$ +jsou $ij$-svazky) a $C$ jejich $(\cup,\cdot)$-souèin, pak $C_{ij}$ je +svazek v¹ech sledù vzniklých spojením nìjakého sledu z~$A$ zaèínajícího +v~$i$ a nìjakého sledu z~$B$ konèícího v~$j$. -Mìjme nyní pro ka¾dé $i,j$ nìjakou mno¾inu $\alpha_{ij}$ sledù z~$i$ do~$j$ -a matici~$A$ takovou, ¾e $A_{ij} = f(\alpha_{ij})$. Podobnì mìjme mno¾iny $\beta_{ij}$ -a pøíslu¹nou matici~$B$. Potom $(\oplus,\otimes)$-souèin matic $A$ a~$B$ je nìjaká -matice~$C$, pro ní¾ platí: -$$ -C_{ij} = f(\alpha_{i1}\beta_{1j} \alt \alpha_{i2}\beta_{2j} \alt \ldots \alt \alpha_{in}\beta_{nj}). -$$ -Jinými slovy, matice~$C$ popisuje ohodnocení v¹ech sledù, které vznikly spojením -sledu z~$\alpha$ se sledem z~$\beta$. +Podobnì jako v~pøedchozí sekci si tedy mù¾eme poøídit funkci~$f$ pøiøazující +svazkùm hodnoty z~nìjaké mno¾iny~$X$ a operace $\oplus$ a $\otimes$ na~$X$, +pro nì¾ platí $f(\alpha\cup\beta) = f(\alpha) \oplus f(\beta)$ a $f(\alpha\beta) += f(\alpha) \otimes f(\beta)$. Pak staèí vzít matici popisující ohodnocení +v¹ech sledù délky 0 nebo~1 (to je obdoba matice sousednosti), a provést $\O(\log n)$ +$(\oplus,\otimes)$-souèinù k~tomu, abychom znali ohodnocení svazkù sledù délky +právì~$k$ pro nìjaké $k\ge n$. -Pokud tedy zaèneme maticí popisující sledy délky 0 nebo~1 (to je obdoba matice sousednosti), -staèí $\O(\log n)$ $(\oplus,\otimes)$-souèinù k~tomu, abychom znali ohodnocení v¹ech -sledù délky právì~$k$ pro nìjaké $k\ge n$. - -S~$(\lor,\land)$-souèiny a maticí sousednosti získáme algoritmus pro výpoèet dosa¾itelnosti -(ka¾dý souèin pøitom mù¾eme provést jako násobení matic následované pøepsáním nenul na -jednièky). +S~$(\lor,\land)$-souèiny a maticí sousednosti s~jednièkami na diagonále získáme +algoritmus pro výpoèet dosa¾itelnosti (ka¾dý souèin pøitom mù¾eme provést jako +násobení matic následované pøepsáním nenul na jednièky). Podobnì mù¾eme poèítat i matici vzdáleností: zaèneme s~maticí délek hran doplnìnou o~nuly na~diagonále a pou¾ijeme $(\min,+)$-souèiny. Tyto souèiny ale bohu¾el neumíme pøevést na klasické násobení matic. @@ -227,8 +233,6 @@ Dodejme je celou øadu dal¹ích trikù. Zájemce o~tento druh algoritmù odkazujeme na Zwickùv èlánek~\cite{zwick:apspint}. -%% FIXME: Indexovat matice mno¾inami, ne èísly - \h{Seidelùv algoritmus} \h{Rozdìl a panuj} diff --git a/sgr.tex b/sgr.tex index 2a31665..af3d3cf 100644 --- a/sgr.tex +++ b/sgr.tex @@ -3,6 +3,7 @@ \input mjmac.tex \input epsf.tex \input btxmac.tex +\input amssym.tex \language=\czech \chyph