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

Ve školním roce 2010/2011 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é pondělí od 12:20 v S10, kdo chcete chodit, přihlašte se, prosíme, v SISu, případně nám pošlete mail, pokud vám to SIS nedovolí.

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
4. 10. funf5Co dělá funkce f() z letáčku?
funb5Co dělá funkce bc() z letáčku?
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é?
ocko5Proč je v definici "velkého O" kvantifikováno přes "skoro všechna N", namísto přes všechna? Co se pokazí, když tam napíšeme jen ∀N? Pro jistotu definici zopakujeme: f=O(g) právě tehdy, když ∃c>0 ∀*N f(N) ≤ c*g(N).
11. 10. real10Představte si, že máte počítač, který umí počítat v konstantním čase s neomezeně velkými a neomezeně přesnými reálnými čísly: sčítat, odčítat, násobit, dělit, umocňovat, počítat celé části apod. Jak na tomto počítači hledat N-té prvočíslo v konstantním čase?
8. 11. dice15Házíme 20stěnnou kostkou a chceme generovat čísla od 1 do 90. Označme h(N) počet hodů kostkou průměrně spotřebovaný na vygenerování N čísel. Opakováním algoritmu ze cvičení získáme h(N)=20/9*N. Vymyslete algoritmus s menším h(N). Umíte méně než 1.6*N?
15. 11. mink15Je dána posloupnost délky N a číslo K. Spočítejte v čase O(N) (kde konstanta v O nezávisí na K) minima všech úseků délky K.
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í.
22. 11. kjed10Dopočítejte časovou složitost algoritmu z cvičení pro generování všech posloupností n nul a jedniček, které obsahují právě k jedniček. Zkuste navrhnout rychlejší algoritmus.
29. 11. fill20Uvažujme vyplňování rovinného obrázku v mřížce n×n pomocí prohledávání do šířky. Říká se, že pro to stačí fronta velikosti O(n). Dokažte to nebo vyvraťce.

Co jsme dělali

datum co se cvičilo
4. 10.

Pár příkladů na úvod:

  • Měli jsme posloupnost 1…N. Někdo ji zamíchal a jedno číslo škrtnul. Jak v lineárním čase a konstantní paměti zjistit, které?
  • Je dána posloupnost přirozených čísel, ve které se všechna čísla vyskytují sudě-krát až na jedno nezbedné. Které?
  • Robin Hood s kouzelným lukem: V rovině je N bodů, najděte polopřímku, na které leží nejvíce z nich.
  • R. H. s kouzelnějším lukem: … najděte kružnici, na které leží nejvíce z nich.
  • Je dána matice celých čísel a parametry a,b. Najděte (souvislou) podmatici velikosti a×b, jejíž medián je největší možný. Uvažte i jednorozměrnou, nebo naopak vícerozměrnou verzi úlohy.
  • Tentýž vstup. Najděte podmatici velikosti a×b s co největším součtem.
  • Matice celých čísel. Najděte podmatici (tentokrát libovolně velkou) s co největším součtem.
11. 10. O Robinu Hoodovi a jiných geometrech. Úlohy o posloupnostech: dvojice se zadaným součtem, úsek s maximálním součtem.
18. 10. Úlohy o posloupnostech: úsek se zadaným součtem nebo se součtem nejblížším zadanému; nejdejší vyvážený úsek; nejdelší rostoucí podposloupnost.
25. 10. Módní přehlídka třídících algoritmů. Jak zacházet s haldou.
1. 11. Přihrádkové třídění. Kompromisy mezi časem a pamětí: spočtěte všechna yk = x1 * … * xk-1 * xk+1 * … xn (kde * je nějaká asociativní operace).
8. 11. Budou volby. Hrátky s pravděpodobností: randomizované řešení na volby, míchání karet, převody mezi kostkami, generování s danými vahami.
15. 11. Generování všech objektů daného typu a související problémy: hledání následníka, počítání objektů, ranky a unranky.
22. 11. Ještě jednou generování: Fibonacciho řetězce, posloupnosti s právě k jedničkami.
29. 11. Rankování permutací. Prohledávání do šířky: bludiště, kulhavý kůň, kulhavé autíčko, Théseus s Minotaurem (a pokladem a mečem). Nuly a jedničky.
6. 12. O nulách, jedničkách a grafech. Několik dalších grafových úloh: asfaltování, šéf agentů, hledání mostu, strážníci ve stromovém městě, mafiáni ve stokách, uzavřená společnost.
13. 12. Strážníci, mafiáni a stromy.
20. 12. Asfaltování a hledání šéfa agentů. Jak se hledají mosty?
3. 1. Barvení rovinných grafů 6 i 5 barvami.
10. 1. Jeřábníkův problém, intervalové i jiné stromy nad (ne)komutujícími transformacemi. BB-2 stromy.
Stránku spravuje Martin Mareš