我今天刚刚提出了这个问题,并且正在尝试一种比O(N)更好的解决方案,但却找不到一个。
通过SO搜索但无法找到这个问题。
有没有比O(n)更好的解决方案,还是一个无法解决的问题呢?
我最初的想法是二进制搜索,但是你需要再次对它进行排序> n。我还考虑过将quicksort应用于搜索元素可能属于的数组的一半,但我们最初还是进行了n次比较,之后才丢弃另一半。我是正确的,还是我在错误的方向上看待解决方案?
我试图用c ++解决方案而没有javascript的IndexOf()或C#Array.find()或LINQ。
让它平行。将数组划分为块并并行搜索。
复杂性将是O(n),但运行时间会少得多。实际上它与否成正比。你有的处理器。
您可以使用 并行模式库 在C ++中
你是对的,最快的方法是简单地遍历数组并寻找它。没有进一步的信息,你无能为力。
除非你有 量子计算机, 那是。
如果您要搜索一个元素,只需迭代它。没有办法让它更快。
如果您正在多次搜索,那么将其编入索引(或者如果您愿意将其排序)并快速进行以下搜索(log(n))是值得的。
您可以使用此方法使用O(1)搜索元素。
只需创建一个 地图 。当您为该键指定值插入值为'1'时,再次搜索它时,只需检查该数组是否存在。
以下是代码: -
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
map<int,int> map;
for(int i=0;i<n;i++){
int k;
cin>>k;
map[k]=1;
}
int num;
cin>>num;
if(map[num]){
cout<<"FOUND"<<endl;
}else{
cout<<"NOT FOUND"<<endl;
}
return 0;
}
Input:
5 // *no. of elements*
6 4 7 3 2 //*elements*
3 // *number to find*
输出:FOUND
所有答案都错了!可以使程序比O(n)运行得更快。快多了。
首先使用合并排序算法对数组进行排序,然后使用二进制搜索来查找元素。 algoro的运行时间均为O(log_2(n))。将这两个复杂性加在一起,得到2 * log_2(n),即见证C = 2的O(log_2(n))。