]> mj.ucw.cz Git - ads1.git/commitdiff
Merge branch 'master' of git+ssh://git.ucw.cz/home/mj/GIT/ads
authorMartin Mares <mj@ucw.cz>
Thu, 24 Feb 2011 12:40:38 +0000 (13:40 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 24 Feb 2011 12:40:38 +0000 (13:40 +0100)
11-stromy/11-stromy.tex
12-hash/12-hash.tex
2-ram/2-ram.tex
3-dfs/3-dfs.tex
3-dfs/imgn_nei.eps [new file with mode: 0644]
3-dfs/imgn_o4.eps [new file with mode: 0644]
6-kostry/6-kostry.tex [new file with mode: 0644]
6-kostry/Makefile [new file with mode: 0644]
8-rozdel/8-rozdel.tex

index 5251fadbe6ed27f495e6712f5fef528813268826..173c36c2b73e16a806b0c0f7fb51ecbda30e7301 100644 (file)
 
 \prednaska{11}{Vyhledávací stromy}{}
 
-Pøedstavme si následující problém: cheme si udr¾ovat urèitá setøídìná data, napøíklad slovník. Polo¾kami jsou uspoøádané dvojice (klíè, hodnota). Klíèe jsou unikátní a jsou to prvky nìjakého lineárnì uspoøádaného universa.
+Pøedstavme si následující problém: potøebujeme si udr¾ovat urèitá setøídìná data, napøíklad slovník. Polo¾kami jsou uspoøádané dvojice (klíè, hodnota). Klíèe jsou unikátní a jsou to prvky nìjakého lineárnì uspoøádaného universa. Hodnoty mohou být libovolné.
 
 Na na¹ich datech budeme chtít provádìt následující operace: 
 \itemize\ibull
-\:{\it Insert} vlo¾it novou polo¾ku
-\:{\it Delete} smazat polo¾ku
-\:{\it Find} najít polo¾ku
-\:{\it Max $\&$ Min} vybrat polo¾ku s~nejvìt¹ím, resp. nejmen¹ím klíèem
-\:{\it Pred $\&$ Succ} vybrat polo¾ku s~klíèem o~jedna men¹ím, resp. vìt¹ím
+\:{\it Insert} -- vlo¾it novou polo¾ku
+\:{\it Delete} -- smazat polo¾ku
+\:{\it Find} -- najít polo¾ku
+\:{\it Max $\&$ Min} -- vybrat polo¾ku s~nejvìt¹ím, resp. nejmen¹ím klíèem
+\:{\it Pred $\&$ Succ} -- vybrat polo¾ku s~klíèem nejbli¾¹ím men¹ím, resp. vìt¹ím
 \endlist
 
-Jak by vypadalo nejjednodu¹¹í øe¹ení? Staticky bychom data mohli udr¾ovat v~setøídìném poli. Takové pole se vyrobí v~èase $\Theta(n \cdot log{n})$. Operace {\it Find} by trvala $\Theta(log{n})$ (vyhladávali bychom samozøejmì binárnì). Ale problém by nastal s~operacemi {\it Insert} a {\it Delete}, které by se takto implementovat nedaly, nebo by trvaly hodnì dlouho (napø. v~pøípadì {\it Insert} bychom museli celé pole pøestavìt).
+Jak by vypadalo nejjednodu¹¹í øe¹ení? Staticky bychom data mohli udr¾ovat v~setøídìném poli. Takové pole se vyrobí v~èase $\Theta(n \cdot \log{n})$. Operace {\it Find} by trvala $\Theta(\log{n})$ (vyhledávali bychom samozøejmì binárnì). Ale problém by nastal s~operacemi {\it Insert} a {\it Delete}, které by se takto implementovat nedaly, nebo by trvaly hodnì dlouho (napø. v~pøípadì {\it Insertu} bychom museli celé pole pøestavìt).
 
 \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.
 
@@ -29,13 +29,13 @@ Jak by vypadalo nejjednodu
 
 \s{Definice:} Pro vrchol $v$ znaèíme:
 \itemize\ibull
-\:$l(v)$ a $p(v)$ levý a pravý syn vrcholu $v$
-\:$L(v)$ a $P(v)$ levý a pravý podstrom vrcholu $v$
-\:$S(v)$ pøíslu¹ný podstrom s~koøenem $v$
-\:$h(v)$ hloubka stromu $S(v)$, neboli délka nejdel¹í cesty z koøene do listu
+\:$l(v)$ a $p(v)$ -- levý a pravý syn vrcholu $v$
+\:$L(v)$ a $P(v)$ -- levý a pravý podstrom vrcholu $v$
+\:$S(v)$ -- pøíslu¹ný podstrom s~koøenem $v$
+\:$h(v)$ -- hloubka stromu $S(v)$, neboli délka nejdel¹í cesty z koøene do listu
 \endlist
 
-\s{Definice:} {\I Binární vyhledávací strom} (BVS): Binární strom je vyhledávací, pokud v~ka¾dém vrcholu je ulo¾ena dvojice (klíè, hodnota) [ztoto¾níme vrchol s~klíèem] a pro v¹echny vrcholy platí: $\forall u \in L(v) : u < v $ $\&$ $ \forall u \in P(v) : u > v$.
+\s{Definice:} {\I Binární vyhledávací strom} (BVS): Binární strom je vyhledávací, pokud v~ka¾dém vrcholu je ulo¾ena dvojice (klíè, hodnota) [ztoto¾níme vrchol s~klíèem] a pro v¹echny vrcholy platí: $\left ( \forall u \in L(v) : u < v \right ) $ $ \&$ $ \left ( \forall u \in P(v) : u > v \right )$.
 
 \s{Pøíklady binárních vyhledávacích stromù:}
 
@@ -49,8 +49,8 @@ Jak budou tedy vypadat operace {\it Find}, {\it Insert} a {\it Delete} na~bin
 \algo
 \:Pokud $v = \emptyset \Rightarrow$ vrátíme $\emptyset$.
 \:Pokud $v = x \Rightarrow$ vrátíme $v$.
-\:Pokud $v < x \Rightarrow$ vrátíme $Find(p(v),x)$.
-\:Pokud $v > x \Rightarrow$ vrátíme $Find(l(v),x)$.
+\:Pokud $v < x \Rightarrow$ vrátíme $\<Find>(p(v),x)$.
+\:Pokud $v > x \Rightarrow$ vrátíme $\<Find>(l(v),x)$.
 \endalgo
 
 {\bo Insert$(v,x)$:}
@@ -62,7 +62,7 @@ Jak budou tedy vypadat operace {\it Find}, {\it Insert} a {\it Delete} na~bin
 \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.
+\: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)$.
@@ -72,21 +72,21 @@ Jak budou tedy vypadat operace {\it Find}, {\it Insert} a {\it Delete} na~bin
 \treepic{3}
 
 \break
-È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, 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
+È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, 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 a nebo na~nìm budou operace dra¾¹í ne¾ $\Theta(\log{n})$.
+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 medián posloupnosti a dáme ho do~koøene stromu. Jeho syny pak vystavíme rekurzivnì z~levé a pravé pùlky pole.
+\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)$.
 
 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} a platí o~nich následující lemma:
+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}) $.
 
@@ -101,7 +101,10 @@ A_3 &= 7 \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~hloubce $k - 1$ a $k - 2$.
+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í:
index 01ca78f12a01cc6c6db091b17e7a75172913fb76..f12db20de4fb00cfd3d6df22c3492622d0f790e3 100644 (file)
@@ -4,22 +4,22 @@
 
 V pøedchozích kapitolách jsme se zabývali tøídìním prvkù a zjistili jsme, ¾e v obecném pøípadì (kdy¾ smíme prvky pouze porovnávat a prohazovat) nelze tøídit rychleji ne¾ v èase $\Theta(n\log n)$. Zároveò jsme do¹li k tomu, ¾e pokud víme o prvcích nìco více (napø. jejich rozsah), tak jsme v nìkterých pøípadech schopni tøídit i s lineární èasovou slo¾itostí. 
 
-V praxi nicménì vìt¹inou netøídíme samotná èísla, ale spí¹e nìjaké polo¾ky, napø. urèené uspoøádanou dvojicí (klíè, hodnota), kde klíèe jsou unikátní a existuje na nich lineární uspoøádání. Ukázali jsme si, jak takovouto mno¾inu udr¾ovat (aby se v ní dalo rychle vyhledávat, zaøazovat i mazat) ve vyhledávacích stromech. Dokázali jsme si, ¾e pokud budeme udr¾ovat strom dostateènì vyvá¾ený, tak budou jednotlivé operace (\<Find>, \<Insert> a \<Delete>) trvat $\Theta(\log n)$.
+V praxi nicménì vìt¹inou netøídíme samotná èísla, ale spí¹e nìjaké polo¾ky, napø. urèené uspoøádanou dvojicí (klíè, hodnota), kde klíèe jsou unikátní a existuje na nich lineární uspoøádání. Ukázali jsme si, jak takovouto mno¾inu udr¾ovat (aby se v ní dalo rychle vyhledávat, zaøazovat i mazat) ve vyhledávacích stromech. Dokázali jsme, ¾e pokud budeme udr¾ovat strom dostateènì vyvá¾ený, tak budou jednotlivé operace (\<Find>, \<Insert> a \<Delete>) trvat $\Theta(\log n)$.
 
-Ne¹lo by to ale rychleji? Odpovìï je jak kdy. Podívejme se na dal¹í mo¾nosti. Nejdøíve si ale pøipomeòme základní pojmy, které budeme pou¾ívat.
+Ne¹lo by to ale rychleji? Odpovìï je \uv{jak kdy}. Podívejme se na dal¹í mo¾nosti. Nejdøíve si ale pøipomeòme základní pojmy, které budeme pou¾ívat.
 
-Klíèe budou prvky universa, co¾ je mno¾ina $\{ 0, \dots, U-1 \}$, kterou budeme oznaèovat $[U]$. Tuto mno¾inu budeme chtít udr¾ovat v nìjaké ¹ikovné datové struktuøe, abychom v ní mohli rychle vyhladávat, zaøazovat i mazat. Dále $n$ bude znaèit (maximální) poèet prvkù, které si budeme v jednu chvíli pamatovat.
+Klíèe budou prvky universa, co¾ je mno¾ina $\{ 0, \dots, U-1 \}$, kterou budeme oznaèovat $[U]$. Tuto mno¾inu budeme chtít udr¾ovat v nìjaké ¹ikovné datové struktuøe, abychom v ní mohli rychle vyhledávat, zaøazovat i mazat. Dále $n$ bude znaèit (maximální) poèet prvkù, které si budeme v jednu chvíli pamatovat.
 
 
 \h{1. Pole {\it indexované od $0$ do $U-1$}}
 
-Pokud bude velikost universa dostateènì malá, tak si mù¾eme polo¾ky pamatovat v poli o velikosti universa. Operace \<Find>, \<Insert> i \<Delete> pracují v~èase $\O(1)$, ale platíme za~to pamì»ovou slo¾itostí $\O(U)$. Kdy¾ uvá¾íme, ¾e si budeme pamatovat mnohem ménì prvkù, ne¾ je velikost universa, tak je to velké plýtvání.
+Pokud bude velikost universa dostateènì malá, tak si mù¾eme polo¾ky pamatovat v poli o velikosti universa. Operace \<Find>, \<Insert> i \<Delete> pracují v~èase $\O(1)$, ale platíme za~to pamì»ovou slo¾itostí $\Theta(U)$. Kdy¾ uvá¾íme, ¾e si budeme pamatovat mnohem ménì prvkù, ne¾ je velikost universa, tak je to velké plýtvání.
 
 \h{2. Èíslicový strom}
 
 Zvolíme vhodný základ soustavy $b$, klíè zapí¹eme v soustavì o základu $b$ a zápis ulo¾íme do stromu. Tímto nám vznikne \uv{$b$-ární strom}, tedy strom, jeho¾ ka¾dý vrchol má a¾ $b$ synù.
 
-Vrcholy na první hladinì pak znaèí první èíslici, na druhé druhou, atd. Na poslední hladinì bude tedy $n$ listù. Hloubka tohoto stromu je $\lceil\log_b U\rceil$.
+Na první hladinì se vìtvíme podle první èíslice, na druhé podle druhé, atd. Na poslední hladinì bude tedy $n$ listù. Hloubka tohoto stromu je $\lceil\log_b U\rceil$.
 
 Operace \<Find> bude trvat $O(\log_b U)$ (najití jednoho klíèe odpovídá projití jedné cesty ve stromì od koøene do listu). Stejný èas budou trvat i operace \<Insert> a \<Delete>. (Pøi vkládání zakládáme vrcholy, které odpovídají na¹emu klíèi a které je¹tì nejsou zalo¾ené. Pøi mazání sma¾eme list a následnì vrcholy, ze kterých nic nevede. Pro tuto operaci je výhodné si ve vrcholech udr¾ovat jejich stupnì.) Strom zabere prostor velikosti $O(nb\log_b U)$. 
 
