1078 Hashing (25 分)难度: 一般 / 知识点: 哈希表二次探测法

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1078 Hashing (25 分)难度: 一般 / 知识点: 哈希表二次探测法相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805389634158592
不得不说,读了半天的假题,以为就是直接判断可不可以插入就行了。
后来,发现是用只具有正增量的二次探测法来解决冲突。
不得不说,PAT的题还是很不错的,考的是一些数据结构方面的一些内功,不是偏竞赛的那种思维的。
考察的就是基本算法概念用算法来实现。
首先,先介绍一下二次探测法
关于二次探测法(处理冲突方法):pos=(key + i*i )%MSize,其中i1*1 , -1*1 , 2*2 , -2*2 , ··· k*k , -k*k (k <= MSize-1)
题目说的是只具有正增量的二次探测法pos=(key + i*i )%MSize,其中i1*1 , 2*2 , ··· k*k (k <= MSize-1)

#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
const int null=0x3f3f3f3f;
int hush[N],n,m;
int insert(int x)
{
    for(int i=0;i<m;i++)
    {
        int pos=(x+i*i)%m;
        if(hush[pos]==null)//找到位置了
        {
            hush[pos]=x;
            return pos;
        }
    }
    return -1;
}
bool check(int x)
{
    if(x==1) return true;
    for(int i=2;i<=x/i;i++) if(x%i==0) return true;
    return false;
}
int main(void)
{
    memset(hush,0x3f,sizeof hush);
    cin>>m>>n;
    while(check(m)) m++;//求最小的质数
    for(int i=1;i<=n;i++)
    {
        int x; cin>>x;
        int ans=insert(x);
        if(ans==-1) cout<<"-";
        else cout<<ans;
        if(i!=n) cout<<" ";
    }
    return 0;
}

以上是关于1078 Hashing (25 分)难度: 一般 / 知识点: 哈希表二次探测法的主要内容,如果未能解决你的问题,请参考以下文章

A1078 Hashing (25分)(哈希表平方探测法)

1145 Hashing - Average Search Time (25 分)难度: 一般 / 知识点: 哈希表平均查找时间

1078. Hashing (25)-PAT甲级真题

1078. Hashing (25)Hash + 探测——PAT (Advanced Level) Practise

PAT Advanced 1078 Hashing (25) [Hash ?次?探查法]

PAT (Advanced Level) 1078. Hashing (25)