1. Brute Force — Recalculate Sum on Every Call
Intuition
Append each value to a list. Sum the last min(N, size) items on every tick.
Algorithm
- Step 1: Append value to history list.
- Step 2: Take slice of the last min(len, size) elements.
- Step 3: Sum the slice and divide by slice length.
#include <iostream>#include <vector>#include <numeric> using namespace std; class MovingAverage {private: vector<int> stream; int windowSize;public: MovingAverage(int size) : windowSize(size) {} double next(int val) { stream.push_back(val); int count = min((int)stream.size(), windowSize); double sum = 0; for (int i = stream.size() - count; i < stream.size(); ++i) { sum += stream[i]; } return sum / count; }}; int main() { MovingAverage ma(3); cout << ma.next(1) << endl; // 1.0 cout << ma.next(10) << endl; // 5.5 cout << ma.next(3) << endl; // 4.66667 cout << ma.next(5) << endl; // 6.0 return 0;}Time & Space Complexity
- Time complexity:
O(W) per call— Iterates through the last W elements on every call. - Space complexity:
O(N) total history— Stores all incoming stream values.
Why Brute Force Doesn't Scale:
For high-throughput telemetry (100,000 events/sec), O(W) causes latency buildup.
Running sum with queue takes 20 nanoseconds per event.