“寻找后续元素最大和”算法的分析

时间:2011-07-26 22:42:35

标签: algorithm sequences arrays

如果可能,我希望有人对该算法进行分析性解释。

例如,给定序列

-2, 4, -1, 3, 5, -6, 1, 2 

最大子序列总和为

4 + -1 + 3 + 5 = 11

我正在考虑的这个算法是一种分而治之的算法。

该算法是 O(nlogn)复杂性。

实际上,我试图查看此算法产生的所有步骤的示例。上述序列可用于该示例。

2 个答案:

答案 0 :(得分:3)

这个想法是将你的序列分成两半,找到两半的答案,然后用它来找到整个序列的答案。

假设你有一个序列[left, right]。让m = (left + right) / 2。现在,MSS的最大和子序列([left, right])是MSS(left, m)MSS(m + 1, right)或从[left, m]开始并在{{1}的某处结束的序列}}。

伪代码:

[m + 1, right]

这是MSS(left, right) if left = right then return sequence[left] m = (left + right) / 2 leftMSS = MSS(left, m) rightMSS = MSS(m + 1, right) maxLeft = -inf // find the maximum sum subsequence that ends with m and starts with at least left cur = 0 i = m while i >= left do cur += sequence[i] if cur > maxLeft maxLeft = cur maxRight = -inf // find the maximum sum subsequence that starts with m + 1 and ends with at most right cur = 0 i = m + 1 while i <= right cur += sequence[i] if cur > maxRight maxRight = cur return max(leftMSS, rightMSS, maxLeft + maxRight) ,因为递归3的高度为O(n log n),而在树的每个级别我们都会O(log n)工作。

以下是O(n)

的运行方式
-2, 4, -1, 3, 5, -6, 1, 2

感兴趣的是 0 1 2 3 4 5 6 7 -2 4 -1 3 5 -6 1 2 MSS(0, 7) = 11 / \ MSS(0, 3) = 6 MSS(4, 7) = 5 ------ / \ | \ MSS(0, 1) = 4 MSS(2, 3) = 3 MSS(4, 5) = 5 NSS(6, 7) = 3 / \ / \ MSS(0, 0) = -2 MSS(1, 1) = 4 MSS(2, 2) = -1 MSS(3, 3) = 3 MSS(0, 3)的计算,因为这些不仅仅是他们孩子的最大值。对于MSS(0, 7),我们尝试将尽可能大的总和添加从间隔(1)的中间开始并向左移动的连续元素。最大值为MSS(0, 3)。接下来我们从间隔+ 1的中间开始向右走。最大值为4。将这些加在一起得到一个最大和子序列,其总和为2,大于两个子区间的最大和子序列,所以我们改为使用这个子序列。

6的推理类似。

答案 1 :(得分:2)

这实际上可以使用名为Kadane's algorithm的算法在O(n)时间内完成。如果你有兴趣,我已经写了my own version and an analysis of its complexity。我们的想法是使用动态编程来逐步改进解决方案,直到找到最佳子序列。