哈希表的基本思路是,设要存储的元素个数为n,设置一个长度为m(m>=n)的数组,每个元素ki的下标为对应函数f(ki),这样在查找ki的时候就可以通过下标f(ki)查找
在创建哈希表的时候会有所冲突,即ki和kj的函数值可能一样,因此有处理冲突的方式
线性探测法:当产生冲突时,如ki的函数值为3,而3号位已经有了元素,则从3号位往右检索,检索到m-1后从0开始再往右检索,只要找到空的位置,就将其放入
线性探测法虽然简单,但是容易产生堆积问题。
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int n;
cin>>n;
int ha[n];
memset(ha,-1,sizeof(ha));
int m;
cin>>m;
while(m--)
{
int num;
cin>>num;
int t=num%n;
while(ha[t]!=-1) //处理冲突,往后检索未被占用的位置
{
t=(t+1)%n; //到n-1后又从0开始
}
ha[t]=num;
}
int x,num=0,flag=1;
cin>>x;
int p=x%n;
while(1)
{
num++;
if(ha[p]==x)
break;
if(ha[p]==-1) //没找到
{
flag=0;
break;
}
p=(p+1)%n;
}
if(flag==0)cout<<"-1";
else cout<<p<<","<<num;
return 0;
}