【问题标题】:Search in multidimensional array in C#在 C# 中搜索多维数组
【发布时间】:2011-04-07 12:29:25
【问题描述】:

我有一个多维数组

int[,] PDATVL = new int[100,2];

假设虚拟数据为:

249 398
249 423
249 448
249 473
249 498
251 17
251 42
251 325
252 142
252 418
253 194
254 7
254 319
255 81
255 378

现在我想在数组中搜索 251、142 对。 除了线性搜索之外,最好的方法是什么。

【问题讨论】:

  • 这没有意义。数组包含整数;我们怎样才能找到一对?
  • 线性搜索有什么问题?
  • 数组总是按词法排序吗?
  • 内容是否以某种方式排序?如果没有,你不能比线性搜索做得更好。
  • @Erno:有两列整数,每一行代表一对整数。

标签: c# .net linq search multidimensional-array


【解决方案1】:

鉴于数组按词法顺序排序,您有两种选择:

  1. 编写一个适用于二维数组的自定义二分搜索方法。
  2. 编写一个存储一对整数并实现IComparable<T>IEquatable<T>的结构体

我会选择第二个选项。这种结构的基本实现是:

public struct Pair : IComparable<Pair>, IEquatable<Pair>
{
    private readonly int x;
    private readonly int y;

    public Pair(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public int X { get { return x; } }
    public int Y { get { return y; } }

    public int CompareTo(Pair other)
    {
        return (x == other.x) ? y.CompareTo(other.y) : x.CompareTo(other.x);
    }

    public bool Equals(Pair other)
    {
        return x == other.x && y == other.y;
    }
}

现在您可以使用Array.BinarySearch 方法:

var pairs = new[] {new Pair(1, 1), new Pair(1,2), new Pair(1, 3), new Pair(2, 3), new Pair(2, 4)};

// Returns 2
int index1 = Array.BinarySearch(pairs, new Pair(1,3));

// No match. Returns a negative number.
int index2 = Array.BinarySearch(pairs, new Pair(1, 4));

【讨论】:

    【解决方案2】:

    如果您正在使用对,为什么不使用该结构

    HashSet<KeyValuePair<int, int>>  
    

    List<KeyValuePair<int, int>>
    

    如果不在 .NET 4 中。

    然后你可以像这样搜索一对:

    pairs.Where(p=> p.Key == 251 && p.Value == 142); 
    

    【讨论】:

    • HashSet&lt;T&gt; 已在 .NET 3.5 中可用。如果你使用哈希集,你应该使用Contains()方法(O(1))而不是Where()(O(n))。
    【解决方案3】:

    如果数组已排序,则可以使用二分查找。

    内置方法Array.BinarySearch只处理一维数组,所以你必须自己实现。

    【讨论】:

      【解决方案4】:

      如果对中的每个值都有一个最大值,那么您可以将它们组合成一个值,如下所示:

      long pair = value1 * 10000000 + value2; // assuming value2 < 1000000
      

      然后将它们存储在 Dictionary(或 .NET 4 中的 HashSet)中,因此搜索是 O(1):

      var d = new Dictionary<long, object>;
      long pair1 = 251 * 1000000 + 142;
      d.Add(pair1, null);
      long pair 2 = ....
      // ...
      
      var exists = d.ContainsKey(pair1); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-03
        • 2016-09-19
        • 2017-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多