The document discusses divide-and-conquer algorithms and provides examples. It introduces divide-and-conquer as a problem-solving strategy that involves dividing a problem into smaller subproblems, solving those subproblems recursively, and combining the solutions. Examples of divide-and-conquer algorithms covered include merge sort, quicksort, Strassen's matrix multiplication, and the quickhull algorithm for computing convex hulls. The document also discusses efficiency analysis and the strengths and weaknesses of the divide-and-conquer approach.
The document discusses divide-and-conquer algorithms and provides examples. It introduces divide-and-conquer as a problem-solving strategy that involves dividing a problem into smaller subproblems, solving those subproblems recursively, and combining the solutions. Examples of divide-and-conquer algorithms covered include merge sort, quicksort, Strassen's matrix multiplication, and the quickhull algorithm for computing convex hulls. The document also discusses efficiency analysis and the strengths and weaknesses of the divide-and-conquer approach.
Objectives To introduce the divide-and-conquer mind set To show a variety of divide-and-conquer solutions: Merge Sort Quick Sort Strassens Matrix Multiplication Convex Hull by Divide-and-Conquer To discuss the strengths and weaknesses of a divide-and-conquer strategy Divide-and-Conquer Best known algorithm design strategy: 1. Divide instance of problem into two or more smaller instances 2. Solve smaller instances recursively 3. Obtain solution to original (larger) instance by combining these solutions Silly Example (Addition): a 0 + . + a n-1 = (a 0 + + a n/2-1 ) + (a n/2 + a n-1 ) Divide-and-Conquer Recurrence Templates apply General divide and conquer recurrence: T(n) = aT(n/b) + f (n), a ! 1, b ! 2 Efficiency analysis of d&c algorithms simplified by Master Theorem: If f(n) !(n d ) where d>= 0 then: T(n) !(n d ) if a < b d T(n) !(n d log n) if a = b d T(n) !(n log b a ) if a > b d Divide-and-Conquer Illustrated SUBPROBLEM 2 OF SIZE n/2 SUBPROBLEM 1 OF SIZE n/2 A SOLUTION TO SUBPROBLEM 1 A SOLUTION TO THE ORIGINAL PROBLEM A SOLUTION TO SUBPROBLEM 2 A PROBLEM OF SIZE n Perfect example: Mergesort Algorithm: 1. Split A[1..n] in half and put copy of each half into arrays B [1.. n/2 ] and C[1.. n/2 ] 2. Recursively MergeSort arrays B and C 3. Merge sorted arrays B and C into array A Merging: REPEAT until no elements remain in one of B or C 1. Compare 1st elements in the rest of B and C 2. Copy smaller into A, incrementing index of corresponding array 3. Once all elements in one of B or C are processed, copy the remaining unprocessed elements from the other array into A 7 Mergesort Example 7 2 1 6 4 7 2 1 6 4 7 2 1 6 4 7 2 2 7 1 2 7 4 6 1 2 4 6 7 Efficiency of Mergesort Recurrence: C(n) = 2 C(n/2) + C merge (n) for n > 1, C(1) = 0 C merge (n) = n - 1 in the worst case All cases have same efficiency: "(n log n) Number of comparisons is close to theoretical minimum for comparison-based sorting: log n! ! n lg n - 1.44 n Improving Efficiency of Mergesort Principal drawback is space requirement: " ( n ) (NOT in-place) CAN be done in place, but with large multiplicative constant Can be implemented without recursion (bottom-up) Quicksort Select a pivot (partitioning element) Rearrange the list into two sublists: All elements positioned before the pivot are " the pivot Those positioned after the pivot are > the pivot Requires a pivoting algorithm Exchange the pivot with the last element in the first sublist The pivot is now in its final position QuickSort the two sublists p A[i]"p A[i]>p The Partition Algorithm Quicksort Example 5 3 1 9 8 2 7 5 3 1 9 8 2 7 i j i j 5 3 1 2 8 9 7 j i 2 3 1 5 8 9 7 2 3 1 8 9 7 i j 2 1 3 5 3 1 2 8 9 7 i j i j 2 1 3 j i 1 2 3 Recursive Call Quicksort (2 3 1) & Quicksort (8 9 7) Recursive Call Quicksort (1) & Quicksort (3) i j 8 7 9 i j 8 7 9 j i 7 8 9 Recursive Call Quicksort (7) & Quicksort (9) Worst Case Efficiency of Quicksort In the worst case all splits are completely skewed For instance, an already sorted list! One subarray is empty, other reduced by only one: Make n+1 comparisons Exchange pivot with itself Quicksort left = , right = A[1..n-1] C worst = (n+1) + n + + 3 = (n+1)(n+2)/2 - 3 = "(n 2 ) p A[i]"p A[i]>p General Efficiency of Quicksort Efficiency Cases: Best: split in the middle "( n log n) Worst: sorted array! "( n 2 ) Average: random arrays "( n log n) Improvements (in combination 20-25% faster): Better pivot selection: median of three partitioning avoids worst case in sorted files Switch to Insertion Sort on small subfiles Elimination of recursion Considered the method of choice for internal sorting for large files (n # 10000) Binary Search O(logn) algorithms for searching sorted arrays Atypical example - solves just one problem of half the size on each ofi its iterations 16 Objectives To introduce the divide-and-conquer mind set To show a variety of divide-and-conquer solutions: Merge Sort Quick Sort Strassens Matrix Multiplication Convex Hull by Divide-and-Conquer To discuss the strengths and weaknesses of a divide-and-conquer strategy Strassens Matrix Multiplication Strassen observed [1969] that the product of two matrices can be computed as follows: where: m1=(a00+a11) * (b00+b11) m2=(a10+a11) * b00 m3=a00 * (b01-b11) m4=a11 * (b10-b00) m5=(a00+a01) * b11 m6= (a10-a00) * (b00+b01) m7= (a01-a11) * (b10+b11) C 00 C 01 C 10 C 11 A 00 A 01 A 10 A 11 B 00 B 01 B 10 B 11 M 1 + M 4 -M 5 +M 7 M 3 + M 5 M 2 + M 4 M 1 + M 3 - M 2 + M 6 = = * Strassens Matrix Multiplication Op Count: Each of M 1, , M 7 requires 1 mult and 1 or 2 add/sub Total = 7 mul and 18 add/sub Compared with brute force which requires 8 mults and 4 add/sub. But is asymptotic behaviour is NB n/2 # n/2 submatrices are computed recursively by the same method Efficiency of Strassens Algorithm If n is not a power of 2, matrices can be padded with zeros Number of multiplications: M(n) = 7 M(n/2) for n > 1, M(1) = 1 Set n = 2 k , apply backward substitution M(2 k ) = 7M(2 k-1 ) = 7 [7 M(2 k-2 )] = 7 2 M(2 k-2 ) = = 7 k M(n) = 7 log n = n log 7 ! n 2.807 Number of additions: A(n) $ "(n log 7 ) Other algorithms closer to the lower limit of n 2 multiplications, but are even more complicated QuickHull Algorithm 1. Sort points by increasing x-coordinate values 2. Identify leftmost and rightmost extreme points P 1
and P 2 (part of hull) 3. Compute upper hull: Find point P max that is farthest away from line P 1 P 2 Quickhull the points to the left of line P 1 P max Quickhull the points to the left of line P max P 2 4. Similarly compute lower hull QuickHull Algorithm 1. Sort points by increasing x-coordinate values 2. Identify leftmost and rightmost extreme points P 1
and P 2 (part of hull) 3. Compute upper hull: Find point P max that is farthest away from line P 1 P 2 Quickhull the points to the left of line P 1 P max Quickhull the points to the left of line P max P 2 4. Similarly compute lower hull P 1 P max P 2 L L Finding the Furthest Point Given three points in the plane p 1 , p 2 , p 3
Area of Triangle = % p 1 p 2 p 3 = 1/2 ! D ! D = ! D ! = x 1 y 2 + x 3 y 1 + x 2 y 3 - x 3 y 2 - x 2 y 1 - x 1 y 3 Properties of ! D ! : Positive iff p 3 is to the left of p 1 p 2 Correlates with distance of p 3 from p 1 p 2 x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 Efficiency of Quickhull Finding point farthest away from line P 1 P 2 is linear in the number of points This gives same efficiency as quicksort: Worst case: "(n 2 ) Average case: "(n log n) If an initial sort is required, this can be accomplished in "( n log n) no increase in asymptotic efficiency class Alternative Divide-and-Conquer Convex Hull: Grahams scan and DCHull Worst-case efficiency "( n log n) Strengths and Weaknesses of ! Strengths: Generally improves on Brute Force by one base efficiency class Easy to analyse using the Recurrence Templates Ideally suited for parallel computations " Weaknesses: Often requires recursion, which introduces overheads Can be inapplicable and inferior to simpler algorithmic solutions