]> mj.ucw.cz Git - ga.git/blob - 6-borjar/6-borjar.tex
Překódování do UTF-8
[ga.git] / 6-borjar / 6-borjar.tex
1 \input ../sgr.tex
2
3 \prednaska{6}{Rychlejší algoritmy na minimální kostry}{}
4
5 V~této kapitole popíšeme několik pokročilejších algoritmů pro problém minimální
6 kostry. Vesměs to budou různá vylepšení klasických algoritmů z~minulé kapitoly.
7
8 \h{Upravená verze Borůvkova algoritmu pro rovinné grafy}
9
10 Vyjdeme z myšlenky, že můžeme po každém kroku původního Borůvkova algoritmu vzniklé komponenty
11 souvislosti grafu kontrahovat do jednoho vrcholu a tím získat menší graf, který můžeme
12 znovu rekurzivně zmenšovat. To funguje obecně, ale ukážeme, že pro rovinné grafy tak dosáhneme
13 lineární časové složitosti.
14
15 \s{Pozorování:}
16 Pokud $F \subseteq {\rm MST}(G)$ (kde ${\rm MST}(G)$ je minimální kostra grafu~$G$), $G'$~je graf vzniklý
17 z~$G$ kontrakcí podél hran z~$F$, pak kostra grafu~$G$, která vznikne z~${\rm MST}(G')$ zpětným
18 expandováním kontrahovaných vrcholů, je ${\rm MST}(G)$. Pokud kontrakcí vzniknou
19 smyčky, můžeme je ihned odstraňovat; pokud paralelní hrany, ponecháme z~nich vždy tu nejlehčí.
20 To nás vede k následujícímu algoritmu:
21
22 \s{Algoritmus: MST v rovinných grafech} \cite{mm:mst}
23 \algo
24 \:Ke každému vrcholu najdeme nejlevnější incidentní hranu -- dostaneme množinu hran $F \subseteq E$.
25 \:Graf kontrahujeme podle $F$ následovně:
26 \::Prohledáme do šířky graf $(V, F)$ a přiřadíme každému vrcholu číslo komponenty, v~níž se nachází.
27 \::Přečíslujeme hrany v~$G$ podle čísel komponent.
28 \:Odstraníme násobné hrany:
29 \::Setřídíme hrany lexikograficky přihrádkovým tříděním (násobné hrany jsou nyní pospolu).
30 \::Projdeme posloupnost hran a z~každého úseku multihran odstraníme všechny až na nejlevnější hranu.
31 Také odstraníme smyčky.
32 \:Pokud stále máme netriviální graf, opakujeme předchozí kroky.
33 \:Vrátíme jako MST všechny hrany, které se v~průběhu algoritmu dostaly do~$F$.
34 \endalgo
35
36 \s{Časová složitost:}
37 Označme si $n_i$ a $m_i$ počet vrcholů a hran na~počátku $i$-té iterace.
38 Každý z~kroků 1--7 trvá $\O(m_i)$, proto i celý cyklus algoritmu trvá $\O(m_i)$.
39 Počet vrcholů grafu klesá s~každým cyklem exponenciálně: $n_i \leq n / 2^i$.
40 Na~začátku každého cyklu je graf rovinný (kontrakcí hrany v~rovinném grafu se rovinnost
41 zachovává) a není to multigraf, takže počet jeho hran je lineární v počtu vrcholů:
42 $m_i < 3n_i$. Celkovou časovou složitost dostaneme jako součet dob trvání
43 všech cyklů: $\O(\sum_i m_i) = \O(\sum_i n_i) = \O(n)$.
44
45 \h{Minorově uzavřené třídy}
46
47 Předchozí algoritmus ve~skutečnosti funguje v~lineárním čase i pro obecnější třídy grafů,
48 než jsou grafy rovinné. Tím správným universem jsou minorově uzavřené třídy:
49
50 \s{Definice:}
51 Graf $H$ je {\I minorem} grafu $G$ (značíme $H \preceq G$), pokud lze $H$ získat z~$G$
52 mazáním vrcholů či hran a kontrahováním hran (s~odstraněním smyček a násobných hran).
53
54 \s{Pozorování:}
55 Relace $\preceq$ je částečné uspořádání na třídě všech grafů
56 (reflexivita a tranzitivita plynou přímo z~definice, pro antisymetrii si stačí
57 všimnout, že jak mazáním, tak kontrakcemi klesá součet počtu vrcholů s~počtem hran).
58
59 \s{Pozorování:}
60 Pokud je graf~$H$ podgrafem grafu~$G$, pak je také jeho minorem.
61 Opačně to neplatí: například $C_3$ je minorem libovolné delší kružnice,
62 ale určitě ne jejím podgrafem.
63
64 \s{Definice:}
65 Třída grafů $\cal C$ je {\I minorově uzavřená,} pokud kdykoliv $G\in {\cal C}$
66 a $H\preceq G$, platí také $H \in {\cal C}$.
67
68 \s{Příklady:}
69 Třída všech grafů a prázdná třída jsou jistě minorově uzavřené. Těm říkáme {\I triviální}
70 třídy. Mezi ty netriviální patří třeba lesy, rovinné grafy, grafy nakreslitelné na další
71 plochy, grafy nakreslitelné do ${\bb R}^3$ tak, že žádná kružnice netvoří uzel.
72
73 \def\Forb{{\rm Forb}}
74
75 \s{Definice:}
76 Pro třídu grafů ${\cal C}$ definujeme $\Forb({\cal C})$ jako třídu všech grafů,
77 jejichž minorem není žádný graf z~${\cal C}$. Pro zjednodušení značení budeme pro
78 konečné třídy psát $\Forb(G_1,\ldots,G_k)$ namísto $\Forb(\{G_1,\ldots,G_k\})$.
79
80 \s{Příklady:}
81 $\Forb(K_2)$ je třída všech grafů, které neobsahují žádnou hranu.
82 $\Forb(C_3)$ je třída všech lesů.
83 $\Forb(K_5,K_{3,3})$ jsou všechny rovinné grafy -- to je minorová analogie
84 Kuratowského věty (pokud graf~$G$ obsahuje dělení grafu~$H$, pak je $H\preceq G$;
85 opačně to obecně není pravda, ale zrovna pro dvojici $K_5$ a $K_{3,3}$ to funguje;
86 zkuste si sami).
87
88 Lze každou minorově uzavřenou třídu~${\cal C}$ zapsat jako $\Forb({\cal F})$
89 pro nějakou třídu~${\cal F}$ zakázaných minorů? Zajisté ano, stačí například
90 zvolit~${\cal F}$ jako doplněk třídy~${\cal C}$. Slavná Robertsonova-Seymourova
91 věta \cite{rs:wagner} dokonce zaručuje existenci {\I konečné} třídy zakázaných minorů.
92 To není samo sebou, dokazuje se to dosti obtížně (a~je to jedna z~nejslavnějších kombinatorických
93 vět za~posledních mnoho let), ale plyne z~toho spousta zajímavých důsledků.
94 My si vystačíme s~daleko jednoduššími prostředky a zájemce o~hlubší studium minorové
95 teorie odkážeme na Diestelovu knihu~\cite{diestel:gt}.
96
97 Ve~zbytku této sekce dokážeme následující větu, která je zobecněním klasického
98 tvrzení o~hustotě rovinných grafů na minorově uzavřené třídy:
99
100 \s{Definice:} {\I Hustotou} neprázdného grafu~$G$ nazveme $\varrho(G) = \vert E(G) \vert
101 / \vert V(G) \vert$. Hustotou třídy $\varrho({\cal C})$ pak nazveme supremum z~hustot všech
102 neprázdných grafů ležících v~této třídě.
103
104 \s{Věta (o hustotě minorově uzavřených tříd):}
105 Pokud je třída grafů $\cal C$ minorově uzavřená a netriviální (alespoň jeden graf v~ní leží
106 a alespoň jeden neleží), pak má konečnou hustotu.
107
108 \s{Důsledek:}
109 Pokud používáme kontrahující Borůvkův algoritmus na grafy ležící v~nějaké netriviální
110 minorově uzavřené třídě, pak všechny grafy, které algoritmus v~průběhu výpočtu sestrojí,
111 leží také v~této třídě, takže na odhad jejich hustoty můžeme použít předchozí větu.
112 Opět vyjde, že časová složitost algoritmu je lineární.
113
114 \>{\I Důkaz věty:}
115 Ukážeme nejprve, že pro každou třídu $\cal C$ existuje nějaké~$k$ takové, že
116 ${\cal C} \subseteq \Forb(K_k)$.
117
118 Už víme, že ${\cal C}$ lze zapsat jako $\Forb({\cal F})$ pro nějakou třídu~${\cal F}$.
119 Označme~$F$ graf z~${\cal F}$ s~nejmenším počtem vrcholů; pokud existuje více takových,
120 vybereme libovolný. Hledané~$k$ zvolíme jako počet vrcholů tohoto grafu.
121
122 Inkluze tvaru ${\cal A}\subseteq {\cal B}$ je ekvivalentní tomu, že kdykoliv nějaký graf~$G$
123 neleží v~${\cal B}$, pak neleží ani v~${\cal A}$. Mějme tedy nějaký graf $G\not\in\Forb(K_k)$.
124 Proto $K_k \preceq G$. Ovšem triviálně platí $F\preceq K_k$ a relace \uv{být minorem}
125 je tranzitivní, takže $F\preceq G$, a~proto $G\not\in {\cal C}$.
126
127 Víme tedy, že ${\cal C} \subseteq \Forb(K_k)$. Proto musí platit $\varrho({\cal C}) \le
128 \varrho(\Forb(K_k))$. Takže postačuje omezit hustotu tříd s~jedním zakázaným minorem,
129 který je úplným grafem, a~to plyne z~následující Maderovy věty.
130 \qed
131
132 \s{Věta (Maderova):}
133 Pro každé~$k\ge 2$ existuje $c(k)$ takové, že kdykoliv má graf hustotu alespoň $c(k)$,
134 obsahuje jako podgraf nějaké dělení grafu~$K_k$.
135
136 \proof
137 Viz Diestel \cite{diestel:gt}.
138
139 \h{Jarníkův algoritmus s Fibonacciho haldou}
140
141 Původní Jarníkův algoritmus s~haldou má díky ní složitost $\O(m\log n)$, to zlepšíme použitím
142 Fibonacciho haldy $H$, do~které si pro každý vrchol sousedící se zatím vybudovaným stromem~$T$
143 uložíme nejlevnější z~hran vedoucích mezi tímto vrcholem a stromem~$T$. Tyto hrany bude halda
144 udržovat uspořádané podle vah.
145
146 \newcount\algcnt
147 \s{Algoritmus: Jarníkův algoritmus~\#2 (Fredman, Tarjan \cite{ft:fibonacci})}
148 \algo
149 \:Začneme libovolným vrcholem $v_0$, $T\leftarrow \{v_0\}$.
150 \:Do~haldy $H$ umístíme všechny hrany vedoucí z~$v_0$.
151 \:Opakujeme, dokud $H\neq\emptyset$:
152 \::$vw\leftarrow \<ExtractMin>(H)$, přičemž $v\not\in T, w\in T$.
153 \::$T\leftarrow T\cup\{vw\}$
154 \::Pro všechny sousedy $u$ vrcholu $v$, kteří dosud nejsou v~$T$, upravíme haldu:
155 \:::Pokud ještě v~$H$ není hrana incidentní s~$u$, přidáme hranu~$uv$.
156 \:::Pokud už tam nějaká taková hrana je a je-li těžší než $uv$, nahradíme ji
157 hranou~$uv$ a provedeme \<DecreaseKey>.
158 \global\algcnt=\itemcount
159 \endalgo
160
161 \>Správnost algoritmu přímo plyne ze~správnosti Jarníkova algoritmu.
162
163 \s{Časová složitost:}
164 Složitost tohoto algoritmu bude $\O(m+n\log n)$, neboť vnější cyklus se provede
165 nanejvýš $n$-krát, za~\<ExtractMin> v~něm tedy zaplatíme celkem $\O(n\log n)$, za~přidávání
166 vrcholů do~$H$ a~nalézání nejlevnějších hran zaplatíme celkem $\O(m)$ (na~každou hranu takto
167 sáhneme nanejvýš dvakrát), za~snižování vah vrcholů v~haldě rovněž pouze $\O(m)$
168 (nanejvýš $m$-krát provedu porovnání vah a \<DecreaseKey> v~kroku~\the\algcnt\ za~$\O(1)$).
169
170 Toto zlepšení je důležitější, než by se mohlo zdát, protože nám pro grafy s~mnoha hranami
171 (konkrétně pro grafy s~$m=\Omega(n\log n)$) dává lineární algoritmus.
172
173 \h{Kombinace Jarníkova a Borůvkova algoritmu}
174
175 K~dalšímu zlepšení dojde, když před předchozím algoritmem spustíme $\log\log n$ cyklů Borůvkova
176 algoritmu s~kontrahováním vrcholů, čímž graf zahustíme.
177
178 \s{Algoritmus: Jarníkův algoritmus~\#3 (původ neznámý)}
179 \algo
180 \:Provedeme $\log\log n$ cyklů upraveného Borůvkova algoritmu s~kontrahováním hran popsaného výše.
181 \:Pokračujeme Jarníkovým algoritmem~\#2.
182 \endalgo
183
184 \s{Časová složitost:}
185 Složitost první části je $\O(m\log\log n)$.
186 Počet vrcholů se po~první části algoritmu sníží na~$n'\leq n/\log n$ a složitost druhé části bude
187 tedy nanejvýš $\O(m+n'\log n')=\O(m)$.
188
189 \h{Jarníkův algoritmus s~omezením velikosti haldy}
190
191 Ještě většího zrychlení dosáhneme, omezíme-li Jarníkovu algoritmu \#2 vhodně
192 velikost haldy, takže nám nalezne jednotlivé podkostřičky zastavené v~růstu
193 přetečením haldy. Podle těchto podkostřiček graf následně skontrahujeme
194 a budeme pokračovat s~mnohem menším grafem.
195
196 \s{Algoritmus: Jarníkův algoritmus~\#4 (Fredman, Tarjan \cite{ft:fibonacci})}
197 \algo
198 \:Opakujeme, dokud máme netriviální $G$ (s alespoň jednou hranou):
199 \::$t\leftarrow\vert V(G)\vert$.
200 \::Zvolíme $k\leftarrow 2^{2m/t}$ (velikost haldy).
201 \::$T\leftarrow\emptyset$.
202 \::Opakujeme, dokud existují vrcholy mimo $T$:
203 \:::Najdeme vrchol $v_0$ mimo $T$.
204 \:::Spustíme Jarníkův alg. \#2 pro celý graf od $v_0$. Zastavíme ho, pokud:
205 \global\algcnt=\itemcount
206 \::::$\vert H\vert\geq k$ (byla překročena velikost haldy) nebo
207 \::::$H=\emptyset$ (došli sousedé) nebo
208 \::::do $T$ jsme přidali hranu oboustranně incidentní s~hranami v~$T$ (připojili
209 jsme novou podkostru k~nějaké už nalezené).
210 \::Kontrahujeme $G$ podle podkoster nalezených v~$T$.
211 \endalgo
212
213 \s{Pozorování:}
214 Pokud algoritmus ještě neskončil, je každá z~nalezených podkoster v~$T$ incidentní s~alespoň $k$ hranami
215 (do toho počítáme i vnitřní hrany vedoucí mezi vrcholy podkostry).
216 Jak to vypadá pro jednotlivá ukončení:
217 \numlist\ndotted
218 \itemcount=\algcnt
219 \:$\vert H\vert\geq k$ -- všechny hrany v~haldě jsou incidentní s~$T$ a navzájem různé, takže incidentních je dost.
220 \:$H=\emptyset$ -- nemůže nastat, algoritmus by skončil.
221 \:Připojím se k~už existující podkostře -- jen ji zvětším.
222 \endlist
223
224 \s{Časová složitost:}
225 Důsledkem předchozího pozorování je, že počet podkoster v~jednom průchodu je nanejvýš
226 $2m/k$. Pro $t'$ a $k'$ v následujícím kroku potom platí $t'\leq 2m/k$ a $k'=2^{2m/t'}\geq 2^k$.
227 Průchodů bude tedy nanejvýš $\log^* n$\foot{$\log^* n$ je inverzní funkce k~\uv{věži
228 z~mocnin}, čili $\min\{i:\log^{(i)} n<1 \}$, kde $\log^{(i)} n$ je $i$-krát iterovaný
229 logaritmus.}, protože průchod s~$k>n$ bude už určitě poslední.
230 Přitom jeden vnější průchod trvá $\O(m+t\log k)$, což je pro $k=2^{2m/t}$
231 rovno $\O(m)$. Celkově tedy algoritmus poběží v~čase $\O(m\log^{*}n)$.
232
233 I~odhad $\log^* n$ je ale příliš hrubý, protože nezačínáme s~haldou velikosti~1, nýbrž
234 $2^{2m/n}$. Můžeme tedy počet průchodů přesněji omezit funkcí $\beta(m,n)=\min\{i:\log^{(i)}n<m/n\}$
235 a časovou složitost odhadnout jako $\O(m\beta(m,n))$. To nám dává lineární algoritmus
236 pro grafy s~$m\geq n\log^{(k)}n$ pro libovolnou konstantu $k$, jelikož $\beta(m,n)$ tehdy vyjde
237 omezená konstantou.
238
239 \h{Další výsledky}
240
241 \itemize\ibull
242 \:$\O(m\alpha(m,n))$, kde $\alpha(m,n)$ je obdoba inverzní
243   Ackermannovy funkce definovaná podobně, jako je $\beta(m,n)$ obdobou $\log^*$.
244   \cite{chazelle:ackermann}, \cite{pettie:ackermann}
245 \:$\O({\cal T}(m,n))$, kde ${\cal T}(m,n)$ je hloubka optimálního rozhodovacího stromu
246   pro nalezení minimální kostry v~grafech s~patřičným počtem hran a vrcholů
247   \cite{pettie:optimal}.
248   Jelikož každý deterministický algoritmus založený na~porovnávání vah lze popsat rozhodovacím stromem,
249   je tento algoritmus zaručeně optimální. Jen bohužel nevíme, jak optimální stromy vypadají, takže
250   je stále otevřeno, zda lze MST nalézt v~lineárním čase. Nicméně tento algoritmus
251   pracuje i na~Pointer Machine, pročež víme, že pokud je lineární složitosti možné dosáhnout, není k~tomu
252   potřeba výpočetní síla RAMu.\foot{O výpočetních modelech viz příští kapitola.}
253 \:$\O(m)$ pro grafy s~celočíselnými vahami (na~RAMu) \cite{fw90trans} -- ukážeme v~jedné
254   z~následujících kapitol.
255 \:$\O(m)$, pokud už máme hrany setříděné podle vah: jelikož víme, že záleží jen na~uspořádání,
256   můžeme váhy přečíslovat na~$1\ldots m$ a použít předchozí algoritmus.
257 \:$\O(m)$ průměrně: randomizovaný algoritmus, který pro libovolný vstupní graf doběhne v~očekávaném
258   lineárním čase~\cite{karger:randomized}.
259 \:Na~zjištění, zda je zadaná kostra minimální, stačí $\O(m)$ porovnání \cite{komlos:verify} a dokonce
260   lze v~lineárním čase zjistit, která to jsou \cite{king:verify}. Z~toho ostatně vychází předchozí
261   randomizovaný algoritmus.
262 \endlist
263
264 \references
265 \bye