분할 및 정복 - 가장 큰 하위 배열 문제

A는 빈의 배열과 가장 큰 비 연속적인 하위 배열을 찾을 수 있습니다. 배열 예를 들어
A = {13, -3, -25 , 20, -3, -16, -23, 18, 20, -4, 12, -5, -22, 15, -4, 7} , 및 최대 연속 서브 어레이는 {-7, 12 20 18}, 최대 따라서, {18, 20, -4, 12} 최대 서브 어레이는 43 개이며,
리스트는 {1, -3, 3, -2 }의 최대 부분 배열 {3}.

삼가지 중간에 걸친 어레이의 크기가 동일한 두 개의 서브 어레이, 큰 서브 어레이기도 각 배열뿐만 아니라 중간에 걸쳐 가장 큰 서브 어레이 후 좌측 서브 어레이, 우측 서브 어레이로 분할되어 분할을 사용하는 전략을 정복 최대 서브 어레이의 경우 비교가 최대 값을 취한다.

자바 코드를 달성하기 위해 :

클래스 FindMaximumSubArray
{
공공 정적 무효 메인 (문자열 []에 args)
{
INT [] 도착 = {13, -3, -25, 20, -3, -16, -23, 18, 20, -4, 12, -5 , -22, 15, -4, 7};
서브 어레이 max_subarray = find_maximum_subarray (도착, 0, arr.length - 1);
에서 System.out.println ( "낮은"+ max_subarray.low + "높은"+ max_subarray.high + "합"+ max_subarray.sum);
}

// 최대 부분 배열 찾을
개인 정적 부분 배열의 find_maximum_subarray을 (INT [] ARR, 낮은 INT, INT 고) {
경우 ((High) 저 (Low) ==가) {
새로운 새로운 부분 배열 (저, 고, ARR [낮음]) 반환;
}는 다른 {
MID를 int로 = (고 + 저) / 2;
왼쪽 부분 배열 = find_maximum_subarray (ARR, 낮은, MID), 재귀 평가의 최대 부분 배열이 부분 배열 왼쪽 //
부분 배열 우측 = find_maximum_subarray (편곡, 중간 // +, 고 1) 재귀 최대 부분 배열은 오른쪽 부분 배열 구
부분 배열 크로스 = find_max_crossing_subarray (편곡, 저 , 중, 고); //이 최대 스팬 중간의 부분 배열 찾기
(left.sum> = right.sum && left.sum 경우 > = 십자가를 .sum) {
; 왼쪽 반환
(right.sum> = left.sum && right.sum> = cross.sum) {된 IF 다른}를
오른쪽 반환;
}는 다른 복귀 크로스;
}
}

//查找包含中点的最大子数组
개인 정적 find_max_crossing_subarray 서브 어레이 (INT [] 도착, INT 낮은, 중간 INT, INT 높음) {
INT left_sum = 도착 [미드];
INT max_left = 중간;
INT 합 = 0;
경우 (= 미드 I에서 INT; I> = 로우; 난 ...) {//左边最大和
합계 + = 도착의 [I];
(합계> left_sum) {경우
left_sum = 합;
max_left = 1;
}
}
INT right_sum = 도착 [중간 + 1];
INT max_right 중간 = + 1;
합 = 0;
경우 (; 나는 <= 하이; 나는 = + 1 중간 값 int 난 ++) {//右边最大和
합계 + = 도착의 [를 I];
(합계> right_sum) {경우
right_sum = 합;
max_right = 1;
}
}
(max_left, max_right, left_sum + right_sum) 새로운 부분 배열을 반환;
}

개인 정적 클래스의 부분 배열 {
저 INT;
높은 INT;
INT 합;

서브 어레이 (INT 낮은 INT 높은 INT 합) {
this.low = 로우;
this.high = 하이;
this.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)는
62이다
(63)는
64
(65)
알고리즘의 실행 시간은 Θ (nlgn)이다.
---------------------

추천

출처www.cnblogs.com/hyhy904/p/11257584.html