移动物品的平均值

时间:2013-07-08 02:13:09

标签: c++ c

我需要制作一个有效的算法,用于移动整数。

例如,平均100件物品。 因此,当100个数字出现时,平均为1..100个数字.. 因为101数平均为2..101 .. 因为102号的平均值为3..102 ..

我想到了一个解决方案,但我不能提出以便可以存储最小数量(就像在病房之后,我必须在微处理器中做,但首先,在C / C ++中有效):

步骤1:存储1..100的数字并取平均值 步骤2:将101替换为101,取平均值:101,2,3 ... 100 步骤3:将102替换为102,取平均值:101,102,3,4 ... 100

但它效率不高,因为我还需要使用较少的除法运算符。

请有人帮帮我。

2 个答案:

答案 0 :(得分:2)

您的基本方法很好:使用包含100个元素的循环缓冲区。一个关键的洞察力:说你在“替换2乘102”阶段,2是50而102是70 - 总数将改变+20的差异:你只需将新总数除以100得到新的平均,没有再次添加所有元素。

如果分裂速度太快,那么你的整体表现会产生重大且有问题的差异,那么只有几件事你可以尝试(但要测量一下 - 它们实际上可能会变慢根据您的确切硬件,您可以下载:

  • 如果数字范围很小,你可以创建一个从值到100的值的查找表(即数组),然后通过添加/删除这些缩放值到总直接维持平均值< / p>

  • 使用float或double类型检查你的系统是否更快(违反直觉,某些系统)

  • 在网上有一些奇怪的“食谱”除以100,例如来自http://embeddedgurus.com/stack-overflow/2009/06/division-of-integers-by-constants/(((((uint32_t)A * (uint32_t)0x47AF) >> 16U) + A) >> 1) >> 6

答案 1 :(得分:1)

进行移动平均线的最简单方法是移动总和。将数字n [0]到n [99]相加以开始;平均值是这个总和除以100.对于下一个总和,减去n [0]并加上n [100];再次将100除以平均值。

这对整数最有效,因为总和中不会有任何舍入误差;浮点数随着你的进展,任何错误都会累积并变得更糟。

如果您使用正整数,则可以通过使窗口大小为2的幂来消除除法。使用128而不是100表示​​您可以使用右移7来进行除法。

您还可以通过乘以逆来消除除法。而不是除以100,乘以1/100。如果你正在使用整数,你可能需要使用固定点,如果你不小心,你也可能会用完。