]> mj.ucw.cz Git - ads1.git/commitdiff
Cesty, DS: Opet korektury od Karla
authorMartin Mares <mj@ucw.cz>
Tue, 24 May 2011 16:28:19 +0000 (18:28 +0200)
committerMartin Mares <mj@ucw.cz>
Tue, 24 May 2011 16:28:19 +0000 (18:28 +0200)
5-cesty/5-cesty.tex
8-ds/8-ds.tex

index 36cb1850f054f67a3b671566eb6cec22d65e07d6..b3930a88dd59dc68f7eae5f44eef012178b1bf05 100644 (file)
@@ -5,12 +5,12 @@
 Na~této pøedná¹ce budeme studovat problém hledání nejkrat¹ích cest
 v~orientovaných grafech ohodnocených reálnými èísly.
 
-\s{Situace:} Máme orientovaný graf~$G$ a funkci $l : E(G) \rightarrow {\bb R}$
+\s{Situace:} Máme orientovaný graf~$G$ a funkci $\ell : E(G) \rightarrow {\bb R}$
 pøiøazující hranám jejich ohodnocení (délky). Pro vrcholy $u,v\in V(G)$ budeme
 chtít spoèítat jejich vzdálenost $d(u,v)$, co¾ bude délka nejkrat¹í cesty z~$u$
 do~$v$ nebo $\infty$, pokud ¾ádná cesta neexistuje.
 
-Aby se vzdálenosti chovaly \uv{rozumnì} tedy co nejvíce jako metrika. Orientovanost
+Chceme, aby se vzdálenosti chovaly \uv{rozumnì}, tedy co nejvíce jako metrika. Orientovanost
 grafù nám kazí symetriènost -- nemusí nutnì platit $d(x, y)=d(y, x)$. Budeme aspoò chtít,
 aby platily následující vlastnosti:
 
@@ -27,68 +27,89 @@ spln
 V~grafu bez záporných cyklù existuje ke~ka¾dému nejkrat¹ímu sledu z~$u$ do~$v$ stejnì dlouhá $uv$-cesta.
 
 \proof Máme-li nejkrat¹í $uv$-sled, který není cestou, opakuje se v~nìm nìjaký vrchol
-$w \in V(G)$. Délka cyklu  $\ell(c) \geq  0 \Rightarrow \ell(u\dots v\dots w) \leq \ell(\hbox{pùvodní
-sled})$. Tento postup mù¾eme opakovat a po koneèném poètu krokù dostaneme cestu, tedy
-platí trojúhelníková nerovnost. \qed
+$w \in V(G)$ tedy $uv$-sled je $(u\dots w \dots w \dots v)$. Délka cyklu $c=(w\dots
+w)$ je $\ell(c) \geq  0$ tedy platí $\ell(u\dots w\dots v) \leq \ell(\hbox{pùvodní
+sled})$. Tento postup mù¾eme opakovat a po koneèném poètu krokù dostaneme cestu. Z
+toho plyne trojúhelníková nerovnost. \qed
 
 \s{Jednoduché pøípady}
 
 
 \itemize\ibull
-\:Pokud $l$ je konstantní funkce, pou¾ijeme BFS. Èasová slo¾itost bude $\Theta(m+n)$.
-\:Délky hran jsou malá pøirozená èísla $\ell(x, y) \in\{1, \dots, L\}$ podrozdìlíme hrany
+\:Pokud $\ell$ je konstantní funkce, pou¾ijeme BFS. Èasová slo¾itost bude $\Theta(m+n)$.
+\:Délky hran jsou malá pøirozená èísla -- $\ell(x, y) \in\{1, \dots, L\}$: Podrozdìlíme hrany
 a pou¾ijeme BFS. Èasová slo¾itost $\Theta(Lm+n)$.
-\:DAG (orientovaný acyklický graf) indukcí pøes topologické uspoøádání v èase
-$\Theta(m+n)$.
+\:V DAG (orientovaném acyklickém grafu) najdeme nejkrat¹í cestu
+indukcí pøes topologické uspoøádání v èase $\Theta(m+n)$.
 \endlist
 
