]> mj.ucw.cz Git - ads1.git/commitdiff
Temer finalni verze.
authorMartin Mares <mj@ucw.cz>
Wed, 23 May 2007 10:54:52 +0000 (12:54 +0200)
committerMartin Mares <mj@ucw.cz>
Wed, 23 May 2007 10:54:52 +0000 (12:54 +0200)
12-kostry/12-kostry.tex

index 6e12cec1a792de43b76b67fb88b894a18dedc480..5a00c0be0254caa8414f3b7ce7fccd04ff761932 100644 (file)
@@ -4,7 +4,7 @@
 
 Pro zaèátek si definujme, co budeme dìlat, v jakých grafech budeme minimální kostru hledat.
 
-\s{Zadání úlohy:} Pro neorientovaný graf $G$ s ohodnocením hran $w: E(G) \rightarrow R$,
+\s{Zadání úlohy:} Pro neorientovaný graf $G$ s ohodnocením hran $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{Pøedpoklady úlohy:}
@@ -21,10 +21,10 @@ algoritmus.
 \def\concat{\mathop{\hbox{.}}}
 
 \algo
-\:Zvolíme libovolný vrchol $v_0\in V(G)$, $T=(\left\{v_0\right\},\emptyset)$.
-\:Dokud $\vert V(T) \vert \neq n$ :
-\:             vybereme hranu $uv\in E(G) : u\in V(T), v\notin V(T)$, min $w(uv)$
-\:             $T\leftarrow T+uv$
+\:Zvolíme libovolný vrchol $v_0\in V(G)$, $T\leftarrow(\left\{v_0\right\},\emptyset)$.
+\:Dokud $\vert V(T) \vert \neq n$:
+\::Vybereme hranu $uv\in E(G) : u\in V(T), v\notin V(T)$, aby $w(uv)$ bylo minimálni.
+\::$T\leftarrow T+uv$
 \endalgo
 
 \s{Vìta:} Jarníkùv algoritmus se zastaví po maximálnì $n$ iteracích a vydá minimální kostru grafu $G$.
@@ -33,31 +33,34 @@ algoritmus.
 Koneènost - pøi ka¾dé iteraci se pøidá jeden vrchol $\Rightarrow$ po maximálnì $n$ iteracích se zastaví.
 Vydaný graf je strom, proto¾e se stále pøidává list k ji¾ existujícímu stromu. Vydaný graf má $n$
 vrcholù $\Rightarrow$ vydaný graf je kostra. Zbývá nám u¾ jen dokázat, ¾e kostra je minimální. To
-dokazuje následující Lemma.
-\qed
+udìláme pomocí následujícího lemmatu.
 
-Proto aby jsme byli schopni zformulovat i dokázat Lemma, je nutná je¹tì vysvìtlit pojem øez v grafu.
+Proto aby jsme byli schopni zformulovat i dokázat lemma, je nutné je¹tì vysvìtlit pojem øez v grafu.
 
 \s{Definice:} Øez v grafu $G=(V,E)$ je mno¾ina hran $F\subseteq E$ taková, ¾e $\exists  U\subset V$ :
-$F=\left\{uv\in E \vert u\in U, v\notin U \right\}$.
+$F=\left\{uv\in E:u\in U, v\notin U \right\}$.
 
 \s{Lemma:} 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 $G$ je $f\in E(T)$.
+$F$, pak pro ka¾dou minimální kostru $T$ grafu $G$ je $f\in E(T)$.
 
 \proof
-Buï $T$ kostra a $f\notin E(T)$, pak $\exists$ cesta $P\subseteq T$ spojující $u$ a $v$ (vrcholy hrany $f$).
-Cesta musí øez alespoò jednou projít. $\exists e\in P \cap F$ taková, ¾e $w(e) > w(f)$. Uva¾me $T'=T-e+f$.
+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$ taková, ¾e $w(e) > w(f)$. Uva¾me $T'=T-e+f$.
 $T'$ 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 opìt spojí. $w(T')=w(T)-w(e)+w(f)<w(T)$
