编写一个在其构造函数中包含步长(n)的类。该类中唯一的方法采用整数,将其添加到数字序列中,并返回插入到序列中的最后n个值的平均值。 不要迭代序列来计算平均值。
不,这不是家庭作业
以下是我在C ++中的方式:
queue<int>
,其中一个长度为n
,名为buffer
buffer
后,将用户输入值添加到“sum”并减去{{1}}值。buffer.front()
推送到名为buffer
的第二个queue<int>
values
)buffer.pop()
除以sum
以下是我提出的代码:
n
我有以下问题:
#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
。有没有人有更好的主意?values
构造函数中的缓冲区而作弊。那是因为:1)我不知道我会怎么做
2)对Window(n)
的情况可能很清楚,但n = 2
的含糊不清。答案 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]
移到等号的另一边,然后就完成了。