美文网首页
1078. Hashing (25)(哈希规则)

1078. Hashing (25)(哈希规则)

作者: cheerss | 来源:发表于2017-12-13 00:10 被阅读0次

    PAT-A 1078,题目地址:https://www.patest.cn/contests/pat-a-practise/1078
    这道题主要是要搞清楚“平方探测”的规则以及表大小的选取,注意:

    1. 2是最小的素数,所以表的大小不能为1
    2. 平方探测的规则是,当num插不进哈希表时,分别对num+1^2, num+2^2 ... num+k^2位置进行尝试,其中,k是哈希表的大小

    代码如下:

    #include <iostream>
    #include <string.h>
    #define MAX 10100
    
    bool prime[MAX];
    int hash[MAX];
    
    //建立素数表,max是随便挑的数,当然要保证10000~MAX之间必须存在至少存在一个素数。这个建立素数表的方法很常见,看不懂可以百度一下
    void build_prime(){
        prime[0] = prime[1] = false;
        for(int i = 2; i <= MAX; i++){
            if(prime[i] == true){
                for(int j = i * i; j < MAX; j += i){
                    prime[j] = false;
                }
            }
        }
        return ;
    }
    
    //插入一个元素k到hash表,成功则返回下标,失败返回-1
    int insert(int size, int k){
        int origin = k;
        k %= size;
        int count = 1;
        while(hash[k] != -1){
            k = origin + count * count;
            count++;
            k %= size;
            if(count > size){
                return -1;
            }
        }
        hash[k] = origin;
        return k;
    }
    
    int main(){
        int m, n;
        int num;
        std::cin >> m >> n;
        memset(hash, -1, sizeof(int) * MAX);
        memset(prime, 1, sizeof(bool) * MAX);
        build_prime();
        while(!prime[m])
            m++; //找出>=m的最小素数
    
        for(int i = 0; i < n; i++){
            std::cin >> num;
            int res = insert(m, num);
            if(i != 0)
                std::cout << " ";
            if(res == -1)
                std::cout << "-";
            else
                std::cout << res;
        }
        std::cout << std::endl;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:1078. Hashing (25)(哈希规则)

          本文链接:https://www.haomeiwen.com/subject/rmvoixtx.html