2012-11-02 35 views
1

我正在研究计算数组的多个平均最大值的算法。该阵列包含时间/价值对,例如5小时内Garmin设备上记录的HR数据。数据大约每秒一次,但是没有保证频率。一个例子是10分钟平均最大值,这是最大平均10分钟持续时间值。假设“平均值”只是本次讨论的平均值。期望的平均最大值的持续时间是任意的,1分钟,5分钟,60分钟。而且,我可能需要其中的很多 - 至少30个,但如果不是一个冗长的请求,最好是任何需求。数组值的平均最大子集

现在我有一个简单的算法来计算价值:

1)开始在阵列的开头和“走”着,直到子集等于或1元过去所需的持续时间。如果到达数组的末尾,则停止。

2)找出这些子集值的平均值。如果大于当前最大值,则存储为最大平均值。

3)从阵列左侧移出一个值。

4)从1开始重复,直到数组结束。

它基本上计算每个可能的连续平均值并返回最大值。 它在每个持续时间都这样做。它可以连续计算一个实际的平均值计算,而不是通过移除左边的点并加上右边来以某种方式滑动它,就像人们可以为简单移动平均值系列做的那样。根据总阵列大小,每个平均最大值需要大约3-10秒。

我想知道如何优化这个。例如,所有平均最大值的序列将是1s值最高的指数曲线,并且下降直到满足整个平均值。该曲线和所有值是否可以从一定数量的点内插?还是对上面的重计算还有其他一些优化但仍然保持准确性?

回答

1

“它会连续计算一个实际的avg计算,而不是通过删除左边的点和增加右边来以某种方式滑动它,就像一个简单的移动平均值系列一样。”

为什么不只是滑动它(即保持一个运行总和除以该总和中元素的数量)?

+0

这就是我在该声明中暗指的,但保持运行总和而不仅仅是运行平均值是我失去了做这项工作的一块。谢谢。我会测试它,看看如何提高性能。仍然对其他想法开放。 – Miro

+0

伟大的开始,这个滑动平均更新已经大大提高了性能。特别是对于更大的细分市场,它不是计算数千点的平均值,而是只进行3次算术计算。 – Miro