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

宇宙深处的病孩子 2022-09-26 23:10:53

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

伪代码如下:

int maxSubSum(int *a, int left, int right) {
    if (left == right) {
        return a[left] < 0 ? 0 : a[left];
    }
        int centor = (left + right) / 2;
    int leftSum = maxSubSum(a, left, centor);
    int rightSum = maxSubSum(a, centor + 1, right);
    int s1 = 0;
    int lefts =0;
    for (int i = centor; i >= left; i--) { // 从中点向左找最大字段和
        lefts += a[i];
        if (lefts > s1) {
            s1 = lefts;
        }
    }
    int s2 = 0;
    int rights = 0;
    for (int i = centor + 1; i <= right; i++) {//从中点向右找最大字段和
        rights += a[i];
        if (rights > s1) {
            s1 = rights;
        }
    }
    int sum = s0 + s1; // 第三种情况的最大子段和
    sum = max(sum, leftSum); // 求解三种情况的最大值
    sum = max(sum, rightSum);
    return sum;
}
int maxSum(int *a, int n) {
    return sumSubSum(a, 1, n); // 可以根据数组a自行调整
}


二、分析该算法的时间复杂度

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

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

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

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


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

分治法将一个问题分成大小相等的k个子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题合并得到原问题的解。大大地优化了算法运行的时间复杂度,这种“分治”的思想也启发我们运用到平时某些问题的解决方案中。

 


...全文
25 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-数据结构与算法 发布问题, 以便更快地解决您的疑问

273

社区成员

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

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