Download presentation
Presentation is loading. Please wait.
1
Chapter 4 Divide-and-Conquer
Copyright © 2007 Pearson Addison-Wesley. All rights reserved.
2
Divide-and-Conquer The most-well known algorithm design strategy:
Divide instance of problem into two or more smaller instances Solve smaller instances recursively Obtain solution to original (larger) instance by combining these solutions
3
Divide-and-Conquer Technique (cont.)
a problem of size n subproblem 1 of size n/2 subproblem 2 of size n/2 a solution to subproblem 1 a solution to subproblem 2 a solution to the original problem
4
Example: Find the sum of n numbers using divide-and-conquer.
The divide-and-conquer technique is ideally suited for parallel computations, in which each subproblem can be solved simultaneously by its own processor.
5
Divide-and-Conquer Examples
Sorting: mergesort and quicksort Binary tree traversals Binary search (?) Multiplication of large integers Matrix multiplication: Strassen’s algorithm Closest-pair and convex-hull algorithms
6
The General Divide-and-Conquer Recurrence
In general, a problem instance of size n can be divided into b instances of size n/b, with a of them needing to be solved. Here, a and b are constants; a ≥ 1 and b > 1. Assuming n is a power of b, we get the following recurrence for the running time T(n): where f(n) accounts for the time spent on dividing the problem into smaller ones and on combining their solutions. This is called the general divide-and-conquer recurrence
7
General Divide-and-Conquer Recurrence
Consider the previous recurrence equation, T(n) = aT(n/b) + f (n) Master Theorem: If f(n) (nd), d 0 then If a < bd then T(n) (nd) If a = bd then T(n) (nd log n) If a > bd then T(n) (nlog b a ) Note: The same results hold with O and Ω instead of . Examples: T(n) = 4T(n/2) + n T(n) ? T(n) = 4T(n/2) + n2 T(n) ? T(n) = 4T(n/2) + n3 T(n) ?
8
Mergesort Split array A[0..n-1] in two about equal halves and make copies of each half in arrays B and C Sort arrays B and C recursively Merge sorted arrays B and C into array A as follows: Repeat the following until no elements remain in one of the arrays: compare the first elements in the remaining unprocessed portions of the arrays copy the smaller of the two into A, while incrementing the index indicating the unprocessed portion of that array Once all elements in one of the arrays are processed, copy the remaining unprocessed elements from the other array into A.
9
Mergesort Example 8 3 2 9 7 1 5 4 8 3 2 9 7 1 5 4 Go over this example in detail, then do another example of merging, something like: ( ) (3 4 6)
10
Mergesort Example 8 3 2 9 7 1 5 4 Go over this example in detail, then do another example of merging, something like: ( ) (3 4 6) 3 8 2 9 1 7 4 5
11
Pseudocode of Mergesort
12
Pseudocode of Merge
13
Thus, in the worst case, Efficiency:
For simplicity, let’s assume n is a power of two. C(n) = 2C(n/2) + Cmerge(n) for n > 1, C(1) = 0 Cmerge(n) is the number of key comparisons performed during merging. At each step, Exactly one comparison is made The total number of unprocessed elements in the two arrays is reduced by one. Thus, in the worst case, Cmerge(n) = n-1
14
So, Cworst(n) = 2Cworst (n/2) +(n - 1) for n > 1, Cworst (1) = 0 Note that n – 1 Θ(n) So, applying the Master Theorem, Cworst(n) Θ(n log n)
15
Analysis of Mergesort All cases have same efficiency: Θ(n log n)
Number of comparisons in the worst case is close to theoretical minimum for comparison-based sorting: log2 n! ≈ n log2 n n Space requirement: Θ(n) (not in-place) Can be implemented without recursion (bottom-up) even if not analyzing in detail, show the recurrence for mergesort in worst case: T(n) = 2 T(n/2) + (n-1) worst case comparisons for merge
16
Binary Search Very efficient algorithm for searching in sorted array:
K vs A[0] A[m] A[n-1] If K = A[m], stop (successful search); otherwise, continue searching by the same method in A[0..m-1] if K < A[m] and in A[m+1..n-1] if K > A[m] l 0; r n-1 while l r do m (l+r)/2 if K = A[m] return m else if K < A[m] r m-1 else l m+1 return -1
17
Analysis of Binary Search
Time efficiency worst-case recurrence: Cw (n) = 1 + Cw( n/2 ), Cw (1) = 1 solution: Cw(n) = log2(n+1) [Exercise] This is VERY fast: e.g., Cw(106) = 20 Optimal for searching a sorted array Limitations: must be a sorted array (not linked list) Bad (degenerate) example of divide-and-conquer Has a continuous counterpart called bisection method for solving equations in one unknown f(x) = 0 (see Sec. 12.4)
18
Multiplication of Large Integers
Consider the problem of multiplying two (large) n-digit integers represented by arrays of their digits such as: A = B = The grade-school algorithm: a1 a2 … an b1 b2 … bn (d10) d11d12 … d1n (d20) d21d22 … d2n … … … … … … … (dn0) dn1dn2 … dnn Efficiency: n2 one-digit multiplications
19
First Divide-and-Conquer Algorithm
A small example: A B where A = 2135 and B = 4014 A = (21· ), B = (40 · ) So, A B = (21 · ) (40 · ) = 21 40 · (21 40) · 14 In general, if A = A1A2 and B = B1B2 (where A and B are n-digit, A1, A2, B1, B2 are n/2-digit numbers), A B = A1 B1·10n + (A1 B2 + A2 B1) ·10n/2 + A2 B2 Recurrence for the number of one-digit multiplications M(n): M(n) = 4M(n/2), M(1) = 1 Solution: M(n) = n2
20
Second Divide-and-Conquer Algorithm
A B = A1 B1·10n + (A1 B2 + A2 B1) ·10n/2 + A2 B2 The idea is to decrease the number of multiplications from 4 to 3: (A1 + A2 ) (B1 + B2 ) = A1 B1 + (A1 B2 + A2 B1) + A2 B2, I.e., (A1 B2 + A2 B1) = (A1 + A2 ) (B1 + B2 ) - A1 B1 - A2 B2, which requires only 3 multiplications at the expense of (4-1) extra add/sub.
21
Example of Large-Integer Multiplication
2135 4014 21 35 40 14 2 1 4 0 3 5 1 4 5 6 5 4 2 4 1 0 3 4 8 12 8 * (12-8-0) * = 840
22
Example of Large-Integer Multiplication
2135 4014 M(4) = 3M(2) 21 35 40 14 M(2) = 3M(1) 2 1 4 0 3 5 1 4 5 6 5 4 2 4 1 0 3 4 M(1) = 1
23
Second Divide-and-Conquer Algorithm
Recurrence for the number of multiplications M(n): M(n) = 3M(n/2), n > 1 M(1) = 1 Solution: M(n) = 3log 2n = nlog 23 ≈ n1.585
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.