软件工程(2018)第三次作业

最大连续子数组和

一.问题描述

给定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。
引用自《百度百科》

二.问题分析

已知一个sum数组,sum[i]表示第1个数到第i个数的和,于是sum[j] - sum[i-1]表示第i个数到第j个数的和。那么,以m为起点,n为终点最大子序列和为sum[n] - sum[m-1]。并且,sum[m]必然是sum[1],sum[2]...sum[n-1]中的最小值!如果在维护计算sum数组的时候,同时维护之前的最小值,答案就会迎刃而解。
程序代码:https://github.com/ZhangydA/CodeCollection

public class ContinuousMaximum {
    public int continuousMaxinum(int arr[]){
        int counter = 0;
        for (int i = 0;i < arr.length;i ++){
            if (arr[i] < 0) counter ++;
        }
        //如果所有的值都为负值,返回0
        if (counter == arr.length) return 0;
        int sum = 0,ans = Integer.MIN_VALUE,mins = 0;
        for (int i = 0;i < arr.length;i ++){
            sum += arr[i];
            if (sum - mins > ans)
                ans = sum - mins;
            if (mins > sum)
                mins = sum;
        }
        return ans;
    }
}

测试类方法

import java.util.Scanner;

public class Test {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[] arr = new int[n];
        for (int i = 0;i < n;i ++){
            arr[i] = input.nextInt();
        }
        System.out.println(new ContinuousMaximum().continuousMaxinum(arr));
        input.close();
    }
}

三.逻辑覆盖方法的比较

  1.语句覆盖:语句覆盖是最起码的结构覆盖要求,语句覆盖要求设计足够多的测试用例,使得程序中每条语句至少被执行一次。
  2.判定覆盖:判定覆盖又称为分支覆盖,它要求设计足够多的测试用例,使得程序中每个判定至少有一次为真值,有一次为假值。
  3.条件覆盖:条件覆盖要求设计足够多的测试用例,使得判定中的每个条件获得各种可能的结果,即每个条件至少有一次为真值,有一次为假值。
  4.条件/判定覆盖:设计足够多的测试用例,使得判定中每个条件的所有可能结果至少出现一次,每个判定本身所有可能结果也至少出现一次。
  5.组合覆盖:要求设计足够多的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。 覆盖方法的优缺点及比较

四.组合覆盖

1.程序流程图

图片名称

2.选择分析测试样例及运行结果

通过流程图我们可知,组合覆盖一共有5中情况,分别是 B、ACE、ACF、ADE、ADF,经过了多次分析,选择了{-1,-2,-3,-4,-5}和{-2,5,-6,3,4}两组数据进行分析组合覆盖。
第一组测试样例:
样例运行结果
图片名称
第二组测试样例:
(1).样例运行结果
图片名称
(2).数据路径覆盖分析

数值summinsanssum - mins > ansmins > sum覆盖路径
-2-2-oo0YYACE
53-2-2YNACF
-6-35-2NYADE
305-3NNADF
445- 3YNACF

由上表可知,该组样例包含了ACE、ACF、ADE、ADF这四种情况,结合上述两组样例,覆盖了所有的情况,并且运行的结果与预期的结果一致。

3.JUnit自动测试

为了进一步的确任程序的正确性,接下来通过JUnit对多组数据进行自动测试,JUnit之参数化测试和成组测试的使用查看 这篇文章
(1).JUnit自动测试类

package cn.sau.MaxSum;

import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class ContinuousMaximumAutoTest {
    
    private int excepted;
    private int[] array;
    public ContinuousMaximumAutoTest(int excepted,int[] array){
        this.excepted = excepted;
        this.array = array;
    }
    /** 
     * 3.由@Parameterized.Parameters修饰一个 
     * public static Collection xxx() 
     */ 
    @Parameterized.Parameters  
    public static Collection data() { 
        return Arrays.asList(new Object[][] {  
            { 20, new int[]{-2,11,-4,13,-5,-2}},  
            { 7, new int[]{-2,5,-6,3,4}},//  
            { 0,  new int[]{-1,-2,-3,-4,-5}},  
            { 12,  new int[]{-1,6,-7,3,4,5,-6}}  
        });  
    }  
    @Test
    public void test() {
        assertEquals(excepted,new ContinuousMaximum().continuousMaxinum(array));
    }
}

(2).测试类运行结果
1345533-20180327215016633-1174542220.png

五.总结

经过本次的作业,让我受益最大的有两点,第一点是学会了自己选择测试样例对自己的程序进行测试,第二点是学会了多组样例同时针对一个函数进行检测

转载于:https://www.cnblogs.com/ZhangyiA/p/8650693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值