pfwvan666

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  11 随笔 :: 0 文章 :: 0 评论 :: 1858 阅读

1.请以伪代码描述最大字段和的分治算法

 

思路:

先将元素分为a[0:(n-1)/2]与a[(n-1)/2+1:n-1]左右两个区间,那么最大字段和的存在有三种可能:

 

  • 在左区间;
  • 在右区间;
  • 左端点在左区间,右端点在右区间;

所以用mid = (left+right)/ 2    (left,right为左右边界)将数组分开,继续递归划分直至只剩一个元素,寻找左区间、右区间、中间的最大字段和;

 

 

伪代码:

int f(int left,int right){//a[left].......a[right]横跨左右的最大字段和

int mid=(left+right)/2;

int sumleft=0,ansleft=a[mid];

int sumright=0,ansright=a[mid+1];

 

for(int i=mid;i>=left;i--){//往左依次加

sumleft+=a[i];

ansleft=max(ansleft,sumleft);}

 

for(int i=mid+1;i<=right;i++){//往右依次加

sumright+=a[i];

ansright=max(ansright,sumright);}

 

return ansleft+ansright;

}

 

int MaxSum(int left,int right){

if(left==right)return a[left];

else {

  int mid=(left+right)/2;

  int L=Max(left,mid);

  int R=Max(mid+1,right);

  int LR=f(l,r);

return max(max(L,R),LR);

 

2.分析该算法的时间复杂度

分解子问题O(1)

求解子问题2T(n/2)

合并子问题O(1)

根据主定理T(n) = O(nlogn)

3.结合本章的学习,你对分治法的体会和思考

划分好几个子问题逐个求解子问题再合并,这种思想在我们遇到一些大项目时,我们可以不断的划分一个一个小板块,慢慢解决,再合并起来才能成功。

posted on   澎湖湾  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示