+\s{Obecný algoritmus}
+
 \s{Definice:} $D_k(v):=$ minimální délka ze v¹ech sledù z $v_0$ do $v$ o právì $k$ hranách.
 $D_0(v)=0$ pokud $v=v_0$, jinak $D_0(v)=\infty$.
-$d(v_0, v)=\min D_k(v)$ kde $1 \leq k  \leq n-1$.
 
-Kdy¾ známe $D_0 \dots D_{k-1}$ spoèteme $D_k=\min D_{k-1}(u)+\ell(u, v)$ pro taková $u$
-¾e $(u, v)\in E(G)$.
+$d(v_0, v)=\min D_k(v)$ kde $1 \leq k \leq n-1$.
+
+Jak spoèítat $D_k$ kdy¾ u¾ známe $D_0\dots D_{k-1}$? Zøejmnì $$D_k=\min
+\{D_{k-1}(u)+\ell(u, v)\}$$ pro taková $u$ ¾e $(u, v)\in E(G)$. Z tohoto mù¾eme udìlat
+jednoduchý algoritmus: postupnì pro v¹echna $k=0\dots n-1$ zjistíme v¹echna $D_k(z)$
+pro v¹echny vrcholy $z\in V(G)$. Délka nejkrat¹í cesty z $v_0$ do $v$ je $\min D_k(v)$
+kde $1 \leq k \leq n-1$.
 
