]> mj.ucw.cz Git - ads1.git/blob - 2-ram/2-ram.tex
Korektury kapitoly o RAMu.
[ads1.git] / 2-ram / 2-ram.tex
1 \input ../lecnotes.tex
2
3 \prednaska{2}{Slo¾itost, grafové algoritmy}
4 {(zapsal Martin Koutecký)}
5
6 \h{Model {\sc Ram}}
7
8 Pøi analýze algoritmu bychom chtìli nìjak popsat jeho slo¾itost. Abychom mohli
9  udìlat toto, potøebujeme nejprve definovat výpoèetní model. Výpoèetních modelù
10 je více, my vybereme jeden pomìrnì blízký skuteèným poèítaèùm:
11
12 \s{Definice:} Random Access Machine ({\sc Ram})
13
14 {\sc Ram} poèítá jen s celými èísly -- znaky, stringy a podobnì reprezentujeme
15 èísly, jejich posloupnostmi atd. Pamì» je tvoøena buòkami, které obsahují
16 èísla. Pamì»ové buòky jsou adresované takté¾ èísly. A program samotný je
17 koneèná posloupnost instrukcí následujících druhù:
18 \itemize\ibull
19 \:Aritmetické a logické:
20 $X$ |<-| $Y \oplus Z, \oplus\in\{|+|, |-|, |*|, |div|, |mod|, \&,
21 {\tt\char124}, |<<|, |>>|\}$
22 \:Øídící: |goto| \<label>, |halt|
23 \:Podmínky: pro libovolnou nepodmínìnou instrukci mù¾u pou¾ít \hfil \break
24 if~$X$~|<|~$Y$~|==>|~instrukce % Tady to prosím je¹tì zkontroluj. Myslím, ¾e
25 % zápis je správný, ale sází se to divnì a vidím èerný obdélníèek na konci
26 % øádku. Díky.
27 \endlist
28
29 \s{Poznámka} (operandy):
30 \itemize\ibull
31 \:Konstanty (1, 2, \dots)
32 \:Adresované pøímo -- M[konst.] -- budeme pou¾ívat písmena {\tt A-Z} jako aliasy
33 pro
34 buòky pamìti $-1$ a¾ $-26$, které nazýváme registry.
35 (tedy A={\tt M[-1]})
36 \:Adresované nepøímo -- {\tt M[M[konst.]]} -- budeme pou¾ívat zkratku [[konst.]]
37 \endlist
38
39 Samotný výpoèet probíhá takto:
40 \algo
41 \:Do smluvených bunìk umístíme vstup, obsah zbylých pamì»ových bunìk není
42 definován.
43 \:Provádíme program postupnì po instrukcích, dokud nedojdeme k haltu nebo konci
44 programu.
45 \:Pokud se program nezacyklil, tedy pokud skonèil, ze smluvených bunìk pøeèteme
46 výstup.
47 \endalgo
48
49
50 \h{Slo¾itost}
51 \> Jak dobøe popsat slo¾itost?
52 \numlist\ndotted
53 \:{\I {\sc Ram} s jednotkovou cenou}: èas $\approx$ \#instrukcí, prostor
54 $\approx$
55 maximální èíslo buòky minus minimální èíslo buòky pou¾ité pøi výpoètu.
56 Toto není moc dobrý nápad, proto¾e není nijak penalizována napøíklad práce s
57 velmi dlouhými èísly -- poøád je to jedna instrukce, tak¾e cena je stejná, ale
58 poèítaèe se tak pøece nechovají. Velikost èísel ale omezit nesmíme, proto¾e
59 bychom omezili pamì» (èísly ji adresujeme).
60 \:{\I{\sc Ram} s logaritmickou cenou}: cena instrukce $\approx$ \#bitù
61 zpracovávaných èísel,
62 prostor $\approx$ \# bitù v¹ech pou¾itých bunìk. To je teoreticky pøesné, ale
63 dost nepraktické (ve v¹ech slo¾itostech by byly logaritmy).
64 \:{\I{\sc Ram} s omezenými èísly}: jednotková cena instrukcí, ale èísla omezíme
65 nìjakým polynomem $P(n)$. Tím zmizí paradoxy prvního modelu, ale
66 mù¾eme adresovat jen polynomiální prostor (to nám ov¹em obvykle nevadí).
67 \endlist
68
69 Nadále tedy budeme pøedpokládat tøetí zmínìný model.
70
71 % Z minulých zápiskù.
72 \s{Definice:}
73 \itemize\ibull
74 \:{\I Èas bìhu algoritmu} $t(x)$ pro vstup~$x$ mìøíme jako sumu èasù provedených
75 operací, které program provedl pøi zpracování vstupu
76 $x$.
77 \:{\I Prostor bìhu algoritmu} $s(x)$ je analogicky poèet pamì»ových
78 bunìk spotøebovaných pøi výpoètu se vstupem~$x$.
79 \:{\I Èasová slo¾itost} (v~nejhor¹ím pøípadì) je:
80 $$T(n) := \max \{t(x) ; \hbox{$x$ je vstup délky $n$}\}.$$
81 \:{\I Prostorová slo¾itost} (v~nejhor¹ím pøípadì) je:
82 $$S(n) := \max \{s(x) ; \hbox{$x$ je vstup délky $n$}\}.$$
83 \endlist
84
85 Nyní zkusíme zanalyzovat nìjaký konkrétní algoritmus. Vezmìme napøíklad øazení
86 pomocí pøímeho výbìru (selection sort). Na vstupu dostaneme poèet èísel $n$ (v
87 registru {\tt N}), v buòkách $1,\dots, n$ je nesetøídìná posloupnost èísel. Ta
88 pak
89 tøídíme následujícím algoritmem zapsaným v pseudokódu:
90 \algo
91 \:Pro $i=1$ do $n$:
92 \::$j\leftarrow i$
93 \::Pro $k=i$ do $n$:
94 \:::Je-li $[k]<[j]\Rightarrow j\leftarrow k$
95 \::$[i]$ prohodíme s $[j]$.
96 \endalgo
97
98 Jak by takový algoritmus vypadal zapsaný v instrukcích {\sc Ram}? Budeme muset
99 pou¾ít návì¹tí a goto místo cyklù, jména registrù místo promìnných a
100 tøeba prohození musíme provést pøes tøetí promìnnou. Nìjak takto:
101 % Co tady chybí?
102 \verbatim{
103         I <- 1
104 LOOP:   J <- I
105         M <- I
106 MIN:    IF [J]<[M] ==> M <- J
107         J <- J+1
108         IF J<=N ==> GOTO MIN
109         X <- [I]
110         [I] <- [M]
111         [M] <- X
112         I <- I+1
113         IF I<=N ==> GOTO LOOP
114 }
115
116 Pojïme se podívat, jaká je èasová slo¾itost jednotlivých èástí algoritmu.
117 Cyklus |MIN| provede $3\cdot (N-I+1)$ instrukcí. Mimo cyklu |MIN| je v |LOOP|
118 je¹tì 7 instrukcí, tedy celý |LOOP| provede $3\cdot (N-I+1)+7$ instrukcí.
119 Celkovì se dostáváme k souètu
120 $$1+3\cdot N+7+3\cdot (N-1)+7+3\cdot (N-2)+7+3\cdot (N-3)+\dots +3\cdot 1+7 =$$
121 $$1+7\cdot N+3\cdot {{N(N+1)}\over{2}} = {{3}\over{2}}N^2 + 8{,}5N + 1$$
122
123 Na multiplikativních konstantách ale nezále¾í -- zaprvé se na reálných strojích
124 ceny jednotlivých (pro nás jednotkových) instrukcí stejnì li¹í, zadruhé
125 asymptoticky pomalej¹í funkce nakonec pro velké $N$ v¾dy prohraje, tak¾e nemá
126 cenu
127 (alespoò pøi prvním pøiblí¾ení k problému) multiplikativními konstantami se
128 zabývat. Tím pádem nezále¾í ani na èlenech ni¾¹í øádù:
129 $$1{,}5N^2 + 8{,}5N + 1 \leq 1{,}5N^2 + 8{,}5N^2 + N^2 = 11N^2\approx N^2$$
130 Kdy¾ u¾ toto víme, mù¾eme zanedbávat konstanty prùbì¾nì: $N$ cyklù po
131 ${}\approx~N$~krocích $\Rightarrow~\approx~N^2$ krokù. To nás vede k zavedení
132 tzv.
133 {\I asymptotické notace:}
134
135 \h{Asymptotická notace}
136 \s{Definice:} Pro funkce $f,g: {\bb N} \rightarrow {\bb R}^+$ øekneme,
137 ¾e $f$ je $\O(g)$ právì tehdy, kdy¾ $\exists c>0: \forall ^{*} n \in {\bb N}:
138 f(n) \leq c \cdot g(n)$.
139 Zde $\forall^* n \in {\bb N}$ je zkratka za \uv{$\exists n_0 \in {\bb N}:
140 \forall n \geq n_0$}, tedy
141 \uv{pro v¹echna~$n$ a¾ na~koneènì mnoho výjimek.}
142
143 \s{Poznámka:} $\O$-notace tedy vyjadøuje, ¾e funkce~$f$ je skoro v¹ude men¹í
144 nebo nejvý¹e rovná nìjakému reálnému násobku funkce~$g$. Aèkoliv zápis vypadá
145 jako rovnost, rozhodnì není symetrický: napøíklad platí $\log n=\O(n)$, ale
146 neplatí $n=\O(\log n)$. Formálnì by bylo lep¹í pova¾ovat $\O(g)$ za tøídu
147 funkcí, pro které platí, ¾e se dají shora odhadnout kladným násobkem funkce~$g$,
148 a~psát tedy~$f\in\O(g)$, ale zvyk je bohu¾el ¾elezná ko¹ile.
149
150 \s{Pøíklady:} $2{,}5n^{2} = \O(n^{2})$, $2{,}5n^{2}+30n = \O(n^{2})$.
151
152 \>Také platí:
153 $$
154 \O(f)+\O(g) \in \O(f+g),
155 $$
156 èím¾ myslíme, ¾e pokud vezmeme libovolnou $f'=O(f)$ a $g'=O(g)$, bude
157 $f'+g'=O(f+g)$.
158 To platí, jeliko¾ skoro v¹ude je $f' \leq cf$, $g'\leq dg$, a~tedy $f'+g' \le
159 cf+dg \le (c+d)(f+g)$.
160
161 \s{Cvièení:} Uka¾te, ¾e:
162 \itemize\ibull
163 \:$\O(f) \cdot \O(g)=\O(f \cdot g)$,
164 \:$\O(f+g)=\O(\max(f,g))$,
165 \:$\O(n^{2})+\O(n)=\O(n^{2}+n)=\O(n^{2})$.
166 \endlist
167
168 $\O$-notace popisuje horní odhad asymptotického chování funkce. Mnohdy v¹ak
169 potøebujeme také odhadnout funkci zespodu (chceme-li øíci, ¾e algoritmus
170 potøebuje {\I alespoò} nìjaké mno¾ství èasu nebo pamìti), pøípadnì z~obou stran:
171
172 \s{Definice:}
173
174 \itemize\ibull
175 \:$f=\Omega(g) \equiv \exists c>0:\forall^* n \in {\bb N}: f(n) \geq c\cdot
176 g(n)$.
177
178 $\Omega$-notace tedy øíká, ¾e hodnota funkce $f$ je v¾dy stejná nebo vy¹¹í ne¾
179 nìjaký $c$-násobek funkce $g$, a tedy $g=\O(f)$.
180 \:$f=\Theta(g) \equiv f=\O(g) \wedge f=\Omega(g)$
181
182 nebo výøeènìji:
183
184 $f=\Theta(g) \equiv \exists$ $c_{1},c_{2} > 0: \forall^* n \in {\bb
185 N}: c_{1}\cdot g(n) \leq f(n) \leq
186 c_{2}\cdot g(n)$ To znamená, ¾e existují nezáporné reálné konstanty
187 $c_{1},c_{2}$ takové, ¾e se funkce $f(n)$ dá ohranièit $c_{1}$- a
188 $c_{2}$-násobkem funkce $g(n)$.
189 \endlist
190
191 \s{Porovnání rùstu funkcí:} (aneb jak moc máme algoritmy rádi podle jejich
192 chování od~nejlep¹ích k~nejhor¹ím)
193
194 \itemize\ibull
195 \:$\Theta(1) \ldots$ funkce zespoda i shora ohranièené konstantami
196 \:$\Theta(\log{( \log{n} )})$
197 \:$\Theta(\log{n})$ \dots\ logaritmická
198 \:$\Theta(n^{\varepsilon}), \varepsilon \in (0,1)$ \dots\ sublineární
199 \:$\Theta(n)$ \dots\ lineární
200 \:$\Theta(n^{2})$ \dots\ kvadratická
201 \:$\Theta(n^{k})$ \dots\ polynomiální
202 \:$\Theta(2^{n})$ \dots\ exponenciální pøi základu $2$
203 \:$\Theta(3^{n})$ \dots\ exponenciální pøi základu $3$
204 \:$\Theta(k^{n})$ \dots\  exponenciální pøi základu $k>1$
205 \:$\Theta(n!)$ \dots\ faktoriálová
206 \:$\Theta(n^{n})$
207 \:\dots\ nekoneènì mnoho dal¹ích tøíd (i mezi tìmi vý¹e uvedenými)
208 \endlist
209
210 \>{\sl Poznámka:} Pokud se v~odhadu slo¾itosti vyskytne logaritmus (jinde ne¾
211 v~exponentu), nezále¾í na tom, jaký má základ, proto¾e platí:
212 $$
213 \log_k{n}={{\log_c{n}}\over{\log_c{k}}}={{1}\over{\log_c{k}}}\cdot \log_c{n},
214 $$
215 kde $1/\log_c{k}$ je jen konstanta, tak¾e ji mù¾eme \uv{schovat do~$\O$}.
216
217 \s{Pøíklad:} Select sort (rozebraný vý¹e):
218 Kdy¾ jej pustíme na $n$ èísel, pak èasová slo¾itost je $T(n) = \Theta(n^2)$ a
219 prostorová $S(n) = \Theta(n)$.
220
221 \h{Úvod do grafových algoritmù}
222 Dal¹í dùle¾itou a zajímavou kapitolou jsou grafové algoritmy. Napøíklad
223 následující pøíklady lze (i kdy¾ to tak obèas na první pohled nevypadá) øe¹it
224 nìjakým grafovým algoritmem:
225 \itemize\ibull
226 \:Mám mapku silnièní sítì, v ní místa (vrcholy) oznaèená \uv{Doma} a \uv{©kola}.
227 Dostanu se do
228 ¹koly (le¾í ve stejné komponentì souvislosti)? Dostanu se do ¹koly, kdy¾ v zimì
229 napadne hodnì snìhu a nìkteré cesty budou neprùjezdné? A jaký nejkrat¹í úsek
230 cest musí silnièáøi prohrnout, aby byla v¹echna místa na mapì dostupná?
231 \:Mìjme hlavolam \uv{Lloydova devítka} -- krabièku $3\times3$ se ètvereèky
232 oznaèenými èísly od jedné do osmi a jednou mezerou, ètvereèky jsou zamíchané a
233 na¹ím úkolem je správnì je seøadit pomocí pøesouvání ètvereèkù sousedících s
234 mezerou do této mezery. Jak to udìlat? Kolik nejménì krokù nám na
235 to staèí? Jde to vùbec se zadáním, které jsme dostali?
236 \:Jaké je nejkrat¹í (kladné, celé) èíslo v desítkové soustavì zapsané jen
237 èíslicemi 1, 0, které je dìlitelné tøinácti? Nakreslíme orientovaný graf s
238 vrcholy 0 a¾ 12
239 a hranami $(x,y),$ $y=10\cdot x \mod 13$ a $y=(10\cdot x + 1) \mod 13$
240 (z~ka¾dého vrcholu vychází jedna hrana za pøidání èíslice 1 a dal¹í za èíslici
241 0). Hledané èíslo existuje právì tehdy, kdy¾ graf obsahuje orientovaný sled
242 z~1~do~0. Jakým algoritmem takový sled najdeme?
243 \endlist
244 Podobné a dal¹í úlohy budeme øe¹it v následujících kapitolách.
245
246 \bye