From: Martin Mares Date: Tue, 24 May 2011 16:28:19 +0000 (+0200) Subject: Cesty, DS: Opet korektury od Karla X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=f0c7d41937ef236912f7e1e4ef1ed564c771e214;p=ads1.git Cesty, DS: Opet korektury od Karla --- diff --git a/5-cesty/5-cesty.tex b/5-cesty/5-cesty.tex index 36cb185..b3930a8 100644 --- a/5-cesty/5-cesty.tex +++ b/5-cesty/5-cesty.tex @@ -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:=$ diff --git a/8-ds/8-ds.tex b/8-ds/8-ds.tex index 07154e1..4e9658b 100644 --- a/8-ds/8-ds.tex +++ b/8-ds/8-ds.tex @@ -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 +\+ & \ & \ & \ \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(\)$, 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í $$\(x+n), \(x), \(x+n+1), -\(x+1) -\dots$$ v¾dy se aspoò polovina listù posune o patro vý¹. Víme ¾e listù v na¹em stromì +\(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}