3 \prednaska{6}{Geometrické algoritmy}{}
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í.
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
10 \h{Hledání konvexního obalu}
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.}
16 \figure{7-geom5_rybi_motivace.eps}{Problém ledních mìdvìdù: Jaký je nejmen¹í obvod sítì?}{3in}
18 Neboli v~øeèi matematické, chceme pro zadanou mno¾inu bodù v~rovinì nalézt její konvexní obal.
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$.
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í.}
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ì:
39 \figure{7-geom1_male_obaly.eps}{Konvexní obaly malých mno¾in.}{3in}
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
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.
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
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í.
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.
71 \figure{7-geom2_pridani_bodu.eps}{Pøidání bodu do konvexního obalu.}{4.5in}
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}.
77 \figure{7-geom3_obalky.eps}{Horní a dolní obálka konvexního obalu.}{3.4in}
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¹í.
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$.
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
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$.
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$
125 \figure{7-geom4_determinant.eps}{Jak vypadají determinanty rùzných znamének v~rovinì.}{4.6in}
127 \h{Rychlej¹í algoritmus}
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.
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ý.
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í:
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
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)$.
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}
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
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
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.
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
193 \h{Hledání prùseèíkù úseèek}
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}
200 Zkusíme nejprve Eskymákùm vyøe¹it lokalizaci ledních medvìdù.
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?}
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ì.
208 \centerline{\epsfxsize=1.5in\epsfbox{8-geom2_0_bear.eps}\hskip 4em\epsfxsize2in\epsfbox{8-geom2_1_usecky.eps}}
210 \centerline{Problém Eskymákù: Kde v¹ude se køí¾í medvìdí trasy?}
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.
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.
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
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
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.)
245 Algoritmus pro hledání prùnikù úseèek pak funguje následovnì:
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.
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.
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.
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)$.
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
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é
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)$.
292 \h{Hledání nejbli¾¹ích bodù a Voroného diagramy}
294 Nyní se pokusíme vyøe¹it i problém druhé strany -- pomù¾eme medvìdùm nalézt Eskymáky.
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
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$.
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}
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.
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,\foot{Pøeci jenom i celá Arktida je omezenì velká.} èím¾ dostaneme omezený rovinný graf.
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.
325 Zkusíme nyní odhadnout, jak velký je rovinný graf popisující Voroného diagram. Podle slavné Eulerovy formule má ka¾dý rovinný graf nejvý¹e lineárnì
326 mnoho vrcholù, hran a stìn -- pro $v$ vrcholù, $e$ hran a $f$ stìn je $e \le 3v-6$ a navíc $v+f = e+2$. Tedy slo¾itost diagramu je lineární vzhledem k
327 poètu zadaných bodù $n=f$, $\O(n)$. Navíc Voroného diagram lze zkonstruovat v èase $\O(n \log n)$, napøíklad pomocí zametání roviny nebo metodou
328 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.}
329 místo toho si uká¾eme, jak v ji¾ spoèteném Voroného diagramu rychle hledat nejbli¾¹í body.
331 \h{Lokalizace bodu uvnitø mnohoúhelníkové sítì}
333 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
334 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
335 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
336 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é
337 mnohoúhelníky a vytvoøíme strukturu, která nám umo¾ní rychlé dotazy na jednotlivé body.
339 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
340 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
341 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
342 \log n)$ na dotaz, co¾ je hroznì pomalé.
344 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
345 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,
346 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
347 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
348 koleèkem a nalezený interval v prùøezu je vyta¾ený tuènì.
350 \figure{8-geom2_4_pasy_mnohouhelniku.eps}{Mnohoúhelníky rozøezané na pásy}{2.5in}
352 Kdybychom si ov¹em uchovávali stavy stromu tak, ¾e bychom si pro ka¾dý pás poøídili kopii celého
353 stromu, spotøebovali bychom jenom kopírováním stromù èas i pamì» $\Theta(n^2\log n)$. Místo toho
354 si poøídíme {\I èásteènì persistentní} vyhledávací strom -- ten který si pamatuje historii v¹ech
355 svých zmìn a umí v~ní vyhledávat. Pøesnìji øeèeno, po~ka¾dé operaci, která mìní stav stromu,
356 vznikne nová {\I verze} stromu a operace pro hledání dostanou jako dal¹í parametr identifikátor
357 verze, ve~které mají hledat.\foot{Plnì persistentní struktura by na rozdíl od èásteènì persistentní
358 umìla star¹í verze i upravovat, èím¾ by se historie rozvìtvila. To pro na¹e úèely není potøeba.}
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.
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.
373 \figure{8-geom2_5_upravy_stromu.eps}{Jedna operace mìní pouze okolí cesty -- navì¹ené podstromy se nemìní.}{2in}
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. Rychleji to ani provést nepùjde, nebo» potøebujeme utøídit souøadnice bodù.
379 \s{Lze to lépe?} Na závìr poznamenejme, ¾e se umí provést vý¹e popsaná persistence vyhledávacího stromu v amortizované pamìti $\O(1)$ na zmìnu. Ve
380 struènosti naznaèíme my¹lenku. Pou¾ijeme stromy, které pøi insertu a deletu provádí amortizovanì jenom konstantnì mnoho úprav své struktury. To nám
381 napøíklad zaruèí 2-4 stromy z pøedná¹ky a podobnou vlastnost lze dokázat i o èerveno-èerných stromech. Pøi zmìnì potom nebudeme upravovat celou cestu,
382 ale upravíme jenom jednotlivé vrcholy, kterých se zmìna týká. Ka¾dý vrchol stromu si v sobì bude pamatovat a¾ dvì své verze. Pokud chceme vytvoøit
383 tøetí verzi, vrchol zkopírujeme stranou. To v¹ak mù¾e vyvolat zmìny v jeho rodièích a¾ do koøene. Situace je naznaèena na obrázku. Pøi vytvoøení nové
384 verze $3$ pro vrcholu $v$ vytvoøíme jeho kopii $v'$, do které ulo¾íme tuto verzi. Av¹ak musíme také zmìnit rodièe $u$, kterému vytvoøíme novou verzi
385 ukazující na $v'$. Abychom dosáhli ký¾ené konstantní pamì»ové slo¾itosti, pomù¾e potenciálový argument -- zmìn se provádí amortizovanì jenom
386 konstantnì mnoho. Navíc si pro ka¾dou verzi pamatujeme její koøen, ze kterého máme dotaz spustit.
388 \figure{8-geom2_6_rychla_perzistence.eps}{Vytvoøení nové verze vrcholu.}{2in}