ปัญหา
ให้สตรีมตัวเลข ต้องการแสดงค่าเฉลี่ยสะสมหลังจากเพิ่มตัวเลขแต่ละตัว
ตัวอย่าง: 24, 76, 29, 63, 88
- หลัง 1 ตัว: 24
- หลัง 2 ตัว: (24+76)/2 = 50
- หลัง 3 ตัว: (24+76+29)/3 = 43
- หลัง 4 ตัว: (24+76+29+63)/4 = 48
- หลัง 5 ตัว: (24+76+29+63+88)/5 = 56
อัลกอริทึม
ใช้สูตรอัปเดตแบบทบต้น (Incremental Average):
average_new = (average_old * i + new_value) / (i + 1)
โดย i = จำนวนตัวที่ผ่านมา (เริ่มจาก 0)
วิธีนี้ไม่ต้องเก็บผลรวมทั้งหมด ลดปัญหา Overflow และคำนวณได้เร็ว
ตัวอย่างโค้ด C++
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int arr[] = {24, 76, 29, 63, 88};
int n = sizeof(arr) / sizeof(arr[0]);
double average = 0;
cout << fixed << setprecision(2);
for (int i = 0; i < n; i++) {
average = (average * i + arr[i]) / (i + 1);
cout << "Average of " << (i+1) << " numbers: " << average << endl;
}
return 0;
}
ผลลัพธ์
Average of 1 numbers: 24.00 Average of 2 numbers: 50.00 Average of 3 numbers: 43.00 Average of 4 numbers: 48.00 Average of 5 numbers: 56.00
การประยุกต์ใช้
- เหมาะสำหรับสตรีมข้อมูลขนาดใหญ่หรือไม่รู้ขนาดล่วงหน้า
- ใช้ได้กับทุกชนิดข้อมูลตัวเลข (int, float, double)
- ประยุกต์ได้กับ Moving Average, Exponential Moving Average