]> mj.ucw.cz Git - ga.git/blob - 14-floyd/14-floyd.tex
d61913dc581f3db951a79ac50a5e96a692644f91
[ga.git] / 14-floyd / 14-floyd.tex
1 \input ../sgr.tex
2
3 \prednaska{13}{Nejkrat¹í cesty: Maticové metody}{}
4
5 V~pøedchozí kapitole jsme se zabývali algoritmy pro hledání nejkrat¹ích
6 cest z~daného poèáteèního vrcholu. Nyní se zamìøíme na výpoèet celé
7 metriky grafu, tedy matice vzdáleností, která pro ka¾dou dvojici vrcholù
8 obsahuje délku nejkrat¹í cesty mezi nimi.
9
10 Jeden zpùsob se ihned nabízí: postupnì spustit Dijkstrùv algoritmus pro v¹echny
11 mo¾né volby poèáteèního vrcholu, pøípadnì se pøed tím je¹tì pomocí potenciálù
12 zbavit záporných hran. Tak dosáhneme èasové slo¾itosti $\O(mn + n^2\log n)$,
13 co¾ je pro øídké grafy nejlep¹í známý výsledek -- jen $\O(\log n)$-krát
14 pomalej¹í, ne¾ je velikost výstupu.
15
16 Pro husté grafy obvykle pracují rychleji algoritmy zalo¾ené na maticích a zejména
17 na jejich násobení. Nìkolik takových si nyní pøedvedeme. Vrcholy grafu budou
18 v¾dy oèíslované èísly 1 a¾~$n$ a graf doplníme na úplný, pøièem¾ hrany, které
19 pùvodnì neexistovaly, obdr¾í délku $+\infty$.
20
21 \h{Floydùv-Warshallùv algoritmus}
22
23 Zaènìme algoritmem, který nezávisle na sobì objevili Floyd a Warshall.
24 Funguje pro libovolný orientovaný graf bez záporných cyklù.
25
26 Oznaème $D^k_{ij}$ délku nejkrat¹í cesty z~vrcholu~$i$ do vrcholu~$j$ pøes
27 vrcholy 1 a¾~$k$ (tím myslíme, ¾e v¹echny vnitøní vrcholy cesty le¾í v~mno¾inì $\{1,\ldots,k\}$).
28 Jako obvykle polo¾íme $D^k_{ij}=+\infty$, pokud ¾ádná taková cesta neexistuje.
29 Pak platí:
30 $$\eqalign{
31 D^0_{ij} &= \hbox{délka hrany $ij$,} \cr
32 D^n_{ij} &= \hbox{vzdálenost z~$i$ do~$j$,} \cr
33 D^k_{ij} &= \min( D^{k-1}_ij, D^{k-1}_{ik} + D^{k-1}_{kj} ). \cr
34 }$$
35 První dvì rovnosti dostaneme pøímo z~definice. Tøetí rovnost dostaneme rozdìlením
36 cest z~$i$ do~$j$ pøes 1 a¾~$k$ na ty, které se vrcholu~$k$ vyhnou (a~jsou tedy
37 cestami pøes 1 a¾~$k-1$), a ty, které ho pou¾ijí -- ka¾dou takovou mù¾eme slo¾it
38 z~cesty z~$i$ do~$k$ a cesty z~$k$ do~$j$, obojí pøes 1 a¾~$k-1$.
39
40 Zbývá vyøe¹it jednu malièkost: slo¾ením cesty z~$i$ do~$k$ s~cestou z~$k$ do~$j$
41 nemusí nutnì vzniknout cesta, proto¾e se nìjaký vrchol mù¾e opakovat. V~grafech
42 bez záporných cyklù nicménì takový sled nemù¾e být krat¹í ne¾ nejkrat¹í cesta,
43 tak¾e tím fale¹né øe¹ení nevyrobíme. (Pøesnìji: ze sledu $i\alpha v\beta k\gamma v\delta j$,
44 kde $v\not\in\beta,\gamma$, mù¾eme vypu¹tìním èásti $v\beta k\gamma v$ nezáporné
45 délky získat sled z~$i$ do~$j$ pøes 1 a¾~$k-1$, jeho¾ délka nemù¾e být men¹í
46 ne¾~$D^{k-1}{ij}$.)
47
48 Samotný algoritmus pak postupnì poèítá matice $D^0, D^1, \ldots, D^n$:
49
50 \algo
51 \:$D^0 \leftarrow \hbox{matice délek hran}$
52 \:Pro $k=1,\ldots,n$:
53 \::Pro $i,j=1,\ldots,n$:
54 \:::$D^k_{ij} = \min( D^{k-1}_ij, D^{k-1}_{ik} + D^{k-1}_{kj} )$.
55 \:$\hbox{Matice vzdáleností} \leftarrow D^n.$
56 \endalgo
57
58 Èasová slo¾itost tohoto algoritmu èiní $\Theta(n^3)$. Kubickou prostorovou
59 slo¾itost mù¾eme snadno sní¾it na~kvadratickou: Buï si uvìdomíme, ¾e v~ka¾dém
60 okam¾iku potøebujeme jen aktuální matici~$D^k$ a pøedchozí~$D^{k-1}$. Anebo
61 nahlédneme, ¾e mù¾eme $D^{k-1}$ na~$D^k$ pøepisovat na místì. U~hodnot $D_{ik}$
62 a~$D_{kj}$ je toti¾ podle definice stará i nová hodnota stejná. Algoritmu tedy
63 staèí $\Theta(n^2)$ pamìti.
64
65 \h{Regulární výrazy}
66
67 Pøedchozí algoritmus lze zajímavì zobecnit, toti¾ tak, aby pro ka¾dou dvojici
68 vrcholù sestrojil vhodnou reprezentaci mno¾iny v¹ech sledù vedoucích mezi touto
69 dvojicí. Tato reprezentace bude velice podobná regulárním výrazùm známým
70 z~teorie automatù. Zadaný orientovaný graf pøitom mù¾e obsahovat i smyèky
71 a násobné hrany.
72
73 \s{Definice:} {\I Svazek} je mno¾ina sledù, které mají spoleèný poèáteèní
74 a koncový vrchol. {\I Typem} svazku nazveme uspoøádanou dvojici tìchto vrcholù.
75 Místo \uv{svazek typu $(u,v)$} budeme obvykle øíkat prostì {\I $uv$-svazek.}
76
77 Triviálními pøípady svazkù jsou prázdná mno¾ina~$\emptyset$, hrana~$uv$ a pro
78 $u=v$ také sled~$\varepsilon$ nulové délky. Svazky mù¾eme kombinovat
79 následujícími operacemi:
80
81 \itemize\ibull
82 \:$A\cup B$ -- {\I sjednocení} dvou svazkù tého¾ typu,
83 \:$AB$ nebo $A\cdot B$ -- {\I zøetìzení} $uv$-svazku~$A$ s~$vw$-svazkem~$B$: výsledkem je $uw$-svazek
84 obsahující v¹echna spojení sledu z~$A$ se sledem z~$B$,
85 \:$A^*$ -- {\I iterace} $uu$-svazku: výsledkem je $uu$-svazek
86 $\varepsilon \cup A \cup AA \cup AAA \cup \ldots$ (tedy v¹echna mo¾ná
87 spojení koneènì mnoha sledù z~$A$).
88 \endlist
89
90 \>Ve~výrazu definujícím~$A^*$ jsme vyu¾ili, ¾e operace sjednocení a zøetìzení
91 jsou asociativní, tak¾e je nemusíme závorkovat. Navíc sjednocení má ve~výrazech
92 ni¾¹í prioritu ne¾ zøetìzení.
93
94 \>Svazky budeme obvykle reprezentovat {\I sledovými výrazy,} co¾ jsou
95 výrazy koneèné délky sestávající se z~triviálních svazkù a vý¹e uvedených
96 operací.
97
98 \s{Pozorování:} Sledy mù¾eme reprezentovat øetìzci nad abecedou, její¾
99 symboly jsou identifikátory hran. Sledové výrazy pak odpovídají regulárním
100 výrazùm nad touto abecedou.
101
102 Uká¾eme, jak pro v¹echny dvojice vrcholu $i,j$ sestrojit sledový výraz $R_{ij}$
103 popisující svazek v¹ech sledù z~$i$ do~$j$. Podobnì jako u~Floydova-Warshallova
104 algoritmu zavedeme $R^k_{ij}$ coby výraz popisující sledy z~$i$ do~$j$ pøes 1 a¾~$k$
105 a nahlédneme, ¾e platí:
106 $$\eqalign{
107 R^0_{ij} &= \hbox{mno¾ina v¹ech hran z~$i$ do~$j$}, \cr
108 R^n_{ij} &= \hbox{hledané $R_{ij}$}, \cr
109 R^k_{ij} &= R^{k-1}_{ij} \cup R^{k-1}_{ik}(R^{k-1}_{kk})^*R^{k-1}_{kj}. \cr
110 }$$
111 První dvì rovnosti opìt dostaneme pøímo z~definice (mno¾inu v¹ech hran zapí¹eme
112 buï jako prázdnou nebo ji vytvoøíme sjednocováním z~jednoprvkových mno¾in). Tøetí
113 rovnost vychází z~toho, ¾e ka¾dý sled z~$i$ do~$j$ buï neobsahuje~$k$, nebo ho
114 mù¾eme rozdìlit na~èásti mezi jednotlivými náv¹tìvami vrcholu~$k$.
115
116 Algoritmus tedy bude postupnì budovat matice $R^0, R^1, \ldots, R^n$ podle tìchto
117 pravidel. Provedeme pøi tom $\Theta(n^3)$ operací, ov¹em s~výrazy, jejich¾ délka
118 mù¾e být a¾ øádovì~$4^n$. Radìji ne¾ jako øetìzce je budeme ukládat v~podobì
119 acyklických orientovaných grafù: vrcholy budou operace, hrany je budou pøipojovat
120 k~operandùm.
121
122 K~pøímému pou¾ití se takový exponenciálnì dlouhý výraz hodí málokdy, ale mù¾e
123 nám pomoci odpovídat na rùzné otázky týkající se sledù s~danými koncovými vrcholy.
124 Máme-li nìjakou funkci~$f$ pøiøazující hodnoty mno¾inám sledù kódovaným sledovými
125 výrazy, staèí umìt vyhodnotit:
126 \itemize\ibull
127 \:výsledek pro triviální výrazy $f(\emptyset)$, $f(\varepsilon)$ a $f(e)$ pro hranu~$e$,
128 \:hodnoty $f(\alpha\cup\beta)$, $f(\alpha\beta)$ a $f(\alpha^*)$, známe-li ji¾ $f(\alpha)$ a $f(\beta)$.
129 \endlist
130 \>Pro výpoèet v¹ech $f(R_{ij})$ nám pak staèí $\Theta(n^3)$ vyhodnocení funkce~$f$.
131
132 \s{Poznámka pro ctitele algebry:} Vý¹e uvedená konstrukce není nic jiného, ne¾ popis
133 homomorfismu~$f$ z~algebry $({\cal S},\emptyset,\varepsilon_1,\ldots,\varepsilon_n,
134 e_1,\ldots,e_m,\cup,\cdot,{}^*)$ nad mno¾inou~${\cal S}$ v¹ech svazkù do~nìjaké
135 algebry $(X,{\bf 0},c_1,\ldots,c_n,h_1,\ldots,h_m,\oplus,\otimes,\circledast)$, kde~$X$ je mno¾ina
136 v¹ech ohodnocení sledù, {\bf 0}, $c_1,\ldots,c_n$ a $h_1,\ldots,h_m$ jsou konstanty,
137 $\oplus$ a~$\otimes$ binární operace a $\circledast$ unární operace. Prùbìh výpoètu
138 upraveného algoritmu je pak homomorfním obrazem prùbìhu výpoètu pùvodního algoritmu
139 pracujícího pøímo se svazky.
140
141 \s{Pøíklady:}
142
143 \>{\I Nejkrat¹í sled:}
144 $$\eqalign{
145 f(\emptyset)&=+\infty \cr
146 f(\varepsilon)&=0 \cr
147 f(e)&=\ell(e) \hbox{\quad (délka hrany)} \cr
148 f(\alpha\cup\beta) &= \min(f(\alpha),f(\beta)) \cr
149 f(\alpha\beta) &= f(\alpha) + f(\beta) \cr
150 f(\alpha^*) &= \cases{0 & \hbox{pro $f(\alpha)\ge 0$} \cr -\infty & \hbox{pro $f(\alpha)<0$} \cr} \cr
151 }$$
152 (Pokud pøedpokládáme, ¾e v~grafu nejsou záporné cykly, je $f(\alpha^*)$ v¾dy nulové
153 a dostaneme pøesnì Floydùv-Warshallùv algoritmus.)
154
155 \>{\I Nej¹ir¹í cesta} (hranám jsou pøiøazeny ¹íøky, ¹íøka cesty je minimum z~¹íøek hran):
156 $$\eqalign{
157 f(\emptyset)&=0 \cr
158 f(\varepsilon)&=\infty \cr
159 f(e)&=w(e) \hbox{\quad (¹íøka hrany)} \cr
160 f(\alpha\cup\beta) &= \max(f(\alpha),f(\beta)) \cr
161 f(\alpha\beta) &= \min(f(\alpha),f(\beta)) \cr
162 f(\alpha^*) &= \infty \cr
163 }$$
164
165 \>{\I Pøevod koneèného automatu na regulární výraz:} Vrcholy multigrafu budou odpovídat
166 stavùm automatu, hrany mo¾ným pøechodùm mezi stavy. Ka¾dou hranu ohodnotíme symbolem
167 abecedy, po jeho¾ pøeètení automat pøechod provede. Funkce~$f$ pak pøiøadí $uv$-svazku~$\psi$
168 regulární výraz popisující mno¾inu v¹ech øetìzcù, po jejich¾ pøeètení automat pøejde
169 ze~stavu~$u$ do stavu~$v$ po pøechodech z~mno¾iny~$\psi$. Vyhodnocování funkce~$f$
170 odpovídá pøímoèarým operacím s~øetìzci.
171
172 \h{Násobení matic}
173
174 Øe¹íme-li grafové problémy pomocí matic, nabízí se pou¾ít známé subkubické algoritmy
175 pro lineárnì algebraické úlohy. Ty jsou obvykle zalo¾eny na efektivním násobení
176 matic -- dvì matice $n\times n$ mù¾eme vynásobit v~èase $\O(n^2.808)$ Strassenovým
177 algoritmem~\cite{strassen:matmult}, pøípadnì asymptoticky nejrychlej¹ím známým algoritmem od Coppersmithe
178 a Winograda~\cite{coppersmith:matmult} v~èase $\O(n^{2.376})$. Slavná hypotéza øíká,
179 ¾e pro ka¾dé $\omega>2$ existuje algoritmus násobící matice se slo¾itostí $\O(n^\omega)$
180 (blí¾e o~tomto fascinujícím tématu viz \cite{szegedy:matmult}). Oznaème tedy~$\omega$
181 nejni¾¹í exponent, kterého jsme schopni dosáhnout.
182
183 Co se stane, kdy¾ mocníme matici sousednosti~$A$ grafu? V~matici $A^k$ se na pozici
184 $i,j$ nachází poèet sledù délky~$k$, které vedou z~vrcholu~$i$ do vrcholu~$j$.
185 (Snadný dùkaz indukcí vynecháváme.) Pro libovolné $k\ge n-1$ jsou tedy v~$(A+E)^k$
186 (kde $E$ znaèí jednotkovou matici; doplnili jsme tedy do grafu smyèky) nenuly
187 pøesnì tam, kde z~$i$ do~$j$ vede cesta.
188
189 To nám dává jednoduchý algoritmus pro výpoèet matice dosa¾itelnosti~$R$ ($R_{ij}$
190 je 1 nebo~0 podle toho, zda z~$i$ do~$j$ vede cesta). Do~matice~$A$ doplníme
191 na diagonálu jednièky a poté ji $\lceil \log_2 n\rceil$-krát umocníme na~druhou.
192 Abychom se vyhnuli velkým èíslùm, nahradíme po ka¾dém umocnìní nenuly jednièkami.
193 Celkem tedy provedeme $\O(\log n)$ násobení matic obsahující polynomiálnì velká
194 èísla, co¾ trvá $\O(n^\omega\log n)$.
195
196 Na~tento postup se mù¾eme dívat i~obecnìji:
197
198 \s{Definice:} {\I $(\oplus,\otimes)$-souèin} matic~$A,B \in X^{n\times n}$
199 kde $\oplus$ a~$\otimes$ jsou dvì asociativní binární operace na~mno¾inì~$X$,
200 je matice~$C$ taková, ¾e
201 $$
202 C_{ij} = \bigoplus_{k=1}^n A_{ik}\otimes B_{kj}.
203 $$
204 Klasické násobení matic je tedy $(+,\cdot)$-souèin.
205
206 \s{Pozorování:} Pokud $A$ a~$B$ jsou matice svazkù ($A_{ij}$ a $B_{ij}$
207 jsou $ij$-svazky) a $C$ jejich $(\cup,\cdot)$-souèin, pak $C_{ij}$ je
208 svazek v¹ech sledù vzniklých spojením nìjakého sledu z~$A$ zaèínajícího
209 v~$i$ a nìjakého sledu z~$B$ konèícího v~$j$.
210
211 Podobnì jako v~pøedchozí sekci si tedy mù¾eme poøídit funkci~$f$ pøiøazující
212 svazkùm hodnoty z~nìjaké mno¾iny~$X$ a operace $\oplus$ a $\otimes$ na~$X$,
213 pro nì¾ platí $f(\alpha\cup\beta) = f(\alpha) \oplus f(\beta)$ a $f(\alpha\beta)
214 = f(\alpha) \otimes f(\beta)$. Pak staèí vzít matici popisující ohodnocení
215 v¹ech sledù délky 0 nebo~1 (to je obdoba matice sousednosti), a provést $\O(\log n)$
216 $(\oplus,\otimes)$-souèinù k~tomu, abychom znali ohodnocení svazkù sledù délky
217 právì~$k$ pro nìjaké $k\ge n$.
218
219 S~$(\lor,\land)$-souèiny a maticí sousednosti s~jednièkami na diagonále získáme
220 algoritmus pro výpoèet dosa¾itelnosti (ka¾dý souèin pøitom mù¾eme provést jako
221 násobení matic následované pøepsáním nenul na jednièky).
222
223 Podobnì mù¾eme poèítat i matici vzdáleností: zaèneme s~maticí délek hran doplnìnou o~nuly na~diagonále
224 a pou¾ijeme $(\min,+)$-souèiny. Tyto souèiny ale bohu¾el neumíme pøevést na klasické násobení matic.
225 Pøesto je známo nìkolik algoritmù efektivnìj¹ích ne¾ $\Theta(n^3)$, by» pouze o~málo:
226 napøíklad Zwickùv \cite{zwick:apsp} v~èase $\O(n^3\sqrt{\log\log n}/\log n)$
227 (zalo¾ený na dekompozici a pøedpoèítání malých blokù) nebo Chanùv \cite{chan:apsp} v~$\O(n^3/\log n)$
228 (pou¾ívající geometrické techniky). Abychom porazili Floydùv-Warshallùv algoritmus,
229 potøebovali bychom ov¹em vìt¹í ne¾ logaritmické zrychlení, proto¾e souèinù potøebujeme
230 vypoèítat logaritmicky mnoho.
231
232 Dodejme je¹tì, ¾e pro grafy ohodnocené malými celými èísly je mo¾né vyu¾ít
233 celou øadu dal¹ích trikù. Zájemce o~tento druh algoritmù odkazujeme na Zwickùv
234 èlánek~\cite{zwick:apspint}.
235
236 \h{Seidelùv algoritmus}
237
238 \h{Rozdìl a panuj}
239
240 \references
241 \bye