]> mj.ucw.cz Git - ads1.git/commitdiff
Uvod: Korektury od Karla
authorMartin Mares <mj@ucw.cz>
Thu, 24 Mar 2011 18:25:00 +0000 (19:25 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 24 Mar 2011 18:25:00 +0000 (19:25 +0100)
1-uvod/1-uvod.tex

index abb1594729417b05d195f99244a3fc7bb3b7464b..aab035d09e7efa84acefe1558d12bc59c0697129 100644 (file)
@@ -1,72 +1,81 @@
 \input ../lecnotes.tex
 
 \prednaska{1}{Úvodní pøíklady, definice RAM}
-{(zapsal Karel Král)}
-%Úvodní pøíklady, definice modelu RAM se nevlezlo na øádek
+{}
 
 \h{Pøíklad: {\sc Reportá¾}}
 
-Novináø má za úkol za jeden rok vyzkou¹et co nejvíc pracovních pozic v urèité firmì a
-napsat o této firmì reportá¾. Chce ale aby se mu neustále zvy¹oval plat. Firma v
-rùzných èasech vypisuje pracovní místa.
+Novináø má za úkol za rok napsat reportá¾ o pracovních podmínkách v jedné nejmenované
+firmì. Musí tedy vyzkou¹et co nejvíce pracovních pozic. Chce ale, aby se mu neustále
+zvy¹oval plat. Firma v rùzných èasech vypisuje pracovní místa.
 
-Øeèeno matematicky máme zadánu posloupnost $p_1,\, \dots, p_n$ reálných èísel a hledáme
+Øeèeno matematicky, máme zadánu posloupnost $p_1,\, \dots, p_n$ reálných èísel a~hledáme
 nejdel¹í ostøe rostoucí vybranou podposloupnost.
 
 
 \> Jak mù¾eme takový problém øe¹it?
-\numlist\ndotted
-\:{\I Podle definice}: budeme generovat v¹echny podposloupnosti a testovat jestli jsou
+
+
+{\I Podle definice}: budeme generovat v¹echny podposloupnosti a testovat, jestli jsou
 rostoucí. Podposloupnost mù¾eme popsat charakteristickým vektorem, co¾ je posloupnost
 nul a jednièek, kde na $i$-té pozici je $1$ právì kdy¾ podposloupnost obsahuje $i$-tý
-èlen pùvodní posloupnosti.
+èlen pùvodní posloupnosti. Charakteristické vektory odpovídají binárním zápisùm èísel
+$1$ a¾ $2^n$ kde $n$ je poèet vypsaných prací, co¾ nám dává jednoduchý zpùsob jak je
+generovat.
 
 Nyní nás bude zajímat kolik øádovì provedeme krokù. V¹ech charakteristických vektorù
 je $2^n$. Pro ka¾dý zkontrolujeme, jestli je podposloupnost rostoucí, co¾ zabere $n$
 krokù. Celkem tedy provedeme øádovì $2^n\cdot n$ krokù.
 
-\:{\I Rekurzívnì}: funkce dostane zaèátek posloupnosti a najde v¹echna roz¹íøení na
+{\I Rekurzívnì}: funkce dostane zaèátek posloupnosti a najde v¹echna roz¹íøení na
 rostoucí podposloupnost
 $f(i_1, \, \dots, i_k) :=$ maximání délka rostoucí podposloupnosti navazující na $x_{i_1},
 \, \dots, x_{i_k}$.
-Probereme v¹echna $j$~od $i_k+1$ do $n$ a pro ka¾dé $j$ takové, ¾e $x_j > x_{i_k}$
-nastavíme maximum $m \leftarrow max(m, f(i_1, \, \dots, i_k, j) + 1)$. Jako výsledek
+Probereme v¹echna $j$~od $i_k+1$ do $n$ a pro ka¾dé $j$ takové, ¾e $x_j > x_{i_k}$,
+nastavíme maximum $m \leftarrow \max(m, f(i_1, \, \dots, i_k, j) + 1)$. Jako výsledek
 funkce vrátí $m$. Na zaèátek posloupnosti pøidáme $-\infty$ a zavoláme $f(0)$.
+%TODO sázet jako algoritmus
+\algo
+\:for $j = i_k + 1$ to $n$
+\::if $x_j > x_{i_k}$
+\:::$m |<-| \max (m, f(i_1, \dots, i_k), j + 1)$
+\:return $m$
+\endalgo
 
-Nejhor¹ím pøípadem je rostoucí posloupnost na které na¹e funkce vykoná $2^n$ krokù.
+Nejhor¹ím pøípadem je rostoucí posloupnost, na které na¹e funkce vykoná øádovì $2^n$ krokù.
 
 Volání funkce mù¾eme zjednodu¹it, kdy¾ si uvìdomíme, ¾e prvních $k-1$ parametrù vùbec
 nepotøebujeme, tak¾e mù¾eme rovnou volat $f(i_k)$.
 
-\:{\I 2. s blbenkou}: efektivitu algoritmu mù¾eme zvý¹it tím, ¾e ho nenecháme poèítat
-to samé dokola. V poli $X$ si pamatujeme výsledky funkce $f$ pro jednotlivá $i$, tedy
+{\I Rekurze s blbenkou}: pøedchozí algoritmus poèítá mnohokrát tyté¾ vstupy, proto¾e
+$f(i)$ bude nebo byla volána i pro v¹echny podposloupnosti zrovna zkoumané podposloupnosti.
+V poli $X$ si pamatujeme výsledky funkce $f$ pro jednotlivá $i$, tedy
 pole $X$ obsahuje na pozici $i$ hodnotu $f(i)$.
 
-Cvièení: uka¾te, ¾e algoritmus vykoná øádovì $n^2$ operací a spotøebuje $n$~pamìti.
+Cvièení: uka¾te, ¾e algoritmus vykoná øádovì $n^2$ operací a spotøebuje $n$~bunìk pamìti.
 
-\:{\I Pøevédst úlohu na grafovou} je standartní informatický trik.
+{\I Pøevédst úlohu na grafovou} je standardní informatický trik.
 Vrcholy jsou èísla $V := \{1, \,\dots, n\}$,
-hrana $(i, j) \in E \equiv i \le j\, \& \,x_i~\le~x_j$. Cesty v tomto grafu jsou vybrané
-posloupnosti a my hledáme nejdel¹í cestu v acyklickém grafu, co¾ umíme (budeme umìt)
-lineárnì s velikostí grafu. Hran mù¾e být a¾ ${\tt\char124}E{\tt\char124} = {n \choose
-2} \approx n^2$. Èím¾ jsme dostali dal¹í kvadratický algoritmus.
-
-\:{\I Datová struktura}: vytvoøíme ¹ikovnou datovou strukturu, která obsahuje
-uspoøádané  dvojice reálných èísel $(x, y)$ kde $x$ je klíè a $y$ hodnota. Po této
-struktuøe budeme chtít aby umìla vlo¾it dvojici $Insert(x, y)$ a dotaz $Query(t) :=
-max\{y {\tt\char124} \exists x \geq t: (x, y)$ je ve struktuøe$\}$.
-V jednom prùchodu zavoláme $Insert(x_j, f(j))$ a $Query(x_{k+1})$, obì trvají øádovì
-$log(n)$.
-
-Provedeme tedy øádovì $n\cdot log(n)$ krokù, co¾ je nejlep¹í známé øe¹ení.
-\endlist
+hrana $(i, j) \in E \equiv i < j\, \& \,x_i~<~x_j$. Cesty v tomto grafu odpovídají
+vybraným rostoucím posloupnostem a my hledáme nejdel¹í cestu v acyklickém grafu, co¾ umíme (budeme umìt)
+lineárnì s velikostí grafu. Hran mù¾e být a¾ $\vert E\vert  = {n \choose
+2} \approx~n^2$. Èím¾ jsme dostali dal¹í kvadratický algoritmus.
 
-\s{Definice:} Algoritmus
+{\I Datová struktura}: bìhem semestru poznáme ¹ikovnou datovou strukturu, která obsahuje
+uspoøádané  dvojice reálných èísel $(x, y)$ kde $x$ je klíè a $y$ hodnota. Po~této
+struktuøe budeme chtít aby umìla vlo¾it dvojici \<Insert>$(x, y)$ a dotaz \<Query>:
+\<Query>($t$)~$:=~\max~\{y~\mid \exists x \geq t: (x, y)$ je ve struktuøe$\}$.
 
-®ádná poøádná definice algoritmu neexistuje. My budeme brát algoritmus jako program v
-nìjakém jazyce na nìjakém výpoèetním stroji.
+V jednom prùchodu zavoláme \<Insert>$(x_j, f(j))$ a \<Query>($x_{k+1}$), obì trvají øádovì
+$\log n$, struktura nám vrátí nejvìt¹í hodnotu $f(j)$ pro dané $x_{k+1}$.
+%TODO lépe vysvìtlit
 
-Churchova teze: v¹echny definice algoritmù jsou ekvivalentní. Toto není opravdová
+Provedeme tedy øádovì $n\cdot \log n$ krokù, co¾ je nejlep¹í známé øe¹ení.
+
+Na pøí¹tích pøedná¹kách budeme studovat algoritmy a jejich vlastnosti. Co~ale
+algoritmus doopravdy je? Jak ho definovat?
+®ádná poøádná definice algoritmu neexistuje. My budeme brát algoritmus jako program v
+nìjakém jazyce na nìjakém výpoèetním stroji (viz definice RAM). Churchova teze: v¹echny definice algoritmù jsou ekvivalentní. Toto není opravdová
 vìta, spí¹ vyjadøuje, ¾e v¹echny rozumné definice algoritmu definují vpodstatì to
 samé.
 
@@ -74,24 +83,24 @@ sam
 
 
 \vskip 6pt
-\line{{\bf Model RAM} \hfil {(zapsal Martin Koutecký)}}
+\line{{\bf Model RAM} \hfil {}}
 \vskip 4pt
 
 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 (RAM)
 
-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. Program samotný je
+RAM poèítá jen s celými èísly, dále jen {\I èísla} -- znaky, stringy a podobnì reprezentujeme
+{\I èísly}, jejich posloupnostmi atd. Pamì» je tvoøena buòkami, které obsahují
+{\I èísla}. Pamì»ové buòky jsou adresované takté¾ {\I èísly}. Program samotný je
 koneèná posloupnost instrukcí (také opatøených adresami) následujících druhù:
 \itemize\ibull
-\:Pøesuny $X$ |<-| $Y$
+\:Datové pøesuny $X$ |<-| $Y$
 \:Aritmetické a logické:
 $X$ |<-| $Y \oplus Z, \oplus\in\{|+|, |-|, |*|, |div|, |mod|, \&,
 {\tt\char124}, |<<|, |>>|\}$
-\:Øídící: skok |goto| $Z$, podmínìný skok |if [|$X$ |<| $Y$ |goto| $Z$|]|,
-zastavení programu |halt|
+\:Øídící: skok |goto| $Z$, podmínìný skok |if |$X$ |<| $Y$ |goto| $Z$||,
+zastavení programu |halt|.
 %\<label>
 %\: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
@@ -99,17 +108,21 @@ zastaven
 % øádku. Díky.
 \endlist
 
-\s{Poznámka} (operandy):
+\s{Operandy}:
 \itemize\ibull
 \:Konstanty $(1, 2, \, \dots)$
-\:Adresované pøímo -- |[konst.]| -- budeme pou¾ívat písmena {\tt A-Z} jako aliasy
+\:Adresované pøímo -- |[\<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={\tt [-1]})
-\:Adresované nepøímo -- {\tt [[konst.]]}
+buòky pamìti $-1$ a¾ $-26$ (tedy A={\tt [-1]}), které nazýváme registry a budou nám slou¾it jako promìnné.
+
+\:Adresované nepøímo -- {\tt [[\<konst.>]]}
+
+Mù¾eme se chtít podívat na adresu, kterou máme ulo¾enou v nìjaké buòce (podobnì jako
+pointry v C).
 \endlist
 
-Samotný výpoèet probíhá takto:
+\> Samotný výpoèet probíhá takto:
+
 \algo
 \:Do smluvených bunìk umístíme vstup, obsah zbylých pamì»ových bunìk není
 definován.
@@ -120,43 +133,53 @@ v
 \endalgo
 
 
-\h{Slo¾itost}
-\> Jak dobøe popsat slo¾itost?
+\h{Míry slo¾itosti}
+\> Chceme zavést míru èasové a prostorové nároènosti programù, které budeme øíkat
+slo¾itost.
 \numlist\ndotted
-\:{\I Ram s jednotkovou cenou}: èas $\approx$ \#instrukcí pøi daném
+\:{\I RAM s jednotkovou cenou}: èas $=$ \# instrukcí pøi daném
 vstupu,\break prostor
-$\approx$
-\#bunìk do kterých algoritmus aspoò jednou zapsal bìhem výpoètu.
+$=$
+\# bunìk do kterých algoritmus aspoò jednou zapsal bìhem 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í. Navíc bychom jakýkoliv problém mohli vyøe¹it v
-konstantním èase. Velikost èísel ale omezit nesmíme, proto¾e
-bychom omezili pamì» (èísly ji adresujeme).
-\:{\I 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 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
+velmi dlouhými {\I èísly} -- poøád je to jedna instrukce, tak¾e cena je stejná, ale
+poèítaèe se tak pøece nechovají. Velikost {\I èísel} ale konstantou (tøeba $32$ bitù) omezit nesmíme, proto¾e
+bychom omezili pamì» ({\I èísly} ji adresujeme) a co hùø i mo¾nou velikost vstupu.
+\:{\I RAM s logaritmickou cenou}: cena instrukce $=$ \# bitù
+zpracovávaných {\I èísel},
+prostor $=$ \# bitù v¹ech pou¾itých bunìk. To je teoreticky pøesné, ale
+dost nepraktické (ve v¹ech slo¾itostech by byly spousty logaritmù).
+\:{\I RAM s omezenými {\I èísly}}: jednotková cena instrukcí, ale {\I èísla} omezíme
+nìjakým polynomem $P(n)$, kde $n$ je velikost vstupu. Tím zmizí paradoxy prvního modelu, ale
 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.
+Nadále 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 sumu èasù provedených
-operací, které program provedl pøi zpracování vstupu
-$x$.
+\:{\I Èas bìhu algoritmu} $t(x)$ pro vstup~$x$ mìøíme jako sumu èasù 
+instrukcí, které program provedl pøi zpracování vstupu
+$x$. Pokud se pro daný vstup program nezastaví berme $t(x)=+ \infty$.
 \:{\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$.
+bunìk pou¾itých pøi výpoètu se vstupem~$x$.
+\endlist
+
+Slo¾itost je maximum délky bìhu pøes v¹echny vstupy urèité délky.
+
+\itemize\ibull
+\:{\I Mno¾ina mo¾ných vstupù} $X$
+\:{\I Délka vstupu} je funkce $l:X \rightarrow {\bb N}$
 \:{\I Èasová slo¾itost} (v~nejhor¹ím pøípadì) je:
-$$T(n) := \max \{t(x) ; \hbox{$x$ je vstup délky $n$}\}.$$
+$$T(n) := \max \{t(x) \mid \hbox{$x$ je vstup délky $n$}\}.$$
 \:{\I Prostorová slo¾itost} (v~nejhor¹ím pøípadì) je:
-$$S(n) := \max \{s(x) ; \hbox{$x$ je vstup délky $n$}\}.$$
+$$S(n) := \max \{s(x) \mid  \hbox{$x$ je vstup délky $n$}\}.$$
 \endlist
 
+Podobnì mù¾eme zavést i slo¾itost v nejlep¹ím a prùmìrném pøípadì, ale ty budeme
+pou¾ívat jen zøídka.
+
 \bye