Cvičení z předmětu Algoritmy a datové struktury II (NTIN061) k přednáška Luďka Kučery (stránky přednášky).

Kontakt:

Pro účely cvičení mě můžete kontaktovat na emailu setnicka+ads@kam.mff.cuni.cz (usnadní mi to třídění pošty a zrychlí čas na odpověď), nebo můžete použít jinou metodu ze stránky s kontakty. Nebo mě někdy prostě odchyťte na chodbě :-)

Kdy a kde:

Cvičení se konají každé pondělí od 9:00 v učebně S10.

Zápočet:

V průběhu semestru se budou objevovat (převážně teoretické) domácí úkoly, za které bude potřeba získat alespoň 100 bodů. Úloh bude vypsáno alespoň za 150 bodů, možná i více. Další body navíc půjde získat i za hezký zápočtový program nebo aktivitu během cvik.

Druhou podmínkou je vypracování zápočtového programu, který bude nějak implementovat či používat některou z technik odpřednesených na přednášce. Téma se mnou nejdřív konzultujte, abyste nedělali něco moc těžkého, nebo naopak něco, co nepůjde uznat za zápočet.

Detaily k zápočťákům

Detaily k zápočťákům jsme domlouvali zhruba v půlce listopadu, zde jsou shrnuty hlavní body:


Nápady na zápočťáky

Nejlepší je samozřejmě přijít s vlastním nápadem (a ideálně na něco, co se použije nejenom pro získání zápočtu, ale bude třeba součástí něčeho většího).

Mnoho inspirace můžete čerpat třeba z nápadníčku Martina Mareše, další průběžně doplňovaná inspirace níže. Pokud byste vážně nevěděli, co psát, tak se ozvěte a něco vymyslíme :-)

Téma volte tak, abyste nad ním strávili ideálně ne o moc déle, než tak dvě odpoledne. Mají to být relativně malé zápočťáky :-)

Získané body:

Jméno Úkoly Bonusy Bodů Zápočťák Zápočet
0xCCvyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), lehatka(12), opetTanecni(10), adventOfCode(9)
  • Aktivita na cviku: 3 (3)
100Visibility polygonOK
aaavyvazeni(7), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), fourier(12), koef(10), kompresor(8), linie(9)102Disjunktní cestyOK
ameSakvEvyvazeni(10), zebrik(9), rymy(10), 1984(17), opetTanecni(10), lehatka(12), koef(10), fourier(12), kompresor(8)
  • Aktivita na cviku: 3 (3)
101Vyhledávání v textu s překlepyOK
Anaesimvyvazeni(10), zebrik(10), rymy(10), lehatka(5), linie(13)48--NE
Bartolomejvyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), fourier(12), adventOfCode(1), opetTanecni(10)
  • Aktivita na cviku: 6 (3+3)
105Segmentace obrazu pomocí řezůOK
Brokovyvazeni(10), zebrik(7), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), koef(10), adventOfCode(7), kompresor(8)
  • Aktivita na cviku: 6 (3+3)
104FFT násobeníOK
ChliebAVinovyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), opetTanecni(12), dinic(5), koef(5), fourier(6), linie(13), anketa(5)
  • Hezký zápočťák: 10
112Porovnání algoritmů na minimální kostryOK
jakubvyvazeni(10), zebrik(7), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), fourier(12), linie(13), metr(10)108Násobení polynomů pomocí FFTOK
Lord Ovenmittvyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), fourier(9), koef(10), linie(13)1081984OK
mvyvazeni(10), zebrik(10), rymy(10), 1984(16), koef(10), fourier(8), adventOfCode(6), minK(8), anketa(5)83--NE
Michalvyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), fourier(12), kompresor(8), linie(13)
  • Hezký zápočťák: 10
119Applet na DiniceOK
PetoKvyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), fourier(12), koef(10), opetTanecni(10)
  • Aktivita na cviku: 3 (3)
101Aho-CorasickOK
Pomalostvyvazeni(10)10--NE
Pooper Doopervyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), fourier(12), koef(10), linie(13)101Knihovna pro Dinicův algoritmusOK
Silevonvyvazeni(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), metr(10), linie(13), lehatka(9), kompresor(4)102Aho-CorasickOK
swacovyvazeni(10), zebrik(7), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), kompresor(8), linie(13), fourier(12)106Dinicův algoritmusOK
Zelívyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), fourier(12), linie(8), adventOfCode(10)
  • Hezký zápočťák: 20
126FFT ekvalizérOK

Studijní materiály


