As I said a few weeks ago, I'm really enjoying Professor Tim Roughgarden's Algorithms: Design and Analysis class.
Much of the material in the first part of the class was review for me, but in this second part it has been mostly new material, things that I should have studied over the years but just hadn't found the time to learn.
Part two of the Algorithms class has been covering Greedy Algorithms and Dynamic Programming. These are both basic, widely-used techniques and have many applications.
One of the things that I'm finding very pleasing about Professor Roughgarden's style is that he mixes theory and practice very well. He starts with very well-chosen, clear examples, works through the examples in detail, then helps you see how to generalize from these now-well-understood examples to the broader, more theoretic underpinnings.
Finally, in each area, he concludes the discussion with a few pointers to more advanced material to continue learning from.
It's a great teaching technique (at least, it makes the material very clear to me), and I'm feeling much more comfortable with the terminology and techniques of these algorithmic approaches.
So little time, so much to learn...