Cvičení z Programování II

Ve školním roce 2003/2004 vedu cvičení z předmětu Programování II [NPRG031]. Cvičení se koná každou středu od 14:00 v posluchárně E1.

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

Domácí úkoly

DatumIDBodyPříklady
18. 2. grin2Na vstupu je zadán orientovaný (multi)graf jakožto seznam hran, každá hrana je popsána identifikačními čísly (integerovými) vrcholů, mezi nimiž vede. Napište program, který z tohoto vstupu sestrojí reprezentaci grafu pomocí pointerů: spojový seznam vrcholů setříděný podle id. čísel, ke každému vrcholu je připojen seznam hran vedoucích z tohoto vrcholu a každá hrana ukazuje na vrchol, do nějž vede. Na cvičení jsme vyřešili se složitostí O(M*N), kde M je počet hran a N počet vrcholů, zkuste to efektivněji.
grsy2Mějme graf reprezentovaný jako v minulé úloze, s tím, že hrany vedoucí z vrcholu jsou navíc setříděny podle id. čísel cílových vrcholů. Napište funkci, která v lineárním čase rozhodne, zda je tento graf symetrický (tj. pokud z x do y vede k hran, musí stejný počet hran vést též z y do x).
pomu2Napište program, který vynásobí dva polynomy v řídké reprezentaci (každý polynom je uložen jako spojový seznam dvojic (exponent, koeficient) setříděný vzestupně podle exponentů).
mamu2Napište program, který vynásobí dvě matice v řídké reprezentaci (spojový seznam řádků, každý řádek ukazuje na spojový seznam nenulových prvků v daném řádku; všechny seznamy jsou setříděny podle příslušné souřadnice).
25. 2. cbtr2Naprogramujte funkci, která pro zadané N spočítá, kolik existuje různých binárních stromů na N vrcholech, a bude mít lepší než kvadratickou časovou složitost.
walk2Napište proceduru, která vypíše zadaný binární vyhledávací strom (BVS) v inorder pořadí bez použití rekurze, a to v lineárním čase. Můžete předpokládat, že každý vrchol stromu obsahuje ukazatel na svého otce.
avgp2Naprogramujte funkci, která spočítá průměrnou délku všech cest z kořene do vrcholů zadaného BVS (nejen listů).
balt2Napište program, který vytvoří dokonale vyvážený BVS obsahující zadané hodnoty. (Dokonale vývážený je takový strom, v jehož každém vrcholu platí, že počet vrcholů v levém a pravém podstromu se liší maximálně o jedničku.)
3. 3. fibb2Naprogramujte funkci, která spočte n-té Fibonacciho číslo v čase O(log n). Hint: ( x y ) × (
01
11
) = ( y x+y ).
lexi3Vhodně si předzpracujte zadaný slovník tak, abyste byli schopni na dotazy typu "Dá se string X sestavit ze slovníkových slov a pokud ano, jak to na co nejméně slov provést?" odpovídat v čase O(délka X * maximální délka slova ve slovníku).
sack2Vyřešte problém batohu (je dáno N čísel v rozsahu 1 až M a ptáme se, lze-li z nich vybrat taková, aby jejich součet byl roven zadanému X) v čase O(MN) a prostoru O(M+N).
10. 3. optr2Na vstupu jsou dány prvky a1, ..., an uspořádané vzestupně a pravděpodobnosti p1, ..., pn (0<pi<1 a součet všech pi je 1). Zkonstruujte vyhledávací strom obsahující zadané prvky takový, že průměrná délka cesty, kterou musíte projít při vyhledávání náhodného prvku při daných pravděpodobnostech, bude co nejmenší (tato délka je rovna sumě přes všechna i z pi*hi, kde hi je hloubka, ve které se nachází prvek ai).
diff2Na řetězcích znaků je možno provádět editační operace – přidání znaku, smazání znaku a změnu znaku. Editační (neboli Levenstheinova) vzdálenost řetězců x, y je minimální počet editačních operací, jimiž lze z x vyrobit y (nebo z y vyrobit x, to je totéž; ověřte si, že tato vzdálenost je metrika). Napište funkci, která pro zadané dva řetězce spočte jejich editační vzdálenost.
para3Napište formátovátko odstavců: na vstupu je zadán dlouhý řetězec a šířka stránky S. Dále je známa nějaká funkce P(S,k,t), která řádku šířky S, na který jsme umístili k slov o celkové délce t, přiřadí trestné body za ošklivost (bude-li řádek příliš roztažený, přidělí spoustu trestných bodů, bude-li pěkný, málo; nevejdou-li se slova na řádek, vrátí nekonečno) a funkce Q(S,k,t), která počítá totéž pro poslední řádek odstavce. Najděte algoritmus, který rozdělí řetězec do řádků tak, aby celkový počet trestných bodů za všechny řádky byl nejmenší možný.
17. 3. whly2Na jednom zámku žije Bílá paní. Umí výtečně procházet zdmi, ale k stáru už se začíná bát, že se jí to jednoho dne nepovede a ve zdi uvízne. Proto se snaží procházet zdmi co nejméně. Zkuste jí pomoci: dostanete plán zámku (matice, v níž jsou vyznačeny volná políčka, zdi a start a cíl) a nalezněte cestu ze startu do cíle takovou, aby procházela co nejméně zdmi a z takových cest byla co nejkratší.
brau2Nalezněte v bludišti (opět reprezentovaném maticí) nejkratší cestu autíčkem, které umí pouze jezdit rovně a zatáčet doprava.
kuku2Nalezněte v bludišti (...) nejkratší cestu kulhavým koněm, což je šachová figurka, která v sudé tahy táhne jako jezdec, v liché jako pěšec (v kladném směru y-ové souřadnice).
mino3Na jednom policku zadaneho labyrintu stoji Theseus, na jinem na nej ciha Minotaurus. Thesea ridite vy, Minotaurus v kazdem tahu udela K kroku smerem k Theseovi (tj. pokud se muze pohnout smerem k Theseovi v x-ove souradnici, udela to, pokud ne [uz je ve stejnem sloupci nebo mu brani zed], pohne se v y-ove, pokud nemuze ani to, stoji). Vasim cilem je dostat se na zadane policko a nenechat se pritom chytit Minotaurem.
24. 3. hant2Variace na Hanojské věže: nalezněte nerekurzivní algoritmus na řešení hlavolamu, tj. takový, který dostane konfiguraci věží a pořadové číslo tahu a odpoví, jaký tah má být proveden
(*) [+1 bod] totéž bez pořadového čísla tahu.
xpos1Je dán orientovaný graf reprezentovaný seznamy sousedů vrcholů. Napište proceduru, která v lineárním čase vytvoří analogickou reprezentaci transpozice tohoto grafu, tj. takového grafu, který obsahuje tytéž hrany v opačném směru.
xfor2Vyřešte libovolnou z úloh o bludištích z předchozího cvičení tak, že bludiště transformujete na graf a ten poté projdete do šířky.
30. 3. vcon3Napište funkci, která v zadaném neorientovaném grafu najde všechny artikulace (artikulací nazýváme takový vrchol, jehož odstraněním se zvětší počet komponent souvislosti). Hint: Upravte funkci pro hledání mostů, která se dělala na cvičení.
7. 4. kran1Naprogramujte funkci, která ze zadané n-prvkové posloupnosti vybere náhodně k prvků tak, aby všechny k-tice měly stejnou pravděpodobnost. Můžete předpokládat, že máte k dispozici generátor rovnoměrně rozložených náhodných čísel z libovolného intervalu.
(*) [+2 body] totéž, ale všech n prvků se nevejde současně do paměti a navíc dopředu nevíte, kolik jich bude.
dice2Máte-li k-stěnnou kostku, generujte co nejefektivněji (tj. na nejmenší průměrný počet hodů) náhodná přirozená čísla v intervalu [0,n).
perc2Napište dvojici funkcí: Jednu, která pro zadaná N,X nalezne v lexikografickém pořadí X-tou permutaci na množině 1..N, a druhou, která bude provádět opačný převod.
(*) [+1 bod] zvolte si nějaké jiné uspořádání tak, aby vaše funkce pracovaly v lineárním čase (vzhledem k N).
eigh3Vyřešte Lloydovu devítku – to je hlavolam tvořený krabičkou velikosti 3x3, v níž se pohybuje 8 jednotkových čtverečků označených čísly 1 až 8 (a tedy jedna mezera mezi nimi). Napište program, který pro dvě zadané konfigurace hry najde nejkratší posloupnost tahů mezi nimi, případně odpoví, že mezi nimi nelze legálními tahy přejít. (Tahem se myslí přesunutí čtverečku do volného místa.)
14. 4. sign1Napište funkci pro výpočet znaménka zadané permutace v lineárním čase.
dsim3Milanova simulacni uloha
21. 4. bmin1Napište program, který pro zadaný ohodnocený strom vypíše u každého vrcholu nejkratší vzdálenost ze zadaného počátečního vrcholu.
bmax2V zadaném neohodnoceném stromě najděte a vypiště nejdelší cestu.
beql2Pro daný ohodnocený strom a konstantu C zjistěte, zda se ve stromě vyskytuje cesta s hodnotou (=součet délek jejích hran) přesně C. Pokud ano, vypiště ji.
27. 4. inco2Jsou zadány intervaly <x1,y1> ... <xn,yn>. Obarvením takového systému intervalů k barvami nazveme přiřazení čísla od 1 do k každému intervalu tak, že protínající se intervaly vždy dostanou různá čísla. Napište program, který k zadaným intervalům spočte nejmenší možný počet barev, s nimiž se dají zadané intervaly obarvit.
sect2Tajná společnost má N agentů očíslovaných 007...N+6. Každý agent může rozkazovat některým dalším agentům. Pokud agent přijme rozkaz, ihned jej předá všem svým podřízeným. Šéfem společnosti nazveme takového agenta, který když vydý rozkaz, obdrží ho postupně všichni ostatní agenti. Napište funkci, které když zadáte, kdo může komu rozkazovat (to je orientovaný graf), najde v lineárním čase některého z šéfů a nebo odpoví, že žádný šéf neexistuje.
5. 5. Žádné domácí úkoly.
12. 5. Cvičení se nekonalo (Rektorský sportovní den).
19. 5. Žádné domácí úkoly.
Stránku spravuje Martin Mareš