Design and Analysis of Algorithms Maximum-subarray problem and matrix multiplication Haidong Xue Summer 2012, at GSU Maximum-subarray problem back ground • If you know the price of certain stock from day i to day j; • You can only buy and sell one share once • How to maximize your profit? 120 110 Price 100 90 80 70 60 0 1 2 3 4 5 6 7 8 day # 9 10 11 12 13 14 15 16 Maximum-subarray problem back ground • What is the brute-force solution? max = -infinity; for each day pair p { if(p.priceDifference>max) max=p.priceDifference; } Time complexity? π 2 pairs, so O(π2 ) Maximum-subarray problem back ground • If we know the price difference of each 2 contiguous days • The solution can be found from the maximum-subarray • Maximum-subarray of array A is: – A subarray of A – Nonempty – Contiguous – Whose values have the the largest sum Maximum-subarray problem back ground Day Price Difference 0 10 1 11 1 What is the solution? 2 7 -4 3 10 3 4 6 -4 Buy on day 2, sell on day 3 Can be solve it by the maximum-subarray of difference array? Sub-array Sum 1-1 1 1-2 -3 1-3 0 1-4 -4 2-2 -4 2-3 -1 2-4 -5 3-3 3 3-4 -1 4-4 -4 Maximum-subarray problem – divideand-conquer algorithm • How to divide? – Divide to 2 arrays • What is the base case? • How to combine the sub problem solutions to the current solution? – A fact: • when divide array A[i, …, j] into A[i, …, mid] and A[mid+1, …, j] • A sub array must be in one of them – A[i, …, mid] // the left array – A[mid+1, …, j] // the right array – A[ …, mid, mid+1….] // the array across the midpoint – The maximum subarray is the largest sub-array among maximum subarrays of those 3 Maximum-subarray problem – divideand-conquer algorithm • Input: array A[i, …, j] • Ouput: sum of maximum-subarray, start point of maximumsubarray, end point of maximum-subarray • FindMaxSubarray: 1. if(j<=i) return (A[i], i, j); 2. mid = floor(i+j); 3. (sumCross, startCross, endCross) = FindMaxCrossingSubarray(A, i, j, mid); 4. (sumLeft, startLeft, endLeft) = FindMaxSubarray(A, i, mid); 5. (sumRight, startRight, endRight) = FindMaxSubarray(A, mid+1, j); 6. Return the largest one from those 3 Maximum-subarray problem – divideand-conquer algorithm FindMaxCrossingSubarray(A, i, j, mid) 1. Scan A[i, mid] once, find the largest A[left, mid] 2. Scan A[mid+1, j] once, find the largest A[mid+1, right] 3. Return (sum of A[left, mid] and A[mid+1, right], left, right) Let’s try it in Java Target array : 1 All the sub arrays: 1 -4 3 2 1 -4 -4 3 3 2 1 -3 -4 -4 Max! 1 -1 3 3 1 2 2 5 0 -4 3 -4 3 2 1 -4 3 2 2 Target array : 1 All the sub arrays: 1 -4 3 1 -4 -4 The problem can be then solved by: 2 1 1 -1 3 3 1 2 -3 -4 -4 3. Find the max in crossing sub arrays 4. Choose the largest one from those 3 as the final result 3 3 1. Find the max in left sub arrays 2. Find the max in right sub arrays Divide target array into 2 arrays 2 2 5 0 -4 3 -4 3 2 1 -4 3 2 2 We then have 3 types of subarrays: The ones belong to the left array The ones belong to the right array The ones crossing the mid point FindMaxSub ( 1 -4 3 ) 2 1. Find the max in left sub arrays FindMaxSub ( 1 -4 2. Find the max in right sub arrays FindMaxSub ( 3 2 3. Find the max in crossing sub arrays Scan 1 -4 once, and scan 3 2 once 4. Choose the largest one from those 3 as the final result ) ) 3. Find the max in crossing sub arrays 1 1 The largest crossing subarray is : -4 3 2 -4 Sum=-4 -4 Sum=-3 3 Sum=3 3 2 largest Sum=5 largest Maximum-subarray problem – divideand-conquer algorithm • What is the time complexity? • FindMaxSubarray: 1. if(j<=i) return (A[i], i, j); 2. mid = floor(i+j); 3. (sumCross, startCross, endCross) = FindMaxCrossingSubarray(A, i, j, mid); 4. (sumLeft, startLeft, endLeft) = FindMaxSubarray(A, i, mid); 5. (sumRight, startRight, endRight) = FindMaxSubarray(A, mid+1, j); 6. Return the largest one from those 3 π π = 2π π 2 + Θ(n) Matrix multiplication • How to multiply two matrices? −9 −3 = −1 2 2 1 • Given matrix π΄ππ πππ π΅ππ , πΆππ = π΄π΅ Time Complexity? • πππ = ππ=1 πππ πππ • For each πππ , we need Θ(π) • There are π2 πππ , so π π = π2 Θ(π)=Θ(π3 ) Matrix multiplication divide-and-conquer algorithm • C=AB • • • • • • πΆ11 πΆ12 π΄11 π΄12 π΅11 = × π΅21 πΆ21 πΆ22 π΄21 π΄22 πΆ11 = π΄11 × π΅11 + π΄12 × π΅21 πΆ12 = π΄11 × π΅12 + π΄12 × π΅22 πΆ21 = π΄21 × π΅11 + π΄22 × π΅21 πΆ22 = π΄21 × π΅12 + π΄22 × π΅22 Recurrence equation? • π π = 8π π 2 + Θ(π2 ) π΅12 π΅22 Matrix multiplication divide-and-conquer algorithm • π π = 8π π 2 + Θ(π2 ) • What is the time complexity? • From Master method we know it is Θ(π3 ) Matrix multiplication Strassen’s algorithm • π π = 8π π 2 + Θ(π2 ) • π π = 7π π 2 + Θ(π2 ) Matrix multiplication Strassen’s algorithm • Strassen’s algorithm • 1. Perform 10 times matrix addition or subtraction to make π1 π‘ππ10 from π΄ππ πππ π΅ππ • 2. Perform 7 times matrix multiplication to make π1 to π7 from π΄ππ , π΅ππ πππ ππ • 3. Perform matrix addition or matrix subtraction to obtain πΆ11 , πΆ12 , πΆ21 and πΆ22 π π = 7π π 2 + Θ(π2 )= Θ(ππππ27 )