From: Martin Mares Date: Fri, 25 May 2007 13:30:56 +0000 (+0200) Subject: Korektury kapitoly o cestach. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=439981cc15ae4ae23ed7c8870ee516a8621e8256;p=ads1.git Korektury kapitoly o cestach. --- diff --git a/10-cesty/10-cesty.tex b/10-cesty/10-cesty.tex index 57db49c..54bdd80 100644 --- a/10-cesty/10-cesty.tex +++ b/10-cesty/10-cesty.tex @@ -2,24 +2,32 @@ \prednaska{10}{Nejkrat¹í cesty}{(zapsali L. Banáková, O. Hoferek, J. Bøeèka)} -\s{Problém:} Je dán graf G, kde $l(u,v)$~=~délka hrany~$(u,v)$. Dále jsou dány vrcholy -$s,c~\in~V(G)$. Chceme najít cestu $s=v_1, v_2, \dots, v_k=c$ takovou, aby -$$l(v_1, v_2) + l(v_2, v_3) + \dots + l(v_{k-1}, v_k)$$ bylo minimální. Takovéto -cestì budeme øíkat {\I nejkrat¹í cesta} z~$s$~do~$c$. +\s{Definice:} {\I Vzdálenost vrcholù} $d(u,v)$ je délka nejkrat¹í cesty $(u,v)$, +pokud existuje, nebo $+\infty$, pokud taková cesta neexistuje. + +\s{Problém:} Je dán graf G a funkce $l: E(G) \rightarrow {\bb R}$ pøiøazující +hranám jejich délky. Dále je dán startovací a cílový vrchol +$s,c~\in~V(G)$. Chceme najít cestu $s=v_1, v_2, \dots, v_k=c$ takovou, aby délka cesty +$$l(v_1, v_2) + l(v_2, v_3) + \dots + l(v_{k-1}, v_k)$$ +byla minimální. Takovéto cestì budeme øíkat {\I nejkrat¹í cesta} z~$s$~do~$c$. \noindent -Bez újmy na obecnosti budeme pøedpokládat, ¾e graf G je orientovaný, bez smyèek a +Bez újmy na obecnosti budeme pøedpokládat, ¾e graf $G$ je orientovaný, bez smyèek a násobných hran. \noindent -Nejprve uvá¾íme, ¾e $l=const.$ $1$ : +Nejprve uvá¾íme pøípady, kdy jsou v¹echny hrany stejnì dlouhé. Tehdy mù¾eme pou¾ít +algoritmus prohledávání do ¹íøky (BFS). K jeho implementaci je zapotøebí fronta $Q$ s +metodami $Put(Q, v)$ (pøidání prvku $v$ na konec fronty) a $Get(Q)$ (odebrání +prvku ze zaèátku fronty). Algoritmus vrátí pole \uv{znaèek} $z$: $z(v) = 1$ právì tehdy +pokus je vrchol $v$ dostupný ze startovacího vrcholu $s$, jinak $z(v) = 0$. \s{Algoritmus:} (Prohledávání do ¹íøky (BFS)) \algo \:$z(*) \leftarrow 0, z(s) \leftarrow 1$ -\:$Q \leftarrow {s}$ -\:while $Q \not= \emptyset$ +\:$Q \leftarrow \{s\}$ +\:while $Q \not= \emptyset :$ \::$v \leftarrow Get(Q)$ \::for $\forall w: (v,w)\in E$ \:::if $z(w) = 0$ then @@ -39,7 +47,7 @@ maxim \proof \noindent -\uv{$\Rightarrow$}: Zjevné, indukcí podle bìhu algoritmu. +\uv{$\Rightarrow$}: Indukcí podle bìhu algoritmu. \noindent \uv{$\Leftarrow$}: Doká¾eme sporem. Uva¾me, ¾e existuje vrchol dostupný, ale algoritmem @@ -48,9 +56,6 @@ nejkrat musí být \uv{dobrý}. Vrchol $u$ se dostane do fronty, pak je z~ní vybrán a tím se zpracuje i vrchol $v$ $\Rightarrow$ spor. -\s{Definice:} {\I Vzdálenost vrcholù} $d(u,v)$ je délka nejkrat¹í cesty $(u,v)$, -pokud existuje, nebo $+\infty$, pokud taková cesta neexistuje. - Pøedchozím algoritmem jsme pouze zjistili, které vrcholy jsou z~$s$ dosa¾itelné. Nyní si tento algoritmus modifikujeme tak, abychom na¹li $d(s,v)$ pro v¹echna $v~\in~V(G)$. @@ -60,8 +65,8 @@ $v~\in~V(G)$. \algo \:$z(*) \leftarrow 0, z(s) \leftarrow 1$ \:$D(*) \leftarrow +\infty, D(s) \leftarrow 0$ -\:$Q \leftarrow {s}$ -\:while $Q \not= \emptyset$ +\:$Q \leftarrow \{s\}$ +\:while $Q \not= \emptyset :$ \::$v \leftarrow Get(Q)$ \::for $\forall w: (v,w)\in E$ \:::if $z(w) = 0$ then @@ -78,12 +83,12 @@ Pr \s{Definice:} {\I Vrstva} $ L_i\subseteq V $ : $ L_0 = \{s\} $ , $ L_{i+1} = $ $ \{ w$ : $ w $ oznaèen pøi procházení vrcholu $ v \in L_i $$ \} $ -\s{Lemma V (vzdálenosti):} Na konci BSF je $\forall v: D(v) = d(s,v)$. +\s{Lemma V (vzdálenosti):} Na konci BFS je $\forall v: D(v) = d(s,v)$. \proof \noindent -a) pro nedosa¾itelné vrcholy: OK (algoritmus je neoznaèí $\Rightarrow D(v) = \infty$ ) +a) pro nedosa¾itelné vrcholy: OK (algoritmus je neoznaèí $\Rightarrow D(v) = \infty$) \noindent b) pro dosa¾itelné vrcholy: Víme, ¾e pro vrchol $v \in L_i$ platí $D(v)=i$, @@ -92,7 +97,8 @@ podle~$i$: pro $i=0$: evidentní, -pro $i>0$: Pøi procházení vrstvy $L_{i-1}$ musí být vrchol $v$ takový, ¾e $d(s,v)=i$, oznaèen a tudí¾ patøí do $L_i$. +pro $i>0$: Pøi procházení vrstvy $L_{i-1}$ musí být vrchol $v$ takový, ¾e $d(s,v)=i$, oznaèen +a zároveò nemohl být oznaèen døíve a tudí¾ patøí do $L_i$. \qed \noindent @@ -103,15 +109,15 @@ V \:ve vrstvì \endlist -Abychom na¹li i samotné cesty, nejen jejich délky, modifikujeme ná¹ algoritmus tak, -abychom si pro ka¾dý vrchol, který oznaèíme, pamatovali jeho pøedchùdce: +Abychom na¹li i samotné cesty, nejen jejich délky, modifikujeme svùj algoritmus tak, +¾e si pro ka¾dý vrchol $v$, který oznaèíme, budeme pamatovat jeho pøedchùdce $p(v)$: \algo \:$z(*) \leftarrow 0, z(s) \leftarrow 1$ \:$D(*) \leftarrow +\infty, D(s) \leftarrow 0$ \:$p(*) \leftarrow$ ? -\:$Q \leftarrow {s}$ -\:while $Q \not= \emptyset$ +\:$Q \leftarrow \{s\}$ +\:while $Q \not= \emptyset :$ \::$v \leftarrow Get(Q)$ \::for $\forall w: (v,w)\in E$ \:::if $z(w) = 0$ then @@ -124,10 +130,12 @@ abychom si pro ka \s{Pozorování:} Pokud $p(v) \not=$ ? $\Rightarrow D(v) = D(p(v)) + 1$. \s{Lemma S (stromové):} Graf $(W,F)$, kde $W$ = dosa¾itelná èást $V$, $F = \{(v,p(v))\}$ -je strom orientovaný do~koøene $s$. Navíc ukazuje v¹echny nejkrat¹í cesty. +je strom orientovaný do~koøene $s$. Navíc ukazuje nejkrat¹í cestu pro ka¾dý dosa¾itelný +vrchol (pro ka¾dý vrchol v tomto grafu, existuje jediná orientovaná cesta do koøene +$s$, která je zároveò nejkrat¹í cesta z $s$ do tohoto vrcholu). \noindent -Nyní uva¾me, ¾e $l \not= const.$ : +Nyní uva¾me, ¾e délky hran $l$ nejsou v¹echny stejnì dlouhé: Uká¾eme si trik pro ohodnocené hrany: hranu délky $l$ podrozdìlíme na $l$ hran délky 1 a pak spustíme BFS. Algoritmus pobì¾í s èasovou @@ -137,26 +145,26 @@ dosud zn algoritmu objevíme hranu, která nám umo¾ní dostat se do $v$ rychleji, tak hodnotu $b(v)$ zmìníme. Tato taktika nás pøivede k Dijkstrovu algoritmu, kde se ze dvoustavového $z(v)$ stane tøístavové -( $z(v)) \in \{N, V, H\}$, kde N znamená nevidìn, V vidìn a H hotov ). Podle hodnoty $z(v)$ se -pak $D(v)$ rovná $+\infty$ pro $z(v) = N$, èasu budíku pro $z(v) = V$ nebo vzdálenosti $d(s,v)$ pro $z(v) = H$. +$z(v)) \in \{{\bf{N}}, {\bf{V}}, {\bf{H}}\}$, kde {\bf{N}} znamená nevidìn, {\bf{V}} vidìn a {\bf{H}} hotov. Podle hodnoty $z(v)$ se +pak $D(v)$ rovná $+\infty$ pro $z(v) = {\bf{N}}$, èasu budíku pro $z(v) = {\bf{V}}$ nebo vzdálenosti $d(s,v)$ pro $z(v) = {\bf{H}}$. \s{Algoritmus:} (Dijkstrùv algoritmus) \algo -\:$z(*) \leftarrow N, z(s) \leftarrow V$ +\:$z(*) \leftarrow {\bf{N}}, z(s) \leftarrow {\bf{V}}$ \:$D(*) \leftarrow +\infty , D(s) \leftarrow 0$ \:$p(*) \leftarrow $? -\:while $\exists v : z(v)=V$ -\::$v \leftarrow $ vrchol, pro nìj¾ $z(v)=V$ a zároveò $D(v)$ je minimální -\::$z(v) \leftarrow H$ +\:while $\exists v : z(v) = {\bf{V}} :$ +\::$v \leftarrow $ vrchol, pro nìj¾ $z(v)={\bf{V}}$ a zároveò $D(v)$ je minimální +\::$z(v) \leftarrow {\bf{H}}$ \::for $\forall w : (v,w) \in E$: \:::if $D(w)>D(v) + l(v,w)$ then \::::$D(w) \leftarrow D(v) + l(v,w)$ -\::::$z(w) \leftarrow V$ +\::::$z(w) \leftarrow {\bf{V}}$ \::::$p(w) \leftarrow v$ \endalgo -\s{Vìta:} Pokud $\forall v,w: l(v,w) \in Z^+ \cup \{\infty\}$, pak Dijkstrùv algoritmus +\s{Vìta:} Pokud $\forall v,w: l(v,w) \in \bb{Z}^+ \cup \{\infty\}$, pak Dijkstrùv algoritmus najde nejkrat¹í cesty v èase $\O(n^2)$. \proof @@ -167,16 +175,13 @@ Nahl Dijkstrova algoritmu pou¾ili jako datovou strukturu pro ukládání vidìných vrcholù rùzné typy hald. Provádìli bychom s~nimi operace \ (maximálnì $n$-krát) a \ (maximálnì $m$-krát). Zmínìné operace mají pro rùzné typy hald následující èasové slo¾itosti: - -\medskip - -\vbox{\halign{# \quad \vrule \quad & # \quad \vrule \quad & # \quad \vrule \quad & #\cr -& halda & $k$-regulární halda & Fibonaciho halda\cr -\noalign{\medskip\hrule\bigskip} -\ & $\O(\log{n})$ & $\O(k\log_k{n})$ & $\O(\log{n})$\cr -\ & $\O(\log{n})$ & $\O(\log_k{n})$ & $\O(1)$\cr}} - -\medskip +$$\vbox{\halign{\strut # \quad & # \quad & # \quad & #\cr +& \it binární halda & \it $k$-regulární halda & \it Fibonacciho halda\cr +\noalign{\smallskip} +\ & $\O(\log{n})$ & $\O(k\log_k{n})$ & $\O(\log{n})$ \cr +\ & $\O(\log{n})$ & $\O(\log_k{n})$ & $\O(1)$ \cr +{\I celková slo¾itost} & $\O((m+n)\log{n})$ & $\O(m\log_{m/n}{n})$ & $\O(n\log{n}+m)$ \cr +}}$$ Pou¾ijeme-li klasickou haldu, dostaneme celkovou èasovou slo¾itost $\O((m+n)\log{n})$, co¾ znamená, ¾e jsme si pomohli v pøípadech, kdy je graf \uv{øídký}. U $k$-regulární haldy se celková èasová slo¾itost @@ -185,17 +190,17 @@ jak se n \itemize\ibull \:$m \approx n \rightarrow \O((m+n)\log{n})$ \:$m \approx n^2 \rightarrow \O(m)$ -\:$m \approx n^{1+\epsilon} \rightarrow \O(m) \dots (k=$~${m}\over{n}$~$= n^\epsilon)$ +\:$m \approx n^{1+\epsilon} \rightarrow \O(m) \dots (k=m/n= n^\epsilon)$ \endlist \noindent -Pøi pou¾ití Fibonaciho haldy je pak celková èasová slo¾itost rovna $\O(n\log{n}+m)$. +Pøi pou¾ití Fibonacciho haldy je pak celková èasová slo¾itost rovna $\O(n\log{n}+m)$. \medskip Nyní si pøedvedeme trochu jiný algoritmus na prohledávání grafu. Mìjme matici sousednosti $A$ -ke grafu $G = (V, E)$: $ A_{ij} = 1 \Leftrightarrow (v_i, v_j) \in E $. Potom +ke grafu $G = (V, E)$: $ A_{ij} = 1 \Leftrightarrow (v_i, v_j) \in E $, jinak $A_{ij} = 0$. Potom $A^2_{ij} = \sum_{k=1}^n A_{ik}A_{kj} $. Tento souèet je nenulový právì tehdy, kdy¾ -vrcholy $i$,$k$,$j$ tvoøí sled délky 2. Jinými slovy $A_{ij}$ se rovná poètu sledù +vrcholy $i$,$k$,$j$ tvoøí sled délky 2. Jinými slovy $A^2_{ij}$ se rovná poètu sledù délky 2 v $G$ z $i$ do $j$. Obdobnì $A^k_{ij}$ = poèet sledù délky $k$. Pokud k matici $A$ pøièteme jednotkovou matici ${\bb E}_n$ (èím¾ si pøimyslíme smyèky), dostaneme po umocnìní: @@ -205,13 +210,13 @@ $ (A+{\bb E}_n)^k_{ij} \neq 0 \Leftrightarrow \exists$ $i,j$-sled d Výstupem algoritmu tedy bude matice $(A + {\bb E}_n)^n$. Mù¾eme si také v¹imnout, ¾e pokud matici $A + {\bb E}_n$ umocníme na èíslo vìt¹í ne¾ $n$, tak výsledek bude poøád správný, jen bude výpoèet trvat déle. Tak¾e algoritmus mù¾e pracovat -v iteracích umocòováním matice na druhou: $M_0 = A + {\bb E}_n$, $M_1 = M^2_0$, $M_{i+1} = M^2_i$, -tak¾e výstupní matice bude: +v iteracích umocòováním matice na druhou: $M_0 = A + {\bb E}_n$, $M_1 = M^2_0$, $M_{i+1} = M^2_i$. +Výstupní matice bude tudí¾: $ M_{\lceil \log{n} \rceil (ij)} \neq 0 \Leftrightarrow \exists$ cesta z $i$ do $j$ -Pokud pou¾ijeme Strassenùv vzorec na násobení matic, dostaneme -ve výsledku algoritmus na dosa¾itelnost v grafu se slo¾itostí -$\O(n^{\log_2{7}}\log{n})$. +Na výpoèet dosa¾itelnosti vrcholù v grafu tedy staèí $\O(\log{n})$ násobení matic, +a pokud na toto pou¾ijeme Strassenùv algoritmus, dostaneme +ve výsledku algoritmus se slo¾itostí $\O(n^{\log_2{7}}\log{n})$. \bye