数组中最大的子数组之和
一、程序分析
1、题目要求
- 从文件中读取内容作为数组数据
- 输出这个数组的最大联通子数组
- 给出单元测试、代码覆盖率等报告
2、代码实现
def read_file(file_path,ResultLst):
data=""
with open(file_path,encoding="utf-8") as f:
data = [line.strip('\n') for line in f.readlines()]
# print(data)
row=int(data[0])
axis=int(data[1])
for i in range(2,len(data)):
lst=data[i].split(',')
# print('aaa',lst[0])
lst2=lst[0].split(',')
# print('bbb',lst2)
for j in range(2,len(lst2)):
lst2[j]=int(lst2[j])
ResultLst.append(lst2)
print('ResultLst:',ResultLst)
return row,axis
def row_max(ResultLst,row,axis,k):
row_maxsum=-9999
begin=0
end=0
for i in range(axis):
row_sum=0
for j in range(i,axis):
row_sum+=int(ResultLst[k][j])
if row_sum>row_maxsum:
row_maxsum=row_sum
begin=i
end=j
print('第',k+1,'行最大值')
print(row_maxsum)
print(begin)
print(end)
print('------------------')
return row_maxsum,begin,end
def max_total(Beign_lst,End_lst,Max_lst):
max=Max_lst[0]
for i in range(len(Beign_lst)-1):
print("len:",len(Beign_lst)-1)
print("i:", i)
if (Begin_lst[i]>End_lst[i+1]) or (End_lst[i]<Begin_lst[i+1]):
if Beign_lst[i]>End_lst[i+1]:
t=Beign_lst[i]-End_lst[i+1]
s=Beign_lst[i]
temp=0
for k in range(t):
temp+=int(ResultLst[i+1][s-k])
if temp+Max_lst[i+1]>0:
max+=temp+Max_lst[i+1]
if End_lst[i]<Beign_lst[i+1]:
print(End_lst[i],Beign_lst[i+1])
t=Beign_lst[i+1]-End_lst[i]
s=End_lst[i]
temp=0
for k in range(t-1):
temp+=min(int(ResultLst[i][End_lst[i]+1+k]),int(ResultLst[i+1][End_lst[i]]))
if temp+Max_lst[i+1]>0:
max+=temp+Max_lst[i+1]
kind=End_lst[i]-Beign_lst[i+1]
else:
max+=Max_lst[i+1]
print("process_MAXLST:",Max_lst[i])
print("process_MAX:",max)
print('resultMAX:',max)
return max
# max=0
def main(file_path,row_maxsum,begin,end):
ResultLst = []
Max_lst=[]
Begin_lst=[]
End_lst=[]
row,axis=read_file(file_path,ResultLst)
for i in range(row):
print("i.this:",i)
row_maxsum,begin,end=row_max(ResultLst,row,axis,i)
Max_lst.append(row_maxsum)
Begin_lst.append(begin)
End_lst.append(end)
print('Max_lst:',Max_lst)
print('Begin_lst:',Begin_lst)
print('End_lst:',End_lst)
return Begin_lst,End_lst,Max_lst
if __name__=="__main__":
file_path = 'C:/Users/Sun Tianwen/Desktop/data.txt'
Begin_lst = []
End_lst=[]
Max_lst=[]
row_maxsum = 0
begin = 0
end = 0
Begin_lst,End_lst,Max_lst=main(file_path,row_maxsum,begin,end)
max_total(Begin_lst, End_lst, Max_lst)
3、运行结果
二、单元测试
使用unittest进行单元测试
1、测试代码
import unittest import max_array2 as m class MyTestCase(unittest.TestCase): def test1(self): row_maxsum = 0 begin = 0 end = 0
file_path='C:/Users/Sun Tianwen/Desktop/TestCase1.txt' Begin_lst, End_lst, Max_lst = m.main(file_path,row_maxsum, begin, end) result=m.max_total(Begin_lst, End_lst, Max_lst) self.assertEqual(result, 31) def test2(self): row_maxsum = 0 begin = 0 end = 0
file_path='C:/Users/Sun Tianwen/Desktop/TestCase2.txt' Begin_lst, End_lst, Max_lst = m.main(file_path,row_maxsum, begin, end) result = m.max_total(Begin_lst, End_lst, Max_lst) self.assertEqual(result, 60) if __name__ == '__main__': unittest.main()
2、测试结果

三、代码覆盖率
1、安装coverage
pip install coverage
2、运行.py程序
在cmd命令提示符中输入
coverage run max_array2.py
如图所示

然后再输入coverage report

最后一列就是覆盖情况,可以看到总覆盖率只有79%。
接下来执行
coverage html
生成htmlcov文件夹,

打开文件夹

打开max_array2.html文件


红色标识的部分就是未被执行的代码。
四、效能分析
使用pycharm的profile进行效能分析,得到结果如图


浙公网安备 33010602011771号