Ask HN: What skills do I need before tackling The Algorithm Design Manual?
We all agree that computer science is not programming, but I believe a firm grasp on basic CS concepts can make anyone a better developer. This relationship is similar to that of a journalist who studies English. While a journalist can have a great career without studying English, there is certainly an argument that theory (English) is just as important as application (Journalism). For programmers, this is the difference between studying theoretical computer science (algorithms, data structures, AI, etc) and learning programming languages (Python, C, etc).
My goal is to become proficient at engineering optimized algorithms for solving real-world problems. This won’t happen by diving right into a book on algorithms and that is something that I fully understand. My question is this: What do I need to know before I start tackling The Algorithm Design Manual? To be a good algorithm designer one certainly needs to know how to analyze the time complexity of an algorithm. What math skills, specifically, are required to do this well? I’ve heard that going through a book on discrete mathematics would be a good idea. What else would you recommend? Statistics and probability, perhaps?
5 comments
[ 3.1 ms ] story [ 26.5 ms ] threadObviously Skiena's book is in C- so be somewhat familiar with it. Again no need to go crazy deep into C before you start. You can learn as you go.
I'd recommend just diving in and using other resources as references if you come across anything you don't know, rather than spending too much time working though "pre-requisites".
http://en.wikipedia.org/wiki/The_C_Programming_Language
1) Figuring out how to prove whether your algorithm works.
2) Learning how to build new algorithms.
The two parts are intertwined. If you really want to learn how an algorithm works, you must be able to convince yourself how it works: Part of that is to build a mathematical proof that it works, another part is to be able to code it out. So first out figure out the technical language of how to convince yourself mathematically whether an algorithm works: Work on a few proofs, a few chapters from any discrete math books (e.g. Rosen) should help there. Pick a language that lets you focus on algorithm details without having to mess with a lot of infrastructure details. Then practice, go over the book (by which I mean solve as many problems as you can), play with algorithms by googling questions that are related so that you can get a flavor for how different algorithms get used. Eventually as you progress through the book, you will start getting a sense for how to decompose most engineering problems into well known algorithms or combinations of algorithms.