算法导论:最大子序列和

算法导论:最大子序列和

问题描述:
什么是最大子序列和呢?
就是给定一组序列,所有子序列中和最大的那一组序列。
比如这里给出一组序列{-2,11,-4,13}


子序列

这里列出了10个子序列。


最大子序列和

其中20就是我们要求的最大子序列和。
关于最大子序列和有几个注意事项:
1. 空序列也是子序列,它的和为0;
2. 如果序列中所有整数均为负数,则最大子序列和为0;
3.子序列一定是连续的;

穷举法1

算法思想:穷举所有子序列,找最大的。

穷举法1

如上图所示,列出所有子序列,再找出其中最大的和,不过这其中会出现大量重复的计算,比如-2+11就计算了三遍,耗费大量时间,下面计算时间复杂度。
n个数序列

假如是有n个数的序列,那它会有多少个子序列呢?从1开始的子序列有n个,从2开始的子序列有n-1个,所以总共的子序列为:
总序列数

现在我们知道了总序列数,也就是序列的个数,那这些序列和的计算次数是多少?
计算次数

由1开始的子序列有n个,从{1,2}一直到{1,2····n-1,n},我们在计算这些序列和时,{1,2}相当于计算了1次,就是1+2。计算{1,2,3}时我们又计算了一次1+2,所以这次计算了2次,那由1开始的序列计算的次数就是1+2+····+n也就是图中所示的结果。2开始的序列的计算次数就是1+2···+n-1,以此类推求出所有序列的计算次数,最后得出总的计算次数。所以时间复杂度为O(n3)

穷举法2

算法思想:在某点开始的所有序列中找最大的,找最大的。

比如这里给出一组序列{-2,11,-4,13},首先计算由-2开始的所有子序列和,再找出其中最大的

穷举法2

可以看到这种方法避免了穷举法1中每次都要从头开始相加而造成的大量浪费,下面我们依次计算由11,-4,13开始的序列,找出最大子序列和。
穷举法2

在分别求出以-2,11,-4,13开始的最大子序列和后,再选择其中最大的那个,就是我们要找的最大子序列和。但是这其中依然包含了重复计算,如上图所示,计算由-2开始的序列时,我们计算了11+-4+13,在计算由11开始的序列时,也依然计算了11+-4+13,造成了重复计算。
那所有这些序列的总共计算次数是多少呢?
时间复杂度

在穷举法2中,由1开始的序列有n个,但因为避免了穷举法1中的重复计算,所以计算次数只有n次,总共的计算次数就是1+2+···+n次,所以时间复杂度是O(n2)。

分治法

分治法的设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

给出一个序列{a,b,c,d,e,f,g},显然最大子序列和只可能出现在三个地方:

1、输入序列的左半部分;
2、输入序列的右半部分;
3、跨越输入序列的中部而位于左右两个部分;

所以我们只需要分别找出这三个部分的最大子序列和,再比较这三个和的大小,找出最大的子序列和即可。

分治法

我们可以通过递归的方法找到左半部分最大子序列和lsum以及右半部分最大子序列和rsum。
分治法

找到跨越中部的最大子序列和,因为这个子序列和一定是跨越中部的,所以只需要确定好中部,然后使lmax以及rmax都为最大,那么csum就是我们要找的子序列。最后比较这三个子序列的大小,最大的和就是最大子序列和。这里使用的是分治法,分治法的时间复杂度为O(nlgn),详解请看分治法

动态规划法

分析:
1、因为最大子序列和的最小取值为0,所以最大子序列的第一个元素不会是负的。
若a[i]<0,则a[i]开头的序列,一定不如a[i+1]开头的序列大。
2、同理任何负的子序列,不可能作为最大子序列和的前缀。


动态规划法

这里的{4、-5}不能作为子序列的前缀。
3、如若一个子序列和thisSum>0(其中thisSum是从第m项到第n项的和),那么最大子序列和一定不会以a[m+1]和a[n]之间的项开始。


动态规划

这里{1、5、-3、2}这个序列和大于0,那么最大子序列和就不会是从5或者-3或者2开始的,因为由这些开始,加上前面的1会更大。
下面将用介绍具体的例子:
首先给出序列{-5、15、-2、13、-9、-1、9、-30、10、3}。
动态规划

用标记分别标出,子序列和的起始位置,最大子序列和起使以及终点位置,此时三个位置都在-5这里。并且记录下该时刻最大子序列和的值以及子序列和的值。
动态规划

当指针移动到15时,根据上面的第一条规则,最大子序列的第一个元素不为负数,所以此时三个标记都要移动到15,子序列的和为15,同时更新最大子序列的和15。


动态规划

当指针移动到-2时,更新此时的子序列和为13,发现13<15,所以最大子序列和依然是15,且起使、终点位置也不改变。
动态规划

当指针移动到13时,子序列和变为26>15,所以更新最大子序列和为26。并且最大子序列的终点位置也要发生变化。
动态规划

在指针移动过-9、-1、9、-30时子序列和的值都没有26打,所以最大子序列和并未更新,不过指针移动到-30时子序列和变为了-5,也就是{15、-2、13、-9、-1、9、-30}和为-5,根据规则2,这个序列一定不会是最大子序列的前缀。而且{15、-2、13、-9、-1、9}这个序列的和是大于0的,根据规则3,最大子序列和一定不会是从{-2、13、-9、-1、9}这里面的某一项开始的。所以最大子序列和不会是以{15、-2、13、-9、-1、9、-30}为前缀开始的,也不会是以{15、-2、13、-9、-1、9、-30}中的某一项开始的。那么当我们下一步,移动子序列起使位置的标记时,就可以跳过这里面所有的数,移动到-30后面的数。
动态规划

子序列和的起使位置变为了10,10<26,所以最大子序列和的值以及标记依然不发生变化。
动态规划

序列遍历完成后,可从记录中得知,最大子序列和为26,序列是{15、-2、13}。
在整个过程中,我们只用指针遍历了一遍序列,并且做了简单的记录,所以动态规划算法的时间复杂度是O(n)。

总结

穷举法1:
算法思想:穷举所有子序列,找最大的。
时间复杂度:O(n3)
缺点:包含大量重复计算。
穷举法2:
算法思想:在某点开始的所有子序列中,找最大的。
时间复杂度:O(n2)
缺点:同样包含重复计算。
分治法:
算法思想:利用可分解、递归的性质,采用分治策略。
时间复杂度:O(nlgn)
动态规划法:
算法思想:采用了动态规划的方法。
时间复杂度:O(n)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容