]> mj.ucw.cz Git - ads1.git/blob - 2-rozdel/2-rozdel.tex
Pridana druha prednaska, nulta verze.
[ads1.git] / 2-rozdel / 2-rozdel.tex
1 \input ../lecnotes.tex
2
3 \prednaska{2}{Rozdìl a panuj}{(zapsali J. Záloha a P. Ba¹ista)}
4
5 \s{O èem bude dne¹ní pøedná¹ka?} Pøevá¾nì o metodì Rozdìl a panuj (\>{\sl Divide et Impera})
6
7 \noindent
8 Pro porovnávání algoritmù si musíme zavést nìjaké kritérium. Vìt¹inou se zajímáme o èas a pamìt, které spotøebují pro svùj bìh. Proto, abychom v¹ak mohli takto algoritmy porovnávat bez ohledu na prostøedí, stroj a podobné vìci, zavádíme takzvanou $O$ notaci.
9
10 \s{Definice:} Pøedpokládejme, ¾e funkce, které porovnávame jsou dle následujícího pøedpisu:
11
12 $f:{N} \rightarrow {R}^{+}$
13
14 \noindent
15 Potom øekneme, ¾e$ f(n) $ je $ O(g(n))$ právì tehdy kdy¾ existuje nìjaké $c>0: \forall ^{*} n \in {N}: f(n) \leq c.g(n)$
16
17 \>{\sl Poznámka:} $ \forall ^{*} n$ znamená $\exists n_{0}: \forall n \geq n_{0} :$. Nebo je¹tì jinak: výrok platí pro v¹echna $n$ a¾ na koneèný poèet vyjímek. Tato definice tedy øíká, ¾e funkci $f(n)$ je mo¾né ohranièit shora nìjakým reálným násobkem funkce $g(n)$ pro $\forall n \in N$. Èasto zapisujeme $f(n)=O(g(n))$ - jedná se o za¾itou vìc, ale uvìdomme si v¹ak, ¾e tento zápis neoznaèuje rovnost! (proto¾e platí napøíklad $\log{n}=O(n)$ ale neplatí $n=O(\log{n})$ To znamená, ¾e neplatí symetrie, odtud vyplývá, ¾e nemù¾e jít o rovnost). Ale: "Je to èuòaèina." Formálnì jde o nìjakou mno¾inu nebo tøídu funkcí $f(n)$, pro které platí, ¾e se dají shora ohranièit kladným reálným násobkem funkce $g(n)$. A potom pí¹eme $f \in O(g)$.
18
19 napøíklad:
20
21 $$
22 2,5n^{2} \dots O(n^{2})
23 $$
24 $$
25 2,5n^{2}+30n \dots O(n^{2})
26 $$
27
28 Platí:
29
30 $$
31 O(f)+O(g)=O(f+g)
32 $$
33
34 proto¾e:
35
36 $$
37 f^{\prime} \leq c.f
38 $$
39 $$
40 g^{\prime} \leq d.g
41 $$
42 $$
43 f^{\prime} + g^{\prime} \leq c.f+d.g \leq (c+d).(f+g)
44 $$
45
46 \noindent
47 A zde vidíme, ¾e $(c+d)$ se schová do $O$. Naprosto stejnì se doká¾e odobný vztah také pro násobení:
48
49 $$
50 O(f).O(g)=O(f.g)
51 $$
52
53 Rovnì¾ platí:
54
55 $$
56 O(f+g)=O(max(f,g))
57 $$
58
59 \noindent
60 nebot libovolný $n$-násobek funkce s exponentem $k$ je v¾dy asymmptoticky men¹í ne¾ $n$ násobek funkce s exponentem $l>k$.
61 To nám umo¾nuje zanedbávat pomaleji rostoucí èleny:
62
63 $$
64 O(n^{2})+O(n)=O(n^{2}+n)=O(n^{2})
65 $$
66
67 \noindent
68 $O$ notace v¹ak popisuje nejhor¹í pøípad. U nìkterých algoritmù nejhor¹í, nejlep¹í a tudí¾ i prùmìrný pøípad splývají. Je ale mnoho algoritmù, které se v tìchto parametrech diametrálnì li¹í, proto zavádíme dal¹í notace.
69
70
71 \s{Definice:}
72
73 \itemize\ibull
74 \:$f(n)$ je $\Omega(g(n)) \Longleftrightarrow \exists c>0: \forall ^{*} n \in {N}: f(n) \geq c.g(n)$
75 $\Omega$ notace øíká, ¾e algoritmus se v¾dy chová stejnì èi lépe ne¾ nìjaký $c$-násobek funkce $g$.
76 \:$f(n)$ je $\Theta(g(n)) \Longleftrightarrow f(n)$ je $O(g(n)) \wedge f(n) $ je $ \Omega(g(n))$
77
78 nebo:
79
80 $f(n)$ je $\Theta(g(n)) \Longleftrightarrow \exists c_{1},c_{2}: c_{1}.g(n) \leq f(n) \leq c_{2}.g(n)$
81 existují-li nezáporné konstanty $c_{1},c_{2}$ takové, ¾e se funkce $f(n)$ dá ohranicit $c_{1}$ a $c_{2}$ násobky funkce $g(n)$
82 \endlist
83
84 \noindent
85 $\Theta$ notace tedy vyjadøuje, ¾e nejlep¹í a nejhor¹í pøípad chování algoritmu jsou stejné tøídy, li¹í se nanejvý¹ multiplikativní konstantou.
86
87 \s{Porovnání rùstu funkcí:} (aneb jak moc máme algoritmy rádi podle jejich chování od nejlep¹ích k nejhor¹ím)
88
89 \itemize\ibull
90 \: $\Theta(1) \ldots$ funkce zespoda i shora ohranièené konstantami
91 \: $\Theta(\log{( \log{n} )})$
92 \: $\Theta(\log{n})$
93 \: $\Theta(n^{\varepsilon}), \varepsilon \in (0,1)$
94 \: $\Theta(n)$
95 \: $\Theta(n^{2})$
96
97 $\vdots$
98
99 \: $\Theta(n^{k}), k \in {N}$
100
101 $\vdots$
102
103 \: $\Theta(2^{n})$
104 \: $\Theta(3^{n})$
105
106 $\vdots$
107
108 \: $\Theta(k^{n}), k \in {R}^{+}, k > 1$
109
110 $\vdots$
111
112 \: $\Theta(n!)$
113
114 $\vdots$
115
116 \: $\Theta(n^{n})$
117 \endlist
118
119 \>{\sl Poznámka:} Pøi logaritmech a odhadech slo¾itosti se dá v¾dy hovoøit o logaritmu s libovolným základem, proto¾e platí:
120 $$
121 \log_k{n}={{\log_c{n}}\over{\log_c{k}}}={{1}\over{\log_c{k}}}.\log_c{n}
122 $$
123 kde ${1}\over{\log_c{k}}$ je jen konstanta, tak¾e ji mù¾eme zanedbat.
124
125 \>{\sl Pøíklady:}
126
127 \s{Eukleidùv algoritmus:} Pokd jej pustím na 2 èísla o $n$ bitech, potom poèet iterací bude $O(n)$, ka¾dá iterace trvá $O(n^{2})$ krokù. Tak¾e celkovì má tento algoritmus èasovou slo¾itost: $O(n^{3})$
128
129 \s{Rozdìl a panuj:} A nyní pøestaòme chodit okolo horké ka¹e a øekòeme si, co to ono vý¹e zmiòované ``rozdìl a panuj'' znamená. Mìjme nìjaký problém, který má tu vlastnost, ¾e kdy¾ jej rozdìlím na nìjaké podproblémy, které mají stejný charakter a ty  vyøe¹ím, tak slo¾ením jejich øe¹ení získám øe¹ení pùvodního problému. Ten po¾adavek na stejný charakter je podstatný, nebot nám umo¾ní se podívat na tyto podproblémy pod stejným úhlem a opìt je rozdìlit na ``podpodproblémy'' a tak dále, a¾ se dostanu na úroveò, kterou je mo¾né vyøe¹it triviálnì, popøípadì jiným ménì nároèným zpùsobem, teï je provedeno rozdìlení. Po jejich vyøe¹ení se zaènu vynoøovat z logické rekurze a na jednotlivých hladinách skládám øe¹ení, a¾ se octnu na hladinì pùvodního problému, tu slo¾ím a u¾ mohu panovat.
130
131 \s{Odboèka:} \>{\sl (Mergesort)} Pøi prùbìhu algoritmu mergesort nejprve rozdìlujeme vstup na dvì ``stejnì'' (v hor¹ím pøípadì a¾ na jednotku) velká pole. To nám zabere na ka¾dé hladinì konstantní práci: 
132 $T(1) \dots O(1)$. 
133
134 \noindent
135 Kdy¾ se v¹ak vynoøujeme z logické rekurze, musíme na ka¾dé hladinì strávit linárnì èasu sluèováním: 
136 $T(n)=2.T({{n}\over{2}})+O(n)$
137
138 \s{Strom volání: }
139
140 \figure{figure1.eps}{Strom volání}{2in}
141
142 \noindent
143 Souèet práce pøes jednu hladinu stromu je $O(n)$. A jedodu¹e odvodíme, ¾e celkový poèet hladin je $O(\log{n})$, tudí¾ jsme si ukázali slo¾itost $O(n\log(n))$.
144
145 \s{Rychlej¹í algoritmus pro násobení:} \>{\sl (rychlej¹í ne¾ $O(n^{2})$)} Pokud násobíme dvì èísla zpùsobem, který nás uèili na základní ¹kole, dostaneme se na èasovou slo¾itost $O(n^2)$. Proto¾e se jedná o dost èastou operaci, zamyslíme se, jestli by ne¹la zjednodu¹it. Nasmìrujme na¹e úvahy na postup ``rozdìl a panuj''. Rozdìlíme ka¾dého èinitele na dvì stejnì dlouhé èásti a pro jednoduchost pøedpokládejme, ¾e dìlení probìhne v¾dy bez zbytku:
146
147 $$
148 X=A.10^{{n}\over{2}}+B
149 $$
150 $$
151 Y=C.10^{{n}\over{2}}+D
152 $$
153
154 \noindent
155 Potom získáme výsledek pùvodního výrazu jako:
156
157 \noindent
158 $X.Y=(A.10^{{n}\over{2}}+B).(C.10^{{n}\over{2}}+D)=A.C.10^{n}+A.D.10^{{n}\over{2}}+B.C.10^{{n}\over{2}}+B.D=A.C.10^{n}+(A.D+B.C).10^{{n}\over{2}}+B.D$
159
160 \noindent
161 Nyní, jak vidíme, staèí spoèítat souèin ètyø ${n}\over{2}$ ciferných císel. Spoèítejme, jak se tím zmìní celková èasová slo¾itost:
162
163 \noindent
164 $T(n)=4.T({{n}\over{2}})+O(n)=4.T({{n}\over{2}})+c.n=4.(4.T({{n}\over{4}})+c.{{n}\over{2}})+c.n=4^{2}.T({{n}\over{4}})+2.c.n+c.n=4^{2}.T({{n}\over{4}})+3.c.n=4^{2}.(4.T({{n}\over{8}})+c.{{n}\over{4}})+3.c.n=4^{3}.T({{n}\over{8}})+4.c.n+3.c.n=4^{3}.T({{n}\over{8}})+7.c.n=\ldots$
165
166 \noindent
167 takto bychom mohli pokraèovat dále, a¾ bychom se dostali na:
168
169 $$
170 T(n)=4^{4}.T({{n}\over{16}})+15.c.n
171 $$
172 $$
173 T(n)=4^{5}.T({{n}\over{32}})+31.c.n
174 $$
175 $$
176 \vdots
177 $$
178 Odtud mù¾eme vypozorovat, ¾e se vztah pro $T(n)$ vyvíjí zøejmì podle vzorce:
179 $$
180 T(n)=4^{k}.T({{n}\over{2^{k}}})+2^{k-1}.c.n+2^{k-2}.c.n+2^{k-3}.c.n+2^{k-4}.c.n+\ldots+2^{0}.c.n
181 $$
182 $$
183 T(n)=4^{k}.T({{n}\over{2^{k}}})+(2^{k}-1).c.n
184 $$
185 kde k je poèet vìtvení a n je velikost úlohy. Kdy¾ uvá¾íme, ¾e se strom volaní v¾dy vìtví pravidelnì na dva podstromy, tak platí: $k \approx \log{n}$. Kdy¾ dosadíme:
186 $$
187 T(n)=4^{\log{n}}.T({{n}\over{2^{\log{n}}}})+(2^{\log{n}}-1).c.n
188 $$
189 $$
190 T(n)=2^{\log{n}}.2^{\log{n}}.T({{n}\over{2^{\log{n}}}})+(2^{\log{n}}-1).c.n
191 $$
192 $$
193 T(n)=n.n.T({{n}\over{n}})+(n-1).c.n
194 $$
195 $$
196 T(n)=n^{2}.T(1)+(n-1).n.c
197 $$
198 $$
199 T(n) \doteq n^{2}.(T(1)+c)
200 $$
201 Pokud $T(1)$ a $c$ jsou konstanty, mù¾eme psát: $T(n)$ je $O(n^{2})$. Tak¾e jsme si pøíli¹ nepomohli, proto¾e i klasický algoritmus na násobení má kvadratickou èasovou slo¾itost. Podívejme se v¹ak, jako vypadá tabulka vìtvení pro daný algoritmus:
202
203 \medskip
204
205 \vbox{\halign{# \quad \vrule \quad & # \quad \vrule \quad & #\cr
206 poèet vìtvení & poèet úloh & velikost podúlohy\cr
207 \noalign{\medskip\hrule\bigskip}
208 0 & $4^{0}$ & ${n}\over{2^{0}}$\cr
209 1 & $4^{1}$ & ${n}\over{2^{1}}$\cr
210 2& $4^{2}$ & ${n}\over{2^{2}}$\cr
211 3 & $4^{3}$ & ${n}\over{2^{3}}$\cr
212 \vdots & \vdots & \vdots\cr
213 k & $4^{k}$ & ${n}\over{2^{k}}$\cr}}
214
215 \medskip
216
217 \noindent
218 Naskýtá se otázka, jestli bychom nemohli, kdy¾ se pozornì zamyslíme, èasovou nároènost zlep¹it. Existuje nìkolik mo¾ností:
219 - zlep¹it èlen $O(n) \ldots c.n$, to znamená zlep¹it èas spojování podúloh $\rightarrow$ to v¹ak rychleji nejde (pokud ètenáø nevìøí, mù¾e si dokázat)
220 - sní¾it poèet vìtvení $\rightarrow$ nech» se algoritmus nevìtví na $4$ vìtve, ale na ménì. To, ale jak dále uvidíme u¾ mo¾né je\vdots Staèí si uvìdomit, ¾e vlastnì potøebujeme spoèítat:
221 $$
222 X.Y=A.C.10^{n}+(A.D+B.C).10^{{n}\over{2}}+B.D
223 $$
224 Pøièem¾ ale nepotøebujeme znát souèiny $A.D$ ani $B.C$ samostatnì, nebo» nám staèí zjistit èlen $A.D+B.C$. Jako kdybychom poèítali $A.C$, $B.D$ a potom $(A+B).(C+D)=A.C+A.D+B.C+B.D$, tak odèítáním $(A.D+B.C)$ od $A.C+A.D+B.C+B.D$ dostaneme hledaný prostøední èlen: $A.D+B.C$, který potøebujeme, abychom spoèetli $X.Y$. Nyní nám ji¾ staèí jen tøi násobení, jedno sèítání a jedno odèítání navíc.Otázka je, zda-li to bude výhodné. Sèítání i odèítání nám zaberou nanejvý¹e lineární èas, tak¾e to skuteènì je výhodná úprava. Jak se tím zmìní výsledný èas? Podívejme se opìt na tabulku vìtvení:
225
226 \medskip
227
228 \vbox{\halign{# \quad \vrule \quad & # \quad \vrule \quad & #\cr
229 poèet vìtvení & poèet úloh & velikost podúlohy\cr
230 \noalign{\medskip\hrule\bigskip}
231 0 & $3^{0}$ & ${n}\over{2^{0}}$\cr
232 1 & $3^{1}$ & ${n}\over{2^{1}}$\cr
233 2& $3^{2}$ & ${n}\over{2^{2}}$\cr
234 3 & $3^{3}$ & ${n}\over{2^{3}}$\cr
235 \vdots & \vdots & \vdots\cr
236 k & $3^{k}$ & ${n}\over{2^{k}}$\cr}}
237
238 \medskip
239
240 \noindent
241 Spoèítejme si práci,která se musí udìlat na jedné hladinì. Pøedpokládejme, ¾e $k \approx \log{n}$. Dostávame:
242 $$\sum_{k=0}^{n}3^{k}.{{n}\over{2^{k}}}=\sum_{k=0}^{n} \left( {{3}\over{2}} \right) ^{k}.n=n.\sum_{k=0}^{n} \left( {{3}\over{2}} \right) ^{k}=n.{{ \left( {{3}\over{2}} \right) ^{k+1}-1}\over{{{3}\over{2}}-1}}=
243 $$
244 $$
245 =n{{ \left( {3}\over{2} \right) ^{\log{n}+1}-1}\over{{{1}\over{2}}}}=2.n. \left[ \left( {{3}\over{2}} \right) ^{\log{n}+1}-1 \right] \approx O \left( n. \left( {{3}\over{2}} \right) ^{\log{n}} \right) =
246 $$
247 $$
248 =O \left( n.{{3^{\log{n}}}\over{2^{\log{n}}}} \right)=O \left( n.{{3^{\log{n}}}\over{n}} \right)=O \left( 3^{\log_2{n}} \right)=O \left( (2^{\log_2{3}})^{\log_2{n}} \right)=
249 $$
250 $$
251 =O \left( 2^{\log_2{n}.\log_2{3}} \right)=O \left( (2^{\log_2{n}})^{\log_2{3}} \right)=O \left( n^{\log_2{3}} \right) \doteq O \left( n^{1,585} \right)
252 $$
253 Z toho vyplývá, ¾e jsme na¹li algoritmus s èasovou slo¾itostí men¹í ne¾ $O(n^{2})$. "Rozumné" implementace tohoto algoritmu jsou v¹ak trochu modifikované, a to tak, ¾e se rekuzivnì nevolají a¾ na jednociferná èísla, ale asi na 50 ciferná, a ty u¾ násobí standardním zpùsobem, nebo» re¾ie algoritmu není nulová a takto se dosahuje nejlep¹ích výsledkù.
254
255 \noindent
256 Pro násobení èísel existuje je¹tì efektívnìj¹í algoritmus, který má èasovou slo¾itost $O(n.\log{n})$, av¹ak tento u¾ vyu¾ívá rùzné pokroèilé techniky jako diskrétní Fourierova transformáce a podobnì, tak¾e jej zde nebudeme rozebírat.
257
258 \s{Vìta:} \>{\sl (Master Theorem)}
259
260 \noindent
261 Pokud $T(1)=O(1)$ a $T(n)=a.T(\lceil {{n}\over{b}} \rceil)+O(n^d)$, kde $a \geq 1$, $b>1$ a $d \geq 0$, potom $T(n)$ je:
262 \halign{#&#\cr
263 $O(n^d)$ & kdy¾ $a<b^d$\cr
264 $O(n^d.\log{n})$ & kdy¾ $a=b^d$\cr
265 $O(n^{\log_a{b}})$ & kdy¾ $a>b^d$\cr}
266
267
268 \proof \>{\sl 1. pøípad: }Pøedpokládejme nejdøíve, ¾e $n=b^x, x \in {N}$, aby platilo $\lceil {{n}\over{b}} \rceil = {n}\over{b}$. Uká¾eme si "dùkaz stromem":
269
270 \figure{figure2.eps}{Dùkaz stromem}{4in}
271
272 \noindent
273 Jak vidíme, strom sa v¾dy vìtví na stejný poèet vìtví - oznaème si jejich poèet $a$ a sestavme si tabulku vìtvení:
274
275 \medskip
276
277 \vbox{\halign{# \quad \vrule \quad & # \quad \vrule \quad & #\cr
278 poèet vìtvení & velikost podúlohy & èas potøebný na vyøe¹ení v¹ech podúloh\cr
279 \noalign{\medskip\hrule\bigskip}
280 $1$ & $n$ & $O(n^d)$\cr
281 $a$ & ${n}\over{b^1}$ & $O(({{n}\over{b^1}})^d).a^1$\cr
282 $a^2$ & ${n}\over{b^2}$ & $O(({{n}\over{b^2}})^d).a^2$\cr
283 $a^3$ & ${n}\over{b^3}$ & $O(({{n}\over{b^3}})^d).a^3$\cr
284 \vdots & \vdots & \vdots\cr
285 $a^k$ & ${n}\over{b^k}$ & $O(({{n}\over{b^k}})^d).a^k$\cr}}
286
287 \medskip
288
289 \noindent
290 Zkoumejme èas potøebný na vyøe¹ení v¹ech podúloh na jedné hladinì: 
291 $$
292 O \left(  \left( {{n}\over{b^k}} \right) ^d \right) .a^k=O \left( a^k.n^d \left( {{1}\over{b^k}} \right) ^d \right)=O \left( a^k.n^d \left( {{1}\over{b^d}} \right) ^k \right)=O \left( n^d \left( {{a}\over{b^d}} \right) ^k \right)
293 $$
294 Celkem je tedy èas potøebný na vyøe¹ení v¹ech podúloh na v¹ech hladinách (to znamená celé úlohy):
295 $$
296 T(n)=\sum_{k=0}^{\log_b{n}}O \left( n^d \left( {{a}\over{b^d}} \right) ^k \right)=O \left( n^d \sum_{k=0}^{\log_b{n}} \left( {{a}\over{b^d}} \right) ^k \right)
297 $$
298 V¹imnìme si výrazu ${a}\over{b^d}$. Na jeho hodnotì závisí hodnota výsledné sumy, proto¾e se vlastnì jedná o kvocient geometrické posloupnosti. Proto rozli¹me následující pøípady:
299
300 \>{\I 1} ${a}\over{b^d}<1$ jinými slovy, práce na jednotlivých hladinách exponenciálnì ubývá a souèet sumy se dá omezit nìjakou konstantou, která se schvá do $O$, a tak mù¾eme psát $T(n)=O(n^d)$.
301
302 \>{\I 2} ${a}\over{b^d}=1$ práce na jednotlivých hladinách je stejnì, to znamená, ¾e ¾e souèet sumy je právì $\log(n)$ a to nás opravòuje psát: $T(n)=O(n^d \cdot \log(n))$.
303
304 \>{\I 3} ${a}\over{b^d}>1$ to znamená, ¾e práce na jednotlivých hladinách pøibývá a potom musíme psát:$ T(n)=O(n^d.({{a}\over{b^d}})^{\log_b{n}})$ To sice vypadá jako slo¾itý výraz, ale mù¾eme je dále upravit:
305 $O(n^d.({{a}\over{b^d}})^{\log_b{n}})=O(n^d.a^{\log_b{n}}({{1}\over{b^d}})^{\log_b{n}})=O((b^{\log_b{a}})^{\log_b{n}}.n^d.{{1}\over{(b^d)^{\log_b{n}}}})=O((b^{\log_b{n}})^{\log_b{a}}.n^d.{{1}\over{(b^{\log_b{n}})^d}})=O(n^{\log_b{a}}.n^d.{{1}\over{n^d}})=O(n^{\log_b{a}})$
306
307 \noindent
308 A nyní vidíme, ¾e vìta je správná a zároveò rozdìlení pøípadù je naprosto oprávnìné.
309
310 \>{\sl 2. pøípad: }Vratme se k mo¾nosti $n \neq b^x, x \in {N}$. Potom ale platí: $b^k<n<b^{k+1} \ldots$ v tomto pøípadì zaokrouhleme $n$ a poèítejme s $n'=b^{k+1}$. Pokud platí $b^{k+1}=b.b^k<b.n$, je odtud hned vidìt, ¾e platí $n'<b.n$ a odtud vyplývá, ¾e vstup se nám zvìt¹í pøinejhor¹ím konstanta-krát, co je z asymtotického hlediska, které nás zajímá nejvíce nezajímavé, a tak tuto konstantu "schováme" do $O$ a máme algoritmus stejné slo¾itosti.
311 \qed
312
313 \noindent
314 Porovnejme si nìkteré známé algoritmy a jejich èasovou slo¾itost pomocí \>{\sl Master Theorem}:
315
316 \medskip
317
318 \vbox{\halign{# \quad \vrule \quad & # \quad \vrule \quad & # \quad \vrule \quad & # \quad \vrule \quad & #\cr
319 algoritmus & a & b & d & èasová slo¾itost\cr
320 \noalign{\medskip\hrule\bigskip}
321 Mergesort & 2 & 2 & 1 & $O(n.\log{n})$\cr
322 Násobení I. & 4 & 2 & 1 & $O(n^2)$\cr
323 Násobení II. & 3 & 2 & 1 & $O(n^{\log_2{3}})$\cr
324 Binární vyhledávání & 1 & 2 & 0 & $O(\log{n})$\cr}}
325
326 \medskip
327
328 \s{Domácí úkol nakonec: } Vymyslete algoritmus, který by z $n$ zadaných bodù v rovinì (prostoru) na¹el takové dva, které jsou od sebe nejménì vzdálené (zde existuje takový algoritmus s èasovou slo¾itostí $O(n.\log{n})$).
329
330 \bye