最大子序列和问题的解(共4种,层层推进)

【0】README

0.1) source code and text description are from data structure and alg analysis ;
0.2) there are 4 methods solving maximum sum of subsequence, but the fourth proves to be the best one , the 3rd deserves learning for ‘Divide and Conquer’;
0.3) what’s the maximum sum of subsequence ?
这里写图片描述


Method1)尝试穷举所有可能情况:

源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/chapter2/p18.c
这里写图片描述

我们由内到外分析上述算法的时间复杂度(Analysis):

  • A1)最内层循环
    这里写图片描述
  • A2)中间层循环
    这里写图片描述
  • A3)最外层循环
    这里写图片描述
    代码演示分析步骤:
    这里写图片描述

算法描述(Description):

  • D1)显然 i, j 分别作为小数组(我暂且这么叫)的下上限(这个上下限通过两个for循环来实现),然后指针k在里面滑动,计算累加和;
  • D2)显然算法的最内层循环过分地耗时了。因为之前算了的, 我还要重新算一次。如第一步要计算 A[2] ~ A[5] 的累加和,我第二步还要算 A[2]~A[6] 的累加和,所以说第二步是重复了第一步的大多数工作,因为A[2] ~ A[5]的累加和在第一步已经算过了;

Method2)我们撤除一个for循环来避免立方运行时间:

源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/chapter2/p19.c
这里写图片描述
时间复杂度分析
这里写图片描述
代码演示分析步骤:
这里写图片描述
算法描述(Description):

  • D1)显然 i 作为小数组的上限,下限始终是末尾元素(这个上下限通过两个for循环来实现);
  • D2)在小数组中,我们并没有用for循环来遍历所有元素,因为那是无效的,而是用一个if语句来判断是否 在遍历某元素 A[j] 后, sum是增加还是减少,增加,我们就赋值给maxsum, 减少,不赋值就是了,从而撤销掉一个for循环;

Method3)采用分治思想来解决(分治是干货)

源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/chapter2/p20.c
这里写图片描述
算法描述:其思想是把问题分成两个大致相等的子问题,然后递归地对它们进行求解,这是“分”部分;“治”阶段 将两个子问题的解合并到一起并可能再做些少量的附加工作,最后得到整个问题的解;

  • 在我们的例子中(求最大子序列和的问题),最大子序列和可能出现在三个地方——或者整个出现在输入数据的左半部、或者整个出现在右半部、或者跨越输入数据的中部从而占据左右两半部分;
  • 如何求其解呢? 前两种情况,可以递归求解,第3中情况的最大和可以通过求出前半部分的最大和(包含前半部分的最后一个元素)以及 后半部分的最大和(包含后半部分的第一个元素)而得到。然后将这两个和加在一起;

考虑以下输入:
这里写图片描述

  • 代码演示分析步骤
    这里写图片描述
    这里写图片描述

算法流程演示
这里写图片描述
Attention):

  • A1)如(0,7)表示(left, right), 而center = (left + right) /2 
  • A2)显然算法把 整个序列分割成若干了子序列,各子序列和进行比较,求出序列最大值; 其中最经典的是 max3()函数的调用,它返回的是两个子节点的序列和 和 其最近父节点序列和的最大值。然后回溯回去,一步一步进行(1,2,3... 表示返回的递归回溯的次序)
  • A3)这个函数 maxSubSum_3()是如何返回序列的最大和的——主要还是依赖与 max3()函数的存在。
  • Attention)看到没有? 该函数的递归次序类似于二叉树的 后序递归 idea(上图中的二叉树)。

Method4)利用联机算法解决最大子序列和问题

源代码: https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/chapter2/p21.c
这里写图片描述
时间复杂度:T(N)=O(N)
代码演示步骤
这里写图片描述
Attention):

  • 显然,最大子序列和所在的子序列不包括任意”子子序列“为负的情况,因为负就相当于做减法;当thisSum 小于 0 时,令thisSum=0, 即排除了子序列和为负的情况;

算法解说(Commentary):

  • C1)优点: 它只对数据进行一次扫描,一旦A[i]被处理,就不需要再记忆了;
  • C2)在任意时刻, 算法都能对他已经读入的数据给出子序列问题的正确答案;
  • C3)具有这种特性的算法叫——联机算法(online algorithm);
  • C4)仅需要线性时间运行的联机算法几乎是完美的算法;

What’s the online algorithm ?

  • 如果在任何时刻,算法都能对它已经读入的数据给出子序列问题的正确答案,具有这种特性的算法叫做 联机算法
    因此如果数组在磁盘或磁带上,它就可以被顺序读入,在主存中不必存储数组的任何部分。所以这个算法是一个几乎完美的 联机算法
  • 【百度百科】
    在任意时刻算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要再 被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。具有这种特性的算法叫做联机算法(on-line algorithm)

