有没有比天真方法更有效的方法来计算滚动最大值/最小值?

时间:2014-09-13 04:54:21

标签: c++ algorithm sorting

给出一个数字向量,例如

std::vector<double> v{6.4, 5.2, 5.7, 1.8, 8.4, 8.3, 8.0, 9.1, 4.7, 7.6};

我想计算某个窗口最大值的第二个向量。天真的方法当然是:

std::vector<double> maximums;
unsigned int window = 3;
for (unsigned int i = window - 1; i < v.size(); i++)
{
    double max = 0; // assume positive domain only
    for (unsigned int j = 0; j < window; j++)
    {
        max = std::max(max, v[i-j]);
    }
    maximums.push_back(max);
}

我在没有测试的情况下编写了上述代码;请原谅错别字和基本错误 - 我只是想传达天真方法的要点。

是否有更有效的方法?

起初我想,“当然,只需保留一个排序列表,同时跟踪指向最后一个插入元素的迭代器,并在每次remove() a时push()该元素新的价值。“但这将涉及插入工作(我相信是O(log n)),也许可以用于删除,我不确定。这实际上会比天真的方法更有效吗? (当然不是更具可读性。我承认这一切都是过早的优化而且在我的情况下实施的愚蠢,但我只是好奇。想象一下数百万的数值,并试图一次最多滚动1,000个 - 在这种情况下,不需要更有效的算法吗?)

0 个答案:

没有答案