最大和连续子序列为零?

Maximum sum contiguous subsequence is zero?

我试图了解这个问题的解决方案:"Given a sequence of numbers, find the maximum sum of a contiguous subsequence of those numbers."我在下面引用了一个解决方案和解释。

我不明白的是,在行 "maxendinghere = max(maxendinghere + s, 0)" 中,为什么 maxendinghere 永远为零?

def max_sum_subsequence(seq):
    maxsofar = 0
    maxendinghere = 0
    for s in seq:
        # invariant: maxendinghere and maxsofar are accurate
        # are accurate up to s
        maxendinghere = max(maxendinghere + s, 0)
        maxsofar = max(maxsofar, maxendinghere)
    return maxsofar

网站的解释是"Well, essentially maxendinghere is what’s accumulating the subsequences — it keeps rolling the next element into itself. Should this accumulated sum ever become negative we know that the subsequence-which-ends-here we’re currently tracking is worse than the empty subsequence-which-restarts-here; so we can reset our subsequence accumulator, and the first clause of the loop invariant still holds."

我不明白的是,假设我的序列是 2 -3 4:为什么 maxendinghere 永远为零?没有和为零的子序列。

(引自:http://wordaligned.org/articles/the-maximum-subsequence-problem

在您的示例 2 -3 4 中,问问自己,以索引 1 结尾的最大总和是多少? 2 - 3-1-3 本身就是 -3。所以我们的最大总和是空总和,它选择 no 个元素,因此总和为 0.

记住,空子序列总是有可能的,sum 操作的标识值为 0。因此,例如,-2 -4 -3 中连续子序列的最大和就是 0 ,空子序列的总和。

验证这一点:

>>> max_sum_subsequence([-2, -4, -3])
0
>>> sum([]) == 0
True

要更改算法以使子序列的长度至少为 1,您可以通过更改两行代码来实现。

首先,将 maxsofar 的初始化更改为第一个元素或 None 如果它不存在。您可以使用您选择的任何默认值,而不是 None。默认值是为空输入序列返回的值。

maxsofar = seq and seq[0] or None

其次,将赋值更改为 maxendinghere 以强制它包含序列中至少一个元素的值:

maxendinghere = max(maxendinghere + s, s)