计算序列中元素的平均值而不迭代它

时间:2013-03-19 20:56:28

标签: c++ algorithm stl

编写一个在其构造函数中包含步长(n)的类。该类中唯一的方法采用整数,将其添加到数字序列中,并返回插入到序列中的最后n个值的平均值。 不要迭代序列来计算平均值。

不,这不是家庭作业

以下是我在C ++中的方式:

  1. 初始化两个STL queue<int>,其中一个长度为n,名为buffer
  2. 用户 - 输入值动态存储在缓冲区中。完成此buffer后,将用户输入值添加到“sum”并减去{​​{1}}值。
  3. 将第一个值从buffer.front()推送到名为buffer的第二个queue<int>
  4. 弹出第一个值(values
  5. buffer.pop()除以sum
  6. 返回平均值

    以下是我提出的代码:

    n

    我有以下问题:

    1. 有更好的方法吗?
    2. 如果我们不允许使用STL,我会实现一个队列并将其用于#ifndef calcAverage_Window_h #define calcAverage_Window_h #include <iostream> #include <queue> using namespace std; class Window{ private: int n, sum; queue<int> values, buffer, sums; public: Window(int); float calcAverage(int); }; #endif #include "Window.h" Window::Window(int m){ n = m; buffer.push(1); buffer.push(2); buffer.push(3); sum = 6; } float Window::calcAverage(int val){ buffer.push(val); values.push(buffer.front()); sum = sum + val - buffer.front(); buffer.pop(); return float(sum)/n; //float(sum) required so that calcAverage doesn't return an int } #include "Window.h" int main() { Window w(3); cout<<w.calcAverage(4)<<endl; cout<<w.calcAverage(5)<<endl; cout<<w.calcAverage(6)<<endl; return 0; } buffer。有没有人有更好的主意?
    3. 我通过初始化values构造函数中的缓冲区而作弊。那是因为:1)我不知道我会怎么做 2)对Window(n)的情况可能很清楚,但n = 2的含糊不清。
    4. 此方法/代码将在何处失败?
    5. 我开始凭经验思考这个问题。有没有一种算法来看待这个问题?

1 个答案:

答案 0 :(得分:3)

回答你的一些问题:


  

此方法/代码将在何处失败?

好吧,假设上面的代码没有错误,如果您决定转移到浮点数据,它就不一定能正常工作。

请注意,与直接实现移动平均线相比,它的溢出行为也略有不同。


  

有没有一种算法来查看这个问题?

是。窗口大小为L,时间n和时间n-1的移动总和如下:

y[n]   = x[n] + x[n-1] + ... + x[n-L+1]
y[n-1] =        x[n-1] + ... + x[n-L+1] + x[n-L]

从另一个中减去一个等式,得到:

y[n] - y[n-1] = x[n] - x[n-L]

y[n-1]移到等号的另一边,然后就完成了。