数组中最大子数组之和
一.编写程序
1.求数组中最大子数组之和
class max_out(object): def maxmarry(lis): dp = [lis[0]] i = 1 for num in lis[1:]: if dp[i - 1] <= 0: dp.append(num) else: dp.append(dp[i - 1] + num) i += 1 return(max(dp))
算法实现:创建一个新的数组,该数组有一个值为所求数组的第一个值,判断新建数组的值是否是小于等于0,是的就把所求数组的第二个值添加到新数组里,如果不是就将所求数组的第二个值加上新数组的值在添加到新数组里,循环此过程直到最后一个数,这样新数组里的最大值就是子数组最大值。
2.进一步,从文件读入数据,熟悉文件操作
with open(r'C:\Users\tbd\Desktop\新建文本文档.txt',encoding='utf8') as file_obj: content = file_obj.read() xlist=content.split(":") lis1=xlist[1].split(",") lis1 = [int(lis1[i]) for i in range(len(lis1))] ma=maxmarry(lis1) print(ma)
对文件的操作为:从文件获取数据,先用分号隔开分为两部分,再将后一部分用逗号隔开就可以得到包含数据的完整数组,在调用上面的函数就可以了。
二.单元测试
我采用Python提供相应的模块(unittest),单元测试:用于确定函数的某方面没有问题。编写测试用例的步骤:1.先导入unittest模块;2.创建一个类(任意名)3.编写需要测试的代码对函数进行各方面的测试。这里我们采用三组数据测试,其中有一种是错误的。
import unittest from ppp import * class Testppp(unittest.TestCase): def test_1(self): lis = [-21,1,1,1,1] self.assertEqual(maxmarry(lis),4) def test_2(self): lis = [-32,-10,33,-23,32,-12,41,-12,1,3,5,-98,70,-21,10,-9,61] self.assertEqual(maxmarry(lis),111) def test_3(self): lis = [-2,1,1] self.assertNotEqual(maxmarry(lis),1) if __name__ == '__main__': unittest.main()
测试结果:
通过测试结果可以看到我们的程序是正确的。
三.性能分析
运行cmd命令,输入python -m cProfile ppp.py
得到结果图: