From 08ef0225e80dc74ae7f839a7df2d7bec6e7f2a49 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Wed, 4 May 2011 06:47:40 +0200 Subject: [PATCH] Zapisy prednasek c. 5 (Cesty) a 8 (Datove struktury) od Karla Krale --- 5-cesty/5-cesty.tex | 121 ++++++++++++++++ 5-cesty/Makefile | 3 + 8-ds/8-ds.tex | 168 +++++++++++++++++++++++ 8-ds/Makefile | 3 + {2007/7-stromy => 8-ds}/treepic/t1.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t10.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t11.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t12.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t12y.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t13.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t2.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t3.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t35.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t4.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t5.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t6.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t7.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t8.ipe | 0 {2007/7-stromy => 8-ds}/treepic/t9.ipe | 0 19 files changed, 295 insertions(+) create mode 100644 5-cesty/5-cesty.tex create mode 100644 5-cesty/Makefile create mode 100644 8-ds/8-ds.tex create mode 100644 8-ds/Makefile rename {2007/7-stromy => 8-ds}/treepic/t1.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t10.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t11.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t12.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t12y.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t13.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t2.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t3.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t35.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t4.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t5.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t6.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t7.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t8.ipe (100%) rename {2007/7-stromy => 8-ds}/treepic/t9.ipe (100%) diff --git a/5-cesty/5-cesty.tex b/5-cesty/5-cesty.tex new file mode 100644 index 0000000..0575879 --- /dev/null +++ b/5-cesty/5-cesty.tex @@ -0,0 +1,121 @@ +\input ../lecnotes.tex + +\prednaska{5}{Nejkrat¹í cesty}{} + +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}$ +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 +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: + +\itemize\ibull +\:$d(u, u) = 0$, +\:$d(u, v) \leq d(u, w) + d(w, v)$ (trojúhelníková nerovnost). +\endlist + +To nemusí obecnì platit (kazí nám to záporné cykly), proto budeme studovat +pouze grafy, v~nich¾ záporné cykly neexistují. Pak u¾ budou obì vlastnosti +splnìny, jak plyne napøíklad z~následujícího lemmatu: + +\s{Lemma:} +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 $l(c) \geq 0 \Rightarrow l(u\dots v\dots w) \leq l(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 + +\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 $l(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)$. +\endlist + +\s{Definice:} $D_k(v):=$ minimální délka ze 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)$ + +Kdy¾ známe $D_0 \dots D_{k-1}$ spoèteme $D_k=\min D_{k-1}(u)+l(u, v)$. + +Naivní implementace pobì¾í $n(\sum_v deg^+(v))+n$ (musíme pøièíst na +konec $n$ za izolované vrcholy), úpravíme $\sum_v 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. + +\s{Bellman-Fordùv algoritmus} +\algo +\:$D(*) \leftarrow \infty, D(s) \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)+l(v, w))$ +\endalgo + +Pokud by i v $n$-tém kroku nìco vykonal, graf obsahuje záporný cyklus. + +\s{Vìta:} Bellman--Fordùv algoritmus najde v èase $\Theta(nm)$ vzdálenosti $d(v_0, v)$ +pro $\forall 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)+l(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. +\endlist +\qed + +\s{"Prùzkumnický algoritmus"} +Stav: $D(v)$ je ohodnoceníí, $S(v)$ stav (vidìn, otevøen -- od posledního prozkoumání +se $D(v)$ zmìnilo, zavøen není potøeba zkoumat znovu, nic by se nezmìnilo). + +\algo +\:$D(*)\leftarrow \infty, D(v_0)=0, S(*)\leftarrow N, S(v_0)\leftarrow O, +P(*)\leftarrow ?$ +\:Dokud $\exists u$: $S(u)=O$ opakuj: +\::$S(u)\leftarrow Z$ +\::Pro $\forall v: (u, v)\in E(G)$: +\:::Je-li $D(u)+l(u, v) v \right)$. + +\s{Pøíklady binárních vyhledávacích stromù:} + +\treepic{2} + +\break + +Jak budou tedy vypadat operace {\it Find}, {\it Insert} a {\it Delete} na~binárním +vyhledávacím stromu? + +{\bo Find$(v,x)$:} +\algo +\:Pokud $v = \emptyset \Rightarrow$ vrátíme $\emptyset$. +\:Pokud $v = x \Rightarrow$ vrátíme $v$. +\:Pokud $v < x \Rightarrow$ vrátíme $\(p(v),x)$. +\:Pokud $v > x \Rightarrow$ vrátíme $\(l(v),x)$. +\endalgo + +{\bo Insert$(v,x)$:} +\algo +\:Jako \ a na~konci pøidáme list. +\endalgo + +{\bo Delete$(v)$:} +\algo +\:Pokud $v$ je list $\Rightarrow$ jednodu¹e list utrhneme. +\:Pokud $v$ má jednoho syna $\Rightarrow$ vrchol \uv{vyøízneme}. +\:Jinak má $v$ oba syny $\Rightarrow$ do vrcholu vlo¾íme minimum z $P(v)$, co¾ bude list, a ten utrhneme. +\endalgo + +\s{Poznámka:} Pokud má vrchol $v$ pøi operaci {\it Delete} oba syny, je vlo¾ení minima +z $P(v)$ ekvivalentní s~vlo¾ením maxima z $L(v)$. + +\s{Pøíklady operací {\it Insert} a {\it Delete} na~BVS:} +\treepic{1} +\treepic{3} + +\break È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, nebo +$\Theta(\log{n})$ kdy¾ bude strom pìknì vyvá¾enì vystavì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 + +\h{Vyvá¾ené binární vyhledávací stromy} + +\s{Definice:} {\I Dokonalá vyvá¾enost:} Strom je dokonale vyvá¾ený, pokud pro v¹echny +jeho vrcholy platí: $\left \vert \vert L(v)\vert - \vert P(v)\vert \right \vert \leq 1 +$. + +Takto definovaný binární strom bude mít urèitì logaritmickou hloubku. Jak takový strom +ale konstruovat? To se nám podaøí buï staticky, nebo na~nìm budou operace dra¾¹í ne¾ +$\Theta(\log{n})$. + +\s{Statická konstrukce dokonale vyvá¾eného BVS:} Vybereme prostøední prvek ze +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ï Insert nebo Delete v dokonale vyvá¾eném BVS trvají $\Omega(n)$ (ve +skuteènosti oba, ale dùkaz je mnohem 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. Bez újmy na obecnosti mù¾eme pøedpokládat, ¾e 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ì +je $(n+1)/2$. Tedy aspoò jedna z operací Insert nebo Delete trvá $\Theta (n)$. + +Vidíme tedy, ¾e to ná¹ problém pøíli¹ neøe¹í. Potøebovali bychom, aby se strom dal +také efektivnì udr¾ovat. Zkusíme proto slab¹í podmínku: + +\s{Definice:} {\I Hloubková vyvá¾enost:} Strom je hloubkovì vyvá¾ený, pokud pro +v¹echny jeho vrcholy platí: $\left \vert h(L(v)) - h(P(v)) \right \vert \leq 1 $. + +Stromùm s~hloubkovým vyvá¾ením se øíká {\I AVL stromy} (objeviteli je ru¹tí +matematikové G. M. Adelson-Velsky a E. M. Landis, podle nich jsou také pojmenovány) a +platí o~nich následující lemma: + +\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$. +Staèí ukázat, ¾e $A_k$ roste exponenciálnì. Podívejme se na minimální AVL stromy: +$$\eqalign{ +A_0 &= 1 \cr +A_1 &= 2 \cr +A_2 &= 4 \cr +A_3 &= 7 \cr +&\vdots \cr +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 exponenciálnì S výhodou mù¾eme vyu¾ít toho, +¾e na první pøedná¹ce jsme si ji¾ dokázali, ¾e Fibonacciho èísla rostou exponenciálnì. +Nicménì pro zapomnìtlivé mù¾eme dùkaz ve struènosti zopakovat: + +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} +\over 2} + 2^{{k - 2} \over 2} = 2^{k \over 2} \cdot (2^{-{1 \over 2}} + 2^{-1}) \cong +2^{k \over 2} \cdot 1.21 > 2^{k \over 2}.$ + +Tímto jsme dokázali, ¾e na~ka¾dé hladinì je minimálnì exponenciálnì vrcholù, co¾ nám +zaruèuje hloubku $ \Theta(\log{n})$. +\qed + +\bye diff --git a/8-ds/Makefile b/8-ds/Makefile new file mode 100644 index 0000000..c3978cf --- /dev/null +++ b/8-ds/Makefile @@ -0,0 +1,3 @@ +P=8-ds + +include ../Makerules diff --git a/2007/7-stromy/treepic/t1.ipe b/8-ds/treepic/t1.ipe similarity index 100% rename from 2007/7-stromy/treepic/t1.ipe rename to 8-ds/treepic/t1.ipe diff --git a/2007/7-stromy/treepic/t10.ipe b/8-ds/treepic/t10.ipe similarity index 100% rename from 2007/7-stromy/treepic/t10.ipe rename to 8-ds/treepic/t10.ipe diff --git a/2007/7-stromy/treepic/t11.ipe b/8-ds/treepic/t11.ipe similarity index 100% rename from 2007/7-stromy/treepic/t11.ipe rename to 8-ds/treepic/t11.ipe diff --git a/2007/7-stromy/treepic/t12.ipe b/8-ds/treepic/t12.ipe similarity index 100% rename from 2007/7-stromy/treepic/t12.ipe rename to 8-ds/treepic/t12.ipe diff --git a/2007/7-stromy/treepic/t12y.ipe b/8-ds/treepic/t12y.ipe similarity index 100% rename from 2007/7-stromy/treepic/t12y.ipe rename to 8-ds/treepic/t12y.ipe diff --git a/2007/7-stromy/treepic/t13.ipe b/8-ds/treepic/t13.ipe similarity index 100% rename from 2007/7-stromy/treepic/t13.ipe rename to 8-ds/treepic/t13.ipe diff --git a/2007/7-stromy/treepic/t2.ipe b/8-ds/treepic/t2.ipe similarity index 100% rename from 2007/7-stromy/treepic/t2.ipe rename to 8-ds/treepic/t2.ipe diff --git a/2007/7-stromy/treepic/t3.ipe b/8-ds/treepic/t3.ipe similarity index 100% rename from 2007/7-stromy/treepic/t3.ipe rename to 8-ds/treepic/t3.ipe diff --git a/2007/7-stromy/treepic/t35.ipe b/8-ds/treepic/t35.ipe similarity index 100% rename from 2007/7-stromy/treepic/t35.ipe rename to 8-ds/treepic/t35.ipe diff --git a/2007/7-stromy/treepic/t4.ipe b/8-ds/treepic/t4.ipe similarity index 100% rename from 2007/7-stromy/treepic/t4.ipe rename to 8-ds/treepic/t4.ipe diff --git a/2007/7-stromy/treepic/t5.ipe b/8-ds/treepic/t5.ipe similarity index 100% rename from 2007/7-stromy/treepic/t5.ipe rename to 8-ds/treepic/t5.ipe diff --git a/2007/7-stromy/treepic/t6.ipe b/8-ds/treepic/t6.ipe similarity index 100% rename from 2007/7-stromy/treepic/t6.ipe rename to 8-ds/treepic/t6.ipe diff --git a/2007/7-stromy/treepic/t7.ipe b/8-ds/treepic/t7.ipe similarity index 100% rename from 2007/7-stromy/treepic/t7.ipe rename to 8-ds/treepic/t7.ipe diff --git a/2007/7-stromy/treepic/t8.ipe b/8-ds/treepic/t8.ipe similarity index 100% rename from 2007/7-stromy/treepic/t8.ipe rename to 8-ds/treepic/t8.ipe diff --git a/2007/7-stromy/treepic/t9.ipe b/8-ds/treepic/t9.ipe similarity index 100% rename from 2007/7-stromy/treepic/t9.ipe rename to 8-ds/treepic/t9.ipe -- 2.39.2