求解最大子序列和
来源:互联网 发布:雪梨家淘宝店铺 编辑:程序博客网 时间:2024/04/30 02:00
从一串数据中算出最大的子序列和,这里提供了三种方法,方案一到方案三中算法由劣到优。
例如:-2,11,-4,13,-5,-2,答案为20(从A2到A4)
方案一:
public static int maxSubSum(int a []){
int maxSum=0;
for(int i=0; i<a.length; i++)
for(int j=i; j<a.length; j++){
int thisSum=0;
for(int k=i; k<=j; k++)
thisSum+=a[k];
if(thisSum>maxSum)
maxSum=thisSum;
}
return maxSum;
}
此种方案的时间复杂度大概为N的三次方,可以这样来分析:三次for循环,每次循环为N,所以三次迭代的循环大概为N的三次方。
方案二:
public static int maxSubSum(int a []){
int maxSum=0;
for(int i=0; i<a.length; i++){
int thisSum=0;
for(int j=i; j<a.length; j++){
thisSum+=a[j];
if(thisSum>maxSum)
maxSum=thisSum;
}
}
return maxSum;
}
此种方案的时间复杂度为N的平方,理解与第一种相同,这种方法相对于第一种方案较好。
方案三:
public static int maxSubSum(int a []){
int maxSum=0;
int thisSum=0;
for(int i=0; i<a.length; i++){
thisSum+=a[i];
if(thisSum>maxSum)
maxSum=thisSum;
else if(thisSum<0)
thisSum=0;
}
return maxSum;
}
此种方案的时间复杂度为N,在三种方案中最优。运行时间是明显的,但是不容易看出正确性。我们可以分析出这样的结论,如果a[i]是负的,那么它不可能代表最优序列的起点,因为任何包含a[i]的作为起点的子序列都可以通过用a[i+1]作为起点而改进。类似地,任何负的子序列不可能是最优子序列的前缀(原理相同)。
小结:其实除此三种算法,还有一种时间复杂度为N*logN的递归算法。方法稍微有点复杂,如果读者感兴趣可以借鉴其他文章。
例如:-2,11,-4,13,-5,-2,答案为20(从A2到A4)
方案一:
public static int maxSubSum(int a []){
int maxSum=0;
for(int i=0; i<a.length; i++)
for(int j=i; j<a.length; j++){
int thisSum=0;
for(int k=i; k<=j; k++)
thisSum+=a[k];
if(thisSum>maxSum)
maxSum=thisSum;
}
return maxSum;
}
此种方案的时间复杂度大概为N的三次方,可以这样来分析:三次for循环,每次循环为N,所以三次迭代的循环大概为N的三次方。
方案二:
public static int maxSubSum(int a []){
int maxSum=0;
for(int i=0; i<a.length; i++){
int thisSum=0;
for(int j=i; j<a.length; j++){
thisSum+=a[j];
if(thisSum>maxSum)
maxSum=thisSum;
}
}
return maxSum;
}
此种方案的时间复杂度为N的平方,理解与第一种相同,这种方法相对于第一种方案较好。
方案三:
public static int maxSubSum(int a []){
int maxSum=0;
int thisSum=0;
for(int i=0; i<a.length; i++){
thisSum+=a[i];
if(thisSum>maxSum)
maxSum=thisSum;
else if(thisSum<0)
thisSum=0;
}
return maxSum;
}
此种方案的时间复杂度为N,在三种方案中最优。运行时间是明显的,但是不容易看出正确性。我们可以分析出这样的结论,如果a[i]是负的,那么它不可能代表最优序列的起点,因为任何包含a[i]的作为起点的子序列都可以通过用a[i+1]作为起点而改进。类似地,任何负的子序列不可能是最优子序列的前缀(原理相同)。
小结:其实除此三种算法,还有一种时间复杂度为N*logN的递归算法。方法稍微有点复杂,如果读者感兴趣可以借鉴其他文章。
- 求解最大子序列和
- 最大子序列和问题的求解
- 最大子序列和问题的求解
- 最大子序列和问题求解
- 最大子序列和求解过程
- 最大子序列和问题的求解
- 最大子序列问题求解
- 线性时间求解最大子序列和——HDU1003
- 最大子序列求解 分治法和动态规划
- 动态规划求解最大连续子序列和
- 算法笔记1-最大子序列和问题的求解
- 最大子序列和求解 最优算法O(N)
- 如何求解最大连续子序列的和
- 关于求解最大子序列和问题的总结
- java最大子序列和问题的求解
- 【数据结构与算法】最大子序列和问题的求解
- 求解最大子序列和问题的线性时间算法
- 最大子序列问题及其求解
- 关于C++ const 的全面总结
- 【APIO2010】【斜率优化DP】特别行动队
- 常用SQL语句大全
- 2013编程之美资格赛【传话游戏】
- 五、Oracle数据库之学习笔记---Oracle的表的基本查询(2)
- 求解最大子序列和
- UVALive 5739 User Names
- C++中函数的默认参数
- onSaveInstanceState和onRestoreInstanceState触发的时机
- Oracle 10g 归档日志满了的解决办法
- TP-LINK漏洞门被曝高危 可致用户隐私泄露
- 判断101-200之间有多少个素数,并输出所有素数。
- C语言和gcc笔记
- SQL Server同步复制的实现方法 IP方式 别名 连接