算法与分析第二章作业

软工2101罗添权 2022-09-26 23:18:24

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、分析该算法的时间复杂度

假使,最初的问题规模是N,这些小的子问题的个数为a,子问题的规模是是原来的1/b倍,分解或者合并的复杂度表示为f( n ),那么总的时间复杂度就可以表示为

T(n)=O(1)  n=1

T(n)=aT(n/b)+f(n)    n>1

  由公式可得,该算法的时间复杂度为O(nlogn)。

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

分治法的基本思想就是把一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立且与原问题相同。

(1) 将求解的较大规模的问题分割成k个更小规模的子问题。

(2) 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。

(3) 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。

这种思想其实应用很广泛,只是生活中不去特别注意。将一个复杂的且规模庞大的问题通过不断细分不断细分,变成一个个易于理解易于解决的子问题,逐一击破后合并成为最后的解

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

124

社区成员

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