Algoritmy a datové struktury 1
Přednáška z Algoritmů a datových struktur 1 [NTIN060] se koná v LS 2020/2021 ve čtvrtky od 10:40 (v N1, dá-li PES, jinak online).
Na přednášky používáme Zoom, odkaz jste dostali mailem. Pokud vám chybí, napište mi prosím. Videozáznamy přednášek se budou objevovat zde.
Kdybyste čemukoliv nerozuměli, rád si s vámi domluvím konzultaci. Ozvěte se mi prosím na adresu mares+ads@kam.mff.cuni.cz.
Co se přednášelo
datum | téma | video |
---|---|---|
4. 3. | Úvodní příklad s nejdelší rostoucí podposloupností a přehlídka způsobů, jak ho vyřešit. Pokus o definici algoritmu. Výpočetní model RAM: paměť, aritmetické instrukce. | video tabule |
11. 3. |
Výpočetní model RAM.
Čas a prostor konkrétního výpočtu (různé varianty: jednotková cena, logaritmická
cena, omezený rozsah čísel), časová a prostorová složitost algoritmu.
Programování na RAMu a počítání složitosti: příklad s bublinkovým tříděním.
Připomenutí asymptotické notace (O, Ω, Θ).
Prohledávání grafu do hloubky (DFS).
Pokud vám nefungují videa, vypněte si AdBlock. Jedno z jeho
pravidel zakazuje všechna URL s podřetězcem /ads1/ :D
| video tabule |
18. 3. | Aplikace DFS: Klasifikace hran v DFS (stromové, zpětné, dopředné, příčné). Hledání mostů. Detekce cyklů a topologické uspořádání. Algoritmy pro acyklické grafy (počet cest, plánování činností). Silná souvislost: úvod. | video tabule |
25. 3. | Rozklad na komponenty silné souvislosti. Nejkratší cesty v ohodnocených grafech: trojúhelníková nerovnost pro vzdálenosti (neplatí v grafech se zápornými cykly), nejkratší cesta versus nejkratší sled. Odvození Dijkstrova algoritmu z BFS pomocí podrozdělování hran a „budíků“. | video tabule |
1. 4. | Nejkratší cesty: Dijkstrův algoritmus, implementace pomocí různých hald (binárních a k-regulárních). Princip relaxace a důkaz korektnosti Dijkstrova algoritmu. Bellmanův-Fordův algoritmus. | video tabule |
8. 4. | Problém minimální kostry: Jarníkův a Borůvkův algoritmus, lemma o řezech. Jednoznačnost minimální kostry a její určenost uspořádáním hran. Kruskalův algoritmus, udržování komponent souvislosti a Union-Find problem. | video tabule |
15. 4. | Datové struktury: obecný úvod, problém reprezentace slovníku a množiny. Binární vyhledávací stromy a operace s nimi. Dokonale vyvážené stromy a dolní odhad složitosti operací. Hloubkově vyvážené (AVL) stromy: definice a důkaz logaritmické hloubky. | video tabule |
22. 4. | Vyvažování AVL stromů při Insertu a Deletu pomocí rotací. (a,b)-stromy: definice. | video tabule |
29. 4. | (a,b)-stromy: odhad hloubky, Insert a Delete, nastavení parametrů. Červeno-černé stromy: definice LLRB stromu, isomorfismus s (2,4)-stromy, operace Insert. | video tabule |
6. 5. | Reprezentace řetězců pomocí písmenkových stromů (trie), použití pro čísla. Hešování: přihrádky s řetězci prvků, volba hešovací funkce, dynamické rozšiřování tabulky a jeho amortizace. Hešování: c-univerzální systémy funkcí, konstrukce 1-univerzálního systému pomocí skalárního součinu. | video tabule |
13. 5. | Hešování: Použití c-univerzálních systémů, otevřená adresace tabulek. Metoda Rozděl a panuj: třídění sléváním (Mergesort). | video tabule |
20. 5. | Metoda Rozděl a panuj: násobení n-ciferných čísel v čase O(nlog23), věta o časové složitosti rekurzivních algoritmů (kuchařka alias Master theorem). Strassenovo násobení matic (vzorce). Hledání k-tého nejmenšího prvku a různé způsoby volby pivota. Randomizace a průměrná časová složitost. | video tabule |
27. 5. | Lineární algoritmus na výběr k-tého nejmenšího prvku (trik s pěticemi). QuickSort: princip, analýza průměrné složitosti, lemma o harmonických číslech. Dynamické programování: Fibonacciho čísla, nejdelší rostoucí podposloupnost. | video tabule |
3. 6. | Dynamické programování: editační vzdálenost, optimální vyhledávací strom, Floydův-Warshallův algoritmus pro výpočet matice vzdáleností v grafu. | video tabule |
Cvičení
Cvičení k této paralelce vedou:
- Jiří Beneš
- Jan Hric
- Marika Ivanová
- Václav Končický
- Martin Koutecký
- Petr Kučera
- Vladan Majerech
- Michal Opler
- Kristýna Pantůčková
Studentům kombinovaného studia doporučuji vybrat si libovolného cvičícího a domluvit se s ním na získání zápočtu za domácí úkoly. Účast na cvičení není nutná, ale hodí se alespoň občas se tam stavit, abyste měli přehled, co se dělá. Za mnou samozřejmě můžete přijít na konzultaci, domluvte se e-mailem.
Zkoušky
Předtermín se koná 4. 6. (poslední den semestru).
Zkoušet budu každý týden zkouškového období až do 15. 7. Termíny vypíši i na září. Kdybyste chtěli zkoušku během prázdnin, napište; pokud zrovna budu v Praze, vyzkouším vás.
Termíny jsou vypsány v SISu, zapisujte se, prosím, tam. Existují jak prezenční, tak distanční termíny. Prezenční zkoušení výrazně preferuji, ale pokud bydlíte daleko a je pro vás problém přijet na otočku do Prahy, vyzkouším vás distančně. Pokud se termíny hodně zaplní, vypíši další.
Zkouška bude ústní s písemnou přípravou: Na začátku zadám otázky. Vy si odpovědi rozmyslíte (času bude dost) a sepíšete. Pak si o nich spolu popovídáme a na základě toho dostanete buďto známku, nebo nápovědu k další práci. Cílem je, aby každý vyřešil všechno, a známka se bude odvíjet od toho, jak moc jsem vám musel napovídat :)
Ke zkoušce je potřeba:
- Znalost teorie z přednášky – viz požadavky.
- Schopnost řešit algoritmické úlohy podobné těm, jež jsme dělali na cvičení.
- COVID: Podle aktuálních pravidel na fakultním webu není na zkoušku potřeba test.
- Zápočet není povinné získat předem, ale je to doporučené.
- Doporučuji čistou mysl a dobrou náladu :)
Kdybyste potřebovali vyzkoušet během prázdnin nebo v září, je to možné, dejte mi vědět.
Literatura
- Martin Mareš, Tomáš Valla: Průvodce labyrintem algoritmů
- Videozáznamy z roku 2015 (přístupné pouze studentům a zaměstnancům MFF UK)
- Mé minulé přednášky z let 2018, 2017, 2015, 2013, 2011, 2009, 2007 a zápisy z nich.
- Dasgupta, Papadimitriou, Vazirani: Algorithms (velice pěkná knížka pokrývající většinu přednášky, navíc dostupná online)
- Programátorská kuchařka KSP (nepříliš formální textíky o různých algoritmech)
- Cormen, Leiserson, Rivest, Stein: Introduction to Algorithms (2nd Edition), Mc Graw Hill 2001 (vpravdě monumentální dílo)
Ostatní zajímavé knihy:
- Jiří Demel: Grafy a jejich aplikace (grafové algoritmy)
- Martin Mareš: Krajinou grafových algoritmů (lahůdky pro pokročilé a zvídavé)
- Matoušek, Nešetřil: Kapitoly z diskrétní matematiky (kombinatorické pozadí, také úvod do pravděpodobnosti)
- Pavel Töpfer: Algoritmy a programovací techniky (pěkná úvodní knížka)
Sbírky příkladů:
- Martin Mareš, Pavel Töpfer: Korespondeční seminář z programování 1987–1998
- Archiv KSP a MO-P na webu
- Ivan Libicher, Pavel Töpfer: Od problému k algoritmu a programu
Různé:
- Animovaný výklad algoritmů v Algovision kolegy Kučery.
- Applet demonstrující vyhledávací stromy
- Robert Sedgewick: Left-Leaning Red-Black Trees (varianta červeno-černých stromů zmíněná na přednášce)