C# 从排序数组中选择最多5个数字的有效方法
是否有其他最佳方法可以从3个排序数组中获取5个最大值,如下代码所示: 更新:C# 从排序数组中选择最多5个数字的有效方法,c#,linq,C#,Linq,是否有其他最佳方法可以从3个排序数组中获取5个最大值,如下代码所示: 更新: 下面的代码给出了结果,但我不确定这是否是唯一的方法 输入数组可以包含重复项,但结果不能包含重复项 高效意味着我们在获得结果的同时需要更少的迭代 我正在寻找linq的具体答案 对3个数组重复5个合并排序步骤:这可以通过一个包含三个元素的数组来完成,该数组包含每个数组的最大值,然后找到最大值和最大值的索引。(如果索引为2(从0..2),则替换最后一个预排序数组中的该元素。) 使用linq[有效地]执行此操作的步骤可能需要以
对3个数组重复5个合并排序步骤:这可以通过一个包含三个元素的数组来完成,该数组包含每个数组的最大值,然后找到最大值和最大值的索引。(如果索引为2(从0..2),则替换最后一个预排序数组中的该元素。) 使用linq[有效地]执行此操作的步骤可能需要以下步骤--
- 分类
- 考虑最后五个要素
var a1_5 = a1.Reverse().Take(5).Reverse();
var a2_5 = a2.Reverse().Take(5).Reverse();
var a3_5 = a3.Reverse().Take(5).Reverse();
var resultArray = (a1_5.Union(a2_5)).Union(a3_5).OrderByDescending(x=>x).Take(5);
这样,您的排序方法“OrderByDescending”将具有更少的处理输入和更好的性能。从已排序数组中找出前5个元素的最佳方法是比较每个数组的最后一个元素get max和离开前一个已创建元素的每个数组的最后一个元素 下面是执行此任务的两种方法第一种方法仅使用基本类型,是最有效的方法,没有额外的循环,没有额外的比较,没有额外的内存消耗,只需传递需要与另一个匹配的元素的索引,并计算每个给定数组下一个要匹配的索引 第一个是这样的:通过链接:- 第二个是:-
int[] Array1 = { 09, 65, 87, 89, 888 };
int[] Array2 = { 1, 13, 33, 49, 921 };
int[] Array3 = { 22, 44, 66, 88, 110 };
int [] MergeArr = Array1.Concat(Array2).Concat(Array3).ToArray();
Array.Sort(MergeArr);
int [] Top5Number = MergeArr.Reverse().Take(5).ToArray()
您现在的方式有什么问题吗?它可以工作,但我不确定这是否是唯一最快的方式??在当前的形式中,代码排除了重复项。是故意的吗?是的,最终数组必须包含唯一的元素。这是一种不好的性能评估方法。首先根据客户可接受的内容设定目标,然后衡量是否达到目标。如果你已经实现了你的目标,那就花你宝贵的时间去担心其他事情。如果你还没有达到你的目标,那么就用一个分析器来找出最慢的事情并解决它。这不可能是程序中最慢的事情。+1表示最佳解决方案。OP需要唯一的值,所以算法可能需要5个以上的步骤才能完成。@DnshPly9这样问没有多大意义。如果您需要一些自定义算法,通常最好是强制编写,而不使用LINQ。这是因为LINQ不是为编写定制高效的低级算法而设计的,而且它也不擅长。但是您可以使用与LINQ兼容的方式编写它,例如
new[]{a1,a2,a3}.Select(a=>a.Reverse()).Merge().Take(5)
(其中Merge()
是您将编写的实现合并排序的方法)。这就是你要找的吗?是的,这是一个明显的优化,但OP表示不能保证a1
没有重复项。另外,最后一个倒转是毫无意义的(下一步就是排序)
int[] Array1 = { 09, 65, 87, 89, 888 };
int[] Array2 = { 1, 13, 33, 49, 921 };
int[] Array3 = { 22, 44, 66, 88, 110 };
int [] MergeArr = Array1.Concat(Array2).Concat(Array3).ToArray();
Array.Sort(MergeArr);
int [] Top5Number = MergeArr.Reverse().Take(5).ToArray()