2013-11-02 45 views
2

這裏是我的數組:如何找到數組的模式(最頻繁的元素)?

int myArray = new int[5]; 

myArray[0] = 1; 
myArray[1] = 1; 
myArray[2] = 1; 
myArray[3] = 3; 
myArray[4] = 5; 

我有什麼寫,如果我希望程序找到這個陣的模式?

+0

僅供參考,該語言被命名爲「C#」,而不是「C Sharp」。 –

+0

是不是你如何發音呢? @JohnSaunders。 – puretppc

+1

模式是數組中最常見的值@JeroenVannevel – puretppc

回答

7

這裏的一個LINQ溶液:

int mode = myArray 
    .GroupBy(x => x) 
    .OrderByDescending(g => g.Count()) 
    .First() // throws InvalidOperationException if myArray is empty 
    .Key; 

這組myArray通過值的元素,通過排序值的每個組中的號的組,取第一組的值。如果有多於一種模式,則在myArray中,這取決於先發生的任何一個(具有最低的索引)。

如果有可能比一個模式的更多,你需要所有的人,那麼你可以使用這種變化來代替:

var groups = myArray 
    .GroupBy(x => x) 
    .Select(g => new { Value = g.Key, Count = g.Count() }) 
    .ToList(); // materialize the query to avoid evaluating it twice below 
int maxCount = groups.Max(g => g.Count); // throws InvalidOperationException if myArray is empty 
IEnumerable<int> modes = groups 
    .Where(g => g.Count == maxCount) 
    .Select(g => g.Value); 

這組由價值myArray元素,找到值的最大數量任何組,並且取每個組具有最大值的數值。

如果myArray非常大,那麼第二個版本(這是O(n))可能會比第一版本快(這是O(n log n)的,由於排序)。

+1

+1。使用Max-by-count來獲取整個操作的「O(n)」,而不是由於排序而得到「O(n log n)」 - 但是LINQ中沒有方便的在線方法來實現這一點MoreLINQ有[MaxBy](http://stackoverflow.com/questions/19484563/morelinq-maxby-vs-linq-max-where)) –

+0

@AlexeiLevenkov:好點。重複的問題有一個O(n)算法掃描列表兩次。 –

+0

代碼工作,但如果我不需要InvalidOperationException,因爲我不需要檢查數組是否爲空?我應該刪除什麼? – puretppc

相關問題