2016-12-15 13 views
1

リスト内の異なる持続時間について最大の平均値を取得しようとしています。 最大平均値系列をリストに並べる

のは、私は次のようなデータを持っているとしましょう:以下のリストを生成

var randomList = new List<int>(); 
var random = new Random(1969); 

for (var i = 0; i < 10; i++) 
{ 
    randomList.Add(random.Next(0, 500)); 
} 

を:私は別のセット0-9のための最高の平均値を取得しようとしている

190 
279 
37 
413 
90 
131 
64 
129 
287 
172 

セット0(行中の1つの項目)= 413(指標3)

セット1(行中の2つの項目)= 252(平均インデックス3,4)

セット9(10件のアイテム1行で)= 179(リスト全体の平均)

私はこれをしばらく頭を打ちました。私はこれを書くための効率的な方法を見つけようとしているので、できるだけ少ないトラバーサルを持っています。プロダクションでは、私は3500〜6000点のリストを持っています。

どのようにして、0〜9の異なるセットの平均値が最も高いのですか?

+0

一般的にセットの「最高平均」をどのように計算していますか?そのための彼らの任意の方程式ですか?あなたの側からの努力以上に? –

+0

413より大きい数字が1つもない2列のアイテムに対して、どのようにして503を試しましたか? (それはちょうど合計で、平均ではありません) – DavidG

+0

@ un-luckyただのシリーズのアイテムのための平均。したがって、平均(アイテム:0,1,2)対平均(アイテム:1,2,3)対平均(アイテム:2,3,4)それは3つの項目のための行です。 私はトンを試しましたが、それは愚かなコードであり、動作しません。 – Nate

答えて

1

これはおそらくそれを行うための最も効率的な方法ではありませんが、それは正常に動作します:

基本的に、我々は我々が通過したアイテムを追跡するためにスタックを使用しています。最後にnの平均を計算すると、スタックからのnのアイテムが表示されます。

void Main() 
{ 
    var randomList = new List<int>(); 
    var random = new Random(1969); 

    for (var i = 0; i < 10; i++) 
    { 
     randomList.Add(random.Next(0, 500)); 
    } 

    // Use the values from the original post for validation 
    randomList = new List<int> { 190, 279, 37, 413, 90, 131, 64, 129, 287, 172 }; 

    const int numSets = 9; 
    var avgDict = Enumerable.Range(1, numSets).ToDictionary(e => e, e => (double)0); 
    var s = new Stack<int>(); 
    foreach (var item in randomList) 
    { 
     s.Push(item); 
     for (var i = 1; i <= numSets; i++) 
     { 
      if (s.Count >= i) 
      { 
       var avg = s.Take(i).Average(); 
       if (avg > avgDict[i]) 
        avgDict[i] = avg; 
      } 
     } 
    } 
    avgDict.Dump(); 
} 

結果が得られます。

1 413 
2 251.5 
3 243 
4 229.75 
5 201.8 
6 190 
7 183.714285714286 
8 178.75 
9 180 

我々は唯一の9-10アイテムを必要とするとき、私は、大規模なリストのためのStackを使用しての意味に関してはわかりませんよ。あなたのコメントでカスタム限られたサイズのスタック

+0

意図的にrandomListを新しいリストに2回設定しましたか?それは値を追加するforループを完全に上書きしているためです... –

+0

また、コードダンプは誰にも役立ちません。この質問はtopcから外れており、閉じなければなりません。 – DavidG

+0

@ChrisThompsonはい、出力を検証するために質問ごとに 'ランダム'値を再現することが意図的でした。 – Rob

1

のために良いケースであるかもしれない、あなたは、これはあなたが望むものであるかどうかわからないAvg(items:0,1,2) vs Avg(items:1,2,3) vs Avg(items:2,3,4)

を述べたが、私はこの思い付きました。

まず、乱数を取得して平均3つの数値を取得します。次に、最大の平均値を取得します。

static void Main(string[] args) 
    { 
     var randomList = new List<int>(); 
     var random = new Random(1969); 
     int TotalRandomNumber = 10; //Change this accordingly 
     for (var i = 0; i < TotalRandomNumber ; i++) 
     { 
      randomList.Add(random.Next(0, 500)); 
     } 

     foreach (var item in randomList) 
     { 
      Console.WriteLine("Random Number: " + item); 
     } 

     var AveNum = new List<double>(); 
     int range = 3; //Change this for different range 
     for (int i = 1; i < TotalRandomNumber - range; i++) 
     { 
      var three = randomList.GetRange(i, range); 
      double result = three.Average(); 
      Console.WriteLine("Average Number: " + result); 
      AveNum.Add(result); 
     } 

     Console.WriteLine("Largest: " + AveNum.Max()); 
    } 
関連する問題