滚动最小值和滚动最大值为C ++提升?

时间:2013-08-09 18:10:28

标签: c++ boost max min boost-accumulators

我有一些代码使用Boost累加器来跟踪滚动窗口的平均值 - “滚动平均值”。除了滚动平均值之外,我还希望在同一个滚动窗口中跟踪最小值和最大值。

有没有办法用Boost累加器计算滚动最小值和滚动最大值?我没有看到方法...

我尝试将min和max标签添加到用于rolling_mean的累加器中,但这并没有给我我想要的东西。

typedef accumulator_set<uint32_t, stats<tag::rolling_mean> > rollingMeanAcc_t;

变为

typedef accumulator_set<uint32_t, stats<tag::rolling_mean,tag::min,tag::max> > rollingMeanAcc_t;

但是,此处提供的最小值和最大值是在整个累加器上计算的,而不是仅限于与平均值相同的滚动窗口。

Boost documentation表示在所有样本中计算最小值和最大值,不限于滚动窗口。它们似乎没有提供限制或加重样品的方法。

我希望能够在滚动窗口中报告平均值/最小值/最大值。

我目前正在使用Boost版本1.48.0。我查看了最新版本(1.54.0)的文档,但没有看到在那里实现滚动最小值/最大值。

我找到了一种跟踪sliding window minimum的非Boost方法,但这似乎也不是我想要的。我不想仅因为它们大于/小于之前的最小值/最大值而删除值,因为这会使rolling_mean不准确。

2 个答案:

答案 0 :(得分:6)

我认为累加器不能进行滚动最小/最大。

问题非常简单:根据定义,累加器只使用O(1)数据 - 它不存储正在处理的数据。它可以使用O(1)数据保持最小值或最大值,因为它只是在数字超出当前最小值/最大值范围时更改当前最小值/最大值。

但是,对于一个窗口,它需要做好相反的准备:当当前min离开窗口时,它需要找到新的最小值 - 窗口中的下一个最小数字。同样地,当然也是最大的。

现在,考虑输入被排序的最小值(例如)。每次从窗口中删除项目时,我们都会获得不同的最小值。换句话说,累加器需要将所有数据存储在窗口中以适当地保持当前最小值。同样,最大输入按降序排序。

简而言之,您不能使用累加器。您需要将所有数据存储在窗口中。

答案 1 :(得分:0)

可能有一个更聪明的算法(实际上可能存在),但是在我的脑海中,我只是将窗口存储在循环缓冲区中并按需计算滚动最小值/最大值。在窗口更改时缓存结果并设置脏标志。这给出了O(1)累加运算和具有O(K)最坏情况的分摊O(1)提取操作,其中K是窗口的大小。