pat甲级1145 Hashing - Average Search Time(25 point(s))

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/richenyunqi/article/details/81211430

欢迎访问我的pat甲级题解目录哦https://blog.csdn.net/richenyunqi/article/details/79958195

题目描述

pat甲级1145 Hashing - Average Search Time(25 point(s))题目描述

题意分析

题目给定一个哈希表的长度、插入的元素以及要进行查找的元素,采用除留余数法作为哈希函数,使用平方探测法解决冲突,要求无法再哈希表中插入的元素以及平均查找长度。

算法设计

由于给定的表长不会超过104,而且要求哈希表的实际表长是一个不小于给定表长的素数,可以用埃氏筛法先生成一张105的素数表,关于埃氏筛法我在pat乙级1007. 素数对猜想 (20)——埃氏筛法已经阐述过。然后找出不小于给定表长的素数作为实际表长。通过将给定元素值对表长的余数作为在哈希表中的插入位置,如果出现冲突,采用平方探查法解决。平方探查法的具体过程是,假设给定元素值为a,表长为MSize,插入位置为a%MSize,假设a%MSizeSize位置已有元素,即发生冲突,则查找(a+12)%MSize(a12)%MSize(a+22)%MSize(a22)%MSize(a+MSize2)%MSize(aMSize2)%MSize 直至查找到一个可进行插入的位置,否则当查找到(a+MSize2)%MSize(aMSize2)%MSize 仍然不能插入则该元素插入失败。另外题目要求平方探测只需正向探测即可,也就是说,当发生冲突的时候,只需查找(a+12)%MSize(a+22)%MSize(a+MSize2)%MSize即可。同样地,进行查找时也采取相同的方法进行查找,当查找到的当前位置没有元素或查找到(a+MSize2)%MSize位置还未查找到时,则查找失败;当查找到的当前位置元素与查找元素相等,即查找成功。没探测到一个位置查找长度则增长1,求出总的查找长度再除以查找元素个数即可。

C++代码

#include<bits/stdc++.h>
using namespace std;
vector<bool>prime((int)(1e5));//题目表长最大为10的4次方,可以建立一个10的5次方以内的素数表
int main(){
    int MSize,N,M,sum=0,a;
    scanf("%d%d%d",&MSize,&N,&M);
    prime[0]=prime[1]=true;
    for(int i=2;i<prime.size();++i)//埃氏筛法建立素数表
        if(!prime[i])
            for(int j=i*2;j<prime.size();j+=i)
                prime[j]=true;
    while(prime[MSize])//找到大于或等于给定表长的最小素数
        ++MSize;
    int table[MSize]={0};//哈希表
    for(int i=0;i<N;++i){
        scanf("%d",&a);
        int k=a%MSize;
        for(int j=0;j<=MSize&&table[k]!=0;++j,k=(a+j*j)%MSize);//查找元素能够插入的位置
        if(table[k]==0)//该元素能插入
            table[k]=a;
        else//该元素不能插入
            printf("%d cannot be inserted.\n",a);
    }
    for(int i=0;i<M;++i){//统计要进行查找的元素的总查找长度
        scanf("%d",&a);
        int k=a%MSize,j=0;
        for(;j<=MSize&&table[k]!=0&&table[k]!=a;++j,k=(a+j*j)%MSize);//统计当前查找元素的查找长度
        sum+=j>MSize?j:j+1;//累加到总查找长度
    }
    printf("%.1f\n",sum*1.0/M);//输出
    return 0;
}
阅读更多

扫码向博主提问

日沉云起

用最短的代码,写最快的算法
  • 擅长领域:
  • 算法
去开通我的Chat快问
换一批

没有更多推荐了,返回首页