Na některé materiály se budu odkazovat u jednotlivých cvičení – ADS nebo KSP v závorce značí, kam materiály odkazují.

Rozvrh cvičení (aneb co jsme dělali a co se chystá):

3.10. Úvodní cvičení
Opakování minulého semestru a věcí z ASD I:
  • Počítání celočíselné odmocniny, hledání dvou čísel s daným součtem
  • Nejdelší úsek bez opakování (lidi a města)
  • Grafy – test stromu a bipartitnosti
  • Vyvažování vyhledávacích stromů
  • Eulerův tah pomocí DFS
Úkoly: vyvazeni, zebrik
10.10. Vyhledávání v textu:
  • Zopakování KMP z přednášky
  • Sufixy a prefixy
  • Triviální přístupy a vstupy, které je rozbíjejí
  • Zjištění, jestli je jeden text rotací druhého
  • Vznikl text opakováním nějakého kratšího? Hledání stejného prefixu a sufixu.
  • Hledání možných výskytů jehly v zašifrovaném textu (substituční šifra)
Studijní materiály: Hledání v textu(KSP)
17.10. Vyhledávání v textu podruhé:
  • Konstrukce automatu pro KMP – zpětné hrany
  • Hledání více slov a příklad, kdy výstup je větší, jak velikost jehel a sena dohromady
  • Aho-Corasick – zavedení, základní pojmy
  • Aho-Corasick – důležitost zkratkových zpětných hran, jejich konstrukce a kdy se to bez nich rozbije
Úkoly: rymy, 1984 Studijní materiály: Vyhledávání v textu(ADS)
24.10. Hledání minimálních koster a toky v sítích:
  • Minimální kostry – pojmy
  • Řezové lemma a jeho špatná varianta (Neplatí, že kostru zkonstruuji tak, že vezmu nejlehčí hranu z řezu plus kostry v obou komponentách – v kostře totiž může být více hran z řezu.)
  • Ford-Fulkersonův algoritmus (hledání zlepšujících cest)
  • Nekonečný příklad na Ford-Fulkersonův algoritmus s reálnými kapacitami (dokonce konvergující k úplně špatnému výsledku)
  • Párování párů v tanečních (pomocí toků)
  • Umisťování věží na děravou šachovnici tak, aby se neohrožovaly (opět pomocí toků)
Studijní materiály: Minimální kostry(ADS), Minimální kostry(KSP),
31.10. Pokračování v tocích v sítích:
  • Zopakování Dinicova algoritmu – vrstevnatá síť rezerv, hledání blokujících toků
  • Síť o 5 hranách, na níž bude Ford-Fulkerson běžet více než milion iterací
  • Pokrývání děravé šachovnice dominovými kostkami – Zjistěte (a pokud existuje, tak najděte) pokrytí šachovnice s dírami pomocí dominových kostek $2\times1$
  • Továrny na Kofolu a obchody – každá továrna vyrábí až $t_i$ Kofoly, každý obchod chce prodávat $o_i$ Kofoly a máme bipartitní graf, která továrna může dodávat kterému obchodu. Zjistěte, jestli lze obchody uspokojit a kdo má dodávat komu a kolik.
  • Zopakování Goldbergova algoritmu – náhled s kyblíčky a přeléváním, odhad složitosti, základní lemmata
Úkoly: disjunktniCesty, dinic Studijní materiály: Toky v sítích(ADS), Toky v sítích(KSP)
7.11. Dokončení toků, započetí Fourierovy transformace:
  • Vícenásobné párování aneb manželé a milenci v typickém italském městečku (najděte pro každého rozdílného manžela a milence)
  • Intuice k Fourierově transformaci – kolečková motivace a Homer Simpson
  • Drak a doupě s pokladem – pomozte drakovi nalézt, jaké chodby má zavalit, aby všechny jeho sluje byly stále dostupné, ale chodeb bylo co nejméně (tedy hledáme kostru) a do slují s pokladem vždy vedla jen jedna chodba.
Studijní materiály: Doporučuji se podívat na názorné 3D ztvárnění Fourierky
14.11. Povídání k zápočťákům, procvičování:
  • Problém tanečních – Do tanečních přišlo $N$ hochů vysokých $h_1,\dots,h_N$ a $N$ dívek vysokých $d_1,\dots,d_N$. Dívka může tancovat pouze s hochy nejméně tak vysokými, jako je ona sama. Kolik existuje různých párování takových, aby si všichni zatancovali?
  • Typické americké město v období dešťů – Na čtvercové síti máme postavené mrakodrapy. Mrakodrapy "těsní" (přiléhají k sobě rohy tak přesně, že nic mezi nimi neproteče) a pro každé políčko čtvercové sítě máme zadáno, jak vysoký mrakodrap je na ní postavený. Na město ale prší a nás zajímá, jaká je zádržná kapacita města (co odteče přes okraj, tak zmizí).
