C# C如何使递归函数返回整数数组中第n个最常见的整数
C如何使递归函数返回整数数组中第n个最常见的整数 我正在使用c,我正在寻找内存效率最高的方法,根据整数数组中整数的出现频率对整数列表进行排序,然后返回第n个数组元素,其中第n个是整数,表示选择的降序键最常用的整数、第2个最常用的整数、第3个最常用的整数等 我可以用linq做这样的事情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
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个最常见的之间有任何简单的循环关系。我认为记忆膨胀实际上来自,另一方面,我甚至不认为递归操作会更有效,相反,我从审阅者那里得到的评论是,当代码在数组中大量元素上运行时,会占用太多内存。我应该分析代码在执行期间如何分配和释放内存。我只是不知道如何使它更有效地使用内存。递归函数的意义是什么?那个需求可以被消除吗?递归需求可以被消除,因为它是一个建议,但它在这里似乎并没有优点。