]> mj.ucw.cz Git - ga.git/commitdiff
APSP: Seideluv algoritmus
authorMartin Mares <mj@ucw.cz>
Fri, 28 Jan 2011 00:04:58 +0000 (01:04 +0100)
committerMartin Mares <mj@ucw.cz>
Fri, 28 Jan 2011 00:04:58 +0000 (01:04 +0100)
14-floyd/14-floyd.tex

index d61913dc581f3db951a79ac50a5e96a692644f91..e0a0cb89dcf8da345a62f4603a395f79aea4463e 100644 (file)
@@ -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