在 C# 中高效查找 5 个正整数数组中 3 个最高值的索引

问题描述 投票:0回答:1

其他地方有关于对 5 件事进行排序的很好的讨论,最多可以进行 7 次比较。

做我想做的事情应该更快,因为我们不关心 3 个最大整数(或 2 个最小整数)的顺序。

背景: 我的程序正在玩 Splendor 游戏,尽可能快地遍历游戏树。就在下面的代码之前,它已经填充了

var GemWeight = new int[5];

决定当前状态下采购的五种有色宝石的重要性的数组(将采购三种权重最高的颜色)。

元素非负且不大于127。

我目前正在使用此 Linq 查找前 3 个整数的数组索引(以及各自的整数):

var ThreeGemsWithIndices = 
   GemWeight
  .Select((TotalWeight, ColorIndex) => new { v=TotalWeight, ColorIndex })
  .OrderByDescending(x => x.v)
  .Take(3)
  .ToArray();

Visual Studio 分析器表示我的程序几乎 20% 的时间都花在这个 Linq 上,因此攻击的时机已经成熟。

找到最大的3个数字最快的C#算法是什么,不一定已排序,如果有平局则任意选择第3个。

例如:从数组 [2,6,10,43,6] 中,我们得到一个数组或三个包含任意顺序的 1,2,3 或 4,2,3 的变量。

[注:欢迎在“前 3 个无序”的要求内加速 Linq 的任何建议,尽管我怀疑它的速度无法与命令式解决方案相匹配。]

c# sorting
1个回答
0
投票

这里有两种可能的解决方案

  1. 如果输入数据大小为5,那么我们可以直接使用简单排序,这样更快更容易。
  2. 如果输入数据大小在未来几天内发生变化且无法控制,则使用 OrderByDescending 寻找 Linq 解决方案

简单排序的代码

    public static int[] FindTopThreeValues(int[] array)
    {
        int first = int.MinValue, second = int.MinValue, 
        third = int.MinValue;

        foreach (int num in array)
        {
            if (num > first)
            {
                third = second;
                second = first;
                first = num;
            }
            else if (num > second && num != first)
            {
                third = second;
                second = num;
            }
            else if (num > third && num != second && num != first)
            {
                third = num;
            }
        }

        return new int[] { first, second, third };
    }

使用 LINQ OrderByDescending 进行代码

var distinctValues = array.Distinct().OrderByDescending(x => x).Take(3).ToArray();
© www.soinside.com 2019 - 2024. All rights reserved.