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

Silence176 Silence176 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。

 

 

...全文
评论
收藏 已收藏
分享
返回顶部
Silence176
gdufscs 434 成员 1,011 内容