zoukankan      html  css  js  c++  java
  • 软工 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的测试还存在很多局限性,如一些控件和功能无法用数值的方法进行测试。但今后我会继续学习测试方法,优化代码,以求提高编程效率。

    思路改进

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

  • 相关阅读:
    Sql server2008如何导入Excel文件数据?
    oracle和sql server中,取前10条数据语法的区别
    如何将两个字段合成一个字段显示(oracle和sqlserver的区别)
    php递归注意事项
    PHP实现执行定时任务
    商城怎么使用ajax?
    添加新权限管理
    PHP判断一个JSON对象是否含有某一个属性的方法
    centos 中查找文件、目录、内容
    phpStorm中如何不让其自动添加封闭大括号?
  • 原文地址:https://www.cnblogs.com/Mr-quin/p/8640753.html
Copyright © 2011-2022 走看看