【PAT甲级】1078 Hashing (25 分)【哈希表】https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592)
思路
- 哈希表的长度需要是一个素数
- st数组标记该位置是否被用到过,如果用到过(发生哈希冲突),使用只具有正增量的二次探测法来解决冲突
- 如果探测s次(s是哈希表的长度)仍然发生冲突,则认为不可能插入
- find函数返回某个数字应该在哈希表中的位置,如果找不到,返回-1
代码
#include <iostream>
using namespace std;
const int N=1e5+10;
int st[N];//st数组标记该位置是否被用到过
int s,n;
bool isprime(int x)
{
if(x==1) return false;
for(int i=2;i*i<=x;i++)
if(x%i==0)
return false;
return true;
}
int find(int x)
{
int t=x%s;//取模
for(int i=0;i<=s;i++)
{
t=x+i*i;
t%=s;
if(!st[t])//如果t这个位置没有被用过
{
st[t]=true;
return t;
}
}
return -1;
}
int main()
{
cin>>s>>n;
while(!isprime(s)) s++;//s是哈希表的长度
for(int i=0;i<n;i++)//一共是n个输入
{
int x;cin>>x;
int t=find(x);
if(i) cout<<' ';
if(t==-1) cout<<'-';
else cout<<t;
}
return 0;
}