-Naivní implementace pobì¾í $n(\sum_v {\rm deg}^+(v))+n$ (musíme pøièíst na
+Naivní implementace pobì¾í $n^2(\sum_v {\rm deg}^+(v))+n$ (musíme pøièíst na
 konec $n$ za izolované vrcholy), upravíme $\sum_v {\rm deg}^+(v)=m$. Bohu¾el
 spotøebujeme $\Theta(n^2)$ pamìti.
 
-Nevýhodou této implementace je pøistupování k hranám pozpátku.
+Nevýhodou této implementace je pøistupování k hranám pozpátku. Pojïme zkusit nepatrnì
+odli¹ný pøístup.
 
 \s{Bellmanùv-Fordùv algoritmus}
 \algo
-\:$D(*) \leftarrow \infty, D(s) \leftarrow 0$
+\:$D(*) \leftarrow \infty, D(v_0) \leftarrow 0$
 \:Pro $k=1, \dots, n-1$:
-\::$D_k(*) \leftarrow \infty$
 \::Pro $\forall v\in V(G)$:
-\:::Pro $\forall w (v, w)\in E(G)$:
-\::::$D(w)\leftarrow \min(D(w), D_{k-1}(v)+\ell(v, w))$
+\:::Pro $\forall w$ takové ¾e $(v, w)\in E(G)$:
+\::::$D(w)\leftarrow \min(D(w), D(v)+\ell(v, w))$
 \endalgo
 
-Pokud by i v $n$-tém kroku nìco vykonal, graf obsahuje záporný cyklus.
+Pokud by algoritmus i v $n$-tém kroku nìco zmìnil, graf obsahuje záporný cyklus.
 
-\s{Vìta:} Bellmanùv--Fordùv algoritmus najde v èase $\Theta(nm)$ vzdálenosti $d(v_0, v)$
-pro $\forall v\in V(G)$.
+\s{Vìta:} Bellmanùv -- Fordùv algoritmus najde v èase $\Theta(nm)$ vzdálenosti $d(v_0, v)$
+z $v_0$ do v¹ech $v\in V(G)$.
 
 \proof
 Invarianty:
 \itemize\ibull
-\:Koneèné $D(v)$ v¾dy odpovídá délce nìjakého sledu z $v_0 \rightarrow w$
-\:Na konci $k$-tého prùchodu vnìj¹m cyklem platí $D(w)\leq \min$ délka sledu z $v_0
-\rightarrow v$ o ménì ne¾ $k$ hranách z toho plyne ¾e na konci $D(w)\leq d(v_0, v)$
-
-Nech» nejkrat¹í sled $v_0\rightarrow w$ o ménì ne¾ $k$ hranách konèí hranou $(v, w)$,
-zastavme algoritmus v okam¾iku kdy v $k$-tém prùchodu zpravovává hranu $(v, w)$ tehdy
-$D(w)\leq D(v)+\ell(v, w)$ a $D(v)$ je dle indukèního pøedpokladu men¹í nebo rovný
-minimální délce sledu $v_0\rightarrow v$ o $\leq k$ hránách.
+\:Koneèné $D(v)$ v¾dy odpovídá délce nìjakého sledu z $v_0 \rightarrow v $.
 \endlist
+
+Pro vrchol $v_0$ urèitì existuje sled nulové délky z $v_0$ do $v_0$.
+
+Jak se z pùvodního nekoneèného $D(v)$ mohlo stát koneèné? Na¹li jsme takovou hranu,
+která vedla z vrcholu $w$ s koneèným $D(w)$ do vrcholu $v$. Tedy do $v$ existuje sled.
+
+Pokud sní¾ím $D(v)$, znamená to, ¾e jsem do vrcholu $v$ na¹el krat¹í sled.
+
+\itemize\ibull
+\:Na konci $k$-tého prùchodu vnìj¹m cyklem platí $D(w)\leq \min$ délka sledu z $v_0$
+do $v$ o nejvý¹e $k$ hranách. Z èeho¾ plyne ¾e na konci je $D(w)\leq d(v_0, v)$.
+\endlist
+
+Nech» nejkrat¹í sled $v_0\rightarrow w$ o nejvý¹e $k$ hranách konèí hranou $(v, w)$.
+Zastavme algoritmus v okam¾iku, kdy v $k$-tém prùchodu zpracovává hranu $(v, w)$ tehdy
+$D(w)\leq D(v)+\ell(v, w)$ a $D(v)$ je dle indukèního pøedpokladu men¹í nebo rovno
+minimální délce sledu z $v_0$ do $v$ o nejvý¹e $k$ hránách.
 \qed
 
-\s{\uv{Prùzkumnický algoritmus}}
-Stav: $D(v)$ je délka zatím nejkrat¹í nalezené cesty do vrcholu $v$, $S(v)$ stav
-vrcholu ($N$ nevidìn -- vrchol jsme je¹tì nepotkali, $O$ otevøen -- od posledního prozkoumání
-se $D(v)$ zmìnilo, $Z$ zavøen -- není potøeba zkoumat znovu, nic by se nezmìnilo). $P(v)$ je
-pøedchùdce $v$.
+V Bellman -- Fordovì algoritmu jsme v podstatì zlep¹ovali odhady na nejkrat¹í cestu.
+Pojïme vymyslet algoritmus zalo¾ený na podobné my¹lence.
+
+\s{\uv{Prùzkumnický algoritmus}} Pro ka¾dý vrchol budeme udr¾ovat jeho ohodnocení
+(doèasnou vzdálenost) $D(v)$ a stav vrcholu $S(v)$. Stav mù¾e být buï $N$ nevidìn --
+vrchol jsme je¹tì nepotkali, $O$ otevøen -- od posledního prozkoumání se $D(v)$
+zmìnilo nebo $Z$ zavøen -- není potøeba zkoumat znovu, nic by se nezmìnilo. Abychom
+mohli nejkrat¹í cestu na konci bìhu také zrekonstruovat, budeme si je¹tì udr¾ovat $P(v)$
+pøedchùdce vrcholu $v$.
 
 \algo
 \:$D(*)\leftarrow \infty, D(v_0)=0, S(*)\leftarrow N, S(v_0)\leftarrow O,
@@ -101,20 +122,25 @@ P(*)\leftarrow ?$
 \::::$S(v)\leftarrow O$
 \endalgo
 
-\s{Invariant} $D(v)$ neroste a odpovídá délce nìjakého sledu z $v_0$ do $v$.
+\s{Invariant:} $D(v)$ neroste a odpovídá délce nìjakého sledu z $v_0$ do $v$.
 
-\s{Lemma} Algoritmus se zastaví pøi jakémkoliv poøadí zavíraných vrcholù. Èas pøi
+$D(v)$ volíme jako minimum z $D(v)$ a $D(u)+\ell(u, v)$, proto nikdy nemù¾e vzrùst.
+
+Dùkaz toho, ¾e $D(v)$ odpovídá délce nìjakého sledu z $v_0$ do $v$ je stejný jako u
+Bellman -- Fordova algoritmu.
+
+\s{Lemma:} Algoritmus se zastaví pøi jakémkoliv poøadí zavíraných vrcholù. Èas pøi
 nevhodném zavírání mù¾e být a¾ exponenciální.
 
-\>Toto lemma bude zanecháno bez dùkazu.
+\>Toto lemma bude zanecháno bez dùkazu, nebo» ho nebudeme potøebovat pro dùkaz
+správnosti algoritmù, které od \uv{prùzkumnického algoritmu} odvodíme.
 
-\s{Lemma} Pokud se zastaví, pak dosa¾itelné vrcholy jsou zavøené a $S(v)=Z$ pak platí
-$D(v)=d(v_0, v)$.
+\s{Lemma:} Pokud se algoritmus zastaví, pak dosa¾itelné vrcholy jsou zavøené a
+kdykoliv $S(v)=Z$, platí $D(v)=d(v_0, v)$.
 
-\proof
-Nech» cesta z $v_0$ do $v$ je nejmen¹í protipøíklad, pak musí existovat vrchol $u$,
-pro který neplatí $S(u)=Z$. Co¾ je spor, proto¾e takový vrchol musel ná¹ algoritmus
-projít.
+\proof Nech» cesta z $v_0$ do $v$ je co do poètu hran nejmen¹í protipøíklad, pak musí
+existovat vrchol $u$, pro který neplatí $S(u)=Z$. Co¾ je spor, proto¾e takový vrchol
+musel ná¹ algoritmus projít.
 
 Vezmìme minimání protipøíklad co do poètu hran. Nech» $v$ je nejbli¾¹í vrchol takový
 ¾e $D(v)\neq d(v_0, v)$, tudí¾ musí být vìt¹í (odpovídá délce nìjakého sledu). $u:=$
index 07154e14070cb36dcb1726e7d3793b5861558bb2..4e9658b9aa1926ff88e76164a6f45678b638ae14 100644 (file)
@@ -15,9 +15,9 @@ n
 abstrahovat i operace s daty? Napøed si urèíme, co s na¹imi daty budeme provádìt a pak
 vymyslíme jejich co nejrychlej¹í reprezentaci.
 
-Mù¾eme tøeba chtít udr¾ovat koneènou mno¾inu $X$ prvkù z nìjakého universa $X\subseteq
+Mù¾eme tøeba chtít udr¾ovat koneènou {\it mno¾inu} $X$ prvkù z nìjakého universa $X\subseteq
 U$. Kde universum mohou být napøíklad pøirozená èísla, tedy universum mù¾e být
-nekoneèné narozdíl od $X$.
+nekoneèné na rozdíl od $X$.
 
 Na na¹ich datech budeme chtít provádìt následující operace: 
 \itemize\ibull
@@ -26,33 +26,36 @@ Na na
 \:{\it Find} -- najít polo¾ku
 \endlist
 
-Jak mìøit èasovou slo¾itost? Urèitì nechceme mìøit vùèi délce vstupu, proto¾e ho
-nemusíme mít celý najednou ve struktuøe. Èasovou slo¾itost jednotlivých operací
-poèítejme vzhledem k poètu prvkù obsa¾ených v datové struktuøe.
+Jak mìøit èasovou slo¾itost? Urèitì ji nechceme mìøit vùèi délce vstupu, proto¾e ho
+nemusíme mít celý najednou ve struktuøe. Èasovou slo¾itost jednotlivých operací tedy
+poèítejme vzhledem k poètu prvkù obsa¾ených v datové struktuøe v daný okam¾ik.
 
-Také mù¾eme chtít udr¾ovat slovník, tedy mno¾inu dvojic $(k, v)$ kde $k\in U$ se
-nazývá klíè a $v$ hodnota. Dále pøedpokládejme, ¾e $U$ je lineárnì uspoøádaná a s prvky
-pracujeme v konstantním èase.
+Také mù¾eme chtít udr¾ovat {\it slovník}, tedy mno¾inu dvojic $(k, v)$ kde $k\in U$ se
+nazývá klíè a $v$ hodnota. Dále pøedpokládejme, ¾e $U$ je lineárnì uspoøádaná a
+s~klíèi i hodnotami pracujeme v konstantním èase.
 
 Dále budeme zkoumat jen slovník, proto¾e mno¾ina je jen jeho speciálním pøípadem.
 
 Po slovníku budeme chtít:
 \itemize\ibull
-\:{\it Insert($k$, $v$)} -- vlo¾it novou hodnotu spolu s klíèem
+\:{\it Insert($k$, $v$)} -- vlo¾it novou hodnotu spolu s klíèem (pøedpokládajíce, ¾e ve
+struktuøe dosud tento klíè není pøítomen)
 \:{\it Delete($k$)} -- smazat polo¾ku podle klíèe
 \:{\it Find($k$)} -- najít polo¾ku podle klíèe
 \endlist
 
-V následující tabulce jsou nìkteré mo¾né zpùsoby reprezentace na¹í datové struktury.
+V následující tabulce jsou nìkteré mo¾né zpùsoby reprezentace na¹í datové struktury:
 
 \settabs 4 \columns
-\+                     & Insert        & Delete        & Find \cr
+\+                     & \<Insert>     & \<Delete>     & \<Find> \cr
 \+ pole                        & $\Theta (1)$  & $\Theta (n)$  & $\Theta (n)$ \cr
 \+ setøídìné pole      & $\Theta (n)$  & $\Theta (n)$  & $\Theta (\log n)$ \cr
 \+ spojový seznam      & $\Theta (1)$  & $\Theta (n)$  & $\Theta (n)$ \cr
 \+ setøídìný seznam    & $\Theta (n)$  & $\Theta (n)$  & $\Theta (n)$ \cr
 \+ vyhledávací stromy  & $\Theta (\log n)$     & $\Theta (\log n)$     & $\Theta (\log n)$ \cr
 
+\smallskip
+
 \s{Pozorování:} Proces binárního vyhledávání v~setøídìném poli se dá reprezentovat
 binárním vyhledávacím stromem.
 
@@ -112,7 +115,7 @@ z $P(v)$ ekvivalentn
 Èasová slo¾itost v¹ech tøí operací je $\Theta(\<hloubka stromu>)$, co¾ mù¾e být
 $\Theta(n)$, kdy¾ budeme mít smùlu a strom bude (témìø) lineární spojový seznam.
 Takovéto degenerované stromy vzniknou snadno, napøíklad pøidáváním setøídìné
-posloupnosti. Naopak kdy¾ bude strom pìknì vyvá¾enì vystavìný dostaneme slo¾itost
+posloupnosti. Naopak kdy¾ bude strom pìknì vyvá¾enì vystavìný, dostaneme slo¾itost
 $\Theta(\log{n})$. Vidíme tedy, ¾e slo¾itost operací stojí a padá s~hloubkou stromu.
 Proto by se nám líbilo, aby mìl ná¹ strom v¾dy hloubku $\Theta(\log{n})$. Podívejme se
 tedy, jak se dá navrhnout binární vyhledávací strom, aby tuto podmínku splòoval \dots
@@ -131,15 +134,15 @@ $\Theta(\log{n})$.
 setøídìného pole (tedy medián posloupnosti) a dáme ho do~koøene stromu. Jeho syny pak
 vystavíme rekurzivnì z~levé a pravé pùlky pole. Celá konstrukce tedy trvá $\O(n)$.
 
-\s{Lemma:} buï {\it Insert} nebo {\it Delete} v dokonale vyvá¾eném BVS trvají $\Omega(n)$ (ve
-skuteènosti oba, ale dùkaz je mnohem obtí¾nìj¹í).
+\s{Lemma:} Buï {\it Insert} nebo {\it Delete} v dokonale vyvá¾eném BVS trvá $\Omega(n)$ (ve
+skuteènosti oba, ale dùkaz je o trochu obtí¾nìj¹í).
 
-\proof Nech» $n=2^k-1$. Pak má dokonale vyvá¾ený BVS urèený tvar a je jednoznaèné, co
-je v koøeni. Nech» nejmen¹í èíslo ve stromì je $x$ a nejvìt¹í je $x+n-1$.
+\proof Nech» $n=2^k-1$. Pak má dokonale vyvá¾ený BVS urèený tvar a je jednoznaèné,
+která hodnota je ve kterém vrcholu. Nech» nejmen¹í èíslo ve stromì je $x$ a nejvìt¹í je $x+n-1$.
 
 Proveïme posloupnost operací $$\<Insert>(x+n), \<Delete>(x), \<Insert>(x+n+1),
-\<Delete>(x+1)
-\dots$$ v¾dy se aspoò polovina listù posune o patro vý¹. Víme ¾e listù v na¹em stromì
+\<Delete>(x+1) \dots$$
+za ka¾dou dvojici operací se aspoò polovina listù posune o patro vý¹. Víme ¾e listù v na¹em stromì
 je $(n+1)/2$. Tedy aspoò jedna z operací {\it Insert} nebo {\it Delete} trvá $\Omega (n)$.
 
 Vidíme tedy, ¾e to ná¹ problém pøíli¹ neøe¹í. Potøebovali bychom, aby se strom dal
@@ -154,12 +157,12 @@ plat
 
 \s{Lemma:} AVL strom na~$n$ vrcholech má hloubku $ \Theta(\log{n}) $.
 
-\proof Uva¾me posloupnost $A_k = $ minimální poèet vrcholù AVL stromù hloubky $k$.
+\proof Uva¾me posloupnost $A_k = $ minimální poèet vrcholù AVL stromu hloubky $k$.
 Staèí ukázat, ¾e $A_k$ roste exponenciálnì.
 
 Jak bude vypadat minimální AVL strom o $k$ hladinách? S poètem hladin urèitì poroste
 poèet vrcholù, proto pro ka¾dý vrchol budeme chtít, aby se hloubky jeho synù li¹ily.
-Tedy koøen bude mít syna hloubky $k-1$ a syna hloubky $k-2$, takové ¾e jeho synové
+Tedy koøen bude mít syna hloubky $k-1$ a syna hloubky $k-2$, takové, ¾e jeho synové
 jsou minimální AVL stromy o daném poètu hladin.
 
 Podívejme se na minimální AVL stromy:
@@ -175,8 +178,10 @@ A_k &= 1 + A_{k - 1} + A_{k - 2}. \cr
 Rekurentní vzorec jsme dostali rekurzivním stavìním stromu hloubky $k$: nový koøen a 2
 podstromy o~hloubkách $k - 1$ a $k - 2$.
 
-Vidíme tedy, ¾e $A_n = F_{n + 2} - 1$. (Mù¾eme dokázat napø. indukcí.) Teï nám ji¾
-staèí dokázat, ¾e posloupnost $A_k$ roste aspoò exponenciálnì.
+Indukcí bychom snadno dokázali, ¾e $A_n=F_{n+2}-1$ (kde $F_n$ je $n$-té Fibonacciho
+èíslo). My se v¹ak bez analýzy Fibonacciho posloupnosti obejdeme, proto¾e nám staèí
+dokázat, ¾e $A_k$ rostou exponenciálnì a nepotøebujeme pøesný vzorec pro hodnotu
+$A_k$.
 
 Indukcí doká¾eme, ¾e $ A_k \geq 2^{k \over 2} $. První indukèní krok jsme si u¾
 ukázali, teï pro $ k \geq 2 $ platí: $ A_k = 1 + A_{k - 1} + A_{k - 2} > 2^{{k - 1}