我有一系列数字,这些数字是股票的价格,如下所示:
double[] xyz=new double{ 10.1, 20.34, 35.46, 78.34, 98.67, 43.73 ........}
现在,我想根据时间找到股票的平均值:
第1分钟=平均值(10.1)= 10.1
第2分钟=平均值(10.1 + 20.34)= 15.22
第3分钟=平均值(10.1 + 20.34 + 35.46)= 21.96
这样做的一种方法是循环分钟次数(1,2,3,4 ...)并找到平均值。但是,由于我的列表非常庞大,这可能会成为一个性能问题。
每次都有其他方法可以找到平均值吗?
非常感谢。
马赫什
答案 0 :(得分:6)
是的,保持一笔运行金额:
sum = 0;
num = 0;
foreach (element i)
{
sum += i;
num ++;
average = sum / num;
}
为sum
选择足够大的类型,使其不会溢出。
答案 1 :(得分:2)
您可以使用以下递归公式在O(n)
(单次通过)中计算它们:
An
表示第n分钟平均值,Vn
- 第n分钟价格。
An = (An-1 * (n - 1) + Vn) / n
所以你循环并保留以前的An
。
PS :如果我理解正确你想找到每分钟的平均价格,而不是单一的平均价格。
答案 2 :(得分:0)
你需要某种形式的持久性。
也许是一个对象?包含计数器和求和字段的AverageObj。
答案 3 :(得分:0)
double[] xyz=new double{ 10.1, 20.34, 35.46, 78.34, 98.67, 43.73 ........ }
double[] averages = new double[xyz.Length];
averages[0] = xyz[0];
for(int i = 1; i < xyz.Length; i++)
{
averages[i] = (((averages[i-1] * i) + xyz[i])/i+1);
}