软件工程第三次作业(最长子段和)
最大子段和的算法并进行条件组合覆盖测试
给定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