From: Martin Mares Date: Fri, 28 Jan 2011 00:04:58 +0000 (+0100) Subject: APSP: Seideluv algoritmus X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=e30eee3d28ce2b4f90423978ad466f455d3e226d;p=ga.git APSP: Seideluv algoritmus --- diff --git a/14-floyd/14-floyd.tex b/14-floyd/14-floyd.tex index d61913d..e0a0cb8 100644 --- a/14-floyd/14-floyd.tex +++ b/14-floyd/14-floyd.tex @@ -2,6 +2,8 @@ \prednaska{13}{Nejkrat¹í cesty: Maticové metody}{} +{\bf POZOR: Pracovní verze. Zacházet opatrnì.} + V~pøedchozí kapitole jsme se zabývali algoritmy pro hledání nejkrat¹ích cest z~daného poèáteèního vrcholu. Nyní se zamìøíme na výpoèet celé metriky grafu, tedy matice vzdáleností, která pro ka¾dou dvojici vrcholù @@ -217,8 +219,9 @@ $(\oplus,\otimes)$-sou právì~$k$ pro nìjaké $k\ge n$. 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). +algoritmus pro výpoèet dosa¾itelnosti. Ka¾dý souèin pøitom mù¾eme provést jako +obyèejné násobení matic následované pøepsáním nenul na jednièky, tak¾e celý +výpoèet bì¾í v~èase $\O(n^\omega\log n)$. 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. @@ -235,6 +238,45 @@ celou \h{Seidelùv algoritmus} +Pro neorientované neohodnocené grafy mù¾eme matici vzdáleností spoèítat v~èase $\O(n^\omega\log n)$ +Seidelovým algoritmem (FIXME: odkaz). Funguje následovnì: + +\s{Definice:} {\I Druhá mocnina grafu~$G$} je graf~$G^2$ na té¾e mno¾inì vrcholù, +v~nìm¾ jsou vrcholy~$i$ a~$j$ spojeny hranou právì tehdy, existuje-li v~$G$ sled +délky nejvý¹e~2 vedoucí z~$i$ do~$j$. + +\s{Pozorování:} Matici sousednosti grafu~$G^2$ získáme z~matice sousednosti +grafu~$G$ jedním $(\lor,\land)$-souèinem, tedy v~èase $\O(n^\omega)$. + +Seidelùv algoritmus bude postupovat rekurzivnì: Sestrojí graf~$G^2$, rekurzí +spoèítá jeho matici vzdáleností~$D'$ a z~ní pak rekonstruuje matici vzdáleností~$D$ +zadaného grafu. Rekurze konèí, pokud $G^2=G$ -- tehdy u¾ je ka¾dá komponenta +souvislosti zahu¹tìna na~úplný graf, tak¾e matice vzdálenosti je rovna matici sousednosti. + +Zbývá ukázat, jak z~matice~$D'$ spoèítat matici~$D$. Zvolme pevnì~$i$ a zamìøme +se na funkce $d(v)=D_{iv}$ a $d'(v)=D'_{iv}$. Jistì platí $d'(v) = \lfloor d(v)/2 \rfloor$, +proèe¾ $d(v)$ je buï rovno $2d'(v)$ nebo o~1 vy¹¹í. Nauèíme se rozpoznat, jestli +$d(v)$ má být sudé nebo liché, a~z~toho v¾dy poznáme, jestli je potøeba jednièku pøièíst. + +Jak vypadá funkce~$d$ na sousedech vrcholu~$v\ne i$? Pro alespoò jednoho souseda~$u$ je +$d(u) = d(v)-1$ (to platí pro sousedy, kteøí le¾í na nìkteré z~nejkrat¹ích cest z~$v$ do~$i$). +Pro v¹echny ostatní sousedy je $d(u)=d(v)$ nebo $d(u)=d(v)+1$. + +Pokud $d(v)$ je liché, vyjde pro sousedy le¾ící na nejkrat¹ích cestách $d'(u)=d'(v)$ +a pro ostatní sousedy $d'(u)\ge d'(v)$, tak¾e prùmìr z~$d'(u)$ pøes sousedy je +alespoò~$d'(v)$. Je-li naopak $d(v)$ sudé, musí být pro sousedy na nejkrat¹ích cestách +$d'(u) < d(v)$ a pro v¹echny ostatní $d'(u) = d(v)$, tak¾e prùmìr klesne pod~$d'(v)$. + +Prùmìry pøes sousedy pøitom mù¾eme spoèítat násobením matic: vynásobíme matici +sousednosti grafu~$G$ maticí vzdáleností~$D'$. Na pozici~$i,j$ se objeví souèet +hodnot $D_{ik}$ pøes v¹echny sousedy vrcholu~$j$. Ten staèí vydìlit stupòem +vrcholu~$j$ a hledaný prùmìr je na svìtì. + +Po~provedení jednoho násobení matic tedy dovedeme pro ka¾dou dvojici vrcholù +v~konstantním èase spoèítat $D_{ij}$ z~$D'_{ij}$. Jedna úroveò rekurze proto +trvá $\O(n^\omega)$ a jeliko¾ prùmìr grafu poka¾dé klesne alespoò dvakrát, +je úrovní $\O(\log n)$ a celý algoritmus dobìhne ve~slíbeném èase $\O(n^\omega\log n)$. + \h{Rozdìl a panuj} \references