Design a Moving Average Class for Data Stream
- 时间:2020-10-07 14:38:56
- 分类:网络文摘
- 阅读:139 次
Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window.
Example:
1 2 3 4 5 MovingAverage m = new MovingAverage(3); m.next(1) = 1 m.next(10) = (1 + 10) / 2 m.next(3) = (1 + 10 + 3) / 3 m.next(5) = (10 + 3 + 5) / 3MovingAverage m = new MovingAverage(3); m.next(1) = 1 m.next(10) = (1 + 10) / 2 m.next(3) = (1 + 10 + 3) / 3 m.next(5) = (10 + 3 + 5) / 3
Compute the Moving Average by using Array or List
The most intuitive method would be to use a vector/array/list to store the numbers. Then we can erase the begining (pop_front) if the size is larger than the window. Then we can go through the window to sum up and compute the moving average.

data-structure-window-queue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class MovingAverage { public: /** Initialize your data structure here. */ MovingAverage(int size) { sz = size; c = 0; } double next(int val) { if (c >= sz) { data.erase(data.begin()); data.push_back(val); } else { data.push_back(val); c ++; } double r = 0; for (int i = 0; i < c; ++ i) { r += data[i]; } return r / c; } vector<int> data; int sz; int c; }; /** * Your MovingAverage object will be instantiated and called as such: * MovingAverage obj = new MovingAverage(size); * double param_1 = obj.next(val); */ |
class MovingAverage {
public:
/** Initialize your data structure here. */
MovingAverage(int size) {
sz = size;
c = 0;
}
double next(int val) {
if (c >= sz) {
data.erase(data.begin());
data.push_back(val);
} else {
data.push_back(val);
c ++;
}
double r = 0;
for (int i = 0; i < c; ++ i) {
r += data[i];
}
return r / c;
}
vector<int> data;
int sz;
int c;
};
/**
* Your MovingAverage object will be instantiated and called as such:
* MovingAverage obj = new MovingAverage(size);
* double param_1 = obj.next(val);
*/The space complexity is O(W) where W is the size of the moving average window. And the time complexity is also O(W) as we need to iterate W times to compute the sum and thus the moving average.
Using Double-ended Queue to Compute the Moving Average in O(1) constant time

data-structure-deque
A better way to design the Moving Average class is to use deque (the double-ended queue). We also use a variable to store the sum of the moving average and update it when an element is pop from the begining of the queue and appended into the rear of the queue. Please note that the pop_front and push_back of the deque run at O(1) constant time – which makes the overall time complexity is O(1) and the space requirement is O(W) where we need to store all the numbers in the moving average window.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class MovingAverage { public: /** Initialize your data structure here. */ MovingAverage(int size) { M = size; } double next(int val) { if (data.size() < M) { data.push_back(val); sum += val; return (double)sum / data.size(); } sum -= data[0]; data.pop_front(); sum += val; data.push_back(val); return (double)sum / data.size(); } private: deque<int> data; int M; int sum = 0; }; /** * Your MovingAverage object will be instantiated and called as such: * MovingAverage* obj = new MovingAverage(size); * double param_1 = obj->next(val); */ |
class MovingAverage {
public:
/** Initialize your data structure here. */
MovingAverage(int size) {
M = size;
}
double next(int val) {
if (data.size() < M) {
data.push_back(val);
sum += val;
return (double)sum / data.size();
}
sum -= data[0];
data.pop_front();
sum += val;
data.push_back(val);
return (double)sum / data.size();
}
private:
deque<int> data;
int M;
int sum = 0;
};
/**
* Your MovingAverage object will be instantiated and called as such:
* MovingAverage* obj = new MovingAverage(size);
* double param_1 = obj->next(val);
*/–EOF (The Ultimate Computing & Technology Blog) —
推荐阅读:为 wordpress 文章作者在评论留言时显示“本文作者”提示 为 WordPress 主题添加花瓣飘落特效 wordpress插件:WP-China-Yes 切换WP站点与官方通信至国内节点解决后台更新429错误 一段代码轻松解决wordpress定时发布失败的问题 WordPress官网打不开 出现 429 Too Many Request 的原因 下载更新wordpress程序及插件的方法 禁用wordpress4.4+版本自动生成768w像素缩略图功能 自动为wordpress文章图片添加alt属性和title属性 如何为WordPress导航菜单、标签、出站等链接添加nofollow标签属性 如何设置WordPress的RSS feed更新频率
- 评论列表
-
- 添加评论