快速检查大型数组中数字的存在(C#)

时间:2019-01-16 14:15:22

标签: c#

玩编码专家的教程时遇到问题。

目标是检查int数组中是否存在int

问题是,本教程具有以下要求:

该解决方案在合理的时间内可以处理一百万个项目

我尝试了许多不同的方法,例如LINQ,Dictionary,二进制搜索,指数搜索和其他一些方法,但是仍然失败。

任何人都可以告诉我解决该问题的最快方法吗?

1 个答案:

答案 0 :(得分:5)

在任意数组中查找数字将不可避免地花费O(N)(线性于输入)时间(因为您无法对任何给定索引上的内容进行任何假设,因此您仅需在最差的情况)。

对数组进行排序时,情况会有所改善-在这种情况下,您可以使用二进制搜索在O(log n)时间内找到值。这是使用Array.BinarySearch方法的内置.NET。如果您只需要搜索一次值,这是最佳解决方案。

if ( Array.BinarySearch(data, number) >= 0 )
{
   //found
}

最后,您将多次搜索数组,一个更好的选择是首先从数组中创建一个HashSet<int>。在这种情况下,任何后续查询将平均返回O(1)时间(恒定)。但是,在这种情况下,您需要记住,创建HashSet<int>本身将花费O(n)的时间和内存。仅当系统要求您多次搜索该值时,才值得使用此解决方案。如果只搜索一次,那么最好在O(N)中对数组进行一次搜索,这样还可以节省内存。

var lookup = new HashSet<int>(data);
if ( lookup.Contains(number) )
{
   //do something
}