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

软工2101张文俊 2022-09-26 23:18:57

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

int maxSum(int a[],int left,int right) {
    int sum = 0;
    if(left == right) 
    {
        if(a[left] > 0) sum = a[left];
        else sum = 0;
    } 
    else 
    {
        int center = (left + right) / 2;
        int leftsum = maxSum(a, left, center);
        int rightsum = maxSum(a, center + 1, right);

        int s1 ,lefts = 0;
        for(int i = center ; i >= left; i--) {
            lefts += a[i];
            if(lefts > s1) s1 = lefts;
        }
        int s2 ,rights = 0;
        for(int i = center + 1 ; i <= right; i++) {
            rights += a[i];
            if(rights > s2) s2 = rights;
        }

        sum = s1 + s2;
        if(sum < leftsum) sum = leftsum;
        if(sum < rightsum) sum = rightsum;    
    } 
    return sum;
}
2、分析该算法的时间复杂度

将数组一分为二,时间复杂度为O(1),不断求数组二分之一和的最大值,时间复杂度为 2T(n/2),合并子问题,时间复杂度为O(n)所以可得该算法的时间复杂度为O(nlogn)

3、分治法的体会和思考

运用分治法,可以将一个大问题分解为若干个子问题,递归地解决各个子问题,然后将各个子问题的解合并得到原问题的解。运用分治法,虽然提高了解决问题的空间复杂度,但是却可以降低时间复杂度,从而提高解决问题的效率,递归细化问题,使问题的复杂程度降低。该方法可以在许多例子中体现,如二分搜索、合并排序、大整数的乘法、快速排序等,我们应当学习并且熟练运用该方法,以在解决这类问题时可以达到更高的效率,让代码更简洁,时间复杂度更低。。相比于之前学习过的一些方法,分治法在时间效率上有更大的优势,非常值得我们学习和使用。

...全文
19 回复 打赏 收藏 举报
写回复
回复
切换为时间正序
请发表友善的回复…
发表回复
发帖
gdufscs

124

社区成员

广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
帖子事件
创建了帖子
2022-09-26 23:18
社区公告
暂无公告