【问题标题】:Efficiently selecting from subsets of a list有效地从列表的子集中进行选择
【发布时间】:2019-04-19 05:12:22
【问题描述】:

给定一个向量列表,我如何有效地选择一个属性的所有最大值,以及在不同属性之间共享其他值的所有成员。

例如,使用标准 Vector3,我将如何选择相对于所有其他具有相同 X 和 Z 值的成员具有最大 Y 值的 Vector3。

我目前的工作方法是像这样遍历列表:

Vector3 current = Vector3.Zero;
List<Vector3> out = new List<Vector3>();
foreach(var member in MyList)
{
    current= member;
    foreach(var compare in MyList)
    {
        if(!predicate(current,compare))
            current = compare;
    }
    out.Add(largest);
}

但这似乎不是特别有效,因为它执行 n 平方比较,其中 n 是列表的长度。

关于将其减少到更可行的数字的任何建议,因为我打算在我的代码的性能关键部分使用它。

对于X和Z值相等的谓词,Y的最大值

示例输入:

(1,1,1)
(1,2,1)
(1,4,1)
(2,3,2)
(2,5,2)
(1,4,2)
(1,2,2)
(1,1,2)
(2,5,1)
(2,4,1)
(2,9,1)

预期输出:

(1,4,1)
(2,5,2)
(1,4,2)
(2,9,1)

【问题讨论】:

  • 你为什么不使用 linq?
  • 请你添加一个例子,作为输入,除了作为输出你做什么
  • 我已经在没有 LINQ 的情况下把它写出来了。我不知道用 LINQ 压缩它的方法,因此问题
  • 在您的示例中,predicate 是什么?
  • @MohamadMousheimish 示例进出添加

标签: c# list performance linq


【解决方案1】:

您可以为此使用 LINQ:

var result = vectors
    .GroupBy(v => Tuple.Create(v.X, v.Z))
    .Select(vg => vg.OrderByDescending(v => v.Y).First())
    .ToList();
  • GroupBy 将使用 XZ 的元组作为键。
  • 从每个组中,我们SelectY 值最大的值。

Try it online

【讨论】:

  • 非常好!我喜欢这个主意。
  • 对此只有一个问题,GroupBy 在幕后是否比我设置的更高效,执行 n^2 比较?
  • @Azeranth 您在问题中给出的示例实际上并没有返回与您“预期”相同的列表,因此我无法真正准确地比较时间。
猜你喜欢
  • 1970-01-01
  • 2016-03-18
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
相关资源
最近更新 更多