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

软工2103李小娟 2022-09-26 23:30:15

1.

把整个序列一分为二,此时最大字段和会出现三种情况,(1)最大字段在左半序列中,(2)最大字段在右半序列中,(3)最大字段横跨左右序列中

第一二种用递归继续一分为二,第三种像左开始找最大字段和,再向右开始找最大字段和,然后两个相加。

伪代码

int maxSum(int *a,int left,int right){
    if(left == right)
    return a[left];

    int mid = (left+right) / 2;
    int leftSum = maxSum(a,left,mid);
    int rightSum = maxSum(a,mid+1,right);

    int sl = 0;// 像左最大字段和
    int nowLeftSum = 0;
    for(int i = mid; i > left; i--){
        nowLeftSum += a[i];
        if(nowLeftSum > sl)
            sl = nowLeftSum;
    }

    int sr = 0;
    nowRightSum = 0;
    for(int i = mid; i > left; i--){
        nowRightSum += a[i];
        if(nowRightSum > sr)
            sr = nowRightSum;
    }
    int sum = sl + sr;
    return sum;
}

2.算法复杂度为 O(nlogn);

3.总结

(1)任何可以用计算机求解的问题所需计算的时间都与其规模有关。问题规模越小,解题所需时间往往也越短,从而也比较容易处理。

(2)直接或间接的调用自身的算法称为递归算法。

(3)分治法的基本思想是将一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。

 

 

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

124

社区成员

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