Info
- Kontakt: blazeva1 (na) fit.cvut.cz
- Konzultace: Po domluvě emailem
- Kde mě najdete: A-1256 (pá NB 341b)
AG1 pro paralelky 106 (16:15) a 107 (18:00). Body za aktivitu budou za domácí úkoly (max 5b).
Zde bude seznam probrané látky a úkoly do dalšího cvičení.
Úkoly pošlete mailem nebo doneste vypracovené na papíře. Opravené budou další týden. Bodované jsou pouze aktuální úkoly – ty se každý týden chvíli po cvičení obměňují.
Body (max 5) <- dostupné pod fit.čvut účtem
Aktuální seznam úkolů
Tyto úlohy lze odevzdávat i ve zkouškovém, posílejte mailem:
- (1.5b) Navrhněte, dokažte správnost a zanalyzujte časovou a paměťovou složitost algoritmu řešící následující úlohu: Mějme DAG ↗ G a v něm označený zdroj Z a stok S. Pro každý vrchol zjistěte, kolik existuje různých cest ze Z do S, které vedou přes onen vrchol.
- (0.5b) Upravte Bellman-Fordův algoritmus tak, aby uměl detekovat záporný cyklus v grafu.
- (1.0b) Mějme graf, reprezentující železniční síť české republiky. Na hranách jsou definovány vlakové spoje s časy, kdy je možné po hraně přejet. Spoj má čas výjezdu a čas příjezdu (v minutách). Navrhněte algoritmus, který pro zadaný graf a spoje zjistí nejnižší čas, kdy se dokážeme z města A dostat do města B pouze pomocí vlakových spojů. Začínáme v čase 0:00 a pokud nestihneme přijet do 23:59, tak je výstupem chyba.
- (0.5b) Mějme pole s N čísly. Jak lze v $O(1)$ zodpovídat querry, které se ptají na součet prvků v rozsahu indexů A až B (A<B)?
- (0.8b) Navrhněte algoritmus, který zjistí nejmenší počet palindromických kusů, na které lze rozdělit zadaný řetězec. Např. abbabb lze rozdělit na abba, bb, což jsou oba palindromy a zároveň je to nejmenší počet kusů.
- (0.8b) Navrhněte algoritmus, který dokáže v BVS rychle zjistit jestli ve stromě existuje podstrom, který má přesně K listů. Strom by měl zvládat insert (klasickým BVS způsobem) a zodpovězení definované otázky.
12. cvičení
Kostry a nejkratší cesty, Unioin-Find algoritmus
Probrané úlohy
- Jak definovat kostru pro nesouvislé grafy?
- Jak se liší kostra G a G-e?
- Jak najít druhou nejmenší kostru?
- Jak se použije Union-Find (aneb. Disjoint Set Union) v implementaci Kruskala?
- Jak rychle hledat kostru grafu s omezenýma váhama, třeba 1 až 5? (pro Kruskala i Jarníka)
- Vypište všechny hrany, pro které existuje nějaká nejkratší cesta ve které jsou. Nejkratší cesty bereme mezi vrcholy s a e na váženém grafu G.
11. cvičení 12.12.2017 (vedl Peter a Tom)
Dynamické programování
Probrané úlohy
- počet cest mezi N městy (iterativně, DP)
- dláždění plochy $N \times 2$ pomocí různých bloků
- DP na nejdelší cestu ve stromě
- Longest Increasing Subsequence (LIS) v čase $O(n \log n)$
- LIS s jedním poklesem (lze zobecnit na až k poklesů)
- hledání nejdelšího palindromu v řetězci
- rychlé mocnění pomocí metody square multiply
Úkoly
- (0.4b / AC) [zůstává z minula] Pokud radši implementujete, tak naprogramujte úlohy z CF #447 ↗, pak mi napište username a dostanete 0.4b za jednu přijatou úlohu.
10. cvičení 5.12.2017 (semestrální test)
9. cvičení 28.11.2017
Hešování, Řazení
Probrané úlohy
- Rozptylování (hešování) a vyhledávací tabulky - hešování stringů a hledání kolizí, mazání náhrobkem a proč je potřeba
- Algoritmus na zjištění duplikátů v N prvkovém poli.
- řazení - CountingSort, RadixSort, řazení řetězců, hledání prvku v uspořádaném 2D poli
Úkoly
- (0.8b) Navrhněte algoritmus, který rychle najde maximum v poli. Prvky v poli tvoří konkávní posloupnost – tedy v poli je právě jedno maximum a pro ostatní prvky platí, že je prvek menší než jeden jeho soused. Analyzujte složisost.
- (1.2b) Mějme dlouhý kabel, ze kterého na obou koncích čouhá $n$ optických vláken. Na jednom konci můžeme do jednotlicých vláken zapojit světlo tak, že na druhé straně budeme moci naměřit jestli se do kabelu svítí nebo ne. Zapojení i měření musíme dělat ručně a konce tohoto kabelu jsou daleko od sebe. Kolikrát musíme mezi konci přejít, abychom zjistili které konce vláken patří ke stejným vláknům. (např. zasvícením do jednoho zjistíme s jistotou jeden, ale to je pomalé)
8. cvičení 21.11.2017
Rekurzivní algoritmy a metoda Rozděl a panuj
Probrané úlohy
- hanojské věže - proč je $2^n-1$ optimální, řešení pokud nemůžeme přesouvat mezi dvěma z kup přímo
- řazení spojového seznamu
- zjišťování špatných vstupů quick sortu pro danou volbu pivota
- počítání inverzí pomocí úpravy merge sortu
- rychlé násobení (Karatsuba)
Úkoly
- (0.5b) Ukažte, že následující kód negeneruje náhodnou permutaci.
Kód:
for i = 0; i < n; ++i:
x = rand() mod n
swap(a[i], a[x])
- (0.5b) Mějme dvojté hashování s hashovací funkcí: $h(k,i)=(k + i,h_2(k)) \bmod 11$; kde $h_2(k)=2+k \bmod 3$; vložte do hashovací tabulky (s velikostí jedenáct) prvky 2,4,6,12,11,42 a 46
- (0.5b) najděte alespoň 2 hodnoty, pro které (u předchozí úlohy) platí, že budou mít stejnou fci $h$ i $h_2$ jako číslo 13?
7. cvičení 14.11.2017 (vedl Radovan)
AVL, pravděpodobnost
Probrané úlohy
- Insert, Delete AVL
- Náhodné generování čísla $1-N$ s uniformní pravděpodobností pomocí férové mince.
- Generování náhodné permutace čísel $1,\dots,N$ tak, že každá z $N!$ permutací má stejnou pravděpodobnost.
- DK věty o opakování jevu
Úkoly
- (1.0b) Zjistěte jestli se pošle vyvažovací signál výše, a jaké příznaky budou v AVL po vymazání nějakého prvku z levého podstromu vrcholu X, pokud X měl příznak (+) a jeho pravý syn (Y) měl příznak (-). (rozeberte případy)
- (0.5b) Jak z velikého souboru vybrat náhodně jednu řádku? Předem nevíme kolik má soubor řádek. Soubor se nevejde do pracovní paměti. Každá řádka má nakonec mít stejnou pravděpodobost výběru.
- (0.5b) Jak z velikého soboru vybrat K náhodných řádek tak, aby každá měla stejnou pravděpodobnost? (opět nemůžeme soubor načíst celý a neznáme jeho délku)
6. cvičení 07.11.2017
Binární haldy ↗, Binomiální haldy ↗, BV stromy ↗, AVL stromy ↗
Probrané úlohy
- opakování binomiálních hald - extract min, merge, decrease, delete, increase value (z úkolu)
- úkol - Jak zakódovat aritmetický výraz se závorkami a operacemi $+,-,\times,/$ do stromu. Algoritmus, který strom se zakódovaným výrazem zderivuje.
- pre,in,post-order průchody stromu
- BVS ↗, následník, složitost průchodu
- Algoritmus, který vyváží BVS v $O(n)$. Vylepšení, které udrží BVS vyvážený amortizovaně v $O(\sqrt{n})$.
- Vyvažované stromy - AVL ↗, vyvažovací rotace
5. cvičení 31.10.2017
amortizovaná analýza, binární haldy, heap sort
Probrané úlohy
- úkoly z minula, hlavně vážení kuliček
- mocnina matice sousednosti A (v mat. je $A_{a,b}=1$ pokud vede hrana z a do b, 0 jinak) na K, nová matice $A^K$ vyjadřuje počet různých sledů z vrcholu a do b
- nafukovací pole účetní metodou
- increase bin. čísla přímým výpočtem
- sloučení k seřazených posloupností v $nk \log(k)$
- nakreslit binární haldu veliksoti 51
Úkoly
- (0.5b) Zanalizujte amortizovanou složitost simulace fronty pomocí dvou zásobníků. (pushuje se do 1. zásobníku, pulluje se z 2. zásobníku, když je 2. prázdný, tak se všechny prvky postupně přesunou z 1. do 2. zásobníku.)
- (1.0b) Navrhněte, jak zakódovat aritmetický výraz se závorkami a operacemi $+,-,\times,/$ do stromu. Ukažte algoritmus, který strom se zakódovaným výrazem zderivuje.
- (0.5b) Nakreslete binomiální haldu s 42 prvkama.
- (0.5b) Navrhněte operaci increase value prvku binomiální haldy (máte pointer a novou hodnotu) v $\log n$. Pamatujte, že nelze procházet všechny syny, páč jich je moc, a nevyšla by dobrá složitost.
4. cvičení 24.10.2017
topologické uspořádání, sqrt dekompozice, řazení ↗
Probrané úlohy
- kulhavý kůň, extrémní počty hran v grafu s c komponentami
- Běžci si pamatují některé, kteří doběhli před nimi, je možné rekonstuovat jednoznačné pořadí pouze z této informace?
- hledání topologického uspořádání pomocí odřezávání listů
- počet topologických uspořádání v orientovaném $K_n, K_{n,n}, n \times C_4$
- Jak rychle najít k-tý nejmenší prvek v neseřazeném poli?
- Hledání sqrt(n) nejmenších prvků v čase O(n)
- binární haldy ( postavení v O(n) ), heap sort
Úkoly
- (0.5b) vyberme hranu e z grafu G, existuje vždy kostra taková, že obsahuje hranu e?
- (0.5b) jaká je (maximální) délka nejkratší cesty mezi libovolnými uzly $u,v$ v grafech: $K_n, K_{n,m}, C_n, $
- (1.0b, 30% funkční, 60% rychlý, 100% optimální) Mějme graf G se startem a cílem ve kterém má každá hrana danou nosnost. Ve startu stojí nákladní vůz k neomezenou kapacitou. Jak těžký náklad lze na nákladní vůz naložit tak, aby se dostal do cíle po hranách s větší nostností, než je váha jeho nákladu?
- (1.0b) Mějme rovnoramenné váhy, které umí rozhodnout která hromada kuliček je těžší.
- Na kolik vážení zjistíme, která z devíti kuliček je těžší?
- Na kolik vážení to lze pro 12 kuliček, a proč to nejde pouze na 2?
- Co když není jedna z kuliček těžší, ale má jinou váhu (je tedy buď těžší nebo lehčí)? Kolik vážení je potřeba pro 13 kuliček?
- (0.5b) Jaké řazení pole délky n použijeme, pokud prohození prvků trvá $O(n)$? Analyzujte složitost, porovnejte s dalšími algoritmy řazení.
3. cvičení 17.10.2017
symetrizace, zdroj, stok, izolovaný vrchol, silná souvislost ↗, stromy (zakořeněné), DFS, BFS, kostry, vzdálenost vrcholů
Probrané úlohy
- vlastnosti stromů (souvislý, bez cyklů)
- omezení počtu listů (2 – n-2) a extrémní grafy, dolní mez $|L| \geq \Delta(T)$
-
listů pro zadaný počet vnitřních vrcholů a jejich stupňě
-
vnitřních uzlů pro zadaný počet listů a stupeň je $\frac{l-2}{d-2}$
- počet koster grafů $P_n, T, K_n, K_{1,n}, C_n, K_{2,n}$
- jak v DFS
- vypsat cestu ze startu do cíle?
- spočíst souvislé komponenty?
- jak v BFS
- zjistit nejmenší vzdálenost vrcholů?
- najít nejkratší cestu?
Úkoly
- (0.5b) nejvyšší / nejnižší počet hran G s n vrcholy a c komponentami
- (0.5b) počet koster $K_{2,n}$
- (1.0b) Mějme mřížku NxN, některá políčka jsou dostupná a jiná jsou zdi. Na mřížce máme figurku ‘kulhavého koně’. Kůň začíná na políčku s a chceme dojít na políčko e. Kulhavý kůň se pohybuje každý lichý krok jako kůň, a každý sudý krok jako král. Navrhněte algoritmus, který najde nejkratší (nejméně pohybů) cestu tohoto koně z s do e.
- (0.5b) Máme 3 nádoby, které mají kapacity A, B a C. Navrhněte algoritmus, který zjistí jak odměřit D litrů? (nelze zloušet od oka, lze pouze nádoba naplnit, vylýt, přelít apod.)
2. cvičení 10.10.2017
slabá ↗ souvislost, indukovaný podgraf, isomorfismus
Probrané úlohy
- Jsou každé dva $(n-2)$-regulární grafy izomorfní (|V|=n, n>1)?
- Graf obsahující kružnici jako podgraf obsahuje i indukovanou kružnici jako podgraf.
- Existuje nesouvislý graf G, který má nesouvislý doplněk?
- Grafy jsou isomorfní právě tehdy pokud jsou jejich doplňky izomorfní.
- Kolik existuje různých cest délky M uvnitř kliky $K_n$ nebo v bipartitním grafu $K_{n,n}$?
Úkoly
- (0.5b) Dokažte nebo vyvtaťte, že v oritentovaném grafu se vstupním i výstupním stupni >= 1 vždy existuje orientovaný cyklus.
- (0.5b) Kolik existuje $C_4$ na 4-partitním grafu $K_{n,n,n,n}$?
- (0.5b) Kolik existuje různých cest délky M mezi uzly x a y uvnitř kliky $K_n$ nebo v bipartitním grafu $K_{n,n}$?
- (0.5b) Určete (nakreslete) všechny indukované podgrafy kliky $K_5 - e$ (K5 bez hrany).
- (0.5b) Určete (nakreslete) všechny (neizomorfní, tzn. prostě všechny) podgrafy kliky K4.
1. cvičení 03.10.2017
podmínky zápočtu ↗, vrchol, hrana, stupeň, soubor stupňů, princip sudosti, regularita
Probrané úlohy
- Kolik vypíše program hvězdiček?
- Seřadit funkce podle asymptotické složitosti ($n \log n$, $2^n$, $n^2$, $\sqrt{n}$, $n!$, $\log^2 n$, $\log {\sqrt{n}}$, $\sqrt{\log{n}}$, $n^{21}$)
- házení teleportéru a hledání smrtící hranice (jedno, dvě, N)
- formální zápis grafu $G=(\{1,2,3\},\{\{1,2\},\{2,3\}\})$
- Pro která n existuje graf, ve kterém má každý vrchol jiný stupeň? (nelze)
- Pro která n existuje graf, ve kterém má každý vrchol jiný stupeň, kromě dvou, které mají stejné? (konstukcí)
- Jsou každé dva $(n-1)$-regulární grafy izomorfní (|V|=n, n>0)? (ano, jsou to kliky)
- podmínky isomorfismu ↗ (#uzlů, #hran, stupně, sousedi, …)
Úkoly
foo(q)
for i := 1 to q do
print(#)
foo2(N)
for i := 1 to N do
foo(i)
j=1
while j<=N do
foo(j)
j=j*2
- (1.5b) Kolik se vypíše znaků # pro výše uvedený program při zavolání funkce foo2?
- (0.5b) Kolik hodů perlou potřebuju, abych zjistil pozici bariéry, pokud mám jen tři perly?
- (0,5b) Pro jaká N lze sestrojit graf, ve kterém mají pouze dva uzly stejný stupeň?
- (0.5b) Navrhněte dvojici grafů, každý s alespoň šesti vrcholy, které nejsou isomorfní, ale mají stejný soubor stupňů.
- (0.5b) Zjistěte počet automorfismů pro kliku o šesti vrcholech, ze které jsme odebrali dvě hrany, které spolu nesousedí (tj. hrany bez společného uzlu), zkuste zobecnit na kliku s N vrcholy bez dvou hran.
- (1.0b) Lze rozložit úplný graf $K_n$ (n je sudé) na sjednocení hranově disjunktních 2-regulárních grafů?