]> mj.ucw.cz Git - ads1.git/commitdiff
Korektury kapitoly o RAMu.
authorMartin Mares <mj@ucw.cz>
Tue, 26 May 2009 15:55:06 +0000 (17:55 +0200)
committerMartin Mares <mj@ucw.cz>
Tue, 26 May 2009 15:55:06 +0000 (17:55 +0200)
2-ram/2-ram.tex

index 31e5c738d10bca4da540a4a9cb8397dc5f477a5e..2cc8939dc50653bb1dcaef9c6a52c8a8c0dc63d3 100644 (file)
@@ -11,16 +11,16 @@ je v
 
 \s{Definice:} Random Access Machine ({\sc Ram})
 
-{\sc Ram} poèítá jen s èísly -- znaky, stringy a podobnì reprezentujeme
+{\sc Ram} poèítá jen s celými èísly -- znaky, stringy a podobnì reprezentujeme
 èísly, jejich posloupnostmi atd. Pamì» je tvoøena buòkami, které obsahují
 èísla. Pamì»ové buòky jsou adresované takté¾ èísly. A program samotný je
 koneèná posloupnost instrukcí následujících druhù:
 \itemize\ibull
 \:Aritmetické a logické:
 $X$ |<-| $Y \oplus Z, \oplus\in\{|+|, |-|, |*|, |div|, |mod|, \&,
-{\tt\char124} |<<|, |>>|\}$
+{\tt\char124}, |<<|, |>>|\}$
 \:Øídící: |goto| \<label>, |halt|
-\:Podmínky: pro libovolnou nepodmínìnou instrukci mù¾u pou¾ít
+\:Podmínky: pro libovolnou nepodmínìnou instrukci mù¾u pou¾ít \hfil \break
 if~$X$~|<|~$Y$~|==>|~instrukce % Tady to prosím je¹tì zkontroluj. Myslím, ¾e
 % zápis je správný, ale sází se to divnì a vidím èerný obdélníèek na konci
 % øádku. Díky.
@@ -29,10 +29,11 @@ if~$X$~|<|~$Y$~|==>|~instrukce % Tady to pros
 \s{Poznámka} (operandy):
 \itemize\ibull
 \:Konstanty (1, 2, \dots)
-\:Adresované pøímo -- M[konst.] -- budeme pou¾ívat písmena A-Z jako aliasy pro
+\:Adresované pøímo -- M[konst.] -- budeme pou¾ívat písmena {\tt A-Z} jako aliasy
+pro
 buòky pamìti $-1$ a¾ $-26$, které nazýváme registry.
-(tedy A=M[-1])
-\:Adresované nepøímo -- M[M[konst.]] -- budeme pou¾ívat zkratku [[konst.]]
+(tedy A={\tt M[-1]})
+\:Adresované nepøímo -- {\tt M[M[konst.]]} -- budeme pou¾ívat zkratku [[konst.]]
 \endlist
 
 Samotný výpoèet probíhá takto:
@@ -47,27 +48,31 @@ v
 
 
 \h{Slo¾itost}
-Jak dobøe popsat slo¾itost?
+\> Jak dobøe popsat slo¾itost?
 \numlist\ndotted
-\:{\sc Ram} s jednotkovou cenou: èas $\approx$ \#instrukcí, prostor $\approx$
+\:{\I {\sc Ram} s jednotkovou cenou}: èas $\approx$ \#instrukcí, prostor
+$\approx$
 maximální èíslo buòky minus minimální èíslo buòky pou¾ité pøi výpoètu.
 Toto není moc dobrý nápad, proto¾e není nijak penalizována napøíklad práce s
 velmi dlouhými èísly -- poøád je to jedna instrukce, tak¾e cena je stejná, ale
 poèítaèe se tak pøece nechovají. Velikost èísel ale omezit nesmíme, proto¾e
 bychom omezili pamì» (èísly ji adresujeme).
-\:{\sc Ram} s logaritmickou cenou: èas $\approx$ \#bitù zpracovávaných èísel,
+\:{\I{\sc Ram} s logaritmickou cenou}: cena instrukce $\approx$ \#bitù
+zpracovávaných èísel,
 prostor $\approx$ \# bitù v¹ech pou¾itých bunìk. To je teoreticky pøesné, ale
 dost nepraktické (ve v¹ech slo¾itostech by byly logaritmy).
