Professional Documents
Culture Documents
6.046J/18.401J
LECTURE 3
Divide and Conquer
• Binary search
• Powering a number
• Fibonacci numbers
• Matrix multiplication
• Strassen’s algorithm
• VLSI tree layout
Prof. Erik D. Demaine
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.1
The divide-and-conquer
design paradigm
1. Divide the problem (instance)
into subproblems.
2. Conquer the subproblems by
solving them recursively.
3. Combine subproblem solutions.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.2
Merge sort
1. Divide: Trivial.
2. Conquer: Recursively sort 2 subarrays.
3. Combine: Linear-time merge.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.3
Merge sort
1. Divide: Trivial.
2. Conquer: Recursively sort 2 subarrays.
3. Combine: Linear-time merge.
T(n) = 2 T(n/2) + Θ(n)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.4
Master theorem (reprise)
T(n) = a T(n/b) + f (n)
CASE 1: f (n) = O(nlogba – ε), constant ε > 0
⇒ T(n) = Θ(nlogba) .
CASE 2: f (n) = Θ(nlogba lgkn), constant k ≥ 0
⇒ T(n) = Θ(nlogba lgk+1n) .
CASE 3: f (n) = Ω(nlogba + ε ), constant ε > 0,
and regularity condition
⇒ T(n) = Θ( f (n)) .
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.5
Master theorem (reprise)
T(n) = a T(n/b) + f (n)
CASE 1: f (n) = O(nlogba – ε), constant ε > 0
⇒ T(n) = Θ(nlogba) .
CASE 2: f (n) = Θ(nlogba lgkn), constant k ≥ 0
⇒ T(n) = Θ(nlogba lgk+1n) .
CASE 3: f (n) = Ω(nlogba + ε ), constant ε > 0,
and regularity condition
⇒ T(n) = Θ( f (n)) .
Merge sort: a = 2, b = 2 ⇒ nlogba = nlog22 = n
⇒ CASE 2 (k = 0) ⇒ T(n) = Θ(n lg n) .
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.6
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.7
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
Example: Find 9
3 5 7 8 9 12 15
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.8
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
Example: Find 9
3 5 7 8 9 12 15
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.9
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
Example: Find 9
3 5 7 8 9 12 15
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.10
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
Example: Find 9
3 5 7 8 9 12 15
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.11
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
Example: Find 9
3 5 7 8 9 12 15
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.12
Binary search
Find an element in a sorted array:
1. Divide: Check middle element.
2. Conquer: Recursively search 1 subarray.
3. Combine: Trivial.
Example: Find 9
3 5 7 8 9 12 15
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.13
Recurrence for binary search
T(n) = 1 T(n/2) + Θ(1)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.14
Recurrence for binary search
T(n) = 1 T(n/2) + Θ(1)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.15
Powering a number
Problem: Compute a n, where n ∈ N.
Naive algorithm: Θ(n).
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.16
Powering a number
Problem: Compute a n, where n ∈ N.
Naive algorithm: Θ(n).
Divide-and-conquer algorithm:
a n/2 ⋅ a n/2 if n is even;
an =
a (n–1)/2 ⋅ a (n–1)/2 ⋅ a if n is odd.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.17
Powering a number
Problem: Compute a n, where n ∈ N.
Naive algorithm: Θ(n).
Divide-and-conquer algorithm:
a n/2 ⋅ a n/2 if n is even;
an =
a (n–1)/2 ⋅ a (n–1)/2 ⋅ a if n is odd.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.18
Matrix multiplication
Input: A = [aij], B = [bij].
i, j = 1, 2,… , n.
Output: C = [cij] = A⋅ B.
c11 c12 c1n a11 a12 a1n b11 b12 b1n
c c c2 n a21 a22 a2 n b21 b22 b2 n
21 22 = ⋅
c c
n1 n 2 cnn an1 an 2 ann bn1 bn 2 bnn
n
cij = ∑ aik ⋅ bkj
k =1
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.27
Standard algorithm
for i ← 1 to n
do for j ← 1 to n
do cij ← 0
for k ← 1 to n
do cij ← cij + aik⋅ bkj
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.28
Standard algorithm
for i ← 1 to n
do for j ← 1 to n
do cij ← 0
for k ← 1 to n
do cij ← cij + aik⋅ bkj
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.29
Divide-and-conquer algorithm
IDEA:
n×n matrix = 2×2 matrix of (n/2)×(n/2) submatrices:
r s a b e f
t u = c d ⋅ g h
C = A ⋅ B
r = ae + bg
s = af + bh 8 mults of (n/2)×(n/2) submatrices
t = ce + dg 4 adds of (n/2)×(n/2) submatrices
u = cf + dh
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.30
Divide-and-conquer algorithm
IDEA:
n×n matrix = 2×2 matrix of (n/2)×(n/2) submatrices:
r s a b e f
t u = c d ⋅ g h
C = A ⋅ B
r = ae + bg recursive
s = af + bh 8 mults of (n/2)×(n/2) submatrices
^
t = ce + dh 4 adds of (n/2)×(n/2) submatrices
u = cf + dg
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.31
Analysis of D&C algorithm
T(n) = 8 T(n/2) + Θ(n2)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.32
Analysis of D&C algorithm
T(n) = 8 T(n/2) + Θ(n2)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.33
Analysis of D&C algorithm
T(n) = 8 T(n/2) + Θ(n2)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.34
Strassen’s idea
• Multiply 2×2 matrices with only 7 recursive mults.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.35
Strassen’s idea
• Multiply 2×2 matrices with only 7 recursive mults.
P1 = a ⋅ ( f – h)
P2 = (a + b) ⋅ h
P3 = (c + d) ⋅ e
P4 = d ⋅ (g – e)
P5 = (a + d) ⋅ (e + h)
P6 = (b – d) ⋅ (g + h)
P7 = (a – c) ⋅ (e + f )
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.36
Strassen’s idea
• Multiply 2×2 matrices with only 7 recursive mults.
P1 = a ⋅ ( f – h) r = P5 + P4 – P2 + P6
P2 = (a + b) ⋅ h s = P 1 + P2
P3 = (c + d) ⋅ e t = P3 + P 4
P4 = d ⋅ (g – e) u = P5 + P1 – P3 – P7
P5 = (a + d) ⋅ (e + h)
P6 = (b – d) ⋅ (g + h)
P7 = (a – c) ⋅ (e + f )
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.37
Strassen’s idea
• Multiply 2×2 matrices with only 7 recursive mults.
P1 = a ⋅ ( f – h) r = P5 + P4 – P2 + P6
P2 = (a + b) ⋅ h s = P 1 + P2
P3 = (c + d) ⋅ e t = P3 + P 4
P4 = d ⋅ (g – e) u = P5 + P1 – P3 – P7
P5 = (a + d) ⋅ (e + h)
P6 = (b – d) ⋅ (g + h) 7 mults, 18 adds/subs.
P7 = (a – c) ⋅ (e + f ) Note: No reliance on
commutativity of mult!
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.38
Strassen’s idea
• Multiply 2×2 matrices with only 7 recursive mults.
P1 = a ⋅ ( f – h) r = P5 + P4 – P2 + P6
P2 = (a + b) ⋅ h = (a + d) (e + h)
P3 = (c + d) ⋅ e + d (g – e) – (a + b) h
P4 = d ⋅ (g – e) + (b – d) (g + h)
P5 = (a + d) ⋅ (e + h) = ae + ah + de + dh
P6 = (b – d) ⋅ (g + h) + dg –de – ah – bh
P7 = (a – c) ⋅ (e + f ) + bg + bh – dg – dh
= ae + bg
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.39
Strassen’s algorithm
1. Divide: Partition A and B into
(n/2)×(n/2) submatrices. Form terms
to be multiplied using + and – .
2. Conquer: Perform 7 multiplications of
(n/2)×(n/2) submatrices recursively.
3. Combine: Form C using + and – on
(n/2)×(n/2) submatrices.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.40
Strassen’s algorithm
1. Divide: Partition A and B into
(n/2)×(n/2) submatrices. Form terms
to be multiplied using + and – .
2. Conquer: Perform 7 multiplications of
(n/2)×(n/2) submatrices recursively.
3. Combine: Form C using + and – on
(n/2)×(n/2) submatrices.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.41
Analysis of Strassen
T(n) = 7 T(n/2) + Θ(n2)
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.42
Analysis of Strassen
T(n) = 7 T(n/2) + Θ(n2)
nlogba = nlog27 ≈ n2.81 ⇒ CASE 1 ⇒ T(n) = Θ(nlg 7).
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.43
Analysis of Strassen
T(n) = 7 T(n/2) + Θ(n2)
nlogba = nlog27 ≈ n2.81 ⇒ CASE 1 ⇒ T(n) = Θ(nlg 7).
The number 2.81 may not seem much smaller than
3, but because the difference is in the exponent, the
impact on running time is significant. In fact,
Strassen’s algorithm beats the ordinary algorithm
on today’s machines for n ≥ 32 or so.
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.44
Analysis of Strassen
T(n) = 7 T(n/2) + Θ(n2)
nlogba = nlog27 ≈ n2.81 ⇒ CASE 1 ⇒ T(n) = Θ(nlg 7).
The number 2.81 may not seem much smaller than
3, but because the difference is in the exponent, the
impact on running time is significant. In fact,
Strassen’s algorithm beats the ordinary algorithm
on today’s machines for n ≥ 32 or so.
Best to date (of theoretical interest only): Θ(n2.376).
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.45
Conclusion
September 14, 2005 Copyright © 2001-5 Erik D. Demaine and Charles E. Leiserson L2.54