• PAT A1078 Hashing


    这是一道哈希散列的二次方探查法的问题,其中也用到了素数的判定问题,要注意的是:1不是素数
    哈希散列中的二次方探查法主要流程如下:

    • 如果hashTable里面key % size的下标对应的hashTable为false,说明这个下标没有被使用过,直接输出。(这些size必须满足题目给的条件,即是一个素数)
    • 否则step步长从1加到size-1,一次次尝试是否能使index = (key + step * step) % size;所对应的位置没有元素,如果都没有找到就输出“-”,否则就输出这个找到的元素的位置
    #include<cstdio>
    #include<math.h>
    using namespace std;
    
    const int M = 10010;
    bool ishash[M];
    bool isprime(int n){
        if(n==1) return false;//1不是素数
        int half = (int)sqrt(n);
        for(int i = 2;i<=half;i++){
            if(n%i==0) return false;
        }
        return true;
    }
    int main(){
        int m , n;
        scanf("%d %d",&m,&n);
        while(!isprime(m)){
            m++;
        }//找新m,为素数
        int v;//读数
        //输出
        for(int i = 0;i < n;i++){
            scanf("%d",&v);
            int a = v%m;//0..m-1
            int k = 1;
            //二次方探查法
            while(k<m&&ishash[a]){
                a= (v + k*k)%m;
                //探测点
                k++;
            }
            if(k>=m){
                printf("-");
            }else{
                ishash[a] = true;
                printf("%d",a);
            }
            if(i < n-1){
                printf(" ");
            }
        }
    }
    
  • 相关阅读:
    李阳疯狂英语精选365句
    线程 notify,与notifyAll 的区别
    关于Logger,Tomcat 的Logger是如何工作的
    知豆 源
    关于好多继承的问题,我们应该如何去理解
    5+1+2
    wu xing
    ALBPM Time Question
    推荐书集
    “疯狂”的定义
  • 原文地址:https://www.cnblogs.com/shuibeng/p/13562543.html
Copyright © 2020-2023  润新知