]> mj.ucw.cz Git - ga.git/blob - 10-decomp/10-decomp.tex
480112f3d7f5c09a045eb4ab8a4402efeaea0951
[ga.git] / 10-decomp / 10-decomp.tex
1 \input ../sgr.tex
2
3 \prednaska{10}{Dekompozice stromù}{zapsal Ale¹ ©nupárek}
4
5 V~této kapitole uká¾eme nìkolik datových struktur zalo¾ených
6 na~my¹lence dekompozice problému na~dostateènì malé podproblémy,
7 které u¾ umíme (obvykle vhodným kódováním èísly) øe¹it v~konstantním
8 èase.
9
10 \h{Union-Find problem}
11
12 \s{Problém:} Udr¾ování tøíd ekvivalence: na~poèátku máme $N$ jednoprvkových ekvivalenèních
13 tøíd, provádíme operace \<Find> (zji¹tìní, zda dva prvky jsou ekvivalentní) a \<Union>
14 (slouèení dvou tøíd do~jedné). Také na~to lze pohlí¾et jako na~inkrementální udr¾ování
15 komponent souvislosti neorientovaného grafu: \<Union> je pøidání hrany, \<Find> test,
16 zda dva vrcholy le¾í v~té¾e komponentì. To se hodí v~mnoha algoritmech, kupøíkladu
17 v~Kruskalovì algoritmu pro hledání minimální kostry.
18
19 \s{Triviální øe¹ení:} Ka¾dé tøídì pøiøadíme unikátní barvu, kterou obarvíme prvky tøídy. Operace \<Find>
20 porovnává barvy, operace \<Union> prvky jedné tøídy pøebarvuje.
21
22 Operace \<Find> tak pracuje v~konstantním èase, \<Union> mù¾e zabrat a¾ lineární. Mù¾eme si
23 pomoci tím, ¾e v¾dy pøebarvíme {\I men¹í} ze~sluèovaných ekvivalenèních tøíd (budeme
24 si pro ka¾dou tøídu pamatovat seznam jejích prvkù a velikost). Tehdy mù¾e být ka¾dý
25 prvek pøebarven jen $\O(\log n)$-krát, jeliko¾ ka¾dým pøebarvením se alespoò zdvojnásobí
26 velikost tøídy, ve~které prvek le¾í. Posloupnost operací \<Union>, kterou vznikla tøída
27 velikosti~$k$, tak trvá $\O(k\log k)$, tak¾e mù¾eme bezpeènì prohlásit, ¾e amortizovaná
28 slo¾itost operace \<Union> je $\O(\log n)$.
29
30 \s{Chytøej¹í øe¹ení:} Ka¾dou tøídu budeme reprezentovat zakoøenìným stromem s~hranami
31 orientovanými smìrem ke~koøeni (jinými slovy pro ka¾dý prvek si pamatujeme jeho otce
32 nebo ¾e je to koøen). \<Find> nalezne koøeny stromù a porovná je, \<Union> pøipojí koøen
33 jedné tøídy pod koøen druhé. Aby stromy nedegenerovaly, pøidáme dvì podmínky:
34
35 \itemize\ibull
36 \:{\I Union by rank:} ka¾dý koøen $v$ si pamatuje svùj rank $r(v)$. Pokud spojujeme
37 dva stromy s~koøeny $v$, $w$ a $r(v)<r(w)$, pøipojíme $v$ pod~$w$ a rank zachováme.
38 Pokud $r(v)=r(w)$, pøipojíme libovolnì a nový koøen bude mít rank $r(v)+1$.%
39 \foot{Podobnì by fungovalo pravidlo {\I Union by size,} které pøipojuje men¹í
40 strom pod vìt¹í, ale ranky máme radìji, neb jsou skladnìj¹í a snáze se analyzují.}
41
42 \:{\I Path compression:} pokud z~vrcholu vystoupíme do~koøene (napøíklad
43 bìhem operace \<Find>), pøepojíme v¹echny vrcholy na~cestì, po~které jsme pro¹li,
44 rovnou pod koøen.
45 \endlist
46
47 \s{Pozorování:} Samotné pravidlo Union by rank zajistí, ¾e strom ranku $r$ bude
48 mít hloubku nejvý¹e $r$ a minimálnì $2^r$ vrcholù, tak¾e èasová slo¾itost operací
49 bude omezena $\O(\log n)$.%
50 \foot{Mimochodem, Path compression samotná by také na~slo¾itost $\O(\log n)$ amortizovanì staèila.}
51
52 \s{Vìta:} (Tarjan, van Leeuwen \cite{tarjan84setunion}) Kombinace Union by rank a Path compression vede k~amortizované
53 slo¾itosti obou operací $\O(\alpha(n))$, kde $\alpha$ je inverzní Ackermannova funkce.%
54 \foot{Existuje varianta tohoto algoritmu, která dosahuje stejné slo¾itosti i v~nejhor¹ím
55 pøípadì; té¾ je známo, ¾e asymptoticky lep¹í slo¾itosti nelze dosáhnout.}
56
57 \h{Union-Find s~pøedem známými Uniony}
58
59 Dále nás bude zajímat speciální varianta Union-Find problemu, v~ní¾ dopøedu známe
60 posloupnost unionù, èili strom, který spojováním komponent vznikne. Popí¹eme algoritmus,
61 který po~poèáteèním pøedzpracování v~èase $\O(n)$ zvládne \<Union> i \<Find> v~amortizovanì
62 konstantním èase. Tento algoritmus je kombinací dekompozic popsaných v~\cite{alstrup97optimal}
63 a \cite{alstrup98marked}.
64
65 \s{Definice:} {\I (Microtree/Macrotree dekompozice)} Pro zakoøenìný strom $T$ o~$n$ vrcholech
66 definujeme:
67 \itemize\ibull
68 \:{\I Koøeny mikrostromù} $R$ budou nejvy¹¹í vrcholy, pod~nimi¾ je nejvý¹e $\log n$ listù.
69 \:{\I Mikrostromy} le¾í v~$T$ od~tìchto koøenù ní¾e.
70 \:{\I Spojovací hrany} vedou z~koøenù mikrostromù do~jejich otcù.
71 \:{\I Makrostrom} je tvoøen ostatními vrcholy a hranami stromu~$T$.
72 \endlist
73
74 \s{Pozorování:} Ka¾dý mikrostrom má nejvý¹e $\log n$ listù. Pod ka¾dým listem makrostromu le¾í
75 alespoò jeden mikrostrom\foot{Mù¾e jich být i více, pøedstavte si dekompozici hvìzdy.}, tak¾e
76 listù makrostromu je nejvý¹e $n/\log n$.
77
78 Vnitøních vrcholù makro- i mikrostromù ale mù¾e být ne¹ikovnì mnoho, proto¾e se ve~stromech mohou
79 vyskytovat dlouhé cesty. Pomù¾eme si snadno: ka¾dou cestu si budeme pamatovat zvlá¹» a ve~stromu
80 ji nahradíme hranou, která bude existovat právì tehdy, kdy¾ budou pøítomny v¹echny hrany cesty.
81
82 \s{Algoritmus pro cesty:} Cestu délky~$l$ rozdìlíme na~úseky délky $\log n$, pro nì¾ si pamatujeme
83 mno¾iny ji¾ pøítomných hran (po~bitech jako èísla). Pak si je¹tì pamatujeme zkomprimovanou cestu (hrany
84 odpovídají úsekùm a jsou pøítomny právì tehdy, jsou-li pøítomny v¹echny hrany pøíslu¹ného úseku)
85 délky $l/\log n$ a pro ni \uv{pøebarvovací} strukturu pro Union-Find.
86
87 \>$\<Union>(x,y)$ (pøidání hrany $e=xy$ do~cesty):
88
89 \algo
90 \:Pøidáme $e$ do mno¾iny hran pøítomných v~pøíslu¹ném úseku.
91 \:Pokud se tím úsek naplnil, pøidáme odpovídající hranu do~zkomprimované cesty.
92 \endalgo
93
94 \>$\<Find>(x,y):$
95 \algo
96 \:Pokud $x$ a $y$ jsou v~tém¾e úseku, otestujeme bitovými operacemi, zda
97   jsou v¹echny hrany mezi $x$ a $y$ pøítomny.
98 \:Pokud jsou v~rùzných, rozdìlíme cestu z~$x$ do~$y$ na~posloupnost celých úsekù,
99   na~které nám odpoví zkomprimovaná cesta, a~dva dotazy v~krajních èásteèných úsecích.
100 \endalgo
101
102 Operace uvnitø úsekù pracují v~èase $\O(1)$, operace na~zkomprimované cestì v~$\O(\log l)$
103 amortizovanì, ale je jich $\O(l/\log n)=\O(l/\log l)$, tak¾e celkovì zaberou lineární èas.
104
105 \s{Algoritmus pro mikrostromy:} Po~kompresi cest má ka¾dý mikrostrom nejvý¹e $2\log n$
106 vrcholù, èili také nejvý¹e tolik hran. Hrany si oèíslujeme pøirozenými èísly, ka¾dou
107 mno¾inu hran pak mù¾eme reprezentovat $2\log n$-bitovým èíslem a mno¾inové operace
108 provádìt pomocí bitových v~konstantním èase.
109
110 Pro ka¾dý mikrostrom si pøedpoèítáme pro v¹echny jeho vrcholy~$v$ mno¾iny~$P_v$ hran le¾ících
111 na~cestì z~koøene mikrostromu do~$v$. Navíc si budeme pro celý mikrostrom pamatovat mno¾inu
112 pøítomných hran~$F$.
113
114 \>$\<Union>(x,y):$
115
116 \algo
117 \:Najdeme poøadové èíslo $i$ hrany $xy$ (máme pøedpoèítané).
118 \:$F := F \cup \{i\}$.
119 \endalgo
120
121 \>$\<Find>(x,y):$
122
123 \algo
124 \:$P := P_x \mathop{\Delta} P_v$ (mno¾ina hran le¾ících na~cestì z~$x$ do~$y$)
125 \:Pokud $P\setminus F=\emptyset$, le¾í $x$ a $y$ ve~stejnì komponentì, jinak ne.
126 \endalgo
127
128 \s{Algoritmus pro celý problém:} Zkomprimujeme cesty a výsledný strom rozlo¾íme
129 na~mikrostromy, makrostromy a spojovací hrany. Pro cesty a mikrostromy pou¾ijeme
130 vý¹e popsané struktury, pro ka¾dou spojovací hranu si budeme pamatovat jen znaèku,
131 zda je pøítomna, a pro makrostrom pøebarvovací strukturu.
132
133 \>Operace $\<Union>(x,y)$:
134
135 \algo
136 \:Pokud $e=xy$ le¾í uvnitø cesty, pøidáme ji do~cesty, co¾ buïto zpùsobí
137    pøidávání jiné hrany do~stromu, a~nebo u¾ jsme hotovi.
138 \:Pokud $e$ je spojovací, poznamenáme si, ¾e je pøítomna, a~konèíme.
139 \:Pokud $e$ le¾í uvnitø mikrostromu nebo makrostromu, provedeme \<Union>
140    na~pøíslu¹né struktuøe.
141 \endlist
142
143 \>Operace $\<Find>(x,y)$:
144
145 \algo
146 \:Pokud $x$ a $y$ le¾í uvnitø jedné cesty, zeptáme se cestové struktury a konèíme.
147 \:Pokud $x$ le¾í uvnitø nìjaké cesty, zjistíme dotazem na~cestovou strukturu,
148    ke~kterému krajnímu vrcholu cesty je pøipojen, a~$x$ nahradíme tímto vrcholem.
149    Není-li pøipojen k~¾ádnému, je~evidentnì odpovìï na~celý \<Find> negativní,
150    pokud k~obìma, vybereme si libovolný, proto¾e jsou stejnì v~cestovì komprimovaném
151    stromu spojeny hranou. Analogicky pro~$y$.
152 \:[Nyní jsou $x$ a $y$ vrcholy cestovì zkomprimovaného stromu.]
153 \:Le¾í-li $x$ a $y$ v~jednom mikrostromu, zeptáme se struktury pro~mikrostrom.
154 \:Je-li $x$ uvnitø mikrostromu, zeptáme se mikrostromové struktury na~spojení s~koøenem mikrostromu.
155   Není-li, odpovíme {\sc ne}, stejnì jako kdy¾ není pøítomna pøíslu¹ná spojovací hrana.
156   Jinak $x$ nahradíme listem makrostromu, do~kterého spojovací hrana vede. Podobnì pro~$y$.
157 \:[Nyní jsou $x$ a $y$ vrcholy makrostromu.]
158 \:Odpovíme podle struktury pro makrostrom.
159 \endalgo
160
161 \s{Analýza:} Operace s~mikrostromy, spojovacími hranami a cestami jsou, jak u¾ víme,
162 amortizovanì konstantní. Operace s~makrostromy také, jeliko¾ trvají $\O(\log n)$,
163 ale provede se jich pouze $\O(n/\log n)$. Ka¾dou operaci \<Union> nebo \<Find>
164 rozlo¾íme $\O(1)$ tìchto dílèích operací, tak¾e bude také trvat $\O(1)$ amortizovanì.
165
166 \h{Fredericksonova clusterizace}
167
168 Mikro/makro-stromová dekompozice není jediný zpùsob, jak stromy rozkládat. Nìkdy
169 se hodí napøíklad následující my¹lenka: \cite{frederickson91ambivalent}
170
171 \s{Definice:} (Fredericksonova clusterizace) Nech» $G$ je graf s~vrcholy stupòù nejvý¹e~3
172 a $c\ge 1$. Pak $c$-clusterizací grafu $G$ nazveme libovolný rozklad
173 $G$ na~souvislé podgrafy (clustery) $G_1, G_2, \ldots, G_k$ takový, ¾e platí:
174 \itemize\ibull
175 \:$\forall v \in V \exists ! i: v \in C_i$.
176 \:$\forall i: \vert C_i\vert \le c$.
177 \:$\forall i$ je vnìj¹í stupeò $C_i$ (tj. poèet hran, které vedou mezi $C_i$ a zbytkem grafu)
178 nejvý¹e~3. Navíc pokud je právì~3, je cluster triviální, èili $\vert C_i \vert = 1$.
179 \:®ádné dva sousední clustery nelze spojit.
180 \endlist
181
182 \s{Vìta:} (Frederickson) Ka¾dá $c$-clusterizace grafu $G$ má $\O(V(G)/c)$ clusterù. Existuje
183 algoritmus, který jednu takovou najde v~lineárním èase.
184
185 \s{Dùkaz:} První èast rozborem pøípadù, druhá hladovì pomocí DFS. \qed
186
187 \s{Pou¾ití:} Pøedchozí variantu Union-Find problemu bychom také mohli vyøe¹it nahrazením
188 vrcholù stupnì $>3$ \uv{kruhovými objezdy bez jedné hrany}\foot{tzv. francouzský trik},
189 nalezením $(\log n)$-clusterizace, pou¾itím bitové reprezentace mno¾in uvnitø clusterù
190 a pøebarvovací struktury na~hrany mezi clustery.
191
192 \h{Stromoví pøedchùdci}
193
194 \s{Problém:} {\I (Least Common Ancestor alias LCA)} Chceme si pøedzpracovat zakoøenìný strom~$T$
195 tak, abychom dokázali pro libovolné dva vrcholy $x,y$ najít co~nejrychleji jejich nejbli¾¹ího
196 spoleèného pøedchùdce.
197
198 \s{Triviální øe¹ení LCA:}
199 \itemize\ibull
200 \:Vystoupáme z~$x$ i $y$ do~koøene, oznaèíme vrcholy na~cestách a kde se poprvé
201   potkají, tam je hledaný pøedchùdce. To je lineární s~hloubkou a nepotøebuje
202   pøedzpracování.
203 \:Vylep¹ení: Budeme stoupat z~$x$ a $y$ støídavì. Tak potøebujeme jen lineárnì mnoho
204   krokù vzhledem ke~vzdálenosti spoleèného pøedchùdce.
205 \:Pøedpoèítáme v¹echny mo¾nosti: pøedzpracování $\O(n^2)$, dotaz $\O(1)$.
206 \:\dots\ co dál?
207 \endlist
208
209 \>Vìrni vtipùm o~matfyzácích a èlánku \cite{bender00lca} pøevedeme radìji tento problém na~jiný.
210
211 \s{Problém:} {\I (Range Minimum Query alias RMQ)} Chceme pøedzpracovat posloupnost èísel
212 $a_1,\ldots a_n$ tak, abychom umìli rychle poèítat $\min_{x\le i\le y} a_i$.%
213 \foot{V¹imnìte si, ¾e pro sumu místo minima je tento problém velmi snadný.}
214
215 \s{Lemma:} LCA lze pøevést na~RMQ s~lineárním èasem na~pøedzpracování a konstantním
216 èasem na~pøevod dotazu.
217
218 \s{Dùkaz:} Strom projdeme do~hloubky a poka¾dé, kdy¾ nav¹tívíme vrchol (v~inorderu),
219 zapí¹eme jeho hloubku. ${\rm LCA}(x,y)$ pak bude nejhlub¹í vrchol mezi poslední
220 náv¹tìvou~$x$ a první náv¹tìvou~$y$, nebo opaènì.
221 \qed
222
223 \s{Triviální øe¹ení RMQ:}
224 \itemize\ibull
225 \:Pøedpoèítáme v¹echny mo¾né dotazy: pøedzpracování $\O(n^2)$, dotaz $\O(1)$.
226 \:Pro ka¾dé $i$ a $j\le \log n$ pøedpoèítáme $m_{ij} = \min\{ a_i, a_{i+1}, \ldots, a_{i+2^j-1} \}$,
227 èili minima v¹ech blokù velkých jako nìjaká mocnina dvojky. Kdy¾ se poté nìkdo zeptá
228 na~minimum bloku $a_i,a_{i+1},\ldots,a_{j-1}$, najdeme nejvìt¹í $k$ takové, ¾e $2^k < j-i$
229 a vrátíme $\min( \min\{ a_i, \ldots, a_{i+2^k-1} \}, \min\{ a_{j-2^k}, \ldots, a_{j-1} \} )$.
230 Tak zvládneme dotaz v~èase $\O(1)$ za~cenu pøedzpracování v~èase $\O(n\log n)$.
231 \endlist
232
233 My si ov¹em v¹imneme, ¾e ná¹ pøevod z~LCA vytváøí dosti speciální instance problému RMQ,
234 toti¾ takové, v~nich¾ je $\vert a_i - a_{i+1} \vert = 1$. Takovým instancím budeme
235 øíkat RMQ${\pm}1$ a budeme je umìt øe¹it ¹ikovnou dekompozicí.
236
237 \s{Dekompozice} pro RMQ${\pm}1$: Vstupní posloupnost rozdìlíme na~bloky velikosti $b=1/2\cdot \log n$,
238 ka¾dý dotaz umíme rozdìlit na~èást týkající se celých blokù a maximálnì dva dotazy na~èásteèné bloky.
239
240 V¹imneme si, ¾e aèkoliv blokù je mnoho, jejich mo¾ných typù (tj. posloupností klesání
241 a stoupání) je pouze $2^{b-1}\le\sqrt n$ a bloky tého¾ typu se li¹í pouze posunutím
242 o~konstantu. Vybudujeme proto kvadratickou strukturu pro jednotlivé typy a pro ka¾dý
243 blok si zapamatujeme, jakého je typu a jaké má posunutí. Celkem strávíme èas
244 $\O(n + \sqrt n \cdot \log^2 n) = \O(n)$ pøedzpracováním a $\O(1)$ dotazem.
245
246 Mimo to je¹tì vytvoøíme komprimovanou posloupnost, v~ní¾ ka¾dý blok nahradíme
247 jeho minimem. Tuto posloupnost délky $n/b$ budeme pou¾ívat pro èásti dotazù
248 týkající se celých blokù a pøipravíme si pro ni \uv{logaritmickou} variantu
249 triviální struktury. To nás bude stát $\O(n/b\cdot\log (n/b))=\O(n/\log n\cdot\log n)=\O(n)$ na~pøedzpracování
250 a $\O(1)$ na~dotaz.
251
252 Tak jsme získali algoritmus pro RMQ${\pm}1$ s~konstantním èasem na~dotaz po~lineárním
253 pøedzpracování a vý¹e zmínìným pøevodem i algoritmus na~LCA se stejnými parametry.
254 Je¹tì uká¾eme, ¾e pøevod mù¾e fungovat i v~opaèném smìru, a~tak mù¾eme získat
255 i konstantní/lineární algoritmus pro obecné RMQ.
256
257 \s{Definice:} {\I Kartézský strom} pro posloupnost $a_1,\ldots,a_n$ je strom,
258 jeho¾ koøenem je $a_j=\min_i a_i$, jeho levý podstrom je kartézský strom pro
259 $a_1,\ldots,a_{j-1}$ a pravý podstrom kartézský strom pro $a_{j+1},\ldots,a_n$.
260
261 \s{Lemma:} Kartézský strom je mo¾né zkonstruovat v~lineárním èase.
262
263 \s{Dùkaz:} Pou¾ijeme inkrementální algoritmus, v¾dy si budeme pamatovat
264 kartézský strom pro ji¾ zpracované prvky a pozici posledního zpracovaného
265 prvku v~tomto stromu. Kdy¾ pøidáváme dal¹í prvek, hledáme místo, kam ho
266 pøipojit, od~tohoto oznaèeného prvku nahoru. Pov¹imneme si, ¾e vzhledem
267 k~potenciálu urèenému hloubkou oznaèeného prvku je èasová slo¾itost pøidání
268 prvku amortizovanì konstantní.
269 \qed
270
271 \s{Lemma:} RMQ lze pøevést na~LCA s~lineárním èasem na~pøedzpracování a konstantním
272 èasem na~pøevod dotazu.
273
274 \s{Dùkaz:} Sestrojíme kartézský strom a RMQ pøevedeme na~LCA v~tomto stromu.
275 \qed
276
277 Výsledky této podkapitoly mù¾eme shrnout do~následující vìty:
278
279 \s{Vìta:} Problémy LCA i RMQ je mo¾né øe¹it v~konstantním èase na~dotaz
280 po~pøedzpracování v~lineárním èase.
281
282 \references
283 \bye