求数组的子数组之和的最大值

1  蛮力法:

   从第一个元素开始的子序列有A[0],A[0]-A[1],....A[0]-A[i],...A[0]-A[n-1]

   从第i个元素开始的子序列有]..A[i,A[i]-A[i+1],...A[i]-A[n]

   如此我们只需把每一种情况求出来进行比较即可得到结果

  第i个元素都是是N-i次计算

  共有N个元素 那么复杂度位 N-1+(N-2)+....1 = O(N^2)


2 分治法

   把数组分成2段,分别求出这两段的最大子数组的和,那么最大的子序列只可能是左边最大的或者右边最大的,或者跨越中间的元素的一段(求这个需要遍历数组一遍)

   由于N个元素二分成log2(N)次,每一次往下分解都需要遍历数组一次(每一次往下分解将遍历的子数组加起来就相当于遍历整个数组),也就是需要N*log2N次,因而复杂度位N*log2N


3 减治法

  假如我们知道A[i+1]-A[n-1]的最大子数组和位Max[i+1],从A[i+1]开始的最大子序列位Start[i+1],那么我们接下来分析A[i]-A[n-1]对应的最大子数组和以及从A[i]开始的start[i]

我说包含A[i]之后A[i]-A[n-1]子序列最大的值为Max(A[i],A[i]+start[i+1],max[i+1]); 为什么呢?

(1) 假如最大子序列不包含A[i] 那么最大值是不是max[i+1]呢?

(2) 假如最大子序列包含A[i] ,那么最大值情况是不是A[i]或者A[i]+start[i+1]呢 你想假如start[i+1]是在m这个位置结束的,那么假如包含A[i]并且序列越过或者在m左边的序列(这里这个序列不仅仅包含A[i]),一定比A[i]+start[i+1]小,那么仅仅包含A[i]的情况则是start[i+1]小于0了

还有一个问题,我们如何求start[i]呢?

很简单,要么是A[i]要么是A[i]+start[i+1] ,道理与上面类似

这里我们只需要遍历一次数组既可以求出最大值 因而复杂度为O(N)

测试代码如下:

http://download.csdn.net/detail/learniting/4618388




 

  

  

   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值