2010-12-08 23 views
0

什么快速的方法 发现对数字的2渔政阵列找到对数字在C#2维数组

我有这个阵列

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

我必须为整数像x,y

我想返回这一对冲击片雷管的索引阵列

在如果所述一对不存在retun假

谢谢

+0

需要更多的细节来决定'快'。数组是否被排序?如果没有,你正在寻找一个线性搜索。 – 2010-12-08 18:27:02

+0

其未订购,是否有构建功能? – 2010-12-08 18:27:38

+0

听起来有点像功课。 – KeithS 2010-12-08 18:29:28

回答

1

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

如果数组中的任何一个维都是有序的,那么您可以使用二分搜索。

如果数据是有序的并且符合某种分布,则可以使用分布关联查找,该查找可能比二元搜索稍微高效。

1

如果数组是有序的,您可以使用二进制搜索。否则,你将不得不做一个线性搜索。

1

做二维数组的排序,然后使用二进制搜索。

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比较,但在大多数实际数据中这是极其不可能的) 。平均情况将取决于具有至少一个坐标作为其第一个值的元素的数量。