什么是快速的方式 在2维数组中找到一对数字
我有这个数组
int[,] numbers = new int[,] { { 5, 2 }, { 5, 1 }, { 5, 0 } , ........... };
我必须使用像x,y
我想在数组
中返回此对apper的索引如果该对不存在,则返回false
感谢
答案 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个比较,但在大多数实际数据中这是极不可能的) 。平均情况将取决于至少有一个坐标作为其第一个值的元素数量。