最大子段和问题实践报告

  1. 实践题目名称
  2. 问题描述
  3. 算法描述
  4. 算法时间及空间复杂度分析(要有分析过程)
  5. 心得体会(对本次实践收获及疑惑进行总结)

 

1.实践题目名称

PTA 最大子段和问题

 

2.问题描述

给定K个整数序列,求所有连续子列元素的和的最大。

input 

6
-2 11 -4 13 -5 -2 

output

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上侥幸地过了,但其实是不对的。

所以我觉得,有时候测试或者调试的时候,要多想一想各种情况,看看我的程序是不是每种情况都包括了,这样子才更加全面,不会出问题。

 

posted @ 2020-10-03 22:52  伍昕童  阅读(298)  评论(0编辑  收藏  举报