most efficient procedure or representation possible. Note that this is thebestsolution not just among all the ones that we can think of at present, but thebestfrom among all solutions that there ever could be, including ones that mightbeextremely elaborate or difficult to program and still to be discovered. A wayofsolving a problem will (generally) only be accepted if we can demonstrate thatit
works. This, of course, includes proving that the efficiency of themethodis as claimed.Most problems, even the simplest, have a remarkable number of candidatesolutions. Often slight changes in the assumptions may render differentmethodsattractive. An effective computer scientist needs to have a good awareness oftherange of possiblities that can arise, and a feel of when it will be worthcheckingtext-books to see if there is a good standard solution to apply.Almost all the data structures and algorithms that go with them presentedhere are of real practical value, and in a great many cases a programmer whofailedto used them would risk inventing dramatically worse solutions to the problemsaddressed, or, of course in rare cases, finding a new and yet better solution
but be unaware of what has just been achieved!Several techniques covered in this course are delicate, in the sense thatsloppyexplanations of them will miss important details, and sloppy coding will lead2
2 COURSE CONTENT AND TEXTBOOKS
to code with subtle bugs. Beware! A final feature of this course is that afairnumber of the ideas it presents are really ingenious. Often, in retrospect,theyare not difficult to understand or justify, but one might very reasonably beleftwith the strong feeling of
I wish I had thought of that
and an admirationforthe cunning and insight of the originator.