最大子数组问题:分治法.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最大子数组问题:分治法

最大子数组问题:分治法这题的思想是书上的(《算法导论》),代码当然也是按照书上伪码写出的;  之前已用动态规划解决这个问题,所以问题也不用多说,简述如下:  《算法导论》中引入这个问题是通过股票的购买与出售,经过问题转换,将前一天的当天的股票差价重新表示出来,即转为了一个最大子数组的问题,具体内容我不多说,转的内容是:  13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7  找到这连续的16个数里面的连续和最大的子数组;  说一下书中的思想吧(语言组织是书中的,自认总结不会比书上好):  假定我们要寻找子数组A[low..high]的最大子数组,使用分治法意味着我们要将子数组划分为两个规模尽可能相等的子数组。也就是说,找到子数组的中央位置,比如mid,然后求解两个子数组A[low..mid]和A[mid+1..high]。所以,A[low..high]的任何连续子数组A[i..j]所处的位置必然是三种情况之一:  1.完全位于子数组A[low..mid]中,因此low=i=j=mid;  2.完全位于子数组A[mid+1..high]中,因此mid=i=j=high;  3.跨越了中点,因此low=i=midJ=HIGH;strong=/J=HIGH;  因此,A[low..high]的一个最大子数组所处的位置必然是这三种情况之一。实际上,A[low..high]的一个最大子数组必然是完全位于A[low..mid]中、完全位于A[mid+1..high]中或者跨越中点的所有子数组中和最大者。  代码:  #includeconstintInfinite=-10000;  intmax_left=0;  intmax_right=0;  usingnamespacestd;  intFindMaxCrossSubarray(intA[],intlow,intmid,inthigh)//跨越{intleft_sum=Infinite;intsum=0;  for(inti=mid;i=low;i--)//左半部的最大子数组  {sum+=A[i];   if(sumleft_sum){left_sum=sum;max_left=i;}}  intright_sum=Infinite;  sum=0;for(inti=mid+1;i=high;i++)//右半部的最大子数组  {sum+=A[i];  if(sumright_sum){right_sum=sum;max_right=i;}}  returnleft_sum+right_sum;}  intFindMaxSubarray(intA[],intlow,inthigh)  {intleft_sum,right_sum,cross_sum;if(high==low)//一个元素  {returnA[low];}else{intmid=(low+high)/2;//分治  left_sum=FindMaxSubarray(A,low,mid);//前半部  right_sum=FindMaxSubarray(A,mid+1,high);//后半部  cross_sum=FindMaxCrossSubarray(A,low,mid,high);//跨越前后  if(left_sum=right_sumleft_sum=cross_sum)//最大子数组在左边  returnleft_sum;elseif(right_sum=left_sumright_sum=cross_sum)//右边  returnright_sum;else//跨越returncross_sum;}}  intmain(){   inta[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7}; //inta[]={23,4};   intlength=sizeof(a)/sizeof(int);coutPS;本文档由北大青鸟广安门收集自互联网,仅作分享之用。

文档评论(0)

sh4125733 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档