+hrany $f$ se opìt spojí. Navíc $w(T')=w(T)-w(e)+w(f)<w(T)$.
+\qed
+
+Kdy¾ nahlédneme do dùkazu minimálnosti vydané kostry grafu pomocí lemmatu, mù¾eme po ka¾dé iteraci rozdìlit graf na èást, v které jsou v¹echny vrcholy v zatím vytvoøené kostøe, a na èást, v které je¹tì ¾ádny z vrcholù není v kostøe obsa¾en. Hrany spojujíci títo èásty tvoøí øez v grafu. Z tìchto hran vybíra algoritmus tu nejlehèí hranu a lemma øíka, ¾e táto hrana urèitì patøí do minimálni kostry, tedy výsledná kostra je urèitì minimálni.
 \qed
 
-\s{Dùsledky:} Graf $G$ s prostým ohodnocením má pravì 1 minimální kostru. Minimální kostra je
+
+\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)$
-\:Pro $v\notin V(T)$ si pamatujeme $D(v)=$min$\left\{uv, u\in T\right\}$. Èasová slo¾itost je $\O(n^2+m)=\O(n^2)$
+\:Pøímoèará: pamatujeme si, které vrcholy a hrany jsou v kostøe $T$ a které ne. Èasová slo¾itost je $\O(nm)$.
+\:Pro $v\notin V(T)$ si pamatujeme $D(v)=$min$\left\{w(uv):u\in T\right\}$. Èasová slo¾itost je $\O(n^2+m)=\O(n^2)$.
 \endlist
 
 \s{Algoritmus:} (Borùvkùv)
@@ -65,81 +68,84 @@ jednozna
 \def\concat{\mathop{\hbox{.}}}
 
 \algo
-\:Les $F=(V(G),\emptyset)$.
-\:Dokud $F$ má alespoò dvì komponenty :
-\:             $\forall$ komponentu $T_i$ vybereme nejlehèí incidentní hranu $t_i$.
-\:             V¹echny hrany $t_i$ pøidáme do $F$.
+\:Les $F\leftarrow(V(G),\emptyset)$.
+\:Dokud $F$ má alespoò dvì komponenty:
+\::Pro ka¾dou komponentu $T_i$ lesa $F$ vybereme nejlehèí incidentní hranu $t_i$.
+\::V¹echny hrany $t_i$ pøidáme do $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
-Po $k$ iteracích mají v¹echny stromy minimálnì $2^k$ vrcholù, $\forall$ i : $\vert T_i\vert \geq 2^k$.
+Po $k$ iteracích mají v¹echny stromy minimálnì $2^k$ vrcholù, $\forall i : \vert T_i\vert \geq 2^k$.
 Indukcí podle $k$: ka¾dá incidentní hrana vede z $T_i$ do $T_j$. Po $k$ iteracích pøidáním incidentní hrany
-spojíme 2 stromy s alespoò $2^k$ vrcholy, tím vznikne strom s $2^{k+1}$ vrcholy.
-Algoritmus vydá kostru, staèí nahlédnout, zda je minimální. To se lehce uká¾e u¾itím pøedchozí Lemmy.
-V¾dy pøidáváme hranu, která je minimální mezi $T$ a ostatními vrcholy grafu $G$.
+spojíme 2 stromy s alespoò $2^k$ vrcholy, tím vznikne strom s alespoò $2^{k+1}$ vrcholy.
+Algoritmus vydá kostru, staèí nahlédnout, zda je minimální. To se lehce uká¾e u¾itím pøedchozího lemmatu.
+V¾dy pøidáváme hranu, která je minimální v øezu mezi $T$ a ostatními vrcholy grafu $G$.
 \qed
 
 \s{Implementace:}
 \itemize\ibull
 \:Inicializace pøímoèará.
-\:Pomocí DFS rozlo¾íme les na komponenty. $\forall$ vrchol si pamatujeme èíslo komponenty.
-\:Pro $\forall$ hranu zjistíme, do které komponenty patøí a pro ka¾dou komponentu
-jsi uchováme nejlehèí hranu.
+\: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.
 
-Rozlo¾ení lesa a zji¹tìní, do jaké komponenty patøí ka¾dá hrana má èasovou slo¾itost $\O(m)$. Výslední èasová slo¾itost je $\O(m\log n)$
+Rozlo¾ení lesa a zji¹tìní, do jaké komponenty patøí která hrana má èasovou slo¾itost $\O(m)$. 
 \endlist
 
-\s{Algoritmus:} (Kruskalùv èili `hladový`)
+Výsledná èasová slo¾itost je $\O(m\log n)$.
+
+\s{Algoritmus:} (Kruskalùv èili \uv{hladový})
 
 \def\concat{\mathop{\hbox{.}}}
 
 \algo
-\:Setøídíme v¹echny hrany z $E: $w(e_1)<...<w(e_m)$.
+\: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ý :
-\:             $F\leftarrow F+e_i$
+\:Pro $i=1$ do $m$:
+\::pokud $F+e_i$ je acyklický:
+\::$F\leftarrow F+e_i$.
 \endalgo
 
-\s{Vìta:} Kruskalùv `hladový` algoritmus se zastaví po $m$ iteracích a vydá minimální kostru grafu $G$.
+\s{Vìta:} Kruskalùv algoritmus se zastaví po $m$ iteracích a vydá minimální kostru grafu $G$.
 
 \proof
