Cvičení z předmětu Algoritmy a datové struktury I (NTIN060) k přednáška Ondřeje Čepka (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
Domlouvali jsme na cviku 27. března, kdyžtak se ptejte. Níže jsou shrnuty hlavní body:
- Hlavním účelem zápočťáku je zkusit si implementovat prakticky (včetně odladění) nějakou datovou strukturu nebo algoritmus z látky ADS I – klidně to může být jednoduchá knihovna na třídící algoritmy, algoritmus na hledání nejkratších cest, některý z rozumně těžkých domácích úkolů ze cvik, … (ale pokud chcete, klidně jen nějaký algoritmus/datovou strukturu použijte v rámci většího programu, třeba hry nebo editoru MP3 souborů.
- 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.
- 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 zkouškového (spíše doporučení, než deadline, přijímám zápočťáky až do konce akademického roku).
Získané body:
Jméno | Úkoly | Bonusy | Bodů | Zápočťák | Zápočet |
---|---|---|---|---|---|
Ando | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(4), bludiste(10), ruzneCesty(10), kamion(10) | 116 | Třídící algoritmy | OK | |
ASRock | vazeni(8), inverze(10), treeDiam(5) | 23 | -- | NE | |
Atsuko Kagari | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), druhyNejmensi(10) | 100 | Mergesort knihovna | OK | |
Budgie | posloupnost(5), soucetK(5), odmocnina(7), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), ruzneCesty(7), medianPos(10), presmycky(5), anketa(5) |
| 102 | AVL strom | OK |
Diana Cavendish | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(10), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), bludiste(10), legie(8) | 102 | Heapsort knihovna | OK | |
drozdo | posloupnost(10), soucetK(10), odmocnina(7), vazeni(10), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), kamion(10), ruzneCesty(10), druhyNejmensi(10) | 104 | Knihovna nejkratších cest | OK | |
Falešný Martin Kubeša | posloupnost(10), soucetK(10), odmocnina(7), vazeni(8), mergesort(10), sroubky(12), median(5), druhyNejmensi(10), anketa(5), kamion(5), odtrhavani(5), ruzneCesty(5), legie(4) |
| 101 | Dijkstra | OK |
GOG | posloupnost(10), soucetK(10), podmatice(10), vazeni(8), mergesort(10), sroubky(9), odtrhavani(10), cyklus(5), legie(8), kamion(10) |
| 100 | Bludiště | OK |
Honza | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(10), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), bludiste(10) | 102 | Červeno-černé stromy | OK | |
Idefix | posloupnost(10), soucetK(10), odmocnina(7), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), kamion(10), ruzneCesty(10), median(5) |
| 103 | Dijsktra | OK |
Jakub Matěna | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), bludiste(10), ruzneCesty(10) | 102 | Dijsktrův algoritmus | OK | |
Kartoffel | soucetK(10), podmatice(10), vazeni(8), odtrhavani(10), cyklus(5), legie(8), bludiste(8), ruzneCesty(10), kamion(10) | 79 | -- | NE | |
krokodyl | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(5), mergesort(10), sroubky(11), odtrhavani(10), cyklus(5), bludiste(10), ruzneCesty(10), druhyNejmensi(10) | 108 | Editační vzdálenost | OK | |
Kyrylo | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), bludiste(8), ruzneCesty(10) | 108 | Podmatice | OK | |
Martin Kubeša | posloupnost(10), soucetK(10), odmocnina(7), sroubky(12), odtrhavani(10), cyklus(5), median(2), kamion(10), ruzneCesty(10), treeDiam(5), medianPos(10), presmycky(10) | 101 | Funnel sort | OK | |
Michal Nemčok | posloupnost(7), soucetK(4), odmocnina(7), vazeni(8) | 26 | -- | NE | |
OR | posloupnost(10), soucetK(10), odmocnina(7), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), kamion(10), druhyNejmensi(10) |
| 113 | Knihovna pro AVL stromy | OK |
Oskar | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), bludiste(10), legie(8), ruzneCesty(10) | 110 | Splay stromy | OK | |
Pán Historie | posloupnost(10), soucetK(10), odmocnina(7), vazeni(8), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), bludiste(10), legie(8), kamion(10), ruzneCesty(10) | 110 | (a,b)-stromy | OK | |
Pán Mraků | posloupnost(10), soucetK(10), odmocnina(7), vazeni(5), sroubky(12), odtrhavani(10), cyklus(5), bludiste(10), legie(8), ruzneCesty(10), kamion(10), treeDiam(5) |
| 112 | B-stromy | OK |
rcn | posloupnost(10), soucetK(10), odmocnina(7), podmatice(10), vazeni(10), mergesort(10), sroubky(12), odtrhavani(10), cyklus(5), legie(8), bludiste(10) | 102 | Nejkratší cesty | OK | |
SSS | posloupnost(5), odmocnina(3), soucetK(10), vazeni(8), mergesort(10), sroubky(10), odtrhavani(10), cyklus(2), kamion(10), legie(5), presmycky(10), medianPos(10), anketa(5) |
| 103 | Maticová knihovna | OK |
Stepo | posloupnost(5), soucetK(10), odmocnina(7), podmatice(10), vazeni(5), mergesort(10), odtrhavani(10), cyklus(5) | 62 | -- | NE | |
weiXiao | posloupnost(10), vazeni(10) | 20 | -- | NE |
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á):
20.2. | Úvodní cvičení Pár problémů na rozcvičení:
|
---|---|
27.2. | Záskok: Verča Slívová Pokračování v úvodu:
|
6.3. | Matice, RAM:
|
13.3. | Hashování, úvod do rozděl a panuj:
|
20.3. | Rozděl a panuj:
|
27.3. | Třídění:
|
3.4. | Grafy:
|
10.4. | Pokračování grafů
|
17.4. | Velikonoční pondělí – cviko není |
24.4. | Hledání cest:
|
1.5. | Svátek práce – oslavíme nepracováním (cviko není) |
8.5. | Den osvobození – cviko není |
9.5. | Náhradní cviko – od 17:20 v S10 Intervalové stromy:
|
15.5. | Vyhledávací stromy:
|
22.5. | Minimální kostry a opakování:
|
A to je tento semestr vše, přeji hodně zdaru u zkoušek a získávání zápočtů :-) |
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í |
---|---|---|---|
20.02. Termín: 06.03. |
posloupnost | 10 | Vodohospodáři každou minutu sledovali přítok/odtok z vodojemu a zaznamenávali si tato čísla. Máte tedy posloupnost $N$ celých čísel (kladná značí přítok, záporná odtok). Vodohospodáři by chtěli označit souvislý úsek, ve kterém měli největší přítok, neboli souvislou podposloupnost s největším součtem. |
06.03. Termín: 27.03. |
soucetK | 10 | Na stole nám stojí řada různě plných lahví uspořádaných od nejprázdnější po nejplnější. V každé z nich je nějaký celočíselný počet mililitrů vody. Chtěli bychom v této posloupnosti lahví najít dvě takové, které v součtu mají dohromady přesně $K$ mililitrů vody. |
odmocnina | 7 | Jak co nejrchleji spočítat celočíselnou odmocninu čísla $x$? Tedy najít $y$ takové, že $y^2 \le x < (y+1)^2$. Vymyslete řešení rychlejší, než lineární k $x$ (nejlépe ještě rychlejší, než $O(\log x)$). | |
podmatice | 10 | BONUS (pokračování ze cvik): Vymyslete postup, který v matici $R\times S$ z jedniček a nul najde největší (co do obsahu) nulovou podmatici. Na cvičení jsme zvládli $\O(RS\cdot\min(R,S))$, zkuste vyřešit v $\O(RS)$. | |
13.03. Termín: 20.03. |
vazeni | 8 | Jen do příštího cvika: a) Máme 12 kuliček a rovnoramenné váhy. Víme, že jedna kulička je lehčí nebo těžší (ale nevíme co z toho), než ostatní. Kolik nejméně vážení potřebuji (při jednom vážení mohu na misky na každou misku vah i více kuliček), abych určil, která to je a rozhodl, zdali je lehčí nebo těžší než ostatní. b) To stejné, ale s 13 kuličkami, jak se situace změní? |
20.03. Termín: 03.04. |
mergesort | 10 | Implementujte mergesort bez použití rekurze. Řešení můžete sepsat v pseudokódu nebo jako zdroják v nějakém imperativním programovacím jazyce – Pascal, C, C#, Java, … |
sroubky | 12 | Máme $N$ šroubků a $N$ matiček různých velikostí. Vždy právě jedna matička pasuje na právě jeden šroubek, o ostatních zjistíme jen, jestli je matička malá anebo velká, jinak jsou matičky i šrouky mezi sebou neporovnatelné (nezjistíme, jaký šroubek je větší, nebo o kolik nesedí matička). Vymyslete jak s co nejmenším počtem pokusů spárovat všechny šroubečky a matičky dohromady. | |
03.04. Termín: 18.04. |
odtrhavani | 10 | Mějme souvislý neorientovaný graf. V jakém pořadí postupně smazat všechny jeho vrcholy, aby byl v průběhu mazání graf stále souvislý? |
cyklus | 5 | Poznejte, jestli označený vrchol v neorientovaném grafu leží na cyklu | |
10.04. Termín: 24.04. |
bludiste | 10 | Máme bludiště zadané grafem (s $N$ vrcholy a $M$ hranami), ve kterém se nachází (malé) $K$ barevných zamčených dveří a $K$ barevných klíčů. Klíč vždy pasuje ke stejně barevným dveřím a klíčů můžete nést najednou, kolik chcete. Na začátku startujeme od hradní brány a v bludišti je princezna, ke které se chceme dostat. Najděte k ní nejkratší cestu. |
legie | 8 | Za dob starého Říma byl velký problém s barbary, kteří loupili na obchodních cestách. Císař proto chce nechat každou cestu hlídat. Cesty v říši mají tvar stromu (nikde není z cest cyklus, kořenem stromu je Řím – podle úsloví, že všechny cesty vedou do Říma) a v každém vrcholu je město. Cesta je hlídána, pokud alespoň na jednom jejím konci je umístěna legie. Jenže legií je nedostatek a tak by Císař po vás chtěl ohlídat (pokrýt) všechny cesty mezi městy, ale použít na to co možná nejméně legií. | |
24.04. Termín: 15.05. |
ruzneCesty | 10 | Mějme mapu města – orientovaný graf silnic a jeden označený vrchol jako radnici. Radní by pro všechny ostatní vrcholy zajímalo, kolik do nich z radnice vede různých nejkratších cest = cest s nejmenším možným počtem silnic. Dvě cesty považujeme za různé, pokud se liší alespoň v jedné hraně. |
kamion | 10 | Mějme mapu města ve tvaru orientovaného grafu. Každou hranu ohodnotíme podle toho, jaký nejvyšší kamion po dané ulici může projet. Po cestě tedy projede maximálně tak vysoký náklad, kolik je minimum z ohodnocení jejich hran. Jak pro zadané dva vrcholy najít cestu, po níž projede co nejvyšší náklad? | |
09.05. Termín: 22.05. |
druhyNejmensi | 10 | Naprogramujte (stačí sepsat v pseudokódu nebo jako zdroják v nějakém
imperativním programovacím jazyce – Pascal, C, C#, Java, …) intervalový
strom vracející druhý nejmenší prvek na zadaném intervalu. Stačí dvě základní operace:
|
median | 5 | Upravte binární vyhledávací strom tak, abyste vždy zvládli v čase $\O(\log N)$ najít medián (prostřední prvek). | |
15.05. Termín: 29.05. |
treeDiam | 5 | Na vstupu dostanete binární strom (obecně nevyvážený). Úkolem je vymyslet algorimus, který na tomto stromě najde nejdelší cestu mezi dvěma vrcholy. |
inverze | 10 | Inverze v permutaci je jakákoliv dvojice prvků, která se vyskytne v opačném pořadí (více viz Wikipedia). Navrhněte algoritmus počítající počet inverzí v zadané permutaci (nápověda: použijte binární vyhledávací stromy) | |
22.05. Termín: 30.06. |
medianPos | 10 | Budete postupně dostávat čísla (neutříděná). Sestrojte datovou strukturu, která po každém přidání čísla zvládne vypsat, jaký je aktuální medián (prostřední prvek) této posloupnosti. |
presmycky | 10 | Dostanete slovník a seznam hledaných slov. Ke každému hledanému slovu najděte ve slovníku všechny anagramy neboli přesmyčky, které z tohoto slova můžou vzniknout. | |
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: | 175 |