Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C如何使递归函数返回整数数组中第n个最常见的整数_C#_Linq_Sorting - Fatal编程技术网

C# C如何使递归函数返回整数数组中第n个最常见的整数

C# C如何使递归函数返回整数数组中第n个最常见的整数,c#,linq,sorting,C#,Linq,Sorting,C如何使递归函数返回整数数组中第n个最常见的整数 我正在使用c,我正在寻找内存效率最高的方法,根据整数数组中整数的出现频率对整数列表进行排序,然后返回第n个数组元素,其中第n个是整数,表示选择的降序键最常用的整数、第2个最常用的整数、第3个最常用的整数等 我可以用linq做这样的事情 public static void Main(string[] args) { int x = NthMostCommon(new int[] { 5, 4, 3, 2, 1, 5, 4, 3, 2, 5

C如何使递归函数返回整数数组中第n个最常见的整数

我正在使用c,我正在寻找内存效率最高的方法,根据整数数组中整数的出现频率对整数列表进行排序,然后返回第n个数组元素,其中第n个是整数,表示选择的降序键最常用的整数、第2个最常用的整数、第3个最常用的整数等

我可以用linq做这样的事情

public static void Main(string[] args)
{
    int x = NthMostCommon(new int[] { 5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5 }, 2);
    Console.WriteLine(x);
}

private static int NthMostCommon(int[] a, int k)
{
    int result = 0;
    var query = a.GroupBy(item => item).OrderByDescending(g => g.Count());
    if (query.Count() >= k)
    {
        result = query.ElementAt(k - 1).Key;
    }
    return result;
} 
这是可行的,但有人告诉我,在处理较大的整数数组时,这不是获得所需结果的最有效的内存方式。我看不出如何减少内存占用。我必须迭代整个数组,不管大小如何。是吗

有什么想法吗


提前感谢。

本文可能会对您有所帮助

最常见的整数可能超过1个整数。请参阅代码中的int数组,因此我让函数返回int[],而不仅仅是int

我还有GroupBy,在最坏的情况下,输入数组中相同的整数可能与前一个相同。你也可以重写它

    public static void Main(string[] args)
    {
        int[] x = NthMostCommon(new int[] { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6 }, 2);
        Console.WriteLine(x);
    }

    private static int[] NthMostCommon(int[] a, int k)
    {

        var query = GroupAndCount(a)
            .GroupBy(x => x.Value)
            .ToDictionary(x => x.Key, x => x.Select(n => n.Key))
            .OrderByDescending(x => x.Key);
        if (query.Count() >= k)
        {
            return query.ElementAt(k-1).Value.ToArray();
        }
        return null;
    }

    public static IEnumerable<KeyValuePair<T, int>> GroupAndCount<T>
    (IEnumerable<T> source)
    {
        Dictionary<T, int> dictionary =
            new Dictionary<T, int>();
        foreach (T element in source)
        {
            if (dictionary.ContainsKey(element))
            {
                dictionary[element]++;
            }
            else {
                dictionary[element] = 1;
            }
        }
        return dictionary;
    }

我想这只是一个关于排序算法的问题。关于这个领域有大量的文献,我认为这个问题超出了目的。我不认为第i个最常见的和第i+1个最常见的之间有任何简单的循环关系。我认为记忆膨胀实际上来自,另一方面,我甚至不认为递归操作会更有效,相反,我从审阅者那里得到的评论是,当代码在数组中大量元素上运行时,会占用太多内存。我应该分析代码在执行期间如何分配和释放内存。我只是不知道如何使它更有效地使用内存。递归函数的意义是什么?那个需求可以被消除吗?递归需求可以被消除,因为它是一个建议,但它在这里似乎并没有优点。