版权声明:本文为博主原创文章,未经博主允许不得转载。 http://www.cnblogs.com/Mr-quin/p/8640753.html
题目要求
最大连续子数组和(最大子段和)
问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
-- 引用自《百度百科》
代码
代码
代码路径
主程序代码: MaxArray/app/src/main/java/com/aierdeliqi/junittestexample/
单元测试代码: MaxArray/app/src/test/java/com/aierdeliqi/junittestexample/
关键代码:
for(int i = 0; i < array.length ; i++){
accumulation += array[i];
max = Math.max(max,accumulation - negativePointer);
//指针移进
negativePointer = Math.min(negativePointer,accumulation);
}
if(max >= 0){
return max;
}else {
return 0;
思路导图
每个三角内为累加值,记录曾经遇到过的最小的负数(负值累加的最小值),会发现当累加值减去最小负值时,得到的便是当前的最大子数组之和。
覆盖标准测试
参考语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖的示例
选择覆盖标准
选用条件组合覆盖
程序流程图
判定结构图
判定语句代码
1.max = Math.max(max,accumulation - negativePointer);
2.negativePointer = Math.min(negativePointer,accumulation);
条件组合覆盖
序号 | 条件 | 用例 | 期待值 |
---|---|---|---|
1 | M < A-NP&&NP < A | 1,2,3,4 | 10 |
2 | M < A-NP&&NP >= A | -4,1,2,3 | 6 |
3 | M >= A-NP&&NP < A | 0,0,0,1 | 1 |
4 | M >= A-NP&&NP >= A | -1,-2,-3,-4 | 0 |
自动单元测试
- 使用默认数据
数据:-2,11,-4,13,-5,-2
期待值:20
程序无错。
- M < A-NP&&NP < A
数据:1,2,3,4
期待值:10
此项数据测试的是在某一项出现比0大的累加值且不出现比0小的负累加值时的输出。
- M < A-NP&&NP >= A
数据:-4,1,2,3
期待值:6
证明程序无错。
此项数据测试的是在某一项出现比0大的累加值时且出现比0小的最小累加值时的输出。
- M >= A-NP&&NP < A
数据:0,0,0,1
期待值:1
程序无错
此项数据测试在不出现比max=0还大的累加值又不出现比0小的负累加值时的输出。
- M >= A-NP&&NP >= A
数据:-1,-2,-3,-4
期待值:0
程序无错。
此项数据测试在不出现比max=0还大的累加值且出现比0小的负累加值时的输出。
试用PSP2.1
总结
这次依旧是对Junit的试用与熟悉,与上次作业时相比,这次尝试用了条件组合覆盖的标准,在设计测试数据的时候力争将各种可能的条件组合都覆盖,这是以往编程都不曾用过的全新的测试方法。虽然在AS上,Junit的测试还存在很多局限性,如一些控件和功能无法用数值的方法进行测试。但今后我会继续学习测试方法,优化代码,以求提高编程效率。
思路改进
其实想到了可以用两种或多种(如暴力法,分治法,动态规划等)方法生成测试数据来互相进行单元测试验证结果,由于时间问题暂时搁置,以后有时间会来填这个坑。