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

软工2103刘灯格 2022-09-25 19:45:02

一. 最大子段和分治法

利用分治思想将给定序列从中间分成左右两段,并在分开后的序列上继续递归调用该方法。每个子问题往左、往右以及中间分别求最大子段和,最后合并子问题,得到原序列的最大子段和。

伪代码:

int findmaxsum(int a[], int left, int right){
    if(left == right){
        if(a[left] < 0) return 0;
        else return a[left];
    }
    else{
        // 左段最大和
        int leftmax = findmaxmax(left, mid);
        int rightmax = findmaxmax(mid+1, right);
        int leftsum = 0;
        leftsum += a[left--];
        if(maxsum < leftsum) maxsum = leftsum;
        // 右端最大和
        int rightsum = 0;
        rightsum += a[right++];
        if(maxsum < rightsum) maxsum = rightsum;
        int sum = 0;
        sum = leftsum + rightsum;
        // 对比左、右、中的子段和,选择最大者
        sum = Max(leftmax,rightmax,sum);
    }
    return sum;
}

二. 该算法的时间复杂度

分解子问题时间复杂度为常数级O(1),求解子问题的时间复杂度2T(n/2),合并子问题时间复杂度O(n)。

根据:

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

该算法的时间复杂度为:O(nlogn)

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

对于能够将原问题分解成多个与原问题相同的子问题,可以通过递归的方式将原问题不断分解,再分别对小问题进行处理,最终合并小问题,得到原问题的答案。此方法在某些情况下能够大大提高处理问题的效率。

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

434

社区成员

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

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