]> mj.ucw.cz Git - ads1.git/commitdiff
Uvod od Karla
authorMartin Mares <mj@ucw.cz>
Thu, 17 Mar 2011 18:49:03 +0000 (19:49 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 17 Mar 2011 18:49:03 +0000 (19:49 +0100)
1-uvod/1-uvod.tex [new file with mode: 0644]
1-uvod/Makefile [new file with mode: 0644]

diff --git a/1-uvod/1-uvod.tex b/1-uvod/1-uvod.tex
new file mode 100644 (file)
index 0000000..abb1594
--- /dev/null
@@ -0,0 +1,162 @@
+\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.
+
+Ø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
+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.
+
+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
+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
+funkce vrátí $m$. Na zaèátek posloupnosti pøidáme $-\infty$ a zavoláme $f(0)$.
+
+Nejhor¹ím pøípadem je rostoucí posloupnost na které na¹e funkce vykoná $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
+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.
+
+\:{\I Pøevédst úlohu na grafovou} je standartní 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
+
+\s{Definice:} Algoritmus
+
+®á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.
+
+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é.
+
+
+
+
+\vskip 6pt
+\line{{\bf Model RAM} \hfil {(zapsal Martin Koutecký)}}
+\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
+koneèná posloupnost instrukcí (také opatøených adresami) následujících druhù:
+\itemize\ibull
+\: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|
+%\<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
+% zápis je správný, ale sází se to divnì a vidím èerný obdélníèek na konci
+% øádku. Díky.
+\endlist
+
+\s{Poznámka} (operandy):
+\itemize\ibull
+\:Konstanty $(1, 2, \, \dots)$
+\: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.]]}
+\endlist
+
+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.
+\:Provádíme program postupnì po instrukcích, dokud nedojdeme k haltu nebo konci
+programu.
+\:Pokud se program nezacyklil, tedy pokud skonèil, ze smluvených bunìk pøeèteme
+výstup.
+\endalgo
+
+
+\h{Slo¾itost}
+\> Jak dobøe popsat slo¾itost?
+\numlist\ndotted
+\:{\I Ram s jednotkovou cenou}: èas $\approx$ \#instrukcí pøi daném
+vstupu,\break prostor
+$\approx$
+\#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
+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 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$.
+\:{\I Èasová slo¾itost} (v~nejhor¹ím pøípadì) je:
+$$T(n) := \max \{t(x) ; \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$}\}.$$
+\endlist
+
+\bye
+
diff --git a/1-uvod/Makefile b/1-uvod/Makefile
new file mode 100644 (file)
index 0000000..3735d8a
--- /dev/null
@@ -0,0 +1,3 @@
+P=1-uvod
+
+include ../Makerules