Úkoly: lehatka, opetTanecni
21.11. Procvičování DFT a FFT:
  • Příklad na rozjezd: Do království nám přicházejí princové, kteří se chtějí utkat s drakem o princeznu. Král si v některých chvílích vybírá, koho ze zásoby rytířů (kteří mezitím bydlí na hradě) na draka pošle. Král chce ale vždycky vyslat mediánového prince aneb prince, jehož síla je mezi zbylými princi mediánem. Vymyslete datovou strukturu zvládající tyto dvě operace co nejrychleji:
    • Příchod prince se sílou S
    • Vyslání mediánového prince
  • FFT aneb Fast Fourier Transform – ukázali jsme si přímo kód algoritmu, který byl na přednášce probrán pouze v náznaku, a jeho souvislost s diskrétní Fourierovou transformací
Studijní materiály: Fourierova transformace(ADS)
28.11. Počítání FFT, procvičování: Úkoly: fourier, koef Studijní materiály: Fourierova transformace(ADS)
5.12. Hradlové sítě:
  • Zopakování definice hradel, hradlové sítě
  • Konstrukce hradel AND, OR, XOR, NOT pomocí hradel NAND a NOR
  • Porovnávačka dvou n-bitových čísel v hloubce $\O(log N)$
  • Naznačena násobička binárních čísel – roznásobím školním algoritmem pod sebou na $N$ členů v hloubce $\O(log N)$, ale řeším problém rychlého sečtení $N$ čísel po roznásobení.
  • Řešení předchozího – převod (komprese) tří binárních čísel na dvě taková, že jejich součet je stejný, jako součet původních tří (domácí úkol).
Úkoly: kompresor, adventOfCode Studijní materiály: Paralelní algoritmy(ADS)
12.12. Geometrie:
  • Analytická geometrie pro programátory – reprezentace přímek (parametrická a obecná rovnice) a jejich převody, úhel mezi dvěma vektory pomocí determinantu
  • Testování, jestli bod leží v konvexním mnohoúhelníku pomocí testu polorovinami
  • Testování, jestli bod leží v nexkonvexním mnohoúhelníku pomocí počítání průsečíků polopřímky
  • Obecný úvod k zametání
  • Hledání průsečíků $N$ úseček -- když je průsečíků mnoho, tak lepší než $\O(N^2)$ neumíme, jinak lze vymyslet zametání v $\O(N \log N)$
Úkoly: linie Studijní materiály: Geometrické algoritmy(ADS), Geometrie(KSP)
19.12. Předvánoční cviko – těžké úlohy pod stromeček
  • Dynamika na rozjezd – Ježíšek se chystá na Vánoce a plánuje si svůj rozvrh minutu po minutě během celkem $T$ minut. V minutě $i$ může buď: balit dárky (za zisk 0), darovat dárky (za zisk $D_i$) nebo rozveselovat (za zisk $R_i$). Nemůže ale rozveselovat dvě minuty těsně po sobě a před tím, než jde dávat dárky je musí těsně předcházející minutu balit. Pro zadané pole $D$ a $R$ naplánujte rozvrh s největším ziskem.
  • Úvod do tříd P a NP
  • NP-úplný problém: Hamiltonovská kružnice – vstupem je graf o $N$ vrcholech, cílem je odpovědět ANO/NE podle toho, jestli v grafu existuje cyklus délky $N$ procházející každým vrcholem právě jednou (cesta přes všechny vrcholy).
  • NP-úplný problém: Dva loupežníci – loupežnící si dělí lup skládající se z $N$ předmětů o cenách $c_1,\dots,c_N$. Cílem je odpovědět ANO/NE podle toho, jestli se lup dá rozdělit tak, aby oba dostali přesně polovinu (součet cen věcí jednoho loupežníka bude součet cen věcí druhého loupežníka).
  • Převody a dokazování o jiných úlohách, že jsou NP-úplné: Hamiltonovská cesta, Problém obchodního cestujícího (TSP)
  • 2-aproximace obchodního cestujícího pomocí obcházení minimální kostry
Úkoly: metr Studijní materiály: Těžké problémy(ADS), Těžké problémy(KSP)
Vánoce Štastné a veselé a haldu dárečků pod vyhledávacím stromem :-)
9.1. Plán – Poslední cviko
  • Opakování látky ADS II
  • Prostor pro otázky

