Cvičení z programování I pro pokročilé

Ve školním roce 2008/2009 vedeme s Milanem Strakou speciální cvičení z předmětu Programování I [NPRG030] pro pokročilé studenty, kteří již nasbírali nějaké zkušenosti z programování (třeba v olympiádách a korespondenčních seminářích) a chtěli by se naučit víc.

Viz též letáček :-)

Cvičení se koná každé úterý od 15:40 v S4, kdo chcete chodit, přihlašte se, prosíme, v SISu.

Podmínky k získání zápočtu jsou (AND):

Kontakt

Svým cvičícím pište na adresu mami@ucw.cz (Martin+Milan).

Zápočtový program

Domácí úkoly

Domácí úkoly jsou dvou druhů:

Na získání kýžené stovky bodů bohatě stačí praktické úlohy, pokud je řešíte včas.

Teoretické úkoly

DatumIDBodyPříklady
7. 10. funf5Co dělá funkce f() z letáčku?
funb5Co dělá funkce br() z letáčku?
14. 10. liar15Dokažte, že ve hře "mysli si číslo" s nejvýše jednou lží potřebujeme aspoň log2 + log2 log2 n + konst. tahů.
2mis15Princezně se rozsypaly perly z náhrdelníku (očíslované 1 až N) a dvě z nich se ztratily. Jak v lineárním čase a konstantní paměti zjistit, které?
21. 10. fff010Mějme funkci f(x) přiřazující přirozeným číslům přirozená čísla. Uvažme posloupnost 0, f(0), f(f(0)), f(f(f(0))), ... a předpokládejme, že je periodická. Napište program, který nalezne délku periody, má-li k dispozici pouze konstantně velký prostor.
4. 11. genk10Uvažme následující algoritmus pro generování posloupností nul a jedniček délky N s právě K jedničkami: zkusíme umístit první jedničku na všech N pozic a zavoláme se rekurzivně na podposlupnost vpravo od této jedničky. Pokud už je N=K, doplníme jedničky a vše vypíšeme. Jaká je časová složitost, nepočítáme-li vypisování?
nxtk10Jako předchozí příklad, ale generujte nerekurzivně: vymyslete algoritmus, který najde lexikografického následníka dané posloupnosti.
18. 11. rsel15Na vstupu je libovolně dlouhá posloupnost řádků (dopředu nevíte, jak dlouhá) a číslo k. Váš program má z této posloupnosti vybrat náhodnou k-tici řádků tak, aby všechny k-tice měly stejnou pravděpodobnost. Číslo k je dostatečně malé, takže vybrané řádky se určitě do paměti vejdou, vstupní posloupnost ovšem nemusí.
25. 11. next15Dokažte, že operace nalezení následníka prvku v binárním vyhledávacím stromu má amortizovanou časovou složitost O(1), pokud do inicializace investujeme amortizovaný čas O(hloubka stromu).
2. 12. Cvičení kvůli DODu odpadá!
9. 12. tdel15Vymyslete, jak do stromů vyvažovaných pomocí přebudovávání, které jsme dělali na cvičení, dodělat operaci mazání prvku.
13. 1. diam10Dokažte, že následující algoritmus správně spočíta průměr stromu (maximum vzdáleností mezi vrcholy): zvolíme libovolný vrchol v, najdeme vrchol x nejvzdálenější od v, najdeme vrchol y nejvzdálenější od x a prohlásíme za průměr vzdálenost xy.
mafi10Rozhodněte, zda hladový algoritmus pro mafiány, který jsme vymysleli na cvičení, funguje.

Co jsme dělali

datum co se cvičilo
7. 10. Rotování pole. Dotřídění knihovny (k knížek špatně zatříděno). Robin Hood a body v rovině. Šifrovací mřížka a cykly v permutacích.
14. 10. Euklidův algoritmus a jeho přátelé. Jak najít chybějící perlu? (Princezna a zahradník) Jak najít číslo s lichým počtem výskytů? "Mysli si číslo" s lhářem.
21. 10. Jak čísla 1...N opatřit znaménky, aby byl jejich součet roven K? Jak najít úsek s maximálním součtem a se zadaným součtem? Budou volby.
28. 10. Slavíme narozeniny našeho státu …
4. 11. Generování posloupností různých typů aneb první ochutnávka rekurze.
11. 11. Úklid pole (přehazování prvků, aby tvořily souvislý úsek, se zachováním pořadí nebo bez). Generování a počítaní rozkladů čisla na součet.
18. 11. Generování náhodných permutací a k-té permutace v lexikografickém či jiném pořadí. Jak kontrolovat, že jsme vygenerovali všechny rozklady? Prohledávání do šířky: cesta koněm, levotočivé autíčko, Théseus a Minotaurus.
25. 11. Počítání součinů bez i-tého prvku (šetříme prostorem). Vyhledávací stromy a operace s nimi: find, insert, delete, next. Konstrukce dokonale vyváženého stromu a vyvažování pomocí částečné rekonstrukce.
2. 12. Cvičení kvůli DODu odpadá!
9. 12. Opět stromy. Analyzujeme stromy z minulé přednášky pomocí penízků. Jak spočítat inverze v permutaci? jak najít v posloupnosti úsek se součtem nejblizším danému číslu?
13. 12. Ještě jednou stromy. Obsah a obvod sjednocení obdélníků.
6. 1. Jeřábníkovy starosti. Průsečíky úseček v rovině. Jak najít maximální nezávislou množinu ve stromu?
13. 1. Prohledávání stromů do hloubky: nezávislé množiny, průměr stromu, problém s mafiány.
Stránku spravuje Martin Mareš