Přednáška z Algoritmů a datových struktur I v LS 21/22 (čtvrtek 14:00, N1, kód předmětu NTIN060)
Stránka přednášky Pavla Veselého z Algoritmů a datových struktur I (ADS1), která probíhá v LS 21/22 každý čtvrtek od 14:00 v učebně N1 (pavilon IMPAKT v Tróji). Budeme navazovat na předmět Algoritmizace. Představu o přednášce si můžete udělat z loňské přednášky Martina Mareše. Druhou paralelku vede Jan Hric.
Mezi 19. a 27. zářím mohu ještě vypsat jednu zkoušku (ale mezi 21. a 23. nejsem dostupný), v případě zájmu se mi ozvěte emailem.
Pokud máte nějaký dotaz, pište na vesely+ads1 (zavináč) iuuk.mff.cuni.cz, případně se zeptejte po přednášce. Také budu rád, když se během cvičení budete ptát, jakmile vám nebude něco jasné. Chcete-li konzultaci, ozvěte se mi emailem nebo po přednášce (vhodný čas je třeba ve čtvrtek v 10:00, ale můžeme se domluvit i jinak). Můžete mě též najít v kanceláři S323 v budově na Malé Straně (v chodbě KAM/IUUK ve 3. patře, zhruba naproti učebně S3), ale je lepší se ozvat předem.
Pokud nemůžete přijít (nemoc, izolace, ...), pusťte si stream, podívejte se na záznam (podaří-li se ho pořídit) nebo si nastudujte příslušnou část skript (viz odkazy na sekce níže).
Co jsme dělali / plán
U každého tématu jsou odkazy na učebnici. Na záznamech je hlavně tabule, slajdy najdete níže.17. 2. | Úvodní informace k předmětu a příklad různých způsobů hledání nejdelší rostoucí podposloupnosti [Pruv 12.2]; představení výpočetního modelu RAM [Pruv 2.5]. Slajdy a záznam. |
24. 2. | Časová a paměťová složitost na RAMu, O-notace (O, Ω, Θ, o, ω; viz slajd 8 z 1. prezentace) [Pruv 2.4-2.5]. Grafové algoritmy: opakování reprezentace grafu [Pruv 5.3], prohledávání do hloubky (DFS) v neorientovaných grafech (DFS strom, klasifikace hran) [Pruv 5.6], aplikace na hledání mostů (bude dokončeno příště) [Pruv 5.7]. Záznam (prvních cca 6 min. opakování z minula) |
3. 3. | Dokončení hledání mostů. Definice artikulace a lemma se základní vlastností (algoritmus pro artikulace bude na cvičeních) [Pruv 5.7], DFS na orientovaných grafech (klasifikace hran a souvislost s uzávorkováním) a jeho aplikace: detekce cyklů, topologické uspořádání a počítání cest [Pruv 5.8], silná a slabá souvislost orientovaných grafů a hledání komponent silné souvislosti (zatím jen nástin kvadratického algoritmu, lineární algoritmus bude příště) [Pruv 5.9]. Pomocné slajdy. Záznam. |
10. 3. | Dokončení hledání komponent silné souvisloti (algoritmus Kosaraju-Sharir) [Pruv 5.9]. Nejkratší cesty v grafech s délkami hran: vlastnosti vzdáleností (trojúhelníková nerovnost), problémy se zápornými cykly, opakování hledání nejkratších cest z počátečního vrcholu na neohodnocených grafech pomocí BFS, odvození Dijkstrova algoritmu z BFS pomocí "budíků", rozbor časové složitosti Dijkstrova algoritmu pomocí různých typů hald: binární, d-regulární, Fibonacciho (bez vysvětlení) [Pruv 6.1 a 6.2]. Pomocné slajdy. Záznam. |
17. 3. | Nejkratší cesty [Pruv 6.3]: Relaxační algoritmy (zobecnění Dijkstrova algoritmu) a jejich analýza. Důkaz správnosti Dijkstrova algoritmu a Bellmanův-Fordův algoritmus pro grafy se zápornými hranami. Floydův-Warshallův algoritmus pro výpočet matice vzdáleností [Pruv 6.4]. Pomocné slajdy (8-9). Záznam. |
24. 3. | Minimální kostry a jejich hledání dle pánů Jarníka, Borůvky a Kruskala [Pruv 7.1-7.4]. Důkazy nalezení minimální kostry přes řezové lemma. Implementace Jarníkova algoritmu podobná Dijkstrovu algoritmu. Datové struktury pro Union-Find problém (pole, keře). Pomocné slajdy (10-13) Záznam. |
31. 3. | Datové struktury: úvodní obecné informace [Pruv 4.1]. Binární vyhledávací stromy [Pruv 8.1]: základní operace, dokonalá vyváženost a nemožnost jejího udržování (s důkazem). Hloubkově vyvážené (AVL) stromy [Pruv 8.2]: definice, důkaz logaritmické hloubky, vyvažování rotacemi a dvojrotacemi po přidávání prvku (bude doděláno příště). Pomocné slajdy. Záznam. |
7. 4. | Stromové datové struktury: vyvažování AVL stromů rotacemi pro vkládání i mazání [Pruv 8.2]. Více klíčů ve vrcholech: (a,b)-stromy (definice, důkaz logaritmické hloubky, údržba po přidání / odebrání klíče) [Pruv 8.3]. Pomocné slajdy. Záznam. |
14. 4. | Červeno-černé stromy ve variantě "left-leaning" (probrána definice, bijekce z (2,4)-stromů a vkládání, vynechali jsme mazání) [Pruv 8.4]. Další stromové datové struktury: písmenkové stromy (trie) [Pruv 4.3] a intervalové stromy [Pruv 4.5]. Hešování: hešovací funkce a tabulka, kolize, řešení kolizí spojovými seznamy (řetízky), průměrná a střední hodnota délky řetízku, přehešovávání a amortizovaná složitost vkládání [Pruv 11.3]. Pomocné slajdy. Záznam. |
21. 4. | Hešování [Pruv 11.3-11.5]: souvislost hešování a narozeninového paradoxu, otevřená adresace (implementace lineárním přidáváním a dvojitým hešováním, analýza střední hodnoty počtu navštívených buněk pro neúspěšné hledání), praktické hešovací funkce (příklady z učebnice + pro zajímavost zmíněn MurmurHash), univerzální hešování (1-univerzalita skalárního součinu, nástin důkazu pro lineární kongrenci). Pomocné slajdy. Záznam. |
28. 4. | Rozděl a panuj: třídění sléváním (Mergesort) [Pruv 10.2], násobení dlouhých čísel Karacubovým algoritmem [Pruv 10.3], Kuchařková věta (Master Theorem) o časové složitosti rekurzivních algoritmů [Pruv 10.4]. Informace o zkoušce. Pomocné slajdy. Záznam. |
5. 5. | Strassenův algoritmus pro násobení matic [Pruv 10.5]. Dynamické programování: Fibonacciho čísla [Pruv 12.1], opakování nejdelší rostoucí podposloupnosti [Pruv 12.2], editační vzdálenost [Pruv 12.3], optimální binární vyhledávací strom (zatím jen definice a náznak algoritmu) [Pruv 12.4]. Pomocné slajdy. Záznam. |
12. 5. | Dynamické programování pro optimální BVS [Pruv 12.4]. QuickSelect a QuickSort: nejlepší a nejhorší případy, skoromediány [Pruv 10.6-10.7], náhodná volba pivota (pravděpodobnostní analýza) [Pruv 11.2], výběr k-tého nejmenšího v lineárním čase deterministicky [Pruv 10.8]. Pomocné slajdy. Záznam. |
19. 5. |
QuickSelect a QuickSort na náhodných vstupech [Pruv 11.2], dolní odhad na binární vyhledávání a třídění porovnávacími algoritmy [Pruv 3.3].
Pomocné slajdy.
Záznam první půlky.
Dále host Karel Tesař (ShipMonk) na téma algoritmické problémy v praxi. |
Cvičení
Cvičení k této paralelce vedou:- Michal Opler (tři cvičení)
- Václav Končický
- Pavel Veselý
Zkouška
Mezi 19. a 27. zářím mohu ještě vypsat jednu zkoušku (ale mezi 21. a 23. nejsem dostupný), v případě zájmu se mi ozvěte emailem.
Zkouška bude ústní s písemnou přípravou a to jak z teorie z přednášky (dvě otázky na algoritmy, datové struktury a jejich analýzu), tak z algoritmických úloh podobných úlohám řešeným na cvičení (dvě úlohy). Na začátku tedy zadám úlohy a poté budete mít dostatek času (a papíru) na rozmyšlení a sepsání odpovědí. Až budete připraveni (nebo s blížícím se koncem zkoušky) se o teorii i řešení úloh pobavíme, popř. vám dám nějakou nápovědu k řešení (která se ovšem promítne do hodnocení).
Pro úspěšné složení zkoušky bude potřeba znám definice a algoritmy z přednášky a vyřešit alespoň jednu úlohu s nápovědou nebo neefektivně. Na dvojku je navíc potřeba znát vlastnosti algoritmů a datových struktur z přednášky (např. časovou složitost, popř. jiná tvrzení dokazovaná na přednášce) a vyřešit obě úlohy s nápovědou. Na jedničku je potřeba umět v zásadě vše z přednášky včetně důkazů a umět řešit úlohy téměř samostatně, popř. pouze s malou nápovědou.
Termíny jsou vypisovány v SISu, zatím jsou vypsány termíny do konce června (v týdnech od 13.6 a 20.6. termíny nebudou, neboť budu pryč na konferencích). V září vypíši pár termínů dle zájmu. V červenci a srpnu mohu vypsat 1-2 termíny (v týdnu od 18.7. nebo v druhé půli srpna), v případě zájmu se mi ozvěte emailem. Před zkouškou nebude nutné získat zápočet, ale je to silně doporučené (mj. si procvičíte řešení algoritmických úloh).
Není třeba se učit zpaměti detaily, ale je potřeba znát ideu výpočetního modelu RAM (např. sadu operací), vyvažování AVL stromu po operaci Insert/Delete, Strassenova algoritmu na násobní matic. Není také potřeba se učit zajímavosti na pomocných slajdech (např. jaké jsou nejlepší výsledky).
Zkouškové okruhy a zadané úlohy na minulých zkouškách:
16. 5. |
|
20. 5. |
|
24. 5. |
|
25. 5. |
|
26. 5. (dopo) |
|
26. 5. (odpo) |
|
1. 6. (dopo) |
|
1. 6. (odpo) |
|
2. 6. (dopo) |
|
2. 6. (odpo) |
|
8. 6. (dopo) |
|
8. 6. (odpo) |
|
9. 6. (dopo) |
|
9. 6. (odpo) |
|
27. 6. |
|
28. 6. |
|
15. 8. |
|
15. 9. |
|
Literatura a zdroje
- Martin Mareš, Tomáš Valla: Průvodce labyrintem algoritmů (hlavní zdroj, digitální verze volně dostupné) [Pruv]
- Videozáznamy Martina Mareše z roku 2021 (nahrané přednášky přes Zoom)
- Videozáznamy Martina Mareše z roku 2015 (přístupné pouze studentům a zaměstnancům MFF UK)
- Programátorské kuchařky KSP (úvodní a méně formální texty o základních algoritmech a datových strukturách)
- Pavel Töpfer: Algoritmy a programovací techniky (pěkná kniha pokrývající základy, ale vše z přednášky v ní nenajdete)
- Animovaný výklad algoritmů v Algovision od prof. Luďka Kučery
- Gnarley trees* – applet demonstrující vyhledávací stromy a jiné datové struktury
- Robert Sedgewick: Left-Leaning Red-Black Trees
- Dasgupta, Papadimitriou, Vazirani: Algorithms
- Cormen, Leiserson, Rivest, Stein: Introduction to Algorithms (2nd Edition), Mc Graw Hill 2001