Domácí úkoly

Aby se podpořila práce během semestru, tak má každý úkol stanovený termín (typicky tři týdny, platí odevzdání do začátku cvičení) kdy je za plný počet bodů. Po termínu je ho možné odevzdat až do začátku zkouškového období za dolní celou část poloviny bodů.

Preferovaný způsob odevzdání je emailem (přímo v těle emailu, PDF, čistý text v UTF-8, čistý text v ASCII, …). Při prvním odevzdání úkolu si zvolte přezdívku, pod kterou chcete být uvedeni v tabulce bodů, nebo napište že na webu nechcete být uvedeni vůbec.

Datum Úkol Body Zadání
05.10.
Termín: 24.10.
vyvazeni 10 Mějme libovolný (jakkoliv nevyvážený) binární vyhledávací strom. Chceme ho přestavět na vyvážený BVS v čase $\O(N)$ s použitím co nejméně pomocné paměti. Na cvičení bylo s $\O(N)$ pomocné paměti, vymyslete lepší.
zebrik 10 Máme plán hradu zadaný jako dvourozměrnou mřížku, na některých políčcích je zeď, na jiných je volný prostor. Chceme se dostat ze startu do cíle, ale nebude to tak jednoduché. Neseme si na rameni žebřík dlouhý $K$ políček a potřebujeme všude projít i s ním. Se žebříkem můžeme:
  • Chodit dopředu a dozadu ve směru, kterým je otočený
  • Otáčet se – k otočení se žebříkem délky $K$ potřebujeme prázdný prostor veliký $K\times K$ políček. Střed otáčení si zvolte, jaký chcete (třeba vždy "předek" žebříku).
Popište stavový prostor i použitý algoritmus.
19.10.
Termín: 07.11.
rymy 10 Královi rýmotvorci by od vás potřebovali pomoc. Král chce každý den novou a novou báseň, která se ale navíc musí co nejvíce rýmovat. A najít ten správný rým je občas těžké. Vymyslete algoritmus, který by rýmotvorcům pomohl a to tak, že nejprve dostane databázi slov a pak bude dostávat mnoho dotazů na to, které slovo z databáze se k zadanému nejvíce rýmuje. Nejlepší rým budeme brát jako nejdelší společný suffix (pokud bude takových více, zvolte libovolný).
1984 15 Mimo básní má král zálibu i v překrucování historie. Občas vydá dekret, že nějaké slovo musí být vyškrtnuto ze všech královských textů a královi tiskopisci to pak musí zařídit. Chtěli by od vás algoritmus, kterému předhodí nějaký text a seznam zakázaných slov, a který jim pak vydá text s vyškrnutými všemi výskyty zadaných slov.
Příklad: zakázaná slova ahoj a roj a text mujahrojoj. Nejdříve se vyškrtne mujahrojoj a pak se k sobě dostanou písmena tvořící první slovo a musí se vyškrtnout i mujahoj.
Bonusový bod za to, pokud vysvětlíte význam názvu úkolu ;-)
31.10.
Termín: 21.11.
disjunktniCesty 10 Dostali jsme graf představující železniční síť v naší zemi. Bohužel vedlejší země se nás možná chystá vojensky napadnout. Naše vojáky by zajímalo, jak a kudy se půjde dostat mezi důležitými místy, když bombardování zničí některé tratě či stanice. Pro zadanou dvojici vrcholů tedy najděte:
  • Hranově disjunktní cesty mezi určenou dvojicí vrcholů
  • Vrcholově disjunktní cesty mezi určenou dvojicí vrcholů (nepřítel nám bombarduje i nádraží).
Zkuste to pomocí toků.
dinic 10 Dokažte, že pro jednotkové kapacity doběhne Dinicův algoritmus v čase $\O(nm)$.
19.11.
Termín: 19.12.
lehatka 12 Turisté u moře řeší vážný problém. Turistů se sešlo T na jedné pláži, na které se současně nachází L v řadě rozmístěných lehátek. Lehátek je více, než turistů, ale problémem je, že všichni turisté jsou členy Klubu samotářů a tedy by každý z nich byl nejraději co nejdál od všech ostatních. Pro pozice lehátek zadané na vstupu (třeba v metrech od levého konce pláže) najděte rychlý algoritmus, který z L lehátek vybere T takových, aby vzdálenost mezi dvěma nejbližšími byla co největší možná.
opetTanecni 10 Další problém v tanečních. Probíhá pánská volenka, pánové se dohodli a každý si vybral právě jednu partnerku (jinými slovy již máme párování). Pánové stojí v řadě (od 1 do N) na jednom konci sálu, dámy (opět v pořadí 1 až N) stojí na druhém konci. Trasy pánů se ale mohou křížit (například, když si první pán vybere druhou dámu a druhý pán první dámu). Najděte co největší podmnožinu pánů, jejich trasy k partnerkám se nekříží a mohou tak vyrazit najednou.
27.11.
Termín: 31.12.
fourier 12 Zkuste si spočítat diskrétní fourierovu transformaci následujících vektorů:
  • $(42,42,42,42,42,42,42,42)$ (3 body)
  • $(1,0,1,0,\dots,1,0)$ délky $n$ pro sudé $n$ (3 body)
