Pisemna cast: napred je hodina na maly priklad z okruhu : spojaky (mergovani, zasobniky, fronty.......), stromy (vypisy, vytvareni, prochazeni, ....), neco malo z dlouhych cisel,... V zasade jde v malych prikladech o praci s dynamickymi strukturami a jejich konkretni pouziti (pascal) – dereferencovani, atp; tedy prakticke programovaci skills.
pak 5 minut pauza a dve hodiny na velky priklad.
Pro konkrétní představu: Já měl třeba napsat proceduru Replace(a;b;c), kde a, b, c jsou řetězce reprezentované spojovými seznamy znaků, jež má nahradit první výskyt řetězce b v řetězci a řetězcem c. Na přímý dotaz my bylo Töpferem potvrzeno, že nahrazenou část řetězce je vhodné dealokovat. Měl jsem také ošetřené prázdné řetězce a a c, z náhrady jsem ale navytvářel kopii (což by dávalo smysl, ale nechtělo se mi), a dodatečně mě napadlo, že jsem místo Dispose asi napsal Dealloc a jednou jsem přistupoval do uvolněné paměti. Tyto nuance ovšem zůstaly bez povšimnutí a dostal jsem jedničku s tím, že je to bez chyby. Myslím, že tohle byla tak asi středně těžká úloha, nečekejte žádné operace na AVL-stromech:). — Adam
Ustni zkouska probiha ( moje tak probehla ) tak ze nejdriv projde maly priklad zepta se na nejasnosti, necha vas abyste vymysleli napravu pripadnych chyb,... Pak prejde k velkemu – diskuse, ....
Já jsem třeba u dynamického programování měl předvést uzávorkování matic pro konkrétní zadání součinu čtyř matic. Tzn. popsal jsem algoritmus, jak se počítá cena násobení, a pak jsem si podle toho vyplnil pole cenami. S mými aritmetickými schopnostmi to chvíli trvalo, ale nakonec to vyšlo:). — Adam
A nakonec se taze na nektere veci typu : reknete mi neco o : haldach, objektech, dynamickem programovani, ...
4. 5.
Velký příklad: Nalézt nejlépe obodovaný tah ve scrabble. Vstup:
n≤20: rozměr desky
poloha bonusů ( 2x, 4x slovo, 2x, 4x písmeno)
písmena na desce
7 písmen v přihrádce
obodování písmen (pracuje se s celou českou abecedou, 41 písmen)
slovník přípustných slov ≤100000
Smí se použít paměť až několikanásobku velikosti slovníku. Je vhodné zvlášť uvést nějakou inicializaci nezávislou na konkrétním tahu (zřejmě tedy předžvýkání slovníku). Platí běžná scrabblová pravidla.
Stejně jako «čokoláda» je tento příklad prý z minulého roku. — Adam
Řešení: By mělo obsahovat následující elementy: Vybudování stromů (já měl větvící se dle písmen, což je asi nejlepší) ze slovníku, ideálně ve směru čtení slov i po zpátku (tzn. první větvení dle posledního písmene, což mě nenapadlo, přitom, je to podle mě ten hlavní fígl), vybudování hashovací tabulky ze slovníku pro ověřování bokem vytvořených slov. A z toho vychází zbytek, tzn. že se vždycky vezme něco, co už na desce je podle toho se projde pár větvení jednoho ze stromů a dále se prochází podle podle slov, která mohu klást na desku, přičemž se průběžně počítají body a ověřují bokem vytvořená slova.
Mně chyběl ten zpětný slovník, přitom se nás k tomu při zadávání vyloženě snažili dovést tím, jak rozebírali možnosti navazování slov. I tak jsem dostal jedničku. Zkouška probíhala příjemně, malý příklad i teorii jsem měl Ok. A podobně mírný byl Holan, co jsem slyšel, i k ostatním. Jak to probíhalo u Töpfera, nevím, ale divil bych se, kdyby to bylo výrazně jiné. — Adam
Töpfer byl super. Příjemnej, toleroval mi i drobné neznalosti, když jsem předtím měl písemku skoro bezvadně. Mě naopak přišlo, že víc vyhazoval Holan. Ale těžko říct. Nejvíc samozřejmě vždycky zleží na znalostech :) Čestmír
28. 5.
Zadani velkeho prikladu: Mate ctvercovou cokoladu 10 * 10 s policky o stranach 1. V cokolade je nekolik (<= 1000) orisku a hrozinek kruhoveho tvaru. U kazdeho orisku a hrozinky znate jejich souradnice(realne) a polomer(realny). PROBLEM: rozdelte cokoladu na libovolne velke tri dily, s co nejmensi namahou (na rezani) a to tak, ze rezat muzete jen po hranach jednotlivych dilku a v cokolade nesmi byt vyriznuty otvor. Rezani cokolady stoji 1, rezani pres cast s oriskem 5 a rezani pres hrozinku 1/2 energie na jednu hranu (tzn kdyz pulku hrany zabira orisek a zbytek je cokolada, tak hrana stoji 3 j. energie)... Mate k dispozici 1MB pameti. (Napsal Pepa Moudřík, já to sem jen přesunul.)
Reseni: (aneb ja jsem to delal takhle) Napraed se vhodne ohodnoti hrany podle toho kolik je na nich orisku/hrozinek. ( treba pomoci delky tetivy ) Tim se problem prevede na grafovou ulohu, kterou lze resit ruznymy zpusoby. Delal jsem to pomoci F-W a vhodnym prozkoumanim minimalnich cest z okraje na okraj ( namalujte si to na papir a nemel by to byt velky problem ) – 1 rez – a pak vsech cest z (okraje + uzly prvni cesty) na (okraje + uzly prvni cesty) – minimum ze souctu delek je reseni. Bohuzel vsak tenhle algotritmus muze minout optimalni reseni pri zakerne zvolenem rozlozeni orisku a hrozinek. Holan to ale stejne celkem uznal ( prodiskutovali jsme taky nejake chyby a jejich napravu, ... ) a celkove se mi zdal na zkousce velmi prijemny...
Hlavní problém je, že nejkratší řez na tři díly nemusí IMO obsahovat nejkratší řez na dva díly, navíc to má docela slušnou složitost, takže takovej nápad: pro každý vnitřní vrchol: { Dijkstra, následně vybrat z krajních vrcholů tři s nejkratší vzdáleností od daného vnitřního vrcholu, zapamatovat vrcholy, cesty a součet délek} a z těchto součtů minimum. To by mohlo fungovat a nemá to špatnou složitost, vzhledem k tomu, že graf je řídký (m = Θ(n)). — Adam
U – délka souboru Učitelé
L – délka souboru Lístky
UP – počet platných kombinací (Učitel, Předmět)
Návrh algoritmu:
Setřídit Lístky podle (Učitel, Předmět).
Setřídit Katedry podle (Učitel).
Čtu souběžně oba soubory (sekvenčně), dokud stejný (Učitel, Předmět) přičítám sumy xi, xi2, jinak vypíšu. Zapisuju jeden soubor s Učiteli, druhý s Učiteli a Katedrami.
Setřídím soubor s Učiteli a Katedrami podle (Katedra), zapíšu bez pole Katedra.
Má-li soubor s lístky délku L: setřídím v L log L, vypíšu v L, projdu sumy v L atd. (vyjádřeno pomocí U, L, UP).
Tip: Neměl jsem foťák, ale bylo nám doporučeno, abychom si kreslili obrázky (aka data-flow diagramy) jako Holan na tabuli – data a akce pospojované šipečkami.
Části vypracování řešení úlohy
Do Upřesnění nebo postřehů:
průběžné počítání odchylky viz výše
předpoklady platného vstupu (všichni učitelé z lístků jsou z nějaké katedry)
promyslet co se kolikrát bude muset dělat (načítat, vypisovat, slévat), kolik čeho bude (moct být) v paměti
Do Diskuse:
v tomhle případě nic moc
ještě by leda šly jména kateder v určité fázi nahradit čísly/zkratkami, protože je potřebujeme jen na třídění
obecně napsat alternativní algoritmus, byť nerozmyšlený
Do Shrnutí:
přehled na A4, aby se v tom někdo vyznal
26. 1. (info o zkoušce na přednášce)
Malý příklad (na praktickou znalost)
dynamické proměnné, spojové seznamy
Velký příklad
Program
Součástí zadání může být omezení paměti. Je možné, že přesné řešení by mělo nepřijatelnou složitost, pak je třeba volit vhodné přibližné řešení (heuristika, třeba i více heuristik).
Výsledek má být buď (dostatečně) popsaný algoritmus slovy, v pseudokódu, případně i skutečném jazyce.
upřesnění zadání
postřehy k zadání úlohy (zbytečná data apod.)
zdůvodnění volby algoritmu (složitost, případně náročnost na psaní, ladění)
reprezentace dat
dekompozice programu (rozdělení na nezávislé části)
diskuse problému
na A4 shrnutí 1.-5.
Ústní část (asi půl hodiny)
Jako příklad úlohy uváděl problém s letištěmi, který snad je/bude na jeho stránkách, ovšem s tím, že na zkoušku je tenhle příklad naddimenzovaný.