Zkouškové otázky z Algoritmů a datových struktur I
4. 6. (předtermín)
- Definujte topologické uspořádání grafu a popište algoritmus na jeho sestrojení.
- Popište a analyzujte algoritmus pro násobení čísel metodou Rozděl a panuj.
- Je dán neorientovaný graf s hranami ohodnocenými čísly z množiny {1,…,L} pro pevné, malé L. Najděte jeho minimální kostru.
- Sestrojte vyhledávací strom, který bude navíc umět operaci Rank(x,y), která v logaritmickém čase spočte, kolik hodnot ve stromu leží v intervalu [x,y].
10. 6. dopoledne
- Definujte AVL strom a dokažte, že má logaritmickou hloubku.
- Komponenty silné souvislosti: definice, algoritmus na jejich hledání
- Je dán neorientovaný graf, otestujte, zda je bipartitní.
- Kdesi v bludišti se nachází robot. Vysíláme posloupnost příkazů (každý příkaz je nějaký pohyb o jedno políčko na sever/jih/východ/západ) pořád dokola, než robot vyleze z bludiště (pokud robot nemůže příkaz provést, protože by narazil do zdi, ignoruje ho). Zjistěte, zda pro danou mapu bludiště a danou posloupnost příkazů platí, že ať robot na počátku stojí kdekoliv, vždy je vysvobozen.
10. 6. odpoledne
- Prohledávání do hloubky a klasifikace hran.
- AVL stromy: definice, operace Insert (s celým rozborem případů).
- Je dán strom, jehož hranám jsou přiřazeny celočíselné délky. Najděte nejdelší cestu.
- Je dáno číslo K. Na vstupu přichází celá čísla, po příchodu dalšího čísla vždy vypíšeme minimum z posledních K čísel.
15. 6. dopoledne
- Minimální kostra: definice a libovolný efektivní algoritmus.
- Kuchařková věta o řešení rekurencí.
- Je dána posloupnost celých čísel x1, …, xn a číslo A. Spočítejte, kolik existuje dvojic indexů (i,j) takových, že xi + xj = A.
- Mějme orientovaný graf, jehož hrany jsou ohodnocené pravděpodobnostmi. Najděte nejpravděpodobnější cestu mezi dvěma vrcholy, tj. takovou, na níž je součin pravděpodobností hran největší možný.
15. 6. odpoledne
- Hledání k-tého nejmenšího prvku.
- Dijkstrův algoritmus.
- Vymyslete datovou strukturu pro hledání rýmů. Vybudujeme ji pro množinu slov. Pak chodí dotazy: pro zadané slovo najděte nejlepší rým (shodující se v co nejvíce písmenech od konce) různý od zadaného slova.
- Mějme bludiště ve tvaru čtvercové sítě, jejíž políčka obsahují místnosti, zdi, klíče K1 až Kk a odpovídající zamčené dveře D1 až Dk. Dveřmi Di je možno projít, pokud jste předtím alespoň jednou navštívili políčko s klíčem Ki. Vymyslete algoritmus, který najde (ne nutně nejkratší) cestu ven z bludiště.
17. 6. dopoledne
- Hešování: princip hešovaní s přihrádkami, definice c-univerzálního systému funkcí a jeho použití, důkaz existence c-univerzálního systému.
- Dijkstrův algoritmus.
- Je dána posloupnost celých čísel. Úsek je vyvážený, pokud se v něm vyskytuje stejný počet kladných hodnot, jako záporných. Najděte co nejdelší vyvážený úsek.
- Mějme šachovnici 3×N poliček. Spočítejte, kolika způsoby se dá vydláždit kostkami 1×2 políčka (rozmístit kostky tak, aby šachovnici vyplnily bez děr a překryvů; kostky jde otáčet).
17. 6. odpoledne
- Algoritmus pro hledání mostů v neorientovaných grafech.
- Definujte (a,b)-stromy, popište operaci Delete a rozeberte její složitost.
- Vymyslete algoritmus pro třídění množiny řetězců v čase lineárním se součtem jejich délek.
- Je dáno číslo K. Na vstupu přichází celá čísla, po příchodu dalšího čísla vždy vypíšte medián z posledních K čísel.
24. 6. dopoledne
- Definujte AVL strom. Vyslovte a dokažte větu o jeho hloubce.
- Definujte komponenty silné souvislosti a popište algoritmus na jejich nalezení v lineárním čase.
- Je dána posloupnost slov ze znaků anglické abecedy. Slova setřiďte podle toho, kolikrát se v poslopnosti vyskytují. Složitost analyzujte vzhledem k celkovému počtu znaků vstupu.
- Uvažujme posloupnost, která je setříděná až na K prvků, které jsou zatříděny chybně (knížky v knihovně hojně navštěvované čtenáři). Navrhněte co nejefektivnější algoritmus (vzhledem k počtu prvků a K), který posloupnost dotřídí.
24. 6. odpoledne
- Vyslovte Bellmanův-Fordův algoritmus na hledání nejkratší cesty a rozeberte jeho správnost a časovou složitost.
- Vyslovte a dokažte kuchařkovou větu o řešení rekurencí.
- Vybudujte pro danou posloupnost celých čísel datovou strukturu, která umí rychle odpovídat na otázky „je úsek od i-tého do j-tého prvku rostoucí?“.
- Je dán slovník. Sestrojte co nejdelší slovní žebřík. To je posloupnost slov ze slovníku taková, že (i+1)-ní slovo získáme z i-tého smazáním jednoho písmene. Například pro anglický slovník AGID-4 vychází žebřík glassiness, glassines, glassine, glassie, lassie, lassi, lass, ass, as, a.
2. 7. dopoledne
- Definujte topologické uspořádání a ukažte, jak ho najít v lineárním čase.
- Definujte AVL strom a popište jeho operaci Insert.
- Labyrint má tvar čtvercové sítě, některá políčka jsou zdi. Archeolog se chce dostat z políčka A na políčko B. Projít na volné políčko mu trvá 1 minutu, prokopat se na políčko se zdí 20 minut. Najděte nejrychlejší cestu.
- Inverze v číselné posloupnosti x1, …, xn je taková dvojice indexů (i,j), pro kterou platí i<j a současně xi > xj. Vymyslete algoritmus, který co nejefektivněji spočte, kolik je v posloupnosti inverzí. Můžete předpokládat, že posloupnost je permutací na množině {1,…n}.
2. 7. odpoledne
- Popište algoritmus prohledávání grafu do hloubky a klasifikaci hran v DFS stromu.
- Vyslovte a dokažte kuchařkovou větu o řešení rekurencí.
- Je dána posloupnost celých čísel x1, …, xn a číslo A. Spočítejte, kolik existuje dvojic indexů (i,j) takových, že xi + xj = A.
- Chceme spočítat součin matic A1, … An. Jelikož násobení matic je asociativní, můžeme posloupnost libovolně uzávorkovat. Chceme najít takové uzávorkování, při němž násobením strávíme co nejméně času. Předpokládáme, že vynásobit matici tvaru R×S maticí tvaru S×T trvá čas R*S*T. (Nápověda: představte si uzávorkování jako strom.)
8. 7. dopoledne
- Definujte časovou a prostorovou složitost algoritmu.
- Definujte komponenty silné souvislosti a popište algoritmus na jejich nalezení v lineárním čase.
- Je dána posloupnost celých čísel a číslo X. Najděte úsek posloupnosti (souvislou podposloupnost), jehož součet je roven X.
- Nalezněte v zadaném stromu největší párování: to je podmnožina hran taková, že žádné dvě hrany nemají společný vrchol.
8. 7. odpoledne
- Červeno-černý strom: definice, důkaz logritmické hloubky.
- Dijkstrův algoritmus: formulace a analýza.
- Je dáno číslo K. Na vstupu přichází celá čísla, po příchodu dalšího čísla vždy chceme vypsat medián z posledních K čísel.
- Je dán neorientovaný graf. Jak množinu jeho hran rozložit na hranově disjunktní cesty délky 2? (Tedy tak, aby každá hrana ležela v právě jedné cestě.) Pokud si nevíte rady s obecným grafem, zkuste to nejdřív pro strom.
15. 7.
- Definujte c-univerzální systém funkcí a ukažte, jak ho použít při hešování.
- Vyslovte Jarníkův algoritmus pro hledání minimální kostry, rozeberte jeho správnost a časovou složitost.
- Je dána posloupnost celých čísel. Najděte co nejdelší úsek (souvislou podposloupnost), jehož součet je dělitelný 7.
- Vymyslete co nejefektivnější algoritmus pro K-cestné slévání: slití K setříděných posloupností o celkové délce N. Jak se změní časová složitost Mergesortu, když budeme dělit na K částí a slévat K-cestně?