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

WriseW 2022级 2023-10-25 23:47:25
// 计算跨越中间位置的最大字段和
int maxCrossingSum(int arr[], int left, int mid, int right) {
    int leftSum = INT_MIN;
    int sum = 0;
    for (int i = mid; i >= left; i--) {
        sum += arr[i];
        leftSum = max(leftSum, sum);
    }

    int rightSum = INT_MIN;
    sum = 0;
    for (int i = mid + 1; i <= right; i++) {
        sum += arr[i];
        rightSum = max(rightSum, sum);
    }

    return leftSum + rightSum;
}
// 分治算法求最大字段和
int divideAndConquer(int arr[], int left, int right) {
    // 递归结束条件
    if (left == right) {
        return arr[left];
    }

    int mid = (left + right) / 2;

    // 递归求解左右两部分的最大字段和
    int leftMax = divideAndConquer(arr, left, mid);
    int rightMax = divideAndConquer(arr, mid + 1, right);

    // 求解跨越中间位置的最大字段和
    int crossMax = maxCrossingSum(arr, left, mid, right);

    // 返回左右两部分、跨越中间位置的最大字段和中的最大值
    return max(max(leftMax, rightMax), crossMax);
}
  • 分治算法的时间复杂度可以表示为递归式 T(n) = 2T(n/2) + O(n),其中 n 表示问题的规模。
  • 在合并步骤中,计算跨越中间位置的最大字段和需要 O(n) 的时间。
  • 综上时间复杂度为 O(nlogn)
...全文
29 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

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

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