如何找到数字列表的模式?我知道它的逻辑(我认为),但我不知道如何实现该逻辑或将我的大脑思考转换为可行的代码。
这就是我所知道的:
我需要一个循环遍历列表一次,看看一个数字重复多少次,一个数组来保存一个数字重复的次数。我还需要告诉我的程序在找到较大的程序后丢弃较少的数量。
答案 0 :(得分:4)
采用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
为空的情况,也不处理数据集中有两个或多个具有相同频率的数据点的情况。
答案 1 :(得分: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);
您的模式计算逻辑很好。您所需要的只是在代码中遵循您自己的指示:)
答案 2 :(得分: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;