Sylaby
Osnova predmetu
Anotácia predmetu
Predmet je zameraný na programovanie v jazyku Python a na praktické pochopenie dátových štruktúr, algoritmov a moderných programovacích prístupov. Študenti si postupne osvoja syntax jazyka, prácu s kolekciami, objektové a funkcionálne programovanie, analýzu zložitosti, základné dátové štruktúry, stromové a grafové štruktúry, dynamické programovanie, spätné prehľadávanie, kompresné algoritmy a asynchrónne aj paralelné spracovanie.
Dôraz je kladený na čitateľný kód, schopnosť vybrať vhodnú dátovú štruktúru alebo algoritmus, pochopenie výkonnostných dôsledkov riešení a praktické ukážky v Pythone.
Prehľad prednášok
| Prednáška | Téma | Súbor | Stručné zameranie |
|---|---|---|---|
| 01 | Úvod do Pythonu | prednasky/01.intro/presentation.md | Syntax, typy, reťazce, súbory, kolekcie, moduly a prostredie |
| 02 | Funkcionálne programovanie | prednasky/02.functional/presentation.md | Čisté funkcie, testovanie, lambdy, map/filter/reduce a generátory |
| 03 | Objektové programovanie | prednasky/03.object/presentation.md | Triedy, objekty, OOP princípy, návrhové vzory a výnimky |
| 04 | Asymptotická zložitosť | prednasky/04.complexity/presentation.md | Big-O, vyhľadávanie, triediace algoritmy a analýza efektívnosti |
| 05 | Zásobník, fronta, hash tabuľka, halda a prioritná fronta | prednasky/05.structures/presentation.md | Stack, queue, hash table, heap, priority queue a work queue |
| 06 | Stromy | prednasky/06.tree/presentation.md | Základné pojmy, aplikácie stromov, prechádzanie, BST a špeciálne stromy |
| 07 | Grafové algoritmy | prednasky/07.graph/presentation.md | Pojmy grafovej teórie, reprezentácie, prehľadávanie, najkratšie cesty a toky |
| 08 | Dynamické programovanie a spätné prehľadávanie | prednasky/08.dynamic/presentation.md | Memoizácia, tabulácia, backtracking, CSP a Sudoku |
| 09 | Kompresné algoritmy | prednasky/09.compression/presentation.md | RLE, LZ77, LZ78 a LZW |
| 10 | Huffmanovo kódovanie | prednasky/10.huffman/presentation.md | Informácia, entropia, prefixové kódy, Huffmanov strom a heapq |
| 11 | Asynchrónne programovanie | prednasky/11.async/presentation.md | async, await, event loop, tasky, queue a async web |
| 12 | Paralelné programovanie | prednasky/12.parallel/presentation.md | Threading, multiprocessing, GIL, race condition a locky |
Cvičenia podľa prednášok
| Prednáška | Existujúce cvičenie | Stav a odporúčaný doplnok |
|---|---|---|
| 01. Úvod do Pythonu | cvicenia/01.intro/item.md | Hotové úvodné cvičenie s prípravou prostredia a analyzátorom frekvencie slov. Doplniť jasný formát odovzdania, napr. solution.py, aby sa dalo jednotne testovať. |
| 02. Funkcionálne programovanie | cvicenia/04.functional/item.md | Vecne patrí k funkcionálnej prednáške: čisté funkcie, map, filter, reduce, closure a testy. Bonus s Pool.map() presunúť alebo explicitne označiť ako prepojenie na paralelizmus. |
| 03. Objektové programovanie | cvicenia/02.class/item.md | Rozpracované OOP cvičenie s triedami MenuItem, Order, Table, Restaurant. Doplniť presné rozhranie tried, ukážkové dáta a automatické testy špeciálnych metód __len__, __iter__ a __add__. |
| 04. Asymptotická zložitosť | cvicenia/04.complexity/item.md, čiastočne cvicenia/logparser/item.md | Nové cvičenie cielene overuje O(n), O(log n) a neefektívne O(n^2) riešenia pomocou automatických testov s počítaním operácií. Log parser ponechať ako rozšírený dátový projekt. |
| 05. Dátové štruktúry | čiastočne cvicenia/logparser/item.md | Log parser precvičí slovníky a agregácie. Navrhované cvičenie: validátor zátvoriek cez zásobník, simulácia fronty požiadaviek, top-k najčastejších prvkov cez hash tabuľku a heapq, s krátkou analýzou zložitosti. |
| 06. Stromy | cvicenia/tree/item.md | Zatiaľ iba náčrt rozhodovacieho stromu. Doplniť testovateľné zadanie: binárny strom výrazov, prechody preorder/inorder/postorder, výpočet výšky a vyhodnotenie výrazu. Bonus môže byť jednoduchý rozhodovací strom s textovou vizualizáciou. |
| 07. Grafové algoritmy | cvicenia/07.graph/item.md, rozšírenie cvicenia/netwok/item.md, čiastočne cvicenia/turtle/item.md | Nové cvičenie cielene pokrýva adjacency list, BFS najkratšiu cestu, DFS dosiahnuteľnosť, komponenty súvislosti a topologické triedenie s automatickými testami. Sieťový/OSM náčrt ponechať ako projektové rozšírenie. |
| 08. Dynamické programovanie a backtracking | cvicenia/03.dynamic/item.md, čiastočne cvicenia/turtle/item.md | Cvičenie N-kráľovien dobre pokrýva backtracking. Chýba samostatná úloha na dynamické programovanie: Fibonacci s memoizáciou, problém batohu alebo edit distance s tabuľkou a rekonštrukciou riešenia. |
| 09. Kompresné algoritmy | cvicenia/08.compression/item.md | RLE kódovanie/dekódovanie priamo nadväzuje na prednášku. Ako bonus doplniť LZ77 alebo LZ78 tokenizáciu na krátkych reťazcoch. |
| 10. Huffmanovo kódovanie | cvicenia/10.huffman/item.md | Nové cvičenie pokrýva početnosti cez Counter, zostavenie Huffmanovho stromu pomocou heapq, prefixové kódy, zakódovanie, dekódovanie a porovnanie počtu bitov s ASCII. |
| 11. Asynchrónne programovanie | cvicenia/05.async/item.md, cvicenia/web/item.md | FastAPI cvičenie dobre pokrýva asyncio.gather() a meranie súbežnosti. Webové cvičenie ponechať ako rozšírenie a doplniť konkrétne endpointy, testy a očakávané JSON odpovede. |
| 12. Paralelné programovanie | cvicenia/12.parallel/item.md, čiastočne cvicenia/04.functional/item.md | Nové cvičenie pokrýva CPU-bound výpočet prvočísel, rozdelenie práce, sekvenčné a paralelné riešenie cez ProcessPoolExecutor a testovateľné použitie paralelného vykonávača. Bonus vo funkcionálnom cvičení ponechať ako prepojenie na čisté funkcie. |
Detailná osnova
01. Úvod do Pythonu
Stručný obsah:
Prednáška predstavuje jazyk Python, jeho použitie, interpretovaný charakter, základnú syntax, premenné, funkcie, dynamické typovanie a základné údajové typy. Ďalej pokrýva reťazce, indexovanie, slicing, formátovanie, vstup, prácu so súbormi, zoznamy, slovníky, comprehension konštrukcie, moduly, balíčky, pip a virtuálne prostredia.
Kľúčové slovíčka:
Python, interpret, syntax, premenná, funkcia, dynamické typovanie, objekt, garbage collector, type hints, konverzia typov, str, slicing, f-string, stdin, súbor, list, dict, list comprehension, dict comprehension, modul, balíček, pip, virtuálne prostredie.
02. Funkcionálne programovanie
Stručný obsah:
Prednáška predstavuje funkcionálny štýl programovania v Pythone, výhody čistých funkcií, minimalizáciu zmien stavu a prácu s funkciami ako objektmi. Vysvetľuje testovanie čistých funkcií, lambdy, funkcie vyššieho rádu, map, filter, reduce, list comprehensions, rekurziu, closures, dekorátory a generátory.
Kľúčové slovíčka:
funkcionálne programovanie, čistá funkcia, vedľajší efekt, testovanie, assert, pytest, parametrizovaný test, immutability, lambda, funkcia vyššieho rádu, map, filter, reduce, list comprehension, rekurzia, tail recursion, closure, dekorátor, generátor.
03. Objektové programovanie v Pythone
Stručný obsah: Prednáška vysvetľuje základné princípy objektového programovania, objekty, triedy, atribúty, metódy, konštruktory, špeciálne metódy, dedičnosť, polymorfizmus a zapuzdrenie. Obsahuje aj iterátory, generátory, typovanie, výnimky, duck typing, singleton, factory pattern, best practices a prehľad SOLID princípov.
Kľúčové slovíčka:
OOP, trieda, objekt, inštancia, atribút, metóda, __init__, dedičnosť, polymorfizmus, zapuzdrenie, abstrakcia, kompozícia, iterátor, generátor, výnimka, duck typing, EAFP, singleton, factory, SOLID.
04. Asymptotická zložitosť
Stručný obsah:
Prednáška vysvetľuje, prečo je efektívnosť algoritmov dôležitá, ako sa používa asymptotická zložitosť a notácia Big-O. Obsahuje príklady zložitostí O(1), O(n), O(n²), O(log n), kombinovanú zložitosť, najlepší, priemerný a najhorší prípad, porovnanie rastu funkcií a lineárne aj binárne vyhľadávanie. Druhá časť sa venuje triediacim algoritmom, vstavanému triedeniu v Pythone a abstraktným modelom výpočtu.
Kľúčové slovíčka:
Big-O, asymptotická zložitosť, časová zložitosť, pamäťová zložitosť, O(1), O(n), O(n²), O(log n), O(n log n), lineárne vyhľadávanie, binárne vyhľadávanie, množina, bubble sort, selection sort, insertion sort, merge sort, quick sort, Timsort, RAM model, RASP model.
05. Zásobník, fronta, hash tabuľka, halda a prioritná fronta
Stručný obsah: Prednáška vysvetľuje základné dátové štruktúry používané pri ukladaní prvkov, rýchlom vyhľadávaní a plánovaní úloh. Zaoberá sa zásobníkom, frontou, hash tabuľkou, haldou, prioritnou frontou a vzorom work queue, ktorý sa neskôr používa pri asynchrónnom a paralelnom spracovaní.
Kľúčové slovíčka:
zásobník, stack, LIFO, fronta, queue, FIFO, hash tabuľka, hash funkcia, kolízia, reťazenie, otvorené adresovanie, load factor, dict, set, priority queue, priorita, halda, heap, heapq, queue.Queue, PriorityQueue, work queue, producer, worker.
06. Stromy
Stručný obsah: Prednáška predstavuje strom ako hierarchickú dátovú štruktúru zloženú z uzlov a hrán. Vysvetľuje základné pojmy, hĺbku, výšku, podstrom, vzťah stromov a grafov a praktické aplikácie stromov. Následne sa venuje binárnym stromom, BST, prechodom preorder/inorder/postorder, prechádzaniu po úrovniach, n-árnym stromom, iteratívnemu prechádzaniu a špecializovaným stromom ako B-stromy, B+-stromy a Red-Black stromy.
Kľúčové slovíčka: strom, uzol, hrana, koreň, rodič, potomok, list, podstrom, hĺbka, výška, úroveň, binárny strom, BST, preorder, inorder, postorder, level-order, queue, zásobník, n-árny strom, B-strom, B+-strom, Red-Black strom.
07. Grafové algoritmy
Stručný obsah: Prednáška slúži ako prehľad pojmov a algoritmov z grafovej teórie. Zahŕňa základné typy grafov, reprezentácie grafov, prehľadávanie BFS a DFS, komponenty súvislosti, topologické poradie, algoritmy najkratších ciest, minimálne kostry, sieťové toky, implementačné nástroje v Pythone a praktické aplikácie grafov.
Kľúčové slovíčka: graf, vrchol, hrana, orientovaný graf, neorientovaný graf, vážený graf, adjacency matrix, adjacency list, edge list, BFS, DFS, Dijkstra, Bellman-Ford, A*, Floyd-Warshall, minimálna kostra, Kruskal, Prim, union-find, maximum flow, Ford-Fulkerson, Edmonds-Karp, residual graph, NetworkX.
08. Dynamické programovanie a spätné prehľadávanie
Stručný obsah: Prednáška uvádza dynamické programovanie ako techniku na riešenie opakujúcich sa podproblémov pomocou memoizácie a tabulácie. Následne prechádza k naivnému prehľadávaniu a spätnému prehľadávaniu, ukazuje prácu s rozhodovacím stromom, prerezávaním, permutáciami, 8 kráľovnami, rozvrhovaním, min-konfliktovou heuristikou a Sudoku.
Kľúčové slovíčka: dynamické programovanie, podproblém, memoizácia, tabulácia, optimálna podštruktúra, prekrývajúce sa podproblémy, Fibonacciho čísla, problém batohu, backtracking, rozhodovací strom, pruning, CSP, 8 kráľovien, Sudoku, MRV heuristika.
09. Kompresné algoritmy v Pythone
Stručný obsah: Prednáška ukazuje praktické implementácie jednoduchých bezstratových kompresných algoritmov. Začína algoritmom Run Length Encoding, pokračuje algoritmami LZ77 a LZ78 a končí bonusovou praktickejšou verziou LZW používanou v rôznych formátoch. Pri každom algoritme sú ukázané kódovanie, dekódovanie a príklad použitia.
Kľúčové slovíčka: kompresia, bezstratová kompresia, RLE, run length encoding, LZ77, sliding window, offset, dĺžka, LZ78, slovník, token, LZW, kódovanie, dekódovanie, redundancia.
10. Kompresia a Huffmanovo kódovanie
Stručný obsah:
Prednáška prepája teóriu informácií s kompresiou. Vysvetľuje pravdepodobnosť symbolov, entropiu, kódové slová, stratovú a bezstratovú kompresiu, prefixové kódovanie a princíp Huffmanovho kódovania. Praktická časť používa Counter, výpočet pravdepodobností a entropie, prioritnú frontu cez heapq, tvorbu Huffmanovho stromu, generovanie kódov a porovnanie veľkosti oproti ASCII.
Kľúčové slovíčka:
teória informácií, symbol, početnosť, pravdepodobnosť, entropia, kódové slovo, prefixový kód, kompresia, stratová kompresia, bezstratová kompresia, Huffmanovo kódovanie, Huffmanov strom, prioritná fronta, Counter, heapq, kompresný pomer.
11. Asynchrónne programovanie v Pythone
Stručný obsah:
Prednáška vysvetľuje, prečo a kedy používať asynchrónne programovanie. Zaoberá sa pojmami async def, coroutine, await, asyncio, event loop, tasky, gather, timeout, cancellation, výnimky, semaphore, async queue, async context manager, async iterátor a async generátor. Ukazuje použitie pri HTTP requestoch, databázach, frameworkoch a rozdiel medzi async, vláknami a paralelizmom.
Kľúčové slovíčka:
async, await, coroutine, asyncio, event loop, task, asyncio.gather, create_task, timeout, cancellation, semaphore, async queue, producer-consumer, async context manager, async iterator, async generator, aiohttp, FastAPI, concurrency, parallelism.
12. Paralelné programovanie v Pythone
Stručný obsah:
Prednáška sa venuje mechanizmom používaným pri konkurentnom a paralelnom programovaní. Vysvetľuje multithreading, multiprocessing, GIL, race condition, mutex, kritickú sekciu a porovnáva prístupy asyncio, threading a multiprocessing podľa typu úlohy. Obsahuje aj praktické príklady Pool.map a dôvod, prečo sa čisté funkcie dobre paralelizujú.
Kľúčové slovíčka:
threading, thread, multiprocessing, process, Pool.map, GIL, race condition, mutex, lock, kritická sekcia, čistá funkcia, I/O-bound, CPU-bound, zdieľaná pamäť, event loop.
Chýbajúce alebo slabšie pokryté témy
Tieto témy by bolo vhodné doplniť ako samostatné prednášky, kratšie bloky alebo praktické cvičenia:
| Téma | Odporúčané zaradenie | Dôvod |
|---|---|---|
| Práca s dátovými formátmi | po 01.intro |
Prakticky dôležité sú JSON, CSV, pathlib a bezpečná práca so súborovými cestami. |
| Rekurzia ako samostatné precvičenie | po 02.functional, pred 06.tree |
Rekurzia je v prednáške funkcionálneho programovania, ale používa sa aj v stromoch, backtrackingu a dynamickom programovaní; oplatí sa pridať krátke samostatné cvičenie. |
| Rozšírené meranie zložitosti | po 04.complexity |
Základné cvičenie už overuje počet operácií automatickými testami; ako rozšírenie je vhodné doplniť meranie času a porovnanie implementácií na rovnakých vstupoch. |
| Cvičenie na zásobník, frontu, hash tabuľku a haldu | po 05.structures |
Existujúce cvičenia tieto štruktúry pokrývajú iba nepriamo; vhodné je jedno kombinované zadanie s stack, queue, dict/set a heapq. |
| Union-Find / DSU | pred alebo v 07.graph |
Potrebné pre Kruskalov algoritmus a prácu s komponentmi grafu. |
| Serializácia Huffmanovho stromu | po 10.huffman |
Základné cvičenie už pokrýva strom, prioritnú frontu, kódovanie a dekódovanie; ako rozšírenie je vhodné doplniť uloženie stromu spolu so zakódovanými dátami. |
| Benchmark paralelného programovania | po 12.parallel |
Základné cvičenie už pokrýva paralelné rozdelenie CPU-bound úlohy; ako rozšírenie je vhodné pridať meranie výkonu na rôznych počtoch workerov a porovnanie s vláknami. |
| Jednotná štruktúra cvičení | priebežne | Niektoré cvičenia sú hotové, iné sú iba náčrt. Každé zadanie by malo mať cieľ, vstup/výstup alebo API, požiadavky, príklady a automatické testy. |
| Dokumentácia a štýl kódu | priebežne | Vhodné doplniť PEP 8, pomenovanie premenných, docstringy a čitateľnosť programov. |
Príliš zložité alebo voliteľné časti
Nasledujúce časti sú užitočné, ale pre základný priechod kurzom môžu byť príliš náročné. Odporúčané je označiť ich ako bonus, presunúť na koniec prednášky alebo rozdeliť do pokročilého bloku.
| Prednáška | Časť | Odporúčanie |
|---|---|---|
02.functional |
Tail vs. head recursion | Označiť ako doplnok; v Pythone nie je tail-call optimalizácia bežná, preto môže študentov miasť. |
03.object |
SOLID princípy, singleton, factory pattern, viacnásobná dedičnosť | Nechať ako rozšírenie po zvládnutí tried, dedičnosti, polymorfizmu a výnimiek. |
04.complexity |
RAM/RASP abstraktné stroje | Presunúť do bonusovej časti; základom má byť praktická analýza zložitosti a triedenie. |
06.tree |
B-stromy, B+-stromy, Red-Black stromy | Uviesť najmä motivačne; detailné operácie rotácií a vyvažovania patria do pokročilej časti. |
07.graph |
Johnsonov algoritmus, sieťové toky, Dinic, Push-Relabel | Pre základnú grafovú prednášku stačia BFS, DFS, Dijkstra, topologické triedenie a MST; zvyšok ako prehľad alebo bonus. |
08.dynamic |
Min-konfliktová heuristika a komplexnejšie CSP | Zaradiť až po tom, čo študenti ovládajú základný backtracking a prerezávanie. |
10.huffman |
Entropia a kompletná implementácia Huffmanovho stromu naraz | Rozdeliť na teóriu kódovania a samostatnú implementačnú časť; predpokladom má byť prioritná fronta a strom. |
11.async |
Vlastná implementácia event loopu cez select |
Ponechať ako bonus na konci; pre bežné použitie stačí model asyncio, await, tasky a queue. |
11.async |
Async databázy, frameworky a architektúra webovej aplikácie | Zredukovať na prehľad, ak kurz nie je zameraný na webový backend. |
12.parallel |
Súbežné porovnanie async, threading a multiprocessing | Vysvetľovať až po tom, čo študenti samostatne prešli async aj multiprocessing; inak sa pojmy miešajú. |