434
社区成员
发帖
与我相关
我的任务
分享
如图,我们可以创建一个数组, 并用该数字用于输入数据和储存最大子段和. 首先将最大子段和设为零, 在输入的同时将最大子段和和当前子段和进行比较和更新, 当下标 = 0时, 最大子段和要么为arr[0], 要么= 0; 当下标大于0时, 就可以通过判断前一位数(即上一位为止的子段和)是否大于0, 若大于零则更新当前的子段和, 再通过与最大子段和比较, 判断是否更新最大子段和.
如图可知, 当有n个数时, 循环次数为n;
T(n) = O(n);
在本章的课程中, 我学习了递归与分治策略, 所谓递归就是直接或间接调用自身的算法, 在算法设计中是一种十分普遍且易懂的算法, 适用于实现一些具有递归特性的问题, 对于某些问题, 即使没有递归特性, 但是如果具有某些规律的话, 也可以酌情考虑使用递归函数。而分治策略恰好又能与递归进行配合, 往往这两者经常同时出现. 所谓分治策略, 就是将规模为n的一个问题分解为k个规模较小的子问题, 这些子问题相互独立, 解题思想又与原题相同. 在这种情况下, 使用递归算法往往能巧妙地解决问题. 可以说, 递归算法和分支策略是相辅相成的.
事实上, 即使递归算法较为易懂, 设计起来也更加方便, 但是其本身的时间复杂度与空间复杂度并不理想, 在解决规模较小的问题时使用效果较好, 问题规模较大时, 迭代会是更好的选择. 使用递归时, 最重要的一点是判断边界条件, 即在什么时候结束递归, 完成了这一点, 递归算法也就完成了一半了. 在本章中, 二分法常常搭配递归和分治进行使用,使用二分法时, 问题的时间复杂度往往可以降低到logn或者nlogn. 在二分法的使用过程中, 如何划分左边界和右边界在不同的问题中有不同的设计, 需要结合具体问题进行时用. 除此之外, 递归与分治算法还在其他问题中有所提现, 诸如归并排序, 快速排序等等. 结合递归思想去理解这些算法的实现过程是比较高效的.