以最大连续和为例的算法分析
来源:互联网 发布:高新区行知小学好不好 编辑:程序博客网 时间:2024/05/17 08:39
学习刘汝佳老师的《算法竞赛》总结
最大连续和问题
给出一个长度为n的序列A
一.使用枚举,程序如下:
tot = 0; best = A[1]; //初始最大值 for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) { //检查连续子序列A[i],……,A[j] int sum = 0; for (int k = i; k <= j; k++) { sum += A[k]; //累加元素和 tot++; } if (sum > best) best = sum; //更新最大值 }
设输入规模为n时,加法操作的次数为T(n),则
用一个记号来表示:T(n)=O(n
二.下面试着优化一下这个算法。
设S
S[0] = 0; for (int i = 1; i <= n; i++) S[i] = S[i - 1] + A[i]; //递推前缀和S for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) best = max(best, S[j] - S[i - 1]); //更新最大值
类似的方法可以分析出:
时间复杂度是O(n
三.分治法
分治算法一般分为以下三个步骤:
划分问题:把问题的实例划分为子问题;
递归求解:递归解决子问题;
合并问题:合并子问题的解得到原问题的解。
在本例中,”划分“就是把序列尽量分成元素个数相等的两半;”递归求解“就是分别求出完全位于左半和完全位于右半的最佳序列;”合并“就是求出起点位于左半,终点位于右半的最大连续和序列,并和子问题的最优解比较。
int maxsum(int *A, int x, int y) { //返回数组在左闭右开区间[x,y)中的最大连续和 int V, L, R, maxs; if (y - x == 1) return A[x]; int m = x + (y - x) / 2; //分治第一步:划分成[x,m)和[m,y) maxs = max(maxsum(A, x, m), maxsum(A, m, y)); //分治第二步:递归求解 V = 0; L = A[m - 1]; //分治第三步:合并(1)——从分界点开始往左的最大连续和L for (int i = m - 1; i >= x; i--) L = max(L, V += A[i]); V = 0; R = A[m]; //分治第三步:合并(2)——从分界点开始往右的最大连续和R for (int i = m; i <= y; i++) R = max(R, V += A[i]); return max(maxs, L + R); //把子问题的解与L + R比较}
递归方程T(n)=2T(n/2)+O(n),T(1)=1,解为T(n)=O(n log n).
四.算法分析结果
表-运算量随着规模的变化
借鉴此表,在算法竞赛中,一个指明n
阅读全文
0 0
- 以最大连续和为例的算法分析
- 【编程珠玑-读书笔记】算法设计技术—以求解"最大连续子序列和"为例
- 算法竞赛中的时间复杂度选择——以最大连续和问题为例
- 最大连续和算法分析
- 高效算法设计_算法分析初步(最大连续和)
- 最大连续区间和的算法总结
- 六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)
- 六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)
- [数据结构与算法分析] 求连续子数组的最大和问题
- 算法分析——最大连续子序列和的问题
- 最大连续区间和算法、
- 【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现
- [模板]最大流(Edmonds_Karp/Dinic算法(以poj1273为例
- 连续子序列最大和问题的分析
- 连续子序列最大和问题的分析
- [算法]求数列最大连续数和的问题
- 求最大连续子段和 的 dp算法
- 连续子序列最大和的各种算法
- java-Collection(List、Set)
- 获取当前手机App版本以及AppStore中的最新版本,判断是否需要更新
- 在没有个人/公司网站的情况下,如何利用同一个二维码自动识别手机系统(Android/IOS)跳转不同下载页面
- IIS连接数据库:数据库连接出错,请检查连接字串
- 知识图谱相关介绍
- 以最大连续和为例的算法分析
- 微信开放平台修改微信分享的应用小图标与应用名称,应用名称更改了应用小图标未更改的问题
- Java循环
- POJ3264 Balanced Lineup(线段树,区间最值)
- 自定义变量不能用怎么办,将文件中的数据直接读取到普通变量中
- 如何在React中做Ajax 请求?
- 小白学习日记1:PL/SQL连接本地Oracle数据库Part2
- [Azure]ARM虚拟机整机磁盘快照[1]——创建快照
- jboss domain配置