Complementary)分治法 与 动态规划

  • C1)分治法: 分治法是将问题分为一系列独立小问题,然后分别找到每个小问题的解决方案,然后把每部分的解决方案合并起来,适用于具有同类解决方案的子问题 的求解;
  • C2)动态规划:动态规划是将问题分为一系列 相互联系 的子问题,求解一个子问题可能要用到已经求解过的子问题的解,子问题具有重叠性,适合具有重叠子问题性质的问题求解;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java设计模式代理模式_Java中的代理设计模式

java设计模式代理模式代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式,…

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项: 1.前端界面的表单项的参数命名格式为:Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法,注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器,可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1) source code and text description are from data structure and alg analysis ; 【1】分析算法最混乱的方面大概集中在对数上面, 除分治算法外,可将对数最常出现的规律概括为下列一般法则: 1.1&a…

java项目:永和大王项目_Java项目:书评

java项目:永和大王项目本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同,但是由于这是我写的书,而且我是撰写评论的人,因此赞美这…

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间 数…

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中,大家都跟作文打过交道吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。那要怎么写好作文呢?下面是小编为大家整理的把一个人的特点写具…

spring boot简介_Spring Boot简介

spring boot简介在本教程中,我们将看一下Spring Boot,看看它与Spring框架有何不同。 我们还将讨论Spring Boot提供的各种功能。 什么是Spring Boot? 在开发企业级应用程序时,Spring是一个功能强大的框架。 它为我们提供了诸如依赖…

C语言的运算符的优先级与结合性+ASCII表

【0】README 0.1) 内容来源于 C程序设计语言, 旨在整理出C语言的运算符的优先级与结合性, 如下图所示(哥子 记了大半年都没有记住,也是醉了,每次都要去翻); 0.2) 再补充…

退货退款的售后,如何返还金币/有偿优惠券的问题

假设买家购买了3个商品,商品的销售价是10元,商品总金额是30元 买家应付金额是 30 元,买家使用5个金币抵扣5元,买家实付金额是 25 元。 后来买家退货 2 件,怎么退款和退币呢? 要将金币分摊到每个商品上&a…

python orm框架sqlalchemy_python ORM框架:SqlAlchemy

ORM,对象关系映射,即Object Relational Mapping的简称,通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系,这样做的目的:简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等),转而直接使用对象模…

javadoc提取工具_使JavaDoc保持最新状态的工具

javadoc提取工具在许多项目中,文档不是最新的。 更改代码后,很容易忘记更改文档。 原因是可以理解的。 在代码中进行更改,然后进行调试,然后希望在测试中进行更改(或者,如果您使用的是更多TDD,则…

栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

【0】README 0.1) 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤,并给出源代码实现; 0.2) 本文中涉及到的源代码均为原创,是对中缀转后缀和计算后缀的简单实现,(旨在理清它…

用户/账户/账号的理解

文章目录用户账户账号关系用户 用户概念的理解: 用户就是使用者,可以是个人用户,也可以是机构用户。 账户 账户概念的理解: 账户,所谓“账”,就是系统根据“账”来存储和管理数据,类似记账…

azure 部署java_jClarity:在Azure上升级到Java

azure 部署java在互联世界公共基础设施的新时代,最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此,许多公司将时间和资源投入到构建最先进的技术上,以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量,而且免费…

黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾

2010年刚上大学那会,入手了人生第一台笔记本电脑,两边密密麻麻的各种接口,也没感觉到接口多少的价值;2016年年中入手了人生第一台苹果笔记本,第一次觉得电脑接口不够用;如今四年过去了电脑也到了更新换代的…

利用树的先序和后序遍历打印os中的目录树

【0】README0.1)本代码均为原创,旨在将树的遍历应用一下下以加深印象而已;(回答了学习树的遍历到底有什么用的问题?)你对比下linux 中的文件树 和我的打印结果就明理了;0.2)我们采用…

Hibernate常用API

文章目录删除指定的记录新增记录更新记录清空缓存将实体对象从缓存中清除将缓存中更新的数据同步到数据库把数据库中的数据刷到缓存中查询多个对象(也就是查询多条记录)查询指定ID的对象(查询指定ID值的记录)参考删除指定的记录 U…

solid设计原则_SOLID设计原则

solid设计原则介绍: Robert C. Martin定义了五项面向对象的设计原则: 小号英格尔-责任原则 笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则,并 d ependency倒置原则 这些一起被普遍称为SOLID原则。 在设计面向对象的系统时&a…

nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性

关系型数据库的局限NoSql出现在关系型数据库之后,主要是为了解决关系型数据库的短板,我们先来看看随着软件行业的发展,关系型数据库面临了哪些挑战:1、高并发一个最典型的就是电商网站,例如双11,几亿大军的…