2011-01-20 13 views
0

I在庫の価格である数字の配列を有するで素子1のアレイの平均値を見つける:以下に示すように時間

ダブル[] XYZ =新しいダブル{10.1、20.34、35.46、78.34、 98.67、43.73 ........}

は今、私は時間に基づいて株式の平均を見つけたい:

第一分=平均(10.1)= 10.1 第二分=平均(10.1 + 20.34)= 15.22 3分=平均(10.1 + 20.34 + 35.46)= 21.96

これを行う1つの方法は、分(1,2,3,4 ...)回ループして平均を見つけることです。しかし、私のリストは非常に巨大なので、これはパフォーマンスの問題になる可能性があります。

毎回平均を見つける他の方法はありますか?

ありがとうございます。

マヘシュ

答えて

6

はい、実行中の合計を維持する:

sum = 0; 
num = 0; 

foreach (element i) 
{ 
    sum += i; 
    num ++; 
    average = sum/num; 
} 

はそれがない今までに意志オーバーフローようsumのための十分な大きさの種類を選択してください。

+0

平均値の配列を作成して、各要素を反復するときに平均値の配列を作成することもできます。 – Lazarus

+0

UIの最新の平均値のみを表示する必要があります。以下のさまざまなオプションを見て、Oliのソリューションを使用しました。これはメモリとパフォーマンスの点で最適です。 – Mahesh

+0

@Mahesh最後の平均値だけを表示しなければならない場合は、合計を計算してから**一度**に分割しなければなりません。 – Andrey

2

次の再帰式を使用して(単一パスで)O(n)でそれらを計算することができる:

Anは、n番目の分の平均、Vn手段 - n番目の分価格。

An = (An-1 * (n - 1) + Vn)/n 

したがって、ループして前に保存するAn

PS:私があなたを正しく理解していれば、1分平均ではなく毎分の平均価格を求めたいと思っています。

+0

数学的には、これは正常に動作します。実際には、これには累積的な誤差があり、結果が連続的に変化します。 –

+0

@Oli Charlesworth本当です。合計を実行するための大きな変数は必要ありません。 – Andrey

+0

また、本当です!しかし、「An-1 *(n-1)」は 'sum'と同じ大きさになります。 –

0

永続性が必要です。

おそらくオブジェクトですか? AverageObjには、カウンタと合計フィールドが含まれます。

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); 
} 
関連する問題