算法设计与分析第二章作业

Sulong@0917 2022-09-26 21:42:56

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

用分治法求解这个问题,在数组的 mid = (right-left)/2+left 位置处分开,形成两个子数组。那么,最大子段和可能出现在三个位置:

a. 可能出现在左子数组[1:n/2]

b. 可能出现在右子数组[n/2+1:n]

c. 可能出现在过mid的中间某部分元素组成的子数组。

伪代码如下   

int find(int a[],int left,int right)
{
    if(left==right)
{
    return a[left];
}
int mid = (left + right) / 2;
if(mid == 0)
{
return 0;
}

int maxNum = max(findMax(a, left.mid), findMax(a, mid+1, right));
int j = 0, L = a[mid - 1], R = a[mid];

for(int i = mid-1; i >= left; --i)
{
    L = max(L,j+=a[i]);
}

j = 0;
for(int i = mid; i <= right; i++)
{
    R = max(R, j += a[i]);
}

return max(maxNum,L+R);
}

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

① 分解子问题:O(1);

② 求解子问题: 2T(n/2);

③ 合并子问题:O(n);

因此由主定理得时间复杂度T(n) = O(1) + 2T(n / 2) + O(n) = O(nlogn)。

3.对分治算法的体会与思考

分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之。

运用分治法拆解一个大问题, 能更为方便而高效率地解决一些问题,并能够化简问题,令解题思路更为明确。

...全文
36 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