Lecture7C

advertisement
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 )
Download