最大子序列的求解-算法之一分析

栏目: 编程工具 · 发布时间: 5年前

内容简介:利用“分治”和递归的思想求解,在总体思路是,原序列的子序列存在于三处,左、右和跨中点。将序列从中点分割,分别用递归求出左右最大的子序列;分别求出包含左侧和右侧包含中点端点的最大子序列,求和即是跨中点的最大子序列。最后三者中的最大者即为答案。这三个步骤分别表示为①、②、③。程序中,

要求:给定整数序列,求解其中最大子序列(连续的序列)。

利用“分治”和递归的思想求解,在 《数据结构与算法分析(Java语言描述)》 Page29,作者给出了具体的 java 代码。

总体思路是,原序列的子序列存在于三处,左、右和跨中点。将序列从中点分割,分别用递归求出左右最大的子序列;分别求出包含左侧和右侧包含中点端点的最大子序列,求和即是跨中点的最大子序列。最后三者中的最大者即为答案。这三个步骤分别表示为①、②、③。

程序中, maxSumRec 为递归函数,函数开始为是否到达递归基准的if判断语句,然后分别是两个递归语句,执行步骤①②。对于递归而言,递归语句后边的语句不再执行,从递归语句处直接返回程序开始进行递归,直到到达基准语句,执行return跳出函数。递归语句计算出 maxLeftSum maxRightSum

函数中,递归语句后边的部分计算步骤③,在for循环中,固定中点端点,分别想左右两侧循环求和,利用if语句来更新包含中心端点的 maxLeftBorderSum maxRightBorderSum 。两个 变量求和即是③的最大子序列。

最后,求出最大者即可。整个程序给人的启发是,如果按照这种思路,我可能会对步骤①②和③分别定义函数。而作者很巧妙的定义一个函数,利用递归的执行特性,将函数前后分隔开来。测试函数在调用 maxSumRec 函数时,传入的参数为(a,0,a.length-1),这样可以首先计算①②。在递归结束得到 maxLeftSum maxRightSum 后,继续执行递归语句后的部分,计算步骤③。从感官上,程序更加简洁,没有多余的函数和调用。

启发之二,使用递归的时候,需要在递归语句前边,提前设置好到达基准的条件(if,return/break),以便适时完成递归,跳出递归函数。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Google软件测试之道

Google软件测试之道

James A. Whittaker、Jason Arbon、Jeff Carollo / 黄利、李中杰、薛明 / 人民邮电出版社 / 2013-10 / 59.00元

每天,google都要测试和发布数百万个源文件、亿万行的代码。数以亿计的构建动作会触发几百万次的自动化测试,并在好几十万个浏览器实例上执行。面对这些看似不可能完成的任务,谷歌是如何测试的呢? 《google软件测试之道》从内部视角告诉你这个世界上知名的互联网公司是如何应对21世纪软件测试的独特挑战的。《google软件测试之道》抓住了google做测试的本质,抓住了google测试这个时代最......一起来看看 《Google软件测试之道》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码