在整数列表中查找模式

时间:2015-06-16 03:54:35

标签: c# arrays list sorting mode

如何找到数字列表的模式?我知道它的逻辑(我认为),但我不知道如何实现该逻辑或将我的大脑思考转换为可行的代码。

这就是我所知道的:

我需要一个循环遍历列表一次,看看一个数字重复多少次,一个数组来保存一个数字重复的次数。我还需要告诉我的程序在找到较大的程序后丢弃较少的数量。

3 个答案:

答案 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;