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.