电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

绝妙的算法——最大子序列和问题VIP免费

绝妙的算法——最大子序列和问题_第1页
1/8
绝妙的算法——最大子序列和问题_第2页
2/8
绝妙的算法——最大子序列和问题_第3页
3/8
摘要本文分析并演示最大子序列和问题的几种算法,它们都能解决问题,但是时间复杂度却大相径庭,最后将逐步降低至线性。算法子序列和问题的引入给定(可能有负数)整数序列A1,A2,A3...,An,求这个序列中子序列和的最大值。(为方便起见,如果所有整数均为负数,则最大子序列和为0)。例如:输入整数序列:-2,11,8,-4,-1,16,5,0,则输出答案为35,即从A2~A6。这个问题之所以有吸引力,主要是因为存在求解它的很多算法,而这些算法的性能差异又很大。这些算法,对于少量的输入差别都不大,几个算法都能在瞬间完成,这时若花费大量的努力去设计聪明的算法恐怕就不太值得了;但是如果对于大量的输入,想要更快的获取处理结果,那么设计精良的算法显得很有必要。切入正题下面先提供一个设计最不耗时间的算法,此算法很容易设计,也很容易理解,但对于大量的输入而言,效率太低:算法一:publicstaticintmaxSubsequenceSum(int[]a){intmaxSum=0;for(inti=0;imaxSum)maxSum=thisSum;}}returnmaxSum;}上述设计很容易理解,它只是穷举各种可能的结果,最后得出最大的子序列和。毫无疑问,这个算法能够正确的得出和,但是如果还要得出是哪个子序列,那么这个算法还需要添加一些额外的代码。现在来分析以下这个算法的时间复杂度。运行时间的多少,完全取决于第6、7行,它们由一个含有三重嵌套for循环中的O(1)语句组成:第3行上的循环大小为N,第4行循环大小为N-i,它可能很小,但也可能是N。我们在判断时间复杂度的时候必须取最坏的情况。第6行循环大小为j-i+1,我们也要假设它的大小为N。因此总数为O(1*N*N*N)=O(N3)。第2行的总开销为O(1),第8、9行的总开销为O(N2),因为它们只是两层循环内部的简单表达式。我们可以通过拆除一个for循环来避免3次的运行时间。不过这不总是可能的,在这种情况下,算法中出现大量不必要的计算。纠正这种低效率的改进算法可以通过观察Sum(Ai~Aj)=Aj+Sum(Ai~A[j-1])而看出,因此算法1中第6、7行上的计算过分的耗费了。下面是在算法一的基础上改进的一种算法:算法二:publicstaticintmaxSubsequenceSum(int[]a){intmaxSum=0;for(inti=0;imaxSum)maxSum=thisSum;}}returnmaxSum;}对于此算法,时间复杂度显然是O(N2),对它的分析甚至比前面的分析还要简单,就是直接使用穷举法把序列中i后面的每个值相加,如果发现有比maxSum大的,则更新maxSum的值。对于这个问题,有一个递归和相对复杂的O(NlogN)解法,我们现在就来描述它。要是真的没有出现O(N)(线性的)解法,这个算法就会是体现递归为例的极好的范例了。该方法采用一种“分治”策略。其想法就是吧问题分成两个大致相等的子问题,然后递归地对它们求解,这是“分”的阶段。“治”阶段就是将两个子问题的解修补到一起并可能再做些少量的附加工作,最后得到整个问题的解。在我们的例子中,最大子序列的和只可能出现在3个地方:1.出现在输入数据的左半部分2.3.出现在输入数据的右半部分4.5.跨越输入数据的中部而位于左右两个部分6.前两种情况可以递归求解,第三种情况的最大和可以通过求出前半部分(包含前半部分的最后一个元素)的最大和以及后半部分(包括后半部分的第一个元素)的最大和,再将二者相加得到。作为例子,考虑以下输入:-----------------------------------------前半部分后半部分------------------------------------------2,11,8,-4,-1,16,5,0-----------------------------------------其中,前半部分的最大子序列和为19(A2~A3),而后半部分的最大子序列和为21(A6~A7)。前半部分包含其最后一个元素的最大和是15(A2~A4),后半部分包含第一个元素的最大和是20(A5~A7)。因此,跨越这两部分的这个子序列才是拥有最大和的子序列,和为15+20=35(A2~A7)。于是出现了下面这种算法:算法三:publicstaticintmaxSubs...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

绝妙的算法——最大子序列和问题

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部