0.4 Why are we here, anyway?
We will try to teach you two things in CS373:how to think about algorithms and how to talk about algorithms.
Along the way, you’ll pick up a bunch of algorithmic facts—mergesort runs in Θ(n logn) time;
the amortized time to search in a splay tree isO(logn);
the traveling salesman problem is NP-hard—but these aren’t the point of the course.
You can always look up facts in a textbook, provided you have the intuition to know what to look for.
That’s why we let you bring cheat sheets to the exams; we don’t want you wasting your study time trying to memorize all the facts you’ve seen.
You’ll also practice a lot of algorithm design and analysis skills—finding useful (counter) examples, developing induction proofs, solving recurrences, using big-Oh notation, using probability, and so on.
These skills are useful, but they aren’t really the point of the course either. At this point in your educational career, you should be able to pick up those skills on your own, once you know what you’re trying to do. The main goal of this course is to help you develop algorithmic intuition.
How do various algorithms really work?
When you see a problem for the first time, how should you attack it?
How do you tell which techniques will work at all, and which ones will work best?
How do you judge whether one algorithm is better than another?
How do you tell if you have the best possible solution?
The flip side of this goal is developing algorithmic language.
It’s not enough just to understand how to solve a problem; you also have to be able to explain your solution to somebody else. I don’t mean just how to turn your algorithms into code—despite what many students (and inexperienced programmers) think, ‘somebody else’ is not just a computer. Nobody programs alone. Perhaps more importantly in the short term, explaining something to somebody else is one of the best ways of clarifying your own understanding.