艰难的英语单词:
Quadratic probing 平方探测
increments 英 ['ɪnkrəmənts] n.增量;
题意:给一串数,把它们按照 num%v 哈希,如果有冲突就按照平方探测法正向解决冲突,哈希不进去就输出失败。
然后给一部分刚刚的数,判断它们是否在哈希入了表内。并最后输出总共进行了多少次查询。
难点:其中好几个概念都不是很清楚——平方探测是啥、哈希的查询次数咋算什么的。
后来写代码的时候还有一个地方不理解,为什么对于每一个数值,判断它们是不是哈希成功的时候,j 的变化是从0到MAX(包括MAX),这是什么原因?因为很明显,大多数时候,用平方探测法解决冲突时候,哈希的新位置是会出现循环的,也就是说没必要使j从0到MAX才对。
上述疑问还不是很清楚答案,先按照题目的写法,把这题目AC了。
Code:
#include<bits/stdc++.h>
using namespace std;
#define inf 10009
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)
int n,m,len;
int e[inf];
bool isPrime(int v)
{
int i;
loop(i,2,sqrt(v)+1)
if(v%i==0)return false;
return true;
}
void Solve()
{
scanf("%d%d%d",&len,&n,&m);
int i,j;
while(!isPrime(len))len++;
loop(i,0,n)
{
int t;
scanf("%d",&t);
loop(j,0,len)
if(!e[(t+j*j)%len])
{
e[(t+j*j)%len]=t;
break;
}
if(j==len)printf("%d cannot be inserted.\n",t);
}
int sum=0;
loop(i,0,m)
{
int t;
scanf("%d",&t);
loop(j,0,len+1)
{
sum++;
if(e[(t+j*j)%len]==t||e[(t+j*j)%len]==0)
break;
}
}
printf("%.1f\n",(double)sum/m);
}
int main()
{
Solve();
return 0;
}
博客围绕PAT甲级题目展开,涉及哈希平方探测法。题目要求将一串数按num%v哈希,冲突时用平方探测法正向解决,还需判断部分数是否哈希入表并统计查询次数。作者对平方探测概念、查询次数计算及代码中j的变化范围存在疑问,但仍完成题目。
639





