算法第二章上机实践报告
实践题目:最大子列和问题
问题描述:
最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下
- 数据1:与样例等价,测试基本正确性;
- 数据2:102个随机整数;
- 数据3:103个随机整数;
- 数据4:104个随机整数;
- 数据5:105个随机整数;
对于题目给出的无序序列找到对应的子列之和最大的那一段的和输出。
算法描述:
刚开始看到这道题目其实没有太大的思路,听了老师讲解的算法的思想,才有一种恍然大悟的感觉。采用分治的思想,把问题的规模缩小。把给定的序列二分,分别在左右找到对应的最大子列和,然后再跨越左右子列找到最大的和,然后再对三者进行比较,所求的的最大值就是结果。
算法的时间及空间复杂度:
这个算法的时间复杂度是O(nlogn),T(n)=2*T(n/2)+O(n)根据主定理得出最终结果是O(nlogn)。T(n/2)是将问题分成左右两边两个一样的问题,得到左右两边的递归结果,规模变成n/2。O(n)是得到跨边界最大子列和,左右扫描,每一个数都被扫描了一次,所以时间复杂度是O(n)
空间复杂度O(1),因为用到了一个确定的数组。
心得体会:
这次上机实践给我最大的体会就是算法传递的是一种思想,而我现在处于一种不太能够把思想的东西转化为自己的东西的状态。以前的上机课,老师会把代码大概的敲一遍,所以就会产生了依赖心理。这次老师没有把代码给出来,而只是说了一个思想。虽然我当时理解了这种思想,但是却很难把这种思想用代码体现,感觉自己的的能力还是不够。在结对敲代码的过程中,经过我们的讨论,和老师的讲解,明白了大概的思路。但是在如何去实现的过程中,都有一些阻碍。在这道题目中,寻找到左右序列的最大子段和比较简单,但是跨越左右子段和在之前好像没有接触过,所以会很恐慌。但最后一步一步敲出来其实也是很简单的代码。
所以希望自己以后能够对算法的思想有更深的理解,把思想和代码转化的能力再多多提高,在遇到新的问题的时候能够不要太慌张。