We have written this book assuming that the reader comes to it with certain knowledge. Namely, we assume that the reader is at least vaguely familiar with a high-level programming language, such as C, C++, Pascal, or Java, and that he or she understands the main constructs from such a high-level language, including:

- Variables and expressions
- Functions and procedures
- Decision structures (such as if-statements and switch-statements)
- Iteration structures (for-loops and while-loops).

For readers who are familiar with these concepts, but not with how they are expressed in C++, we provide a primer on the C++ language in Chapter 1 and Chapter 2. Because we expect that some readers will come to this book with a knowledge of Java, in this primer we explain a few of the subtle differences between these two languages. For readers already familiar with C++ this material may be skipped, but it can be read to provide a quick refresher to this material. We do not assume, however, that the reader is necessarily familiar with object-oriented design or with linked structures, such as linked lists, for these topics are covered in the core chapters of this book.

In terms of mathematical background, we assume the reader is somewhat familiar with topics from high-school mathematics, including exponents, logarithms, and elementary probability. Even so, we review most of these facts in Chapter 3, including exponents, logarithms, and summations, and we give a summary of other useful mathematical facts, including elementary probability, in Appendix A.