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

软工2101孙茜 2022-09-26 23:04:05

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

int max(int a[],int left,int right)

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

    else

    {
        int mid = (left+right)/2;

        Sum-left  =max(a,left,mid);

        Sum-right = max(a,mid+1,right);

        Sum1 = 0;

        left_sum = 0;

        for(int i =mid;i>left;i--)

        {
            left_sum = left_sum + a[i];

            sum1 = max{sum1,left};

        }

        sum2 = 0;

        right_sum = 0;

        for(int i=mid+1;i<right;i++)

        {
            right_sum = right_sum + a[i];

            sum2 = max{sum2,right_sum};

        }

        sum = sum1 + sum2;

        sum = max{sum,Sum-left};

        sum = max{sum,Sum-right};

        return sum;

    }

}

 

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

拆分子数组分别求得的最大子段和为sum1,sum2时间复杂度为2T(n/2),从中心点向两边找最大的和,找到跨越的最大子段和的时间复杂度为O(n), 所以总体的时间复杂度为:T(n)=2T(n/2)+O(n) = O(nlogn)。

 

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

分治法在每层递归时都有三个步骤:

分解:即将原问题分解为若干子问题,而这些子问题都是原问题较小规模的实例。

求解:递归求解各个子问题,若子问题规模足够小,则可直接求解。

合并:合并子问题的解成原问题的解。

我们时常可以将一件大规模的问题变成几个小规模的问题来进行处理,最终将其进行合并整合,从而提升解决问题的效率。

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

273

社区成员

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

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