-\:{\sc Ram} s omezenými èísly: jednotková cena instrukcí, ale èísla omezíme
+\:{\I{\sc Ram} s omezenými èísly}: jednotková cena instrukcí, ale èísla omezíme
 nìjakým polynomem $P(n)$. Tím zmizí paradoxy prvního modelu, ale
-mù¾eme adresovat jen polynomiální prostor (to nám obvykle nevadí).
+mù¾eme adresovat jen polynomiální prostor (to nám ov¹em obvykle nevadí).
 \endlist
 
+Nadále tedy budeme pøedpokládat tøetí zmínìný model.
+
 % Z minulých zápiskù.
 \s{Definice:}
 \itemize\ibull
-\:{\I Èas bìhu algoritmu} $t(x)$ pro vstup~$x$ mìøíme jako poèet
-elementárních operací, které program provedl pøi zpracování vstupu
+\:{\I Èas bìhu algoritmu} $t(x)$ pro vstup~$x$ mìøíme jako sumu èasù provedených
+operací, které program provedl pøi zpracování vstupu
 $x$.
 \:{\I Prostor bìhu algoritmu} $s(x)$ je analogicky poèet pamì»ových
 bunìk spotøebovaných pøi výpoètu se vstupem~$x$.
@@ -79,7 +84,8 @@ $$S(n) := \max \{s(x) ; \hbox{$x$ je vstup d
 
 Nyní zkusíme zanalyzovat nìjaký konkrétní algoritmus. Vezmìme napøíklad øazení
 pomocí pøímeho výbìru (selection sort). Na vstupu dostaneme poèet èísel $n$ (v
-registru N), v buòkách $1,\dots, n$ je nesetøídìná posloupnost èísel. Ta pak
+registru {\tt N}), v buòkách $1,\dots, n$ je nesetøídìná posloupnost èísel. Ta
+pak
 tøídíme následujícím algoritmem zapsaným v pseudokódu:
 \algo
 \:Pro $i=1$ do $n$:
@@ -92,7 +98,7 @@ t
 Jak by takový algoritmus vypadal zapsaný v instrukcích {\sc Ram}? Budeme muset
 pou¾ít návì¹tí a goto místo cyklù, jména registrù místo promìnných a
 tøeba prohození musíme provést pøes tøetí promìnnou. Nìjak takto:
-
+% Co tady chybí?
 \verbatim{
        I <- 1
 LOOP:  J <- I
@@ -112,16 +118,18 @@ Cyklus |MIN| provede $3\cdot (N-I+1)$ instrukc
 je¹tì 7 instrukcí, tedy celý |LOOP| provede $3\cdot (N-I+1)+7$ instrukcí.
 Celkovì se dostáváme k souètu
 $$1+3\cdot N+7+3\cdot (N-1)+7+3\cdot (N-2)+7+3\cdot (N-3)+\dots +3\cdot 1+7 =$$
-$$1+7\cdot N+3\cdot {{N(N+1)}\over{2}} = {{3}\over{2}}N^2 + 8,5N + 1$$
+$$1+7\cdot N+3\cdot {{N(N+1)}\over{2}} = {{3}\over{2}}N^2 + 8{,}5N + 1$$
 
 Na multiplikativních konstantách ale nezále¾í -- zaprvé se na reálných strojích
 ceny jednotlivých (pro nás jednotkových) instrukcí stejnì li¹í, zadruhé
-asymptoticky pomalej¹í funkce nakonec pro velké N v¾dy prohraje, tak¾e nemá cenu
+asymptoticky pomalej¹í funkce nakonec pro velké $N$ v¾dy prohraje, tak¾e nemá
+cenu
 (alespoò pøi prvním pøiblí¾ení k problému) multiplikativními konstantami se
 zabývat. Tím pádem nezále¾í ani na èlenech ni¾¹í øádù:
 $$1{,}5N^2 + 8{,}5N + 1 \leq 1{,}5N^2 + 8{,}5N^2 + N^2 = 11N^2\approx N^2$$
 Kdy¾ u¾ toto víme, mù¾eme zanedbávat konstanty prùbì¾nì: $N$ cyklù po
-$\approx~N$~krocích $\Rightarrow~\approx~N^2$ krokù. To nás vede k zavedení tzv.
+${}\approx~N$~krocích $\Rightarrow~\approx~N^2$ krokù. To nás vede k zavedení
+tzv.
 {\I asymptotické notace:}
 
 \h{Asymptotická notace}
@@ -139,7 +147,7 @@ neplat
 funkcí, pro které platí, ¾e se dají shora odhadnout kladným násobkem funkce~$g$,
 a~psát tedy~$f\in\O(g)$, ale zvyk je bohu¾el ¾elezná ko¹ile.
 
-\s{Pøíklady:} $2.5n^{2} = \O(n^{2})$, $2.5n^{2}+30n = \O(n^{2})$.
+\s{Pøíklady:} $2{,}5n^{2} = \O(n^{2})$, $2{,}5n^{2}+30n = \O(n^{2})$.
 
 \>Také platí:
 $$
@@ -169,11 +177,12 @@ g(n)$.
 
 $\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)$.
-\:$f=\Theta(g) \equiv f=O(g) \wedge f=\Omega(g)$
+\:$f=\Theta(g) \equiv f=\O(g) \wedge f=\Omega(g)$
 
 nebo výøeènìji:
 
-$f=\Theta(g) \equiv \exists$ $c_{1},c_{2} > 0: c_{1}\cdot g(n) \leq f(n) \leq
+$f=\Theta(g) \equiv \exists$ $c_{1},c_{2} > 0: \forall^* n \in {\bb
+N}: c_{1}\cdot g(n) \leq f(n) \leq
 c_{2}\cdot g(n)$ To znamená, ¾e existují nezáporné reálné konstanty
 $c_{1},c_{2}$ takové, ¾e se funkce $f(n)$ dá ohranièit $c_{1}$- a
 $c_{2}$-násobkem funkce $g(n)$.
@@ -203,7 +212,7 @@ v~exponentu), nez
 $$
 \log_k{n}={{\log_c{n}}\over{\log_c{k}}}={{1}\over{\log_c{k}}}\cdot \log_c{n},
 $$
