If you feel like I do, there are two books in particular that come to mind in that their content transcends the normal teaching curriculum and they both force you to think long and hard about how the authors came up with these fantastic little optimizations. I personally learned a lot from trying to reconstruct the thought process that must have led up to some of the algorithms implemented therein.
The first book is called Pearls of Functional Algorithm Design, and while it focuses on implementation in Haskell, you don't need to be a functional programming expert to get a lot out of the book.
The second book is called Foundations of Multidimensional and Metric Data Structures, and while the name might scare some away, it has a lot of interesting algorithms and accompanying research paper references so you can go off and explore. It took me several years to make my way through it completely, but I have gained a much better understanding of algorithms (and data structures!) that deal with more complex topics (such as computer vision).
There's one book I'd like to call out, as well. Introduction to Algorithms could be so much better than it is. It has all the right ingredients for a fantastic introduction to algorithms, but the way its written had most people in my algorithms class, myself included, bored beyond belief.
Just my 2 cents.
This isn't really true. There is one section of the book (section 2 in Chapter 1 iirc) that details the minimalistic subset of java used, and there are a total of four interfaces used in the book (Comparable, Comparator, Iterable, Iterator) and each is explained very clearly. The code uses no inheritance, no fancy types, no design patterns. Input and Output are abstracted away by author provided classes with the minimal methods required to read in and write out strings, ints etc (vs struggling with BufferedOutputStreams or whatever in mainstream java).
In other words, Java is used as a very minimalistic pseudocode. (e.g http://algs4.cs.princeton.edu/11model/Shuffle.java.html). It is almost python like.
A simple imperative language is best to learn the basics of algorithms in. You can't appreciate functional datastructures before you thoroughly understand imperative ones..
Something like SML may have been better, but the minimal 'loops + classes-as-structs-and-no-java-heavy-machinery' approach in the book works fine. There are certainly valid criticisms of the book to be made, but an 'excessive focus on Java' is not one of them imo (and I don't even like Java fwiw).
PS: Thank You for your book reccommendations. The "Metric Data Structures" book looks really interesting. Ordered.
I'm taking this course right now (just finished the first "percolator" assignment this afternoon!). I've never used Java before this, but getting Eclipse up and running with "Hello World" was easy. Eclipse took a little exploring to get used to, but the C-like syntax of Java makes the language very easy to pick up.
If interested in this material, but turned off because you can't use your favorite language: take this as an opportunity to step outside of your comfort zone. That's what I'm doing. It's character building.
Both classes are still solid offerings from Coursera, but having gone through both levels of both, I'd recommend the Stanford ones first.
Also, I don't know if this has changed, but the programming assignments required a custom Java installation provided by Princeton with a bunch of extra packages specifically for the course. I found that a little weird compared to the Stanford class's approach of just giving you an input file and verifying the output provide (ala a coding competition).
Another particularly interesting thing about his lectures is when he shares some stories from his vast experience over the years. For eg. When they named a red-black BST after the best contrasting colours you could get on the first ever color printer built in Xerox PARC. Or his excitement to build an animation for Prim's MST on a personal computer.
They do require one JAR file, stdlib.jar, to handle things like file I/O that are boring and take away from the algorithms themselves.
There is a second JAR, algs4.jar that contains all of the completed classes, which is useful if you want to implement one particular algorithm yourself, without going back and implementing the others that it relies on.
At the risk of sounding overly negative when it's not intended: they're both very boring lecturers. I actually wonder if that might change a bit when they're interacting with a real audience.
Noticed the issue raised ( probably by you? ) - https://github.com/dgorissen/coursera-dl/issues/81
Edit: Tried this one ( https://github.com/jplehmann/coursera ) and it too failed for login.
It was easily one of my favorite classes. It's very straightforward and the lecture slides are great. I highly recommend flipping through them.
Side note, am I the only person on earth who whitelists cookies? With cookies blocked, every page on coursera.org, including the home page shows nothing but the word "loading" and a spinning gif. Blogger was like that for a while, except they had gears. Sure, you need cookies to log in, and sure, they're used for analytics, and sure, you can do some progressive enhancements if I come back. I guess I'm old fashioned, but I'm at a loss to understand how the failure to get cookies back from a first-time visitor can stop all content from "loading," including the template. Must be a framework thing.
"Algorithms in C" by Sedgewick is a great book, which uses C to implement the algorithms talked about in the book. "Algorithms" also by Sedgewick, which looks like this course is based on, spends a hell of a lot of time teaching you Java!
> Though we have faster computers, algorithms remain absolutely essential in our field, because the amount of data that we process is greater than ever before.
It was nice to hear someone in a position of authority clearly explain why this field of research is important. It also helps understand why he prefers tilde notation to big-theta notation; the former takes into account the constant factor of the fastest growing term, thus allowing us to compare different implementations that are all O(n^2) in theory.
much appreciated (I can code, but I was hunting around for some coding courseras for a friend who has expressed interest in learning)