爆刷PAT(甲级)——之【1145】 Hashing - Average Search Time(25 分)——Hash

博客围绕PAT甲级题目展开,涉及哈希平方探测法。题目要求将一串数按num%v哈希,冲突时用平方探测法正向解决,还需判断部分数是否哈希入表并统计查询次数。作者对平方探测概念、查询次数计算及代码中j的变化范围存在疑问,但仍完成题目。

艰难的英语单词:

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;
}

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值