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:
- Až si vyberete téma zápočťáku, tak mi napište email s tématem a jazykem, abych včas podchytil věci zbytečně složité, nebo naopak příliš jednoduché na zápočet.
- Zápočťák by měl obsahovat algoritmus nebo datovou strukturu z látky ADS II. Může to být klidně jenom knihovna pro práci s danou datovou strukturou nebo algoritmem, či to může být rozsáhlá hra, kde se v určité části bude algoritmus nebo datová struktura využívat.
- Můžete psát v jakémkoliv rozumném imperativním jazyce jazyce (C, C++, C#, Java, Python, Pascal, Perl, Go, …), jiné jazyky konzultujte.
- K zápočťáku je potřeba dokumentace:
- Programátorská dokumentace popisující implementaci (jak algoritmus interně funguje, jaké ve stručnosti používá funkční bloky, ...)
- Uživatelská dokumentace popisující použití – u knihoven jejich rozhraní (API) a ukázky použití, u samostatných programů popis jejich vstupního a výstupního formátu, nebo třeba popis ovládání.
- Termín odevzdání ideálně alespoň týden předtím, než budete potřebovat zápočet. Ale nejlépe do konce zimního zkouškového (spíše doporučení, než deadline, přijímám zápočťáky až do konce akademického roku).
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 :-)
- Dobře napsaná implementace algoritmu Aho-Corasickové
- Dobře napsaná implementace domácího úkolu 1984
- Knihovna na minimální kostry různými algoritmy, případně přímo jejich výkonové porovnání
- Knihovny na tokové algoritmy
- Voroného diagramy či jiná zajímavá geometrie
- …
Získané body:
Jméno | Úkoly | Bonusy | Bodů | Zápočťák | Zápočet |
---|---|---|---|---|---|
0xCC | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), lehatka(12), opetTanecni(10), adventOfCode(9) |
| 100 | Visibility polygon | OK |
aaa | vyvazeni(7), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), fourier(12), koef(10), kompresor(8), linie(9) | 102 | Disjunktní cesty | OK | |
ameSakvE | vyvazeni(10), zebrik(9), rymy(10), 1984(17), opetTanecni(10), lehatka(12), koef(10), fourier(12), kompresor(8) |
| 101 | Vyhledávání v textu s překlepy | OK |
Anaesim | vyvazeni(10), zebrik(10), rymy(10), lehatka(5), linie(13) | 48 | -- | NE | |
Bartolomej | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), fourier(12), adventOfCode(1), opetTanecni(10) |
| 105 | Segmentace obrazu pomocí řezů | OK |
Broko | vyvazeni(10), zebrik(7), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), koef(10), adventOfCode(7), kompresor(8) |
| 104 | FFT násobení | OK |
ChliebAVino | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), opetTanecni(12), dinic(5), koef(5), fourier(6), linie(13), anketa(5) |
| 112 | Porovnání algoritmů na minimální kostry | OK |
jakub | vyvazeni(10), zebrik(7), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), fourier(12), linie(13), metr(10) | 108 | Násobení polynomů pomocí FFT | OK | |
Lord Ovenmitt | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), fourier(9), koef(10), linie(13) | 108 | 1984 | OK | |
m | vyvazeni(10), zebrik(10), rymy(10), 1984(16), koef(10), fourier(8), adventOfCode(6), minK(8), anketa(5) | 83 | -- | NE | |
Michal | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), fourier(12), kompresor(8), linie(13) |
| 119 | Applet na Dinice | OK |
PetoK | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), fourier(12), koef(10), opetTanecni(10) |
| 101 | Aho-Corasick | OK |
Pomalost | vyvazeni(10) | 10 | -- | NE | |
Pooper Dooper | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), fourier(12), koef(10), linie(13) | 101 | Knihovna pro Dinicův algoritmus | OK | |
Silevon | vyvazeni(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), metr(10), linie(13), lehatka(9), kompresor(4) | 102 | Aho-Corasick | OK | |
swaco | vyvazeni(10), zebrik(7), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), opetTanecni(10), kompresor(8), linie(13), fourier(12) | 106 | Dinicův algoritmus | OK | |
Zelí | vyvazeni(10), zebrik(10), rymy(10), 1984(16), disjunktniCesty(10), dinic(10), koef(10), fourier(12), linie(8), adventOfCode(10) |
| 126 | FFT ekvalizér | OK |
Studijní materiály
- (ADS)Skripta k ADS od Martina Mareše – Skvělý studijní materiál pokrývající dobře skoro celou látku
- (KSP)Programátorské kuchařky Korespondenčního semináře z programování – dobře pokrytá některá témata, mělo by být pochopitelné i středoškoláky. Je dobré k pochopení probírané látky, ale nejsou zde příliš formální důkazy.
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:
|
---|---|
10.10. | Vyhledávání v textu:
|
17.10. | Vyhledávání v textu podruhé:
|
24.10. | Hledání minimálních koster a toky v sítích:
|
31.10. | Pokračování v tocích v sítích:
|
7.11. | Dokončení toků, započetí Fourierovy transformace:
|
14.11. | Povídání k zápočťákům, procvičování:
|
21.11. | Procvičování DFT a FFT:
|
28.11. | Počítání FFT, procvičování:
|
5.12. | Hradlové sítě:
|
12.12. | Geometrie:
|
19.12. | Předvánoční cviko – těžké úlohy pod stromeček
|
Vánoce | Štastné a veselé a haldu dárečků pod vyhledávacím stromem :-) |
9.1. | Plán – Poslední cviko
|
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:
|
|
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 mujah 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:
|
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ů:
|
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:
|
|
Celkem: | 160 |