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

Sakutan 2022级 2023-10-27 21:25:37

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

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;
}

2.分析该算法的时间复杂度

该算法的递归形式为:T(n) = 2T(n/2) + O(n) 。

1.分解子问题。在每一次递归调用中,问题被划分为两个子问题,时间复杂度为O(1).

2.求解子问题。将完整的数组拆分成两段长度为n/2的子数组,时间复杂度为2T(n/2)

3.合并子问题。拆分到只有一个数字时,停止拆分,时间复杂度为O(n)

因此,该算法的时间复杂度为O(nlogn)。

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

分治法是一种有效的解决问题的策略,它通过将一个复杂的问题分解为若干个规模较小、相对独立的问题,从而降低问题的复杂度,提高解决问题的效率,是一种非常有效的解决问题的策略。它可以帮助我们降低问题的复杂度、提高解决问题的效率。但是,使用分治法也需要考虑其适用性问题、时间复杂度和空间复杂度等因素,以确保得到最优的解决方案。

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

434

社区成员

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

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