This course introduces basic concepts of design and analysis of computer algorithms: the basic principles and techniques of computational complexity (worst-case and average behavior, space usage, and lower bounds on the complexity of a problem), and algorithms for fundamental problems. It also introduces the areas of NP-completeness and parallel algorithms.

Jiwon Park, Taegyoung Lee, Yoonsung Choi.

The class meets Monday and Wednesday from 13:00 to 14:15. Lectures are given in English.

The final grade will be composed as follows (small changes reserved):

- Programming Homework (10%), Paper Homework (10%), Midterm (30%), Final (40%), Participation (10%).

There will be a midterm and a final exam.

Here is a rough list of what we will cover in each week of the semester.

Week 1 | Introduction, graph basics and representation, DFS |

Week 2 | Direct graphs, strongly connected components, BFS |

Week 3 | Shortest paths |

Week 4 | Reductions, recursion, divide-and-conquer |

Week 5 | Sorting |

Week 6 | Introduction to dynamic programming |

Week 7 | More dynamic programming: edit distance, Huffman trees |

Week 8 | Midterm exam |

Week 9 | Greedy algorithms |

Week 10 | Minimum spanning trees |

Week 11 | Introduction to randomized algorithms |

Week 12 | Hash tables |

Week 13 | Lower bounds and adversary arguments |

Week 14 | Polynomial time reductions, SAT |

Week 15 | NP-Completeness |

Week 16 | Final Exam |

Class announcements will be made on KLMS.

For asking questions and discussion the course material, however, we will be using Piazza.

Here is our Piazza class page.

If you do not understand something, it is important that you ask questions. Piazza allows you to ask questions and get answers from the instructor, the teaching assistants, and your classmates. You can ask questions anonymously, so don't be shy and ask!

Both Korean and English are acceptable on Piazza :-). You make it easier for me if you write in English, but if the TAs can answer your question, then Korean is just fine.

To ask questions, you need to register on Piazza and enroll as a student for CS300. To do so, go to the CS300 enrollment page. Select "Join as student". You will then need to use your KAIST email address (ending with @kaist.ac.kr) to create an account.

The class will mostly use the book Algorithms by Dasgupta, Papadimitriou, and Vazirani. The international edition is quite inexpensive, and there is also a Korean translation. Students are not required to buy the book.

We will also make use of Jeff Erickson's lecture notes and lecture notes by Avrim Blum.

There will be one or two programming homeworks in this course. Programming can be done in most major imperative programming languages, such as Java, C, C++, Scala, Kotlin, or Python. Programming projects are submitted using an electronic submission server.

There will also be several small theoretical homework assignments, where you can test your understanding of the course material. You will have about one week to complete one assignment and they can be turned in in either Korean or English. Homeworks must be submitted on paper in the homework box.