我想找到数组中的众数。我知道我必须执行嵌套循环来检查每个值并查看数组中元素出现的频率。然后我必须计算第二个元素出现的次数。下面的代码不起作用,请任何人帮助我。
for (int i = 0; i < x.length; i ++)
{
x[i]++;
int high = 0;
for (int i = 0; i < x.length; i++)
{
if (x[i] > high)
high = x[i];
}
}
使用嵌套循环并不是解决这个问题的好方法。它的运行时间为 O(n^2) - 比最佳 O(n) 差得多。
您可以使用 LINQ 将相同的值分组,然后找到计数最大的组:
int mode = x.GroupBy(v => v)
.OrderByDescending(g => g.Count())
.First()
.Key;
这既简单又快捷。但请注意(与 LINQ to SQL 不同),当仅需要第一个结果时,LINQ to Objects 当前不会优化 OrderByDescending。它对整个结果集进行完全排序,这是一个 O(n log n) 操作。
您可能需要这种 O(n) 算法。它首先在组中迭代一次以查找最大计数,然后再次查找该计数的第一个对应键:
var groups = x.GroupBy(v => v);
int maxCount = groups.Max(g => g.Count());
int mode = groups.First(g => g.Count() == maxCount).Key;
您还可以使用MaxBy对 MoreLINQ 方法进行扩展,进一步改进解决方案,使其只需要遍历所有元素一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)