]> mj.ucw.cz Git - ads2.git/blob - 6-geom/6-geom.tex
909d4f45b036bc3a98f704cfa3125df3a4861e38
[ads2.git] / 6-geom / 6-geom.tex
1 \input lecnotes.tex
2
3 \prednaska{6}{Geometrické algoritmy}{}
4
5 \>Uká¾eme si nìkolik základních algoritmù na øe¹ení geometrických problémù v~rovinì. Proè zrovna v~rovinì? Inu, jednorozmìrné problémy bývají triviální
6 a naopak pro vy¹¹í dimenze jsou velice komplikované. Rovina je proto rozumným kompromisem mezi obtí¾ností a zajímavostí.
7
8 Celou kapitolou nás bude provázet pohádka ze ¾ivota ledních medvìdù. Pokusíme se vyøe¹it jejich \uv{ka¾dodenní} problémy~\dots
9
10 \h{Hledání konvexního obalu}
11
12 {\I Daleko na severu ¾ili lední medvìdi. Ve vodách tamního moøe byla hojnost ryb a jak je známo, ryby jsou oblíbenou pochoutkou ledních medvìdù.
13 Proto¾e medvìdi z~na¹í pohádky rozhodnì nejsou ledajací a ani chytrost jim neschází, rozhodli se v¹echny ryby pochytat. Znají pøesná místa výskytu
14 ryb a rádi by vyrobili obrovskou sí», do které by je v¹echny chytili. Pomozte medvìdùm zjistit, jaký nejmen¹í obvod taková sí» mù¾e mít.}
15
16 \figure{7-geom5_rybi_motivace.eps}{Problém ledních mìdvìdù: Jaký je nejmen¹í obvod sítì?}{3in}
17
18 Neboli v~øeèi matematické, chceme pro zadanou mno¾inu bodù v~rovinì nalézt její konvexní obal.
19
20 \s{Definice:} O~mno¾inì bodù øekneme, ¾e je {\I konvexní}, pokud pro ka¾dé dva body obsahuje i celou úseèku mezi nimi.
21 {\I Konvexní obal} dané mno¾iny bodù~$M$ je nejmen¹í konvexní mno¾ina, která obsahuje v¹echny body mno¾iny~$M$.%
22 \foot{Nejmen¹í myslíme vzhledem k~inkluzi, tedy je to prùnik v¹ech konvexních mno¾in
23 obsahujících v¹echny body z~$M$.
24 \endgraf
25 Pamatujete si na lineární obaly ve vektorových prostorech? Lineární obal
26 mno¾iny vektorù je nejmen¹í vektorový podprostor, který tyto vektory obsahuje.
27 Není náhoda, ¾e tato definice pøipomíná definici konvexního obalu. Na druhou
28 stranu ka¾dý vektor z~lineárního obalu lze vyjádøit jako lineární kombinaci
29 daných vektorù. Podobnì platí i pro konvexní obaly, ¾e ka¾dý bod z~obalu je
30 konvexní kombinací daných bodù. Ta se li¹í od lineární v~tom, ¾e v¹echny
31 koeficienty jsou v~intervalu $[0,1]$ a navíc souèet v¹ech koeficientù je $1$.
32 Tento algebraický pohled mù¾e mnohé vìci zjednodu¹it. Zkuste dokázat, ¾e obì
33 definice konvexního obalu jsou ekvivalentní.}
34
35 Snadno si v¹imneme, ¾e konvexní obal koneèné mno¾iny bodù je v¾dy nìjaký
36 konvexní mnohoúhelník. Navíc víme, ¾e vrcholy le¾í v~nìkterých ze~zadaných bodù.
37 Pro malé poèty bodù to bude vypadat následovnì:
38
39 \figure{7-geom1_male_obaly.eps}{Konvexní obaly malých mno¾in.}{3in}
40
41 Na¹ím úkolem tedy bude najít tento mnohoúhelník a vypsat na výstup
42 jeho vrcholy v~poøadí, ve~kterém na mnohoúhelníku le¾í (buï po~smìru hodinových
43 ruèièek nebo proti nìmu). Pro jednoduchost budeme konvexní obal øíkat pøímo tomuto
44 seznamu vrcholù.
45
46 Navíc budeme pøedpokládat, ¾e v¹echny body mají rùzné $x$-ové
47 souøadnice.\foot{To si mù¾eme dovolit pøedpokládat, nebo» se v¹emi body staèí
48 nepatrnì pootoèit. Tím konvexní obal urèitì nezmìníme a $x$-ové souøadnice
49 se ji¾ budou li¹it. Poøadí otoèených bodù podle $x$-ové souøadnice pøitom
50 odpovídá lexikografickému poøadí (druhotnì podle souøadnice~$y$)
51 pùvodních bodù. Tak¾e staèí v~na¹em algoritmu vymìnit tøídìní za~lexikografické
52 a bude fungovat obecnì.}
53 Tím máme zaji¹tìné, ¾e existují dva body, nejlevìj¹í a nejpravìj¹í, a~ty urèitì
54 le¾í na konvexním obalu.
55
56 Algoritmus na nalezení konvexního obalu funguje na principu, kterému se
57 obvykle øíká {\I zametání roviny}. Procházíme rovinu zleva doprava
58 (\uv{zametáme ji pøímkou}) a udr¾ujeme si konvexní obal tìch bodù, které jsme
59 u¾ pro¹li.
60
61 Na~poèátku máme konvexní obal jednobodové mno¾iny, co¾ je samotný bod.
62 Nech» tedy u¾ známe konvexní obal prvních $k-1$ bodù a chceme pøidat $k$-tý bod.
63 Ten urèitì na~novém konvexním obalu bude le¾et (je nejpravìj¹í), ale jeho pøidání
64 k~minulému obalu mù¾e zpùsobit, ¾e hranice pøestane být konvexní. To ale lze
65 snadno napravit -- staèí z~hranice odebírat body po~smìru a proti smìru hodinových ruèièek
66 tak dlouho, ne¾ opìt bude konvexní.
67
68 Napøíklad na~následujícím obrázku nemusíme po smìru hodinových ruèièek odebrat ani jeden
69 bod, obal je v poøádku. Naopak proti smìru ruèièek musíme odebrat dokonce dva body.
70
71 \figure{7-geom2_pridani_bodu.eps}{Pøidání bodu do konvexního obalu.}{4.5in}
72
73 Podle tohoto principu u¾ snadno vytvoøíme algoritmus. Aby se lépe popisoval,
74 rozdìlíme konvexní obal na {\I horní obálku} a {\I dolní obálku} -- to jsou
75 èásti, které vedou od~nejlevìj¹ího bodu k~nejpravìj¹ímu \uv{horem} a \uv{spodem}.
76
77 \figure{7-geom3_obalky.eps}{Horní a dolní obálka konvexního obalu.}{3.4in}
78
79 Obì obálky jsou lomené èáry, navíc horní obálka poøád zatáèí doprava a dolní
80 naopak doleva. Pro udr¾ování bodù v~obálkách staèí dva zásobníky. V~$k$-tém
81 kroku algoritmu pøidáme $k$-tý bod zvlá¹» do horní i dolní obálky. Pøidáním
82 $k$-tého bodu se v¹ak mù¾e poru¹it smìr, ve kterém obálka zatáèí. Proto budeme
83 nejprve body z~obálky odebírat a $k$-tý bod pøidáme a¾ ve chvíli, kdy jeho
84 pøidání smìr zatáèení neporu¹í.
85
86 \s{Algoritmus:}
87
88 \algo
89
90 \:Setøídíme body podle $x$-ové souøadnice, oznaème body $b_1, \ldots, b_n$.
91 \:Vlo¾íme do horní a dolní obálky bod $b_1$: $H = D = (b_1)$.
92 \:Pro ka¾dý dal¹í bod $b = b_2,\ldots,b_n$:
93 \::Pøepoèítáme horní obálku:
94 \:::Dokud $\vert H\vert \ge 2$, $H = (\ldots, h_{k-1}, h_k)$ a úhel $h_{k-1} h_k b$ je orientovaný doleva:
95 \::::Odebereme poslední bod $h_k$ z~obálky $H$.
96 \:::Pøidáme bod $b$ do obálky $H$.
97 \::Symetricky pøepoèteme dolní obálku (s orientací doprava).
98 \: Výsledný obal je tvoøen body v~obálkách $H$ a $D$.
99
100 \endalgo
101
102 Rozebereme si èasovou slo¾itost algoritmu. Setøídit body podle $x$-ové souøadnice doká¾eme v~èase $\O(n \log n)$. Pøidání dal¹ího bodu do obálek
103 trvá lineárnì vzhledem k~poètu odebraných bodù. Zde vyu¾ijeme obvyklý postup: Ka¾dý bod je odebrán nejvý¹e jednou, a tedy v¹echna odebrání trvají
104 dohromady $\O(n)$. Konvexní obal doká¾eme sestrojit v~èase $\O(n \log n)$, a pokud bychom mìli seznam bodù ji¾ utøídený, doká¾eme to dokonce v
105 $\O(n)$.
106
107 \s{Algebraický dodatek:} Jak zjistit orientaci úhlu? Uká¾eme si jednoduchý
108 zpùsob zalo¾ený na lineární algebøe. Budou se k~tomu hodit vlastnosti determinantu.
109 Absolutní hodnota determinantu je objem rovnobì¾nostìnu urèeného øádkovými
110 vektory matice. Dùle¾itìj¹í v¹ak je, ¾e znaménko determinantu urèuje
111 \uv{orientaci} vektorù -- zda je levotoèivá èi pravotoèivá. Proto¾e ná¹ problém
112 je rovinný, budeme uva¾ovat determinanty matic $2 \times 2$.
113
114 Uva¾me souøadnicový systém v~rovinì, jeho¾ $x$-ová souøadnice roste smìrem
115 doprava a~$y$-ová smìrem nahoru. Chceme zjistit orientaci úhlu $h_{k-1} h_k b$.
116 Oznaème $\vec u = (x_1, y_1)$ rozdíl souøadnic bodù $h_k$ a~$h_{k-1}$ a podobnì
117 $\vec v = (x_2, y_2)$ rozdíl souøadnic bodù $b$ a~$h_k$. Matici $M$ definujeme
118 následovnì: $$M = \pmatrix{\vec u \cr \vec v} = \pmatrix {x_1&y_1\cr
119 x_2&y_2}.$$ Úhel $h_{k-1} h_k b$ je orientován doleva, právì kdy¾ $\det
120 M = x_1y_2 - x_2y_1$ je nezáporný, a spoèítat hodnotu determinantu je
121 jednoduché. Mo¾né situace jsou nakresleny na obrázku. Poznamenejme, ¾e
122 k~podobnému vzorci se lze také dostat pøes vektorový souèin vektorù $\vec u$
123 a $\vec v$.
124
125 \figure{7-geom4_determinant.eps}{Jak vypadají determinanty rùzných znamének v~rovinì.}{4.6in}
126
127 \h{Rychlej¹í algoritmus}
128
129 Také vám vrtá hlavou, zda jde konvexní obal sestrojit rychleji? Obecnì ne,
130 alespoò pokud chceme body na konvexním obalu vydat v~poøadí, v~jakém se
131 na hranici nacházejí.\foot{Pak bychom toti¾ umìli tøídit reálná èísla
132 v~èase lep¹ím ne¾ $\Omega(n\log n)$, co¾ se ví, ¾e nejde (ná¹ dolní
133 odhad slo¾itosti tøídìní z~minulého semestru na~to ov¹em nestaèí).
134 Zkuste pøevod z~tøídìní na hledání konvexního obalu vymyslet sami.}
135 Pokud ov¹em na~konvexním obalu vìt¹ina bodù nele¾í, jde to rychleji.
136
137 Na pøedná¹ce to sice nebylo (a~u~zkou¹ky nebude), ale zde si uká¾eme nejrychlej¹í
138 známý algoritmus, jeho¾ autorem je T.~Chan a který funguje v~èase $\O(n \log h)$,
139 kde $h$ znaèí poèet bodù le¾ících na konvexním obalu. Pøekvapivì bude docela snadný.
140
141 Pøedpokládejme, ¾e bychom znali velikost konvexního obalu $h$. Rozdìlíme body
142 libovolnì do $\lceil n/h \rceil$ mno¾in $Q_1, \ldots, Q_k$ tak, aby
143 v~ka¾dé mno¾inì bylo nejvý¹e~$h$ bodù. Pro ka¾dou z~tìchto mno¾in nalezneme
144 konvexní obal pomocí vý¹e popsaného algoritmu. To doká¾eme pro jednu v~èase
145 $\O(h \log h)$ a pro v¹echny v~èase $\O(n \log h)$. V druhé fázi spustíme
146 tyto pøedpoèítané obaly slepíme do~jednoho pomocí tak zvaného {\I provázkového
147 algoritmu.} Ten se opírá o~následující pozorování:
148
149 \s{Pozorování:} Úseèka spojující dva body $a$ a $b$ le¾í na konvexním obalu,
150 právì kdy¾ v¹echny ostatní body le¾í na té¾e stranì pøímky prolo¾ené touto
151 úseèkou.
152
153 Algoritmu se øíká provázkový, proto¾e svojí èinností pøipomíná namotávání
154 provázku podél konvexního obalu.  Zaèneme s bodem, který na konvexním obalu
155 urèitì le¾í, to je tøeba ten nejlevìj¹í. V ka¾dém kroku nalezneme následující
156 bod po obvodu konvexního obalu. To udìláme napøíklad tak, ¾e projdeme v¹echny
157 body a vybereme ten, který svírá nejmen¹í úhel s poslední stranou konvexního
158 obalu. Novì pøidaná úseèka vyhovuje pozorování a proto do konvexního obalu
159 patøí. Po $h$ krocích se dostaneme zpìt k nejlevìj¹ímu bodu a výpoèet ukonèíme.
160 V ka¾dém kroku potøebujeme projít v¹echny body a vybrat následníka, co¾
161 doká¾eme v èase $\O(n)$. Celková slo¾itost algoritmu je tedy $\O(n \cdot h)$.
162
163 \twofigures{7-geom6_provazkovy_algoritmus.eps}{Provázkový algoritmus.}{1.25in}{7-geom7_naslednik_pres_konvexni_obal.eps}{Hledání kandidáta v pøedpoèítaném obalu.}{2.5in}
164
165 Provázkový algoritmus funguje, ale má jednu obrovskou nevýhodu -- je toti¾
166 ukrutnì pomalý. Ký¾eného zrychlení dosáhneme, pokud pou¾ijeme pøedpoèítané
167 konvexní obaly. Ty umo¾ní rychleji hledat následníka. Pro ka¾dou z mno¾in $Q_i$
168 najdeme zvlá¹» kandidáta a poté z nich vybereme toho nejlep¹ího. Mo¾ný kandidát
169 v¾dy le¾í na konvexním obalu mno¾iny $Q_i$. Vyu¾ijeme toho, ¾e body obalu jsou
170 \uv{uspoøádané}, i kdy¾ trochu netypicky do kruhu. Kandidáta mù¾eme hledat
171 metodou pùlení intervalu, jen detaily jsou malièko slo¾itìj¹í, ne¾ je
172 obvyklé. Jak pùlit, zjistíme podle smìru zatáèení konvexního obalu. Detaily si
173 rozmyslí ètenáø sám.
174
175 Èasová slo¾itost pùlení je $\O(\log h)$ pro jednu mno¾inu. Mno¾in je nejvý¹e
176 $\O({n \over h})$, tedy následující bod konvexního obalu nalezneme v èase
177 $\O({n \over h} \log h)$. Celý obal nalezneme ve slibovaném èase $\O(n \log
178 h)$. 
179
180 Popsanému algoritmu schází jedna dùle¾itá vìc: Ve skuteènosti vìt¹inou neznáme
181 velikost $h$. Budeme proto algoritmus iterovat s~rostoucí hodnotou $h$, dokud
182 konvexní obal nesestrojíme. Pokud pøi slepování konvexních obalù zjistíme, ¾e
183 konvexní obal je vìt¹í ne¾ $h$, výpoèet ukonèíme. Zbývá je¹tì zvolit, jak
184 rychle má $h$ rùst. Pokud by rostlo moc pomalu, budeme poèítat zbyteènì mnoho
185 fází, naopak pøi rychlém rùstu by nás poslední fáze mohla stát pøíli¹ mnoho.
186
187 V~$k$-té iteraci polo¾íme $h = 2^{2^k}$. Dostáváme celkovou slo¾itost
188 algoritmu: $$\sum_{m=0}^{\O(\log \log h)} \O(n \log 2^{2^m})
189 = \sum_{m=0}^{\O(\log \log h)} \O(n \cdot 2^m) = \O(n \log h),$$ kde poslední
190 rovnost dostaneme jako souèet prvních $\O(\log \log h)$ èlenù geometrické øady
191 $\sum 2^m$.
192
193 \h{Hledání prùseèíkù úseèek}
194
195 {\I Medvìdi vyøe¹ili rybí problém a hlad je ji¾ netrápí. Av¹ak na severu ne¾ijí
196 sami, za sousedy mají Eskymáky. Proto¾e je rozhodnì lep¹í se sousedy dobøe
197 vycházet, jsou medvìdi a Eskymáci velcí pøátelé. Skoro ka¾dý se se svými
198 pøáteli rád schází. Av¹ak to je musí nejprve nalézt~\dots}
199
200 Zkusíme nejprve Eskymákùm vyøe¹it lokalizaci ledních medvìdù.
201
202 {\I Kdy¾ takový medvìd nemá co na práci, rád se prochází. Na místech, kde se trasy protínají, je zvý¹ená ¹ance, ¾e se dva medvìdi potkají a zapovídají
203 -- ostatnì co byste èekali od medvìdù. To jsou ta správná místa pro Eskymáka, který chce potkat medvìda. Jenom¾e jak tato køí¾ení najít?}
204
205 Pro zjednodu¹ení pøedpokládejme, ¾e medvìdi chodí po úseèkách tam a zpìt. Budeme tedy chtít nalézt v¹echny prùseèíky úseèek v rovinì.
206
207 \bigskip
208 \centerline{\epsfxsize=1.5in\epsfbox{8-geom2_0_bear.eps}\hskip 4em\epsfxsize2in\epsfbox{8-geom2_1_usecky.eps}}
209 \smallskip
210 \centerline{Problém Eskymákù: Kde v¹ude se køí¾í medvìdí trasy?}
211 \bigskip
212
213 Pro $n$ úseèek mù¾e existovat a¾ $\Omega(n^2)$ prùseèíkù.\foot{Zkuste takový
214 pøíklad zkonstruovat.} Tedy optimální slo¾itosti by dosáhl i algoritmus, který
215 by pro ka¾dou dvojici úseèek testoval, zda se protínají. Èasovou slo¾itost
216 algoritmu v¹ak posuzujeme i vzhledem k velikosti výstupu $p$. Typické
217 rozmístìní úseèek mívá toti¾ prùseèíkù spí¹e pomálu. Pro tento pøípad si
218 uká¾eme podstatnì rychlej¹í algoritmus.
219
220 Pro jednodu¹¹í popis pøedpokládejme, ¾e úseèky le¾í v obecné poloze. To
221 znamená, ¾e ¾ádné tøi úseèky se neprotínají v jednom bodì a prùnikem ka¾dých
222 dvou úseèek je nejvý¹e jeden bod. Navíc pøedpokládejme, ¾e krajní bod ¾ádné
223 úseèky nele¾í na jiné úseèce a také neexistují vodorovné úseèky. Na závìr si
224 uká¾eme, jak se s~tìmito pøípady vypoøádat.
225
226 Algoritmus funguje na principu zametání roviny, podobnì jako hledání konvexního
227 obalu. Budeme posouvat vodorovnou pøímku odshora dolù. V¾dy, kdy¾ narazíme na
228 nový prùnik, ohlásíme jeho výskyt. Samozøejmì spojité posouvání nahradíme
229 diskrétním a pøímku v¾dy posuneme do dal¹ího bodu, kde se nìco zajímavého
230 dìje.
231
232 Tím zajímavým jsou {\I zaèátky úseèek}, {\I konce úseèek} a {\I prùseèíky
233 úseèek}. Dohromady jim budeme øíkat {\I události.} Po~utøídìní známe pro první
234 dva typy událostí poøadí, v jakém se objeví. Prùseèíkové události budeme
235 objevovat prùbì¾nì.
236
237 V~ka¾dém kroku si pamatujeme {\I prùøez} $P$ -- posloupnost úseèek zrovna
238 protnutých zametací pøímkou. Tyto úseèky máme utøídìné zleva doprava.  Navíc si
239 udr¾ujeme kalendáø $K$ budoucích událostí. V~nìm budou naplánovány v¹echny zaèátky
240 a konce le¾ící pod zametací pøímkou. Navíc se pro ka¾dou dvojici úseèek podíváme,
241 zda se pod zametací pøímkou protnou, a~pokud ano, tak takový prùseèík také naplánujeme.
242 (Mohli bychom pøitom úseèky pova¾ovat za~polopøímky, fale¹né prùseèíky toti¾
243 beztak sma¾eme døíve, ne¾ na nì dojde øada.)
244
245 Algoritmus pro hledání prùnikù úseèek pak funguje následovnì:
246
247 \s{Algoritmus:}
248
249 \algo
250
251 \:$P \leftarrow \emptyset$.
252 \:Do $K$ vlo¾íme zaèátky a konce v¹ech úseèek.
253 \:Dokud $K \ne \emptyset$:
254 \::Odebereme nejvy¹¹í událost.
255 \::Pokud je to zaèátek úseèky, zatøídíme novou úseèku do $P$.
256 \::Pokud je to konec úseèky, odebereme úseèku z $P$.
257 \::Pokud je to prùseèík, nahlásíme ho a prohodíme úseèky v $P$.
258 \::Navíc v¾dy pøepoèítáme naplánované prùseèíkové události -- v¾dy maximálnì dvì odebereme a dvì nové pøidáme.
259 \endalgo
260
261 Zbývá rozmyslet, jaké datové struktury pou¾ijeme pro reprezentaci prùøezu a kalendáøe.
262 S~kalendáøem je to snadné, ten mù¾eme ulo¾it napøíklad do~haldy. Co potøebujeme dìlat
263 s~prùøezem? Vkládat a odebírat úseèky, ale také k~dané úseèce nalézt jejího pøedchùdce
264 a následníka (to je potøeba pøi plánování prùseèíkových událostí). Nabízí se vyu¾ít
265 vyhledávací strom, ov¹em jako klíèe v~nìm nemohou vystupovat $x$-ové souøadnice úseèek
266 (respektive jejich prùseèíkù se zametací pøímkou). Ty se toti¾ pøi ka¾dém posunutí
267 na¹eho \uv{ko¹tìte} mohou v¹echny zmìnit.
268
269 Ulo¾íme tedy do~vrcholù místo souøadnic jen odkazy na úseèky. Ty se nemìní (a~mezi
270 událostmi se nemìní ani jejich poøadí, co¾ je dùle¾ité) a kdykoliv nìjaká operace
271 se~stromem nav¹tíví jeho vrchol, dopoèítáme aktuální souøadnici úseèky a podle toho
272 se rozhodneme, zda se vydat doleva nebo doprava.
273
274 Prùøez obsahuje v¾dy nejvý¹e~$n$ úseèek, tak¾e operace se stromem budou
275 trvat $\O(\log n)$. V~kalendaøi se nachází nejvý¹e~$n$ zaèátkù a koncù
276 a nejvý¹e~$n$ prùseèíkových událostí (ty plánujeme pro dvojice úseèek
277 sousedících v~prùøezu, a~tìch je v¾dy nejvý¹e~$n$). Operace s~kalendáøem
278 proto trvají také $\O(\log n)$.
279
280 Pøi vyhodnocování ka¾dé události provedeme $\O(1)$ operací s~datovými
281 strukturami, tak¾e událost zpracujeme v~èase $\O(\log n)$. V¹ech událostí
282 dohromady je pøitom $\O(n+p)$, a~proto celý algoritmus dobìhne v~èase
283 $\O((n+p) \log n)$.
284
285 \s{Cvièení:} Popi¹te, jak algoritmus upravit, aby nepotøeboval pøedpoklad
286 obecné polohy úseèek. Podobnì jako u~konvexního obalu, i zde staèí jednoduché
287 úpravy.
288
289 Na závìr poznamenejme, ¾e existuje efektivnìj¹í, by» daleko komplikovanìj¹í,
290 algoritmus od Chazella dosahující èasové slo¾itosti $\O(n \log n + p)$.
291
292 \h{Hledání nejbli¾¹ích bodù a Voroného diagramy}
293
294 Nyní se pokusíme vyøe¹it i problém druhé strany -- pomù¾eme medvìdùm nalézt Eskymáky.
295
296 {\I Eskymáci tráví vìt¹inu èasu doma, ve svém iglù. Takový medvìd je na své toulce zasnì¾enou krajinou, kdy¾ tu se najednou rozhodne nav¹tívit nìjakého
297 Eskymáka. Proto se podívá do své medvìdí mapy a nalezne nejbli¾¹í iglù. Má to ale jeden háèek, iglù jsou spousty a medvìd by dávno usnul, ne¾ by
298 nejbli¾¹í objevil.}
299
300 Popí¹eme si nejprve, jak vypadá medvìdí mapa. Medvìdí mapa obsahuje celou Arktidu a jsou v ní vyznaèena v¹echna iglù. Navíc obsahuje vyznaèené
301 oblasti tvoøené body, které jsou nejblí¾e k jednomu danému iglù. Takovému schématu se øíká {\I Voroného diagram}. Ten pro zadané body $x_1, \ldots, x_n$
302 obsahuje rozdìlení roviny na oblasti $B_1, \ldots, B_n$, kde $B_i$ je mno¾ina bodù, které jsou blí¾e k $x_i$ ne¾ k ostatním bodùm $x_j$. Formálnì jsou
303 tyto oblasti definovány následovnì:
304 $$B_i = \left\{y \in {\bb R}^2\ \vert\ \forall j:\rho(x_i,y) \le \rho(x_j,y)\right\},$$
305 kde $\rho(x,y)$ znaèí vzdálenost bodù $x$ a $y$.
306
307 \twofigures{8-geom2_2_polorovina.eps}{Body bli¾¹í k $a$ ne¾ $b$.}{1.25in}{8-geom2_3_voroneho_diagram.eps}{Voroného diagram.}{2.5in}
308
309 Uká¾eme si, ¾e Voroného diagram má pøekvapivì jednoduchou strukturu. Nejprve uva¾me, jak budou vypadat oblasti $B_a$ a $B_b$ pouze pro dva body
310 $a$ a $b$, jak je naznaèeno na obrázku. V¹echny body stejnì vzdálené od $a$ i $b$ le¾í na pøímce $p$ -- ose úseèky $ab$. Oblasti $B_a$ a $B_b$
311 jsou tedy tvoøeny polorovinami ohranièenými osou~$p$. Tedy obecnì tvoøí mno¾ina v¹ech bodù bli¾¹ích k $x_i$ ne¾ k $x_j$ nìjakou polorovinu. Oblast
312 $B_i$ obsahuje v¹echny body, které jsou souèasnì bli¾¹í k $x_i$ ne¾ ke v¹em ostatním bodùm $x_j$ -- tedy le¾í ve v¹ech polorovinách souèasnì.
313 Ka¾dá z oblastí $B_i$ je tvoøena prùnikem $n-1$ polorovin, tedy je to (mo¾ná neomezený) mnohoúhelník.
314 Pøíklad Voroného diagramu je naznaèen na obrázku. Zadané body jsou oznaèeny prázdnými krou¾ky a hranice oblastí $B_i$ jsou vyznaèené èernými èárami.
315
316 Není náhoda, pokud vám hranice oblastí pøipomíná rovinný graf. Jeho vrcholy jsou body, které jsou stejnì vzdálené od alespoò tøí zadaných bodù. Jeho
317 stìny jsou oblasti $B_i$. Jeho hrany jsou tvoøeny èástí hranice mezi dvìma oblastmi -- body, které mají dvì oblasti spoleèné. Obecnì prùnik dvou
318 oblastí mù¾e být, v závislosti na jejich sousedìní, prázdný, bod, úseèka, polopøímka nebo dokonce celá pøímka.  V dal¹ím textu si pøedstavme, ¾e celý
319 Voroného diagram uzavøeme do dostateènì velkého obdélníka, èím¾ dostaneme omezený rovinný graf.
320
321 Poznamenejme, ¾e pøeru¹ované èáry tvoøí hrany duálního rovinného grafu s vrcholy v zadaných bodech. Hrany spojují sousední body na kru¾nicích, které 
322 obsahují alespoò tøi ze zadaných bodù. Napøíklad na obrázku dostáváme skoro samé trojúhelníky, proto¾e vìt¹ina kru¾nic obsahuje pøesnì tøi zadané
323 body. Av¹ak nalezneme i jeden ètyøúhelník, jeho¾ vrcholy le¾í na jedné kru¾nici.
324
325 Zkusíme nyní odhadnout, jak velký je rovinný graf popisující Voroného diagram.
326 Pro rovinné grafy bez násobných hran obecnì platí, ¾e mají nejvý¹e lineárnì
327 mnoho hran vzhledem k~vrcholùm. My ov¹em neznáme poèet vrcholù, nýbr¾ poèet stìn
328 -- ka¾dá stìna odpovídá jednomu ze zadaných bodù. Proto odhad poètu hran pou¾ijeme
329 na duál na¹eho grafu, èím¾ prohodíme vrcholy se stìnami a hran zùstane stejnì.
330 ®ádnou násobnou hranu jsme tím nepøidali, ta by toti¾ odpovídala stìnì velikosti~2
331 ve~Voroného diagramu a takové neexistují, nebo» ka¾dá stìna je ohranièena rovnými
332 èarami.
333
334 Voroneho diagram pro $n$~zadaných bodù je tedy velký $\O(n)$. Dodejme, ¾e ho lze
335 zkonstruovat zkonstruovat v èase $\O(n \log n)$, napøíklad pomocí zametání roviny nebo metodou
336 Rozdìl a panuj. Tím se v¹ak zabývat nebudeme,\foot{Pro zvídavé, kteøí nemají zkou¹ku druhý den ráno: Detaily naleznete v~zápiscích z~ADS z~roku 2007/2008.}
337 místo toho si uká¾eme, jak v ji¾ spoèteném Voroného diagramu rychle hledat nejbli¾¹í body.
338
339 \h{Lokalizace bodu uvnitø mnohoúhelníkové sítì}
340
341 Problém medvìdù je najít v medvìdí mapì co nejrychleji nejbli¾¹í iglù. Máme v~rovinì sí» tvoøenou mnohoúhelníky. Chceme pro jednotlivé body rychle
342 rozhodovat, do kterého mnohoúhelníku patøí. Na¹e øe¹ení budeme optimalizovat pro jeden pevný rozklad a obrovské mno¾ství rùzných dotazù, které chceme
343 co nejrychleji zodpovìdìt.\foot{Pøedstavujme si to tøeba tak, ¾e medvìdùm zprovozníme server. Ten jednou schroustá celou mapu a potom co nejrychleji
344 odpovídá na jejich dotazy. Medvìdi tak nemusí v mapách nic hledat, staèí se pøipojit na server a poèkat na odpovìï.} Nejprve pøedzpracujeme zadané
345 mnohoúhelníky a vytvoøíme strukturu, která nám umo¾ní rychlé dotazy na jednotlivé body.
346
347 Uka¾me si pro zaèátek øe¹ení bez pøedzpracování. Rovinu budeme zametat pøímkou shora dolù. Podobnì jako pøi hledání prùseèíkù úseèek, udr¾ujeme si prùøez
348 pøímkou. V¹imnìte si, ¾e tento prùøez se mìní jenom ve vrcholech mnohoúhelníkù. Ve chvíli, kdy narazíme na hledaný bod, podíváme se, do kterého
349 intervalu v prùøezu patøí. To nám dá mnohoúhelník, který nahlásíme. Prùøez budeme uchovávat ve vyhledávacím stromì. Takové øe¹ení má slo¾itost $\O(n
350 \log n)$ na dotaz, co¾ je hroznì pomalé.
351
352 Pøedzpracování bude fungovat následovnì. Jak je naznaèeno na obrázku pøeru¹ovanými èárami, rozøe¾eme si celou rovinu na pásy, bìhem kterých se prùøez
353 pøímkou nemìní. Pro ka¾dý z nich si pamatujeme stav stromu tak, jak vypadal prùøez pøi procházení tímto pásem. Kdy¾ chceme lokalizovat nìjaký bod,
354 nejprve pùlením nalezneme pás, ve kterém se nachází $y$-ová souøadnice bodu. Poté polo¾íme dotaz na pøíslu¹ný strom. Strom procházíme a po cestì si dopoèítáme souøadnice
355 prùøezu, a¾ lokalizujeme správný interval v prùøezu. Dotaz doká¾eme zodpovìdìt v~èase $\O(\log n)$. Hledaný bod je na obrázku naznaèen prázdným
356 koleèkem a nalezený interval v prùøezu je vyta¾ený tuènì.
357
358 \figure{8-geom2_4_pasy_mnohouhelniku.eps}{Mnohoúhelníky rozøezané na pásy}{2.5in}
359
360 Kdybychom si ov¹em uchovávali stavy stromu tak, ¾e bychom si pro ka¾dý pás poøídili kopii celého
361 stromu, spotøebovali bychom jenom kopírováním stromù èas i pamì» $\Theta(n^2\log n)$. Místo toho
362 si poøídíme {\I persistentní} vyhledávací strom -- ten si pamatuje historii v¹ech
363 svých zmìn a umí v~ní vyhledávat. Pøesnìji øeèeno, po~ka¾dé operaci, která mìní stav stromu,
364 vznikne nová {\I verze} stromu a operace pro hledání dostanou jako dal¹í parametr identifikátor
365 verze, ve~které mají hledat.
366
367 Popí¹eme jednu z~mo¾ných konstrukcí persistentního stromu. Uva¾ujme obyèejný vyhledávací strom,
368 øeknìme AVL strom. Rozhodneme se ale, ¾e jeho vrcholy nikdy nebudeme mìnit, abychom neporu¹ili
369 zaznamenanou historii. Místo toho si poøídíme kopii vrcholu a tu zmìníme. Musíme ov¹em zmìnit
370 ukazatel na daný vrchol, aby ukazoval na kopii. Proto zkopírujeme i jeho otce a upravíme v~nìm
371 ukazatel. Tím pádem musíme upravit i ukazatel na otce, atd., a¾ se dostaneme do koøene. Kopie
372 koøene se pak stane identifikátorem nové verze.
373
374 Zkopírovali jsme tedy celou cestu mezi koøenem stromu a upravovaným vrcholem. Uchování
375 jedné verze nás tedy strojí èas $\O(\log n)$ a prostor takté¾ $\O(\log n)$. Je¹tì nesmíme
376 zapomenout, ¾e po ka¾dé operaci následuje vyvá¾ení stromu. To ov¹em upravuje pouze vrcholy,
377 které le¾í v~konstantní vzdálenosti od~cesty z~místa úpravy do koøene, tak¾e jejich zkopírováním
378 èasovou ani prostorou slo¾itost nezhor¹íme.
379
380 \figure{8-geom2_5_upravy_stromu.eps}{Jedna operace mìní pouze okolí cesty -- navì¹ené podstromy se nemìní.}{2in}
381
382 Celková èasová slo¾itost je tedy $\O(n \log n)$ na pøedzpracování Voroného diagramu a vytvoøení persistentního stromu. Kvùli persistenci potøebuje
383 toto pøedzpracování pamì» $\O(n \log n)$. Na dotaz spotøebujeme èas $\O(\log n)$, nebo» nejprve vyhledáme pùlením pøíslu¹ný pás a poté polo¾íme dotaz
384 na pøíslu¹nou verzi stromu.
385
386 \s{Lze to lépe?} Na závìr poznamenejme, ¾e spotøeba pamìti $\Theta(\log n)$
387 na ulo¾ení jedné verze je zbyteènì vysoká. Existuje o~nìco chytøej¹í konstrukce
388 persistentního stromu, které staèí konstantní pamì», alespoò amortizovanì.
389 Nastíníme, jak funguje.
390
391 Nejprve si poøídíme vyhledávací strom, který pøi ka¾dém vlo¾ení nebo smazání
392 prvku provede jen amortizovanì konstantní poèet {\I strukturálních zmìn}
393 (to jsou zmìny hodnot a ukazatelù, zkrátka v¹eho, podle èeho se øídí
394 vyhledávání a co je tedy potøeba verzovat; zmìna poèítadla ve~vrcholu
395 u~AVL-stromu tedy strukturální není). Tuto vlastnost mají tøeba 2,4-stromy
396 nebo nìkteré varianty èerveno-èerných stromù.
397
398 Nyní uká¾eme, jak jednu strukturální zmìnu zaznamenat v~amortizovanì
399 konstantním prostoru. Ka¾dý vrchol stromu si tentokrát bude pamatovat
400 dvì své verze (spolu s~èasy jejich vzniku). Pøi prùchodu od~koøene
401 porovnáme èas vzniku tìchto verzí s~aktuálním èasem a vybereme si
402 správnou verzi. Pokud potøebujeme zaznamenat novou verzi vrcholu, buïto
403 na ni ve~vrcholu je¹tì je místo, nebo není a v~takovém pøípadì vrchol
404 zkopírujeme, co¾ vynutí zmìnu ukazatele v~rodièi, a~tedy i vytvoøení
405 nové verze rodièe, atd. a¾ pøípadnì do koøene. Identifikátorem verze
406 celé datové struktury bude ukazatel na aktuální kopii koøene.
407
408 Jedna operace mù¾e v~nejhor¹ím pøípadì zpùsobit zkopírování v¹ech
409 vrcholù a¾ do koøene, ale jednoduchým potenciálovým argumentem lze
410 dokázat, ¾e poèet kopií bude amortizovanì konstantní.
411
412 \bye