Studijní texty
Stránka přednášejícího zde
Šikovná knížka sepsaná Martinem Marešem zde a užitečné informace v Grafových skriptech pro pokročilé tady.
Podmínky zápočtu
- Na každém cvičení bude zadána sada úkolů, ze kterých si jeden vyberte a vyřešte. Vyhotovený úkol musíte odevzdat do začátku dalšího cvičení.
- Za úkol je možné získat maximálně 5 bodů. V rámci jedné sady je možné dostat též 5 bodů (i když vyřešíte víc úkolů z dané sady).
- Zápočet je za 3/5 z celkového množství bodů.
- Úkoly odevzdávejte buď přímo na dalším cičení nebo přes mail v textové podobě. Jako předmět použijte "ADS2 - [číslo sady].[číslo úkolu]". Název souboru ve formátu [příjmení] - [číslo sady].[číslo úkolu].)
(ideálně vysázené v $\LaTeX u$. Pokud začínáte s $\LaTeX em$ pak zkuste wysiwyg editor LyX. Další možností je word(libre, microsoft, open).
Aplikace ADS a další zajímavosti:
V tomto seznamu jsou soutěže, ve kterých využijete poznatků získaných v průběhu ADS (a dalších předmětů)
Tyto programovací soutěže probíhají jen jednou ročně:
Pravidelné programovací soutěže a procvičování:
Zajímavé semináře na mff (probíhají oba semestry):
Přůběh cvičení
- 1.10.2019
Úvodní
-
Informace o získání zápočtu a průběhu cvičení.
Zopakování notace $O,o,\ldots$ příklady algoritmů, prohledávání grafu, minimální kostry, datové struktury.
- 8.10.2019
Textové problémy
-
Naivní algoritmus a jeho zlepšení. příklady špatných řetězců, roztace řetězců, společné podřetězce. KMP algoritmus a automat.
- 15.10.2019
Aho-Corrasic
-
Definice a rozbor AC algoritmu, vývpis výskytů přes seznamy, výpis nejdelšího/nejkratšího slova končícího na pozici $i$. Výpis všech slov včetně začátku a konce.
- 22.10.2019
Rabin-Karp, Ford-Fulkerson
-
Rabin-Karp. Definice, hashovací funkce. Pro $k$ jehel stejné délky určete počet výskytů.
FF algoritmus. Zlepšující cesty, proč nefungují. (Ne)nasycené cesty. Složitost na hranách s kapacitou 1, nebo $\mathbb{N,Q,R}$. Maximální toky v sítích s kapacitou ve vrcholech.
- 29.10.2019
Toky v sítích, bipartitní párování
-
Vrcholová $k$-souvislost. Maximální párování v bipartiních grafech. Čemu odpovídá zlepšující cesta v bipartitním grafu.
Jak rozestavět co nejvíc věží na šachovnici $n\times n$ tak aby se žádné dvě neohrožovaly, šachovnice obsahuje voud, přes kterou se věže ohrožují a zdi přes které se neohrožují a na vodě ani zdi nemůžeme věž postavit.
Továrna $T_i$ vyrobí $t_i$ produktů a prodejce $P_j$ má poptávku $p_j$ produktů, zásobování prodejců z továren je dáno bipartitním grafem. Jsou všechny poptávky prodejců uspokojeny?
Algortimus, který najde minimální řez. V síti, ve které mám nalezený maximální tok, zvýším kapacitu jedné hrany o 1, jak naleznu maximální tok v nové síti co nejrychleji?
- 5.11.2019
Goldberg, Dinitz a další
-
Goldbergův algoritmus a jeho důkaz. Může být výška zdroje $h(z)=n-1$? Jednotkový goldberg a jeho složitost.
Od FF přes Edmonson-Karp k Dinitzově algoritmu. Časová složitost. Jednotokové nebo konstantní kapacity.
- 19.11.2018
Komplexní čísla, DFT, FFT.
-
Komplexní čísla a jejich vlastnosti. DFT - definice a jednoduché aplikace. DFT sinu a kosinu a spektrální rozklad.
FFT a násobení polynomů.
Zajímavý odkaz na fourierovy transformaci zde.
- 26.11.2019
Hradlové sítě
-
Definice, počet různých booleovských funkcí na $n$ proměnných, redukce $k$ árního OR na binární OR.
Maximální velikost hradlové sítě pro libovolnou funkci je $O(2^n)$ a hloubka $O(n)$. Minimální velikost je $\Omega(n^k)$.
Libovolnou funkci lze reprezentovat pomocí sítě s AND, OR a NOT. Dokonce nám stačí NAND. Čistě XOR ne.
Libovolnou síť s $k$ árníma hradlama lze převést na obvod využívající jen binární AND, OR, NOT a se zpomalením $\log(k)\times$ a zvětšením $k\times$.
- 3.12.2018
Třídící sítě
-
Komparátorové sítě. Komparátor pro binární hradla a abecedu.
Komparátorové sítě pro bubble sort, insert do setřízné posloupnosti, findMax, insertsort.
Třídění sléváním, bitonická slévačka, Batcher's merge. Setřídění fixní posloupnosti s obousměrným komparátorem.
Hradlová síť pro násobení v $\log(n)$ hloubce. Mod(k).
- 10.12.2018
NP
-
Kódování vstupu.
Optimalizační a rozhodovací úlohy.
Jak mezi nimi přecházet.
Třídy P a NP, polynomiální převoditelnost, NP-úplnost, NP-těžkost.
Převod mezi problémy: SAT a 3-SAT, klika a Nezávislá množina, SAT a 3-barvení, HK a TSP.
- 17.12.2018
Co s NP
-
Ještě trochu převodů: Batoh, batoh s cenama, loupežníci, soustava celočíselných rovnic.
Brute force.
Speciální případy: 2-barvení, 2-SAT, NzMn na stromech.
Aproximace: 2 aproximace VP,.
Číselné problémy: Batoh (s cenama), loupežníci.
Úkoly
- 1. Úkol (do 15.10.2019 17:21)
- Hledání v textu (Zadání, popis řešení, pseudokód, složitost, správnost)
- Napište algoritmus, který na vstupu dostane řetězec S a číslo k. Na výstupu algoritmu chceme řetězec rotovaný o k pozic(řetězec na pozici k rozřízneme a přilepíme začátek za konec). Algoritmus by měl běžet v čase O(|S|). Zároveň můžete využít jen pole, ve kterém je vstupní řetězec zapsán a O(1) pomocné paměti.
-
Najděte nejdelší prefix slova který je zároveň jeho suffixem.
- Pěstovaný strom říkejme zakořeněnému stromu, jehož hrany k synům mají v každém vrcholu určené uspořádání zleva doprava. Strom se osekáva tak, že si vybereme kořen podstromu, vše mimo podstrom odstraníme a pak ještě můžeme odseknout některé hrany zleva a zprava v kořeni (zbyde tedy souvislý úsek hran z kořene podstromu dolů a podstromy, které pod nimi visí). Jak zjistit o dvou pěstovaných stromech, zda lze jeden získat osekáním druhého? (lineární čas)
- 2. Úkol (do 29.10.2019 10:41)
- AC
- Sestavte vyhledávací automat Aho-corrasickové pro slova: Milivoj, Milena, Vojen, Milan, Amil, Amis, Alenka, Jan, Jana, Janata, Lenka.
- Pro slovník $(S_1,\ldots,S_k)$ určete počet výskytů jednotlivých slov v textu $T$. Časová složitost $O(T+\sum S_i)$ a není tedy závislá na počtu výskytů (nelze použít Aho-Corasic algoritmus přímočaře).
Pseudokód, textový popis řešení, časová složitost, správnost.
- 3. Úkol (do 29.10.2019 17:21)
- Rabin-Karp. Toky v sítích
- Použitím Rabin-Karpa najděte všechny výskyty matice $m\times m$ v matici $n\times n$.
- Máte BlackBox algoritmus, který pro dva vrcholy $u,v$ zjistí, zda mezi nimi vede $k$ hranově disjunktních cest. (FF algoritmus s časovou složitostí $O(k(m+n))$.
Pomocí tohoto algoritmu zjistěte zda je neorientovaný graf $G$ hranově $k$-souvislý. (Graf je hranově $k$-souvislý pokud mezi každými dvěma vrcholy vede $k$ hranově disjunktních cest.)
Váš algoritmus nemá dostatek času na to, aby zavolal $\Theta(n^2)$ krát náš BlackBox algoritmus. Časová složitost hledaného algoritmu je tedy $o(n^2k(n+m))$.
- Navrhněte algortimus, který pro graf $G$ a dva vrcholy $u$ a $v$ nalezne a vrátí $k$ hranově disjunktních cest. FF algoritmus na hledání maximálního toku v síti popisovat nemusíte. Určete časovou složitost vašeho algoritmu.
- 4. Úkol (do 5.11.2019 17:21)
- Toky v sítích (použijte toky)
- Domino. Máme šachovnici $n\times n$ s dírama. Navrhněte algoritmus, který zjistí zda lze takovouto šachovnici pokrýt kouskama domina. Kousek domina zakryje vždy dve sousední políčka, žádné dva kousky domina se nesmí překrývat a domino nesmí zakrývat díru ani přečuhovat z okrajů.
- Změna sítě. Mějme síť $S=(V,E,z,s,c)$ s celočíselnými kapacitami a její maximální tok $F$. Novou síť $S'=(V,E',z,s,c')$ získáme tak, že pro jednu libovolnou hranu $e\in E$ snížíme její kapacitu o 1, tedy $c'(e)=c(e)-1$. Navrhněte algoritmus, který upraví tok $F$ v $S$ na maximální tok $F'$ v síti $S'$ v čase $O(|V|+|E|)$.
- Minimini řezy. Pro síť $S=(V,E,z,s,c)$ nalezněte řez minimální kapacity, který obsahuje minimální počet hran.
- 5. Úkol (do 19.11.2019 17:21)
- Goldberg, Dinitz a ti další
- Malý goldberg.Na začátku Goldbergova algoritmu nastavíme výšku zdroje na $h(z)=n-i$. Dokažte pro jaká $i\in\{2,3,4\}$ Takto upravený algoritmus vrátí po skončení maximální tok. (Pokud nevrátí, tak je nejlepší uvést protipříklad.)
- Omezený Dinitz.Mějme síť $S=(V,E,z,s,c)$, kde pro všechny hrany platí $c(e)\leq K$, pro pevně zvolenou konstantu. Jakou časovou složitost bude mít Ditintzův algoritmus na takovéto síti. (Jak rychle jste schopni udělat čištění sítě? V řešení můžete brát v potaz základní verzi, která běží v $O(mn^2)$.)
- Meč na Karpa. Edmonson-Karpův algoritmus funguje téměř stejně jako FF algoritmus, ale při výběru zlepšující cesty vybírá tu nejkratší (počet hran).
Tento algoritmus má časovou složitost $O(m^2n)$ a narozdíl od FF najde řešení i pro síť s reálnými kapacitami.
Postavte síť na které ukážete, že i s tímto zlepšením potřebujeme hledat zlepšující cestu i "proti směru" hran?
- 6. Úkol (do 26.11.2019 17:21)
- DFT, FFT
- Troška 4 počítání. Spočítejte fourierovy obrazy následujících vektorů: $(1,0,1,0,\ldots,1,0),(k,k,\ldots,k),(\omega^{kj})_{j=0,\ldots,n-1},(\sin(2jk\pi/n))_{j=0,\ldots,n-1}$.
Všechny vektory jsou délky $n$, $k$ je přirozené číslo. Součástí řešení je správný výsledek a výpočet jak jste se k tomu výsledku dostali.
- Kufříky a kódy.Máme $n$ generálů a každý z generálů dostane kufřík s nějakým číslem $k_i$. Chceme zašifrovat zprávu $N$ tak, že méně než $k$ generálů není schopna jednoznačně dešifrovat zprávu $N$ a pokud se sejde alspoň $k$ generálů tak už jednoznačně dešifrují zprávu.
(Při dešifrování generálové musí zjistit kolik jich je potřeba pro úspěšné dešifrování.)
Jak to generálové provedou? Popište i jak budou šifrovat a dešifrovat.
Jak dlouhá může být zpráva kterou chceme zašifrovat a co může obsahovat? (Můžete začít s tím, že $N$ je nějaké vhodné číslo.)
- Symetrie asi metrie.Dokažte, že DFT reálného vektoru je antisymetrický vektor a DFT antisymetrického vektoru je reálný vektor. ($y$ je antisymetrický iff $y_j=\overline{y_{n-j}})$.)
- 7. Úkol (do 3.12.2019 17.21)< /dt>
- Hradlové sítě
- Norníci. Dokažte, že libovolnou booleovskou funkci lze reprezentovat jen pomocí binárních hradel NOR.
- Odčítání hradlu. Navrhněte hradlovou síť která realizuje odčítání dvou $n$ bitových čísel $x$ a $y$ hloubky $O(n)$ a s $O(n)$ hradly. Hloubku sítě i počet hradel odhadněte přesně (i na konstanty).
Síť může používat jen binární booleovská hradla AND, OR, unární hradlo NOT a konstanty 0 a 1. (Pro zlehčení můžete používat binární booleovské funkce, které umíte pojmenovat.)
- 8. Úkol (do 10.12.201 17:21)
- Třídící sítě
- Mějme následující algoritmus
BMERGE$((x_0,\ldots,x_{n-1}),(y_0,\ldots,y_{n-1}))$
Vstup: Setřízené posloupnosti $(x_0,\ldots,x_{n-1})$ a $(y_0,\ldots,y_{n-1})$, $n=2^k$ pro nějaké $k\in\mathbb{N}$.
- $n\leq 2$ vyřešíme triviálně.
- $(a_0,\ldots,a_{n-1})\leftarrow BMERGE((x_0,x_2,\ldots,x_{n-2}),(y_0,y_2,\ldots,y_{n-2}))$
- $(b_0,\ldots,b_{n-1})\leftarrow BMERGE((x_1,x_3,\ldots,x_{n-1}),(y_1,y_3,\ldots,y_{n-1}))$
Výstup: $(a_0,\min(a_1,b_0),\max(a_1,b_0),\min(a_2,b_1),\max(a_2,b_1),\ldots,b_{n-1})$.
(a) Dokažte, že algoritmus vrátí setřízenou posloupnost a ukažte, jak se vyřeší triviální příklad $n\leq 2$.
(b) Zapište algoritmus ve formě třídící sítě.
- Binární komp.
Navrhněte síť s binárními hradli a binární abecedou realizující komparátor dvou čísel.
Tedy hradlou síť, která má jen binární hradla a na vstupu dostane dvě čísla $x,y$ v binárním zápisu délky $n$ a na levém výstupu bude binárně zapsané $min(x,y)$ a na pravém výstupu $max(x,y)$.
- Celý Log.
Navrhněte síť která na vstupu dostane binární zápis čísla $n$ a na výstupu bude $\lfloor \log n\rfloor$
- 9. Úkol (do 17.12.2019 17:21)
- NP
-
Uvažme následující tři problémy:
- $HC(G)=1$ právě tehdy když existuje hamiltonovská kružnice v $G$, tedy kružnice, která obsahuje všechny vrcholy grafu $G$.
- $HP(G)=1$ právě tehdy když existuje hamiltonovská cesta v $G$, tedy cesta, která obsahuje všechny vrcholy grafu $G$.
- $HP_{uv}(G,u,v)=1$ právě tehdy když existuje hamiltonovská $uv$-cesta, tedy cesta z $u$ do $v$, která obsahuje všechny vrcholy $G$.($u$ a $v$ jsou krajními vrcholy cesty.)
Dokažte všechny tři problémy jsou mezi sebou převoditelné.
-
Vrcholové pokrytí grafu $G$ je množina vrcholů taková, že každá hrana je incidentní alespoň jednomu vrcholu z pokrytí. Rozhodovací verze: hledáme množinu vrcholů velikosti maximálně $k$ která je vrcholovým pokrytím grafu G.
Dokažte jeho NP-úplnost. (Nezávsilá množina i Klika jsou NP-úplné.)
- 10. Úkol (do 7.1.2020 17:21)
- Co s NP
-
Vrcholky stromů.Dokažte, že problém vrcholového pokrytí na stromech je v P.
-
Hladoví loupežníci. Pokusíme se řešit problém dvou loupežníků hladovým algoritmem. Probíráme předměty od nejdražšího k nejlevnějšímu a každý dáme tomu loupežníkovi,
který má zrovna méně. Je nalezené řešení optimální?
-
Problém tří loupežníků. Je dána množina předmětů s cenami, chceme ji rozdělit na
3 části o stejné ceně. Navrhněte pseudopolynomiální algoritmus.