Predavanja:
1. Računska zahtevnost algoritmov: motivacija, asimptotična notacija z definicijami in primeri.
2. Deli in vladaj: krovni izrek z dokazom, algoritem za hitro iskanje k-tega najmanjšega elementa (quickselect), Karacubov algoritem za hitro množenje, Strassenovo množenje matrik.
3. Dinamično programiranje: ponovitev osnovnih pristopov, primeri s kompleksnejšim opisom stanja (problem trgovskega potnika, barvanje grafov), primeri z zahtevnejšim računanjem (delnih) rezultatov (najdaljše naraščajoče podzaporedje, spuščanje jajc).
4. Problem maksimalnega pretoka: definicija, Ford-Fulkersonova metoda, Edmonds-Karpov algoritem, uporaba (npr. pri problemu prirejanja v dvodelnih grafih).
5. Iskanje po znakovnih zaporedjih: naivna metoda, Rabin-Karpov algoritem, Knuth-Morris-Prattov algoritem.
6. Metode za indeksiranje besedila: drevo trie, priponska tabela, priponsko drevo.
7. Računska geometrija: osnovni geometrijski objekti (točke, premice, večkotniki ...), razdalje, presečišča, ploščine, konveksna ovojnica, geometrijske podatkovne strukture (npr. k-d-drevesa).
8. Linearno programiranje: formulacija s sistemom linearnih neenačb, predstavitev optimizacijskih problemov z linearnimi programi, simpleksni algoritem.
Vaje: Na vajah bodo študentje utrjevali snov, podano na predavanjih. Snov bodo uporabili za reševanje praktičnih problemov.
Domače naloge:
V okviru sprotnih (tedenskih) domačih nalog bodo študentje reševali programerske probleme, povezane s snovjo predavanj in vaj. Oddaje se bodo preverjale s pomočjo testnih primerov. Pri točkovanju bo poleg pravilnosti štelo tudi spoštovanje časovnih in prostorskih omejitev.