软工 assignment 3 —— 求最大子数列之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

自动单元测试

  1. 使用默认数据

数据:-2,11,-4,13,-5,-2
期待值:20

程序无错。

  1. M < A-NP&&NP < A

数据:1,2,3,4
期待值:10

此项数据测试的是在某一项出现比0大的累加值且不出现比0小的负累加值时的输出。

  1. M < A-NP&&NP >= A

数据:-4,1,2,3
期待值:6

证明程序无错。
此项数据测试的是在某一项出现比0大的累加值时且出现比0小的最小累加值时的输出。

  1. M >= A-NP&&NP < A

数据:0,0,0,1
期待值:1

程序无错
此项数据测试在不出现比max=0还大的累加值又不出现比0小的负累加值时的输出。

  1. M >= A-NP&&NP >= A

数据:-1,-2,-3,-4
期待值:0

程序无错。
此项数据测试在不出现比max=0还大的累加值且出现比0小的负累加值时的输出。

试用PSP2.1

总结

这次依旧是对Junit的试用与熟悉,与上次作业时相比,这次尝试用了条件组合覆盖的标准,在设计测试数据的时候力争将各种可能的条件组合都覆盖,这是以往编程都不曾用过的全新的测试方法。虽然在AS上,Junit的测试还存在很多局限性,如一些控件和功能无法用数值的方法进行测试。但今后我会继续学习测试方法,优化代码,以求提高编程效率。

思路改进

其实想到了可以用两种或多种(如暴力法,分治法,动态规划等)方法生成测试数据来互相进行单元测试验证结果,由于时间问题暂时搁置,以后有时间会来填这个坑。

posted @ 2018-03-24 18:30  秦川德利齐  阅读(451)  评论(1编辑  收藏  举报