对于巨大的排序int数组,是否有更快的替代Array.Exists?

时间:2014-02-26 10:39:31

标签: c# arrays

我有两个已排序的int数组(一维,Array1可能有多达数百万个条目,Array2可能会小很多,我想六个数字,没有重复)我必须执行匹配操作。我想知道是否只使用Array.Exists是最快的方法,或者是否有更快的方法专门用于查找数字的完全匹配。

3 个答案:

答案 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),但是常数因子可能会使二进制搜索更快。你应该测试这个,而不是假设一个会比另一个更快。

请注意,即使是线性搜索,如果您正在寻找相等匹配,那么ContainsExists更简单,因为您不需要提供委托(只是一个值)。

答案 2 :(得分:1)

为两者创建一个HashSet并使用Enumerable.Intersect()。

如果你不需要整个东西,那么HashSet仍然是优越的。 HashSet.Contains是O(1),所以如果你正在寻找n个匹配,你将有2n * O(1)而不是n *(O(log p)+ O(log q),其中p和q是你的数组长度。