1078 Hashing (哈希表,平方探测法)

题意:维护一个哈希表,将数依次插入到哈希表中,如果插入时发生冲突,使用平方探测法尝试解决冲突。输出每个数的插入的位置,如果无法插入,则输出"-"。

平方探测法:当哈希表插入时遇到冲突,正常来讲我们应该查询下一个位置,直到查询到空位置则插入(线性探测法),但是如果这样做的话容易使数据聚集,于是我们改成依次查询(p+0^2),p+1^2,p+2^2,p+3^2,,,p+(m-1)^2(m为哈希表的容量)每次移动平方个单位,寻找下一个插入的结点(平方探测法),这样就不容易聚集了。如果这些结点都有冲突,则无法插入。(这也是为什么容量最好是素数的原因,如果是素数,则不会重复查询结点,即会查询到更多的位置,减少数据插入不了的情况。)

#include
using namespace std;
bool st[30004];
void divide(){
    st[0]=1;st[1]=1;
    for(int i=2;i<=30001;i++){
        if(!st[i]){
            for(int j=2;j<=30001/i;j++){
                st[i*j]=1;
            }
        }
    }
}
int minprime(int x){
    for(int i=x;;i++){
        if(!st[i])return i;
    }
}
int main(){
    int n,m;cin>>m>>n;
    divide();
    m=minprime(m);
    // cout<pos;
    vectornum;
    mapans;
    for(int i=0;i>a;
        num.push_back(a);
        int p=a%m;
        int h;
        int flag=0;
        for(int k=0;k

你可能感兴趣的:(散列表,数据结构)