@@ -27,7 +27,7 @@ Operace \<Find> bude trvat $O(\log_b U)$ (najit
 Èím bude základ $b$ men¹í, tím bude lep¹í pamì»ová a hor¹í èasová slo¾itost
 a obrácenì. Èíslicový strom tedy vy¾aduje peèlivé nastavení parametrù.
 
-\s{Pøíklad:} Pøedstavme si, ¾e klíèe budou IP-adresy, tedy 32-bitová èísla. Jak zvolit $b$, aby byla èasová i pamì»ová slo¾itost pøijatelná? Zkusme rozdìlit IP-adresu na 4 kusy, $b$ bude tedy 256. Strom bude mít hloubku 4. Èas bude v poødáku, ale po¾adavky na prostor jsou dost vysoké. Výhodnìj¹í bude rozdìlit IP-adresu na 8 èástí, $b$ bude tedy 16, hloubka stromu 8 a nároky na èas i pamì» jsou pøijatelné.
+\s{Pøíklad:} Pøedstavme si, ¾e klíèe budou IP-adresy, tedy 32-bitová èísla. Jak zvolit $b$, aby byla èasová i pamì»ová slo¾itost pøijatelná? Zkusme rozdìlit IP-adresu na 4 kusy, $b$ bude tedy 256. Strom bude mít hloubku 4. Èas bude v poøádku ($\log_b U = 4$), ale po¾adavky na prostor jsou dost vysoké($nb\log_b U = n \cdot 256\cdot 4 = 1024$). Výhodnìj¹í bude rozdìlit IP-adresu na 8 èástí, $b$ bude tedy 16, hloubka stromu 8 a nároky na èas i pamì» jsou pøijatelné, nebo» $\log_b U = 8$ a $nb\log_b U = n\cdot 16 \cdot 8 = 128$.
 
 
 \h{4. Hashování }
@@ -41,42 +41,42 @@ Probl
 Jak se dá tedy kolizím bránit? Nejvýhodnìj¹í by bylo mít dobrou hashovací funkci, která by mapovala prvky pokud mo¾no rovnomìrnì. Ale nìkdy staèí i prùmìrnì dobrá funkce a dostateènì náhodné klíèe.
 
 
-\s{Vsuvka:} Jaká je pravdìpodobnost, ¾e 2 z k lidí mají narozeniny ve stejný den? Staèí 23 lidí, aby nastala kolize s pravdìpodobností vìt¹í ne¾ jedna polovina. Aby nenastala, potøebovali bychom vìt¹í poèet pøihrádek: $p = cm^2$.
+\s{Vsuvka:} Jaká je pravdìpodobnost, ¾e 2 z k lidí mají narozeniny ve stejný den? Staèí 23 lidí, aby nastala kolize s pravdìpodobností vìt¹í ne¾ jedna polovina. Aby nenastala, potøebovali bychom vìt¹í poèet pøihrádek: $m \approx n^2$.
 
 \h{Praktické hashovací funkce}
 
 \s{První pøíklad}
 
-Tato hashovací funkce $h: [U] \rightarrow [m]$ je definovaná pøedpisem: $h(x) = x \mod m$. Pro dostateènì náhodné hodnoty bude fungovat, ale v mnoha pøípadech mù¾e být nevhodná. Napøíklad je zøejmé, ¾e pro sudé $m$ zachovává paritu. V pøípadì, ¾e sudých, resp. lichých klíèù bude mnohem více, vznikne mnoho zbyteèných kolizí. Pro takovouto hashovací funkci je nejlep¹í zvolit za $m$ nìjaké prvoèíslo.
+Tato hashovací funkce $h: [U] \rightarrow [m]$ je definovaná pøedpisem: $h(x) = x \mod m$. Pro dostateènì náhodné hodnoty bude fungovat, ale v mnoha pøípadech mù¾e být nevhodná. Napøíklad je zøejmé, ¾e pro sudé $m$ zachovává paritu. V pøípadì ¾e sudých, resp. lichých klíèù bude mnohem více, vznikne mnoho zbyteèných kolizí. Pro takovouto hashovací funkci je nejlep¹í zvolit za $m$ nìjaké prvoèíslo.
 
 \s{Druhý pøíklad}
 
 Zvolme si iracionální $\alpha$ z intervalu $(0,1)$. Funkce bude definovaná následovnì: $$h(x) = \lfloor m (x \cdot \alpha \mod 1) \rfloor.$$ Tato funkce by mìla na $x$ záviset velmi málo, ale nebudeme si to dokazovat.
 
-\s{Implementace} Reálná èísla se samozøejmì implementují dosti nároènì (resp. to vùbec nejde), tak¾e v praxi se tento postup aproximuje celoèíselnì. Místo reálné $\alpha$ si zvolme $A = \lfloor \alpha \cdot 2^w \rfloor$, kde $2^w$ je ¹íøka slova ($w$ je napø. poèet bitù integeru). Potom místo výrazu $(x \cdot \alpha \mod 1)$, který je z intervalu $(0,1)$, budeme poèítat s výrazem $(x \cdot A \mod 2^w)$. Potom na¹e funkce vyjde následovnì:
+\s{Implementace:} Reálná èísla se samozøejmì implementují dosti nároènì (resp. to vùbec nejde), tak¾e v praxi se tento postup aproximuje celoèíselnì. Místo reálné $\alpha$ si zvolme $A = \lfloor \alpha \cdot 2^w \rfloor$, kde $2^w$ je ¹íøka slova ($w$ je napø. poèet bitù integeru). Potom místo výrazu $(x \cdot \alpha \mod 1)$, který je z intervalu $(0,1)$, budeme poèítat s výrazem $(x \cdot A \mod 2^w)$. Potom na¹e funkce vyjde následovnì:
 
-$$h(x) = \lfloor { m(x \cdot A \mod 2^w) \over 2^w } \rfloor$$
+$$h(x) = \left \lfloor { m(x \cdot A \mod 2^w) \over 2^w } \right \rfloor$$
 
 
-Zbývá jen otázka, jak volit $\alpha$? Osvìèená hodnota je ${1 \over \tau }$, co¾ je pøibli¾nì 0,618. ($\tau$ je hodnota zlatého øezu.) Takto zvolené $\alpha$ dobøe rozbíjí aritmetické posloupnosti, ale i toto je pouze pøedstava a nebudeme si to dokazovat.
+Zbývá jen otázka, jak volit $\alpha$? Osvìèená hodnota je $1/\tau$, co¾ je pøibli¾nì 0,618. ($\tau$ je hodnota zlatého øezu.) Takto zvolené $\alpha$ dobøe rozbíjí aritmetické posloupnosti, ale i toto je pouze pøedstava a nebudeme si to dokazovat.
 
 \h{Hashování øetìzcù}
 
 Vzhledem k tomu, ¾e hashování nijak speciálnì nepotøebuje, aby byly prvky èísla, tak se mohou hashovat i øetìzce. Uka¾me si jeden pøíklad funkce pro hashování øetìzcù.
-Prázdnému øetìzci pøiøaïme nulu: $h(\epsilon) = 0$. Øetìzci znakù $x_1, \dots, x_n$ pøiøaïme hodnotu:
+Prázdnému øetìzci pøiøaïme nulu: $h(\varepsilon) = 0$. Øetìzci znakù $x_1, \dots, x_n$ pøiøaïme hodnotu:
 $$h(x_1, \dots, x_n) = (h(x_1, \dots, x_{n-1}) \cdot + x_n) \mod m.$$
-$A$ je zde nìjaká konstanta. Aby se vyu¾ily v¹echny pøihrádky, tak je vhodné zvlit $A$ tak, aby $A^{{\bb E}[\<délka øetìzce>]} >> m$. Tato funkce vyu¾ívá podobných vlastností jako lineární konkurenèní generátor náhodných èísel, který pomocí vhodných konstant $A$ a $B$ a ¹íøky slova $2^w$ vyrábí nové náhodné èíslo $x'$ z minulého èísla $x$ jako $$x' = (x \cdot A + B) \mod 2^w.$$
+$A$ je zde nìjaká konstanta. Aby se vyu¾ily v¹echny pøihrádky, tak je vhodné zvlit $A$ tak, aby $A^{{\bb E}[\<délka øetìzce>]} \gg m$. Tato funkce vyu¾ívá podobných vlastností jako lineární konkurenèní generátor náhodných èísel, který pomocí vhodných konstant $A$ a $B$ a ¹íøky slova $w$ vyrábí nové náhodné èíslo $x'$ z minulého èísla $x$ jako $$x' = (x \cdot A + B) \mod 2^w.$$
 
 
 \s{Vìta} Pokud jsou $h(x_1), \dots, h(x_n)$ rovnomìrnì náhodné, pak $$\forall i: {\bb E}[\<poèet prvkù v i-té pøihrádce>] = {n \over m}.$$
 
 \proof
 Poèet prvkù v $i$-té pøihrádce si oznaème $N_i$. Definujme si indikátor $P_{ij}$, který je roven 1, pokud $x_j$ padlo do $i$-té pøihrádky, jinak je roven 0.
-Vidíme, ¾e poèet prvkù v $i$-té pøihrádce je souèet $P_{ij}$ pøes v¹echny $j$.
+Vidíme, ¾e poèet prvkù v $i$-té pøihrádce je souèet $P_{ij}$ pøes v¹echna $j$.
 $$N_i = \sum_{j} P_{i,j}.$$
-Teï ji¾ staèí upravit následující výrazy. Vyu¾ijeme mimo jiné vìtu o linearitì støední hodnoty.
-$${\bb E}[P_{ij}] = {1 \over m} \cdot 1 + (1 - {1 \over m}) \cdot 0 = {1 \over m}.$$
-$${\bb E}[N_i] = {\bb E}[\sum_{j} P_{i,j}] = \sum_{j} {\bb E}[P_{i,j}] = {n \over m}.$$
+Dále vyu¾ijeme mimo jiné vìtu o linearitì støední hodnoty.
+$${\bb E}[P_{ij}] = {1 \over m} \cdot 1 + \left(1 - {1 \over m} \right) \cdot 0 = {1 \over m}.$$
+$${\bb E}[N_i] = {\bb E}\left[\sum_{j} P_{i,j}\right] = \sum_{j} {\bb E}[P_{i,j}] = {n \over m}.$$
 \qed
 
 \s{Dùsledek:} Pokud bude $n$ pøibli¾nì stejnì velké jako $m$, tak v ka¾dé pøihrádce bude prùmìrnì jeden prvek.
index ae78ad8c14fcbb5f37b02753cea8152a68189244..71c3a25fa0a7b695387fc56f95b9ee73a227273c 100644 (file)
@@ -11,27 +11,29 @@ je v
 
 \s{Definice:} Random Access Machine ({\sc Ram})
 
-{\sc Ram} poèítá jen s èísly -- znaky, stringy a podobnì reprezentujeme
+{\sc Ram} poèítá jen s celými èísly -- znaky, stringy a podobnì reprezentujeme
 èísly, jejich posloupnostmi atd. Pamì» je tvoøena buòkami, které obsahují
 èísla. Pamì»ové buòky jsou adresované takté¾ èísly. A program samotný je
 koneèná posloupnost instrukcí následujících druhù:
 \itemize\ibull
 \:Aritmetické a logické:
-$X \leftarrow Y \oplus Z, \oplus\in\{+, -, \times, \div,\mod, \&\&, \|, <<,
->>\}$
-\:Skoky: goto LABEL
-\:Podmínky: pro libovolnou nepodmínìnou instrukci mù¾u pou¾ít
-if~$X~<~Y~\Rightarrow$~instrukce
-\:Øídící: goto, halt.
+$X$ |<-| $Y \oplus Z, \oplus\in\{|+|, |-|, |*|, |div|, |mod|, \&,
+{\tt\char124}, |<<|, |>>|\}$
+\:Øídící: |goto| \<label>, |halt|
+\:Podmínky: pro libovolnou nepodmínìnou instrukci mù¾u pou¾ít \hfil \break
+if~$X$~|<|~$Y$~|==>|~instrukce % Tady to prosím je¹tì zkontroluj. Myslím, ¾e
+% zápis je správný, ale sází se to divnì a vidím èerný obdélníèek na konci
+% øádku. Díky.
 \endlist
 
 \s{Poznámka} (operandy):
 \itemize\ibull
-\:Konstanty (1,2,\dots)
-\:Adresované pøímo - M[konst.] -- budeme pou¾ívat písmena A-Z jako aliasy pro
-registry -1 a¾ -26
-(tedy A=M[-1])
-\:Adresované nepøímo -- M[M[konst.]] - budeme pou¾ívat zkratku [[konst.]]
+\:Konstanty (1, 2, \dots)
+\:Adresované pøímo -- M[konst.] -- budeme pou¾ívat písmena {\tt A-Z} jako aliasy
+pro
+buòky pamìti $-1$ a¾ $-26$, které nazýváme registry.
+(tedy A={\tt M[-1]})
+\:Adresované nepøímo -- {\tt M[M[konst.]]} -- budeme pou¾ívat zkratku [[konst.]]
 \endlist
 
 Samotný výpoèet probíhá takto:
@@ -46,27 +48,31 @@ v
 
 
 \h{Slo¾itost}
-Jak dobøe popsat slo¾itost?
+\> Jak dobøe popsat slo¾itost?
 \numlist\ndotted
-\:{\sc Ram} s jednotkovou cenou: èas $\approx$ \#instrukcí, prostor $\approx$
+\:{\I {\sc Ram} s jednotkovou cenou}: èas $\approx$ \#instrukcí, prostor
+$\approx$
 maximální èíslo buòky minus minimální èíslo buòky pou¾ité pøi výpoètu.
 Toto není moc dobrý nápad, proto¾e není nijak penalizována napøíklad práce s
 velmi dlouhými èísly -- poøád je to jedna instrukce, tak¾e cena je stejná, ale
 poèítaèe se tak pøece nechovají. Velikost èísel ale omezit nesmíme, proto¾e
 bychom omezili pamì» (èísly ji adresujeme).
-\:{\sc Ram} s logaritmickou cenou: èas $\approx$ \#bitù zpracovávaných èísel,
+\:{\I{\sc Ram} s logaritmickou cenou}: cena instrukce $\approx$ \#bitù
+zpracovávaných èísel,
 prostor $\approx$ \# bitù v¹ech pou¾itých bunìk. To je teoreticky pøesné, ale
 dost nepraktické (ve v¹ech slo¾itostech by byly logaritmy).
-\:{\sc Ram} s omezenými èísly: jednotková cena instrukcí, ale èísla omezíme na
-$\leq P(n)$, $P(n)$ je polynom. Tím zmizí paradoxy prvního modelu, ale mù¾eme
-adresovat jen polynomiální prostor (to nám obvykle nevadí).
+\:{\I{\sc Ram} s omezenými èísly}: jednotková cena instrukcí, ale èísla omezíme
+nìjakým polynomem $P(n)$. Tím zmizí paradoxy prvního modelu, ale
+mù¾eme adresovat jen polynomiální prostor (to nám ov¹em obvykle nevadí).
 \endlist
 
+Nadále tedy budeme pøedpokládat tøetí zmínìný model.
+
 % Z minulých zápiskù.
 \s{Definice:}
 \itemize\ibull
-\:{\I Èas bìhu algoritmu} $t(x)$ pro vstup~$x$ mìøíme jako poèet
-elementárních operací, které program provedl pøi zpracování vstupu
+\:{\I Èas bìhu algoritmu} $t(x)$ pro vstup~$x$ mìøíme jako sumu èasù provedených
+operací, které program provedl pøi zpracování vstupu
 $x$.
 \:{\I Prostor bìhu algoritmu} $s(x)$ je analogicky poèet pamì»ových
 bunìk spotøebovaných pøi výpoètu se vstupem~$x$.
@@ -77,25 +83,23 @@ $$S(n) := \max \{s(x) ; \hbox{$x$ je vstup d
 \endlist
 
 Nyní zkusíme zanalyzovat nìjaký konkrétní algoritmus. Vezmìme napøíklad øazení
-pomocí pøímeho výbìru (selection sort). Na vstupu dostaneme v registru N poèet
-èísel, v buòkách 1\dots n je nesetøídìná posloupnost èísel. Ty pak tøídíme
-následujícím algoritmem zapsaném v pseudokódu:
+pomocí pøímeho výbìru (selection sort). Na vstupu dostaneme poèet èísel $n$ (v
+registru {\tt N}), v buòkách $1,\dots, n$ je nesetøídìná posloupnost èísel. Ta
+pak
+tøídíme následujícím algoritmem zapsaným v pseudokódu:
 \algo
 \:Pro $i=1$ do $n$:
 \::$j\leftarrow i$
 \::Pro $k=i$ do $n$:
 \:::Je-li $[k]<[j]\Rightarrow j\leftarrow k$
-\::$[i]\leftrightarrow[j]$
+\::$[i]$ prohodíme s $[j]$.
 \endalgo
 
 Jak by takový algoritmus vypadal zapsaný v instrukcích {\sc Ram}? Budeme muset
 pou¾ít návì¹tí a goto místo cyklù, jména registrù místo promìnných a
-tøeba prohození  musíme provést pøes tøetí promìnnou. Nìjak takto:
+tøeba prohození musíme provést pøes tøetí promìnnou. Nìjak takto:
 
-%Tady vá¾nì nevím jak formátovat, aby to bylo hezké. Nejvíce by se mi líbil
-% verbatim, ale jak v nìm udìlat rozumnì ¹ipeèky? Tøeba => a <- ?
-\verbatim{
-       I <- 1
+\verbatim{     I <- 1
 LOOP:  J <- I
        M <- I
 MIN:   IF [J]<[M] ==> M <- J
@@ -108,27 +112,26 @@ MIN:      IF [J]<[M] ==> M <- J
        IF I<=N ==> GOTO LOOP
 }
 
-
 Pojïme se podívat, jaká je èasová slo¾itost jednotlivých èástí algoritmu.
-Cyklus MIN provede $3\cdot (N-I+1)$ instrukcí. Mimo cyklu MIN je v LOOP je¹tì 7
-instrukcí, tedy celý LOOP provede $3\cdot (N-I+1)+7$ instrukcí. Celkovì se
-dostáváme k souètu
+Cyklus |MIN| provede $3\cdot (N-I+1)$ instrukcí. Mimo cyklu |MIN| je v |LOOP|
+je¹tì 7 instrukcí, tedy celý |LOOP| provede $3\cdot (N-I+1)+7$ instrukcí.
+Celkovì se dostáváme k souètu
 $$1+3\cdot N+7+3\cdot (N-1)+7+3\cdot (N-2)+7+3\cdot (N-3)+\dots +3\cdot 1+7 =$$
-$$1+7\dots N+3\dots {{N(N+1)}\over{2}} = {{3}\over{2}}N^2 + 8,5N + 1$$
+$$1+7\cdot N+3\cdot {{N(N+1)}\over{2}} = {{3}\over{2}}N^2 + 8{,}5N + 1$$
 
 Na multiplikativních konstantách ale nezále¾í -- zaprvé se na reálných strojích
 ceny jednotlivých (pro nás jednotkových) instrukcí stejnì li¹í, zadruhé
-asymptoticky pomalej¹í funkce stejnì pro velké N v¾dy prohraje, tak¾e nemá cenu
+asymptoticky pomalej¹í funkce nakonec pro velké $N$ v¾dy prohraje, tak¾e nemá
+cenu
 (alespoò pøi prvním pøiblí¾ení k problému) multiplikativními konstantami se
 zabývat. Tím pádem nezále¾í ani na èlenech ni¾¹í øádù:
-$$1,5N^2 + 8,5N + 1 \leq 1,5N^2 + 8,5N^2 + N^2 = 11N^2\approx N^2$$
+$$1{,}5N^2 + 8{,}5N + 1 \leq 1{,}5N^2 + 8{,}5N^2 + N^2 = 11N^2\approx N^2$$
 Kdy¾ u¾ toto víme, mù¾eme zanedbávat konstanty prùbì¾nì: $N$ cyklù po
-$\approx~N$~krocích $\Rightarrow~\approx~N^2$ krokù. To nás vede k zavedení tzv.
-{\I asymptotické notace}
+${}\approx~N$~krocích $\Rightarrow~\approx~N^2$ krokù. To nás vede k zavedení
+tzv.
+{\I asymptotické notace:}
 
 \h{Asymptotická notace}
-% Okopírováno z minulých zápiskù, lehké opravy, na konci ukazujeme select sort
-% místo E.A.
 \s{Definice:} Pro funkce $f,g: {\bb N} \rightarrow {\bb R}^+$ øekneme,
 ¾e $f$ je $\O(g)$ právì tehdy, kdy¾ $\exists c>0: \forall ^{*} n \in {\bb N}:
 f(n) \leq c \cdot g(n)$.
@@ -143,7 +146,7 @@ neplat
 funkcí, pro které platí, ¾e se dají shora odhadnout kladným násobkem funkce~$g$,
 a~psát tedy~$f\in\O(g)$, ale zvyk je bohu¾el ¾elezná ko¹ile.
 
-\s{Pøíklady:} $2.5n^{2} = \O(n^{2})$, $2.5n^{2}+30n = \O(n^{2})$.
+\s{Pøíklady:} $2{,}5n^{2} = \O(n^{2})$, $2{,}5n^{2}+30n = \O(n^{2})$.
 
 \>Také platí:
 $$
@@ -173,11 +176,12 @@ g(n)$.
 
 $\Omega$-notace tedy øíká, ¾e hodnota funkce $f$ je v¾dy stejná nebo vy¹¹í ne¾
 nìjaký $c$-násobek funkce $g$, a tedy $g=\O(f)$.
-\:$f=\Theta(g) \equiv f=O(g) \wedge f=\Omega(g)$
+\:$f=\Theta(g) \equiv f=\O(g) \wedge f=\Omega(g)$
 
 nebo výøeènìji:
 
-$f=\Theta(g) \equiv \exists$ $c_{1},c_{2} > 0: c_{1}\cdot g(n) \leq f(n) \leq
+$f=\Theta(g) \equiv \exists$ $c_{1},c_{2} > 0: \forall^* n \in {\bb
+N}: c_{1}\cdot g(n) \leq f(n) \leq
 c_{2}\cdot g(n)$ To znamená, ¾e existují nezáporné reálné konstanty
 $c_{1},c_{2}$ takové, ¾e se funkce $f(n)$ dá ohranièit $c_{1}$- a
 $c_{2}$-násobkem funkce $g(n)$.
@@ -207,7 +211,7 @@ v~exponentu), nez
 $$
 \log_k{n}={{\log_c{n}}\over{\log_c{k}}}={{1}\over{\log_c{k}}}\cdot \log_c{n},
 $$
-kde $1/\log_c{k}$ je jen konstanta, tak¾e ji mù¾eme \uv{schovat do~$\O$.}
+kde $1/\log_c{k}$ je jen konstanta, tak¾e ji mù¾eme \uv{schovat do~$\O$}.
 
 \s{Pøíklad:} Select sort (rozebraný vý¹e):
 Kdy¾ jej pustíme na $n$ èísel, pak èasová slo¾itost je $T(n) = \Theta(n^2)$ a
@@ -218,20 +222,23 @@ Dal
 následující pøíklady lze (i kdy¾ to tak obèas na první pohled nevypadá) øe¹it
 nìjakým grafovým algoritmem:
 \itemize\ibull
-\:Mám mapku silnièní sítì, v ní oznaèené \uv{Doma} a \uv{©kola}. Dostanu se do
+\:Mám mapku silnièní sítì, v ní místa (vrcholy) oznaèená \uv{Doma} a \uv{©kola}.
+Dostanu se do
 ¹koly (le¾í ve stejné komponentì souvislosti)? Dostanu se do ¹koly, kdy¾ v zimì
 napadne hodnì snìhu a nìkteré cesty budou neprùjezdné? A jaký nejkrat¹í úsek
 cest musí silnièáøi prohrnout, aby byla v¹echna místa na mapì dostupná?
-\:Mìjme hlavolam \uv{Lloydova devítka} -- krabièku $3\times3$ s ètvereèky
+\:Mìjme hlavolam \uv{Lloydova devítka} -- krabièku $3\times3$ se ètvereèky
 oznaèenými èísly od jedné do osmi a jednou mezerou, ètvereèky jsou zamíchané a
-na¹ím úkolem je správnì je seøadit. Jak to udìlat? Kolik nejménì krokù nám na
+na¹ím úkolem je správnì je seøadit pomocí pøesouvání ètvereèkù sousedících s
+mezerou do této mezery. Jak to udìlat? Kolik nejménì krokù nám na
 to staèí? Jde to vùbec se zadáním, které jsme dostali?
 \:Jaké je nejkrat¹í (kladné, celé) èíslo v desítkové soustavì zapsané jen
-èíslicemi 1, 0 dìlitelné tøemi? Nakreslíme orientovaný graf s vrcholy 1 a¾ 13
-a hranami $(x,y),$ $y=10\cdot x \mod 13$ a $y=(10\cdot x + 1) \mod 13$ (z
-ka¾dého vrcholu vychází jedna hrana za pøidání èíslice 1 a dal¹í za èíslici 0).
-Hledané èíslo existuje právì tehdy, kdy¾ graf obsahuje orientovaný sled z 0 do
-1. Jakým algoritmem takový sled najdeme?
+èíslicemi 1, 0, které je dìlitelné tøinácti? Nakreslíme orientovaný graf s
+vrcholy 0 a¾ 12
+a hranami $(x,y),$ $y=10\cdot x \mod 13$ a $y=(10\cdot x + 1) \mod 13$
+(z~ka¾dého vrcholu vychází jedna hrana za pøidání èíslice 1 a dal¹í za èíslici
+0). Hledané èíslo existuje právì tehdy, kdy¾ graf obsahuje orientovaný sled
+z~1~do~0. Jakým algoritmem takový sled najdeme?
 \endlist
 Podobné a dal¹í úlohy budeme øe¹it v následujících kapitolách.
 
index 7fce756e9cf82af3b03d417a3dcac9a7528e564b..b183ac4a225787ec8ddb832897bae9aa892b8461 100644 (file)
@@ -2,16 +2,19 @@
 
 \prednaska{3}{Prohledání do~¹íøky a do~hloubky}{()}
 
-\h{Prohledání do~¹íøky (BFS) {\I Breadth First Search} }
+\h{Prohledání do~¹íøky (BFS) {\I Breadth-First Search} }
 
 Jde o grafový algoritmus, který postupnì prochází v¹echny vrcholy v~dané komponentì souvislosti.
-Algoritmus nejprve projde v¹echny sousedy poèáteèního vrcholu, poté sousedy sousedù, atd...
+Algoritmus nejprve projde v¹echny sousedy poèáteèního vrcholu, poté sousedy sousedù, atd\dots
 Díky tomuto zpùsobu procházení se nìkdy té¾ nazývá \uv{\I algoritmus vlny }, nebo» se z~poèáteèního vrcholu ¹íøí pomyslná vlna, která v~ka¾dém kroku nalezne v¹echny uzly, které mají od~poèáteèního vrcholu stejnou vzdálenost. Algoritmus se tedy skvìle hodí napøíklad pro hledání nejkra¹í cesty mezi dvìma vrcholy v~grafu.
 \figure{praseci-graf.eps}{Praseèí graf}{55mm}
 
 
 \s{Popis algoritmu:}
-Na zaèátku si vlo¾íme do~fronty $Q$ poèáteèní vrchol $v_0$. Dále si v~poli $Z$ budeme pro ka¾dý vrchol pamatovat znaèku, zda jsme ho ji¾ nav¹tívili, èi nikoli. Pro vrchol $v_0$ si tedy dosazením jednièky zapamatujeme, ¾e je ji¾ nav¹tívený. V~dal¹ím kroku pak zkoumáme frontu $Q$: pokud není prázdná, vezmeme z~ní první vrchol a podíváme se na~v¹echny jeho sousedy $w$. Pokud je¹tì nejsou oznaèené (tedy $Z[w]=0$), tak je oznaèíme (zapamatujeme si, ¾e je pøedáváme ke zpracování a u¾ je nemáme znovu nav¹tìvovat) a pøidáme je do~fronty k~následnému zpracování. Takto cyklus opakujeme, dokud není fronta prázdná.
+Na zaèátku vlo¾íme do~fronty $Q$ poèáteèní vrchol $v_0$. Dále si v~poli $Z$ budeme pro ka¾dý vrchol pamatovat znaèku, zda jsme ho ji¾ nav¹tívili, èi nikoli. Pro vrchol $v_0$ si tedy dosazením jednièky zapamatujeme, ¾e je ji¾ nav¹tívený. V~dal¹ím kroku pak zkoumáme frontu $Q$: pokud není prázdná, vezmeme z~ní první vrchol a podíváme se na~v¹echny jeho sousedy $w$. Pokud je¹tì nejsou oznaèené (tedy $Z[w]=0$), tak je oznaèíme (zapamatujeme si, ¾e je pøedáváme ke zpracování a u¾ je nemáme znovu nav¹tìvovat) a pøidáme je do~fronty k~následnému zpracování. Takto cyklus opakujeme, dokud není fronta prázdná.
+
+\s{Poznámka:}
+Nejprve se podívejme, jak algoritmus pracuje na orientovaném grafu. Pro neorientovaný graf funguje algoritmus analogicky, co¾ si uká¾eme pozdìji.
 
 \s{Algoritmus:}
 
@@ -20,7 +23,7 @@ Na za
 \:$Z[*] \leftarrow 0, Z[v_0] \leftarrow 1$.
 \:Dokud $Q \not= \emptyset $ opakujeme:
 \::Vyzvedneme vrcholy $u$ z~$Q$.
-\::$\forall w: \{u,w\} \in E$:
+\::$\forall w: (u,w)\in E$:
 \:::Je-li $Z[w]=0 \Rightarrow Z[w] \leftarrow 1$, pøidáme $w$ do~$Q$.
 \endalgo
 
@@ -35,9 +38,9 @@ Na za
 \uv{$\Longrightarrow$}: 
 Platí jako invariant po celou dobu bìhu algoritmu. To doká¾eme indukcí dle doby bìhu algoritmu:
 
-První krok indukce je triviální, nebo» cesta z~$v_0$ do~$v_0$ existuje v¾dy. Nyní si pøedstavme, ¾e oznaèujeme vrchol $v$ pøes hranu $uv$. To znamená, ¾e vrchol $u$ ji¾ musel být oznaèený. Dle indukèního pøedpokladu tedy existuje cesta z~$v_0$ do~$u$, a tudí¾ pokud k~této cestì \uv{pøilepíme} hranu $uv$, tak máme hledanou cestu z~$v_0$ do~$v$.
+První krok indukce je triviální, nebo» cesta z~$v_0$ do~$v_0$ existuje v¾dy. Nyní si pøedstavme, ¾e oznaèujeme vrchol~$v$ pøes hranu~$uv$. To znamená, ¾e vrchol~$u$ ji¾ musel být oznaèený. Dle indukèního pøedpokladu tedy existuje cesta z~$v_0$ do~$u$, a tudí¾ pokud k~této cestì \uv{pøilepíme} hranu~$uv$, dostáváme sled z~$v_0$ do~$v$, který lze v¾dy zredukovat na cestu.
 
-\uv{$\Longleftarrow$} Sporem: Nech» existuje neoznaèený vrchol $v$ dosa¾itelný po nìjaké cestì z~$v_0$. Uva¾me nejkrat¹í cestu $(v_0, v)$: $v_0, \dots, u, v$. Pøedposlední vrchol na~této cestì (vrchol $u$) musí být oznaèený. Vrchol $u$ se dostane do~fronty, pak je z~ní vybrán a tím se zpracuje i vrchol $v$, co¾ je SPOR. \qed
+\uv{$\Longleftarrow$} Sporem: Nech» existuje neoznaèený vrchol $v$ dosa¾itelný po nìjaké cestì z~$v_0$. Uva¾me nejkrat¹í cestu $(v_0, v)$: $v_0, v_1 \dots, v_k = v$ a vezmìme minimální~$i$ takové, ¾e~$v_i$ není oznaèený. Víme, ¾e~$i>0$ (nebo»~$v_0$ je urèitì oznaèen u¾ na zaèátku algoritmu). Tudí¾~$v_{i-1}$ je oznaèený. Museli jsme tedy pou¾ít hranu~$v_{i-1}~v_i$ a oznaèit vrchol~$v_i$, co¾ je SPOR. \qed
 
 Nyní tedy víme, ¾e je algoritmus správný, a máme pøedstavu o tom, jak funguje. Podíváme-li se na~nìj podrobnìji, zjistíme, ¾e je hodnì závislý na~tom, jak si budeme graf pamatovat. Zanedlouho zároveò zjistíme, ¾e nám reprezentace grafu v~pamìti znatelnì ovlivní èasovou (i pamì»ovou) slo¾itost celého algoritmu.
 
@@ -46,8 +49,7 @@ Nyn
 Oznaème vrcholy grafu na~následujícím obrázku písmeny A, B, C, D.
 Pokud bychom chtìli tento graf uchovat v~pamìti poèítaèe, máme na~výbìr
 hned nìkolik zpùsobù, jak to udìlat.
-\figure{img1_stvorec.eps}{}{\epsfxsize}
-
+\figure{imgn_o4.eps}{}{\epsfxsize}
 \s{1. matice sousednosti}
 
 Matice sousednosti pro graf $G$ na~$n$ vrcholech je ètvercové pole $A$ o velikosti $n \times n$, jeho¾ prvky na
@@ -58,20 +60,20 @@ $$ A_{i,j} = \left\{ \matrix {1 \Leftrightarrow \{i,j\} \in E  \cr
                                }
 \right.$$
 
-Na~pozicích $i,j$ je jednièka, pokud v~grafu $G$ vede hrana z~vrcholu $i$ do~vrcholu $j$, jinak to je nula.
+Na~pozicích $i,j$ je jednièka, pokud v~grafu $G$ vede hrana z~vrcholu~$i$ do~vrcholu~$j$, jinak to je nula.
 Ná¹ graf z~obrázku vý¹e by tedy v~maticové reprezentaci vypadal takto:
 
 $$\bordermatrix{
   & A & B & C & D\cr
 A & 0 & 1 & 1 & 0\cr
-B & 1 & 0 & 1 & 1\cr
-C & 1 & 1 & 0 & 1\cr
-D & 0 & 1 & 1 & 0\cr
+B & 0 & 0 & 0 & 1\cr
+C & 0 & 0 & 0 & 1\cr
+D & 1 & 1 & 0 & 0\cr
 }$$
 
 S touto maticí se pracuje velmi snadno, napø. v¹echny sousedy $i$-tého vrcholu
 zjistíme jednodu¹e tak, ¾e projdeme $i$-tý øádek matice.
-Má ov¹em dvì zøejmé nevýhody: èasovou a pamì»ovou slo¾itost. Projití sousedù jednoho vrcholu trvá v¾dy $\Theta(n)$, projití sousedù pro v¹echny vrcholy (co¾ potøebujeme v~BFS) pak trvá $\Theta(n^2)$. Velikost matice je v¾dy $n \times n$, bez ohledu na~to, jak \uv{øídký} je graf. U grafu s mnoha vrcholy, ale s malým poètem hran, tedy budeme zbyteènì plýtvat místem v~pamìti. Tato reprezentace je tedy nevýhodná pøedev¹ím pro tøídy grafù jako jsou stromy, které mají $n-1$ hran nebo rovinné grafy, které mají nejvý¹e $3n-6$ hran.
+Má ov¹em dvì zøejmé nevýhody: èasovou a pamì»ovou slo¾itost. Projití sousedù jednoho vrcholu trvá v¾dy $\Theta(n)$, projití sousedù pro v¹echny vrcholy (co¾ potøebujeme v~BFS) pak trvá $\Theta(n^2)$. Velikost matice je v¾dy $n \times n$, bez ohledu na~to, jak \uv{øídký} je graf. U grafu s mnoha vrcholy, ale s malým poètem hran, tedy budeme zbyteènì plýtvat místem v~pamìti. Tato reprezentace je tedy nevýhodná pøedev¹ím pro tøídy grafù jako jsou stromy, které mají $n-1$ hran, nebo rovinné grafy, které mají nejvý¹e $3n-6$ hran.
 
 \s{Pozorování:} BFS s reprezentací maticí sousednosti bì¾í v~èase: $\Theta(n^2)$.
 
@@ -81,12 +83,12 @@ U
 
 \s{2. seznam sousedù}
 
-V~matici sousednosti jsme tedy museli procházet jak hrany, tak nehrany, co¾ bylo zbyteèné. Bylo by tedy výhodnìj¹í, pamatovat si pro ka¾dý vrchol pouze jeho sousedy. To mù¾eme zaøídit napøíklad jedním ze~dvou následujících zpùsobù:
+V~matici sousednosti jsme museli procházet jak hrany, tak nehrany, co¾ bylo zbyteèné. Bylo by tedy výhodnìj¹í pamatovat si pro ka¾dý vrchol pouze jeho sousedy. To mù¾eme zaøídit napøíklad jedním ze~dvou následujících zpùsobù:
 
-Budeme si uchovávat pole indexované vrcholy, pøièem¾ v~ka¾dém prvku pole bude ukazatel na~spojový seznam sousedù tohoto vrcholu. Tedy $L(v)={w: vw \in E(G)}$.
+Uchovávejme pole indexované vrcholy tak, ¾e v~ka¾dém prvku pole je ukazatel na~spojový seznam sousedù tohoto vrcholu. Tedy $L(v)=\{w: vw \in E(G)\}$.
 
-Pokud se nám nebude chtít pracovat se spojovými seznamy, mù¾eme vyu¾ít reprezentaci pomocí dvou polí: polem vrcholù $V(G)$, jeho¾ prvky postupnì pro ka¾dý vrchol udávají index zaèátku odpovídajícího úseku v~druhém poli $E(G)$, ve~kterém jsou ulo¾eni jeho sousedé. Pak tedy hrany z~vrcholu $i$ \uv{bydlí} v~poli $E$ a~to na~pozicích $V[i] \dots V[i+1]-1$.
-\figure{img4_susedia.eps}{Znázornìní polí seznamu sousedù.}{\epsfxsize}
+Pokud se nám nebude chtít pracovat se spojovými seznamy, mù¾eme vyu¾ít reprezentaci pomocí dvou polí. První pole~$V$ bude opìt indexované vrcholy. V~druhém poli~$E$ budou pro ka¾dý vrchol ulo¾eni jeho sousedé. V~poli~$V$ si pamatujeme pro ka¾dý vrchol~$i$ index do~pole~$E$, kde zaèínají jeho sousedé. K sousedùm vrcholu~$i$ se tedy dostaneme ji¾ snadno - nalezneme je na pozicích $V[i]~\dots~V[i+1]-1$.
+\figure{imgn_nei.eps}{Znázornìní polí seznamu sousedù.}{\epsfxsize}
 
 
 Na tuto reprezentaci u¾ staèí prostor $O(n + m)$, co¾ u¾ je, na~rozdíl od~pøedchozího kvadratického prostoru, docela pøíjemné.
@@ -95,12 +97,12 @@ Na tuto reprezentaci u
 
 \proof
 Algoritmus vezme ka¾dý vrchol i ka¾dou hranu do~ruky nejvý¹e jednou. Èasová slo¾itost bude tedy:
-$$\Theta(n+\sum_{v\in V(G)} {\rm deg}(v)) = \Theta(n+m).$$
+$$\Theta\left(n+\sum_{v\in V(G)} {\rm deg}(v)\right) = \Theta(n+m).$$
 \qed
 
 \s{3. orákulum}
 
-Dal¹í mo¾ností reprezentace je pak jakési orákulum, které nám øekne (spoèítá), kam vedou hrany z~daného vrcholu\dots
+Dal¹í mo¾ností reprezentace je pak jakési orákulum, které nám øekne (spoèítá), kam vedou hrany z~daného vrcholu\dots To se hodí napøíklad tehdy, pokud si nepotøebujeme pamatovat celý graf, ale staèí nám naleznout sousedy nìjakého vrcholu, které orákulum jednoznaènì výpoètem doká¾e urèit. Napøíklad pøi øe¹ení známé úlohy odmìøení daného mno¾ství vody za pomocí nádob rùzných objemù mù¾eme tento zpùsob reprezentace grafu pou¾ít. Problém pøevedeme na prohledávání grafu do~¹íøky, kde vrcholùm odpovídají jednotlivé stavy. Stav øíká, kolik vody je zrovna ve které nádobì. Potom nám ji¾ staèí ze zadaného poèáteèního vrcholu (stavu) najít cestu do~cílového. Orákulum je zde vlastnì funkce, které pøedáme vrchol a ona nám vrátí v¹echny vrcholy sousední -- tedy takové stavy, ke kterým dojde, kdy¾ vyzkou¹í v¹echny mo¾nosti pøelití kapaliny z jedné nádoby do~druhé.
 
 \h{Roz¹íøení algoritmu:}
 
@@ -109,7 +111,7 @@ Abychom mohli vyu
 V~poli $D$ bude pro ka¾dý vrchol ulo¾ena vzdálenost od~poèáteèního vrcholu.
 V~poli $P$ si budeme pro ka¾dý vrchol pamatovat jeho pøedchùdce. Dále budeme vyu¾ívat fáze bìhu algoritmu, které budou simulovat onu vlnu:
 
-\s{Definice {\I Fáze bìhu algoritmu}:} Ve~fázi $F_0$ je zpracováván vrchol $v_0$. Ve~fázi $F_{i+1}$ jsou zpracovávány vrcholy ulo¾ené do~fronty $Q$ bìhem fáze $F_i$.
+\s{Definice: {\I Fáze bìhu algoritmu}:} Ve~fázi $F_0$ je zpracováván vrchol $v_0$. Ve~fázi $F_{i+1}$ jsou zpracovávány vrcholy ulo¾ené do~fronty $Q$ bìhem fáze $F_i$.
 
 \s{Roz¹íøený algoritmus:}
 \algo
@@ -123,15 +125,16 @@ V~poli $P$ si budeme pro ka
 \::::Pøidáme $w$ do~$Q$.
 \endalgo
 
-\s{Lemma:} Na~konci BFS pro v¹echny vrcholy dosa¾itelné z~$v_0$ platí, ¾e vrchol $v$ byl zpracován ve~fázi $F_i$ právì tehdy, kdy¾ vzdálenost $v_0$ a $v$ (délka nejkrat¹í cesty z~$v_0$ do~$v$) je rovna $i$. Formálnì zapsáno: $v \in F_i \Leftrightarrow d(v_0,v) = i$.
+\s{Lemma:} Na~konci BFS pro v¹echny vrcholy dosa¾itelné z~$v_0$ platí, ¾e vrchol $v$ byl zpracován ve~fázi $F_i$ právì tehdy, kdy¾ vzdálenost $v_0$ a $v$ (délka nejkrat¹í cesty z~$v_0$ do~$v$) je rovna $i$. Formálnì zapsáno: $v \in F_i \Leftrightarrow d(v_0,v) = i$. (Kde $d(x,y)$ je délka nejkrat¹í cesty z~$x$ do~$y$).
 
 \proof
 \uv{$\Longrightarrow$}: 
 Dùkaz provedeme indukcí podle $i$ (èísla fáze bìhu algoritmu).
 
-První krok indukce je triviální, nebo» ve~fázi $F_0$ je oznaèen (dle definice) pouze vrchol $v_0$ a ten je od vrcholu $v_0$ vzdálen 0. 
+První krok indukce je triviální, nebo» ve~fázi $F_0$ je oznaèen (dle definice) pouze vrchol $v_0$ a to je jediný vrchol vzdálený~0 od~$v_0$. 
+
+Pokud je vrchol $v$ zpracováván ve~fázi $F_i$, pak musel být zaøazen do~fronty bìhem fáze $F_{i-1}$ jako soused nìjakého vrcholu $u$. Pro vrchol $u$ mù¾eme pou¾ít indukèní pøedpoklad, tedy ¾e délka nejkrat¹í cesty z~$v_0$ do~$u$ je $d(v_0,u)=i-1$. Pak tedy $d(v_0,v)\leq i$, nebo» je¹tì nevíme, zda cesta $v_0, \dots, u, v$ je nejkrat¹í. Kdyby ale existovala nìjaká krat¹í, tedy délky nejvý¹e $i-1$, tak by byl vrchol $v$ objeven u¾ døíve ne¾ ve fázi $F_i$. Proto $d(v_0,v) = i$.
 
-Pokud je vrchol $v$ zpracováván ve~fázi $F_i$, pak musel být zaøazen do fronty bìhem fáze $F_i-1$ jako soused nìjakého vrcholu $u$. Pro vrchol $u$ mù¾eme pou¾ít indukèní pøedpoklad, tedy ¾e délka nejkrat¹í cesty z $v_0$ do~$u$ je $d(v_0,u)=i-1$. Pak tedy $d(v_0,v)=i$. 
 
 \uv{$\Longleftarrow$}: Ka¾dý dosa¾itelný vrchol padne do~nìjaké fáze (viz. minulé lemma).
 \qed
@@ -141,7 +144,10 @@ Ji
 Zároveò nás mù¾e zajímat, jak bychom nejkrat¹í cestu z~$v_0$ do~$v_i$ rekonstruovali. Pro tento úèel jsme si zavedli pole $P$. Nejkrat¹í cesta z~$v_0$ do~$v_i$ bude v~obráceném poøadí vypadat: $v_i, P[v_i], P[P[v_i]], P[P[P[v_i]]], \dots, v_0$.
 
 
-\s{Pozorování:} $v_0v_1,...,v_{k-1}$ je nejkrat¹í cesta z~$v_0$ do~$v_{k-1}$
+\s{Pozorování:} Pokud víme, ¾e $v_0, v_1, \dots, v_{k-1}, v_k$ je nejkrat¹í cesta z~$v_0$ do~$v_k$, pak $v_0,v_1,\dots,v_{k-1}$ je nejkrat¹í cesta z~$v_0$ do~$v_{k-1}$. Neboli prefix nejkrat¹í cesty je nejkrat¹í cesta.
+
+\proof
+Kdyby existovala krat¹í cesta z~$v_0$ do~$v_{k-1}$, pak bychom mohli zkrátit i cestu z~$v_0$ do~$v_k$.
 
 
 \s{Pozorování:} BFS u~neorientovaného grafu projde celou komponentu souvislosti.
@@ -152,8 +158,15 @@ V
 
 \s{Pozorování:} Pokud BFS postupnì spou¹tíme na~dosud neobarvené vrcholy v~ neorientovaném grafu, nalezneme nakonec v~èase $\Theta(n+m)$ v¹echny komponenty souvislosti.
 
+\s{Algoritmus:}
+\algo
+\:Pro v¹echny vrcholy $v \in V(G)$ opakuj:
+\::Pokud je vrchol $v$ neobarvený $ \Rightarrow \<BFS(v)>$.
+\endalgo
+
 \proof
-Ka¾dým spu¹tìním na~dosud neobarvený vrchol neorientovaného grafu obarvíme právì jednu komponentu souvislosti (tu, ve~které je tento vrchol). Jeliko¾ postupnì projdeme v¹echny vrcholy, obarvíme nakonec také v¹echny komponenty souvislosti. Èasová slo¾itost bude stejná jako u~samotného BFS, tedy $\Theta(n + m)$.
+Ka¾dým spu¹tìním na~dosud neobarvený vrchol neorientovaného grafu obarvíme právì jednu komponentu souvislosti (tu, ve~které je tento vrchol). 
+Postupnì projdeme v¹echny vrcholy od prvního k poslednímu a v¾dy pokud je vrchol neobarvený, spustíme na nìj BFS. Tak nakonec obarvíme v¹echny komponenty souvislosti. Èasová slo¾itost bude stejná jako u~samotného BFS, tedy $\Theta(n + m)$.
 \qed
 
 \s{Vìta:} $BFS(v_0)$ v~èase $\Theta(n + m)$ spoète:
@@ -163,19 +176,24 @@ Ka
 \:strom nejkrat¹ích cest z~$v_0$
 \endlist
 
+\s{Poznámka:} Algoritmus na prohledávání do~¹íøky bude fungovat i na neorientovaném grafu. Mù¾eme si jednodu¹e pøedstavit, ¾e je to orientovaný graf, kde ka¾dá hrana má oboustrannou orientaci.
+
+
 Prohledávání do~¹íøky ale není jediný algoritmus, který nìjak systematicky prochází graf. Jak u¾ název kapitoly napovídá, budeme se zabývat je¹tì druhým algoritmem, prohledáváním do~hloubky. Podívejme se, jak bude vypadat \dots
 
-\h{Prohledávání do~hloubky (DFS) {\I Depth First Search} }
+\h{Prohledávání do~hloubky (DFS) {\I Depth-First Search} }
+
+Tento algoritmus neprochází graf ve~vlnì jako BFS, ale prochází ho rekurzivnì. V¾dy se zanoøí co nejhloubìji a¾ do~listu a pak se o~kus vrátí a opìt se sna¾í zanoøit. Vrcholy, ve kterých u¾ byl, ignoruje.
 
-Tento algoritmus neprochází graf ve~vlnì jako BFS, ale prochází graf rekurzivnì. V¾dy se zanoøí co nejhloubìji a¾ do~listu a pak se o~kus vrátí a opìt se sna¾í zanoøit. Vrcholy, ve kterých u¾ byl, ignoruje.
+Opìt uva¾me nejdøíve graf orientovaný. Následnì si uká¾eme, ¾e v~neorientovaném grafu budou pouze malé zmìny.
 
-Budeme pou¾ívat podobné znaèení jako u~BFS. V poli $Z$ si budeme pamatovat, zda jsme vrchol ji¾ nav¹tívili (hodnota 1), nebo ne (hodnota 0). Navíc promìnná $T$ bude znaèit dobu bìhu algoritmu. Pøi ka¾dém nalezení nového vrcholu, èi jeho opu¹tìní, pak tuto promìnnou zvý¹íme o~1. V~poli $\<in>$ a $\<out>$ bude èas (prvního) nalezení a opu¹tìní vrcholu.
+Budeme pou¾ívat podobné znaèení jako u~BFS. V~poli $Z$ si budeme pamatovat, zda jsme vrchol ji¾ nav¹tívili (hodnota 1), nebo ne (hodnota 0). Navíc promìnná~$T$ bude znaèit dobu bìhu algoritmu - tedy jakési \uv{hodiny}. Pøi ka¾dém nalezení nového vrcholu èi jeho opu¹tìní tuto promìnnou zvý¹íme o~1. Do~polí $\<in>$ a $\<out>$ si budeme ukládat èas (prvního) nalezení a opu¹tìní vrcholu.
 
 \s{Algoritmus:}
 
 \algo
 \: inicializace: $Z[*] \leftarrow 0, T \leftarrow 1, \<in>[*] \leftarrow ?, \<out>[*] \leftarrow ?$
-\: $DFS(v): Z[v] \leftarrow 1, in[v] \leftarrow T|++|$
+\: $DFS(v): Z[v] \leftarrow 1, \<in>[v] \leftarrow T|++|$
 \:: Pro $w$: $vw \in E(G)$:
 \::: Pokud $Z[w]=0 \Rightarrow DFS(w)$
 \:: $out[v] \leftarrow T|++|$
@@ -191,28 +209,19 @@ V anal
 
 \figure{img5_dfso.eps}{Graf a znázornìní prùbìhu DFS s~jednotlivými hranami:}{\epsfxsize}
 
-Mù¾eme si v¹imnout, ¾e jak DFS prochází graf, tak rozdìluje hrany do~4 skupin:
+Mù¾eme si v¹imnout, ¾e jak DFS prochází graf, rozdìluje hrany do~4 skupin: hrany {\I stromové, zpìtné, dopøedné a pøíèné}.
 
-\s{Typy hran ($v \rightarrow w$):}
-
-\itemize\ibull
-\:Stromové hrany ... po nich DFS pro¹lo $\{(A \rightarrow B), (B \rightarrow C), (B \rightarrow D)\}$
-\:Zpìtné hrany $<<>_v>_w$... vedou do~pøedchùdce $v$ ve~stromu $\{(C \rightarrow A)\}$
-\:Dopøedné hrany $<<>_w>_v$... vedou do~potomka $v$ $\{(A \rightarrow D)\}$
-\:Pøíèné hrany $<>_w<>_v$... vedou do~vrcholu $v$ v~sousedním podstromì, v¾dy zprava doleva $\{(D \rightarrow A)\}$
-\endlist
-
-Jedinì stromové hrany jsou takové, ¾e se po~nich DFS opravdu vydá. Vedou toti¾ do~vrcholu, který nebyl dosud objeven. V~ukázkovém grafu to jsou hrany: $\{(A \rightarrow B), (B \rightarrow C), (B \rightarrow D)\}$.
+Jedinì {\I stromové} hrany jsou takové, ¾e se po~nich DFS opravdu vydá. Vedou toti¾ do~vrcholu, který nebyl dosud objeven. V~ukázkovém grafu to jsou hrany: $\{(A \rightarrow B), (B \rightarrow C), (B \rightarrow D)\}$.
 
-Pokud algoritmus objeví z~vrcholu $v$ hranu do~ji¾ døíve nav¹tíveného vrcholu $w$ a zároveò platí, ¾e $w$ je ve~stejném podstromu jako $v$, tak nazveme hranu $vw$ jako zpìtnou. Pro rozpoznání je dùle¾ité, ¾e vrchol $w$ byl ji¾ objeven, ale je¹tì ne opu¹tìn.
+Pokud algoritmus objeví z~vrcholu $v$ hranu do~ji¾ døíve nav¹tíveného vrcholu $w$ a zároveò platí, ¾e $w$ je ve~stejném podstromu jako $v$, tak nazveme hranu $vw$ {\I zpìtnou}. Pro rozpoznání je dùle¾ité, ¾e vrchol $w$ byl ji¾ objeven, ale je¹tì ne opu¹tìn. V~ukázkovém grafu se jedná o hranu: $(C \rightarrow A)$.
 
-Kdy¾ pøi prohledávání sousedù vrcholu $v$ narazíme na~vrchol $w$, který jsme ji¾ nav¹tívili, a to v~podstromì vrcholu $v$, tak nazveme hranu $vw$ jako dopøednou, nebo» vede z~$v$ do~jeho potomka. Platí tedy, ¾e jsme nejdøíve objevili vrchol $v$, potom vrchol $w$, pak jsme vrchol $w$ opustili a nyní jsme na~nìj znovu narazili po~dopøedné hranì.
+Kdy¾ pøi prohledávání sousedù vrcholu $v$ narazíme na~vrchol $w$, který jsme ji¾ nav¹tívili, a to v~podstromì vrcholu $v$, tak nazveme hranu $vw$ {\I dopøednou}, nebo» vede z~$v$ do~jeho potomka. Platí tedy, ¾e jsme nejdøíve objevili vrchol $v$, potom vrchol $w$, pak jsme vrchol $w$ opustili a nyní jsme na~nìj znovu narazili po~dopøedné hranì. V~ukázkovém grafu hrana: $(A \rightarrow D)$.
 
-Posledním typem hran je pøíèná hrana. Ta vede do~vrcholu v~sousedním podstromì zprava doleva. V~tomto pøípadì jsme tedy nejdøíve objevili vrchol $w$, ten jsme následnì opustili a a¾ pak jsme objevili vrchol $v$.
+Posledním typem hran je {\I pøíèná} hrana. Ta vede do~vrcholu v~sousedním podstromì zprava doleva. V~tomto pøípadì jsme tedy nejdøíve objevili vrchol $w$, ten jsme následnì opustili a a¾ pak jsme objevili vrchol $v$. V~ukázkovém grafu to je hrana: $(D \rightarrow C)$.
 
 \s{K zamy¹lení:} Proè nemohou vést pøíèné hrany také zleva doprava?
 
-K~rozpoznávání typù hran se nám tedy velmi hodí pole $\<in>$ a $\<out>$, ve~kterých si pamatujeme èas objevení a opu¹tìní vrcholu. Podle toho, jak se intervaly objevení a opu¹tìní obou vrcholù pøekrývají, mù¾eme jednoznaènì rozhodnout, o jaký typ hrany se jedná:
+K~rozpoznávání typù hran se nám tedy velmi hodí pole $\<in>$ a $\<out>$, ve~kterých si pamatujeme èasy objevení a opu¹tìní vrcholu. Podle toho, jak se intervaly objevení a opu¹tìní obou vrcholù pøekrývají, mù¾eme jednoznaènì rozhodnout, o jaký typ hrany se jedná:
 
 U~zpìtných hran je poøadí: $\<in>(w)$, $\<in>(v)$, $\<out>(v)$, $\<out>(w)$. Intervaly do~sebe budou zanoøené takto: $<<>_v>_w$.
 
@@ -222,8 +231,19 @@ U~p
 
 Pozn: Pou¾íváme zde toto znaèení: $<>_v = <in(v), out(v)>$. Jedná se o interval objevení a opu¹tìní vrcholu $v$.
 
+\s{Typy hran ($v \rightarrow w$):}
+
+\itemize\ibull
+\:Stromové hrany \dots po nich DFS pro¹lo. $\{(A \rightarrow B), (B \rightarrow C), (B \rightarrow D)\}$
+\:Zpìtné hrany $<<>_v>_w$\dots vedou do~pøedchùdce $v$ ve~stromu. $\{(C \rightarrow A)\}$
+\:Dopøedné hrany $<<>_w>_v$\dots vedou do~potomka. $v$ $\{(A \rightarrow D)\}$
+\:Pøíèné hrany $<>_w<>_v$\dots vedou do~vrcholu $v$ v~sousedním podstromì, v¾dy zprava doleva. $\{(D \rightarrow A)\}$
+\endlist
+
 \s{Pozorování:} Hrany, po~kterých DFS pro¹lo, tvoøí DFS strom.
 
-\s{Pozorování:} Intervaly ($\<in>(v)$, $\<out>(v)$) $\forall v \in V(G) $ tvoøí dobré uzávorkování. (intervaly synù disjunktnì vyplòují otce $\Rightarrow$ intervaly se nemohou køí¾it).
+\s{Pozorování:} Intervaly ($\<in>(v)$, $\<out>(v)$) $\forall v \in V(G) $ tvoøí dobré uzávorkování. (Intervaly synù disjunktnì vyplòují otce $\Rightarrow$ intervaly se nemohou køí¾it).
+
+Nakonec si je¹tì uvìdomme, jak bude vypadat prohledávání do~hloubky na~neorientovaném grafu. Algortimus bude úplnì stejný, jenom se nám zredukuje poèet typù hran na~dvì: {\I stromové} a~{\I zpìtné}. Ani {\I dopøedné} ani {\I pøíèné} nebudou existovat, nebo» se z~{\I pøíèných} stanou {\I stromové} a z~{\I dopøedných zpìtné}.
 
 \bye
diff --git a/3-dfs/imgn_nei.eps b/3-dfs/imgn_nei.eps
new file mode 100644 (file)
index 0000000..75ec44a
--- /dev/null
@@ -0,0 +1,457 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Ipelib 60030 (Ipe 6.0 preview 30)
+%%CreationDate: D:20090612221459
+%%LanguageLevel: 2
+%%BoundingBox: 49 297 147 360
+%%HiResBoundingBox: 49.5343 297.934 146.473 359.966
+%%DocumentSuppliedResources: font QPRPPC+CMR10
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset ipe 6.0 60030
+/ipe 40 dict def ipe begin
+/np { newpath } def
+/m { moveto } def
+/l { lineto } def
+/c { curveto } def
+/h { closepath } def
+/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+      neg 0 rlineto closepath } def
+/d { setdash } def
+/w { setlinewidth } def
+/J { setlinecap } def
+/j { setlinejoin } def
+/cm { [ 7 1 roll ] concat } def
+/q { gsave } def
+/Q { grestore } def
+/g { setgray } def
+/G { setgray } def
+/rg { setrgbcolor } def
+/RG { setrgbcolor } def
+/S { stroke } def
+/f* { eofill } def
+/f { fill } def
+/ipeMakeFont {
+  exch findfont
+  dup length dict begin
+    { 1 index /FID ne { def } { pop pop } ifelse } forall
+    /Encoding exch def
+    currentdict
+  end
+  definefont pop
+} def
+/ipeFontSize 0 def
+/Tf { dup /ipeFontSize exch store selectfont } def
+/Td { translate } def
+/BT { gsave } def
+/ET { grestore } def
+/TJ { 0 0 moveto { dup type /stringtype eq
+ { show } { ipeFontSize mul -0.001 mul 0 rmoveto } ifelse
+} forall } def
+end
+%%EndResource
+%%EndProlog
+%%BeginSetup
+ipe begin
+%%BeginResource: font QPRPPC+CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /QPRPPC+CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+dup 69 /E put
+dup 86 /V put
+dup 58 /colon put
+dup 53 /five put
+dup 52 /four put
+dup 49 /one put
+dup 51 /three put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+currentdict end
+currentfile eexec
+d9d66f633b846a97b686a97e45a3d0aa052a014267b7904eb3c0d3bd0b83d891
+016ca6ca4b712adeb258faab9a130ee605e61f77fc1b738abc7c51cd46ef8171
+9098d5fee67660e69a7ab91b58f29a4d79e57022f783eb0fbbb6d4f4ec35014f
+d2decba99459a4c59df0c6eba150284454e707dc2100c15b76b4c19b84363758
+469a6c558785b226332152109871a9883487dd7710949204ddcf837e6a8708b8
+2bdbf16fbc7512faa308a093fe5cf7158f1163bc1f3352e22a1452e73feca8a4
+87100fb1ffc4c8af409b2067537220e605da0852ca49839e1386af9d7a1a455f
+d1f017ce45884d76ef2cb9bc5821fd25365ddea6e45f332b5f68a44ad8a530f0
+92a36fac8d27f9087afeea2096f839a2bc4b937f24e080ef7c0f9374a18d565c
+295a05210db96a23175ac59a9bd0147a310ef49c551a417e0a22703f94ff7b75
+409a5d417da6730a69e310fa6a4229fc7e4f620b0fc4c63c50e99e179eb51e4c
+4bc45217722f1e8e40f1e1428e792eafe05c5a50d38c52114dfcd24d54027cbf
+2512dd116f0463de4052a7ad53b641a27e81e481947884ce35661b49153fa19e
+0a2a860c7b61558671303de6ae06a80e4e450e17067676e6bbb42a9a24acbc3e
+b0ca7b7a3bfea84fed39ccfb6d545bb2bcc49e5e16976407ab9d94556cd4f008
+24ef579b6800b6dc3aaf840b3fc6822872368e3b4274dd06ca36af8f6346c11b
+43c772cc242f3b212c4bd7018d71a1a74c9a94ed0093a5fb6557f4e0751047af
+d72098eca301b8ae68110f983796e581f106144951df5b750432a230fda3b575
+5a38b5e7972aabc12306a01a99fcf8189d71b8dbf49550baea9cf1b97cbfc7cc
+96498ecc938b1a1710b670657de923a659db8757147b140a48067328e7e3f9c3
+7d1888b284904301450ce0bc15eeea00e48ccd6388f3fc3a3b198747b4dc992e
+839a610506453ba7b2a56b2c552fdbe23916074dd54d39ed27a52d90d5d74b07
+a5265e72e3f2e0acd9513e056f15e4bcbb9f409a6f39deae8d919c80ec13c56f
+4864a6ccff1acfda3d992f46d45571fc760dff6ebfb011b6c123167ca96b77a0
+cfa8861be3814e002e0a571e62c497886a135acb53c0acf7fecceef3fa4dc436
+9115af71c9ca5e9e71caaf5a17d5598d8e8bb772ef73e44f07bfcea039dfb0f7
+e2c38f138ee0922fbdd3d7ba9cd9676102b0b9e22a4744edbf299db408b7b0b9
+b66dc8bdb8552ba01aee38e1205b077c2f2c646747c748125f1ccf350e3930ad
+ae5249b3d5cae219454906c86eab1df73eec1e8afa68c7e230dad77d9a072873
+b96e9def3eaec6d5b9a045f9280d79ac9e0857ac916fc29db487a669486de827
+dfa3c487fbaebcbbcb9558497a66ce72491373354376aef7374ae1d709ec9ce1
+244e5cc8e7b40f9a2d36fbaa585e2265e0d4491f56166c30155a359ddb814235
+88d830822cf1827dd0b979e7f899a31e7570692e6a8eff1fbba5de09e2fc63c2
+934eda05d28cb4ed0a2804ca36d4619d88831a4ab00bdb2a8072edd1670ecd13
+87284ffdc14c464b15fefe5f5d17dd99a9c291a98fc3cd46a47764358d7d65d2
+da2a30960687f2dcf03e8ec3b3355440f87909ff158b8a851e1b210c3aab5a51
+451da27dd7da80feb166c3db5debd271270a478aed9640392137548da4060fa2
+2c764e0b6b9844980a089f0db4798087f2b4f9e15cbcc2b4b15da7f10d8dcf4a
+96714fb8c4c3b8ec48d54aa658190a40ecbef817e6eff5db4181bf7dc7a13bf3
+f6a16435be39717749e237776b1cfbb090758a477f70be0c69b1ef937795fdbc
+585fcdd4af78ae484b761bfc3661d687bb1a64f4ea8274af10dd73b7575d67e6
+78d78a9802fce8dd84d1006acdc3fdb82b18978ae78311ec7e57be059ce186c6
+e48830c45dac72f5f8661a57909384e6c4447b21340a4b05412f00865d53a4de
+e0c47d4d3cb422399d88bf504f73094546c121fcfdf04fa7cb4962550134e3f6
+47eeea66e9dfd5998bf15055f858ed062d58ba72274ac6653317786f5e2042e5
+d4cd6fd151f7ad1d25517ed6d873a8bb4bf1789618bf224d3a3b2545982782bb
+32e9c9b522abb351563d90f75154918a160bfcaae19ab1e61ce635a4004a912e
+65ca0b2f3a4bd0207820edd437a307b7cfa74fc61e39283f38a8ad579fa4e5db
+ce594480fb400b3a2aa034b9d2355e52e51f2dcd3c4809f0734ac964b93cc881
+c0c870304d83613d1f47f48b90d5b98538d08087144e573824a367e7d3efca97
+6bfd34799e6745358549b6fee54f708740b519578f21c667c0c381a89706c312
+a312ed8c10f96d2e8fae3b42313a09bdf601ea61373eff6e912dc93ba8ce55a9
+925ebbaa324e5c3c69e3ffebe71dc1c697bbc78c08f7981d03329cc648cd9289
+8c4e0a259895e741a5896b5c64468f95ddda059949e08dde8dcb8c937e8781c5
+683282986f90939e25fcab8db330bdd2db287554de19b78d8e9071256e1c5aff
+8e21b522d852423cdaf38d1adce8482f076e6bc95f713d2e2637e2a192da02a1
+f677fcffaec9afff27e64e7d2e30aaa8a2ff2fb3b989da85c63a65bee2b05817
+4414dc2725db959992e4ffd3f9774c77e1b718eb56472bac7932eaef435a2f6f
+e9c55380631a6c2c82666a5cc57219f679878349e7cfddfdb70f6b3c37ac95c3
+12c347be66e8aa46dbf239631922e4ac8fab0dac8a4553d73ee04ab3da50d44f
+b2f39132ed5d8823017dd4a28c9140437ae367e1d20af64c350b4f1bb50ed4ba
+6b7cbe3ee65a2ef32b0358cdd5b7ffa020306e64b3b2fbb3667b0c75a3a7a873
+4cfe41e347a658be4054c9d8423fa4019db27074ad2e0e8f6207cff81f7f82f0
+fb419014928396fa9a322f53c95dfa9261c5ea4865f3ee6d1ac0647accccdbe7
+25b8e918552e8381b87fc5c77986be2a77b36d17cd5bc23df8d6b0a7dfef62f5
+42f8fe68f17d9109e6148de69e1539d681964976be07e2f04685b9527cefca58
+9e9393089bd19aec57aa167c0ce1f497ae31c960ef1384a6d32249cab28b920c
+1686978ccb1ba542e2c9087789aa35a189fb2593959033466cb1dd92469127a1
+d794ce4409803179f98a79501e1dad1038bbf3f6e81cb5523db5659b4dfdf080
+94a338deaa1b0697b0cac0fc91880437e832ca30f19c7170b0bb893f83c9ccc4
+e87eefce3098487fc5e87aad1765329b459f2d0658723a11f33e336b007f7f15
+6a397ec72cbe3712ba6d6bd42840ab45c34304fc39124a863efe6f361fc4d393
+7f0b28f11fc36f3ddb11f613481dea9b394aaceddce2bca659619d63495725ec
+92bb5ecacc4c221125284d4fe04d41c57f6464206b8c83186f46b0df62fe5b24
+d3932aa11c4d79e45190d51ff66bb67492a7598ba18dde7d0425c27bcbabad06
+0863abeb53800e73945f001d439d582faaeb133d93dfe061137be3aa6a978002
+4134e128d0a061ce88a587be221168d10d8c949cc390a05d0fdc41d4b24a89b7
+d9bac2c2b884aa30cbab7b09689c8cedb68b0afb20631cb7305ca3260134a3e1
+9aa5bdf928d303183790ea6ff5b15df78a03a5aaaa74382721ceaa50c382d095
+6921e0e64a7cbc1b50ac285569c5efaa0aae56bf3755a36825d162e1649a77f6
+e6f7c41a5b281c43eadf2a90a743e3cd209ca0748716145fb87f57aa3b5ebf43
+96c5ce112c88956ae37ddae0bd254aba4f1f08d9a59934f2d4241732bd34b728
+10978c04d5dd04c20df81a2bff3d1befde4393382e7b99e364eab9702e0bd5f9
+47205de80f0d5d4156ae85c493a162124b76efeca55f33ca176baff8ea009c01
+ce30dfc9e54065321e0a862d825bc7c5d1d094599ade3cf94e9d7279953ff1d2
+fbd4b0f366d9a25634474ae202a5c14565f93b473e80cb09da4a16aeffeb4df5
+119b2aebdf8da0cf074f18d664d0188ec7e1c397dfa128b8c6c2168879c40da8
+3f4012ba83b665ab462c2f031b5cfe696647a3f8b718a1f6dfd226e8a464962a
+da08dda0facd6f366b2c2ae6f8fbf35bac0e33574779a87f05f0a019460407d9
+bb357e58e5cbc8492aeff30f973fa4bf4dd36d2e78f68c3133df39d3502bd3b6
+92474c4d6cbbed6d3045713d9c4a43c644e0dcfee6e53e53f7b1abc99556af81
+f98b6b30d813f309883aa5d6da7f10bd3a1e4ee91ba1f83396fe036e8e87c26c
+be6a9b016e7e5eadb64356c2086d8e150ce16ef4b3f4b1ae59b3ade1e5c66f9a
+9d63de3ecb344346a99af40a851786fe6a2bd76b970179725de004784a0f4025
+b9eb1a0155c0dce68945b3a83137e354eaa48e0c0add1944fd77049fecba40c8
+6a01a75169b9efb433747f3f330423b58dcd98a6db30199e5e1b99cfba8c1176
+8a
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F8 /QPRPPC+CMR10 findfont definefont pop
+%%EndSetup
+0 J 1 j
+q 0.4 w
+65.0001 338.434 m
+78.5662 338.434 l
+78.5662 352 l
+65.0001 352 l
+h S
+Q
+q 1 0 0 1 67 353 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(A)]TJ
+ET
+Q
+q 0.4 w
+78.4961 338.434 m
+92.0622 338.434 l
+92.0622 352 l
+78.4961 352 l
+h S
+Q
+q 0.4 w
+92.0721 338.434 m
+105.638 338.434 l
+105.638 352 l
+92.0721 352 l
+h S
+Q
+q 0.4 w
+105.568 338.434 m
+119.134 338.434 l
+119.134 352 l
+105.568 352 l
+h S
+Q
+q 1 0 0 1 80.6523 353.157 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(B)]TJ
+ET
+Q
+q 1 0 0 1 94.5489 353.158 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(C)]TJ
+ET
+Q
+q 1 0 0 1 109.438 353.158 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(D)]TJ
+ET
+Q
+q 1 0 0 1 49.5343 341.845 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(V:)]TJ
+ET
+Q
+q 0.4 w
+65.0001 298.334 m
+78.5662 298.334 l
+78.5662 311.9 l
+65.0001 311.9 l
+h S
+Q
+q 0.4 w
+78.4961 298.334 m
+92.0622 298.334 l
+92.0622 311.9 l
+78.4961 311.9 l
+h S
+Q
+q 0.4 w
+92.0721 298.334 m
+105.638 298.334 l
+105.638 311.9 l
+92.0721 311.9 l
+h S
+Q
+q 0.4 w
+105.568 298.334 m
+119.134 298.334 l
+119.134 311.9 l
+105.568 311.9 l
+h S
+Q
+q 0.4 w
+119.011 298.334 m
+132.577 298.334 l
+132.577 311.9 l
+119.011 311.9 l
+h S
+Q
+q 0.4 w
+132.507 298.334 m
+146.073 298.334 l
+146.073 311.9 l
+132.507 311.9 l
+h S
+Q
+q 1 0 0 1 49.5343 301.746 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(E:)]TJ
+ET
+Q
+q 1 0 0 1 68.3803 342.51 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.58 cm
+BT
+/F8 9.9626 Tf 0 785.58 Td [(1)]TJ
+ET
+Q
+q 1 0 0 1 68.3803 301.653 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(B)]TJ
+ET
+Q
+q 1 0 0 1 81.6312 301.653 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(C)]TJ
+ET
+Q
+q 1 0 0 1 94.0539 301.653 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(D)]TJ
+ET
+Q
+q 1 0 0 1 108.133 301.653 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(D)]TJ
+ET
+Q
+q 1 0 0 1 121.66 301.653 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(A)]TJ
+ET
+Q
+q 1 0 0 1 135.739 301.653 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(B)]TJ
+ET
+Q
+q 1 0 0 1 82.7354 342.51 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.58 cm
+BT
+/F8 9.9626 Tf 0 785.58 Td [(3)]TJ
+ET
+Q
+q 1 0 0 1 95.7103 342.51 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.58 cm
+BT
+/F8 9.9626 Tf 0 785.58 Td [(4)]TJ
+ET
+Q
+q 1 0 0 1 109.513 342.51 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.58 cm
+BT
+/F8 9.9626 Tf 0 785.58 Td [(5)]TJ
+ET
+Q
+q [4] 0 d
+0.4 w
+71.1641 337.708 m
+71.1641 313.414 l
+S
+q [] 0 d
+71.1641 313.414 m
+72.8308 318.414 l
+69.4975 318.414 l
+h q f* Q S
+Q
+Q
+q [4] 0 d
+0.4 w
+84.887 336.958 m
+97.768 313.596 l
+S
+q [] 0 d
+97.768 313.596 m
+96.8133 318.78 l
+93.8942 317.17 l
+h q f* Q S
+Q
+Q
+q [4] 0 d
+0.4 w
+98.9661 336.958 m
+111.847 313.596 l
+S
+q [] 0 d
+111.847 313.596 m
+110.892 318.78 l
+107.973 317.17 l
+h q f* Q S
+Q
+Q
+q [4] 0 d
+0.4 w
+113.045 336.958 m
+125.926 313.596 l
+S
+q [] 0 d
+125.926 313.596 m
+124.971 318.78 l
+122.052 317.17 l
+h q f* Q S
+Q
+Q
+showpage
+%%BeginIpeXml: /FlateDecode
+%GhU]8?#SFN'Sc)R/$.N9r;BKX9&$q8rINcDE$8s=;%h9"^OE@Re#h)t8EiGg,iln`kOGh'H]GYZ
+%X%7E=DXqg0b7%mDARnZYd$F>Uqh@j5)6)o2bMt`OkOleo^:c,mA)_Nph-:<,4>U4J/tJ:Gfp'\X
+%2ZKOJE2@tPk4A.PQ7_C-66htsfrE]3O$uHXqHLQ=X%696^23?^EL+.G\-S/#-JPc@MbmC=cqVlL
+%F^7`ARY4,!mp:sQ6G)*8H61SCFa8a.o-,aRJ0!?)#99MY3lrp]l-hj&7QkCSE%\,O-6lND_mX-i
+%#mJt?-;k2V\T%F8d5?#\R(fiF$53VWgA'#9ZHkVMS4pR?$G00#=;Oc>E&b=TXRMDtb[Zctqg@)"
+%B:5U=MN"WH^08"u7I$8`a>-eq'/SuAOfq#3%o"VGD8ajaVtTbTY,2N(pX12!84=7Opmq=<gqL)D
+%4)mI]L;Wh)giK0fnA^WJZW&EPq]fPbou[rE(tHhM3\!hX'9:5ukG*&3W\W(;OdN*ag=mZKE@MMn
+%dR_NN3eYYh4ot?"+B0SaQI:;J;otS[,/jUG;t)5r\[@2X%6oF8Asc5nUXf_;5"([9jLi0!Ku9lT
+%4;^M`n:)hI$tn(^_#"$#"KCT2e4Rl[*^<VNWB-CE?E2:^^R(sAfh_Ht1>m!BSYHN9q+gVg#&DX'
+%-\hi*VcpVE@eK'K0OaLuC(;Wm_sE^h^K,Se6er.7;dp"UIiI=!6__2MkEs\2e9pF)Q,^@cLh#SX
+%M1l9eW8KAJ0f,>S!Fn>JTY`<32UmHL<MLXiL`dIfo+)il!f5!XW&J`6TRdX0W.LrP#)YkNBZ:2)
+%YEj[]csW=7*LAFc.g^?(hTrJ3%k6+6::X63!(]a7F%EmgDfCb8-k_DI1VMmTj//=b7X7]T\G\sQ
+%1(--U\D`#F9IZAT'8^OAQ2e@e!Z*mFrW?!PhmsfuY<f)NDkO"XL9<1Y!mR\t]D~>
+%%EndIpeXml
+%%Trailer
+end
+%%EOF
diff --git a/3-dfs/imgn_o4.eps b/3-dfs/imgn_o4.eps
new file mode 100644 (file)
index 0000000..27fcbcf
--- /dev/null
@@ -0,0 +1,253 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: Ipelib 60030 (Ipe 6.0 preview 30)
+%%CreationDate: D:20090612215531
+%%LanguageLevel: 2
+%%BoundingBox: 19 396 116 489
+%%HiResBoundingBox: 19.515 396.99 115.567 488.793
+%%DocumentSuppliedResources: font ONQNXF+CMR10
+%%EndComments
+%%BeginProlog
+%%BeginResource: procset ipe 6.0 60030
+/ipe 40 dict def ipe begin
+/np { newpath } def
+/m { moveto } def
+/l { lineto } def
+/c { curveto } def
+/h { closepath } def
+/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto
+      neg 0 rlineto closepath } def
+/d { setdash } def
+/w { setlinewidth } def
+/J { setlinecap } def
+/j { setlinejoin } def
+/cm { [ 7 1 roll ] concat } def
+/q { gsave } def
+/Q { grestore } def
+/g { setgray } def
+/G { setgray } def
+/rg { setrgbcolor } def
+/RG { setrgbcolor } def
+/S { stroke } def
+/f* { eofill } def
+/f { fill } def
+/ipeMakeFont {
+  exch findfont
+  dup length dict begin
+    { 1 index /FID ne { def } { pop pop } ifelse } forall
+    /Encoding exch def
+    currentdict
+  end
+  definefont pop
+} def
+/ipeFontSize 0 def
+/Tf { dup /ipeFontSize exch store selectfont } def
+/Td { translate } def
+/BT { gsave } def
+/ET { grestore } def
+/TJ { 0 0 moveto { dup type /stringtype eq
+ { show } { ipeFontSize mul -0.001 mul 0 rmoveto } ifelse
+} forall } def
+end
+%%EndResource
+%%EndProlog
+%%BeginSetup
+ipe begin
+%%BeginResource: font ONQNXF+CMR10
+%!PS-AdobeFont-1.1: CMR10 1.00B
+%%CreationDate: 1992 Feb 19 19:54:52
+% Copyright (C) 1997 American Mathematical Society. All Rights Reserved.
+11 dict begin
+/FontInfo 7 dict dup begin
+/version (1.00B) readonly def
+/Notice (Copyright (C) 1997 American Mathematical Society. All Rights Reserved) readonly def
+/FullName (CMR10) readonly def
+/FamilyName (Computer Modern) readonly def
+/Weight (Medium) readonly def
+/ItalicAngle 0 def
+/isFixedPitch false def
+end readonly def
+/FontName /ONQNXF+CMR10 def
+/PaintType 0 def
+/FontType 1 def
+/FontMatrix [0.001 0 0 0.001 0 0] readonly def
+/Encoding 256 array
+0 1 255 {1 index exch /.notdef put} for
+dup 65 /A put
+dup 66 /B put
+dup 67 /C put
+dup 68 /D put
+readonly def
+/FontBBox{-251 -250 1009 969}readonly def
+currentdict end
+currentfile eexec
+d9d66f633b846a97b686a97e45a3d0aa052a014267b7904eb3c0d3bd0b83d891
+016ca6ca4b712adeb258faab9a130ee605e61f77fc1b738abc7c51cd46ef8171
+9098d5fee67660e69a7ab91b58f29a4d79e57022f783eb0fbbb6d4f4ec35014f
+d2decba99459a4c59df0c6eba150284454e707dc2100c15b76b4c19b84363758
+469a6c558785b226332152109871a9883487dd7710949204ddcf837e6a8708b8
+2bdbf16fbc7512faa308a093fe5cf7158f1163bc1f3352e22a1452e73feca8a4
+87100fb1ffc4c8af409b2067537220e605da0852ca49839e1386af9d7a1a455f
+d1f017ce45884d76ef2cb9bc5821fd25365ddea6e45f332b5f68a44ad8a530f0
+92a36fac8d27f9087afeea2096f839a2bc4b937f24e080ef7c0f9374a18d565c
+295a05210db96a23175ac59a9bd0147a310ef49c551a417e0a22703f94ff7b75
+409a5d417da6730a69e310fa6a4229fc7e4f620b0fc4c63c50e99e179eb51e4c
+4bc45217722f1e8e40f1e1428e792eafe05c5a50d38c52114dfcd24d54027cbf
+2512dd116f0463de4052a7ad53b641a27e81e481947884ce35661b49153fa19e
+0a2a860c7b61558671303de6ae06a80e4e450e17067676e6bbb42a9a24acbc3e
+b0ca7b7a3bfea84fed39ccfb6d545bb2bcc49e5e16976407ab9d94556cd4f008
+24ef579b6800b6dc3aaf840b3fc6822872368e3b4274dd06ca36af8f6346c11b
+43c772cc242f3b212c4bd7018d71a1a74c9a94ed0093a5fb6557f4e0751047af
+d72098eca301b8ae68110f983796e581f106144951df5b750432a230fda3b575
+5a38b5e7972aabc12306a01a99fcf8189d71b8dbf49550baea9cf1b97cbfc7cc
+96498ecc938b1a1710b670657de923a659db8757147b140a48067328e7e3f9c3
+7d1888b284904301450ce0bc15eeea00e48ccd6388f3fc3a3b198747b4dc992e
+839a610506453ba7b2a56b2c552fdbe23916074dd54d39ed27a52d90d5d74b07
+a5265e72e3f2e0acd9513e056f15e4bcbb9f409a6f39deae8d919c80ec13c56f
+4864a6ccff1acfda3d992f46d45571fc760dff6ebfb011b6c123167ca96b77a0
+cfa8861be3814e002e0a571e62c497886a135acb53c0acf7fecceef3fa4dc436
+9115af71c9ca5e9e71caaf5a17d5598d8e8bb772ef73e44f07bfcea039dfb0f7
+e2c38f138ee0922fbdd3d7ba9cd9676102b0b9e22a4744edbf299db408b7b0b9
+b66dc8bdb8552ba01aee38e1205b077c2f2c646747c748125f1ccf350e3930ad
+ae5249b3d5cae219454906c86eab1df73eec1e8afa68c7e230dad77d9a072873
+b96e9def3eaec6d5b9a045f9280d79ac9e0857ac916fc29db487a669486de827
+dfa3c487fbaebcbbcb9558497a66ce72491373354376aef7374ae1d709ec9a16
+4c369c237dd28fc4be2843036e872b2a008d0ddea0146e9e5f0ef49715bdcdab
+d4efa0bd65c6822d70b0fbd115be7ebce816ab40d2ecdb17e15f2adb75a84589
+be79a66e6c29ace5156971c30e226b3fc1a7cbfe350c693b23476c3c77f0d214
+06751d2decca6d14a899c877a1f71cf5f205c8ff35460b3792108c17a29a339f
+99a0be9fc33a702d808aab91fd490e6e8c0d59356d2b2cd44371d02d3d040d8f
+121ce31ccece5ddae9c44e87f9139deb1ab6d393e6eadb7a3a33b4217523ec3f
+fec90d8b22e6ccbe26b11e71f55ed334888ac82ad91c436891db5661343dfd21
+45312879ec8d7683212cde2995795e39d4675e000110da0432e48b67649a1b26
+4987a5eca0e6a22e78449eb3c8fd551c4e5e87a6054f1c5971ef8ff30f2783ee
+a5ff2ea77e69b9941d2dbce8a5925612d11b11a7df8bd2f330b197b3dd86c24b
+fc572da77bbfb6af2188ee8dd14cf4ade307fa46d9b8d22aeb35a43f06b5821b
+9e482756623e2f0140d7098532257572404be051e8df6f02f84bfea203c615fa
+fcecfeccb003b823def3067c1997219f65806a8773058cd3424d7c7cd0cf374a
+e86fce217b3bf9aa401c2dd821dd46b39379c8b52c6036ec0f40f93a28c315e5
+ead19ea0801900ccd6ac97146e65ca89d2867893229462bf170182af3e77b420
+2bbb41906d120ed411c876185c41a0372b8ddfe0e8625fcd3e404f9c044620bd
+71c507c4d00bcb084d603f7a14b080d45636acf5e6a650ee2085a677551c09dd
+32c78015d76bb8f2f2da0eab87ee1a7d85c74b8b77f6ce17635a52c38156d333
+ab3d45276fe6e5b54ade0a1e88182b17520412533a15e7f589117836d5ab87ab
+b39b71b7322990f215dbf76876266c309ddae6e644a9d8e5db424962962bd8a0
+d63f41db64526d791ba810a40c52c2f8c6824883c80adb7319a6a789a6284fe3
+8540c49bd012c615e9884a94e4cc8abed89c93bfc593e096f2d2a0503a517103
+59010b87a61e0cf19bcb639df479d7cd66bfc21e654d798eca1a2fe47a895b07
+16410efbe3e70dbed8059b584a7e3c7a1e8dd8b59f4b185715cd1a558a3fccd2
+f4f46d7eb073a7d5db4c302e25421cb49666e97660f8884c760ea1777df5b552
+a97193acae48bfaef59477bf56ef0a119fb48ab70e6d96edb07d71f731e0d4fe
+3181d8d39ebec0da4dfc85cf47408ec49bc65bea2ca37a292d16c00955f12017
+76ea1f3e853813cbd0a712e3500da4072fd738087710abfded16c53d1beb6bc6
+cf4a09593a33440859d4689070b8edc1bd731ff68459036f51d4123f2032bd98
+9256c2d93db97af05aecd7b4b12455d6dd2aea6b7bd5bb94c0fb073523339505
+3ee6f692022ee5f56a29b65644b4d5603cc3a88423e127b23869a5623d55
+00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+cleartomark
+%%EndResource
+/F8 /ONQNXF+CMR10 findfont definefont pop
+%%EndSetup
+0 J 1 j
+q 0.4 w
+31.6395 407.552 m
+103.142 407.574 l
+S
+q 103.142 407.574 m
+93.141 410.904 l
+93.143 404.238 l
+h q f* Q S
+Q
+Q
+q 1 0 0 1 19.515 481.985 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(A)]TJ
+ET
+Q
+q 1 0 0 1 108.51 481.985 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(B)]TJ
+ET
+Q
+q 1 0 0 1 19.516 396.99 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(C)]TJ
+ET
+Q
+q 1 0 0 1 106.511 396.99 cm 1 0 0 1 0 0 cm 0 g
+0 G
+
+1 0 0 1 0 -785.192 cm
+BT
+/F8 9.9626 Tf 0 785.192 Td [(D)]TJ
+ET
+Q
+q 0.4 w
+31.6395 480.548 m
+103.142 480.57 l
+S
+q 103.142 480.57 m
+93.141 483.9 l
+93.143 477.234 l
+h q f* Q S
+Q
+Q
+q 0.4 w
+103.365 407.476 m
+103.411 480.312 l
+S
+q 103.411 480.312 m
+100.071 470.314 l
+106.738 470.31 l
+h q f* Q S
+Q
+q 103.365 407.476 m
+106.705 417.474 l
+100.038 417.478 l
+h q f* Q S
+Q
+Q
+q 0.4 w
+31.369 407.81 m
+31.4148 480.779 l
+S
+q 31.369 407.81 m
+34.7086 417.808 l
+28.0419 417.812 l
+h q f* Q S
+Q
+Q
+q 0.4 w
+31.5722 480.31 m
+103.217 407.863 l
+S
+q 31.5722 480.31 m
+36.2337 470.856 l
+40.9739 475.544 l
+h q f* Q S
+Q
+Q
+showpage
+%%BeginIpeXml: /FlateDecode
+%GhTRUgMRrR&-1)OI)Uncj5CK52cADCoJ<^GCm;>O`NG`,?f,:?Bi<&iUEm-U+U5hm@.5B7#nEpC
+%\_B'e+t@--.OgB`C"Nq'>)psrFNE\Y.!U*FaSYl&3$taHG5"EL#.-]he.s?_?+8,Rq2^ms7L9:B
+%AbX]Y<U"gEY^)eA:W)t_->Lh5[/7@)YUOi\jI`D[^+S3\k>Yh2GLR5ZIN,0k-J9(OcJ9%5@m7OD
+%e]2ZV*-E,UN2:lo6-D0h*f(iWOpQm`;(J?!!p%@p5m&oX=[d[g;`%#I8g*lFJdRe_iu.KGEk(S\
+%0"+.rV0d#\)p9Q??5RR5Z(Qa._/%]Z#[;Xh)XDYS!a82]<>'IK:ZF=(!2P[+RD_-b!)\76""iD-
+%!i2WG:kQ3>U6`Xjgo&:s-:0lXosek+j4_mHD,];-7lkh]One7lf-"@L6Yu@Kp9KWEC@aVdY,5,W
+%mHsW5@U=ok.htA_O\GBflG=pJ4A).jWOX?Ej5(sXp,8o"Wb)]P9%9YCW)aL1JsMX:n#oSW0^kZ`
+%Iq)BA,GKifZ`;haW\m?_<GL@*eYHC=%d;^P3Yg18Q'&M+b"."i)?#Or.:*:^O-H<-QIRq%XUp]H
+%.>&[T'__rN&A2>ulTA:t&t]N.2ccKbgAV:lEs?E+B'G`s<!O%/mco`.MYn@5Ik<qIA=TFso#R)p
+%o:t;C37-m!\*E)QoD8*OrXEa`IKB:'f`D~>
+%%EndIpeXml
+%%Trailer
+end
+%%EOF
diff --git a/6-kostry/6-kostry.tex b/6-kostry/6-kostry.tex
new file mode 100644 (file)
index 0000000..3c1a111
--- /dev/null
@@ -0,0 +1,192 @@
+\input lecnotes.tex
+
+\prednaska{6}{Problém minimální kostry}{}
+
+\s{Zadání úlohy:} Pro neorientovaný graf $G$ s~ohodnocením hran {\I váhami} $w: E(G) \rightarrow \bb R$,
+chceme najít kostru $T$ s minimálním ohodnocením $w(T)=\sum_{e\in E(T)} w(e)$.
+
+\s{Navíc pøedpokládáme:} (bez újmy na~obecnosti)
+\itemize\ibull
+\:Graf $G$ je souvislý (jinak ho nejprve rozlo¾íme na komponenty).
+\:$\forall e,f \in E(G$) : $e\neq f \Rightarrow w(e)\neq w(f)$.
+\endlist
+
+Nyní si uká¾eme tøi algoritmy pro hledání minimální kostry, konkrétnì se jedná
+o~Jarníkùv, Borùvkùv a Kruskalùv algoritmus.
+
+\h{Jarníkùv algoritmus}
+
+\s{Algoritmus:}
+
+\algo
+\algin Graf~$G$ s~ohodnocením~$w$.
+\:Zvolíme libovolný vrchol $v_0\in V(G)$.
+\:$T\leftarrow(\left\{v_0\right\},\emptyset)$ (zatím jednovrcholový strom)
+\:Dokud $\vert V(T) \vert \neq n$:
+\::Vybereme hranu $uv\in E(G) : u\in V(T), v\notin V(T)$ tak, aby $w(uv)$ byla minimálni.
+\::$T\leftarrow T+uv$.
+\algout Minimální kostra~$T$.
+\endalgo
+
+\s{Vìta:} Jarníkùv algoritmus se zastaví po maximálnì $n$ iteracích a vydá minimální kostru grafu $G$.
+
+\proof
+Pøi ka¾dé iteraci algoritmus pøidá jeden vrchol do~$T$, a~proto se po~maximálnì $n$ iteracích zastaví.
+Vydaný graf je strom, proto¾e se stále pøidává list k ji¾ existujícímu stromu, a~jeliko¾ má $n$~vrcholù,
+je to kostra. Zbývá nám u¾ jen dokázat, ¾e nalezená kostra je minimální. K~tomu pomu¾e následující lemma:
+
+{\narrower
+
+\s{Definice:} {\I Øez} v~grafu $G=(V,E)$ je mno¾ina hran $F\subseteq E$ taková, ¾e $\exists  U\subset V$ :
+$F=\left\{uv\in E:u\in U, v\notin U \right\}$.
+
+\s{Lemma (øezové):} Pokud $G$ je graf, $w$ jeho prosté ohodnocení, $F$ je øez v
+grafu $G$ a $f$ je nejlehèí hrana v øezu $F$, pak pro ka¾dou minimální kostru
+$T$ grafu $G$ je $f\in E(T)$.
+
+\proof
+Buï $T$ kostra a $f=uv\notin E(T)$. Pak existuje cesta $P\subseteq T$ spojující $u$ a $v$.
+Cesta musí øez alespoò jednou pøekroèit. Proto existuje $e\in P \cap F$ a navíc víme, ¾e $w(e) > w(f)$. Uva¾me $T'=T-e+f$.
+Tento graf je rovnì¾ kostra grafu $G$, proto¾e odebraním hrany $e$ se graf rozpadne na dvì komponenty a pøidáním
+hrany $f$ se tyto komponenty opìt spojí. Navíc $w(T')=w(T)-w(e)+w(f)<w(T)$.
+\qed
+
+}
+
+\>V~dùkazu korektnosti Jarníkova algoritmu toto lemma vyu¾ijeme tak, ¾e si v¹imneme, ¾e hrany mezi
+vrcholy stromu~$T$ a zbytkem grafu tvoøí øez a algoritmus nejlehèí hranu tohoto øezu pøidá
+do~$T$. Podle lemmatu tedy v¹echny hrany~$T$ musí být souèástí ka¾dé minimální kostry a jeliko¾~$T$ je strom,
+musí být minimální kostrou.
+
+\qed
+
+
+\s{Dùsledky:} Graf $G$ s prostým ohodnocením má pravì jednu minimální kostru. Minimální kostra je
+jednoznaènì urèená lineárním uspoøádáním hran.
+
+\s{Implementace:}
+\itemize\ibull
+\:Pøímoèará: pamatujeme si, které vrcholy a hrany jsou v kostøe $T$ a které ne. Èasová slo¾itost je $\O(nm)$.
+\:Chytøej¹í: Pro $v\notin V(T)$ si pamatujeme $D(v)=\min\left\{w(uv):u\in T\right\}$. Pøi ka¾dém
+prùchodu hlavním cyklem pak procházíme v¹echna~$D(v)$ (to v¾dy trvá $\O(n)$) a pøi pøidání vrcholu do~$T$ kontrolujeme
+okolní~$D(w)$ pro $vw\in E$ a pøípadnì je sni¾ujeme (za~ka¾dou hranu~$\O(1)$). Èasovou slo¾itost tím celkovì
+zlep¹íme na~$\O(n^2+m)=\O(n^2)$.
+\:Také se dá pou¾ít halda pro uchovávání hran nebo hodnot~$D(v)$.
+\endlist
+
+\h{Borùvkùv algoritmus}
+
+\s{Algoritmus:}
+
+\algo
+\algin Graf~$G$ s~ohodnocením~$w$.
+\:$F\leftarrow(V(G),\emptyset)$
+\:Dokud $F$ má alespoò dvì komponenty:
+\::Pro ka¾dou komponentu $T_i$ grafu $F$ vybereme nejlehèí incidentní hranu $t_i$.
+\::V¹echny hrany $t_i$ pøidáme do $F$.
+\algout Minimální kostra~$F$.
+\endalgo
+
+\s{Vìta:} Borùvkùv algoritmus se zastaví po $\left\lceil \log_2 n\right\rceil$ iteracích a vydá minimální kostru grafu $G$.
+
+\proof
+V¹imnìme si nejprve, ¾e po~$k$ iteracích mají v¹echny komponenty grafu~$F$ minimálnì $2^k$ vrcholù
+(indukcí -- na~poèátku jsou v¹echny komponenty jednovrcholové, v~ka¾dé dal¹í
+iteraci se komponenty sluèují do~vìt¹ích,
+ka¾dá s~alespoò jednou sousední, tak¾e se velikosti komponent minimálnì zdvojnásobí).
+Proto nejpozdìji po~$\left\lceil \log_2 n\right\rceil$ iteracích u¾~velikost komponenty dosáhne poètu v¹ech vrcholù a algoritmus
+se zastaví.
+
+Hrany mezi ka¾dou komponentou a~zbytkem grafu tvoøí øez, tak¾e podle øezového
+lemmatu v¹echny hrany pøidané do~$F$ musí být souèástí (jednoznaènì
+urèené) minimální kostry. Graf $F\subseteq G$ je tedy v¾dy les a a¾ se
+algoritmus zastaví, bude roven minimální kostøe.
+\qed
+
+\s{Implementace:}
+\itemize\ibull
+\:Inicializace pøímoèará.
+\:Pomocí DFS rozlo¾íme les na komponenty. Pro ka¾dý vrchol si pamatujeme èíslo komponenty.
+\:Pro ka¾dou hranu zjistíme, do které komponenty patøí, a pro ka¾dou komponentu
+si uchováme nejlehèí hranu.
+\endlist
+
+\>Takto doká¾eme ka¾dou iteraci provést v~èase $\O(m)$ a celý algoritmus dobìhne v~$\O(m\log n)$.
+
+\h{Kruskalùv neboli hladový algoritmus}
+
+\s{Algoritmus:}
+
+\algo
+\algin Graf~$G$ s~ohodnocením~$w$.
+\:Setøídíme v¹echny hrany z $E(G)$ tak, aby: $w(e_1)<...<w(e_m)$.
+\:$F\leftarrow (V(G),\emptyset)$.
+\:Pro $i=1$ do $m$:
+\::Pokud $F+e_i$ je acyklický, provedeme $F\leftarrow F+e_i$.
+\algout Minimální kostra~$F$.
+\endalgo
+
+\s{Vìta:} Kruskalùv algoritmus se zastaví po~$m$ iteracích a vydá minimální kostru.
+
+\proof
+Ka¾dá iterace algoritmu zpracovává jednu hranu, tak¾e iterací je~$m$. Indukcí doká¾eme,
+¾e~$F$ je v¾dy podgrafem minimální kostry: prázdné poèáteèní~$F$ je podgrafem èehokoliv,
+ka¾dá hrana, kterou pak pøidáme, je minimální v~øezu oddìlujícím nìjakou
+komponentu~$F$ od~zbytku grafu (ostatní hrany tohoto øezu je¹tì nebyly
+zpracovány, a~tudí¾ jsou tì¾¹í). Naopak ¾ádná hrana, kterou jsme se rozhodli
+do~$F$ nepøidat, nemù¾e být souèástí minimální kostry, jeliko¾ s~hranami,
+o~kterých ji¾ víme, ¾e v~minimální kostøe le¾í, tvoøí kru¾nici. \qed
+
+% Toto jsme na pøedná¹ce dìlali sporem a mì se to líbí více, ale oba dùkazy
+% urèitì fungují.
+
+\s{Implementace:}
+\itemize\ibull
+\:Setøídìní v èase $\O(m\log m)=\O(m\log n)$.
+\:Pak potøebujeme udr¾ovat komponenty souvislosti grafu~$F$, abychom umìli rychle
+  urèit, jestli právì zpracovávaná hrana vytvoøí kru¾nici. Potøebujeme tedy strukturu
+  pro udr¾ování komponent souvislosti, které se $m$-krát zeptáme, zda dva vrcholy
+  le¾í v~té¾e komponentì (tomu budeme øíkat operace \<Find>), a~$(n-1)$-krát spojíme
+  dvì komponenty do jedné (\<Union>).
+\endlist
+
+\>Kruskalùv algoritmus tedy pobì¾í v~èase $\O(m\log n + mT_f + nT_u)$, kde~$T_u$ je
+èas na~provedení jedné operace \<Union> a $T_f$ na~operaci \<Find>.
+
+\s{Jednoduchá struktura pro komponenty:}
+Budeme si pamatovat v~poli èísla komponent, ve~kterých le¾í jednotlivé
+vrcholy. \<Find> zvládneme v~èase $\O(1)$, ale \<Union> bude stát $\O(n)$. Celý
+algoritmus pak pobì¾í v~èase $\O(m\log n+ m + n^2) = \O(m\log n+n^2)$.
+
+\s{Chytøej¹í struktura:} Ka¾dou komponentou si ulo¾íme jako strom orientovaný smìrem ke koøeni
+-- ka¾dý vrchol si pamatuje svého otce, navíc ka¾dý koøen si pamatuje velikost
+komponenty. 
+%Hloubku podstromu? Zaøazujeme mìlèí pod hlub¹í, ne nutnì men¹í pod vìt¹í.
+%Myslím, ¾e s hloubkami to funguje lépe, ovìøit.
+Operace \<Find> vystoupá z~obou vrcholù ke~koøeni a koøeny porovná. \<Union>
+rovnì¾ najde koøeny a pøipojí koøen men¹í komponenty pod koøen té vìt¹í. Obojí
+zvládneme v~èase lineárním v~hloubce stromu a jak si uká¾eme, tato hloubka je
+v¾dy nejvý¹e logaritmická, a proto celý Kruskalùv algoritmus pobì¾í v~èase
+$\O(m\log n + m\log n + n\log n) = \O(m\log n)$.\foot{%
+Drobnou úpravou bychom mohli dosáhnout daleko efektivnìj¹í struktury, ale tu
+bychom neupotøebili,
+jeliko¾ by nás stejnì brzdilo tøídìní, a analýza slo¾itosti by byla \dots\ inu, slo¾itìj¹í.}
+
+% V originále je jen "strom hloubky..." a to pøece pro obecný (napø.
+% zdegenerovaný) strom neplatí.
+
+% Mimochodem, zde se u¾ mluví o spojování podle hloubky, tak¾e to nahoøe je asi
+% vá¾nì chyba
+\s{Lemma:} \<Union-Find> strom hloubky $h$ má alespoò $2^h$ prvkù.
+
+\proof
+Indukcí: Pokud \<Union> spojí strom s~hloubkou $h$ s jiným s~hloubkou men¹í ne¾ $h$, pak hloubka výsledného
+stromu zùstává~$h$. Pokud spojuje dva stromy stejné hloubky~$h$, pak má výsledný strom hloubku $h+1$.
+Z~indukèního pøedpokladu víme, ¾e strom hloubky $h$ má minimálnì $2^h$ vrcholù,
+a~tedy výsledný strom hloubky $h+1$ má alespoò $2^{h+1}$ vrcholù. \qed
+
+% Union-find je jsme mìli na pøedná¹ce detailnìji rozebraný (i s pseudokódem),
+% není to nutnost, ale mù¾u ho klidnì rozepsat trochu výøeènìji, aby mìl ètenáø
+% vìt¹í jistotu. Zále¾í na tobì.
+
+\bye
diff --git a/6-kostry/Makefile b/6-kostry/Makefile
new file mode 100644 (file)
index 0000000..b86ea6f
--- /dev/null
@@ -0,0 +1,3 @@
+P=6-kostry
+
+include ../Makerules
index 4870357437c3a34cd444f0d5804f006891e89d63..6103891f51a8c0c4936b9136e48c65b4fc288173 100644 (file)
@@ -1,18 +1,18 @@
 \input ../lecnotes.tex
 
-\prednaska{8}{Rozdìl a panuj}{}
+\prednaska{8}{Rozdìl a~panuj}{}
 
-Známá strategie {\sl Divide et Impera} (nìkdy pøekládáno spí¹e jako \uv {Roze¹tvi a panuj}) pochází z dob antického Øíma\foot{Aè se touto strategií øím¹tí panovníci øídili, není nalezen ¾ádný antický zdroj výroku; ten je pøipisován a¾ renesanènímu N. Machiavellimu.
-}, kdy panovník zasel nesvár mezi místní kmeny (èím¾ je rozdìlil a roze¹tval) a následnì pøi¹el, urovnal napìtí, aby je mohl opìt ovládnout a panovat a aby byli v¹ichni spokojení.
+Známá strategie {\sl Divide et Impera} (nìkdy pøekládáno spí¹e jako \uv {Roze¹tvi a~panuj}) pochází z dob antického Øíma\foot{Aè se touto strategií øím¹tí panovníci øídili, není nalezen ¾ádný antický zdroj výroku; ten je pøipisován a¾ renesanènímu N. Machiavellimu.
+}, kdy panovník zasel nesvár mezi místní kmeny (èím¾ je rozdìlil a~roze¹tval) a~následnì pøi¹el, urovnal napìtí, aby je mohl opìt ovládnout a~panovat a~aby byli v¹ichni spokojení.
 
-Tato strategie ov¹em pøetvrává (aè tøeba v jiných oblastech) a pomáhá øe¹it ty problémy, které se dají rozdìlit na men¹í jednodu¹¹í podproblémky.
+Tato strategie ov¹em pøetvrává (aè tøeba V~jiných oblastech) a~pomáhá øe¹it ty problémy, které se dají rozdìlit na~men¹í jednodu¹¹í podproblémky.
 
-Jak tedy algoritmus typu {\it rozdìl a panuj} pracuje? Mìjme problém, který má tu vlastnost, ¾e kdy¾ jej rozdìlíme na nìjaké podproblémy, které mají stejný charakter, a ty vyøe¹íme, slo¾ením jejich øe¹ení mù¾eme získat øe¹ení pùvodního problému. Algoritmus tedy bude rekurzivnì volat sám sebe, ne¾ se dostane k~podproblému
-nìjaké konstantní velikosti, který u¾ umí vyøe¹it triviálnì, a pak se zaène z~rekurze vracet a skládat jednotlivá dílèí øe¹ení.
+Jak tedy algoritmus typu {\it rozdìl a~panuj} pracuje? Mìjme problém, který má tu vlastnost, ¾e kdy¾ jej rozdìlíme na~vhodné podproblémy, které mají stejný charakter, a~ty vyøe¹íme, slo¾ením jejich øe¹ení mù¾eme získat øe¹ení pùvodního problému. Algoritmus tedy bude rekurzivnì volat sám sebe, ne¾ se dostane k~podproblému
+nìjaké konstantní velikosti, který u¾ umí vyøe¹it triviálnì, a~pak se zaène z~rekurze vracet a~skládat jednotlivá dílèí øe¹ení.
 
 \h{Pøíklad 1 -- MergeSort:}
 
-Tento tøídící algoritmus pracuje na principu, ¾e vstup rozdìlíme na~dvì (skoro) stejnì velké èásti, které rekurzivním voláním setøídíme, a~nakonec výsledné dvì posloupnosti slijeme do~jedné. 
+Tento tøídící algoritmus pracuje na~principu, ¾e vstup rozdìlíme na~dvì (skoro) stejnì velké èásti, které rekurzivním voláním setøídíme, a~nakonec výsledné dvì posloupnosti slijeme do~jedné. 
 
 \s{Algoritmus:}
 
@@ -21,13 +21,13 @@ Tento t
 \:Pokud $n \leq 1 \Rightarrow$ vrátíme vstup.
 \:$y_1,\dots,y_{\lfloor n/2 \rfloor} \leftarrow$ \<MergeSort> $(x_1,\dots,x_{\lfloor n/2 \rfloor})$.
 \:$z_1,\dots,z_{\lceil n/2 \rceil} \leftarrow$ \<MergeSort> $(x_{\lfloor n/2 \rfloor + 1},\dots,x_n)$.
-\:Vrátíme Merge$(y_1,\dots,y_{\lfloor n/2 \rfloor}; z_1,\dots,z_{\lceil n/2 \rceil})$.
+\:Vrátíme $\<Merge>(y_1,\dots,y_{\lfloor n/2 \rfloor}; z_1,\dots,z_{\lceil n/2 \rceil})$.
 \endalgo
 
 \noindent
-Na slití dvou setøídìných posloupností do jedné pou¾íváme funkci Merge:
+Na slití dvou setøídìných posloupností do~jedné pou¾íváme funkci Merge:
 
-{\bo Merge$(y_1, \dots,y_a;z_1, \dots,z_b)$:}
+{\bo $\<Merge>(y_1, \dots,y_a;z_1, \dots,z_b)$:}
 \algo
 \:$i \leftarrow 1, j \leftarrow 1, k \leftarrow 1$.
 \:Dokud $k \leq a+b$:
@@ -37,12 +37,12 @@ Na slit
 \endalgo
 
 \s{Pozorování:}
-Merge trvá $\Theta (n)$, nebo» ka¾dou ze~slévaných posloupností projdeme právì jednou.
+\<Merge> trvá $\Theta (n)$, nebo» ka¾dou ze~slévaných posloupností projdeme právì jednou.
 
 \s{Èasová slo¾itost MergeSortu:}
 
-Rozdìlování a slévání nám trvá lineárnì dlouho, tak¾e pro èasovou slo¾itost MergeSortu platí tato rekurentní rovnice: $$T(n)= 2 \cdot T(n/2) + c \cdot n.$$ 
-Pøitom $T(n)$ zde znaèí èas strávený na vstup délky $n$ a $c$ je nìjaká vhodná konstanta. Pro jednoduchost BÚNO pøedpokládejme, ¾e $n$ je mocnina dvojky. Zároveò si jednotky zvolme tak, ¾e bude platit $T(1)=1$. Mù¾eme si tedy rekurentní vztah rozepsat následovnì:
+Rozdìlování a~slévání nám trvá lineárnì dlouho, tak¾e pro èasovou slo¾itost MergeSortu platí tato rekurentní rovnice: $$T(n)= 2 \cdot T(n/2) + c \cdot n.$$ 
+Pøitom $T(n)$ zde znaèí èas strávený na~vstupu délky $n$ a~$c$ je nìjaká vhodná konstanta. Pro jednoduchost BÚNO pøedpokládejme, ¾e $n$ je mocnina dvojky. Zároveò si jednotky zvolme tak, ¾e bude platit $T(1)=1$. Mù¾eme si tedy rekurentní vztah rozepsat následovnì:
 
 $$\eqalign{
 T(n) &= 2 \cdot (2T(n/4) + c \cdot n/2) + c \cdot n = 4T(n/4) + 2cn = \cr
@@ -53,19 +53,19 @@ T(n) &= 2 \cdot (2T(n/4) + c \cdot n/2) + c \cdot n = 4T(n/4) + 2cn = \cr
 Pokud zvolíme $k = \log_2{n}$, získáme:
 $$T(n) = 2^{\log_2{n}} \cdot T(n/2^{\log_2{n}}) + \log_2{n} \cdot c \cdot n = n \cdot T(1) + c \cdot n \cdot \log_2{n} = \Theta(n \log{n}). $$
 
-Ke stejnému výsledku mù¾eme ale dojít také úplnì jinou cestou. Pøedstavme si strom rekurzivních volání. Ka¾dý vrchol má dva syny (dìlíme vstup na~dvì èásti), v~nich¾ jsou vstupy polovièní velikosti. V~ka¾dém vrcholu trávíme èas lineární s~velikostí jeho vstupu, souèet velikostí vstupù pøes ka¾dou hladinu je~$n$ a hloubka stromu musí být $\Theta(\log n)$. Vyjde nám tedy, ¾e $T(n)=\Theta(n\log n)$.\foot{Po pozornìj¹ím zamy¹lení si ètenáø mù¾e uvìdomit, ¾e se jedná vlastnì pouze o~jiný pohled na~stejný dùkaz jako rozepisování rekurentního vzorce.}
+Ke stejnému výsledku mù¾eme ale dojít také úplnì jinou cestou. Pøedstavme si strom rekurzivních volání. Ka¾dý vrchol má dva syny (dìlíme vstup na~dvì èásti), v~nich¾ jsou vstupy polovièní velikosti. V~ka¾dém vrcholu trávíme èas lineární s~velikostí jeho vstupu, souèet velikostí vstupù pøes ka¾dou hladinu je~$n$ a~hloubka stromu musí být $\Theta(\log n)$. Vyjde nám tedy, ¾e $T(n)=\Theta(n\log n)$.\foot{Po pozornìj¹ím zamy¹lení si ètenáø mù¾e uvìdomit, ¾e se jedná vlastnì pouze o~jiný pohled na~stejný dùkaz jako rozepisování rekurentního vzorce.}
 
 \s{Pamì»ová slo¾itost MergeSortu:}
 
 $M(n) = d \cdot n + M(n/2) = d \cdot n + d \cdot n/2 + d \cdot n/4 + \dots \leq 2d n = \Theta(n).$
 
-Toto platí pro nìjakou vhodnou konstantu $d$. Tento vztah mù¾eme opìt nahlédnout napøíklad ze stromu rekurzivních volání.
+Tento vztah platí pro nìjakou vhodnou konstantu $d$. Mù¾eme ho opìt nahlédnout napøíklad ze stromu rekurzivních volání. Podívejme se na~libovolnou cestu od~koøene do~listu. V~jednotlivých vrcholech potøebujeme pamìti pøesnì $d \cdot n/2^k$, kde $k$ je èíslo hladiny. Kdy¾ tyto hodnoty seèteme pøes v¹echny vrcholy na~této cestì, výsledek bude konvergovat k~$2dn$, co¾ dává pamì»ovou slo¾itost $\Theta(n)$.
 
 \s{Závìr:}
-Mergesort bì¾í v èase $\Theta(n \log{n})$ a pamìti $\Theta(n)$. Lineární pamì»ová slo¾itost není výhodná, ale na druhou stranu se tento algoritmus velmi hodí napøíklad na tøídìní lineárních spojových seznamù.
+Mergesort bì¾í V~èase $\Theta(n \log{n})$ a~pamìti $\Theta(n)$. Lineární pamì»ová slo¾itost není výhodná, ale na~druhou stranu se tento algoritmus velmi hodí napøíklad na~tøídìní lineárních spojových seznamù.
 
 \h{Pøiklad 2 -- Násobení èísel:} 
-Pokud násobíme dvì èísla $X$ a $Y$ (obì délky $n$; pokud bylo jedno krat¹í, tak ho doplníme nulami zleva tak, aby byla obì èísla stejnì dlouhá) zpùsobem, který nás uèili na základní ¹kole, výsledný algoritmus má èasovou slo¾itost $\Theta(n^2)$. Proto¾e se jedná o~dost èastou operaci, zamysleme se, zda by ne¹la zrychlit. Nasmìrujme na¹e úvahy na postup {\it rozdìl a panuj}. Rozdìlíme ka¾dého èinitele na dvì stejnì dlouhé èásti. Pro jednoduchost pøedpokládejme, ¾e toto roz¹tìpení èinitele probìhne v¾dy bez zbytku:
+Pokud násobíme dvì èísla $X$ a~$Y$ (obì délky $n$; pokud bylo jedno krat¹í, tak ho doplníme nulami zleva tak, aby byla obì èísla stejnì dlouhá) zpùsobem, který nás uèili na~základní ¹kole, výsledný algoritmus má èasovou slo¾itost $\Theta(n^2)$. Proto¾e se jedná o~dost èastou operaci, zamysleme se, zda by ne¹la zrychlit. Nasmìrujme na¹e úvahy na~postup {\it rozdìl a~panuj}. Rozdìlíme ka¾dého èinitele na~dvì stejnì dlouhé èásti. Pro jednoduchost pøedpokládejme, ¾e toto roz¹tìpení èinitele probìhne v¾dy bez zbytku:
 $$
 X=A \cdot 10^{{n}/2}+B, \qquad Y=C \cdot10^{{n}/{2}}+D.
 $$
@@ -73,10 +73,10 @@ Zde $A, B, C, D$ jsou u
 $$
 XY=(A\cdot 10^{{n}/{2}}+B) (C\cdot 10^{{n}/{2}}+D)=AC \cdot 10^{n}+(AD+BC)\cdot 10^{{n}/{2}}+BD.
 $$
-Nyní, jak vidíme, staèí spoèítat souèin ètyø $(n/2)$-ciferných èísel a pak výsledky spolu seèíst. Uva¾me,
+Nyní, jak vidíme, staèí spoèítat souèin ètyø $(n/2)$-ciferných èísel a~pak výsledky spolu seèíst. Uva¾me,
 jakou bude mít tento algoritmus èasovou slo¾itost:
 $$T(n) = 4T(n/2) + cn.$$
-Toto platí pro nìjakou vhodnou konstantu $c$ (výraz $cn$ je re¾ie na sèítání).  Jednotky si zvolme tak, aby platilo: $$T(1)=1.$$
+Toto platí pro nìjakou vhodnou konstantu $c$ (výraz $cn$ je re¾ie na~sèítání).  Jednotky si zvolme tak, aby platilo: $$T(1)=1.$$
 Jak takovou rekurenci vyøe¹íme? Máme opìt dvì mo¾nosti:
 
 \>{\sl 1. zpùsob: Øe¹ení rozepsáním rekurentního vztahu:}
@@ -88,7 +88,7 @@ T(n)&= 4T(n/2)+cn = \cr
 }$$
 Odtud snadno vypozorujeme, ¾e jednotlivé vztahy se vyvíjejí podle vzorce
 $T(n)=4^kT(n/2^k) + (2^k-1)cn.$ Pro $k=\lceil\log_2 n\rceil$ je ov¹em
-$2^k\le 1$, tak¾e $T(n/2^k)=\Theta(1)$ a dostaneme (horní celou èást zanedbáme,
+$2^k\le 1$, tak¾e $T(n/2^k)=\Theta(1)$ a~dostaneme (horní celou èást zanedbáme,
 ta ovlivní jen konstanty):
 $$
 T(n) = 4^{\log_2 n}\Theta(1) + (2^{\log_2 n}-1)cn = n^2\Theta(1) + (n-1)cn = \Theta(n^2).
@@ -103,8 +103,8 @@ $n/2^i$, tak
 je hluboký $k=\log_2 n$ (opìt si dovolíme zapomenout na~horní celou èást).
 Celkem tedy spotøebujeme èas $\sum_{i=0}^{k}\Theta(2^in) = \Theta(n\cdot\sum_{i=0}^k 2^i) = \Theta(n^2)$.
 
-Oba zpùsoby analýzy se tedy shodují na tom, ¾e ná¹ algoritmus má kvadratickou èasovou
-slo¾itost a ¾e jsme si oproti klasickému algoritmu nikterak nepomohli.
+Oba zpùsoby analýzy se tedy shodují na~tom, ¾e ná¹ algoritmus má kvadratickou èasovou
+slo¾itost a~¾e jsme si oproti klasickému algoritmu nikterak nepomohli.
 Podívejme se je¹tì jednou na~to, jak se ná¹ algoritmus vìtví:
 $$\vbox{\halign{\hfil#\hfil \quad & \hfil#\hfil \quad &\hfil#\hfil\cr
 hloubka & poèet úloh & velikost podúlohy\cr
@@ -123,9 +123,9 @@ P
 $$
 XY=AC\cdot 10^{n}+(AD+BC)\cdot 10^{n/2}+BD.
 $$
-Pøitom ale nepotøebujeme znát souèiny $AD$ ani $BC$ samostatnì, nám staèí zjistit hodnotu celého výrazu $AD+BC$. Kdy¾ budeme znát hodnotu výrazù: $AC$, $BD$ a $(A + B)(C + D)$ (k tomu nám staèí 3 násobení a 2 sèítání), tak mù¾eme výraz $AD + BC$ získat následovnì:
+Pøitom ale nepotøebujeme znát souèiny $AD$ ani $BC$ samostatnì, nám staèí zjistit hodnotu celého výrazu $AD+BC$. Kdy¾ budeme znát hodnotu výrazù: $AC$, $BD$ a~$(A + B)(C + D)$ (k tomu nám staèí 3 násobení a~2 sèítání), tak mù¾eme výraz $AD + BC$ získat následovnì:
 $$(A + B)(C + D) - AC - BD = AC + AD + BC + BD - AC - BD = AD + BC$$
-Nyní nám ji¾ staèí jen tøi násobení, ale potøebujeme dvì sèítání a jedno odèítání navíc. Nicménì tato komplikace je zanedbatelná oproti práci u¹etøené men¹ím vìtvením. (Nová dvì sèítání a jedno odèítání se v èasové slo¾itosti schová do $cn$.) Podívejme se opìt na~tabulku:
+Nyní nám ji¾ staèí jen tøi násobení, ale potøebujeme dvì sèítání a~jedno odèítání navíc. Nicménì tato komplikace je zanedbatelná oproti práci u¹etøené men¹ím vìtvením. (Nová dvì sèítání a~jedno odèítání se V~èasové slo¾itosti schová do~$cn$.) Podívejme se opìt na~tabulku:
 $$\vbox{\halign{\hfil#\hfil \quad & \hfil#\hfil \quad &\hfil#\hfil\cr
 hloubka & poèet úloh & velikost podúlohy\cr
 \noalign{\smallskip\hrule\medskip}
@@ -135,11 +135,11 @@ hloubka & po
 3 & $3^{3}$ & ${n}/{2^{3}}$\cr
 \vdots & \vdots & \vdots\cr
 $k$ & $3^{k}$ & ${n}/{2^{k}}$\cr}}$$
-Ná¹ rekurentní vztah po zbavení se jednoho násobení vypadá následovnì:
+Ná¹ rekurentní vztah po~zbavení se jednoho násobení vypadá následovnì:
 $$T(n) = 3T(n/2)+ cn.$$
 
 Opìt uva¾me, kolik práce spotøebujeme v~souètu pøes v¹echny hladiny (hloubka stromu
-$k$ je opìt $\lceil\log_2 n\rceil$ a horní celou èást zanedbáme):
+$k$ je opìt $\lceil\log_2 n\rceil$ a~horní celou èást zanedbáme):
 $$\sum_{i=0}^{k}3^{i}\cdot {{n}\over{2^{i}}}=\sum_{i=0}^{k} \left( {{3}\over{2}} \right) ^{i}\cdot n=n\cdot \sum_{i=0}^{k} \left( {{3}\over{2}} \right) ^{i}=n\cdot {{ \left( {{3}\over{2}} \right) ^{k+1}-1}\over{{{3}\over{2}}-1}}=
 $$
 $$
@@ -152,12 +152,12 @@ $$
 =\Theta \left( 2^{(\log_2{n}) \cdot \log_2{3}} \right)=\Theta \left( (2^{\log_2{n}})^{\log_2{3}} \right)=\Theta \left( n^{\log_2{3}} \right) =\Theta \left( n^{1.585} \right).
 $$
 Upravený algoritmus má u¾ tedy lep¹í èasovou slo¾itost, konkrétnì $\Theta(n^{1.585})$.
-V~praxi bychom samozøejmì èinitele ne¹tìpili a¾ na jednociferná èísla,
-ale zastavili se u~nìjaké dostateènì malé délky (øeknìme 50~cifer) a tam
+V~praxi bychom samozøejmì èinitele ne¹tìpili a¾ na~jednociferná èísla,
+ale zastavili se u~nìjaké dostateènì malé délky (øeknìme 50~cifer) a~tam
 pøepnuli na~kvadratický algoritmus, který má men¹í re¾ii.
 
 (Mimochodem, asymptoticky tato slo¾itost není nejlep¹í známá, pro násobení èísel existují efektívnìj¹í algoritmy, které
-dosahují èasové slo¾itosti $\Theta(n \log{n})$, ale jednak mají vysoké multiplikativní konstanty a druhak jsou v~nich u¾ potøeba trochu
+dosahují èasové slo¾itosti $\Theta(n \log{n})$, ale jednak mají vysoké multiplikativní konstanty a~druhak jsou v~nich u¾ potøeba trochu
 pokroèilej¹í techniky, jako je diskrétní Fourierova transformace, tak¾e si je necháme na~pøí¹tí semestr.)
 
 \h{Kuchaøková vìta {\it (Master Theorem)}}
@@ -169,7 +169,7 @@ jak se pou
 
 \s{Vìta:} \>{\sl (Master Theorem)} 
 
-Pøedpokládejme, ¾e $T(1)=\Theta(1)$ a $T(n)=a\cdot T(\lceil {{n}\over{b}} \rceil)+\Theta(n^d)$, kde $a \geq 1$, $b>1$, $d \geq 0$ a $a,b \in \bb N$. Potom $T(n)$ je:
+Pøedpokládejme, ¾e $T(1)=\Theta(1)$ a~$T(n)=a\cdot T(\lceil {{n}\over{b}} \rceil)+\Theta(n^d)$, kde $a \geq 1$, $b>1$, $d \geq 0$ a~$a,b \in \bb N$. Potom $T(n)$ je:
 
 \smallskip
 
@@ -180,10 +180,10 @@ P
 
 \proof Pøedpokládejme, ¾e $n=b^k, k \in \bb{N}$, aby platilo $\lceil
 {{n}\over{b}} \rceil = {{n}\over{b}}$. Pou¾ijeme opìt \uv{dùkaz stromem}.
-Strom rekurzivních volání se v¾dy vìtví na stejný poèet vìtví, konkrétnì~$a$,
+Strom rekurzivních volání se v¾dy vìtví na~stejný poèet vìtví, konkrétnì~$a$,
 a~velikosti vstupù klesají $b$-krát. Podívejme se na~tabulku:
 $$\vbox{\halign{\hfil#\hfil \quad & \hfil#\hfil \quad & \hfil#\hfil \quad & \hfil#\hfil \cr
-poèet vrcholù na hladinì & velikost vstupu & èas ve vrcholu & èas na hladinì \cr
+poèet vrcholù na~hladinì & velikost vstupu & èas ve vrcholu & èas na~hladinì \cr
 \noalign{\medskip\hrule\medskip}
 $1$ & $n$ & $\Theta(n^d)$ & $\Theta(n^d)$\cr
 $a$ & $n/{b^1}$ & $\Theta((n/b^1)^d)$ & ${\Theta(a^1 \cdot ({n/{b^1}})^d)}$\cr
@@ -193,17 +193,17 @@ $a^3$ & $n/{b^3}$ & $\Theta((n/b^3)^d)$ & ${\Theta(a^3 \cdot ({n/{b^3}})^d)}$\cr
 $a^k$ & $n/{b^k}$  & $\Theta((n/b^k)^d)$ & ${\Theta(a^k \cdot ({n/{b^k}})^d)}$\cr}}$$
 
 \noindent
-Celkový èas potøebný na vyøe¹ení v¹ech dílèích podúloh je následovný:
+Celkový èas potøebný na~vyøe¹ení v¹ech dílèích podúloh je následovný:
 $$
 T(n)=\sum_{i=0}^k\Theta \left( a^i \left( {n\over{b^i}} \right) ^d \right)=\sum_{i=0}^k\Theta \left( n^d \left( {a\over{b^d}} \right) ^i \right)=\Theta \left( n^d \cdot \sum_{i=0}^k \left( {a\over{b^d}} \right) ^i \right).
 $$
-V¹imnìme si sumy $\sum_{i=0}^k \left( {a\over{b^d}} \right) ^i$. Jedná se vlastnì o geometrickou øadu s kvocientem $q={a\over{b^d}}$. Rozli¹me následující pøípady:
+V¹imnìme si sumy $\sum_{i=0}^k \left( {a\over{b^d}} \right) ^i$. Jedná se vlastnì o~geometrickou øadu s kvocientem $q={a\over{b^d}}$. Rozli¹me následující pøípady:
 
-\>{\I 1.} $q<1$: Práce na~jednotlivých hladinách exponenciálnì ubývá a souèet øady (i~kdyby byla nekoneèná) se dá omezit nìjakou konstantou, tedy $T(n)=\Theta(n^d)$.
+\>{\I 1.} $q<1$: Práce na~jednotlivých hladinách exponenciálnì ubývá a~souèet øady (i~kdyby byla nekoneèná) se dá omezit nìjakou konstantou, tedy $T(n)=\Theta(n^d)$.
 
-\>{\I 2.} $q=1$: Práce na~jednotlivých hladinách je stejnì, to znamená, ¾e suma je právì $1 + \log_b n$, a tedy $T(n) = \Theta(n^d \cdot \log{n})$.
+\>{\I 2.} $q=1$: Práce na~jednotlivých hladinách je stejnì, to znamená, ¾e suma je právì $1 + \log_b n$, a~tedy $T(n) = \Theta(n^d \cdot \log{n})$.
 
-\>{\I 3.} $q>1$: Práce na~jednotlivých hladinách pøibývá, tak¾e musíme geometrickou øadu seèíst poctivì. Víme, ¾e souèet geometrické øady od $0$ do $k$ s kvocientem $q$ a prvním èlenem $1$ je: ${q^{k+1} - 1}\over{q - 1}$, co¾ pøibli¾ne odpovídá $q^k$. Pak tedy platí: $$T(n) = \Theta(n^d \cdot q^{\log_b{n}}).$$ Tento výraz vypadá ponìkud o¹klivì, ale je¹tì ho trochu (alespoò kosmeticky) upravíme:
+\>{\I 3.} $q>1$: Práce na~jednotlivých hladinách pøibývá, tak¾e musíme geometrickou øadu seèíst poctivì. Víme, ¾e souèet geometrické øady od~$0$ do~$k$ s kvocientem $q$ a~prvním èlenem $1$ je: ${q^{k+1} - 1}\over{q - 1}$, co¾ pøibli¾ne odpovídá $q^k$. Pak tedy platí: $$T(n) = \Theta(n^d \cdot q^{\log_b{n}}).$$ Tento výraz vypadá ponìkud o¹klivì, ale je¹tì ho trochu (alespoò kosmeticky) upravíme:
 $$
 \Theta\left(n^d \cdot q^{\log_b{n}}\right)=\Theta\left({ a^{\log_b{n}} \cdot n^d \over (b^d)^{\log_b{n}}}\right)=\Theta\left({\left(b^{\log_b{a}}\right)^{\log_b{n}} \cdot n^d \over{\left(b^d\right)^{\log_b{n}}}}\right)=
 $$
@@ -222,11 +222,11 @@ Vra
 \:$n^-$ \dots nejbli¾¹í ni¾¹í mocnina $b$
 \endlist
 
-Platí tedy, ¾e $T(n^-) \le T(n) \le T(n^+)$. Ale $T(n^-) = \Theta((n^-)^c) = \Theta(n^c)$ a $T(n^+) = \Theta((n^+)^c) = \Theta(n^c)$. Pak tedy i $T(n) = \Theta(n^c)$. Vìta tedy platí i v~pøípadì, ¾e $n$ není mocnina~$b$.
+Platí tedy, ¾e ${n \over b} \leq n^- \leq n \leq n^+ \leq n \cdot b$. Zajisté i platí $T(n^-) \le T(n) \le T(n^+)$. Ale $T(n^-) = \Theta((n^-)^c) = \Theta(n^c)$ a~$T(n^+) = \Theta((n^+)^c) = \Theta(n^c)$. Pak tedy i $T(n) = \Theta(n^c)$. Vìta tedy platí i v~pøípadì, ¾e $n$ není mocnina~$b$.
 \qed
 
 \s{Pøíklad:}
-Porovnejme si nìkteré známé algoritmy a jejich èasovou slo¾itost pomocí \>{\sl Master Theoremu}:
+Porovnejme si nìkteré známé algoritmy a~jejich èasovou slo¾itost pomocí \>{\sl Master Theoremu}:
 $$\vbox{\halign{# \quad  \quad & # \quad  \quad & # \quad  \quad & # \quad  \quad & #\cr
 algoritmus & $a$ & $b$ & $d$ & èasová slo¾itost\cr
 \noalign{\smallskip\hrule\medskip}
@@ -238,56 +238,56 @@ Bin
 
 \h{Hledání $k$-tého nejmen¹ího prvku (mediánu)}
 
-V tomto oddílu se budeme zabývat tím, jak co nejrychleji najít jakékoli posloupnosti $n$ èísel $k$-tý nejmen¹í prvek, popøípadì medián. Pro ty, kdo medián neznají, tu máme definici:
+V tomto oddílu se budeme zabývat tím, jak co nejrychleji najít V~jakékoli posloupnosti $n$ èísel $k$-tý nejmen¹í prvek, popøípadì medián. Pro ty, kdo medián neznají, tu máme definici:
 
 \s{Definice:}
-{\I Medián} posloupnosti $a_1, a_2,\ldots , a_n$ je takové $a_i$, kde nejvý¹e $n/2$ prvkù je men¹ích ne¾ $a_i$ a nejvý¹e $n/2$ prvkù je vìt¹ích ne¾ $a_i$. Platí tedy, ¾e medián je buï $\lfloor n/2\rfloor$-tý, nebo $\lceil n/2\rceil$-tý nejmen¹í prvek posloupnosti.
+{\I Medián} posloupnosti $a_1, a_2,\ldots , a_n$ je takové $a_i$, ¾e nejvý¹e $n/2$ prvkù je men¹ích ne¾ $a_i$ a~nejvý¹e $n/2$ prvkù je vìt¹ích ne¾ $a_i$. Platí tedy, ¾e medián je buï $\lfloor n/2\rfloor$-tý, nebo $\lceil n/2\rceil$-tý nejmen¹í prvek posloupnosti.
 
-Nejjednodu¹¹ím øe¹ením by urèitì bylo celou posloupnost nejdøíve setøídit a pak u¾ jednodu¹e vybrat po¾adovaný prvek. To bychom dokázali v celkem slu¹ném èase $\Theta(n\log n)$, ale u¾ teï mù¾eme prozradit, ¾e to jde v èase $\Theta(n)$. Jak?
+Nejjednodu¹¹ím øe¹ením by urèitì bylo celou posloupnost nejdøíve setøídit a~pak u¾ jednodu¹e vybrat po¾adovaný prvek. To bychom dokázali V~celkem slu¹ném èase $\Theta(n\log n)$, ale u¾ teï mù¾eme prozradit, ¾e to jde V~èase $\Theta(n)$. Jak?
 
-Pou¾ijme metodu {\it rozdìl a panuj}. Nìjakým zpùsobem si zvolíme jeden prvek posloupnosti a nazveme ho {\it pivot}. Poté rozdìlíme zadanou posloupnost na~tøi disjunktní mno¾iny. Do první dáme v¹echny prvky men¹í ne¾ pivot, do druhé stejné jako pivot a do tøetí vìt¹í ne¾ pivot. Tímto máme zaji¹tìno, ¾e prvky z první mno¾iny jsou urèitì men¹í ne¾ prvky z druhé a ty ne¾ prvky z tøetí.
+Pou¾ijme metodu {\it rozdìl a~panuj}. Nìjakým zpùsobem si zvolíme jeden prvek posloupnosti a~nazveme ho {\it pivot}. Poté rozdìlíme zadanou posloupnost na~tøi disjunktní mno¾iny. do~první dáme v¹echny prvky men¹í ne¾ pivot, do~druhé rovné pivotu jako pivot a~do tøetí vìt¹í ne¾ pivot. Tímto máme zaji¹tìno, ¾e prvky z první mno¾iny jsou urèitì men¹í ne¾ prvky z druhé a~ty ne¾ prvky z tøetí.
 O tom, jak jsou prvky uspoøádány uvnitø tìchto mno¾in, ale nic nevíme.
 
-V posledním kroku na¹eho algoritmu se pak rozhodneme, na kterou mno¾inu svùj algoritmus rekurzivnì zavoláme. Pokud je $k$ men¹í ne¾ velikost první mno¾iny, pokraèujeme v první mno¾inì, pokud je $k$ men¹í ne¾ souèet velikostí první a druhé mno¾iny, pak hledaným prvkem je právì vybraný pivot a algoritmus skonèí, a nakonec pokud ani jedna podmínka splnìna nebyla, pustíme se do hledání ve tøetí mno¾inì, ov¹em u¾ nehledáme $k$-tý nejmen¹í prvek, ale $l$-tý, kde $l$ se rovná $k$ minus velikost prvních dvou mno¾in. Pro vìt¹í názornost zapí¹eme tento algoritmus formálnìji:
+V posledním kroku na¹eho algoritmu se pak rozhodneme, na~kterou mno¾inu svùj algoritmus rekurzivnì zavoláme. Pokud je $k$ men¹í nebo rovno ne¾ velikost první mno¾iny, pokraèujeme V~první mno¾inì, pokud je $k$ men¹í nebo rovno ne¾ souèet velikostí první a~druhé mno¾iny, pak hledaným prvkem je právì vybraný pivot a~algoritmus skonèí, a~nakonec pokud ani jedna podmínka splnìna nebyla, pustíme se do~hledání ve tøetí mno¾inì, ov¹em u¾ nehledáme $k$-tý nejmen¹í prvek, ale $l$-tý, kde $l$ se rovná $k$ minus velikost prvních dvou mno¾in. Pro vìt¹í názornost zapí¹eme tento algoritmus formálnìji:
 
 \algo
-{\bo Select($k,X$):} (Hledání $k$-tého nejmen¹ího prvku mno¾ine $X$)
+{\bo Select($k,X$):} (Hledání $k$-tého nejmen¹ího prvku V~mno¾ine $X$)
 \:Jestli¾e $\vert X\vert \le 1$, vyøe¹íme triviálnì.
 \:Zvolíme pivota $p \in X$.
-\:Rozdìlíme mno¾inu X na tøi podmno¾iny: $L = \{x \in X; x < p\},$ $ S = \{x \in X; x = p\}, P = \{x \in X; x > p\}$.
+\:Rozdìlíme mno¾inu X na~tøi podmno¾iny: $L = \{x \in X; x < p\},$ $ S = \{x \in X; x = p\}, P = \{x \in X; x > p\}$.
 \:Jestli¾e $k \le \vert L\vert$, vrátíme výsledek funkce \<Select>($k$, $L$).
 \:Jestli¾e $ \vert L\vert < k \le \vert L\vert + \vert S\vert$, vrátíme pivota $p$.
 \:Jestli¾e $ \vert L\vert + \vert S\vert < k$, vrátíme výsledek funkce \<Select>($k - \vert L\vert - \vert S\vert, P$).
 \endalgo
-Na první pohled je vidìt, ¾e se algoritmus zastaví (vstup se v¾dy zmen¹í alespoò o 1) a ¾e vydá v¾dy správný výsledek. Jak je to ov¹em s èasovou slo¾itostí? Rozdìlení do mno¾in a podmínky v druhém a tøetím kroku mají lineární slo¾itost, èemu¾ se nevyhneme. Pøi ne¹»astné volbì pivota se nám mù¾e stát, ¾e poèet rekurentních volání mù¾e být a¾ $n$, tedy celková slo¾itost v nejhor¹ím pøípadì je $\Theta(n^2)$, èím¾ jsme si oproti prostému setøídìní je¹tì pohor¹ili. Co s tím? Jak je vidìt, velmi dùle¾itá je volba pivota. Tu mù¾eme provést nìkolika zpùsoby:
+Na první pohled je vidìt, ¾e se algoritmus zastaví (vstup se v¾dy zmen¹í alespoò o~1) a~¾e vydá v¾dy správný výsledek. Jak je to ov¹em s èasovou slo¾itostí? Rozdìlení do~mno¾in a~podmínky V~druhém a~tøetím kroku mají lineární slo¾itost, èemu¾ se nevyhneme. Pøi ne¹»astné volbì pivota se nám mù¾e stát, ¾e poèet rekurentních volání mù¾e být a¾ $n$, tedy celková slo¾itost V~nejhor¹ím pøípadì je $\Theta(n^2)$, èím¾ jsme si oproti prostému setøídìní je¹tì pohor¹ili. Co s tím? Jak je vidìt, velmi dùle¾itá je volba pivota. Tu mù¾eme provést nìkolika zpùsoby:
 
-a) Pivot by se setøídìné posloupnosti vyskytoval uprostøed, vstup by se tedy stále pùlil. Èasovou slo¾itost vypoèteme z rekurentního zápisu:
+a) Pivot by se V~setøídìné posloupnosti vyskytoval uprostøed, vstup by se tedy stále pùlil. Èasovou slo¾itost vypoèteme z rekurentního zápisu:
 $$ T(n) = T\left({n \over 2}\right) + \Theta(n) = \Theta\left(n + {n \over 2} + {n \over 4} + \dots\right) = \Theta(n). $$
-To by bylo sice skvìlé, ale nalezení takového pivota je vlastnì vyøe¹ení úlohy hledání mediánu, o co¾ se sna¾íme. Tedy jsme si vùbec nepomohli.
+To by bylo sice skvìlé, ale nalezení takového pivota je vlastnì vyøe¹ení úlohy hledání mediánu, o~co¾ se sna¾íme. Tedy jsme si vùbec nepomohli.
 
-b) Pivot by se v setøídìné posloupnosti náchazel v prostøedních dvou ètvrtinách (nazvìme tento prvek \uv{l¾imedián}). Tím bychom v ka¾dém kroku urèitì odstranili mno¾inu velikosti alespoò ètvrtiny vstupu. Èasová slo¾itost tohoto øe¹ení by byla:
+b) Pivot by se V~setøídìné posloupnosti náchazel V~prostøedních dvou ètvrtinách (nazvìme tento prvek \uv{\I l¾imedián}). Tím bychom V~ka¾dém kroku urèitì odstranili mno¾inu velikosti alespoò ètvrtiny vstupu. Èasová slo¾itost tohoto øe¹ení by byla:
 
 $$ T(n) = T\left({3 \over 4}n\right) + \Theta(n) = \Theta\left(n + {3 \over 4}n + {9 \over 16}n + \dots\right) = \Theta(n). $$
 
-Tímto bychom tedy také dosáhli lineární èasové slo¾itosti. Ale jak vybrat pivota tak, aby se nacházel v prostøedních dvou ètvrtinách a aby nám nám to nepokazilo lineární slo¾itost?
+Tímto bychom tedy také dosáhli lineární èasové slo¾itosti. Ale jak vybrat pivota tak, aby se nacházel V~prostøedních dvou ètvrtinách a~aby nám nám to nepokazilo lineární slo¾itost?
 
-Zkusme vybrat pivota náhodnì. Pravdìpodobnost, ¾e vytáhneme zrovna l¾imedián je alespoò $1/2$. (Pokud by se prvky nemohly opakovat a byl jich sudý poèet, byla by to pøesnì $1/2$.) Tuto pravdìpodobnost si oznaème $p$. 
+Zkusme vybrat pivota náhodnì. Pravdìpodobnost, ¾e vytáhneme zrovna l¾imedián, je alespoò $1/2$. (Pokud by se prvky nemohly opakovat a~byl jich sudý poèet, byla by to pøesnì $1/2$.) Tuto pravdìpodobnost si oznaème $p$. 
 
 \s{Volba l¾imediánu}
 \algo
 \:Vybereme rovnomìrnì náhodnì pivota z mno¾iny $X$.
 \:Otestujeme, zda je pivot l¾imedián.
-\:Pokud není $\Rightarrow$ pokraèuj znovu od zaèátku, jinak konec.
+\:Pokud není $\Rightarrow$ pokraèujeme znovu od~zaèátku, jinak konec.
 \endalgo
 
 Pivota vybíráme rovnomìrnì náhodnì, tedy ka¾dý prvek posloupnosti má stejnou pravdìpodobnost, ¾e bude vybrán. 
 
 Oznaème si $T$ náhodnou velièinu znaèící dobu bìhu algoritmu. Potom støední hodnota této náhodné velièiny ${\bb E}[T] = \Theta(n) \cdot {\bb E}$[{\I poèet~prùchodù~cyklem}].
 
-Teï si doka¾me, ¾e budeme-li náhodnì vybírat pivota tak dlouho, a¾ se strefíme do l¾imediánu, tak \uv{v prùmìru} budeme muset tahat jen $1/p$-krát.
+Teï si doka¾me, ¾e budeme-li náhodnì vybírat pivota tak dlouho, a¾ se strefíme do~l¾imediánu, tak \uv{v prùmìru} budeme muset tahat jen $1/p$-krát.
 
-\s{Lemma: } {\I (O d¾bánu a vodì)}
-Èekání na náhodnou událost, která nastává s pravdìpodobností $p$, trvá v prùmìru $1/p$.
+\s{Lemma: } {\I (O d¾bánu a~vodì)}
+Èekání na~náhodnou událost, která nastává s pravdìpodobností $p$, trvá V~prùmìru $1/p$.
 
 \proof
 Oznaème $N$ poèet pokusù. Potom støední hodnota poètu pokusù je:
@@ -297,57 +297,59 @@ $$\eqalign{
     {\bb E}[N] \cdot (1 - 1 + p) & = 1\cr
     {\bb E}[N] & = 1/p\cr
 }$$
-S pravdìpodobností $p$ událost nastane a s odvrácenou pravdìpodobností ($1-p$) jsme jeden pokus promarnili a musíme celý proces opakovat. Jednoduchými úpravami nám vyjde, ¾e støední hodnota poètu pokusù je $1/p$.
+S pravdìpodobností $p$ událost nastane a~s odvrácenou pravdìpodobností ($1-p$) jsme jeden pokus promarnili a~musíme celý proces opakovat. Jednoduchými úpravami nám vyjde, ¾e støední hodnota poètu pokusù je $1/p$.
 
 \noindent
 \uv{V prùmìru se tedy chodí $1/p$-krát se d¾bánem pro vodu, ne¾ se ucho utrhne...}
 \qed
 
-Z lemmatu tedy plyne, ¾e v na¹em pøípadì ${\bb E}$[{\I poèet prùchodù cyklem}]$ \le 2 $. V prùmìru tedy na druhý pokus vytáhneme l¾imedián. Ten pak pou¾ijeme jako pivot. Tímto tudí¾ dosáhneme prùmìrné èasové slo¾itosti $\Theta(n)$.
+Z lemmatu tedy plyne, ¾e V~na¹em pøípadì ${\bb E}$[{\I poèet prùchodù cyklem}]$ \le 2 $. V~prùmìru tedy na~druhý pokus vytáhneme l¾imedián. Ten pak pou¾ijeme jako pivot. Tímto tudí¾ dosáhneme prùmìrné èasové slo¾itosti $\Theta(n)$.
 
-\s{Vìta: } Pravdìpodobnostním algoritmem lze najít $k$-tý nejmen¹í prvek z $n$ prvkù prùmìrném èase $\Theta(n)$.
+\s{Vìta: } Pravdìpodobnostním algoritmem lze najít $k$-tý nejmen¹í prvek z $n$ prvkù V~prùmìrném èase $\Theta(n)$.
 
-K volbì l¾imediánu jsme volili v¾dy náhodného pivota, jednalo se tedy o randomizovaný algoritmus. Stejný výsledek nám ale vyjde i pøi deterministickém algoritmu, kdy budeme volit pivota v¾dy stejnì (napø. na první pozici ve vstupní posloupnosti), ale budeme mít nìjak zaruèeno, ¾e vstupy budou dostateènì náhodné. U randomizovaného algoritmu se jednalo o prùmìr pøes náhodná èísla, u deterministického algoritmu o prùmìr pøes náhodné vstupy.
+\s{Poznámka: } Kdy¾ budeme volit pivota náhodnì a~nebudeme se starat o~to, zda se jedná o~l¾imedián, èi ne, tak dostaneme také prùmìrný èas $\Theta(n)$.
 
-U¾ tedy víme, ¾e kdy¾ budeme volit pivota hodnì ¹patnì, tak se mù¾eme dostat a¾ na èasovou slo¾itost $\Theta(n^2)$. Kdy¾ budeme volit o nìco lépe, tak se mù¾eme dosáhnout prùmìrné èasové slo¾itosti $\Theta(n)$. Existuje ale i algoritmus, který pracuje v¾dy (nejen v prùmìrném pøípadì) v èase $\Theta(n)$. Podívejme se, jak bude vypadat\dots
+K volbì l¾imediánu jsme volili v¾dy náhodného pivota, jednalo se tedy o~randomizovaný algoritmus. Stejný výsledek nám ale vyjde i pøi deterministickém algoritmu, kdy budeme volit pivota v¾dy stejnì (napø. na~první pozici ve vstupní posloupnosti), ale budeme mít nìjak zaruèeno, ¾e vstupy budou dostateènì náhodné. U randomizovaného algoritmu se jednalo o~prùmìr pøes náhodná èísla, u deterministického algoritmu o~prùmìr pøes náhodné vstupy.
+
+U¾ tedy víme, ¾e kdy¾ budeme volit pivota hodnì ¹patnì, tak se mù¾eme dostat a¾ na~èasovou slo¾itost $\Theta(n^2)$. Kdy¾ budeme volit o~nìco lépe, tak se mù¾eme dosáhnout prùmìrné èasové slo¾itosti $\Theta(n)$. Existuje ale i algoritmus, který pracuje v¾dy (nejen V~prùmìrném pøípadì) V~èase $\Theta(n)$. Podívejme se, jak bude vypadat \dots
 
 \s{Volba pivota:}
 \algo
-\:Rozdìlíme vstup na pìtice \dots $\Theta(n)$
+\:Rozdìlíme vstup na~pìtice \dots $\Theta(n)$
 \:Spoèteme medián ka¾dé pìtice \dots $\Theta(n)$
-\:Spoèteme medián mediánù pìtic tak, ¾e rekurzivnì zavoláme tentý¾ algoritmus \<Select>($n / 10$, {mediány pìtic}) a to je pivot.
+\:Spoèteme medián mediánù pìtic tak, ¾e rekurzivnì zavoláme tentý¾ algoritmus \<Select>($n / 10$, {mediány pìtic}). Tím získáme pivota.
 \endalgo
 
-Takováto volba pivota nám zaruèí, ¾e jím bude medián - tedy nejlep¹í mo¾ný pivot. Pro úplnost se podívejme, jak bude vypadat celý algoritmus na hledání $k$-tého nejmen¹ího prvku posloupnosti za pou¾ití na¹í nové volby pivota:
+Pro úplnost se podívejme, jak bude vypadat celý algoritmus na~hledání $k$-tého nejmen¹ího prvku posloupnosti za pou¾ití na¹í nové volby pivota:
 
-\s{Deterministický lineární algoritmus na výbìr mediánu lineárnì}
+\s{Deterministický lineární algoritmus na~výbìr mediánu lineárnì}
 \algo
 \algin $X = x_1 \dots x_n$, $k$ ($1 \le k \le n$)
-\:Pokud $n \le 5 \Rightarrow$ hrubá síla
-\:Vstup rozdìlíme na pìtice $P_1 \dots P_{\lceil n/5 \rceil}$
-\:$\forall i: m_i \leftarrow$ medián($P_i$)
-\:$p \leftarrow$ Select($m_1 \dots m{\lceil n/5 \rceil}, \lceil n/10 \rceil$)
-\:Rozdìlíme X na L,S,P
-\:Rekurzivnì se zavoláme na jednu z L,S,P (tu, ve které se má vyskytovat hledaný prvek)
+\:Pokud $n \le 5 \Rightarrow$ vyøe¹íme hrubou silou.
+\:Vstup rozdìlíme na~pìtice $P_1 \dots P_{\lceil n/5 \rceil}$.
+\:$\forall i: m_i \leftarrow$ medián($P_i$).
+\:$p \leftarrow$ \<Select>($m_1 \dots m{\lceil n/5 \rceil}, \lceil n/10 \rceil$).
+\:Rozdìlíme $X$ na~$L,S,P$
+\:Rekurzivnì se zavoláme na~jednu z $L,S,P$ (tu, ve které se má vyskytovat hledaný prvek)
 \endalgo
 
-Ná¹ deterministický algoritmus tedy roz¹iøuje pùvodní algoritmus tak, ¾e v¾dy, kdy¾ je potøeba zvolit pivota z posloupnosti X, tak si posloupnost rozdìlí na pìtice a v ka¾dé spoète medián. Následnì potøebuje medián z tìchto mediánù, co¾ bude výsledný pivot - medián v pùvodní posloupnosti. Ten získá tak, ¾e se znovu zavolá na \<Select> s parametry posloupnost mediánù a èíslo $\lceil n/10 \rceil$, nebo» potøebuje právì prostøední prvek této poslounosti, která má délku $\lceil n/5 \rceil$. Kdy¾ máme koneènì výhodného pivota (medián) nalezeného, tak mù¾eme pokraèovat, ¾e si posloupnost opìt rozdìlíme na tøi hromádky - prvky men¹í (L), stejné (S) a vìt¹í (P) ne¾ pivot. Následnì jen vybereme hromádku, která odpovídá umístìní $k$-tého nejmen¹ího prvku, a na tu se rekurzivnì zavoláme.
+Ná¹ deterministický algoritmus tedy roz¹iøuje pùvodní algoritmus tak, ¾e v¾dy, kdy¾ je potøeba zvolit pivota z posloupnosti X, tak si posloupnost rozdìlí na~pìtice a~v ka¾dé spoète medián. Následnì potøebuje medián z tìchto mediánù, co¾ bude výsledný pivot -- medián V~pùvodní posloupnosti. Ten získá tak, ¾e se znovu zavolá na~\<Select> s parametry posloupnost mediánù a~èíslo $\lceil n/10 \rceil$, nebo» potøebuje právì prostøední prvek této poslounosti, která má délku $\lceil n/5 \rceil$. Kdy¾ máme koneènì výhodného pivota nalezeného, tak mù¾eme pokraèovat, ¾e si posloupnost opìt rozdìlíme na~tøi hromádky -- prvky men¹í ($L$), stejné ($S$) a~vìt¹í ($P$) ne¾ pivot. Následnì jen vybereme hromádku, která odpovídá umístìní $k$-tého nejmen¹ího prvku, a~na tu se rekurzivnì zavoláme.
 
 Abychom dokázali, ¾e tento algoritmus bude mít opravdu lineární èasovou slo¾itost, musíme si nejdøíve dokázat následující lemma:
 
-\s{Lemma:} V ka¾dém kroku vypadne alespoò ${3/10}\cdot n$ prvkù.
+\s{Lemma:} V~ka¾dém kroku vypadne alespoò ${3/10}\cdot n$ prvkù.
 
 \proof 
-V dùkazu budeme trochu ètenáøe ¹idit tím, ¾e budeme pøedpokládat celoèíselné výsledky. Ètenáø si mù¾e jako cvièení dokázat, ¾e kdyby výsledky nevycházely celoèíselnì, tak to nevadí.
+V dùkazu budeme trochu ètenáøe ¹idit tím, ¾e budeme pøedpokládat celoèíselné výsledky (napø. ¾e poèet prvkù posloupnosti, na~kterou se zavoláme, je v¾dy dìlitelný pìti). Ètenáø si mù¾e jako cvièení dokázat, ¾e kdyby výsledky nevycházely celoèíselnì, tak to nevadí.
 
-Pøedstavme si vybrané pìtice seøazené podle velikosti od nejvìt¹ího prvku a zakresleme je do sloupcù. Jejich mediány tedy vyplòují prostøední øadu. Tyto pìtice pak seøaïme podle velikosti jejich mediánù (nejmen¹í vlevo)\foot{Algoritmus ov¹em nikde takto pìtice neøadí! Jen nám to pomù¾e v úvaze o správnosti.}. Hledaný pivot se tedy nachází (pokud pøedpokládáme pro jednoduchost lichý poèet pìtic) pøesnì uprostøed. O prvcích nad pivotem a napravo od nìj mù¾eme urèitì øíct, ¾e jsou vìt¹í nebo rovny pivotu, prvky pod ním a nalevo od nìj jsou zase urèitì men¹í nebo rovny pivotu.
+Pøedstavme si vybrané pìtice seøazené podle velikosti od~nejvìt¹ího prvku a~zakresleme je do~sloupcù. Jejich mediány tedy vyplòují prostøední øadu. Tyto pìtice pak seøaïme podle velikosti jejich mediánù (nejmen¹í vlevo)\foot{Algoritmus ov¹em nikde takto pìtice neøadí! Jen nám to pomù¾e v~dùkazu správnosti.}. Hledaný pivot se tedy nachází (pokud pøedpokládáme pro jednoduchost lichý poèet pìtic) pøesnì uprostøed. o~prvcích nad pivotem a~napravo od~nìj mù¾eme urèitì øíct, ¾e jsou vìt¹í nebo rovny pivotu, prvky pod ním a~nalevo od~nìj jsou zase urèitì men¹í nebo rovny pivotu.
 
 Podle konstrukce algoritmu tedy zaruèenì vypadne jedna nebo druhá skupina prvkù. Obì tyto skupiny pøitom obsahují, jak je vidìt z obrázku, alespoò $3/10 \cdot n$ prvkù.
 \qed
 
 \figure{petice.eps}{Pìtice}{125mm}
 
-Nyní u¾ se tedy mù¾eme pustit do výpoètu èasové slo¾itosti. V ka¾dém kroku funkce zavolá sama sebe nejdøíve na vstup velikosti ${n \over 5}$ a poté na vstup velikosti nejvý¹e ${7 \over 10}n$. Ostatní operace zùstávají lineární. Èasovou slo¾itost v nejhor¹ím pøípadì tedy mù¾eme zapsat rekurentním vzorcem:
+Nyní u¾ se tedy mù¾eme pustit do~výpoètu èasové slo¾itosti. V~ka¾dém kroku funkce zavolá sama sebe nejdøíve na~vstup velikosti ${n \over 5}$ a~poté na~vstup velikosti nejvý¹e ${7 \over 10}n$. Ostatní operace zùstávají lineární. Èasovou slo¾itost V~nejhor¹ím pøípadì tedy mù¾eme zapsat rekurentním vzorcem:
 
 $$ T(n) = \Theta(n) + T\left({n \over 5}\right) + T\left({7 \over 10}n\right). $$
 
@@ -355,50 +357,50 @@ Tento rekurentn
 
 $$ cn = n + {1 \over 5}cn + {7 \over 10}cn \quad\Longleftrightarrow\quad c = 10. $$
 
-Tímto jsme tedy dokázali, ¾e èasová slo¾itost tohoto algoritmu nejhor¹ím pøípadì je $\Theta(n)$.
-Jeliko¾ to rychleji urèitì není mo¾né, mù¾eme na závìr této kapitoly zformulovat tuto vìtu:
+Tímto jsme tedy dokázali, ¾e èasová slo¾itost tohoto algoritmu V~nejhor¹ím pøípadì je $\Theta(n)$.
+Jeliko¾ to rychleji urèitì není mo¾né, mù¾eme na~závìr této kapitoly zformulovat tuto vìtu:
 
-\s{Vìta:} Hledání k-tého nejmen¹ího prvku v posloupnosti délky $n$ má èasovou slo¾itost v nejhor¹ím pøípadì $\Theta(n)$. \qed
+\s{Vìta:} Hledání $k$-tého nejmen¹ího prvku V~posloupnosti délky $n$ má èasovou slo¾itost V~nejhor¹ím pøípadì $\Theta(n)$. \qed
 
-\s{K zamy¹lení:} Proè jsme zvolili zrovna pìtice? Jak by to dopadlo pro trojice? jak pro sedmice? Fungoval by takový algoritmus? Byl by také lineární?
+\s{K zamy¹lení:} Proè jsme zvolili zrovna pìtice? Jak by to dopadlo pro trojice? a~jak pro sedmice? Fungoval by takový algoritmus? Byl by také lineární?
 
 \h{Quicksort}
 
-Ji¾ jsme se seznámili s tøídícím algoritmem {\it Mergesort}. Podívejme se teï na algoritmus, který je také zalo¾en na metodì {\it Rozdìl a panuj}, ale chová se v podstatì opaènì. Namísto slévání men¹ích setøídìných posloupností posloupnost v¾dy rozdìlí na dvì pokud mo¾no podobnì velké èásti $L$ a $P$, kdy v $L$ jsou èísla men¹í ne¾ nìjaký pivot a v $P$ èísla vìt¹í. Pivot tvoøí samostatnou èást $S$. Obì èásti $L$ i $P$ rekurzivnì setøídí a následnì vrátí posloupnost, kde budou setøídìné prvky z $L$, pak pivot z $S$ a poté setøídìné prvky z $P$. Vyu¾ívá tedy podobnou my¹lenku jako hledání $k$-tého nejmen¹ího prvku.
+Ji¾ jsme se seznámili s tøídícím algoritmem {\it Mergesort}. Podívejme se teï na~algoritmus, který je také zalo¾en na~metodì {\it rozdìl a~panuj}, ale chová se V~podstatì opaènì. Namísto slévání men¹ích setøídìných posloupností posloupnost v¾dy rozdìlí na~dvì pokud mo¾no podobnì velké èásti $L$ a~$P$, kdy V~$L$ jsou èísla men¹í ne¾ nìjaký pivot a~v $P$ èísla vìt¹í. Pivot tvoøí samostatnou èást $S$. Obì èásti $L$ i $P$ rekurzivnì setøídí a~následnì vrátí posloupnost, kde budou setøídìné prvky z $L$, pak pivot z $S$ a~poté setøídìné prvky z $P$. Vyu¾ívá tedy podobnou my¹lenku jako hledání $k$-tého nejmen¹ího prvku.
 
 \s{Algoritmus:}
-{\bo QS$(x = x_1, \dots,x_n)$:}
+{\bo \<QS>$(x = x_1, \dots,x_n)$:}
 \algo
 \:Pokud $n \leq 1 \Rightarrow$ vrátíme $x$.
 \:Vybereme pivota.
-\:Rozdìlíme posloupnost na podposloupnosti $L,S,P$.
+\:Rozdìlíme posloupnost na~podposloupnosti $L,S,P$.
 \:$L \leftarrow$ \<QS($L$)>, $P \leftarrow$ \<QS($P$)>
 \:Vrátíme $L + S + P$.
 \endalgo
 
 \s{Pozorování:}
 
-Kdy¾ bude pivot v¾dy medián: $T(n) = \Theta(n) + 2T(n/2) \Rightarrow T(n) = \Theta(n \cdot log{n})$
+Kdy¾ bude pivot v¾dy medián: $T(n) = \Theta(n) + 2T(n/2) \Rightarrow T(n) = \Theta(n \cdot\log{n})$
 
 Kdy¾ bude pivot v¾dy minimum: $T(n) = \Theta(n) + T(n-1) \Rightarrow T(n) = \Theta(n^2)$
 
-\s{Poznámka:} Hledání mediánu lineárnì je sice hezké a asymptoticky lineární, ale má tak o¹klivé multiplikativní kosntanty, ¾e se v praxi nepou¾ívá. Doka¾me si tedy, ¾e Quicksort s náhodnou volbou pivota má prùmìrnou èasovou slo¾itost také $\Theta(n\cdot log{n})$.
+\s{Poznámka:} Hledání mediánu lineárnì je sice hezké a~asymptoticky lineární, ale má tak o¹klivé multiplikativní konstanty, ¾e se V~praxi nepou¾ívá. Doka¾me si tedy, ¾e Quicksort s náhodnou volbou pivota má prùmìrnou èasovou slo¾itost také $\Theta(n\cdot\log{n})$.
 
-\s{Vìta:} Quicksort s náhodnou volbou pivota provede ve støední hodnotì $\Theta(n\cdot log{n})$ porovnání.
+\s{Vìta:} Quicksort s náhodnou volbou pivota provede ve støední hodnotì $\Theta(n\cdot\log{n})$ porovnání.
 
-\s{Dùsledek:} Quicksort má prùmìrnou èasovou slo¾iotost  $\Theta(n\cdot log{n})$.
+\s{Dùsledek:} Quicksort má prùmìrnou èasovou slo¾itost  $\Theta(n\cdot\log{n})$.
 
 \proof
-Nech» $C$ znaèí poèet porovnání, $y_1, \dots, y_n$ je vstup v setøídìném poøadí a $C_{ij}$ znaèí poèet porovnání prvkù $y_i$ s $y_j$ pro $1 \leq i \leq j \leq n$. Uvìdomme si, ¾e dva prvky porovnává algoritmus nejvý¹e jednou, a to pouze tehdy, kdy¾ je jeden z nich pivot. Proto $C_{ij}$ nabývá hodnot $0$ nebo $1$. $C_{ij}$ je tedy indikátor jevu, ¾e byly prvky $y_i$ a $y_j$ porovnány. 
+Nech» $C$ znaèí poèet porovnání, $y_1, \dots, y_n$ je vstup V~setøídìném poøadí a~$C_{ij}$ znaèí poèet porovnání prvkù $y_i$ s $y_j$ pro $1 \leq i < j \leq n$. Uvìdomme si, ¾e dva prvky porovnává algoritmus nejvý¹e jednou, a~to pouze tehdy, kdy¾ je jeden z nich pivot. Proto $C_{ij}$ nabývá hodnot $0$ nebo $1$. $C_{ij}$ je tedy indikátor jevu, ¾e byly prvky $y_i$ a~$y_j$ porovnány. 
 
-Poèet v¹ech porovnání je pak souèet jednotlivých $C_{ij}$, tedy $$C = \sum_{i,j} C_{ij}.$$ 
-Proto platí: $${\bb E}[C] = {\bb E}[\sum_{i,j} C_{ij}].$$ 
-Díky linearitì støední hodnoty mù¾eme tvrdit: $${\bb E}[C] = \sum_{i,j} {\bb E}[C_{ij}].$$
-Støední hodnota indikátoru jevu, ¾e prvky  $y_i$ a $y_j$ byly porovnány, je rovna pravdìpodobnosti, ¾e $C_{ij}$ je 1. $${\bb E}[C_{ij}] = P[C_{ij} = 1].$$
-Aby $C_{ij}$ se rovnalo $1$ pro prvky $y_i$ a $y_j$, tak se musel pro podposloupnost $y_i, \dots, y_j$ stát pivotem jako první jeden z $y_i$ nebo $y_j$. Kdyby se tak nestalo, tak spolu pøi tomto rozdìlování prvky $y_i$ a $y_j$ nebudou porovnány a dostanou se ka¾dý do jiné skupiny ($L$ a $P$), tak¾e u¾ spolu porovnány nikdy ani nebudou.
-Pravpodìodobnost, ¾e $y_i$ nebo $y_j$ se staly pivotem pro posloupnost $y_i, \dots, y_j$  je rovna $2 \over {j-i+1}$ (nebo» pivota vybíráme rovnomìrnì náhodnì). Proto mù¾eme koneènì vyjádøit:
+Poèet v¹ech porovnání je pak souèet jednotlivých $C_{ij}$, èili $$C = \sum_{i,j} C_{ij}.$$ 
+Proto platí: $${\bb E}[C] = {\bb E}\left[\sum_{i,j} C_{ij}\right].$$ 
+Díky linearitì støední hodnoty mù¾eme tvrdit, ¾e: $${\bb E}[C] = \sum_{i,j} {\bb E}[C_{ij}].$$
+Støední hodnota indikátoru jevu, ¾e prvky  $y_i$ a~$y_j$ byly porovnány, je rovna pravdìpodobnosti, ¾e $C_{ij}$ je 1. $${\bb E}[C_{ij}] = P[C_{ij} = 1].$$
+Aby $C_{ij}$ se rovnalo $1$ pro prvky $y_i$ a~$y_j$, tak se musel pro podposloupnost $y_i, \dots, y_j$ stát pivotem jako první jeden z $y_i$ nebo $y_j$. Kdyby se tak nestalo, tak spolu pøi tomto rozdìlování prvky $y_i$ a~$y_j$ nebudou porovnány a~dostanou se ka¾dý do~jiné skupiny ($L$ a~$P$), tak¾e u¾ spolu porovnány nikdy ani nebudou.
+Pravdìpodobnost, ¾e $y_i$ nebo $y_j$ se staly pivotem pro posloupnost $y_i, \dots, y_j$  je rovna $2 \over {j-i+1}$ (nebo» pivota vybíráme rovnomìrnì náhodnì). Proto mù¾eme koneènì vyjádøit:
 
-$${\bb E}[C] = \sum_{1 \le i \le j \le n} {2\over{j-i+1}} = \sum_{d=1}^{n-1} { \sum_{n=1}^{n-d \le n} {2\over{d + 1}} }\le \sum_{d=1}^{n-1} {2n\over{d + 1}} = 2n\sum_{d=2}^n {1\over d} = \Theta(n \cdot log{n}).$$
+$${\bb E}[C] = \sum_{1 \le i < j \le n} {2\over{j-i+1}} = \sum_{d=1}^{n-1} { \sum_{n=1}^{n-d} {2\over{d + 1}} }\le \sum_{d=1}^{n-1} {2n\over{d + 1}} = 2n\sum_{d=2}^n {1\over d} = \Theta(n \cdot\log{n}).$$
 
 \qed