-kde $1/\log_c{k}$ je jen konstanta, tak¾e ji mù¾eme \uv{schovat do~$\O$.}
+kde $1/\log_c{k}$ je jen konstanta, tak¾e ji mù¾eme \uv{schovat do~$\O$}.
 
 \s{Pøíklad:} Select sort (rozebraný vý¹e):
 Kdy¾ jej pustíme na $n$ èísel, pak èasová slo¾itost je $T(n) = \Theta(n^2)$ a
@@ -214,20 +223,23 @@ Dal
 následující pøíklady lze (i kdy¾ to tak obèas na první pohled nevypadá) øe¹it
 nìjakým grafovým algoritmem:
 \itemize\ibull
-\:Mám mapku silnièní sítì, v ní oznaèené \uv{Doma} a \uv{©kola}. Dostanu se do
+\:Mám mapku silnièní sítì, v ní místa (vrcholy) oznaèená \uv{Doma} a \uv{©kola}.
+Dostanu se do
 ¹koly (le¾í ve stejné komponentì souvislosti)? Dostanu se do ¹koly, kdy¾ v zimì
 napadne hodnì snìhu a nìkteré cesty budou neprùjezdné? A jaký nejkrat¹í úsek
 cest musí silnièáøi prohrnout, aby byla v¹echna místa na mapì dostupná?
 \:Mìjme hlavolam \uv{Lloydova devítka} -- krabièku $3\times3$ se ètvereèky
 oznaèenými èísly od jedné do osmi a jednou mezerou, ètvereèky jsou zamíchané a
-na¹ím úkolem je správnì je seøadit. Jak to udìlat? Kolik nejménì krokù nám na
+na¹ím úkolem je správnì je seøadit pomocí pøesouvání ètvereèkù sousedících s
+mezerou do této mezery. Jak to udìlat? Kolik nejménì krokù nám na
 to staèí? Jde to vùbec se zadáním, které jsme dostali?
 \:Jaké je nejkrat¹í (kladné, celé) èíslo v desítkové soustavì zapsané jen
-èíslicemi 1, 0 dìlitelné tøinácti? Nakreslíme orientovaný graf s vrcholy 1 a¾ 13
+èíslicemi 1, 0, které je dìlitelné tøinácti? Nakreslíme orientovaný graf s
+vrcholy 0 a¾ 12
 a hranami $(x,y),$ $y=10\cdot x \mod 13$ a $y=(10\cdot x + 1) \mod 13$
 (z~ka¾dého vrcholu vychází jedna hrana za pøidání èíslice 1 a dal¹í za èíslici
 0). Hledané èíslo existuje právì tehdy, kdy¾ graf obsahuje orientovaný sled
-z~0~do~1. Jakým algoritmem takový sled najdeme?
+z~1~do~0. Jakým algoritmem takový sled najdeme?
 \endlist
 Podobné a dal¹í úlohy budeme øe¹it v následujících kapitolách.