From: Martin Mares Date: Thu, 24 Mar 2011 18:25:00 +0000 (+0100) Subject: Uvod: Korektury od Karla X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=aaad3d11735147b9fb0dcc9358a31ef50e4ab3c9;p=ads1.git Uvod: Korektury od Karla --- diff --git a/1-uvod/1-uvod.tex b/1-uvod/1-uvod.tex index abb1594..aab035d 100644 --- a/1-uvod/1-uvod.tex +++ b/1-uvod/1-uvod.tex @@ -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 \$(x, y)$ a dotaz \: +\($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 \$(x_j, f(j))$ a \($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|. %\