]> mj.ucw.cz Git - ads2.git/blob - 6-geom/6-geom.tex
Voroneho diagramy: Oprava preklepu
[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 \algo{KonvexníObal}
87 \:Setøídíme body podle $x$-ové souøadnice, oznaème body $b_1, \ldots, b_n$.
88 \:Vlo¾íme do horní a dolní obálky bod $b_1$: $H = D = (b_1)$.
89 \:Pro ka¾dý dal¹í bod $b = b_2,\ldots,b_n$:
90 \::Pøepoèítáme horní obálku:
91 \:::Dokud $\vert H\vert \ge 2$, $H = (\ldots, h_{k-1}, h_k)$ a úhel $h_{k-1} h_k b$ je orientovaný doleva:
92 \::::Odebereme poslední bod $h_k$ z~obálky $H$.
93 \:::Pøidáme bod $b$ do obálky $H$.
94 \::Symetricky pøepoèteme dolní obálku (s orientací doprava).
95 \:Výsledný obal je tvoøen body v~obálkách $H$ a $D$.
96 \endalgo
97
98 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
99 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í
100 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
101 $\O(n)$.
102
103 \s{Algebraický dodatek:} Jak zjistit orientaci úhlu? Uká¾eme si jednoduchý
104 zpùsob zalo¾ený na lineární algebøe. Budou se k~tomu hodit vlastnosti determinantu.
105 Absolutní hodnota determinantu je objem rovnobì¾nostìnu urèeného øádkovými
106 vektory matice. Dùle¾itìj¹í v¹ak je, ¾e znaménko determinantu urèuje
107 \uv{orientaci} vektorù -- zda je levotoèivá èi pravotoèivá. Proto¾e ná¹ problém
108 je rovinný, budeme uva¾ovat determinanty matic $2 \times 2$.
109
110 Uva¾me souøadnicový systém v~rovinì, jeho¾ $x$-ová souøadnice roste smìrem
111 doprava a~$y$-ová smìrem nahoru. Chceme zjistit orientaci úhlu $h_{k-1} h_k b$.
112 Oznaème $\vec u = (x_1, y_1)$ rozdíl souøadnic bodù $h_k$ a~$h_{k-1}$ a podobnì
113 $\vec v = (x_2, y_2)$ rozdíl souøadnic bodù $b$ a~$h_k$. Matici $M$ definujeme
114 následovnì: $$M = \pmatrix{\vec u \cr \vec v} = \pmatrix {x_1&y_1\cr
115 x_2&y_2}.$$ Úhel $h_{k-1} h_k b$ je orientován doleva, právì kdy¾ $\det
116 M = x_1y_2 - x_2y_1$ je nezáporný, a spoèítat hodnotu determinantu je
117 jednoduché. Mo¾né situace jsou nakresleny na obrázku. Poznamenejme, ¾e
118 k~podobnému vzorci se lze také dostat pøes vektorový souèin vektorù $\vec u$
119 a $\vec v$.
120
121 \figure{7-geom4_determinant.eps}{Jak vypadají determinanty rùzných znamének v~rovinì.}{4.6in}
122
123 \h{Rychlej¹í algoritmus}
124
125 Také vám vrtá hlavou, zda jde konvexní obal sestrojit rychleji? Obecnì ne,
126 alespoò pokud chceme body na konvexním obalu vydat v~poøadí, v~jakém se
127 na hranici nacházejí.\foot{Pak bychom toti¾ umìli tøídit reálná èísla
128 v~èase lep¹ím ne¾ $\Omega(n\log n)$, co¾ se ví, ¾e nejde (ná¹ dolní
129 odhad slo¾itosti tøídìní z~minulého semestru na~to ov¹em nestaèí).
130 Zkuste pøevod z~tøídìní na hledání konvexního obalu vymyslet sami.}
131 Pokud ov¹em na~konvexním obalu vìt¹ina bodù nele¾í, jde to rychleji.
132
133 Na pøedná¹ce to sice nebylo (a~u~zkou¹ky nebude), ale zde si uká¾eme nejrychlej¹í
134 známý algoritmus, jeho¾ autorem je T.~Chan a který funguje v~èase $\O(n \log h)$,
135 kde $h$ znaèí poèet bodù le¾ících na konvexním obalu. Pøekvapivì bude docela snadný.
136
137 Pøedpokládejme, ¾e bychom znali velikost konvexního obalu $h$. Rozdìlíme body
138 libovolnì do $\lceil n/h \rceil$ mno¾in $Q_1, \ldots, Q_k$ tak, aby
139 v~ka¾dé mno¾inì bylo nejvý¹e~$h$ bodù. Pro ka¾dou z~tìchto mno¾in nalezneme
140 konvexní obal pomocí vý¹e popsaného algoritmu. To doká¾eme pro jednu v~èase
141 $\O(h \log h)$ a pro v¹echny v~èase $\O(n \log h)$. V druhé fázi spustíme
142 tyto pøedpoèítané obaly slepíme do~jednoho pomocí tak zvaného {\I provázkového
143 algoritmu.} Ten se opírá o~následující pozorování:
144
145 \s{Pozorování:} Úseèka spojující dva body $a$ a $b$ le¾í na konvexním obalu,
146 právì kdy¾ v¹echny ostatní body le¾í na té¾e stranì pøímky prolo¾ené touto
147 úseèkou.
148
149 Algoritmu se øíká provázkový, proto¾e svojí èinností pøipomíná namotávání
150 provázku podél konvexního obalu.  Zaèneme s bodem, který na konvexním obalu
151 urèitì le¾í, to je tøeba ten nejlevìj¹í. V ka¾dém kroku nalezneme následující
152 bod po obvodu konvexního obalu. To udìláme napøíklad tak, ¾e projdeme v¹echny
153 body a vybereme ten, který svírá nejmen¹í úhel s poslední stranou konvexního
154 obalu. Novì pøidaná úseèka vyhovuje pozorování a proto do konvexního obalu
155 patøí. Po $h$ krocích se dostaneme zpìt k nejlevìj¹ímu bodu a výpoèet ukonèíme.
156 V ka¾dém kroku potøebujeme projít v¹echny body a vybrat následníka, co¾
157 doká¾eme v èase $\O(n)$. Celková slo¾itost algoritmu je tedy $\O(n \cdot h)$.
158
159 \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}
160
161 Provázkový algoritmus funguje, ale má jednu obrovskou nevýhodu -- je toti¾
162 ukrutnì pomalý. Ký¾eného zrychlení dosáhneme, pokud pou¾ijeme pøedpoèítané
163 konvexní obaly. Ty umo¾ní rychleji hledat následníka. Pro ka¾dou z mno¾in $Q_i$
164 najdeme zvlá¹» kandidáta a poté z nich vybereme toho nejlep¹ího. Mo¾ný kandidát
165 v¾dy le¾í na konvexním obalu mno¾iny $Q_i$. Vyu¾ijeme toho, ¾e body obalu jsou
166 \uv{uspoøádané}, i kdy¾ trochu netypicky do kruhu. Kandidáta mù¾eme hledat
167 metodou pùlení intervalu, jen detaily jsou malièko slo¾itìj¹í, ne¾ je
168 obvyklé. Jak pùlit, zjistíme podle smìru zatáèení konvexního obalu. Detaily si
169 rozmyslí ètenáø sám.
170
171 Èasová slo¾itost pùlení je $\O(\log h)$ pro jednu mno¾inu. Mno¾in je nejvý¹e
172 $\O({n \over h})$, tedy následující bod konvexního obalu nalezneme v èase
173 $\O({n \over h} \log h)$. Celý obal nalezneme ve slibovaném èase $\O(n \log
174 h)$. 
175
176 Popsanému algoritmu schází jedna dùle¾itá vìc: Ve skuteènosti vìt¹inou neznáme
177 velikost $h$. Budeme proto algoritmus iterovat s~rostoucí hodnotou $h$, dokud
178 konvexní obal nesestrojíme. Pokud pøi slepování konvexních obalù zjistíme, ¾e
179 konvexní obal je vìt¹í ne¾ $h$, výpoèet ukonèíme. Zbývá je¹tì zvolit, jak
180 rychle má $h$ rùst. Pokud by rostlo moc pomalu, budeme poèítat zbyteènì mnoho
181 fází, naopak pøi rychlém rùstu by nás poslední fáze mohla stát pøíli¹ mnoho.
182
183 V~$k$-té iteraci polo¾íme $h = 2^{2^k}$. Dostáváme celkovou slo¾itost
184 algoritmu: $$\sum_{m=0}^{\O(\log \log h)} \O(n \log 2^{2^m})
185 = \sum_{m=0}^{\O(\log \log h)} \O(n \cdot 2^m) = \O(n \log h),$$ kde poslední
186 rovnost dostaneme jako souèet prvních $\O(\log \log h)$ èlenù geometrické øady
187 $\sum 2^m$.
188
189 \h{Hledání prùseèíkù úseèek}
190
191 {\I Medvìdi vyøe¹ili rybí problém a hlad je ji¾ netrápí. Av¹ak na severu ne¾ijí
192 sami, za sousedy mají Eskymáky. Proto¾e je rozhodnì lep¹í se sousedy dobøe
193 vycházet, jsou medvìdi a Eskymáci velcí pøátelé. Skoro ka¾dý se se svými
194 pøáteli rád schází. Av¹ak to je musí nejprve nalézt~\dots}
195
196 Zkusíme nejprve Eskymákùm vyøe¹it lokalizaci ledních medvìdù.
197
198 {\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í
199 -- 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?}
200
201 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ì.
202
203 \bigskip
204 \centerline{\epsfxsize=1.5in\epsfbox{8-geom2_0_bear.eps}\hskip 4em\epsfxsize2in\epsfbox{8-geom2_1_usecky.eps}}
205 \smallskip
206 \centerline{Problém Eskymákù: Kde v¹ude se køí¾í medvìdí trasy?}
207 \bigskip
208
209 Pro $n$ úseèek mù¾e existovat a¾ $\Omega(n^2)$ prùseèíkù.\foot{Zkuste takový
210 pøíklad zkonstruovat.} Tedy optimální slo¾itosti by dosáhl i algoritmus, který
211 by pro ka¾dou dvojici úseèek testoval, zda se protínají. Èasovou slo¾itost
212 algoritmu v¹ak posuzujeme i vzhledem k velikosti výstupu $p$. Typické
213 rozmístìní úseèek mívá toti¾ prùseèíkù spí¹e pomálu. Pro tento pøípad si
214 uká¾eme podstatnì rychlej¹í algoritmus.
215
216 Pro jednodu¹¹í popis pøedpokládejme, ¾e úseèky le¾í v obecné poloze. To
217 znamená, ¾e ¾ádné tøi úseèky se neprotínají v jednom bodì a prùnikem ka¾dých
218 dvou úseèek je nejvý¹e jeden bod. Navíc pøedpokládejme, ¾e krajní bod ¾ádné
219 úseèky nele¾í na jiné úseèce a také neexistují vodorovné úseèky. Na závìr si
220 uká¾eme, jak se s~tìmito pøípady vypoøádat.
221
222 Algoritmus funguje na principu zametání roviny, podobnì jako hledání konvexního
223 obalu. Budeme posouvat vodorovnou pøímku odshora dolù. V¾dy, kdy¾ narazíme na
224 nový prùnik, ohlásíme jeho výskyt. Samozøejmì spojité posouvání nahradíme
225 diskrétním a pøímku v¾dy posuneme do dal¹ího bodu, kde se nìco zajímavého
226 dìje.
227
228 Tím zajímavým jsou {\I zaèátky úseèek}, {\I konce úseèek} a {\I prùseèíky
229 úseèek}. Dohromady jim budeme øíkat {\I události.} Po~utøídìní známe pro první
230 dva typy událostí poøadí, v jakém se objeví. Prùseèíkové události budeme
231 objevovat prùbì¾nì.
232
233 V~ka¾dém kroku si pamatujeme {\I prùøez} $P$ -- posloupnost úseèek zrovna
234 protnutých zametací pøímkou. Tyto úseèky máme utøídìné zleva doprava.  Navíc si
235 udr¾ujeme kalendáø $K$ budoucích událostí. V~nìm budou naplánovány v¹echny zaèátky
236 a konce le¾ící pod zametací pøímkou. Navíc se pro ka¾dou dvojici úseèek podíváme,
237 zda se pod zametací pøímkou protnou, a~pokud ano, tak takový prùseèík také naplánujeme.
238 (Mohli bychom pøitom úseèky pova¾ovat za~polopøímky, fale¹né prùseèíky toti¾
239 beztak sma¾eme døíve, ne¾ na nì dojde øada.)
240
241 Algoritmus pro hledání prùnikù úseèek pak funguje následovnì:
242
243 \algo{Prùseèíky}
244 \:$P \leftarrow \emptyset$.
245 \:Do $K$ vlo¾íme zaèátky a konce v¹ech úseèek.
246 \:Dokud $K \ne \emptyset$:
247 \::Odebereme nejvy¹¹í událost.
248 \::Pokud je to zaèátek úseèky, zatøídíme novou úseèku do $P$.
249 \::Pokud je to konec úseèky, odebereme úseèku z $P$.
250 \::Pokud je to prùseèík, nahlásíme ho a prohodíme úseèky v $P$.
251 \::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.
252 \endalgo
253
254 Zbývá rozmyslet, jaké datové struktury pou¾ijeme pro reprezentaci prùøezu a kalendáøe.
255 S~kalendáøem je to snadné, ten mù¾eme ulo¾it napøíklad do~haldy. Co potøebujeme dìlat
256 s~prùøezem? Vkládat a odebírat úseèky, ale také k~dané úseèce nalézt jejího pøedchùdce
257 a následníka (to je potøeba pøi plánování prùseèíkových událostí). Nabízí se vyu¾ít
258 vyhledávací strom, ov¹em jako klíèe v~nìm nemohou vystupovat $x$-ové souøadnice úseèek
259 (respektive jejich prùseèíkù se zametací pøímkou). Ty se toti¾ pøi ka¾dém posunutí
260 na¹eho \uv{ko¹tìte} mohou v¹echny zmìnit.
261
262 Ulo¾íme tedy do~vrcholù místo souøadnic jen odkazy na úseèky. Ty se nemìní (a~mezi
263 událostmi se nemìní ani jejich poøadí, co¾ je dùle¾ité) a kdykoliv nìjaká operace
264 se~stromem nav¹tíví jeho vrchol, dopoèítáme aktuální souøadnici úseèky a podle toho
265 se rozhodneme, zda se vydat doleva nebo doprava.
266
267 Prùøez obsahuje v¾dy nejvý¹e~$n$ úseèek, tak¾e operace se stromem budou
268 trvat $\O(\log n)$. V~kalendáøi se nachází nejvý¹e~$n$ zaèátkù a koncù
269 a nejvý¹e~$n$ prùseèíkových událostí (ty plánujeme pro dvojice úseèek
270 sousedících v~prùøezu, a~tìch je v¾dy nejvý¹e~$n$). Operace s~kalendáøem
271 proto trvají také $\O(\log n)$.
272
273 Pøi vyhodnocování ka¾dé události provedeme $\O(1)$ operací s~datovými
274 strukturami, tak¾e událost zpracujeme v~èase $\O(\log n)$. V¹ech událostí
275 dohromady je pøitom $\O(n+p)$, a~proto celý algoritmus dobìhne v~èase
276 $\O((n+p) \log n)$.
277
278 \s{Cvièení:} Popi¹te, jak algoritmus upravit, aby nepotøeboval pøedpoklad
279 obecné polohy úseèek. Podobnì jako u~konvexního obalu, i zde staèí jednoduché
280 úpravy.
281
282 Na závìr poznamenejme, ¾e existuje efektivnìj¹í, by» daleko komplikovanìj¹í,
283 algoritmus od Chazella dosahující èasové slo¾itosti $\O(n \log n + p)$.
284
285 \h{Hledání nejbli¾¹ích bodù a Voroného diagramy}
286
287 Nyní se pokusíme vyøe¹it i problém druhé strany -- pomù¾eme medvìdùm nalézt Eskymáky.
288
289 {\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
290 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
291 nejbli¾¹í objevil.}
292
293 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é
294 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$
295 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
296 tyto oblasti definovány následovnì:
297 $$B_i = \left\{y \in {\bb R}^2\ \vert\ \forall j:\rho(x_i,y) \le \rho(x_j,y)\right\},$$
298 kde $\rho(x,y)$ znaèí vzdálenost bodù $x$ a $y$.
299
300 \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}
301
302 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
303 $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$
304 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
305 $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ì.
306 Ka¾dá z oblastí $B_i$ je tvoøena prùnikem $n-1$ polorovin, tedy je to (mo¾ná neomezený) mnohoúhelník.
307 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.
308
309 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
310 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
311 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ý
312 Voroného diagram uzavøeme do dostateènì velkého obdélníka, èím¾ dostaneme omezený rovinný graf.
313
314 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é 
315 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é
316 body. Av¹ak nalezneme i jeden ètyøúhelník, jeho¾ vrcholy le¾í na jedné kru¾nici.
317
318 Zkusíme nyní odhadnout, jak velký je rovinný graf popisující Voroného diagram.
319 Pro rovinné grafy bez násobných hran obecnì platí, ¾e mají nejvý¹e lineárnì
320 mnoho hran vzhledem k~vrcholùm. My ov¹em neznáme poèet vrcholù, nýbr¾ poèet stìn
321 -- ka¾dá stìna odpovídá jednomu ze zadaných bodù. Proto odhad poètu hran pou¾ijeme
322 na duál na¹eho grafu, èím¾ prohodíme vrcholy se stìnami a hran zùstane stejnì.
323 ®ádnou násobnou hranu jsme tím nepøidali, ta by toti¾ odpovídala stìnì velikosti~2
324 ve~Voroného diagramu a takové neexistují, nebo» ka¾dá stìna je ohranièena rovnými
325 èarami.
326
327 Voroného diagram pro $n$~zadaných bodù je tedy velký $\O(n)$. Dodejme, ¾e ho lze
328 zkonstruovat v èase $\O(n \log n)$, napøíklad pomocí zametání roviny nebo metodou
329 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.}
330 místo toho si uká¾eme, jak v ji¾ spoèteném Voroného diagramu rychle hledat nejbli¾¹í body.
331
332 \h{Lokalizace bodu uvnitø mnohoúhelníkové sítì}
333
334 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
335 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
336 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
337 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é
338 mnohoúhelníky a vytvoøíme strukturu, která nám umo¾ní rychlé dotazy na jednotlivé body.
339
340 Uka¾me si pro zaèátek øe¹ení bez pøedzpracování. Rovinu budeme zametat shora dolù vodorovnou pøímkou. Podobnì jako pøi hledání prùseèíkù úseèek, udr¾ujeme si prùøez
341 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
342 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
343 \log n)$ na dotaz, co¾ je hroznì pomalé.
344
345 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
346 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,
347 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
348 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
349 koleèkem a nalezený interval v prùøezu je vyta¾ený tuènì.
350
351 \figure{8-geom2_4_pasy_mnohouhelniku.eps}{Mnohoúhelníky rozøezané na pásy}{2.5in}
352
353 Kdybychom si ov¹em uchovávali stavy stromu tak, ¾e bychom si pro ka¾dý pás poøídili kopii celého
354 stromu, spotøebovali bychom jenom kopírováním stromù èas i pamì» $\Theta(n^2\log n)$. Místo toho
355 si poøídíme {\I persistentní} vyhledávací strom -- ten si pamatuje historii v¹ech
356 svých zmìn a umí v~ní vyhledávat. Pøesnìji øeèeno, po~ka¾dé operaci, která mìní stav stromu,
357 vznikne nová {\I verze} stromu a operace pro hledání dostanou jako dal¹í parametr identifikátor
358 verze, ve~které mají hledat.
359
360 Popí¹eme jednu z~mo¾ných konstrukcí persistentního stromu. Uva¾ujme obyèejný vyhledávací strom,
361 øeknìme AVL strom. Rozhodneme se ale, ¾e jeho vrcholy nikdy nebudeme mìnit, abychom neporu¹ili
362 zaznamenanou historii. Místo toho si poøídíme kopii vrcholu a tu zmìníme. Musíme ov¹em zmìnit
363 ukazatel na daný vrchol, aby ukazoval na kopii. Proto zkopírujeme i jeho otce a upravíme v~nìm
364 ukazatel. Tím pádem musíme upravit i ukazatel na otce, atd., a¾ se dostaneme do koøene. Kopie
365 koøene se pak stane identifikátorem nové verze.
366
367 Zkopírovali jsme tedy celou cestu mezi koøenem stromu a upravovaným vrcholem. Uchování
368 jedné verze nás tedy strojí èas $\O(\log n)$ a prostor takté¾ $\O(\log n)$. Je¹tì nesmíme
369 zapomenout, ¾e po ka¾dé operaci následuje vyvá¾ení stromu. To ov¹em upravuje pouze vrcholy,
370 které le¾í v~konstantní vzdálenosti od~cesty z~místa úpravy do koøene, tak¾e jejich zkopírováním
371 èasovou ani prostorou slo¾itost nezhor¹íme.
372
373 \figure{8-geom2_5_upravy_stromu.eps}{Jedna operace mìní pouze okolí cesty -- navì¹ené podstromy se nemìní.}{2in}
374
375 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
376 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
377 na pøíslu¹nou verzi stromu.
378
379 \s{Lze to lépe?} Na závìr poznamenejme, ¾e spotøeba pamìti $\Theta(\log n)$
380 na ulo¾ení jedné verze je zbyteènì vysoká. Existuje o~nìco chytøej¹í konstrukce
381 persistentního stromu, které staèí konstantní pamì», alespoò amortizovanì.
382 Nastíníme, jak funguje.
383
384 Nejprve si poøídíme vyhledávací strom, který pøi ka¾dém vlo¾ení nebo smazání
385 prvku provede jen amortizovanì konstantní poèet {\I strukturálních zmìn}
386 (to jsou zmìny hodnot a ukazatelù, zkrátka v¹eho, podle èeho se øídí
387 vyhledávání a co je tedy potøeba verzovat; zmìna poèítadla ve~vrcholu
388 u~AVL-stromu tedy strukturální není). Tuto vlastnost mají tøeba 2,4-stromy
389 nebo nìkteré varianty èerveno-èerných stromù.
390
391 Nyní uká¾eme, jak jednu strukturální zmìnu zaznamenat v~amortizovanì
392 konstantním prostoru. Ka¾dý vrchol stromu si tentokrát bude pamatovat
393 dvì své verze (spolu s~èasy jejich vzniku). Pøi prùchodu od~koøene
394 porovnáme èas vzniku tìchto verzí s~aktuálním èasem a vybereme si
395 správnou verzi. Pokud potøebujeme zaznamenat novou verzi vrcholu, buïto
396 na ni ve~vrcholu je¹tì je místo, nebo není a v~takovém pøípadì vrchol
397 zkopírujeme, co¾ vynutí zmìnu ukazatele v~rodièi, a~tedy i vytvoøení
398 nové verze rodièe, atd. a¾ pøípadnì do koøene. Identifikátorem verze
399 celé datové struktury bude ukazatel na aktuální kopii koøene.
400
401 Jedna operace mù¾e v~nejhor¹ím pøípadì zpùsobit zkopírování v¹ech
402 vrcholù a¾ do koøene, ale jednoduchým potenciálovým argumentem lze
403 dokázat, ¾e poèet kopií bude amortizovanì konstantní.
404
405 \bye