• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

最大公共子数组问题(分治法)

原理:

用二分法,求左数组的最大值,右数组的最大值,然后用中间元素求最大值。

image-20220503182312517

S1:数组X[1,n/2]中的最大值

S2:数组X的最大值[n/2 1,n]

S3:包含中间元素的最大值。

image-20220503191705210

算法示例:

分解:

image-20220503182816198

合并:

image-20220503191605979

代码:

'''

最大子阵列问题(分治法)

它分为三个部分。

1.求平分后左右的最大值。

2.求合并后的最大值。

3.比较以上三个得出最大值。

'''

def max_sub(X,开始,结束):

#如果只有一个数,那么最大的子数组就是它自己。

if start==end:

return X[start]

#记录中间位置

mid=int((开始结束)/2)

#获取左边最大的子阵列

left=max_sub(X,开始,中间)

#获得右边最大的子阵列

right=max_sub(X,mid 1,end)

#合并后得到最大的子阵列

merge=get_merge(X,开始,中间,结束)

#判断左、右、右中间的值最大,然后返回那个值。

如果向左向右:

如果右合并:

向左返回

elif左合并:

向左返回

else:

返回合并

else:

如果离开合并:

向右返回

elif右合并:

向右返回

else:

返回合并

def get_merge(X,start,mid,end):

#左侧包含中间的最大值

max_left=X[mid]

#左侧辅助计算的最大值

temp_max_left=X[mid]

#最大值在右边

max_right=X[mid 1]

#右侧辅助计算的最大值

temp _ max _ right=X[中间1]

#计算左边的最大值

对于范围内的I(中间1,开始1,-1):

if max _ left=temp _ max _ left X:

最大左侧=临时最大左侧X

临时最大左侧=X

#计算右边的最大值

对于范围内的I(中间2,末端1):

if max _ right=temp _ max _ right X:

最大右侧=临时最大右侧X

临时最大右侧=X

返回max_right max_left

#测试数据

X=[-1,-3,3,5,-4,3,2,-2,3,6]

长度=len(X)-1

max_num=max_sub(X,0,长度)

打印(最大数量)

Link to comment
Share on other sites