算法设计与分析第二章作业——计科2201袁煜

计科2201袁煜 2022级 2023-10-27 20:27:22

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

    

int maxSubArray(int arr[], int left, int right) {
    if (left == right) {
        return arr[left];
    }

    int mid = (left + right) / 2;

    int leftMax = maxSubArray(arr, left, right);
    int rightMax = maxSubArray(arr, mid + 1, right);
    int crossMax = maxCrossingSubArray(arr, left, mid, right);

    return max(leftMax, rightMax, crossMax);
}

int maxCrossingSubArray(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;
}

 

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

该最大字段和的分治算法的时间复杂度为O(n log n)。算法将问题分成两部分,递归求解,然后再合并结果。每次分解问题的时间复杂度为O(log n),而合并的时间复杂度为O(n),因此总的时间复杂度为O(n log n)

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

分治法所能解决的问题一般具有以下几个特征:

1、该问题的规模缩小到一定的程度就可以容易地解决。
2、该问题可以分解为若干个规模较小的相同问题。
3、利用该问题分解出的子问题的解可以合并为该问题的解。
4、该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
故可以分以下几步利用分治法解决问题:
1、分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
2、求解子问题:若子问题规模较小而容易被解决则直接求解,否则递归地求解各个子问题。
3、合并:将各个子问题的解合并为原问题的解。

...全文
20 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

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

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