I am grateful to all my friends, and record here and now my most especial appreciation to those friends who, after a decent interval, stopped asking me, "How's the book coming?"
--Peter J. Gomes, The Good Book (1996)
This booklet is Fascicle 2 of The Art of Computer Programming, Volume 4: Combinatorial Algorithms. As explained in the preface to Fascicle 1 of Volume 1, I'm circulating the material in this preliminary form because I know that the task of completing Volume 4 will take many years; I can't wait for people to begin reading what I've written so far and to provide valuable feedback.
There will also be a Fascicle 1 for Volume 4. But I've written Fascicle 2 first. Experienced programmers will understand that the initialization of a program usually can't be written properly until after the main body has been fleshed out.
To put the material in context, this fascicle contains Sections 7.2.1.1 and 7.2.1.2 of a long, long chapter on combinatorial searching. Chapter 7 will eventually fill three volumes (namely Volumes 4A, 4B, and 4C), assuming that I'm able to remain healthy. It will begin with a short review of graph theory, with emphasis on some highlights of significant graphs in The Stanford GraphBase, from which I will be drawing many examples. Then comes Section 7.1, which deals with bitwise manipulation and with algorithms relating to Boolean functions. Section 7.2 is about generating all possibilities, and it begins with Section 7.2.1: Generating Basic Combinatorial Patterns. That sets the stage for the main contents of the present booklet, namely Section 7.2.1.1 (where I get the ball rolling by dealing with the generation of n-tuples) and Section 7.2.1.2 (which extends the ideas to permutations). Then will come Section 7.2.1.3 (about combinations), Section 7.2.1.4 (about integer partitions), and Section 7.2.1.5 (about set partitions), all in Fascicle 3. Section 7.2.1.6 (about trees) and Section 7.2.1.7 (about the history of combinatorial generation) will comprise Fascicle 4. Section 7.2.2 will deal with backtracking in general. And so it will go on, if all goes well; an outline of the entire Chapter 7 as currently envisaged appears on the taocp webpage that is cited on page ii.
I had great pleasure writing this material, akin to the thrill of excitement that I felt when writing Volume 2 many years ago. As in Volume 2, where I found to my delight that the basic principles of elementary probability theory and number theory arose naturally in the study of algorithms for random number generation and arithmetic, I learned while preparing Section 7.2.1 that the basic principles of elementary combinatorics arise naturally and in a highly motivated way when we study algorithms for combinatorial generation. Thus, I found once again that a beautiful story was "out there" waiting to be told.
My original intention was to devote far less space to this topic. But when I saw how fundamental the ideas were for combinatorial studies in general, I knew that I could never be happy unless I covered the basics quite thoroughly. Therefore I've done my best to build a solid foundation of theoretical and practical ideas that will support many kinds of reliable superstructures.
The topic of combinatorial generation has not only given me a chance to discuss important mathematical theories, it also has led to other kinds of fun, because of its many connections to amusing games and puzzles. Good puzzles are great aids to education, and I intend to continue focusing on recreational topics throughout Volume 4.
The average boy who abhors square root or algebra finds delight in working puzzles which involve similar principles, and may be led into a course of study which would develop the mathematical and inventive bumps in a way to astonish the family phrenologist.
--Sam Loyd, The World of Puzzledom (1896)
I shall happily pay a finder's fee of $2.56 for each error in this fascicle when it is first reported to me, whether that error be typographical, technical, or historical. The same reward holds for items that I forgot to put in the index. And valuable suggestions for improvements to the text are worth 32 cents each. (Furthermore, if you find a better solution to an exercise, I'll actually reward you with immortal glory instead of mere money, by publishing your name in the eventual book:-)
I wish to thank Yoichi Hariguchi for helping me to build and rebuild the computer on which this booklet was written. And I also want to thank Frank Ruskey for bravely foisting an early draft of this material on college students and for telling me about his classroom experiences.
Notations that are used here and not otherwise explained can be found in the Index to Notations at the end of Volumes 1, 2, or 3. Those indices point to the places where further information is available. Of course Volume 4 will some day contain its own Index to Notations.
Machine-language examples in all future editions of The Art of Computer Programming will be based on the MMIX computer, which is defined in Section 1.3.1' of Volume 1, Fascicle 1. Cross-references to Sections 1.3.1', 1.3.2', 1.4.1', 1.4.2', and 1.4.3' in the present booklet refer to that fascicle.Cross references to yet-unwritten material sometimes appear as '00' in the following pages; this impossible value is a placeholder for the actual numbers to be supplied later.
Happy reading!
D. E. K.
Stanford, California
December 2004