软件工程第三次作业(最长子段和)


最大子段和的算法并进行条件组合覆盖测试

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


一、算法及流程图:

(1)、算法:

  此问题我利用动态规划来解决,将整个问题分解为逐个小问题来解决,思想是遍历一遍整个数组寻求多阶段决策过程的最优化问题。

时间复杂度:O(N)

(2)、流程图:


二、 代码部分

(1)、核心算法部分代码

	public static int Calu(int[] arr)
	{
		max=0;
		int n=arr.length;
		int dp[]=new int[100];
		dp[0]=arr[0];
		if(dp[0]>=0)
			max=dp[0];
		for(int i=1;i<n;i++){
			if(dp[i-1] > 0)
				dp[i]= dp[i-1] + arr[i];
			else
				dp[i]=arr[i];
			if(dp[i] > max)
				max=dp[i];
		}
		return max;
	}

(2)、实现判定条件覆盖测试

首先进行基本简单数值测试:

    @Test
    public void test1(){           //作业测试数据
        int arr[] = {-2,11,-4,13,-5,-2};
        int ans = 20;
        assertEquals(ans, new maximum().Calu(arr));
    }
	@Test
    public void test2(){           //全正数测试
		 int arr[] = {1,2,3,4};
	        int ans = 10;
        assertEquals(ans, new maximum().Calu(arr));
    }
	@Test
    public void test3(){           //全负数测试
		 int arr[] = {-1,-32,-2,-8,-7};
	        int ans = 0;
        assertEquals(ans, new maximum().Calu(arr));
    }


测试成功。

何谓条件条件组合覆盖?

条件组合覆盖:选择足够的测试用例,使得每个判定中条件结果的所有可能组合至少出现一次。

为解释说明,下面贴上一张网上的参考图片:

参考图片来源

因此,对于AB,CD两组条件,我们将有2*2=4种条件组合,因此我们设立能覆盖4种条件组合的用例。

    @Test
    public void test4(){           //覆盖测试
		 int arr[] = {7,0,6,-1,1,-6,7,-5};
	        int ans = 14;
        assertEquals(ans, new maximum().Calu(arr));
    }

测试成功。


三、总结:

1、本次作业让我更加熟悉了coding等git代码网站的使用。

2、良好的算法带来的运算效率是关键的,是我们程序员需要研究的。

3、个人而言编代码的时间远小于为写博客,到处找资料去佐证,去研究条件组合覆盖的时间。


四、代码

代码已经上传至Coding

posted @ 2018-03-29 22:04  heshengyuan1311  阅读(248)  评论(0编辑  收藏  举报
levels of contents