【问题标题】:I am not able to understand how recursion is happening in one particular case of divide and conquer我无法理解在一种特定的分而治之的情况下递归是如何发生的
【发布时间】:2014-11-10 22:28:17
【问题描述】:

我不理解使用分治模式的问题:寻找最大子数组问题。有人可以建立一棵树来检查我的递归,以使我了解每个递归调用和每个步骤中发生的情况吗?在使用分而治之方法的合并排序中,我了解到数组首先被分解为最小的子数组。完成划分后,我们开始逐步从基础到顶部合并。但在这个问题中:finding maximum subarray 我不明白组合步骤。如果数组被分割,那么 i 必须被组合回来。我首先编写算法,然后在代码行之后使用\* *\ 提出问题作为注释。

在这个完整的问题中:书上说 6 到 12 是组合步骤,但我不明白这个分割的数组是如何组合的。有人能画出好图或照片来解释整个过程吗?

        Consider an array for this example, A = [-3,2,-1,3]

Find-Maximum-Subarray(A,low,high)
1) if high == low 
2)       return(low, high, A[low])
3) else mid = floor[(low+high)/2]
4)      (left-low,left-high,left-sum)= Find-Maximum-Subarray(A,low,mid)

/*这是对 Find-Maximum-Subarray 的递归调用,因此程序将不会继续进行,它将继续调用自身,最后一步将是左低将被签名数组的第一个索引和左高也将是第一个索引,left-sum 将是 A[1] 现在 i 在下一行代码中划分更右子数组 */

5)      (right-low,right-high,right-sum)= Find-Maximum-Subarray(A,mid+1,high)
6)      (cross-low,cross-high,cross-sum)= Find-Max-Crossing-Array(A,low,mid,high)
7)      if left-sum >= right-sum and left-sum >= cross-sum
8)                return (left-low,left-high,left-sum)
9)      elseif right-sum >= left-sum and right-sum >= cross-sum
10)               return (right-low,right-high,right-sum)
11)     else 
12)               return (cross-low,cross-high,cross-sum)


Find-Max-Crossing-Array(A,low,mid,high)
1.1)left-sum = -infinity
1.2)sum=0
1.3)for i= mid downto low
1.4)     sum=sum+A[i] 
1.5)     if sum>left-sum
1.6)           left-sum = sum
1.7)           max-left= i 
1.8)right-sum= -infinity
1.9)sum =0
2.0)for j = mid+1 to high
2.1)     sum=sum+A[j]
2.2)     if sum>right-sum
2.3)           right-sum= sum
2.4)           max-right= j
2.5)return(max-left, max-right, left-sum+right-sum)

【问题讨论】:

    标签: algorithm arrays


    【解决方案1】:

    您担心的无限递归不会发生,因为在到达第 5 行之前,第 1 行已检查您是否下降到单个索引,如果是则返回答案。

    PS:maximum subarray problem 有一个更简单的算法。只需将迭代地钳制在零以上的部分和的最大值:array.Scan(0, (a, e) => Math.Max(0, a + e)).Max()。不过,要跟踪界限,您必须做更多的簿记工作。

    【讨论】:

    • 我知道有简单的算法。但可能不会花费 O(nlgn) 时间。
    • @StackOverflow 更简单的算法是线性时间。它比分治算法更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2018-03-25
    • 2019-04-14
    • 1970-01-01
    • 2018-05-23
    • 2020-01-19
    • 2017-07-16
    相关资源
    最近更新 更多