]> mj.ucw.cz Git - ads1.git/blob - 2-rozdel/2-rozdel.tex
Zjednodusil jsem analyzu algoritmu pro nasobeni a ukazal na ni obe
[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 Na~minulé pøedná¹ce jsme si zavedli výpoèetní model a èasovou slo¾itost.
6 Nyní se pustíme do~analýzy slo¾itosti rùzných algoritmù, zejména rekurzivních
7 zalo¾ených na metodì Rozdìl a panuj {\sl (Divide et Impera)}.
8
9 \h{Asymptotická notace}
10
11 Jak u¾ víme, pøi porovnávání algoritmù je obvykle rozhodující asymptotické
12 chování a multiplikativní konstanty mù¾eme zanedbávat (beztak závisí na~konkrétním
13 poèítaèi). Proto si zavedeme takzvanou asymptotickou notaci, která slou¾í
14 pro právì takové porovnávání rùstu funkcí:
15
16 \s{Definice:} Pro funkce $f,g: {\bb N} \rightarrow {\bb R}^+$ øekneme,
17 ¾e $f$ je $\O(g)$ právì tehdy, kdy¾ $\exists c>0: \forall ^{*} n \in {\bb N}: f(n) \leq c \cdot g(n)$.
18 Zde $\forall^* n \in {\bb N}$ je zkratka za \uv{$\exists n_0 \in {\bb N}: \forall n \geq n_0$}, tedy
19 \uv{pro v¹echna~$n$ a¾ na~koneènì mnoho výjimek.}
20
21 \s{Poznámka:} $\O$-notace tedy vyjadøuje, ¾e funkce~$f$ je skoro v¹ude men¹í nebo nejvý¹e rovná
22 nìjakému reálnému násobku funkce~$g$. Aèkoliv zápis vypadá jako rovnost, rozhodnì
23 není symetrický: napøíklad platí $\log n=\O(n)$, ale neplatí $n=\O(\log n)$. Formálnì by bylo lep¹í pova¾ovat $\O(g)$
24 za tøídu funkcí, pro které platí, ¾e se dají shora odhadnout kladným násobkem funkce~$g$, a~psát tedy~$f\in\O(g)$,
25 ale zvyk je bohu¾el ¾elezná ko¹ile.
26
27 \s{Pøíklady:} $2.5n^{2} = \O(n^{2})$, $2.5n^{2}+30n = \O(n^{2})$.
28
29 \>Také platí:
30 $$
31 \O(f)+\O(g) \in \O(f+g),
32 $$
33 èím¾ myslíme, ¾e pokud vezmeme libovolnou $f'=O(f)$ a $g'=O(g)$, bude $f'+g'=O(f+g)$.
34 To platí, jeliko¾ skoro v¹ude je $f' \leq cf$, $g'\leq dg$, a~tedy $f'+g' \le cf+dg \le (c+d)(f+g)$.
35
36 \s{Cvièení:} Uka¾te, ¾e:
37 \itemize\ibull
38 \:$\O(f) \cdot \O(g)=\O(f \cdot g)$,
39 \:$\O(f+g)=\O(\max(f,g))$,
40 \:$\O(n^{2})+\O(n)=\O(n^{2}+n)=\O(n^{2})$.
41 \endlist
42
43 $\O$-notace popisuje horní odhad asymptotického chování funkce. Mnohdy v¹ak
44 potøebujeme také odhandout funkci zespodu (chceme-li øíci, ¾e algoritmus potøebuje
45 {\I alespoò} nìjaké mno¾ství èasu nebo pamìti), pøípadnì z~obou stran:
46
47 \s{Definice:}
48
49 \itemize\ibull
50 \:$f=\Omega(g) \equiv \exists c>0:\forall^* n \in {\bb N}: f(n) \geq c\cdot g(n)$.
51
52 $\Omega$-notace tedy øíká, ¾e hodnota funkce $f$ je v¾dy stejná nebo vy¹¹í ne¾ nìjaký $c$-násobek funkce $g$, a tedy $g=\O(f)$.
53 \:$f=\Theta(g) \equiv f=O(g) \wedge f=\Omega(g)$
54
55 nebo výøeènìji:
56
57 $f=\Theta(g) \equiv \exists$ $c_{1},c_{2} > 0: c_{1}\cdot g(n) \leq f(n) \leq c_{2}\cdot g(n)$ To znamená, ¾e existují nezáporné reálne konstanty $c_{1},c_{2}$ takové, ¾e se funkce $f(n)$ dá ohranièit $c_{1}$- a $c_{2}$-násobkem funkce $g(n)$.
58 \endlist
59
60 \s{Porovnání rùstu funkcí:} (aneb jak moc máme algoritmy rádi podle jejich chování od~nejlep¹ích k~nejhor¹ím)
61
62 \itemize\ibull
63 \:$\Theta(1) \ldots$ funkce zespoda i shora ohranièené konstantami
64 \:$\Theta(\log{( \log{n} )})$
65 \:$\Theta(\log{n})$ \dots\ logaritmická
66 \:$\Theta(n^{\varepsilon}), \varepsilon \in (0,1)$ \dots\ sublineární
67 \:$\Theta(n)$ \dots\ lineární
68 \:$\Theta(n^{2})$ \dots\ kvadratická
69 \:$\Theta(n^{k})$ \dots\ polynomiální
70 \:$\Theta(2^{n})$ \dots\ exponenciální pøi základu $2$
71 \:$\Theta(3^{n})$ \dots\ exponenciální pøi základu $3$
72 \:$\Theta(k^{n})$ \dots\  exponenciální pøi základu $k>1$
73 \:$\Theta(n!)$ \dots\ faktoriálová
74 \:$\Theta(n^{n})$
75 \:\dots\ nekoneènì mnoho dal¹ích tøíd (i mezi tìmi vý¹e uvedenými)
76 \endlist
77
78 \>{\sl Poznámka:} Pokud se v~odhadu slo¾itosti vyskytne logaritmus (jinde ne¾
79 v~exponentu), nezále¾í na tom, jaký má základ, proto¾e platí:
80 $$
81 \log_k{n}={{\log_c{n}}\over{\log_c{k}}}={{1}\over{\log_c{k}}}\cdot \log_c{n},
82 $$
83 kde $1/\log_c{k}$ je jen konstanta, tak¾e ji mù¾eme \uv{schovat do~$\O$.}
84
85 \s{Pøíklad:} Eukleidùv algoritmus:
86 Pokud jej pustíme na $2$ èísla o $n$ bitech, poèet iterací bude $\O(n)$, ka¾dá
87 iterace trvá $\O(n^{2})$ krokù. Tak¾e celkovì má tento algoritmus èasovou
88 slo¾itost $\O(n^{3})$.
89
90 \h{Metoda Rozdìl a panuj}
91
92 Nyní pøestaòme chodit kolem horké ka¹e a øekòeme si, co to ono vý¹e zmiòované
93 \uv {rozdìl a panuj} znamená. Mìjme nìjaký problém, který má tu vlastnost, ¾e
94 kdy¾ jej rozdìlíme na nìjaké podproblémy, které mají stejný charakter, a ty
95 vyøe¹íme, slo¾ením jejich øe¹ení mù¾eme získat øe¹ení pùvodního problému.
96 Algoritmus tedy bude rekurzivnì volat sám sebe, ne¾ se dostane k~podproblému
97 nìjaké konstantní velikosti, který u¾ umí vyøe¹it triviálnì, a pak se zaène
98 z~rekurze vracet a skládat jednotlivá dílèí øe¹ení.
99
100 \s{Pøíklad 1 -- MergeSort:} Algoritmus {\I MergeSort} pro tøídìní posloupnosti vypadá takto:
101 vstup rozdìlíme na~dvì (skoro) stejné èásti, ty rekurzivním voláním setøídíme,
102 a~nakonec výsledné dvì posloupnosti slijeme do~jedné. Rozdìlování a slévání nám
103 trvá lineárnì dlouho, tak¾e pro èasovou slo¾itost MergeSortu platí tato
104 rekurentní rovnice: $$T(n)=2 \cdot T({{n}/{2}})+\O(n).$$ Jak ji vyøe¹íme? Tøeba
105 tak, ¾e si pøedstavíme strom rekurzivních volání. Ka¾dý vrchol má dva syny
106 (dìlíme vstup na~dvì èásti), v~nich¾ jsou vstupy polovièní velikosti. V~ka¾dém
107 vrcholu trávíme èas lineární s~velikostí jeho vstupu, souèet velikostí vstupù
108 pøes ka¾dou hladinu je~$n$ a hloubka stromu musí být $\O(\log n)$. Vyjde nám
109 tedy, ¾e $T(n)=\O(n\log n)$.
110
111 \s{Pøiklad 2 -- násobení èísel:} Pokud násobíme dvì èísla $X$ a $Y$ zpùsobem,
112 který nás uèili na základní ¹kole, dostaneme se na èasovou slo¾itost $\Theta(n^2)$.
113 Proto¾e se jedná o~dost èastou operaci, zamysleme se, jestli by ne¹la zrychlit.
114 Nasmìrujme na¹e úvahy na postup \uv{rozdìl a panuj}. Rozdìlíme ka¾dého èinitele
115 na dvì stejnì dlouhé èásti a pro jednoduchost pøedpokládejme, ¾e toto
116 roz¹tìpení èinitele probìhne v¾dy bez zbytku:
117 $$
118 X=A \cdot 10^{{n}/2}+B, \qquad Y=C \cdot10^{{n}/{2}}+D.
119 $$
120 Zde $A, B, C, D$ jsou u¾ jen $n/2$-ciferná èísla. Pùvodní souèin získáme jako:
121 $$
122 XY=(A\cdot 10^{{n}/{2}}+B) (C\cdot 10^{{n}/{2}}+D)=AC \cdot 10^{n}+(AD+BC)\cdot 10^{{n}/{2}}+BD.
123 $$
124 Nyní, jak vidíme, staèí spoèítat souèin ètyø $n/2$-ciferných èísel. Uva¾me,
125 jakou bude mít tento algoritmus èasovou slo¾itost:
126 $$T(n) = 4T(n/2)+\Theta(n).$$
127 Jak takovou rekurenci vyøe¹íme?
128
129 \>{\sl 1. zpùsob: Øe¹ení pomocí rozepisování:}
130 $$\eqalign{
131 T(n)&=   4T(n/2)+\Theta(n) = \cr
132     &= 4T(n/2)+cn = \cr
133     &= 4\cdot (4T(n/4)+cn/2)+cn = 4^2T(n/4)+2cn+cn = 4^2T(n/4)+3cn = \cr
134     &= 4^2\cdot (2T(n/8)+cn/4)+3cn = 4^3T(n/8)+4cn+3cn = 4^3T(n/8)+7cn = \cr
135     &\ldots\cr
136 }$$
137 Odtud snadno vypozorujeme, ¾e jednotlivé vztahy se vyvíjí podle vzorce
138 $T(n)=4^kT(n/2^k) + (2^k-1)cn.$ Pro $k=\lceil\log_2 n\rceil$ je ov¹em
139 $2^k\le 1$, tak¾e $T(n/2^k)=\Theta(1)$ a dostaneme (horní celou èást zanedbáme,
140 ta ovlivní jen konstanty):
141 $$
142 T(n) = 4^{\log_2 n}\Theta(1) + (2^{\log_2 n}-1)cn = n^2\Theta(1) + (n-1)cn = \Theta(n^2).
143 $$
144
145 \>{\sl 2. zpùsob: Úvaha o~stromu:} Nakreslíme si strom rekurzivních volání
146 na¹eho algoritmu:
147 \fig{figure.eps}{4in}
148 Na~$i$-té hladinì stromu máme $4^i$ vrcholù, v~nich jsou vstupy velikosti
149 $n/2^i$, tak¾e na~celé hladinì trávíme èas celkem $\Theta(4^i\cdot n/2^i)
150 = \Theta(2^in)$. Velikosti vstupù klesají exponenciálnì, tak¾e celý strom
151 je hluboký $k=\log_2 n$ (opìt si dovolíme zapomenout na~horní celou èást).
152 Celkem tedy trávíme èas $\sum_{i=0}^k \Theta(2^in) = \Theta(n\cdot\sum_{i=0}^k 2^i) = \Theta(n^2)$.
153
154 Oba zpùsoby analýzy se tedy shodují, ¾e ná¹ algoritmus má kvadratickou èasovou
155 slo¾itost a ¾e jsme si oproti klasickému algoritmu nikterak nepomohli.
156 Podívejme se je¹tì jednou na~to, jak se ná¹ algoritmus vìtví:
157 $$\vbox{\halign{\hfil#\hfil \quad & \hfil#\hfil \quad &\hfil#\hfil\cr
158 hloubka & poèet úloh & velikost podúlohy\cr
159 \noalign{\smallskip\hrule\medskip}
160 0 & $4^{0}$ & ${n}/{2^{0}}$\cr
161 1 & $4^{1}$ & ${n}/{2^{1}}$\cr
162 2 & $4^{2}$ & ${n}/{2^{2}}$\cr
163 3 & $4^{3}$ & ${n}/{2^{3}}$\cr
164 \vdots & \vdots & \vdots\cr
165 $k$ & $4^{k}$ & ${n}/{2^{k}}$\cr}}$$
166 Naskýtá se otázka, jestli bychom nemohli èasovou slo¾itost zlep¹it. Toho bychom
167 mohli dosáhnout buïto zlep¹ením èlenu $cn$ v~na¹í rekurenci, èili zefektivnìním
168 spojování podúloh. To ov¹em není pøíli¹ nadìjné (pokud ètenáø nevìøí, mù¾e si to dokázat),
169 tak¾e místo toho vyu¾ijeme druhou ¹anci, a~to omezení vìtvení ze~ètyø vìtví na~tøi.
170 Pøipomeòme si, ¾e potøebujeme spoèítat:
171 $$
172 XY=AC\cdot 10^{n}+(AD+BC)\cdot 10^{n/2}+BD.
173 $$
174 Pøitom ale nepotøebujeme znát souèiny $AD$ ani $BC$ samostatnì, nebo» nám staèí
175 zjistit celý èlen $AD+BC$. Kdybychom poèítali $AC$, $BD$
176 a potom $(A+B)(C+D)=AC+AD+BC+BD$, tak odèítáním $(AC+BD)$ od $AC+AD+BC+BD$ dostaneme
177 hledaný prostøední èlen $AD+BC$. Nyní nám ji¾ staèí jen tøi
178 násobení, ale potøebujeme tøi sèítání a jedno odèítání navíc.
179 Uká¾eme, ¾e tato komplikace je zanedbatelná oproti práci u¹etøené
180 men¹ím vìtvením. Podívejme se opìt na~tabulku:
181 $$\vbox{\halign{\hfil#\hfil \quad & \hfil#\hfil \quad &\hfil#\hfil\cr
182 hloubka & poèet úloh & velikost podúlohy\cr
183 \noalign{\smallskip\hrule\medskip}
184 0 & $3^{0}$ & ${n}/{2^{0}}$\cr
185 1 & $3^{1}$ & ${n}/{2^{1}}$\cr
186 2& $3^{2}$ & ${n}/{2^{2}}$\cr
187 3 & $3^{3}$ & ${n}/{2^{3}}$\cr
188 \vdots & \vdots & \vdots\cr
189 $k$ & $3^{k}$ & ${n}/{2^{k}}$\cr}}$$
190 Opìt uva¾me, kolik práce spotøebujeme v~souètu pøes v¹echny hladiny (hloubka stromu
191 $k$ je opìt $\lceil\log_2 n\rceil$ a horní celou èást zanedbáme):
192 $$\sum_{i=0}^{k}3^{i}\cdot {{n}\over{2^{i}}}=\sum_{i=0}^{k} \left( {{3}\over{2}} \right) ^{i}\cdot n=n\cdot \sum_{i=0}^{k} \left( {{3}\over{2}} \right) ^{i}=n\cdot {{ \left( {{3}\over{2}} \right) ^{k+1}-1}\over{{{3}\over{2}}-1}}=
193 $$
194 $$
195 =n\cdot {{ \left( {3}\over{2} \right) ^{k+1}-1}\over{{{1}\over{2}}}}=2\cdot n\cdot  \left[ \left( {{3}\over{2}} \right) ^{k+1}-1 \right] = \O \left( n\cdot  \left( {{3}\over{2}} \right) ^{\log_2{n}} \right) =
196 $$
197 $$
198 =\O \left( n\cdot {{3^{\log_2{n}}}\over{2^{\log_2{n}}}} \right)=\O \left( n\cdot {{3^{\log_2{n}}}\over{n}} \right)=\O \left( 3^{\log_2{n}} \right)=\O \left( (2^{\log_2{3}})^{\log_2{n}} \right)=
199 $$
200 $$
201 =\O \left( 2^{(\log_2{n}) \cdot \log_2{3}} \right)=\O \left( (2^{\log_2{n}})^{\log_2{3}} \right)=\O \left( n^{\log_2{3}} \right) =\O \left( n^{1.585} \right).
202 $$
203 Upravený algoritmus u¾ tedy má lep¹í èasovou slo¾itost, konkrétnì $\O(n^{1.585})$.
204 V~praxi bychom samozøejmì pro èinitele ne¹tìpili a¾ na jednociferná èísla,
205 ale zastavili se u~nìjaké dostateènì malé délky (øeknìme 50~cifer) a tam
206 pøepnuli na~kvadratický algoritmus, který má men¹í re¾ii.
207
208 (Mimochodem, pro násobení èísel existuje je¹tì efektívnìj¹í algoritmus, který
209 dosahuje èasové slo¾itosti $\O(n \log{n})$, av¹ak na~to u¾ jsou potøeba trochu
210 pokroèilej¹í techniky, jako je diskrétní Fourierova transformace, tak¾e
211 si jej necháme na~pøí¹tí semestr.)
212
213 \h{Master Theorem}
214
215 Metody øe¹ení rekurentních rovnic pro slo¾itosti rozdìlovacích a panovacích algoritmù
216 by asi fungovaly i na~jiné algoritmy ne¾ jen na¹e dva pøíklady, ale proè se poka¾dé
217 moøit upravováním výrazù? Radìji si doká¾eme obecnou vìtu, která pùjde na~vìt¹inu
218 takových rekurencí nasadit. Øíká se jí Master Theorem nebo také (vzhledem k~tomu,
219 jak se pou¾ívá) Kuchaøková vìta.
220
221 \s{Vìta:} \>{\sl (Master Theorem)} Pøedpokládejme, ¾e $T(1)=\O(1)$ a $T(n)=a\cdot T(\lceil {{n}\over{b}} \rceil)+\O(n^d)$, kde $a \geq 1$, $b>1$ a $d \geq 0$. Potom $T(n)$ je:
222
223 \smallskip
224
225 \halign{#&#&#\cr
226 \indent & $\O(n^d)$ & kdy¾ $a<b^d$,\cr
227 & $\O(n^d\cdot \log{n})$ & kdy¾ $a=b^d$,\cr
228 & $\O(n^{\log_b{a}})$ & kdy¾ $a>b^d$.\cr}
229
230 \proof Pøedpokládejme nejdøíve, ¾e $n=b^m, m \in \bb{N}$, aby platilo $\lceil
231 {{n}\over{b}} \rceil = {{n}\over{b}}$. Pou¾ijeme opìt \uv{dùkaz stromem}.
232 Strom rekurzivních volání se v¾dy vìtví na stejný poèet vìtví, konkrétnì~$a$,
233 a~velikosti vstupù klesají $b$-krát. Podívejme se na~tabulku:
234 $$\vbox{\halign{\hfil#\hfil \quad & \hfil#\hfil \quad & \hfil#\hfil & \hfil#\hfil \cr
235 hloubka & poèet podúloh & velikost podúlohy & èas na hladinì \cr
236 \noalign{\medskip\hrule\medskip}
237 0 & $1$ & $n$ & $\O(n^d)$\cr
238 1 & $a$ & $n/{b^1}$ & ${\O(({n/{b^1}})^d) \cdot a^1}$\cr
239 2 & $a^2$ & $n/{b^2}$ & ${\O(({n/{b^2}})^d) \cdot a^2}$\cr
240 3 & $a^3$ & $n/{b^3}$ & ${\O(({n/{b^3}})^d) \cdot a^3}$\cr
241 \vdots & \vdots & \vdots\cr
242 $k$ & $a^k$ & $n/{b^k}$ & ${\O(({n/{b^k}})^d) \cdot a^k}$\cr}}$$
243
244 \noindent
245 Zkoumejme èas potøebný na vyøe¹ení v¹ech podúloh na jedné hladinì: 
246 $$
247 \O \left(  \left( {{n}\over{b^k}} \right) ^d \right) \cdot a^k=\O \left( a^k\cdot n^d \left( {{1}\over{b^k}} \right) ^d \right)=\O \left( a^k \cdot n^d \left( {{1}\over{b^d}} \right) ^k \right)=\O \left( n^d \left( {{a}\over{b^d}} \right) ^k \right).
248 $$
249 Celkem je tedy èas potøebný na vyøe¹ení v¹ech podúloh na v¹ech hladinách (to
250 znamená celé úlohy):
251 $$
252 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)
253 $$
254 V¹imnìme si èlenu ${a}\over{b^d}$. Na jeho hodnotì závisí hodnota výsledné sumy, proto¾e se vlastnì jedná o kvocient geometrické øady. Proto rozli¹me následující pøípady:
255
256 \>{\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, i kdyby
257 byla nekoneèná, se dá omezit nìjakou konstantou, která se schová do $\O$, a tak je $T(n)=\O(n^d)$.
258
259 \>{\I 2.} ${{a}\over{b^d}}=1$ -- práce na jednotlivých hladinách je stejnì, to znamená, ¾e souèet sumy je právì $\log_b n$, a tedy $T(n) = \O(n^d \cdot \log_b(n))$.
260
261 \>{\I 3.} ${{a}\over{b^d}}>1$ -- to znamená, ¾e práce na jednotlivých hladinách
262 pøibývá, tak¾e musíme geometrickou øadu seèíst poctivì: $T(n) = \O(n^d \cdot
263 ({{a}\over{b^d}})^{\log_b{n}})$. Tento výraz vypadá ponìkud o¹klivì,
264 ale je¹tì ho trochu (alespoò kosmeticky) upravíme:
265 $$
266 \O\left(n^d \cdot \left({{a}\over{b^d}}\right)^{\log_b{n}}\right)=\O\left({ a^{\log_b{n}} \cdot n^d \over (b^d)^{\log_b{n}}}\right)=\O\left({\left(b^{\log_b{a}}\right)^{\log_b{n}} \cdot n^d \over{\left(b^d\right)^{\log_b{n}}}}\right)=
267 $$
268 $$
269 =\O\left({\left(b^{\log_b{n}}\right)^{\log_b{a}} \cdot n^d \over{\left(b^{\log_b{n}}\right)^d}}\right)
270 =\O\left({n^{\log_b{a}} \cdot n^d \over{n^d}}\right)
271 =\O\left(n^{\log_b{a}}\right).
272 $$
273 Tyto tøi pøípady pøesnì odpovídají rozdìlení pøípadu v~tvrzení vìty.
274
275 Vra»me se nyní k~mo¾nosti, kdy $n$ není mocnina~$b$.
276 Tehdy platí $b^l<n<b^{l+1}$ pro nìjaké $l \in \bb{N}$. V tomto pøípadì
277 zaokrouhleme $n$ a~poèítejme s $n^{\prime}=b^{l+1} < bn$. Jeliko¾ funkce
278 $T(n)$ je neklesající, dostaneme $T(n)\le T(n')$ a ve~v¹ech tøech pøípadech
279 je výsledek pro~$n'$ maximálnì konstanta-krát vìt¹í ne¾ pro~$n$, co¾ se
280 \uv{schová do~$\O$.} Vìta tedy platí i v~tomto pøípadì.
281 \qed
282
283 \s{Pøíklad:}
284 Porovnejme si nìkteré známé algoritmy a jejich èasovou slo¾itost pomocí \>{\sl Master Theoremu}:
285 $$\vbox{\halign{# \quad  \quad & # \quad  \quad & # \quad  \quad & # \quad  \quad & #\cr
286 algoritmus & $a$ & $b$ & $d$ & èasová slo¾itost\cr
287 \noalign{\smallskip\hrule\medskip}
288 Mergesort & 2 & 2 & 1 & $\O({n \cdot \log{n}})$\cr
289 Násobení I. & 4 & 2 & 1 & $\O(n^2)$\cr
290 Násobení II. & 3 & 2 & 1 & $\O(n^{\log_2{3}})$\cr
291 Binární vyhledávání & 1 & 2 & 0 & $\O(\log{n})$\cr}}$$
292
293 \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 \cdot \log{n})$).
294
295 \bye