软件工程——个人作业(3)

一、题目要求
1、在这部分里,我选择了题目(1)——最大连续子数组和(最大子段和)
2、题目具体要求如下:

    给定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。

二、题目分析
  “最大连续子数组和”的问题是一道经典的动态规划问题。在这里,通过比较多种实现算法,我使用了Kadane算法来进行实现,它只扫描了一遍数组,时间复杂度为O(n)。
三、源代码编程
1、本人采用python语言,用文本编辑器Geany进行编写。
2、具体代码如下:

def max_subbarry(arr):
    t=1
    if len(arr)==0:
        return 0
    else:
        max_ending = max_sofar = arr[0]
        for i in arr[1:]:
            if i<0:
                t=t+1
            max_ending = max(i,max_ending + i)
            max_sofar = max(max_ending,max_sofar)
        if t==len(arr):
            return 0
        else:
            return max_sofar

3、代码已提交到coding.net中去,详情请见:
https://dev.tencent.com/u/wang_chengcheng/p/zuidalianxuzishuzuhe/git/tree/master
四、源代码流程图

五、设计测试用例
1、在这部分中,我选择了判定/条件覆盖,对满足代码的各种执行路径都进行了测试。具体判定/条件覆盖路径如下:
   ①arr==NULL or ②arr!=NULL
   ③t=len(arr) or ④t!=len(arr)
2、具体测试用例如下:

  • arr0 = []
  • ②③arr1 = [-3,-8,-2,-10]
  • ②④arr2 = [-2,11,-4,13,-5,-2]
  • ②④arr3 = [1,2,7,-1,9]
    六、测试分析代码
import unittest
from wcc import max_subbarry

arr0 = []
arr1 = [-3,-8,-2,-10]
arr2 = [-2,11,-4,13,-5,-2]
arr3 = [1,2,7,-1,9]

class TestMax_subbarry(unittest.TestCase):
    """测试wcc.py"""
    def test_max_subbarry(self):
        maxx = max_subbarry(arr0)
        self.assertEqual(0,maxx)
    def test_max_subbarry1(self):
        maxx = max_subbarry(arr1)
        self.assertEqual(0,maxx)
    def test_max_subbarry2(self):
        maxx = max_subbarry(arr2)
        self.assertEqual(20,maxx)
    def test_max_subbarry3(self):
        maxx = max_subbarry(arr3)
        self.assertEqual(18,maxx)
   
unittest.main()

七、测试分析运行结果

八、总结
  通过这次作业,自己对于动态规划有了更深的理解,对于单元测试的运用也更加熟练。在这次作业过程中,自己也出现了一些问题,主要就是对于动态规划不是很熟练,还是希望以后能够加强对于算法的学习。

posted @ 2019-04-19 21:55  wangchengcheng  阅读(174)  评论(0)    收藏  举报