Table Of ContentHow to Think About Algorithms
Loop Invariants and Recursion
Je(cid:11) Edmonds
Winter 2003, Version 0.6
(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)
\What's twice eleven?" I said to Pooh.
\Twice what?" said Pooh to Me.
\I think it ought to be twenty-two."
\Just what I think myself," said Pooh.
\It wasn't an easy sum to do,
But that's what it is," said Pooh, said he.
(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)
\That's what it is," said Pooh.
Where ever I am, there's always Pooh,
There's always Pooh and Me.
\What would I do?" I said to Pooh.
\If it wasn't for you," and Pooh said: \True,
It isn't much fun for One, but Two
C a n s t (cid:0)i(cid:0)c(cid:0)k(cid:0)(cid:0)(cid:0)(cid:0)t(cid:0)(cid:0)o(cid:0)(cid:0)g(cid:0)(cid:0)e(cid:0)(cid:0)t(cid:0)h(cid:0)(cid:0)(cid:0)e(cid:0)(cid:0)r(cid:0),(cid:0)"(cid:0)(cid:0)(cid:0)(cid:0)s(cid:0)a(cid:0)(cid:0)y(cid:0)(cid:0)(cid:0)s(cid:0)(cid:0)(cid:0)P(cid:0)(cid:0)o(cid:0)(cid:0)(cid:0)o(cid:0)(cid:0)h(cid:0)(cid:0),(cid:0)(cid:0)s(cid:0)(cid:0)a(cid:0)(cid:0)y(cid:0)(cid:0)s(cid:0)(cid:0)(cid:0)h(cid:0)(cid:0)(cid:0)e(cid:0).(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)(cid:0)
\That's how it is," says Pooh.
Little blue bird on my shoulder.
It's the truth. It's actual.
Every thing is satisfactual.
Zippedy do dah, zippedy ay;
wonderful feeling, wonderful day.
Dedicated to Joshua and Micah
Contents
Contents by Application v
Preface vii
To the Educator and the Student . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii
Feedback Requested . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
I Relevant Mathematics 2
1 Relevant Mathematics 4
1.1 Existential and Universal Quanti(cid:12)ers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Logarithms and Exponentials . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3 The Time (and Space) Complexity of an Algorithm. . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1 Di(cid:11)erent Models of Time and Space Complexity . . . . . . . . . . . . . . . . . . . . . 11
1.3.2 Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4 Asymptotic Notations and Their Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.1 The Classic Classi(cid:12)cations of Functions . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.2 Comparing The Classes of Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.3 Other Useful Notations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.4 Di(cid:11)erent Levels of Detail When Classifying a Function . . . . . . . . . . . . . . . . . . 21
1.4.5 Constructing and Deconstructing the Classes of Functions . . . . . . . . . . . . . . . . 21
1.4.6 The Formal De(cid:12)nition of (cid:2) and O Notation . . . . . . . . . . . . . . . . . . . . . . . 23
1.4.7 Formal Proofs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.4.8 Solving Equations by Ignoring Details . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.5 Adding Made Easy Approximations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
1.5.1 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.5.2 The Classic Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.5.3 The Ranges of The Adding Made Easy Approximations . . . . . . . . . . . . . . . . . 32
1.5.4 Harder Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.6 Recurrence Relations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.6.1 Relating Recurrence Relations to the Timing of Recursive Programs . . . . . . . . . . 37
1.6.2 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.6.3 The Classic Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.6.4 Other Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2 Abstractions 49
2.1 Di(cid:11)erent Representations of Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.2 Abstract Data Types (ADTs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
i
ii CONTENTS
II Loop Invariants for Iterative Algorithms 56
3 Loop Invariants - The Techniques and the Theory 58
3.1 Assertions and Invariants As Boundaries Between Parts . . . . . . . . . . . . . . . . . . . . . 58
3.2 An Introduction to Iterative Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.2.1 Various Abstractions and the Main Steps . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.2.2 Examples: Quadratic Sorts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.3 The Steps In Developing An Iterative Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.3.1 The Steps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.2 Example: Binary Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.4 A Formal Proof of Correctness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.4.1 The Formal Proof Technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
3.4.2 Proving Correctnessof Iterative Algorithms with Induction . . . . . . . . . . . . . . . 73
4 Examples of Iterative Algorithms 75
4.1 VLSI Chip Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.2 Colouring The Plane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
4.3 Euclid's GCD Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.4 Magic Sevens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5 Implementations of Abstract Data Types (ADTs) 85
5.1 The List, Stack, and Queue ADT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.1.1 Array Implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.1.2 Linked List Implementations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
5.1.3 Merging With A Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
5.1.4 ParsingWith A Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2 Graphs and Tree ADT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2.1 Tree Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2.2 Union-Find Set Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2.3 Balanced Binary Search Trees (AVL Trees) . . . . . . . . . . . . . . . . . . . . . . . . 93
5.2.4 Heaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6 Other Sorting Algorithms and Combining Techniques 95
6.1 Heap Sort and PriorityQueues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
6.2 Linear Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.2.1 Counting Sort (A Stable Sort) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.2.2 Radix Sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
6.2.3 Radix/Counting Sort. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
7 Deterministic Finite Automaton 104
8 Graph Search Algorithms 109
8.1 A Generic Search Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
8.2 Breadth-First Search/ShortestPaths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
8.3 Shortest-Weighted Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.4 Depth-First Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
8.5 Linear Ordering of a Partial Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9 Network Flows 126
9.1 A Hill Climbing Algorithm with a Small Local Maximum . . . . . . . . . . . . . . . . . . . . 127
9.2 The Primal-Dual Hill Climbing Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
9.3 The Steepest Assent Hill Climbing Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
9.4 Linear Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
CONTENTS iii
10 Greedy Algorithms 143
10.1 The Techniques and the Theory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
10.2 Examples of Greedy Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
10.2.1 A Fixed Priority Greedy Algorithm for The Job/EventScheduling Problem . . . . . . 149
10.2.2 An Adaptive PriorityGreedy Algorithm for The Interval Cover Problem . . . . . . . . 152
10.2.3 The Minimum-Spanning-Tree Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
III Recursive Algorithms 160
11 An Introduction to Recursion 162
11.1 Recursion - Abstractions, Techniques, and Theory . . . . . . . . . . . . . . . . . . . . . . . . 162
11.1.1 Di(cid:11)erent Abstractions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
11.1.2 Circular Argument? Looking Forwardsvs Backwards. . . . . . . . . . . . . . . . . . . 163
11.1.3 The Friends Recursion Level of Abstraction . . . . . . . . . . . . . . . . . . . . . . . . 164
11.1.4 Proving Correctnesswith Strong Induction . . . . . . . . . . . . . . . . . . . . . . . . 165
11.1.5 The Stack Frame Levels of Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . 166
11.2 Some Simple Examples of Recursive Algorithms. . . . . . . . . . . . . . . . . . . . . . . . . . 168
11.2.1 Sorting and Selecting Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
11.2.2 Operations on Integers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
11.2.3 Akerman's Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
12 Recursion on Trees 179
12.1 Abstractions, Techniques, and Theory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
12.2 Simple Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
12.3 Generalizing the Problem Solved . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
12.4 Representing Expressions with Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
12.5 Pretty Tree Print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
12.6 Maintaining an AVL Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
13 Recursive Images 193
13.1 Drawing a Recursive Image from a Fixed Recursive and Base Case Images . . . . . . . . . . . 193
13.2 Randomly Generating A Maze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
14 Parsing with Context-Free Grammars 198
15 Recursive Back Tracking Algorithms 205
15.1 The Theory of Recursive Back Tracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
15.1.1 Optimization Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
15.1.2 Classifying the Solutions and the Best of the Best . . . . . . . . . . . . . . . . . . . . 206
15.1.3 Example: The Shortest Path within a Leveled Graph . . . . . . . . . . . . . . . . . . 210
15.1.4 SubInstances and SubSolutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
15.1.5 The Question For the Little Bird . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
15.1.6 Speeding Up the Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
15.2 Pruning Invalid Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
15.2.1 Satis(cid:12)ability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
15.2.2 Scrabble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
15.2.3 Queens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
15.3 Pruning Equally Valued Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
15.3.1 Recursive Depth First Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
iv CONTENTS
16 Dynamic Programming 223
16.1 The Iterative Loop Invariant Perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
16.2 The Recursive Back Tracking Perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
16.2.1 Eliminating Repeated SubInstances With Memoization . . . . . . . . . . . . . . . . . 225
16.2.2 Redundancy in The Shortest Path within a Leveled Graph: . . . . . . . . . . . . . . . 227
16.2.3 The Set of SubInstances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
16.2.4 Filling In The Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
16.2.5 Reversing the Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
16.2.6 A Slow Dynamic Algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
16.2.7 Decreasing the Time and Space . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
16.2.8 Using Closure to Determine the Complete Set of Subinstances Called . . . . . . . . . 234
16.3 Examples of Dynamic Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
16.3.1 Printing Neatly Problem. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
16.3.2 Longest Common Subsequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
16.3.3 A Greedy Dynamic Program: The Weighted Job/Activity Scheduling Problem . . . . 241
16.3.4 Exponential Time? The Integer-KnapsackProblem. . . . . . . . . . . . . . . . . . . . 243
16.3.5 The Solution Viewed as a Tree: Chains of Matrix Multiplications . . . . . . . . . . . . 245
16.3.6 Generalizing the Problem Solved: Best AVL Tree . . . . . . . . . . . . . . . . . . . . . 249
16.3.7 Another View of a Solution: All Pairs Shortest Paths with Negative Cycles . . . . . . 251
16.3.8 Parsingwith Context-Free Grammars . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
IV Just a Taste 263
17 Computational Complexity of a Problem 265
17.1 Di(cid:11)erent Models of Computation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
17.2 Expressing Time Complexity with Existential and Universal Quanti(cid:12)ers . . . . . . . . . . . . 266
17.3 Lower Bounds for Sorting using Information Theory . . . . . . . . . . . . . . . . . . . . . . . 269
18 Reductions 273
18.1 Upper Bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
18.2 Lower Bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
18.2.1 Integer Factorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
18.2.2 NP-Completeness. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
19 Things to Add 276
19.1 Parallel Computation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
19.2 Probabilistic Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
19.3 Amortization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
20 Exercise Solutions 278
21 Conclusion 284
Contents by Application
Thoughthis bookisorganizedwith respecttothe algorithmictechniqueused, youcanreaditin almostany
order. Another reasonable order is with respect to application. The only restriction is that you read the
\techniques and theory" section of a chapter before you read any of the examples within it.
Relevant Mathematics
Existential and Universal Quanti(cid:12)ers :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1.1
Adding Made Easy ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1.3
Recurrence Relations ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1.4
Probability Theory :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ??
Information Theory ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 17.2
Computational Complexity of a Problem
The Time (and Space) Complexity of an Algorithm ::::::::::::::::::::::::::::::::::::::::::: 1.3
Asymptotic Notations and Their Properties ::::::::::::::::::::::::::::::::::::::::::::::::::: 1.2
Formal Proof of Correctness :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 3.4,11.1.4
Di(cid:11)erent Models of Computation :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 17.1
Expressing Time Complexity with Existential and Universal Quanti(cid:12)ers :::::::::::::::::::::: 17.2
Lower Bounds for Sorting using Information Theory :::::::::::::::::::::::::::::::::::::::::: 17.3
The Integer-KnapsackProblem :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 16.3.4
Nondeterminism ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 15.1.2,18.2.2
NP-Completeness :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 18.2.2
Data Structures
Stacks and Queues :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 2.2,5.1
Priority Queues ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 2.2,6.1
Union-Find Set Systems ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 2.2,5.2.2
Dictionaries :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 2.2
Graphs ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1.3,2.2
Trees :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 2.2,12
Binary Search Trees :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 5.2.3,16.3.6
AVL trees :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 12.3,12.6,16.3.6
Algorithmic Techniques
Loop Invariants for Iterative Algorithms :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 3
Greedy Algorithms :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 10.1
v
vi CONTENTS BY APPLICATION
Dynamic Programming :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 16
Hill Climbing ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 9
Reductions (Upper and Lower Bounds) :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 18
Sorting and Selection
Iterative Quadratic Sorts :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 3.2.2
Binary Search :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 3.3.2
Recursive Sorting and Selecting Algorithms :::::::::::::::::::::::::::::::::::::::::::::::: 11.2.1
Heap Sort and Priority Queues ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 6.1
Linear Radix/Counting Sort ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 6.2
Lower Bounds for Sorting using Information Theory :::::::::::::::::::::::::::::::::::::::::: 17.3
Numerical Calculations
Euclid's GCD Algorithm :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 4.3
Mod and Adding Integers :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 7
Multiplication, Powers,and FFT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 11.2.2
Representing Expressionswith Trees ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 12
Chains of Matrix Multiplications ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 16.3.5
Graph Algorithms
Data Structures :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 1.3
Recursive Depth First Search :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 15.3.1
The Minimum-Spanning-Tree Problem ::::::::::::::::::::::::::::::::::::::::::::::::::::: 10.2.3
A Generic Search Algorithm :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 8.1
Breadth-First Search/Shortest Paths :::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 8.2
Shortest-Weighted Paths :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 8.3
Depth-First Search ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 8.4
Linear Ordering of a Partial Order :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 8.5
All Pairs Shortest Paths ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 16.3.7
Network Flows ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 9
Parsing with Context-Free Grammars
Recursive Look Ahead Once ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 14
Dynamic ProgrammingParsing :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 16.3.8
Description:\What's twice eleven?" I said to Pooh. \Twice what?" said Pooh to Me. \I think it
ought to be twenty-two." \Just what I think myself," said Pooh. \It wasn't an easy