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

计科2101孙宇萌 2022-09-26 00:25:40

一、用分治法的思想解题

将所给序列a[1:n] 分成a[1:n/2] 和 a[n/2 + 1 : n]两个部分,则最大值有一下三种情况:

  1. 整个序列的字段和与左半部分相同
  2. 整个序列的子段和与右半部分相同
  3. 整个序列的子段和 在两个部分的中间连接部分
int max(int *a, int left, int right) {

if (left == right) {

return a[left] < 0 ? 0 : a[left];

}

    int center = (left + right) / 2;

    int left = max(a, left, center);

    int right = max(a, center + 1, right);

    int s1 = 0;

    int lefts =0;

    for (int i = center; i >= left; i--) {

        lefts += a[i];

        if (lefts > s1) {

            s1 = lefts;

        }

    }

    int s2 = 0;

    int rights = 0;

for (int i = center + 1; i <= right; i++) {

        rights += a[i];

        if (rights > s1) {

            s1 = rights;

        }

    }

    int sum = s0 + s1;

    sum = max(sum, left);

    sum = max(sum, right);

    return sum;

}

int max(int *a, int n) {

return sum(a, 1, n);

}

 

二、根据主定理求解时间:

时间复杂度:T(n) = O(1) + 2T(n / 2) + O(n) = O(nlogn)

三、对分治法的体会和思考

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

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

434

社区成员

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

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