Vynásobte pomocí diskrétní fourierovy transformace následující polynomy: $(3+2x)\cdot(2+x+3x^2)$ (6 bodů). Chci vidět alespoň náznak průběhu výpočtu. Klidně tentokrát můžete nafotit a poslat emailem fotku :-)
koef 10 Co o původním vektoru vypovídá nultý a $(n/2)$-tý člen vektoru získaného diskrétní fourierovou transformací původního vektoru? A proč?
05.12.
Termín: 02.01.
kompresor 8 Vymyslete hradlovou síť provádějící kompresi 3 čísel v binární soustavě na 2 čísla v binární soustavě o stejném součtu. Přesněji síť má přijímat 3 čísla $a,b,c$ (pro jednoduchost se stejně dlouhými zápisy dlouhými $N$ bitů) a má vracet čísla $x,y$ taková, že $a+b+c=x+y$.
adventOfCode 0 BONUS: Vyřešte co nejvíce adventních úloh z Advent of Code, za každý den lze získat až dvě hvězdy, za každou hvězdu půl bodu. Můžete se přidat do privátní výsledkové listiny po zadání kódu 37231-c676be69, jen mi emailem nahlašte váš login :-)
12.12.
Termín: 09.01.
linie 13 V $N$-úhelníku bychom chtěli nakreslit nejdelší vodorovnou (rovnoběžnou s osou $x$) úsečku, která se celá nachází uvnitř tohoto mnohoúhelníku. Pro zadaný $N$-úhelník najděte délku a přesnou pozici takové úsečky.
V lehčím případě (za 9 bodů) jen v konvexních obrazcích, v těžším případě (+4 body) i v nekonvexních.
21.12.
Termín: 30.01.
metr 10 Dokažte, že následující úloha je NP-úplná. Použít k dokazování můžete NP-úplné úkoly ze cvika (viz zápis cvika): Máme skládací metr (normálně má všechny části stejně dlouhé, ale náš může mít části různé). Skládací metr se dá mezi každými dvěma dílky ohnout a my se ptáme, jestli se metr o $N$ částech s délkami $d_1,\dots,d_N$ dá poskládat do pouzdra dlouhého $d$. Metr s dílky $(3,4,4)$ se do pouzdra dlouhého 4 poskládá, metr s dílky $(3,4,1,4)$ ne.
17.01.
Termín: 28.02.
minK 15 V továrně na dorty vyrábí dorty jako na běžícím pásu. Každý dort má nějakou maximální teplotu, při které může být skladován, aby se neroztekl. Protože v každou chvíli mají na běžícím pásu právě $K$ posledních dortů (pak si je odváží kurýr), potřebovali by vědět, jaké je minimum z maximálních teplot posledních $K$ dortů.
Vymyslete tedy datovou strukturu, která bude reprezentovat posloupnost dortů a bude umět provést operaci "Přidej nový dort na konec posloupnosti a vrať mi minimum z posledních $K$ prvků".
Snažte se aspoň o amortizovaně konstantní čas na operaci (čas přes $N$ operací $\O(N)$ neboli v průměru $\O(1)$ na jednu), bonusové body za operaci v $\O(1)$ pokaždé (neamortizovaně).
anketa 5 Feedback aneb napište, co se vám na cviku nelíbilo (můžete i co se vám líbilo) a jak by se ještě dalo vylepšit. Třeba:
  • Celková atmosféra cvika - vysvětloval jsem všechno jasně, bylo mi rozumět?
  • Čas věnovaný jednotlivým tématům - nebylo Fourierky moc?
  • Podmínky na získání zápočtu - lehké, těžké?
  • Domácí úkoly - přišly vám lehké/těžké? radši více menších nebo málo větších úkolů?
  • Vztah přednášky a cvika - chodili jste na přednášku? chápali jste věci na přednášce, hodilo se opakování na cviku?
Díky za dobré připomínky :-)
Celkem:160