-Podle Lemmy strom, který je výstupem algoritmu, je minimální kostra. Indukcí snadno doká¾eme, ¾e
+Podle lemmatu strom, který je výstupem algoritmu, je minimální kostra. Indukcí snadno doká¾eme, ¾e
 stále platí $F\subseteq$ $minimálni$ $kostry$ a v¾dy do $F$ pøidáváme hranu $f$, která je minimální v øezu
-a spojuje dvì komponenty.
+a spojuje dvì komponenty. Kdy¾ hranu do kostry nepøidáme, znamená to, ¾e v grafu by vznikla kru¾nice. Tuto hranu mù¾eme zahodit, preto¾e ak by mnìla být súèastí minimálni kostry, znamenalo by to, ¾e by jsme mnìli zahodit nìkterou hranu s kru¾nice, ale tá hrana je urèitì lehèí jako právì pøidávaná hrana a kostra by ji¾ nebyla minimálni.
 \qed
 
 \s{Implementace:}
 \itemize\ibull
-\:Setøídìní $\O(m\log n)$.
-\:Kdy¾ si pamatuji vrcholy $v$ poli:
-Find(u,v) zjistí zda vrcholy $u$ a $v$ le¾í v stejné komponente. Jedna operace má èasovou slo¾itost $\O(1)$. Find
-se provede $m-$krát, proto je èasová slo¾itost celkem $\O(m)$.
+\:Setøídìní v èase $\O(m\log m)=\O(m\log n)$.
+\:Kdy¾ si pamatuji vrcholy v poli:
+Find(u,v) zjistí zda vrcholy $u$ a $v$ le¾í v stejné komponentì. Jedna operace má èasovou slo¾itost $\O(1)$. Find
+se provede $m$-krát, proto je èasová slo¾itost celkem $\O(m)$.
 Union(u,v) pøidá hranu a tím spojí dvì komponenty. Jedna operace má èasovou slo¾itost $\O(n)$. Union se provede
-$n-$krát, proto je èasová slo¾itost celkem $\O(n^2)$.
+$n$-krát, proto je èasová slo¾itost celkem $\O(n^2)$.
 Výslední èasová slo¾itost je $\O(m\log n+m+n^2)=$\O$(n^2+m\log n)$
 
-\:Jinak: $\forall$ komponenta je strom orientovaný smìrem ke koøenu. $\forall$ vrchol si pamatuje
-svého otce, $\forall$ koøen si pamatuje velikost komponenty.
+\:Jinak: Ka¾dá komponenta je strom orientovaný smìrem ke koøenu. Ka¾dý vrchol si pamatuje
+svého otce, ka¾dý koøen si pamatuje velikost komponenty.
 Find(u,v) najde koøeny a porovná je. Èasová slo¾itost je $\O(hloubka$ $komponenty)$.
-Union(u,v) najde koøeny a pøipojí men¹í komponentu pod vìt¹í (logaritmická hloubka). Èasová slo¾itost je $\O(hloubka$ $komponenty)$.
-Find a Union mají tedy èasovou slo¾itost $\O(\log n)$. Výslední èasová slo¾itost je $\O(m\log n)$.
+Union(u,v) najde koøeny komponent, do kterých patøí vrcholy $u$ a $v$ a pøipojí komponentu s men¹í hloubkou ke koøeni komponenty s vìt¹í hloubkou. Hloubky obou komponent i výsledné spojené komponenty jsou maximálnì logaritmické. Èasová slo¾itost je $\O(hloubka$ $komponenty)$. Find a Union mají tedy èasovou slo¾itost $\O(\log n)$. Výsledná èasová slo¾itost je $\O(m\log n)$.
 \endlist
 
 \s{Lemma:} Strom hloubky $h$ má alespoò $2^h$ prvkù.
 
 \proof
-Pokud Union spojí stromy jeden s hloubkou $h$ a druhý s hloubkou men¹í ne¾ $h$, pak hloubka výsledného
+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 hloubky $h$, pak výsledný strom má hloubku $h+1$. Jak ji¾
-víme, strom hloubky $h$ má minimálnì $2^h$, proto výsledný strom hloubky $h+1$ má $2^{h+1}$ vrcholù.
+víme, strom hloubky $h$ má minimálnì $2^h$ vrcholù, proto výsledný strom hloubky $h+1$ má alespoò $2^{h+1}$ vrcholù.
 \qed
 
 \h{Èerveno-èerné stromy}
 
-\s{Definice:} Èerveno-èerný strom je binární vyhledávací strom s barevnými(èervenými a èernými) vrcholy a
-externími vrcholy. Kdy¾ vrchol nemá nìkterého ze synù, na jeho místì je externí vrchol.
+\s{Definice:} Èerveno-èerný strom je binární vyhledávací strom s barevnými(èervenými a èernými) a
+externími vrcholy. Externí vrchol je takový pseudovrchol, ktorý pøidávame ka¾dímu vrcholu, kterému
+chybí jeden nebo dva syny. Externí vrchol je tedy pøipojen na místo neexistujíciho syna.
+
 
 \s{Axiomy:}
 \itemize\ibull
