Computability Theory deals with one of the most fundamental questions in computer science: What is computing and what are the limits of what a computer can compute? Or, formulated differently: “What kind of problems can be algorithmically solved?” During the course this question will be studied. Firstly, the notion of algorithm or computing will be made precise by using the mathematical model of a Turing machine. Secondly, it will be shown that basic issues in computer science, like “Given a program P does it halt for any input x?” or “Given two program P and Q, are they equivalent?” cannot be solved by any Turing machine. This shows that there exist problems that are impossible to solve with a computer, the so-called “undecidable problems”. The book is in English, the recorded lectures and slides however, are in Dutch
This course treats various methods to design and analyze datastructures and algorithms for a wide range of problems. The most important new datastructure treated is the graph, and the general methods introduced are: greedy algorithms, divide and conquer, dynamic programming and network flow algorithms. These general methods are explained by a number of concrete examples, such as simple scheduling algorithms, Dijkstra, Ford-Fulkerson, minimum spanning tree, closest-pair-of-points, knapsack, and Bellman-Ford. Throughout this course there is significant attention to proving the correctness of the discussed algorithms. All material for this course is in English. The recorded lectures, however, are in Dutch.