[C++]四种方式求解最大子序列求和问题
来源:互联网 发布:上海希而科 知乎 编辑:程序博客网 时间:2024/06/06 03:26
问题
给定整数:
求
例如
对于输入:-2,11,-4,13,-5,-2,答案为20,即从
分析
这个问题之所以有意思,是因为存在很多求解它的算法。
解法一:穷举遍历
老老实实的穷举出所有的可能,代码如下:
这是大多数人都会想到的方法:把所有的可能都列举出来,然后再把子序列的所有值都加起来求和。
简单粗暴的解决了问题,而且还很好理解。
这种算法的时间复杂度为
解法二:穷举优化
其实第三个for循环完全没有必要,在第二层for循环的时候就计算求得的和并且继续带入下一轮的for循环即可:
这种算法的时间复杂度为
解法三:分而治之
分而治之,顾名思义分为两个部分
- 分:把大问题分成大致相等的两个子问题,然后递归的进行求解。
- 治:把两个子问题的解合并到一起并再做少量的附加工作。
在最大子序列和的问题里,最大子序列的和可能出现在三个地方:
- 整个出现在输入数据的左半部
- 整个输入数据的右半部
- 横跨左右两个部分
对于前两种可以递归求解,对于第三种,可以把左右两个部分的和分别求出,然后加在一起。
具体的代码如下:
这种算法的时间复杂度为
解法四:联机算法
先来解释一下联机算法的概念:
联机算法:在任意时刻,算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。具有这种特性的算法叫做联机算法(on-line algorithm)。
对于这个问题,代码如下:
这种算法的时间复杂度为
总结
下表是统计的四种算法的运算结果:
从表中可以看出,在数据量很小的时候(在它小时候=.=),算法在瞬间就完成了,差距也不是很明显。
但是随着输入量的增大,一些算法的弊端逐渐显现出来,效率低的甚至在有限的时间里算不出结果来。
对于很多高效的算法来说,读取数据往往是解决问题的瓶颈,
- [C++]四种方式求解最大子序列求和问题
- 最大子序列求和问题
- 最大子序列求和问题
- 最大子序列求和问题
- 最大子序列求和问题
- 最大子序列问题求解
- 最大连续子序列的四种求解方法
- 最大子序列的三种求解方式
- 最大子序列求和
- 最大子序列求和
- 最大子序列求和
- 最大子序列求和
- 最大子序列求和
- 最大子序列问题及其求解
- 最大子序列和问题的求解
- 最大子序列和问题的求解
- 最大子序列和问题求解
- 最大子序列和问题的求解
- MySQL学习笔记之十三 重定位数据库目录的内容
- openOffice服务html转PDF中文乱码问题
- IIS设置网站默认为兼容模式
- Python yield 生成器
- [算法入门经典] 8.1.3 分治法 求最大连续和
- [C++]四种方式求解最大子序列求和问题
- 8:正则表达式及stringbuffer
- GDI+在界面开发中遇到的问题汇总
- android中TextView控件介绍
- asp.net中Cookie的用法(转)
- 黑马程序员——网络编程的学习
- Slidingmenu
- 线程获取当前网速的方式
- 将stdin定向到文件