分割統治 - 最大のサブアレイの問題

空の配列と最大の非連続的なサブ配列を見つけます。例えば:配列
A = {13、-3、-25 、20、-3、-16、-23、18、20、-7、12、-5、-22、15、-4、7} 、および最大;連続サブアレイは{18、20、-7、12}であり、最大値は43であり、従って、{18、20、-7、12}は最大サブアレイで
、リスト{1、-4、3 -4 }の最大サブアレイ{3}。

三種類の中間点に及ぶ、アレイのサイズは二つの等しいサブアレイ、最大サブアレイを祈る各アレイ、ならびに中間点を横切る最大サブアレイ、次いで左サブアレイ、右サブアレイに分割される:分周を使用し、戦略を征服最大サブアレイケース比較が最大値をとります。

達成するためのJavaコード:

クラスFindMaximumSubArray
{
パブリック静的無効メイン(文字列[] args)
{
INT [] ARR = {13、-3、-25、20、-3、-16、-23、18、20、-7、12、-5 、-22、15、-4、7}。
サブアレイmax_subarray = find_maximum_subarray(ARR、0、arr.length - 1)。
System.out.println( "ロー" + max_subarray.low + "ハイ:" + max_subarray.high + "和:" + max_subarray.sum)。
}

//最大サブアレイ見つける
(高INT、[] ARR、ローINTをINT){プライベート静的サブアレイfind_maximum_subarrayを
{(高低==)IF
新しい新しいサブアレイ(ロー、ハイ、ARR [低])を返し、
そうでなければ} {
MIDをint型=(ハイ+低)/ 2;
左= find_maximum_subarray(ARR、低、MID)をサブアレイ; //再帰的評価の最大のサブアレイのサブアレイ左
サブアレイ右= find_maximum_subarray(ARR、ミッド + 1、高); // 再帰最大サブアレイが右サブアレーが求める
(ARR、低い= find_max_crossing_subarrayを横断サブアレイ 、中、高); // 最大スパンの中間点の部分配列を見つける
場合(left.sum> = right.sum && left.sum > =クロス.SUM){
戻り左;
}そうIF(right.sum> = left.sum && right.sum> = cross.sum){
右返す;
}そうでなければリターンを渡り;
}
}

//查找包含中点的最大子数组
プライベート静的サブアレイfind_max_crossing_subarray(INT [] ARR、INT低い、INT中間、INT高い){
int型left_sum = ARR [中間]。
int型max_left =ミッド;
int型の合計= 0;
ため(=中間のI int型; I> =低; i--){//左边最大和
和+ = ARRの[I]。
IF(和> left_sum){
left_sum =和。
max_left = I;
}
}
int型right_sum = ARR [中間+ 1]。
int型max_right =ミッド+ 1;
合計= 0;
{//右边最大の和を(; I =高い<I ++は、I =中間+ 1の整数)のための
合計+ = ARRの[i]は、
IF(和> right_sum){
right_sum =和。
max_right = I;
}
}
(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