最大子阵列

时间:2012-06-22 17:27:13

标签: programming-pearls

在“编程珍珠”第8栏中。存在最大的子阵列问题。

问题:

输入是n个浮点数的向量x;输出是在输入的任何连续子向量中找到的最大总和。为了完成问题定义,我们可以说当所有输入都是负数时,最大和子向量是空向量,其总和为零。

最有效的解决方案:

maxsofar = 0
maxendinghere = 0
for i = [0, n)
    maxendinghere = max(maxendinghere+x[i], 0)
    maxsofar = max(maxsofar, maxendinghere)

此专栏有一个练习: 我们将负数数组的最大子向量定义为零,即空子向量的总和。 假设我们已经将最大子向量定义为最大元素的值;你会如何改变各种节目?

我对此练习有两个问题 (1)我有点困惑于“假设我们已经将最大子向量定义为最大元素的值”。这是否意味着负数数组的最大子向量是数组中最大的元素?

例如: 数组:[ - 1 - 3 - 3],最大子向量:-1 数组:[ - 1 2 3],最大子向量:[2 3]

对于这个虚假的问题,对不起,英语不是我天真的语言。

(2)作者给出了解决方案:“用maxsofar = -infinity替换赋值maxsofar = 0。”根据我对这个问题的理解,这个解决方案似乎不对。

例如: 数组:[ - 1 - 3 - 3],答案应为-1。但根据解决方案,它是0。

谢谢,

1 个答案:

答案 0 :(得分:1)

我同意你的看法。如果作者的解决方案只是改变maxsofar的初始化,那么它根本不会改变算法。