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

计科2101郑森锋 2022-09-24 23:52:48

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

    运用分治算法求解最大字段和,最大值会出现三种情况:

    将所给序列a[1:n] 分成a[1:n/2] 和 a[n/2 + 1 : n]两个部分,最大字段和要么完全在左边部分,要么完全在右边部分,要么就在左边和右边连接的中间部分

    伪代码求解如下:

int MaxSum(int* a, int left, int right)
{
    int k, sum = 0;

    if (left == right)
    {
        return a[left] >= 0 ? a[left] : 0;
    }
    else
    {
        int mid = (left + right) / 2;
        int lsum = MaxSum(a, left, mid);
        int rsum = MaxSum(a, mid + 1, right);

        int s1 = 0;
        int lefts = 0;

        for (k = mid; k >= left; k--)
        {
            lefts += a[k];
            if (lefts > s1)
                s1 = lefts;
        }

        int s2 = 0;
        int rights = 0;

        for (k = mid + 1; k <= right; k++)
        {
            rights += a[k];
            if (rights > s2)
                s2 = rights;
        }
        sum = s1 + s2;

        if (sum < lsum)
            sum = lsum;
        if (sum < rsum)
            sum = rsum;
    }
    return sum;
}

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

    T(n)=2T(n/2)+O(n)
    T(n)=O(nlogn)

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

分治法的本质就是划分子问题,求解子问题再合并,进而求解问题。我认为我们应该学习这种思想,比如遇到一些大项目,我们可以不断的划分一个一个小板块,慢慢解决,再合并起来,最终做成大项目。当然,分治法也有一些缺点,比如不适合求解规模较小的问题之类的。我们应该合理的运用分治法解决算法问题。

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

434

社区成员

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

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