Master Algorithmic Programming Techniques

Advance your software engineering or data science career by learning algorithms through programming and puzzle solving
I find that I don't understand things unless I try to program them.
Donald E. Knuth
Professor Emeritus at Stanford University
Learning Algorithms through Programming and Puzzle Solving
This book covers algorithmic programming challenges and puzzles that we describe in our Massive Open Online Courses (MOOCs) and provides hints for solving them. It also discusses good programming practices that will help you to become a better programmer.
There are many excellent books on Algorithms—why in the world would we write another one???

Because we feel that while these books excel in introducing algorithmic ideas, they have not yet succeeded in teaching you how to implement algorithms, the crucial computer science skill. Learning algorithms without implementing them is like learning surgery based solely on reading an anatomy book.

This book powers our popular Data Structures and Algorithms online specialization on Coursera and online MicroMasters program at edX. We encourage you to sign up for a session and learn this material while interacting with thousands of other talented students from around the world. As you explore this book, you will find a number of active learning components that help you study the material at your own pace.
Massive Open Online Courses
This series of MOOCs is a mix of theory and practice: you will learn a multitude of algorithmic techniques, implement 100 algorithmic coding problems in a programming language of your choice, and will have a lot of fun solving our algorithmic puzzles. No other online course in Algorithms comes even close to offering you a wealth of programming challenges and puzzles that you may face at your next job interview. We invested thousands of hours into designing our programming challenges and puzzles because our mantra is "Learning Algorithms Through Programming and Puzzle Solving" rather than "Learning Algorithms by Answering Multiple Choice Questions" approach often used in Massive Open Online Courses. We also made a special effort to connect algorithmic problems to real life problems in various areas ranging from data science to genome assembly.
Advantages
Learn essential algorithmic techniques
You will learn essential algorithmic techniques: greedy algorithms, divide-and-conquer, dynamic programming, decomposition of graphs, paths in graphs, minimum spanning trees, algorithms on strings, theory of NP-completeness, etc.
Learn essential data structures
You will learn essential data structures: array, list, stack, queue, dynamic array, priority queue, hash table, disjoint sets, balanced search tree, adjacency list, suffix array, suffix tree.
Practice writing efficient, reliable, and compact code
You will implement about 100 algorithmic programming challenges in a programming language of your choice: C++, Java, Python, C, C#, Haskell, Javascript, Kotlin, Ruby, Rust, and Scala.
Prepare for a technical interview
No other online course in Algorithms even comes close to offering you a wealth of programming challenges that you may face at your next job interview. To prepare you, we invested over 3000 hours into designing our challenges as an alternative to multiple choice questions that you usually find in MOOCs.
Work on the real-world capstone projects
The specialization contains two real-world projects: Big Networks and Genome Assembly. You will analyze both road networks and social networks and will learn how to compute the shortest route between New York and San Francisco (1000 times faster than the standard shortest path algorithms!). Afterwards, you will learn how to assemble genomes from millions of short fragments of DNA and how assembly algorithms fuel recent developments in personalized medicine.
Interact with hundreds of thousands of learners
Since the launch of our online courses in 2016, hundreds of thousands students tried to solve many programming challenges and algorithmic puzzles.
Instructors
Daniel Kane
University of California at San Diego, USA
Daniel Kane is an associate professor at the University of California, San Diego with a joint appointment between the Department of Computer Science and Engineering and the Department of Mathematics. He has diverse interests in mathematics and theoretical computer science, though most of his work fits into the broad categories of number theory, complexity theory, or combinatorics.
Alexander S. Kulikov
Steklov Mathematical Institute of the Russian Academy of Sciences, Saint Petersburg, Russia and University of California at San Diego, USA
Alexander S. Kulikov is a senior research fellow at Steklov Mathematical Institute of the Russian Academy of Sciences, Saint Petersburg, Russia and a lecturer at the Department of Computer Science and Engineering at University of California, San Diego, USA. He also directs the Computer Science Center in Saint Petersburg that provides free advanced computer science courses complementing the standard university curricula. Alexander holds a Ph.D. from Steklov Mathematical Institute. His research interests include algorithms and complexity theory. He co-authored online courses "Data Structures and Algorithms" and "Introduction to Discrete Mathematics for Computer Science" that are available at Coursera and edX.
Michael Levin
Higher School of Economics, Russia and University of California at San Diego, USA
Michael Levin is an Associate Professor at the Computer Science Department of Higher School of Economics, Moscow, Russia and the Chief Data Scientist at the Yandex.Market, Moscow, Russia. He also teaches Algorithms and Data Structures at the Yandex School of Data Analysis.
Pavel Pevzner
University of California at San Diego, USA
Pavel Pevzner is Ronald R. Taylor Professor of Computer Science at the University of California, San Diego. He holds a Ph.D. from Moscow Institute of Physics and Technology, Russia and an Honorary Degree from Simon Fraser University. He is a Howard Hughes Medical Institute Professor (2006), an Association for Computing Machinery Fellow (2010), an International Society for Computational Biology Fellow (2012), and a Member of the the Academia Europaea (2016). He has authored the textbooks Computational Molecular Biology: An Algorithmic Approach (2000), An Introduction to Bioinformatics Algorithms (2004) (jointly with Neil Jones), and Bioinformatics Algorithms: An Active Learning Approach (2014) (jointly with Phillip Compeau). He co-authored online courses "Data Structures and Algorithms", "Bioinformatics", and "Analyze Your Genome!" that are available at Coursera and edX.
Neil Rhodes
University of California at San Diego, USA
Neil Rhodes is a lecturer in the Computer Science and Engineering department at the University of California, San Diego and formerly a staff software engineer at Google. Neil holds a B.A. and M.S. in Computer Science from UCSD. He left the Ph.D. program at UCSD to start a company, Palomar Software, and spent fifteen years writing software, books on software development, and designing and teaching programming courses for Apple and Palm. He's taught Algorithms, Machine Learning, Operating Systems, Discrete Mathematics, Automata and Computability Theory, and Software Engineering at UCSD and Harvey Mudd College in Claremont, California.
Testimonials
by online learners
I found the assignments challenging in the absolute best sense of the term, and therefore incredibly rewarding as well! Whenever I've gotten stuck, the answer was always in the course material somewhere, even if I didn't see it there at first. The discussion forums were extremely helpful, and I was astounded to see that that instructors were still actively monitoring the discussion forums and responding to student questions. I'm obviously not an expert in this field, but I've been an educator before, and my own impression of the assignments was that they were extremely well designed: it was impossible to pass them without knowing what you were doing, the tools to approach them were always found in the lectures, and the challenge problems pushed your knowledge even farther. I would recommend the specialization to everyone. Additionally, I noticed that the content aligns well with other DS&A syllabi I have seen in brick-and-mortar institutions, especially the first 3 or 4 courses. It's also a very nice luxury to be able to submit in Python. I have certainly learned a great deal.
No other MOOC has this kind of vivid and rich content explained broadly. The courses's assignments are one of its kind, challenging yet cool.
So far the best course I have seen that actually teaches algorithms. This course not only explains you the algorithm but will also make you solve programming challenges based on the algorithms which requires you to look at the algorithm from a different perspective and then solve the challenge.This is what I loved the best about this course.I believe I am much better now in implementing algorithms and solving programming challenges.
Very good course especially for competitive programmers. Not like other courses on design algorithms which focus on teaching stander algorithms. This course focus on improving the ability to design and create new algorithms to solve real life problems which makes it prefect for competitive programmers.
I must confess I was a bit hesitant to start this specialization. But after 3 weeks in, I am very happy that I started with this specialization. The course has the right pace and instructors have very nicely divided the videos in shorter logical entities which are easy to understand. I love the exercises. All the other exercises in other courses that I have taken for Сoursera provide you with a lot of code already done and you just have to write a very small piece of code to complete the assignments, but not in this one. We need to write the whole assignment on our own, right from choosing the appropriate data structure and algorithm design. They sure have a starter code but I only look at them once I have some solution, in order to do a check of my code design as well. I must say, this is an awesome course. Great work guys putting this together.
Congratulations for this well-designed, informative and extremely educative course! The language agnostic way of presenting and explaining these basic but important algorithmic techniques provides an extremely useful way to better understand and further elaborate these methods by using the programming language of our choice. Of course, some programming experience in at least one language is needed, but this course can also provide a great lab to start learning others. The programming assignments and the way you have designed them (time/memory constraints) are ideal to learn designing these algorithmic techniques correctly and efficiently.
I always feared coding problems on divide and conquer and dynamic programming. The way this course gradually took me from easy stuffs to advanced was awesome. After doing the course, I feel confident on coding difficult problems. I also appreciate the granularity of topic that this course covers. I took many courses but nowhere until now, I have seen courses that cover how to test and debug your code. Great Course and much take course in case one wants to get good at competitive programming. Good Job teachers. Your efforts are appreciated.
Order the Book
Order the book through Amazon (printed, kindle), Leanpub (pdf, mobile friendly pdf), or MyBookOrders (printed). Browse sample pages (including table of contents): printed version, kindle version, leanpub pdf version, leanpub mobile friendly pdf version.
    Partners
    For Professors
    Interested in adopting these materials in your offline class? Contact us to learn how to seamlessly use our programming challenges and puzzles in your class instead of time-consuming homework grading. We also provide additional educational materials including slides, videos, answers to FAQs, and guidance on how to run a flipped class based on our MOOCs.
    Contact us
    alexander.s.kulikov@gmail.com
    This site was made on Tilda — a website builder that helps to create a website without any code
    Create a website