This module is the continuation of Algorithms 1, now focusing more on how things connect rather than introducing extraneous concepts. With that, it is aimed at all those who are familiar with the basics of the theory of algorithms (e.g., different design paradigms, the notion of complexity, lists, trees, hash tables, queues, heaps, searching and sorting) but tempted to broaden and deepen their understanding of the subject. The Devil is in the details, says the adage, so we will try to reveal the subtle interplay between theory and practice by looking at problems that are easy to implement yet illustrative to see in action. We will discuss these pearls together, enriching your technical palette to draw from. For its simplicity (at least at this level), our chosen programming language is Haskell. With that, we will also introduce some elements of functional algorithm design (e.g., currying, laziness). Though we will learn all the necessary instruments Haskell provides, we still don’t get down to the nitty-gritty of computer programming. Instead, we take a look at how issues in practice pave the way for theoretical findings.
Module Leader:András Kornai