Algorithms: computational geometry, graph algorithms, number theoretic algorithms, string matching. Design and analysis of algorithms: dynamic programming, amortised analysis, judging reasonableness. Programming skills, mainly in C++ and Java.
The course focuses on problem-solving all the way from theory (in the form of algorithm design) to practice (in the form of a working program).
During the course, the student solves a large number of assignments, implements a number of algorithms to build a smaller algorithm library, solves problems in small groups during "problem sessions", and present solutions to assignments orally.
After passing the course, the student shall be able to
- use algorithm design methods such as greedy algorithms, dynamic programming, divide and conquer, and combinatorial search to design algorithms in order to solve given problems
- use basic algorithms in fields such as graph theory, number theory and geometry on given problems and adapt them to problem-specific circumstances
- analyse the efficiency of different algorithms to decide which ones are sufficiently efficient in a given context
- compare different problems with respect to difficulty
- implement algorithms and data structures given abstract specifications
- identify bugs in others' solution attempts on problems
- communicate with others during problem solving in groups
- present algorithms, data structures and problems orally in a concise and lucid way
in order to
- be able to use programming as a tool for problem-solving
- be able to apply theoretical knowledge from other computer science courses on practical problem-solving.