The Algorithm Design Manual (2008)
algorist.com
algorist.com
I really really like this idea. It is fairly common that I'm working on an algorithm and I have pieces of it and can see goal line, but can't quite figure out to get there.
Learning to see patterns and generalize solutions from past failures is incredibly useful.
If you enjoy hand-waving and hate rigour, it's a nice read. But if you don't like computer science in the first place, why don't you pick a good novel or a book about giraffes?
https://www.mccaughan.org.uk/g/books/alg-design.html puts a similar objection in a much more sympathetic tone that I can manage.
I am quite enjoying the lecture notes on http ://jeffe.cs.illinois.edu/teaching/algorithms/ recently, but there are for a more advanced course.
I just felt like having wasted my time after looking through it.
CLRS is pretty solid by comparison. (Even if not my favourite book.)
But I guess I'm just grumpy, because the book came with high praise.
To be more constructive:
Sedgewick's Algorithms is good for implementations in imperative languages. Okasaki's Purely Functional Data Structures is a nice introduction to some algorithms and data structures suitable in a purely functional setting. He also addresses laziness.
And finally for the theory, Schrijver's "Combinatorial Optimization: Polyhedra and Efficiency" tells you more about P and the boundary to NP than you ever wanted to know.
Those are just a few that I enjoyed, and I can't claim they are the best.
For example Structure and Interpretation of Computer Programs is definitely worth a read, but it won't help you with algorithms directly.
You'll have to go elsewhere for cutting edge in a lot of areas, but it's great to learn from.
(I did enjoy Concrete Mathematics.)
Knuth is a bit too imperative for my interests.
But if you like strong stuff, Schrijver's "Combinatorial Optimization: Polyhedra and Efficiency" tells you more about P and the boundary to NP than you ever wanted to know.
http://jeffe.cs.illinois.edu/teaching/algorithms/ is reasonably accessible so far for me, yet still manages to teach me new hard things.
None of the books mentioned are bleeding edge. It's easier to get that out of papers.
Of course, it don't focus on algorithms itself. You need to study other materials, provided in books already mentioned here :)
Another lesson that it uniquely provides is that in day to day life you don't use these algorithms. You create new algorithms using the ideas behind the famous ones as a guide. An algorithms book or class that doesn't teach you that problem-solving mindset is basically useless.
Now if you want theory, I continue to recommend Algorithm Design by Kleinberg and Tardos.
Similarly, I think there is scientific value in finding cleaner ways to implement known algorithms, prove their complexity bounds, etc. For example, one of my current projects is to provide total functional implementations of known data structures and algorithms (i.e., free of assertions and unreachable control flow points), and I have gained insight about these data structures and algorithms that I couldn't have possibly obtained from their published descriptions.
One reason I like the book is it gives a high-level overview of what algorithms are available to solve a problem, and a sense of which is most appropriate to my problem. If I need rigor after that, I can go to an appropriate source.
It's a good reference for anyone who is researching how to approach a given problem. One can switch off to a different text later on if they need to, and one of the nice features of Skiena is that he provides links at times to source code and further reading.
Ideally you'd know all the basics and use something like Kao's Encyclopedia of Algorithms to lookup the rest, but that thing is big enough to beat a man to death with. Skiena is a lot more approachable.
That's part of why it's so jarring for an professional to start trying to be an educator for the first time.
(And that taught me that SICP is not as awesome as I nostalgically remembered. My students still didn't like the algorithm design manual.)
If you are trying to prove properties of particular algorithms or you already have a specific algorithm in mind that you're considering using and need to analyze its complexity, then this would not be the best choice.
You shouldn't dismiss/denigrate the book because it doesn't fit with your personal use case.
The whole 'lacking rigor' idea here is a common pitfall for programmers—seems predicated on the false idea that coding is this one dimensional activity with a hard side and a fluffy side, and the fluffy side is largely comprised of deceptions for the weak or timid. I bet there's a strong correlation between folks who prefer (e.g.) Cormen to Skiena and those who insist on using terminal windows and vi/emacs for every task—and yet the correlation you might hope to find with the quality/depth/interest of their work fails to hold.
I always feel kind of bad when I see programmers taking on this attitude (often times it manifests as they're trying to freak out more novice programmers and display their supposed superiority), and unnecessarily hampering themselves. It's one aspect of our culture I'd really like to see die out before it spreads to the next generation.
Personally I've found the best thing is to see a lot of problems. The more problems you've solved, the more reference points you have for solving future ones.
But these have to be problems that you've personally solved.
That's why fluffy algorithm books are a waste of time. Books cannot do the thinking for you.
SOURCE: The Algorithm Design Manual 2nd ed. 2008 Edition https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...