- Course ID
- NWI-IBC027
- Credits
- 6 ec

Frits Vaandrager (office M1.04), Joshua Moerman (office M1.08a), and Alexis Linard (office M1.08a)

Joris den Elzen, Aldo Gunning, Marco Hernandez, Tiko Huizinga, Timo Maarse, Ward Theunisse, Tom Westerhout.

Lectures are on Thursday 10.45-12.30 in HG00.307.

This course is about the design and analysis of algorithms: how to design correct and efficient algorithms. The main goal of this course is to provide the intellectual tools for designing and analyzing your own algorithms for problems you need to solve in the future. Some design tools that we will discuss are: data structures (e.g. hash tables, red-black trees), divide-and-conquer, dynamic programming, greedy algorithms, network flows, and randomized algorithms. A significant part of the course will be devoted to a discussion of various graph algorithms (BFS, DFS, shortest paths, spanning trees, tree isomorphism).

To provide the intellectual tools for designing and analyzing algorithms.

Basic programming experience and basic math knowledge (induction, sets, logic, proofs).

List of topics includes: models of computation; basic O-notation to analyze algorithms; divide and conquer; greedy algorithms; data structures (hash tables, heaps, red-black trees,...); graph algorithms; dynamic programming; randomized algorithms.

This course is *not* about machine learning algorithms, see this blog for a discussion.

Participants are expected to invest 168h (=6ec) in this course. Altogether there will be 14 lectures and 14 problem sessions. Each week you will need 2 hours to attend a lecture, 2 hours to attend the problem sessions, and an additional 2 hours to study the lecture material and work on the weekly problems. For each of the two large practical assignments you will need approximately 32 hours. This leaves you with 20 hours to prepare for the exam: 168 = 14*(2+2+2) + 2*32 + 20.

These assignments will be graded and you will be provided with feedback.

- Grades will be awarded on the basis of an exam and two practical assignments. The final grade is 0.6 E + 0.2 P1 + 0.2 P2, where E is the result of the exam and P1 and P2 are the results of the two practical assignment, respectively.
- The grade for the exam must be at least 5: if the grade for the exam is below 5 then the final grade of the course equals the grade for the exam.
- You are only allowed to participate in the exam if you have submitted serious attempts for solutions for the two practical assignments and for 10 out of the 14 weekly assignments ('serious attempt' means grade is not NSI, niet serieus ingeleverd).
- If you followed the course last year, did not pas the course but nevertheless got an average grade of at least 7 for the practical assignments then you don't have to redo the practical assignments this year and your results from last year will also count this year. Please contact the instructor if this applies to you.
- For each weekly assignment with score V or G (sufficient or good) you earn 0.1 bonus point for the exam; the maximum bonus score you can earn is 1 point.
- For the exam there will be a resit but there will not be a second chance for the practical assignments. However, if you successfully completed the practical assignments last year please contact the instructor.

As a general guideline, you may assume that the questions at the exam will be similar to the questions discussed during the weekly problem sessions, with emphasis on questions that ask for the design and analysis of algorithms. Look here for suggestions on how to prepare for the exam.

The following standard monograph on algorithms, including their complexity, is mandatory for the course:

Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, third edition, The MIT Press 2009.

For the practical assignments you may also find it useful to consult the following book, which is freely available on-line:

Clifford A. Shaffer. Data Structures & Algorithm Analysis in C++, third edition.

There are other excellent textbooks that may be less encyclopedic than CLRS but are nicer to read, for instance because they better explain the importance / practical relevance of algorithms by looking at real-world problems that motivate them:

Jon Kleinberg and Eva Tardos, Algorithm Design, first edition, Pearson Education Inc, 2006.

Sanjoy Dasgupta, Christos Papadimitriou, and Umesh Vazirani, Algorithms, 1st edition, 2008.