\prednaska{2}{Slo¾itost, grafové algoritmy}
{(zapsal Martin Koutecký)}
-\h{Model {\sc Ram}}
+\h{Model {\csc Ram}}
Pøi analýze algoritmu bychom chtìli nìjak popsat jeho slo¾itost. Abychom mohli
udìlat toto, potøebujeme nejprve definovat výpoèetní model. Výpoèetních modelù
je více, my vybereme jeden pomìrnì blízký skuteèným poèítaèùm:
-\s{Definice:} Random Access Machine ({\sc Ram})
+\s{Definice:} Random Access Machine ({\csc Ram})
-{\sc Ram} poèítá jen s celými èísly -- znaky, stringy a podobnì reprezentujeme
+{\csc 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ù:
\h{Slo¾itost}
\> Jak dobøe popsat slo¾itost?
\numlist\ndotted
-\:{\I {\sc Ram} s jednotkovou cenou}: èas $\approx$ \#instrukcí, prostor
+\:{\I {\csc 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).
-\:{\I{\sc Ram} s logaritmickou cenou}: cena instrukce $\approx$ \#bitù
+\:{\I{\csc 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).
-\:{\I{\sc Ram} s omezenými èísly}: jednotková cena instrukcí, ale èísla omezíme
+\:{\I{\csc 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 ov¹em obvykle nevadí).
\endlist
\::$[i]$ prohodíme s $[j]$.
\endalgo
-Jak by takový algoritmus vypadal zapsaný v instrukcích {\sc Ram}? Budeme muset
+Jak by takový algoritmus vypadal zapsaný v instrukcích {\csc 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:
\:Jaké je nejkrat¹í (kladné, celé) èíslo v desítkové soustavì zapsané jen
èí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$
+a hranami $(x,y),$ $y=10\cdot x \bmod 13$ a $y=(10\cdot x + 1) \bmod 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~1~do~0. Jakým algoritmem takový sled najdeme?