Moving Average from Data Stream

easy queue design sliding window

Problem

Given a window size size, design a class that returns the moving average of the last size values from a number stream.

Inputsize = 3, stream = [1, 10, 3, 5]
Output[1.0, 5.5, 4.67, 6.0]
Keep a queue of the last 3 values plus a running sum.

from collections import deque

class MovingAverage:
    def __init__(self, size):
        self.size = size
        self.q = deque()
        self.s = 0
    def next(self, val):
        self.q.append(val)
        self.s += val
        if len(self.q) > self.size:
            self.s -= self.q.popleft()
        return self.s / len(self.q)
class MovingAverage {
  constructor(size) { this.size = size; this.q = []; this.s = 0; }
  next(val) {
    this.q.push(val);
    this.s += val;
    if (this.q.length > this.size) this.s -= this.q.shift();
    return this.s / this.q.length;
  }
}
class MovingAverage {
    private Deque<Integer> q = new ArrayDeque<>();
    private int size; private double sum = 0;
    public MovingAverage(int size) { this.size = size; }
    public double next(int val) {
        q.offer(val); sum += val;
        if (q.size() > size) sum -= q.poll();
        return sum / q.size();
    }
}
class MovingAverage {
    queue<int> q;
    int size; double sum = 0;
public:
    MovingAverage(int size) : size(size) {}
    double next(int val) {
        q.push(val); sum += val;
        if ((int)q.size() > size) { sum -= q.front(); q.pop(); }
        return sum / q.size();
    }
};
Time: O(1) per call Space: O(size)