最小和子向量的算法

Posted

技术标签:

【中文标题】最小和子向量的算法【英文标题】:Algorithm for minimum sum subvector 【发布时间】:2011-06-23 02:38:33 【问题描述】:

编程珍珠第8栏发现的问题如下:

给定实向量 x[n],计算在任何连续子向量中找到的最大和。

提供的最终解决方案的复杂度为 O(n),如下所示:

std::vector<int> x;
int max_so_far = 0;
int max_here = 0;
for (std::size_t i = 0; i < x.size(); ++i)

   max_here = std::max(max_here + x[i], 0);
   max_so_far = std::max(max_so_far, max_here);

我想知道如何修改上述算法以提供最小总和

【问题讨论】:

设置 x[n] = -x[n] 并运行最大总和... 您可以将所有向量元素乘以 -1,通过上面的代码运行向量,然后再次将找到的总和乘以 -1。 @Reyzooti - 我有一个疑问。术语“子向量”是否仅包括从位置 0 开始的向量? 如果您的向量包含所有负数,您的代码将失败。它将报告最大值为 0。通过使 max_so_far 的初始值等于最小整数来更正。 @Jim:如果子向量可能包含长度为零的子向量,那么当所有数字为负时,0 确实是最大和。所以是正确的。 【参考方案1】:

你只需要将x中每个元素的符号取反,然后运行算法:

std::vector<int> x;
int max_so_far = 0;
int max_here = 0;

for (std::size_t i = 0; i < x.size(); ++i) x[i] = -x[i];

for (std::size_t i = 0; i < x.size(); ++i)

   max_here = std::max(max_here + x[i], 0);
   max_so_far = std::max(max_so_far, max_here);


int min_so_far = -max_so_far;

【讨论】:

这行不通。负数和零的最大值将始终为零。 @Neo:是的,因此我将x元素的符号倒置了。 @Moron - 没错。这让我很困惑。 如果所有元素都是负数,它将返回 0。我们应该从 max_so_far = max_here = -infinity 开始...当然,您可以考虑 no 元素的总和为零并考虑该有效输出。 0 个元素的子数组的最大和为 0,因为你什么都不求和。

以上是关于最小和子向量的算法的主要内容,如果未能解决你的问题,请参考以下文章

LSSVM回归预测基于matlab人工蜂群算法优化最小二乘支持向量机LSSVM数据回归预测含Matlab源码 2213期

LSSVM回归预测基于matlab灰狼算法优化最小支持向量机GWO-LSSVM数据预测含Matlab源码 2259期

LSSVM回归预测基于matlab灰狼算法优化最小支持向量机GWO-LSSVM数据预测含Matlab源码 2259期

这个计算向量中值的最小差的函数的算法复杂度是多少?

LSSVM回归预测基于matlab天鹰算法优化最小二乘支持向量机AO-LSSVM数据回归预测含Matlab源码 1848期

LSSVM回归预测基于matlab天鹰算法优化最小二乘支持向量机AO-LSSVM数据回归预测含Matlab源码 1848期