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

    思路改进

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

  • 相关阅读:
    机器学习与深度学习资料
    JVM调优实战
    Spark on Yarn下JVM的OOM问题及解决方式
    Centos环境下部署游戏服务器-简介
    新华网,要厚道
    物联网操作系统在运营商领域推广的理论分析
    Android基础之Activity launchMode详解
    《高效程序员的修炼》读后感
    Java科普之算法剖析
    Java科普之基础知识回顾
  • 原文地址:https://www.cnblogs.com/Mr-quin/p/8640753.html
Copyright © 2020-2023  润新知