Algoritmy a datové struktury I
Cvičení k přednášce Algoritmy a datové struktury I [NTIN060] v letním semestru 2018/2019.
Probíhá v pátek od 9:00 v T5.
Požadavky na zápočet
- Na každém cvičení bude zadán (alespoň) jeden úkol s odevzdáním do začátku příštího cvičení.
- Na zápočet je třeba dosáhnout 60% celkového počtu bodů z regulérních domácích úkolů.
Co jsme dělali
- 22. 2. 2019
- Rychlé zavedení RAMu, časové a paměťové složitosti. Jak asymptoticky porovnávat funkce a různá zákoutí óčkové notace.
Pár konkrétních úloh.
[Příklady 1-6]
- 1. 3. 2019
- BubbleSort na RAMu, a různé aplikace binárního vyhledávání.
[Příklady 1-5]
- 8. 3. 2019
- Grafy a způsoby jejich reprezentace. Algoritmy BFS, DFS a z nich vycházející klasifikace hran.
Použití prohledávacích algoritmů na příkladech.
[Příklady 1-5]
- 15. 3. 2019
- Hledání mostů a artikulací pomocí DFS. Jak najít topologické uspořádaní DAGu a k čemu všemu se
dá použít.
[Příklady 1-4]
- 22. 3. 2019
- Odvození algoritmu pro rozklad na SSK. Kdy umíme zorientovat graf tak aby byl silně souvislý.
Dijkstrův algoritmus a proč ho nechceme používat na grafech obsahujících záporné hrany.
[Příklady 1-3]
- 29. 3. 2019
- Djikstra, cesty minimalizující rozmanité parametry a přihrádková implementace. Obecný relaxační algoritmus,
Bellman-Fordův algoritmus a Floyd-Warshallův algoritmus. Jak najít záporný cyklus.
[Příklady 1-3, 6-7]
- 5. 4. 2019
- Cvičil Miloš Chromý. Pár dalších aplikací nejkratších cest.
Jarníkův a Borůvkův algoritmus na hledání nejmenší kostry. Aktualizace kostry po změně váhy hrany.
- 12. 4. 2019
- Kontrahující verze Borůvkova algoritmu a její využití na rovinných grafech. Úvod do binárních
vyhledávacích stromů.
[Příklady 1-5]
- 26. 4. 2019
- AVL a (a,b)-stromy. Jak rozšířit vyhledávací stromy o další operace a použití vyhledávacích stromů pro hledání
nejdelší rostoucí podposloupnosti.
[Příklady 1-4]
- 3. 5. 2019
- Princip Rozděl a Panuj, na příkladu Mergesortu jsme odvodili Kuchařkovou větu (Master theorem). Řešení podobných rekurencí
a pár dalších algoritmických příkladů (Karacubův algoritmus násobení, binární vyhledávání, Strassenův algoritmus).
[Příklady 1-2]
- 10. 5. 2019
- Pokračování v rekurzivních algoritmech. Quickselect a Linearselect. Dvojice nejbližších bodů na přímce a v rovině.
[Příklady 1-3]
- 17. 5. 2019
- Opakování třídících algoritmů, třídění polynomiálně velkých čísel. Hešování, hešování s otevřenou adresací,
lineární přidávání.
[Příklady 1-2, 5-6]
- 24. 5. 2019
- Amortizace pomocí přímého upočítání, penízkové metody i potenciálové metody na příkladech nafukovacího pole a skoro vyvážených stromů.
Na závěr pak jeden bonusový problém.
Domácí úkoly
Úkoly odevzdávejte buď osobně před začátkem cvičení nebo pomocí emailu. Pokud je to
alespoň trochu možné, neodevzdávejte prosím přes mail naskenované ruční řešení
(ideálně sázejte v $\LaTeX \text{u}$).
- 1. $\Theta + \Theta$ (do 1.3.) 5b.
- Mějmě funkce $f$, $g$ a $h$ takové že $f(n) \in \Theta(h(n))$ a $g(n) \in \Theta(h(n))$. Dokažte,
že $f(n) + g(n) \in \Theta(h(n))$.
- 2. Odmocnina (do 8.3.) 5b.
- Navrhněte algoritmus na spočítání celočíselné odmocniny z čísla $x$. To je největší $y$
takové, že $y^2 \le x$.
- 3. Uvěznění roboti (do 15.3.) 5b.
- Na vstupu dostanete dvě bludiště, což jsou čtvercové sítě rozměru $r \times s$ se seznamem zdí, kde zdí myslíme hranu mezi dvěma políčky.
V každém z bludišť se nachází jeden robot (polohu dostaneme také na vstupu) a oba reagují na ovladač, kterým jim můžeme posílat povely pro posun o políčko na sever, jih, východ či západ.
Na každý povel reagují oba roboti, robot ignoruje příkaz pouze pokud se ve směru jeho pohybu nachází zeď. Vymyslete algoritmus, který najde nejkratší posloupnost povelů, jež vysvobodí
oba roboty. Ve chvíli kdy robot opustí bludiště, už ho zastavíme a povely dále ignoruje. Časovou a paměťovou složitost vztahujte k rozměrům bludišť, tj. $r$ a $s$.
- 4. $d$-degenerované grafy (do 22.3.) 5b.
- O grafu řekneme, že je $d$-degenerovaný, pokud existuje pořadí odtrhávání vrcholů takové, že každý odtrhávaný vrchol má aktuální stupeň
maximálně $d$. Například stromy jsou 1-degenerované (trháme od listů) a rovinné grafy jsou 5-degenerované. Pro zadaný neorientovaný graf najděte
nejmenší $d$ takové, že $G$ je $d$-degenerovaný. Jde vyřešit v lineárním čase.
- 5. Šetříme na mýtu (do 29.3.) 5b.
- Silnice v mapě máme ohodnocené dvěma nezápornými čísly: délkou a mýtem (poplatkem
za projetí). Jak najít nejlevnější z nejkratších cest?
- 6. Poctivá směnárna (do 12.4.) 5b.
- Směnárna obchoduje s $n$ měnami (měna číslo 1 je koruna) a vyhlašuje matici kurzů $K$.
Kurz $K_{ij}$ říká, kolik za jednu jednotku $i$-té měny dostaneme jednotek $j$-té měny.
Vymyslete algoritmus, který zjistí, zda existuje posloupnost směn, která začne
s jednou korunou a skončí s více korunami.
- 7. Vrcholy v intervalu (do 26.4.) 5b.
- Ukažte jak upravit vyhledávácí strom, aby navíc uměl efektivně provádět operaci
Rank($x$,$y$), která odpoví, kolik vrcholů stromu leží v intervalu $[x, y]$. Složitost
všech operací včetně této by měla být $O(\mbox{hloubka})$.
- 8. Podobný úsek (do 3.5.) 5b.
- V posloupnosti čísel na vstupu najděte nejdelší souvislý úsek, ve kterém je rozdíl libovolných dvou prvků nejvýše $k$.
- 9. Inverze v posloupnosti (do 10.5.) 5b.
- Inverze v posloupnosti $x_1,\ldots,x_n$ říkáme každé dvojici $(i,j)$
takové, že $i<j$ a současně $x_i > x_j$. Vymyslete algoritmus, který spočítá, kolik
daná posloupnost obsahuje inverzí. Cílem je rekurzivní algoritmus pracující v čase
$O(n \log n)$.
- 10. Hledání prvku (do 17.5.) 5b.
- Dokažte že deterministický algoritmus v porovnávacím modelu, který nalezne
zadaný prvek v $n$-prvkové uspořádané posloupnosti, použije v nejhorším případě
$\Omega(\log n)$ porovnání.
- 11. Hešování s počítadly (do 24.5.) 5b.
- Uvažujte hešování s lineárním přidáváním ($f(x) = (h(x) + i) \mod m$).
Každá přihrádka $j$ má navíc počítadlo $c_j$, které určuje
počet prvků v tabulce, pro které platí $h(x) = j$. Jak toto počítadlo využít
a aktualizovat při implementaci jednotlivých operací?
Bonusové domácí úkoly
- 1. Neviditelní roboti (do 29.3.) 5b.
- Stejný problém jako 3. domácí úloha (Uvěznění roboti), s tím rozdílem že neznáme počáteční polohu robotů. Chceme nalézt posloupnost pohybů, která
vysvobodí oba roboty ať už se na začátku nacházeli kdekoliv. Tentokrát postačí nalézt libovolnou takovou posloupnost, ne nutně nejkratší.
- 2. Inverze matice (do 24.5.) 5b.
- Navrhněte algoritmus typu Rozděl a panuj na výpočet inverze trojúhelníkové matice $n\times n$
v čase lepším než $\Omega (n^3)$. Můžete předpokládat, že $n$ je mocnina dvojky.
- 3. Okénkové minimum konstantně (do 28.6.) 5b.
- Vymyslete jak spočítat okénkové minimum (viz. příklad 2) v čase konstantním v nejhorším případě na posun okénka.
Užitečné odkazy