最大子陣列(分治法)

2021-06-25 21:00:50 字數 4855 閱讀 1061

尋找a[low, high]中的最大連續子陣列a[i, j]

mid=(low+high)/2,欲求的最大連續子陣列出現的位置:

1、出現在a[low, mid]中 ,            即     low<=i<=j<=mid

2、出現在a[mid+1,high]中,           即    mid

3、跨越了mid位置,出現在a[low, high]中,即      low<=i<=mid

先來看第三種情況:

求出包含mid位置的左邊最大連續子陣列:

int

left_max_sum

=-999

;

intsum=0

;

intleft

;

for(

inti

=mid;i

>=low;i

--)

}

求出包含mid+1 位置的右邊最大連續子陣列:

sum=0

;

intright_max_sum

=-999

;

intright

;

for(

intj

=mid+1

;j<=high;j

++)

}

第三種情況的最大連續子陣列即是把上面的包含 mid位置的左邊最大連續子陣列 和包含 mid+1的右邊最大連續子陣列加起來!

對於第一種 a[i, j] 出現在出現在a[low, mid]中

和第二種

a[i, j]

出現在a[mid+1,high]中的情況直接用遞迴了。求出這三種情況下的最大連續子陣列,只要找出和最大的連續子陣列即可!

left_right_sum find_max_subbary

(inta,

intlow

,int

high

);

return

d;

}

intmid

=(low

+high)/2

;

left_right_sum dl

=find_max_subbary(a

,low

,mid

);

left_right_sum dr

=find_max_subbary(a

,mid+1

,high

);

left_right_sum dm

=find_max_crossing_subarray(a

,low

,high

,mid

);

left_right_sum dmax

;

if(

dl.max_sum

>=dr.

max_sum

&&dl

.max_sum

>=dm.

max_sum

)elseif(

dr.max_sum

>=dl.

max_sum

&&dr

.max_sum

>=dm.

max_sum

)else

上**:

#include

using

namespace

std;

#define

n 16

struct

left_right_sum

;

left_right_sum find_max_subbary

(inta,

intlow

,int

high

);

left_right_sum find_max_crossing_subarray

(inta,

intl

,intr,

intmid

);

int

main

()

;

inta[n

]=;

left_right_sum d

=find_max_subbary(a

,0,n

-1);

cout

<<

" : "

<<

" : "

<<

endl

;

}

left_right_sum find_max_subbary

(inta,

intlow

,int

high

);

// left_right_sum *dd=&d;

return

d;

}

intmid

=(low

+high)/2

;

left_right_sum dl

=find_max_subbary(a

,low

,mid

);

left_right_sum dr

=find_max_subbary(a

,mid+1

,high

);

left_right_sum dm

=find_max_crossing_subarray(a

,low

,high

,mid

);

left_right_sum dmax

;

if(

dl.max_sum

>=dr.

max_sum

&&dl

.max_sum

>=dm.

max_sum

)elseif(

dr.max_sum

>=dl.

max_sum

&&dr

.max_sum

>=dm.

max_sum

)else

cout

<<

dmax

.left

<<

" : "

<<

dmax

.right

<<

" : "

<<

dmax

.max_sum

<<

endl

;

cout

<<

"-----------------------------"

<<

endl

;

return

dmax

;

}

left_right_sum find_max_crossing_subarray

(inta,

intl

,intr,

intmid

)

}

sum=0

;

intright_max_sum

=-999

;

intright

;

for(

intj

=mid+1

;j<=r;

j++)

}

left_right_sum d1

=;

// left_right_sum *dd1=&d1;

return

d1;

}

分治法 尋找最大子陣列

include define magic 999999 子陣列結構體 struct sub array struct sub array find max crossing subarray int a,int low,int mid,int high struct sub array find m...

最大子樹組(分治演算法)

最大子樹組 include 返回乙個下標元組劃定跨越中點的最大子陣列的邊界,並返回最大子陣列中值的和 int find max crossing subarray int a,int low,int mid,int high sum 0 for j mid 1 j high j return lef...

演算法導論 分治法 最大子陣列

題目描述 給定義陣列a,長度為n,找出陣列a中的最大子陣列,例如陣列a 則最大子陣列為。使用分治策略的求解方法 假定我們要尋找子陣列a low.high 的最大子陣列,使用分治法意味著我們要將子陣列劃分為兩個規模盡可能相等的子陣列。也就是說,找到子陣列的 位置,比如mid,然後求解兩個子陣列a lo...