0
点赞
收藏
分享

微信扫一扫

PAT (Advanced Level) Practice - 1145 Hashing - Average Search Time(25 分)


题目链接:​​点击打开链接​​

题目大意:略。

解题思路:平方探测法处理哈希表,但是该题只能正增长:with positive increments only。即,hi=(h(key)+i*i)%m (0 ≤ i ≤ m-1),注意:类似样例中“15”是插入不进的这种数,理论上应该是 [0,size-1] == size 次,但是这里还要额外 +1 次,因为这 1 次是出于 di==size 时的探测才知道是否进入循环了,所以该次也要算进去。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int maxn=1e4+10;

int vis[maxn], times[maxn*10];

int isPrime(int x)
{
if(x<2) return 0;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}

int main()
{
int p,n,q,a;
scanf("%d%d%d",&p,&n,&q);
while(!isPrime(p)) p++;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
int cnt=1;
for(int j=0;j<p;j++)
{
int idx=(j*j+a)%p;
if(vis[idx]==0)
{
vis[idx]=a;
break;
}
cnt++;
}
times[a]=cnt;
if(cnt==p+1) printf("%d cannot be inserted.\n",a);
}

double sum=0;
for(int i=0;i<q;i++)
{
scanf("%d",&a);
if(times[a]==0)
{
int cnt=1;
for(int j=0;j<p;j++)
{
int idx=(j*j+a)%p;
if(vis[idx]==0)
{
//vis[idx]=a; // 这里不能给它放上位置,会影响后面的数据到该位置时,误以为原本就有数据,则继续探测,影响结果
break;
}
cnt++;
}
times[a]=cnt;
}
sum+=times[a];
}
printf("%.1f\n",sum/q);

return 0;
}


举报

相关推荐

0 条评论