If you ever come across a resource not on these lists that you find useful, please let me know so I can make this page more useful for others as well. Thanks!
Textbooks
There are several algorithms textbooks freely available online. It is well worth researching a given topic in multiple sources, because each can provide a perspective or explanation that adds something the others do not. These are roughly ordered by decreasing quality and ease of use.
The information is out there. We live in an age where access to information isn't the problem, and the ability to sift through and recognize the most valuable bits is increasingly important.
Specific Topics / Tools
Each of these sites is a great resource for a specific topic or provides a useful tool for learning about algorithms.
- EquationExplorer is a simple but powerful tool for graphing various functions. For example, this provides a quick comparison of four of the most common functions in algorithm complexity analysis (note that the scale matters for deciding which function is "larger"!).
- Big-O Algorithm Complexity Cheat Sheet provides a quick reference for the asymptotic time and space complexity for a wide range of algorithms.
- Data Structure Visualizations has animations and visualizations illustrating how a wide variety of data structures and algorithms work.
- Sorting Algorithm Animations is an excellent site that provides both clear animations of common sorting algorithms along with concise informational pages on each (e.g., heap sort).
- The Sound of Sorting provides similar visualizations with an added audio element that can provide further insight into the functioning of each algorithm as well potentially a novel way to remember individual algorithms by remembering their "sound." You can either use the provided software to experiment with visualization/"audibilization" directly, or you can check out this youtube playlist for a selection of pre-rendered videos.
General References
These are some more general references for looking up concepts. You are familiar with some already, but I've tried to describe exactly how each can be useful.
- Academic Earth is a quality site that aggregates videos of lectures from top universities. Perform a search, and instantly start learning about a topic from brilliant people and great teachers (often both at the same time!).
- Wikipedia, of course. While it can be a troublesome source in some fields, I've found it to be quite good for theoretical computer science. It will give you a description of pretty much any concept we cover in this class, and if it's not clear enough, there will often be links to other sources as well. Everything you might need can be found starting from Algorithm, of course, and the list of algorithm general topics could be a good starting point for browsing as well.
- The C2 Wiki is another good source of algorithm information, even though its focus is more on software development. Its pages might come up in general web searches for you, but it could be useful to perform a targeted search such as this.
- Youtube contains algorithm visualizations, explanations, and even full lectures (perhaps not found on Academic Earth, above). (An example search.)
With these resources, a motivated student can learn all of the material in this class on his or her own. I, however, can provide one-on-one interaction tailored to your particular understanding. Use these materials to learn broadly, and come to me for help with specific questions. The less time I spend replicating broad resources like these, the more time I can spend helping individuals.
Java
For learning Java, I recommend the following tutorials, practice problems, and references. (Many of these resources are for Java 6 or 7, while our lab machines have Java 5 installed, but there should be no important differences in the parts that concern us in this class.) Start with a tutorial to get up and running with the basics of writing, compiling, and writing programs. Then, you should use the tutorials and reference to look up specific topics as needed and briefly practice each on one of the practice sites to be sure you understand it before applying it in your own code.
- Tutorials:
- Introduction to Programming in Java — The website for an introductory CS textbook; it contains some clear explanations of many important programming topics, in Java, and there is a great deal of sample code, as well. Among other things, this site has clear instructions for setting up the Java Development Kit (JDK) and compiling and running your first program for both Mac OS X and Windows. You can skip the parts about DrJava, however, as you won't have to use it in this class (though you can if you like).
- LearnJava — an interactive tutorial (you can write and run code within the site itself) covering most basic and a few advanced topics from the language.
- The Java Tutorials — Several tutorials covering fundamentals of Java. The Learning the Java Language and Essential Classes tutorials might be the most relevant to you in this class.
- Java for C++ Programmers — Lessons specifically for starting Java with a C++ background.
- Practice: Put in half an hour here and there, and you'll become more proficient and comfortable with the language. For all of these, you can submit solutions (either code or final answers) online to have them checked immediately.
- Practice-It — A set of problems created for courses at the University of Washington.
- CodingBat Java — Another set of practice problems across a range of topics. For many problems, the site will test a variety of inputs and show you for which your solution is correct and for which it fails, helping you pinpoint your errors.
- Project Euler is a large collection of mathematical problems that can be solved by writing programs in your language of choice. They provide a great way to get used to a new language and to writing algorithms in it, as they start easy and progress in difficulty, often building on ideas or techniques you practiced in earlier problems.
- Reference: Java (v8) API Specification — The mother of all references for the standard Java API (packages that will be available in any JDK installation). If you don't remember how the String object works, look here. If you're certain that there must be some function for reading a file in that particular way you need, you can find it here. If you're curious about what's available in a package, poke around in here.
Unix and the Command Line
We will be working in a Unix environment in this class. These resources can be used to refresh your memory or quickly look up a command. There are many "flavors" of Unix. OS X is one; Linux (like on sun.iwu.edu) is another. They all share common commands and utilities, though, so a tutorial written for one is often applicable to the others.
- Mac OS X UNIX Tutorial for Beginners (adapted for OS X from UNIX Tutorial for Beginners) — A great introduction to Unix, files, directories, and the wide variety of commands available on the command line. The Introduction and Tutorials One, Two, and Four are most useful for this class, but they all contain really useful tips.
- Mac OS X Unix Tutorial — An introduction to the terminal in OS X. Quite detailed. Parts 1-3 are the most relevant to what we will do in this class. [Link goes to an archived version of the site, as the original page itself appears to be gone.]
- Basic Command Line Utilities, Tips, & Commands — A quick cheat sheet with commands and tips for OS X. Quick reference, after you've already gone through a tutorial or two.