我有两个已排序的int数组(一维,Array1可能有多达数百万个条目,Array2可能会小很多,我想六个数字,没有重复)我必须执行匹配操作。我想知道是否只使用Array.Exists是最快的方法,或者是否有更快的方法专门用于查找数字的完全匹配。
答案 0 :(得分:4)
如果对数组进行了排序,则可以使用更快的Array.BinarySearch。
答案 1 :(得分:3)
如果它已排序,您可以使用Array.BinarySearch
,它将是O(log n)而不是O(n):
int index = Array.BinarySearch(sortedArray, targetValue);
if (index >= 0)
{
// Found!
}
(BinarySearch
如果找不到值,则返回一个负数;这是您插入值以维持排序的索引的按位补码。)
或者,如果您的值不同,请尝试创建HashSet<int>
而不是数组 - 这将占用更多内存,但可能提供更快的查找。它是分摊O(1)而不是O(log N),但是常数因子可能会使二进制搜索更快。你应该测试这个,而不是假设一个会比另一个更快。
请注意,即使是线性搜索,如果您正在寻找相等匹配,那么Contains
比Exists
更简单,因为您不需要提供委托(只是一个值)。
答案 2 :(得分:1)
为两者创建一个HashSet并使用Enumerable.Intersect()。
如果你不需要整个东西,那么HashSet仍然是优越的。 HashSet.Contains是O(1),所以如果你正在寻找n个匹配,你将有2n * O(1)而不是n *(O(log p)+ O(log q),其中p和q是你的数组长度。