ich komme mit diesemWie kann der Durchschnitt im laufenden Betrieb effizient berechnet werden (gleitender Durchschnitt)?
n=1;
curAvg = 0;
loop{
curAvg = curAvg + (newNum - curAvg)/n;
n++;
}
Ich denke, Highlights dieser Art sind:
- Es große Zahlen vermeidet
(und möglichen Überlauf, wenn Sie und teilen sich dann summieren würde) - Sie ein Register speichern (nicht müssen die Summe speichern)
Das Problem könnte mit Summierungsfehler sein - aber ich gehe davon aus, dass es im Allgemeinen ausgeglichene Zahlen von Aufrunden und Abrunden geben sollte, so dass der Fehler nicht dramatisch zusammenfasst.
Siehst du irgendwelche Fallstricke in dieser Lösung? Haben Sie einen besseren Vorschlag?
Ich verstehe Ihre Formel nicht. Für '1 2' und' 3' als nächstes würden Sie 'curAvg = 1.5 + (3 - 1.5)/2 = 1.5 + 0.75 = 2.25' machen, was wäre falsch? – IVlad
Ähnliche Fragen: http://stackoverflow.com/questions/12636613/how-to-calculate-moving-average-witout-keeping-the-count-and-data-total –
@IVlad: Schleife 1: curAvg = 0 + (1-0)/1 = 1; n = 2
Schleife 2: curAvg = 1 + (2-1) /2 = 1,5; n = 3
Schleife 3: curAvg = 1,5 + (3-1,5)/3 = 2; n = 4 –