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

软工2202黄俊嘉 2022级 2023-10-21 15:51:16

目录

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

2、该算法的时间复杂度

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


 

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

 

function maxSubarraySum(arr, low, high)
    if (low == high)
        return arr[low]

    mid = (low + high) / 2

    leftMax = maxSubarraySum(arr, low, mid)
    rightMax = maxSubarraySum(arr, mid+1, high)
    crossMax = maxCrossingSum(arr, low, mid, high)

    return max(leftMax, rightMax, crossMax)

function maxCrossingSum(arr, low, mid, high)
    leftSum = -∞                      //左段
    sum = 0

    for i 从 mid 到 low
        sum = sum + arr[i]
        leftSum = max(leftSum, sum)   //一直替换最大值上去得到左段最大值

    rightSum = -∞                     //右段
    sum = 0

    for i 从 mid+1 到 high
        sum = sum + arr[i]
        rightSum = max(rightSum, sum) //一直替换最大值上去得到右段最大值

    return leftSum + rightSum         //合并左右段

 

maxSubarraySum ’函数递归地将问题分成左右两部分,并计算三个值:左子数组的最大字段和,右子数组的最大字段和,以及跨越中点的最大字段和。最后,通过比较这三个值,找到全局的最大字段和。

 

2、该算法的时间复杂度

 

(1)分解:在每一次递归调用中,问题被划分为两个子问题,每个子问题处理一半的数组。这个过程可以看作是一棵二叉树的构建,其中每个节点都代表一个数组的子段。这一阶段的时间复杂度是 O(1),因为只是简单地计算中点和递归调用。

(2)解决:在这一阶段,对于每个子问题,我们需要计算左子数组的最大字段和、右子数组的最大字段和和跨越中点的最大字段和。这个步骤的时间复杂度是线性的,因为我们必须检查每个元素一次,计算左子数组和右子数组的最大字段和。因此,每个子问题的解决步骤都是 O(n)。

(3)合并:在这一阶段,我们需要合并左子数组和右子数组的结果,以及跨越中点的最大字段和。合并步骤的时间复杂度也是线性的,因为我们只需进行有限次的操作来比较中点的左右部分和。

 

总的来说,递归树的深度是对数级别的,因为每次问题都被划分为两个子问题。每个子问题的解决和合并都是线性时间的,所以总的时间复杂度可以表示为:

T(n) = 2T(n/2) + O(n)

根据主定理,这个算法的时间复杂度为 O(n log n)。因此,最大字段和的分治算法具有较好的时间复杂度,适用于大规模数组的情况。

 

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

 

分治法是个非常好用的解决问题的方法,它能够将复杂问题划分成更容易解决的子问题,然后通过递归和合并步骤来获得整体解。理解问题的结构、选择合适的分解策略以及权衡时间复杂度和并行计算潜力都是成功应用分治法的关键要素。通过运用分治法,我们可以更好地解决各种复杂的计算和工程问题。

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

434

社区成员

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

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