题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805343236767744
题意
创建哈希序列,用平方探测法解决哈希冲突,如果不能插入则输出”X cannot be inserted.”,最后输出平均查找时间
AC代码
#include<bits/stdc++.h>
using namespace std;
int isPrime(int x)
{
if(x<=1) return 0;
else if(x==2) return 1;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
int main()
{
int size,n,m,t,sum=0;
scanf("%d %d %d",&size,&n,&m);
while(!isPrime(size)) size++;
vector<int> vec(size);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
int flag=0;
for(int j=0;j<size;j++)
{
int pos=(t+j*j)%size;
if(vec[pos]==0)
{
vec[pos]=t;
flag=1;
break;
}
}
if(!flag) printf("%d cannot be inserted.\n",t);
}
for(int i=0;i<m;i++)
{
scanf("%d",&t);
for(int j=0;j<=size;j++)
{
sum++;
int pos=(t+j*j)%size;
if(vec[pos]==0||vec[pos]==t) break;
}
}
printf("%.1lf",1.0*sum/m);
}
参考
1145. Hashing – Average Search Time (25) – 甲级
注意
如果创建的是数组,记得将数组内的值赋为0,避免后续判断数组空位置错误(vector不需要考虑这一点)
查询时值为空(0)也要退出
在判断时,很多人有疑问在为什么j=size也要判断,j=size和j=0不是一样的吗?这个逻辑是对的,但在做题时为了能AC还是要迎合出题者的意思,既然在分析样例时发现15这个数判断了6次(即j=0到j=5),那在没有改题的前提下照做就行了