@@ -154,27 +160,27 @@ K t
 
 \proof
 1. Zkomprimujeme hrany èerný-èervený a èerné vrcholy, které mají dva èervené syny, na vrchol.
-Vznikne $2,4-$strom, který má hloubku $\log n$, a proto je èerveno-èerný strom maximálnì
-2x vìt¹í.
+Vznikne $2,4$-strom, který má hloubku $\O(\log n)$, a tedy èerveno-èerný strom má hlouku maximálnì
+$2\log n$, co¾ je asymptoticky taky $\O(\log n)$.
 \qed
 
 \proof
 2. Pøedpokládejme, ¾e $T$ je èerveno-èerný strom, který má na cestì z koøene do listu
 $k$ èerných vrcholù. Pak pro poèet vrcholù stromu $T$ platí $2^k-1\leq n \leq 2^{2k}-1$. Nejmen¹í takový strom má v¹echny vrcholy obarvené èernì a je to úplný
-pravidelný binární strom o hloubce $k-1$, co¾ dává dolní odhad. Nejvìt¹í takový strom má v¹echny vrcholy v sudých hladinách obarveny èervenì a v lichých hladinách èernì, je to úplný pravidelný binární strom o hloubce $2k-1$ a tím je dán horní odhad. Tedy $k\leq 1+\log n$. Z vlastností èerveno-èerných stromù plyne, ¾e $k\leq hloubka(T) \leq 2k$.
+pravidelný binární strom o hloubce $k-1$, co¾ dává dolní odhad. Nejvìt¹í takový strom má v¹echny vrcholy v sudých hladinách obarveny èervenì a v lichých hladinách èernì, je to úplný pravidelný binární strom o hloubce $2k-1$ a tím je dán horní odhad. Tedy $k\leq 1+\log n$. Z vlastností èerveno-èerných stromù plyne, ¾e $k\leq \<hloubka>(T) \leq 2k$.
 \qed
 
 Nyní si uká¾eme a rozebereme vkládaní do èerveno-èerných stromù.
 
-\s{Insert:} (v èerveno-èerném strome)
+\s{Insert:} (v èerveno-èerném stromì)
 BÚNO nový uzel $t$ bude èervený.
 Vlo¾íme uzel do stromu jako do standardního binárního vyhledávacího stromu.
-Jestli¾e je pøedek èerný, jsme hotovi (viï obr. 1).
+Jestli¾e je pøedek èerný, jsme hotovi (viz obr. 1).
 \figure{01.eps}{obr. 1}{2in}
-Jestli¾e nikoliv, mù¾u nastat tøi následující pøípady:
+Jestli¾e nikoliv, mohou nastat tøi následující pøípady:
 \itemize\ibull
 \:Je-li vrchol $t$ èervený a jeho otec je také èervený, pak øekneme, ¾e $t$ je porucha. Je-li $t$ porucha,
-pak ji musíme nìjak opravit. Situace je na obrázku 2 - nejprve zále¾í na tom, jakou barvu má $s$, strýc $t$:
+pak ji musíme nìjak opravit. Situace je na obrázku 2 $-$ nejprve zále¾í na tom, jakou barvu má $s$, strýc vrcholu $t$:
 \figure{02.eps}{obr. 2}{1.5in}
 \algo
 \:$s$ je èervený. Pak pouze pøebarvíme $o$, $d$ a $s$ podle obrázku 3.
@@ -183,7 +189,7 @@ Nyn
 Pro splnìní poslední podmínky je je je¹tì nutné pøebarvit koøen $d$ na èerno.
 
 \:$s$ je èerný. Pak zále¾í na tom, zda hodnota $t$ le¾í mezi hodnotami $o$ a $d$ nebo ne. Jinými slovy, zda cesta $t-o-d$ obsahuje zatáèku.
-(a) Bez zatáèky: Provedeme rotaci a pøebarvíme podle obrázku 4. Splnìny budou podmínky 1, 2 i 3, tedy máme èervenoèerný strom:
+(a) Bez zatáèky: Provedeme rotaci a pøebarvíme podle obrázku~4. Splnìny budou podmínky 1, 2 i 3, tedy máme èervenoèerný strom:
 \figure{04.eps}{obr. 4}{4in}
 (b) Se zatáèkou. Provedeme dvojitou (LR) rotaci a pøebarvíme podle obrázku 5. Splnìny budou podmínky 1, 2 i 3, opìt máme rovnou èervenoèerný strom.
 \figure{05.eps}{obr. 5}{4in}