在C#中查找二维数组中的数字对

时间:2010-12-08 18:23:27

标签: c# search multidimensional-array

什么是快速的方式  在2维数组中找到一对数字

我有这个数组

 int[,] numbers = new int[,] { { 5, 2 }, { 5, 1 }, { 5, 0 } , ........... };

我必须使用像x,y

这样的整数

我想在数组

中返回此对apper的索引

如果该对不存在,则返回false

感谢

4 个答案:

答案 0 :(得分:1)

如果订购了数组,您可以使用二进制搜索。 否则你将不得不进行线性搜索。

答案 1 :(得分:1)

如果数组没有排序,你可以做的最好的是线性搜索 - 逐行,逐列,甚至是对角线。

如果对数组的任何一个维度进行排序,那么您可以使用二进制搜索。

如果数据是有序的并且也符合某种分布,则可以使用分布相关性查找,这可能比二进制搜索稍微有效。

答案 2 :(得分:1)

对2D数组进行排序,然后使用二进制搜索。

答案 3 :(得分:1)

“最快”是模糊的;写得最快,执行速度最快?

在无序列表中获得此速度最快的是线性的,实际的最佳和最差情况将取决于输入数据。无序列表中最快的整体可能是:

var i = 0;
foreach(var subarray in numbers)
{
   if(subarray[0] == x && subarray[1] == y || subarray[0] == y && subarray[1] == x)
     return i;
   i++;
}

最好的情况是第一个元素按顺序排列; 1个元素,2个相等比较。最坏的情况是它不在那里; n个元素,n * 4个等式比较。

通过检查子阵列是否至少有一个元素至少有一个坐标,你可以在不太可能找到匹配的情况下“快速失败”。如果没有,请不要费心检查完全匹配。这使得最坏的情况是元素是最后一个,乱序(n * 2个元素,n * 6个比较),但最好的情况是它不存在(n个元素,n * 2个比较,如果这种情况可能比以前更好。

最后,“快速失败”算法允许使用Linq缩小进行全套条件检查的元素数量;首先查找具有至少一个坐标的元素(最多需要两次检查),然后仅检查那些完全匹配的元素(最多四次检查)。然后,您扫描数组中找到的第一个元素,这是一个相对快速的参考检查。

var result = numbers.Where(a=>a[0] == x || a[0] == y)
   .Where(a=>a[0] == x && a[1] == y || a[0] == y && a[1] == x)
   .FirstOrDefault();

if(result != null) return Array.IndexOf(numbers, result);

最好的情况,它不存在(n个元素,n * 2个比较)。唯一可能的情况是,只有一个元素具有任一坐标(n + 1个元素,n * 2 +(2或4)比较)。最坏的情况是,匹配是最后一个元素,乱序,并且列表中的每个元素都有一个第一个坐标,即x或y(n * 3个元素,n * 7个比较,但在大多数实际数据中这是极不可能的) 。平均情况将取决于至少有一个坐标作为其第一个值的元素数量。