Lectures:
1. Computational complexity of algorithms: motivation, asymptotic notation with definitions and examples.
2. Divide and conquer: master theorem with a proof, quickselect, Karatsuba's fast multiplication algorithm, Strassen's matrix multiplication algorithm.
3. Dynamic programming: a review of the fundamental approaches, examples featuring a more complex description of state (traveling salesman problem, graph coloring), examples featuring a more advanced computation of (partial) results (longest increasing subsequence, egg dropping).
4. Maximum-flow problem: definition, Ford-Fulkerson method, Edmonds-Karp algorithm, applications (e.g., in bipartite graph matching).
5. Searching in strings: the naive method, Rabin-Karp algorithm, Knuth-Morris-Pratt algorithm.
6. Text indexing: trie, suffix array, suffix tree.
7. Computational geometry: fundamental geometric object (points, lines, polygons ...), distances, intersections, areas, convex hull, geometric data structures (e.g., k-d trees).
8. Linear programming: formulation with a system of linear inequalities, representing optimization problems as linear programs, simplex algorithm.
Tutorial: In tutorial sessions, the students will deepen their understanding of the material presented during the lectures. They will use their knowledge to solve practical problems.
Homework assignments:
To complete their (weekly) homework assignments, the students will solve programming problems associated with the material covered by lectures and tutorial courses. The solutions submitted by the students will be evaluated using test cases. The scoring of the submitted solutions will be based on their correctness, as well as their ability to respect temporal and spatial constraints.