## Algoritmy a složitost
- úvod: co je to algoritmus?
- výpočetní model RAM jako formální zavedení algoritmu
- časová a prostorová složitost
- asymptotická notace

## Třídění
- opakování kvadratických třídicích algoritmů
- Mergesort (iterativní)
- halda a Heapsort
- dolní odhad složitosti třídění a vyhledávání
+ přihrádkové třídění

## Reprezentace dat v paměti
- jak se datové struktury Pythonu překládají do RAMu
- pole, ukazatele, struktury spojované ukazateli
- spojový seznam jednosměrný a obousměrný
- volání funkcí pomocí zásobníku
- binární strom s ukazateli vs. reprezentace v poli
- různé reprezentace výrazů stromem, postfixově, infixově
- alokace paměti, garbage collector, reference counting, weak references

## Rekurze
- princip rekurze
- rekurzivní výpočet Fibonacciho čísel, kešování mezivýsledků
- rekurzivní Mergesort
- prohledávání stromů
- rekurzivní generování

## Grafy: BFS
- reprezentace grafu v paměti
- prohledávání do šířky
- komponenty souvislosti
- nejkratší cesty
- popis stavového prostoru grafem

## Grafy: DFS
- prohledávání do hloubky
- backtracking jako vyhledávací technika
- heuristické prohledávání
- detekce cyklů v orientovaných grafech
- topologické uspořádání a indukce podle něj
+ hry dvou hráčů, minimaxový algoritmus

## Grafy: Ohodnocené
- nejkratší cesty v ohodnocených grafech
- odvození Dijkstrova algoritmu z BFS
- princip diskrétní simulace
- minimální kostry a Jarníkův algoritmus
  (TODO: rozmyslet vazby s DM)
+ Kruskalův algoritmus a Union-Find

## Datové struktury
- statické vs. dynamické struktury
- písmenkové stromy
- binární vyhledávací stromy
    - základní operace
    - statické dokonale vyvážené stromy
    - naznačeno dynamické vyvažování (AVL)
- hešovací tabulky

## Dynamické programování
- 3 různé přístupy k DP:
   - rekurze s kešováním
   - zdola nahoru
   - nejkratší cesta v grafu
- nejdelší rostoucí podposloupnost
- editační vzdálenost
- optimální vyhledávací stromy
+ rychlejší algoritmy pro uvedené problémy

## Rozděl a panuj
- rozklad problémů na podproblémy
- připomenutí Mergesortu
- popis rekurzivního výpočtu stromem
- subkvadratické násobení čísel
- rekurentní rovnice a jejich řešení
- Strassenovo násobení matic (náčrt)

## Vzorkování
- Quickselect: hledání k-tého nejmenšího prvku
- náhodný výběr pivota a pravděpodobnostní analýza algoritmu
  (TODO: ověřit, kdy se probirají základy pravděpodobnosti)
- Quicksort
+ k-tý nejmenší prvek v lineárním čase

## Další algoritmické přístupy (volitelně)
- základní myšlenky funkcionálního programování
   - lambda funkce
   - map a spol., funkce vyššího řádu
- amortizace
   - nafukovací pole
   - vyvažování stromů rekonstrukcemi
- hladové algoritmy
- aproximace