這裏是我的數組:如何找到數組的模式(最頻繁的元素)?
int myArray = new int[5];
myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;
我有什麼寫,如果我希望程序找到這個陣的模式?
這裏是我的數組:如何找到數組的模式(最頻繁的元素)?
int myArray = new int[5];
myArray[0] = 1;
myArray[1] = 1;
myArray[2] = 1;
myArray[3] = 3;
myArray[4] = 5;
我有什麼寫,如果我希望程序找到這個陣的模式?
這裏的一個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。使用Max-by-count來獲取整個操作的「O(n)」,而不是由於排序而得到「O(n log n)」 - 但是LINQ中沒有方便的在線方法來實現這一點MoreLINQ有[MaxBy](http://stackoverflow.com/questions/19484563/morelinq-maxby-vs-linq-max-where)) –
@AlexeiLevenkov:好點。重複的問題有一個O(n)算法掃描列表兩次。 –
代碼工作,但如果我不需要InvalidOperationException,因爲我不需要檢查數組是否爲空?我應該刪除什麼? – puretppc
僅供參考,該語言被命名爲「C#」,而不是「C Sharp」。 –
是不是你如何發音呢? @JohnSaunders。 – puretppc
模式是數組中最常見的值@JeroenVannevel – puretppc