Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速检查超大数组中是否存在数字(C#)_C# - Fatal编程技术网

快速检查超大数组中是否存在数字(C#)

快速检查超大数组中是否存在数字(C#),c#,C#,我在玩codingame的教程时遇到了一个问题 目标是检查int数组中是否存在int 问题是,本教程有以下要求: 解决方案在合理的时间内处理一百万个项目 我尝试了许多不同的方法,如LINQ、字典、二进制搜索、指数搜索和其他一些方法,但仍然失败了 任何人都可以告诉我解决这个问题的最快方法吗?在任意数组中查找一个数字将不可避免地需要O(N)(线性到输入)时间(因为您无法对任何给定索引上的内容做出任何假设,所以在最坏的情况下,您只需全部访问它们) 当数组排序时,情况会有所改善-在这种情况下,您可以使用

我在玩codingame的教程时遇到了一个问题

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

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

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

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


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

在任意数组中查找一个数字将不可避免地需要
O(N)
(线性到输入)时间(因为您无法对任何给定索引上的内容做出任何假设,所以在最坏的情况下,您只需全部访问它们)

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

if ( Array.BinarySearch(data, number) >= 0 )
{
   //found
}
最后,要多次搜索该数组,更好的选择是首先从该数组创建一个
HashSet
。在这种情况下,任何后续查询都将以平均
O(1)
time(常数)的形式返回。但是,在这种情况下,您需要记住,创建
哈希集本身需要
O(n)
时间和内存。只有当要求您多次搜索该值时,此解决方案才值得使用。如果只搜索一次,那么最好在
O(N)
中只搜索一次数组,这样也可以节省内存

var lookup = new HashSet<int>(data);
if ( lookup.Contains(number) )
{
   //do something
}
var lookup=新哈希集(数据);
if(lookup.Contains(number))
{
//做点什么
}

您尝试的每种方法都需要多长时间?我们知道整数和要搜索的值吗?它们的范围是否小于
int.MinValue
int.MaxValue
?数组是否已排序?如果不是,我们是否可以使用我们所知道的内容进行排序,如果比平均速度快?搜索值在某种程度上是否“特殊”,使我们一次通过数组的速度超过一个元素?如果没有任何特定的上下文,你不可能比线性搜索做得更好,但是如果有一个技巧,一个陷阱,一个快捷方式,所有这些都可能会改变。@Jeroemostert…让这个问题变得很不清楚。@HimBromBeere:是的--我正在行使我的特权“使用评论来获取更多信息”。我们仍然错过了任何关于您到底尝试了什么以及以何种方式“失败”的其他信息。@HimBromBeere希望现在更具体一些。感谢您指出
比较:-D。我不小心没有按=键enough@MartinZikmund谢谢你的回答已经解决了我的问题(已经花费了我20次试验)。我自己实现了二进制搜索(实际上是在线复制了简单的代码),但失败了。刚才我尝试了Array.BinarySearch,结果成功了。谁能说出原因吗?我们也可以查一下:-)。写一个新问题,发布您自己编写的代码,并在此处发布一条评论,其中包含指向新问题的链接:-)