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

软工2103梁海萍 2022-09-26 21:56:25

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

首先将数组分为左右大概相等的两个子段,递归求解左子段和右子段的最大子段和,最后归并比较最大子段和。

分治法部分代码如下:

int MaxSum(int left,int right)
{
    int sum=0,mid,lsum,rsum;
    if (left==right)
    {
        return  a[left]<0?0:a[left]; 
    }
    else
    {
        mid=(left+right)/2;
        lsum=MaxSum(left,mid);
        rsum=MaxSum(mid+1,right);
        int s1=0,ls=0;
        for (int i=mid;i>=left;i--)
        {
            ls+=a[i];
            if (ls>s1)
                s1=ls;
        }
        int s2=0,rs=0;             
        for (int i=mid+1;i<=right;i++)
        {
            rs+=a[i];
            if (rs>s2)
                s2=rs;
        }
        sum=s1+s2;
        if (lsum>sum)
            return lsum;
        else if (rsum>sum)
            return rsum;
        else
		    return sum;
    }
}

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

分解子问题:O(1)

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

合并子问题:O(n)

总时间复杂度:O(nlogn)

三、对分治法的体会和思考

分治法通过将问题分为若干个规模较小的子问题,且这些子问题互相独立并与原问题相同,可以有效地降低时间复杂度,提高了算法的效率,在处理规模较大的问题时可以优先采用。

...全文
32 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

434

社区成员

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

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