2015-06-16 81 views
0

如何查找數字列表的模式?我知道它的邏輯(我認爲),但我不知道如何實現該邏輯或將我的大腦思考轉化爲可行的代碼。在整數列表中查找模式

這是我知道的:

我需要有一個循環,在列表中一次看到一個數字重複了多少遍和陣列去拯救被重複了許多的時間。我還需要告訴我的計劃,一旦找到一個較大的一個,就放棄較少的數額。

+0

是這個家庭作業?如果是這樣,您可以使用哪些庫方法有限制嗎? – phoog

回答

1

是的,你是對的:

讓我們有一個列表

List<int> myValues = new List<int>(new int[] { 1, 3, 3, 3, 7, 7 }); 

你需要有一個循環,通過列表中的一個時間的推移

foreach (var val in myValues) 
{ 
} 

看號碼是多少次重複陣列,以節省一些重複時代:

Dictionary<int, int> repetitions = new Dictionary<int, int>(); 
foreach (var val in myValues) 
{ 
    if (repetitions.ContainsKey(val)) 
     repetitions[val]++; // Met it one more time 
    else 
     repetitions.Add(val, 1); // Met it once, because it is not in dict. 
} 

現在,你的字典repetitions店多少(究竟)倍值重複。
然後,您需要找到模式的記錄(即重複時間最長的記錄(即最高值))並採取這一個。 LINQ會幫助我們 - 讓我們按值排序數組,並採取最後一個...或排序降序,並採取第一個。事實上,就結果和生產力而言,情況也是如此。

var modeRecord = repetitions.OrderByDescending(x => x.Value).First(); 
// or 
var modeRecord = repetitions.OrderBy(x => x.Value).Last(); 

這是它!這裏我們有一個模式:

List<int> myValues = new List<int>(new int[] { 1, 3, 3, 3, 7, 7 }); 
Dictionary<int, int> repetitions = new Dictionary<int, int>(); 

foreach (var val in myValues) 
{ 
    if (repetitions.ContainsKey(val)) 
     repetitions[val]++; // Met it one more time 
    else 
     repetitions.Add(val, 1); // Met it once, because it is not in dict. 
} 

var modeRecord = repetitions.OrderByDescending(x => x.Value).First(); 

Console.WriteLine("Mode is {0}. It meets {1} times in an list", modeRecord.Key, modeRecord.Value); 

你的模式計算邏輯是好的。你需要的是走自己的指令代碼:)

+0

很好的答案。更詳細,但更有效(更少的鍵查找):'int count; if(repetitions.TryGetValue(val,out count))repetitions [val] = count + 1;其他重複[val] = 1;' – phoog

3

LINQ的方法,更簡潔但幾乎可以肯定比Yeldar Kurmangaliyev的低效率:

int FindMode(IEnumerable<int> data) 
{ 
    return data 
     .GroupBy(n => n) 
     .Select(x => new { x.Key, Count = x.Count() }) 
     .OrderByDescending(a => a.Count) 
     .First() 
     .Key; 
} 

其中data爲空,這不處理的情況下,也不在數據集中具有相同頻率的兩個或多個數據點。

0

這裏是一個替代辦法LINQ:

var values = new int[] { 1, 3, 3, 3, 7, 7 }; 

var mode = 
    values 
     .Aggregate(
      new { best = 0, best_length = 0, current = 0, current_length = 0 }, 
      (a, n) => 
      { 
       var current_length = 1 + (a.current == n ? a.current_length : 0); 
       var is_longer = current_length > a.best_length; 
       return new 
       { 
        best = is_longer ? n : a.best, 
        best_length = is_longer ? current_length : a.best_length, 
        current = n, 
        current_length, 
       }; 
      }).best;