Divide and conquer - the largest sub-array problem

A find an array of empty and the largest non-consecutive sub-array. For example: Array
A = {13, -3, -25 , 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7} , and the largest continuous subarray is {18, 20, -7, 12}, and the maximum is 43, therefore {18, 20, -7, 12} is the largest sub-array a;
list {1, -4, 3, -4 } the maximum subarray of {3}.

Using divide and conquer strategy: the size of the array is divided into two equal sub-arrays, each array Praying largest sub-arrays, as well as the largest sub-arrays across the midpoint, then left sub-arrays, the right sub-arrays, spanning the midpoint of three kinds maximum subarray case comparison takes a maximum value.

Java code to achieve:

class FindMaximumSubArray
{
public static void main(String[] args)
{
int[] arr = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
SubArray max_subarray = find_maximum_subarray(arr, 0, arr.length - 1);
System.out.println("low:" + max_subarray.low + ", high:" + max_subarray.high + ", sum:" + max_subarray.sum);
}

// find the maximum subarray
Private static subarray find_maximum_subarray (int [] ARR, Low int, int High) {
IF (High Low ==) {
return new new subarray (Low, High, ARR [Low]);
} the else {
int MID = (High + Low) / 2;
subarray left = find_maximum_subarray (ARR, Low, MID); // recursive evaluation maximum subarray left subarray
subArray right = find_maximum_subarray (arr, mid + 1, high); // recursive maximum subarray seek the right subarray
subArray cross = find_max_crossing_subarray (arr, low , mid, high); // find the maximum span midpoint subarray
if (left.sum> = right.sum && left.sum > = cross .sum) {
return left;
} the else IF (right.sum> = left.sum && right.sum> = cross.sum) {
return right;
} Cross the else return;
}
}

// 查找包含中点的最大子数组
private static SubArray find_max_crossing_subarray(int[] arr, int low, int mid, int high) {
int left_sum = arr[mid];
int max_left = mid;
int sum = 0;
for (int i = mid; i >= low; i--) {// 左边最大和
sum += arr[i];
if (sum > left_sum) {
left_sum = sum;
max_left = i;
}
}
int right_sum = arr[mid + 1];
int max_right = mid + 1;
sum = 0;
for (int i = mid + 1; i <= high; i++) {// 右边最大和
sum += arr[i];
if (sum > right_sum) {
right_sum = sum;
max_right = i;
}
}
return new SubArray(max_left, max_right, left_sum + right_sum);
}

private static class SubArray {
int low;
int high;
int sum;

SubArray(int low, int high, int sum) {
this.low = low;
this.high = high;
this.sum = sum;
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 is
62 is
63 is
64
65
run time of the algorithm is Θ (nlgn).
---------------------

Guess you like

Origin www.cnblogs.com/hyhy904/p/11257584.html