最大子段和问题实践报告
- 实践题目名称
- 问题描述
- 算法描述
- 算法时间及空间复杂度分析(要有分析过程)
- 心得体会(对本次实践收获及疑惑进行总结)
1.实践题目名称
PTA 最大子段和问题
2.问题描述
给定K个整数序列,求所有连续子列元素的和的最大。
input
6 -2 11 -4 13 -5 -2output
20各组测试数据特点如下:
- 数据1:与样例等价,测试基本正确性;
- 数据2:102个随机整数;
- 数据3:103个随机整数;
- 数据4:104个随机整数;
- 数据5:105个随机整数;
3.算法描述
分治法:
将序列分成两半,左半边和右半边。递归计算左段最大子段和leftmax,右段最大子段和rightmax。
S1为左边left至middle的最大和,从middle开始逐个往左累加,刷新最大和
S2为middle+1至right边界的最大和,从middle+1开始逐个往右累加,刷新最大和
S3为横跨左右两段的最大和。
最后比较S1 S2 S3 得出最大子段和。
4.算法时间及空间复杂度分析
- 穷举法---暴力拆解 三层循环 时间复杂度 O(n^3)
- 穷举法---改进 利用上一次的累加 时间复杂度 O(n^2)
- 分治法 计算左右两边的子段最大值再合并时间复杂度 O(nlogn)
分治法:拆分问题 把原规模为n的问题以middle为中心 拆分成两部分 T(n)= O(1)
求解子问题 从middle开始往left累加 得到最大和 时间为O(n) 右半边也是O(n)
合并子问题 T(n)= 2T(n/2)+ O(n)
T(n)= O(nlogn)
5.心得体会
对于这个问题,我们一开始只考虑到了一定穿过中间的情况,递归没调用到底层,导致 只在一边 例如【1 2 -3 -4 -5 -6】这种情况没考虑到
但是这道题的数据给的不好,全都是会穿过中间的数据,所以PTA上侥幸地过了,但其实是不对的。
所以我觉得,有时候测试或者调试的时候,要多想一想各种情况,看看我的程序是不是每种情况都包括了,这样子才更加全面,不会出问题。

浙公网安备 33010602011771号