MOOC Review – Algorithms: Design and Analysis, Part I
After successfully finishing Algortihms: Design and Analysis, Part I, I want to share my experience with those of you thinking of taking this course, so you can understand what to expect and what kind of benefits this MOOC brings to you.
The course is brought to us by Professor Tim Roughgarden at Stanford University via the Coursera platform. As is specified in the description, it draws on material from the same course taught on campus but is not equivalent to it. However, if your main concern is to gather basic knowledge on the main topics of algorithms, I truly believe this course will suit your needs.
The course is addressed to people who want to follow a computer science path, covering topics including asymptotic analysis, divide and conquer algorithms, sorting and searching, basic randomized algorithms, graph search, shortest paths, heaps, search trees and hash tables.
Previous knowledge on at least one programming language is necessary, since programming assignments may be too difficult for those who haven’t programmed before. A bit of knowledge on discrete probabilities might be useful as well.
In my case, I studied electrical engineering and gained some experience on programming during my studies. However, later in my career development I realized that perhaps computer science was the most appropriate major for me. I say “was”, since I’m not planning to earn another bachelor’s degree. I preferred to change my path on the way instead of going back and starting on the road again. My work experience after graduation has helped me improve my skills as a software developer, but I still wanted to have that “basic” knowledge all computer scientists have and that wasn’t part of my engineering studies. Algorithms: Design and Analysis, Part I was a great start for me to accomplish this goal.
This course gave me valuable knowledge on topics every computer scientist knows well or at least remembers seeing during undergraduate studies. It helped me understand concepts that led to the current state of the art in common algorithms implemented by OO programming languages like Java or Python, and database engines like MySQL. Moreover, the course gave me the ability to solve programming problems with fundamental principles of algorithm design that are very useful (and sometimes, necessary) in the construction of the solution.
Let me tell you an anecdote to illustrate how well I leveraged the knowledge acquired in this course. I had the opportunity to participate in a programming contest organized by my university shortly after finishing the course. The contest consisted of 10 programming problems that could be solved by using any common programming language like C, C++, C#, Java, Python, PHP, etc. Participants had 36 hours to solve all the problems, if possible. The criteria to evaluate the solutions took into account the ability of the written programs to return correct outputs with different inputs, including insanely large inputs. It was also necessary (in order to have a better score) to stick to some requirements for each problem, namely time and space complexity. These requirements were expressed in notations common to anyone who has a little understanding of algorithms.
I certainly did NOT have such an understanding prior to my enrollment in Professor Roughgarden’s course. But thanks to this course, I was able not only to understand the whole formulation of the problems (which is essential, as you surely suspect), but also to apply algorithm design skills I had just learned to the problems. In the end, I obtained the 10th best score out of 250 participants. (No, I didn’t get any prize, unfortunately). I made some rough calculations about how I would have done without the Algorithms the course, and I would have hardly scored enough points to be among the 100 best programmers, certainly not in the top 85.
A couple of times while working through this class, I used other online resources in order to better understand what the professor explained, mainly Wikipedia articles. In addition, I watched some related videos from another MOOC platform, CS50 – Introduction to Computer Science I, from Harvard Extension School’s Open Learning Initiative’s courseware. (It is also now available via edX as CS50x.) Specifically, videos from weeks 3, 4 and 7 contain topics closely related to some of the topics of the Coursera algorithms course. (In one lesson, the professor shows an amazing video that demonstrates visually and by audio how sorting algorithms perform.)
The difficulty level of Algorithms: Design and Analysis, Part I may seem a little bit high in some lessons, but in my case, that was due to the talking speed of the professor, which was hard for me to follow, since I’m not a native English speaker. For the rest, as I said before, I believe that if you know at least one programming language and a bit of discrete probabilities, you’ll be OK.
After reading a review of this MOOC, I hope you have a better idea as of what to expect, and perhaps you are now more confident about taking it. Enjoy the ride! And maybe I’ll see you in Part II of the course.