在C#4.0中找到两个多维数组的交集

时间:2011-10-06 16:56:32

标签: c# .net-4.0 multidimensional-array intersection ranking

试图找到我的排名问题的解决方案。

基本上我有两个多维双[,]数组。两者都包含某些场景的排名,所以[排名编号,场景编号]。不止一个场景可以具有相同的排名。

我想生成第三个多维数组,取前两个多维数组的交叉点来提供联合排名。

有没有人知道如何在C#中做到这一点?

非常感谢您提供的任何建议或帮助!

修改

感谢您的所有回复,抱歉,我应该提供一个示例。

这是:

Array One:
[{0,4},{1,0},{1,2},{2,1},{3,5},{4,3}]

Array Two:
[{0,1},{0,4},{1,0},{1,2},{3,5},{4,3}]

Required Result:
[{0,4},{1,0},{1,2},{1,1},{2,5},{3,3}]

2 个答案:

答案 0 :(得分:3)

这里有一些示例代码可以做出一系列假设但可能与您正在寻找的内容类似。我也添加了一些评论:

    static double[,] Intersect(double[,] a1, double[,] a2)
    {
        // Assumptions:
        //      a1 and a2 are two-dimensional arrays of the same size
        //      An element in the array matches if and only if its value is found in the same location in both arrays
        //      result will contain not-a-number (NaN) for non-matches
        double[,] result = new double[a1.GetLength(0), a1.GetLength(1)];
        for (int i = 0; i < a1.GetLength(0); i++)
        {
            for (int j = 0; j < a1.GetLength(1); j++)
            {
                if (a1[i, j] == a2[i, j])
                {
                    result[i, j] = a1[i, j];
                }
                else
                {
                    result[i, j] = double.NaN;
                }
            }
        }
        return result;
    }

在大多数情况下,找到多维数组的交集将涉及迭代数组中每个维度中的元素。如果数组的索引不是匹配条件的一部分(我的代码中的第二个假设被删除),则必须遍历每个数组中的每个维度 - 这会增加算法的运行时间(在这种情况下,来自O(n ^ 2)到O(n ^ 4)。

如果您对运行时足够关注,我相信阵列匹配是动态编程(DP)优化的典型示例之一;您可以在闲暇时阅读。

我不确定你想要的结果......你可能会返回一个可以被一对索引的平面结果集合,如果预期的结果集通常很小,这可能会节省大量空间。我选择了第三个固定大小的阵列,因为这是最简单的事情。

最后,我要提到的是,我没有看到使用IEnumerable,LINQ或类似内容的敏锐C#方式。现在有人比我更有能力了解C#....

答案 1 :(得分:2)

鉴于附加信息,我认为你实际上并没有使用多维数组,而是使用了一组对。这对是一对双打。我认为以下内容应该很好用:

public class Pair : IEquatable<Pair>
{
    public double Rank;
    public double Scenario;

    public bool Equals(Pair p)
    {
        return Rank == p.Rank && Scenario == p.Scenario;
    }

    public override int GetHashCode()
    {
        int hashRank= Rank.GetHashCode();
        int hashScenario = Scenario.GetHashCode();
        return hashRank ^ hashScenario;
    }
}

然后,您可以在IEnumerable上使用Intersect运算符:

List<Pair> one = new List<Pair>();
List<Pair> two = new List<Pair>();
// ... populate the lists
List<Pair> result = one.Intersect(two).ToList();

有关更多信息,请查看以下有关Enumerable.Intersect()的msdn文章: http://msdn.microsoft.com/en-us/library/bb910215%28v=vs.90%29.aspx