关于不定长数组(大数组)求平均值的算法!!!!
应用环境是工作某个工作状态时,会不断产生一些数,这些数的个数是不确定的,和工作时间有关系,时间长数的数目就多些,时间短数的数目就少点!根据需要要求这些数的平均值。即是工作这段时间的产生这些数的平均值!基本上一秒钟会产生1~2个数,一般工作时间是1小时到8小时不等!
现在我的目的是想求这么多数的平均值,跟应用有关系!目的是找到个即节省资源,又不至于结果偏差太大的方法!!不知道如何处理这类东西的!
[解决办法]
没完全看明白楼主的需求,
节省资源的话只能用时间换空间了
楼主说的数是什么类型的数?应该是实数吧?
2 * 3600 * 8也不算大,一个32位的int就可以了
比如:
楼主可以维护一个cnt记录当前数据的个数,evr记录当前的平均值
然后每增减一个新数据val时,更新这个cnt和evr的值即可
erv += ((val - erv) / ++cnt);
[解决办法]
楼主的如果每秒钟得到数字有个范围的话(比如0到9之间的数字),应该还是蛮好解决的。比如,5秒钟内得到的数字是:
2
2
5
3
3
那么可以先创建一个数组a[10],如果得到的数字是2,那么就a[2]++,如果得到的数字是5,那么就a[5]++..用这种办法记录数字出现的次数。需要计算平均值的时候,就可以这么做:
数字 * 数字出现的次数 / 总的数字出现次数。以上面给出的数字为例,就可以这么写:
2 * 2 / 5 + 3 * 2 / 5 + 5 * 1 / 5 = 3
这样可以避免大数的运算。但前提条件是要知道每次得到数据的范围,才会比较方便。
仅提供一个思路,供楼主参考。
[解决办法]
int main()
{
int cnt = 0;
double evr = 0;
int i;
double d[] = {1234.5678, 1.23, 454.42, 178674.5843, 343.99};
//模拟,每产生一个数就更新这个cnt和evr
for (i = 0; i < sizeof(d) / sizeof(d[0]); ++i)
{
evr = evr + ((d[i] - evr) / ++cnt);//防止相加导致溢出
}
cout<<evr<<endl;
system("pause");
return 0;
}
如果产生的数都在380左右
可以这样
//初始值
remain = 0;
count = 0;
//开始产生数
num//产生的数
++count;//记录数据的个数
remain = remain + 380 - num;
//数据产生完后
average = 380 + remain / count;