1.3 最大子列和问题

在第一讲里面陈越老师解决这个问题使用的是暴力的方式
首先是O(n^3)的三重循环


image.png

而这个方法在i的每次循环体中,作为子列元素下标的k都要从i开始加到j,而j在每次循环中也是从i到n,会有很多部分被重复计算,所以有以下优化,算法复杂度降低到O(n^2)


image.png

这个算法去掉了最内层循环,对于相同左端位置的子列只在右端更新时进行max的判断

当然这个算法中还是有很多重复运算的部分,对于O(n^2)的问题我们可以优化为O(nlogn)的复杂度的算法

下面从暴力跨越到了分治法

image.png

这个问题的思想就是把问题一分为二,二分为四,最后再合并,比较得出左边最大的子序列和、右边最大的子序列和、和跨越中线的最大子序列和中的最大值,作为问题的解,这个手段是一直递归到一个元素的
问题的解决流程就是先将子列划分到(4)、(-3)、(5)、(-2)这种程度,就像图片中黄线标记出的,然后对于(4)这个子列的最大子列和就是4,(-3)是-3,跨越中线的子列为(4,-3),其和为1,所以这次得到的最大子列和为4。同理,求得(5)、(-2)这边的最大子列和为5。然后往上层走,(4,-3)的为4,(5,-2)的为5,跨越这个中线(就是中间的红线的)求法就是从中间向两边拓展(因为所求的就是跨越中线的),来求两边各自的最大子列和,就是顺序累加然后使用一个变量维护累加的最大值,每次的复杂度显然是O(n),所以拓展的结果左边是1右边是5,最后跨越中线的就是6了,合并的结果取4、5、6中的最大值6。后面的解法就类似了。

时间复杂度分析如下


image.png

嗯,最后还有一个最快的


image.png

之所以叫做在线处理是因为它是一个一个往前读的,用户每输入一个数值都可以给出当前子列和的最大值,而不用等待全部子列都录入之后才能求得。这里更新子列左端点的依据就是现有的子列和为负值,不能再使新加入成员之后的子列和更大了,于是就抛弃掉了。

最后是算法时间的比较


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 定义:给定个整数的序列 ,求函数 的最大值(若最大子列和为负数,则返回0)。 算法1——int MaxSubSeq...
    小能猫吃牙膏阅读 986评论 0 2
  • 算法和数据结构 [TOC] 算法 函数的增长 渐近记号 用来描述算法渐近运行时间的记号,根据定义域为自然数集$N=...
    wxainn阅读 1,226评论 0 0
  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 914评论 0 3
  • 初次见到阿盟是在我们学校的咖啡厅。如果不是因为要邀请阿盟作为我们下期读书会的分享嘉宾,我想,等我毕业了我们也不会有...
    遇见初心姑娘阅读 589评论 4 5
  • 01 前日一向以“花式夸人”著称的《中国电影报道》官方微博第一次点名批评了一支青年演员团队,并强调:双方要互相尊重...
    小清果阅读 351评论 0 0

友情链接更多精彩内容