This notebook is based on an algorithms course I took in 2012 at the Hebrew University of Jerusalem, Israel. The material is based on my notes from the lectures of Prof. Alex Samorodnitsky, as well as some entries in Wikipedia and more.

I wrote this notebook because I find the subject interesting, and it helped me prepare for my exam. Hopefully it will help whoever is reading it as well.

Needless to say, I take no responsibility for the accuracy, completeness and correctness of what is written here. I'm not, in any way, an authority on algorithms, so take it as it is. That being said, I still wish this book to be as helpful as possible, so if you find any mistakes or inaccuracies, please send me an email to EyalArubas at gmail.

Also, you are more than welcomed to just tell me what you think of this book. I like the feedback.

The structure of the book is such that each chapter will begin with several examples of relevant problems. These examples will demonstrate a situation in which we need to reach a solution by solving a problem of a certain type. Then in the rest of the chapter we will discuss methods for solving this type of problems, as well as many examples. Each chapter is independent, so you can just jump directly to a subject of your choice.

I encourage you to share this book and pass it along, if you find it useful of course.

You can download a PDF or the latex code from this repository.