子列和列_最大子列和的四种算法总结
最大子列和问题描述:
给定一串整数列中,求满足子列和最大,并返回最大值。例如(2, -1, 6, 8, -5, 7, -11),其中的满足和最大的子列为(2, -1, 6, 8, -5, 7),最大值为17。
算法一
最蠢的方法是枚举法,把所有的子列都跑一遍。
int max_len(int a[], int N){
int i, j, k, thisSum, maxSum = 0;
for(i=0; i
for(j=i; j
thisSum = 0;
for(k=i; k<=j; k++)
thisSum += a[k];
if(thisSum > maxSum)
maxSum = thisSum;
}
}
return maxSum;
}
复杂度为O(n^3),效率很低。
算法二
算法一中对j的循环是每次自加1,此时i是不变的,而k循环的作用是累加从i到j的子列长度,可见虽然每次只需要再计算一个int值,但是k循环依然从最开始累加,没有必要,所以k循环这里可以优化。
int max_len(int a[], int N){
int i, j, k, thisSum, maxSum = 0;
for(i=0; i
thisSum = 0;
for(j=i; j
thisSum += a[j]; //优化
if(thisSum > maxSum)
maxSum = thisSum;
}
}
return maxSum;
}
也就是每次j移动的时候就判断大小,复杂度为O(n^2)。
算法三
当算法复杂度为O(n^2)时,我们总想通过分治法等方法将复杂度降为O(nlogn),但是这里分治法需要注意的是,并不是所有子问题的解合并就是最后的解了,由于子列可能存在从左边的子问题跨到右边子问题的情况,如下图:
这时候在递归的同时还要加上一层从中间开始向两边延伸的判断并赋值语句。
int max_len(int a[], int left, int right){
int center, i, j, sum, left_sum, right_sum, s1, s2, lefts, rights;
if(left == right){
if(a[left] > 0)
return a[left];
else
return 0;
} else {
center = (left + right) / 2;
left_sum = max_len(a, left, center);
right_sum = max_len(a, center + 1, right);
s1 = 0;
lefts = 0;
for(i=center; i>=left; i--){
lefts += a[i];
if(lefts > s1) s1 = lefts;
}
s2 = 0;
rights = 0;
for(j=center+1; j<=right; j++){
rights += a[j];
if(rights > s2) s2 = rights;
}
if(s1+s2 < left_sum && right_sum
if(s1+s2 < right_sum && left_sum < right_sum) return right_sum;
return s1+s2;
}
}
else中的两个for循环是从中间开始,找出两边各自的最大值,然后相加,得出横跨的最大值, 并与左右两边子问题的最大值进行比较。注意一定是从中间开始。
该算法的复杂度为O(nlogn)。
算法四
在线处理算法:
int max_len(int a[], int N){
int i, thisSum = 0, maxSum = 0;
for(i=0; i
thisSum += a[i];
if(thisSum > maxSum)
maxSum = thisSum;
else if(thisSum < 0) //当前的子列和为负数,无论后面是什么,负数与其相加肯定不能使子列和增大
thisSum = 0; //所以抛弃它,重新计算下一个子列和
}
return maxSum;
}
该算法不容易理解,但是确是效率最高的,复杂度为O(n),因为至少要遍历所有的元素,所以这已经是效率最高的算法了。
子列和列_最大子列和的四种算法总结相关推荐
- 子列和列_最大子列和 - fanlinglong - 博客园
最大连续子序列和问题 给定k个整数的序列{N1,N2,...,Nk },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= k.最 ...
- mysql什么隔离级别最好_面试必问的 Mysql 四种隔离级别,看完吊打面试官
什么是事务 事务是应用程序中一系列严密的操做,全部操做必须成功完成,不然在每一个操做中所做的全部更改都会被撤消.也就是事务具备原子性,一个事务中的一系列的操做要么所有成功,要么一个都不作.sql 事务 ...
- # 遍历结构体_关于二叉树怎样建立和四种遍历方法你知道吗?
1. 首先我们要知道二叉树的性质是什么2. 怎样建立二叉搜索树?3. 先序遍历4. 中序遍历5. 后序遍历6. 总结上述三种遍历规律7. 层序遍历 1. 首先我们要知道二叉树的性质是什么 在二叉树上, ...
- java indexof 子字符串_Java中字符串中子串的查找共有四种方法(indexof())
Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现的指定子字符串在此 ...
- mysql 按两列排序吗_按两列排序MySQL表
噜噜哒 这可能有助于某人正在寻找通过两列排序表的方法,但是以相似的方式.这意味着使用聚合排序功能组合两种排序.例如,在使用全文搜索检索文章以及文章发布日期时,它非常有用.这只是一个例子,但是如果你理解 ...
- mysql列别名引用_引用聚合列的MySQL别名
继续我的问题 summarizing-two-conditions-on-the-same-sql-table,我添加了一个RATIO列,它只是一个SUM(-)列除以第二个SUM(-)列: SELEC ...
- 行存储索引改换成列存储索引_如何使用列存储索引来改善数据仓库登台环境
行存储索引改换成列存储索引 My team and I were recently tasked with refactoring older data marts, particularly tho ...
- 五大列级庄_什么是“列级庄”
作为中国一家列级酒庄的品牌运营,上一篇文章跟大家分享了中国的列级庄,今天我和大家分享列级庄的来源以及更多葡萄酒酒庄的等级制度. 列级庄来源的故事: 1855年,巴黎举行了世界博览会.当时,法国国王拿破 ...
- 五大列级庄_法国波尔多列级名庄之五级庄介绍
对于法国波尔多的列级名庄,大家最熟悉的可能是一级庄,但对五级庄可能却不是特别了解.下面就来介绍一下法国波尔多的五级名庄. 五级庄介绍 1.庞特卡奈古堡红葡萄酒 庞特卡奈古堡(Chateau Ponte ...
- 五大列级庄_什么是列级酒庄
展开全部 列级酒庄就是在分级体系中占有一席之地的酒庄,法国各地都有不同62616964757a686964616fe58685e5aeb931333330343139的分级体系,所以列级名庄也就非常之 ...
最新文章
- Spring Boot配置视图解析器
- javascript数据结构-介绍
- C# 读写excel 用于导入数据库 批量导入导出excel
- 【Tools】Visual Studio 2010下载和安装
- 华为轮值董事长徐直军:5G不是原子弹 不伤害人
- 《如何搭建小微企业风控模型》第九节 单变量分析(上)节选
- 两台windows笔记本创建家庭组实现文件共享
- Citrix XenServer
- catia 创成钣金设计_应用Inventor进行钣金设计
- koa2异常处理_【HAVENT原创】KOA2 异常处理
- 简单三步搭建电影网站 :安装MacCMS10 1-3
- pcode.linq
- 毕业设计(论文)的内容要求和参考格式
- 英语版今日头条到底有多不靠谱?
- 解锁iPhone密码锁?
- Elasticsearch:在搜索引擎中如何实现完全匹配(内容精确匹配)查询
- ec20 复位命令_Quectel EC20 R2.1 AT指令集(基础部分)未完
- 可怕!只因写了一段爬虫代码,全公司200人被警察一锅端!
- php 上标,html页面如何显示上标和下标
- 7-2 长度质量计量单位换算(分数 5)