在学习算法的过程中有许多问题都和查找有关,以下是我总结的几点查找算法:
1.暴力出奇迹:
原理:暴力枚举
优点:简单易想,初学者的最爱。
缺点:慢。
代码:
暴力for循环:
for(int i=0;i<n;i++)cin>>a[i];
//部分查找可能还需要排序
for(int j=0;j<n;j++)
{
if(a[i]==x)
{
cout<<"yes"<<endl;
break;
}
}
2.数组标记(bool法)
原理:标记已经有的数字,利用数组进行标记。
优点:查找快,相比小白来说,学过一断时间算法的人更容易想到。
缺点:只能查找正整数,且数据量太大的话没有办法开数组。
代码:
for(int i=0;i<n;i++)
{
int num;
cin>>num;
a[num]++;
}
if(a[x]!=0)cout<<"yes"<<endl;
else cout<<"no"<<endl;
//部分查找可能还需要排序
3.哈希表法:
原理:利用哈希表法实现O(1)时间复杂度查找。
优点:代码简单,快,可查找的内容更丰富。
缺点:需要有一定数据结构基础的人才会,且创建哈希表是需要时间的。
代码:
unordered_map<int,int>mp;
for(int i=0; i<n; i++)
{
int x;
cin>>x;
mp[x]=1;
}
if(!mp.count(x))
{
cout<<"yes"<<endl;
}
else puts("no");
}
4.二分查找:
作者之前已经写过,详情请点击下面的链接。
YikNjy的二分查找