【发布时间】:2016-10-11 07:02:03
【问题描述】:
C#如何使递归函数返回整数数组中第n个最常见的整数
我正在使用 c#,我正在寻找最节省内存的方法,以按整数列表在整数数组中出现的频率对整数列表进行排序,然后返回第 n 个数组元素,其中 nth 是整数,表示降序键选择(最常用的整数、第二常用的整数、第三常用的整数等。
我可以使用 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;
}
这行得通,但有人告诉我,在处理较大的整数数组时,这不是获得所需结果的最节省内存的方法。我看不到如何减少内存占用。无论大小如何,我都必须迭代整个数组。是的?
有什么想法吗?
提前致谢。
【问题讨论】:
-
嗯,我认为这只是一个关于排序算法的问题。关于该领域有大量文献,我认为这个问题超出了 SO 目的。
-
我认为第 i 个最常见和第 i + 1 个最常见之间的循环关系并不简单。
-
我认为内存膨胀实际上来自GroupBy,另一方面我不相信递归操作会更有效(甚至相反)。
-
我从审阅者那里得到的评论是,当针对数组中的大量元素运行时,代码使用了太多的内存。我应该分析代码在执行过程中是如何分配和释放内存的。我只是不知道如何让它更有效地记忆。
-
函数“递归”的意义何在?可以消除这个要求吗?