• Hash二次探测


      Hash的二次探测,当hash的长度为n;插入val,当Hash[val]不为0时,选择新地址newval = val +(-) 1*1,val+(-)2*2,val+(-)(n-1)*(n-1);

     

      具体例题见:PAT1078

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int Hash[100000+10];
    
    bool isPrime(int n)
    {
        if(n<=1) return false;
        for(int i=2;i*i<=n;++i)
            if(n%i==0) return false;
        return true;
    }
    
    int main()
    {
        int tsize,n;
        scanf("%d%d",&tsize,&n);
        while(!isPrime(tsize)) ++tsize;
        bool bFirst = true;
        for(int i=0;i<n;++i)
        {
            int a;
            scanf("%d",&a);
            if(bFirst) bFirst = !bFirst;
            else printf(" ");
    
            int di;
            for(di=0;di<tsize;++di)
            {
                int add = (a+(di*di))%tsize;
                if(Hash[add]==0)
                {
                    printf("%d",add);
                    Hash[add] = 1;
                    break;
                }
            }
            if(di >= tsize) printf("-");
        }
        printf("
    ");
        return 0;
    }
    View Code
          PAT 1145,如果二次探测到n-1后还是没找到,还得加一次。
    #include<iostream>
    #include<cstdio>
    #include<set>
    #include<map>
    #include<vector>
    #include<iterator>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    bool isPrime(int n)
    {
        for(int i=2;i*i<=n;++i)
            if(n%i==0) return false;
        return true;
    }
    int getsize(int n)
    {
        while(!isPrime(n)) ++n;
        return n;
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
            freopen("test.txt","r",stdin);
        #endif // ONLINE_JUDGE
        int msize,n,m;
        scanf("%d%d%d",&msize,&n,&m);
        msize = getsize(msize);
        int Hash[msize];
        memset(Hash,0,sizeof(Hash));
        for(int i=0;i<n;++i)
        {
            int a;
            scanf("%d",&a);
            int j;
            for(j=0;j<msize;++j)
                if(Hash[(a+j*j)%msize]==0)
                {
                    Hash[(a+j*j)%msize] = a;
                    break;
                }
            if(j>=msize) printf("%d cannot be inserted.
    ",a);
        }
        int t = m,cnt=0;
        while(t--)
        {
            int a;
            scanf("%d",&a);
            for(int i=0;i<=msize;++i)
            {
                if(++cnt&&(Hash[(a+i*i)%msize]==a||(Hash[(a+i*i)%msize]==0)))
                    break;
            }
        }
        printf("%.1lf
    ",1.0*cnt/m);
        return 0;
    }
    View Code
     
  • 相关阅读:
    李彦宏最新演讲:移动互联网的时代已经结束了
    表值函数 详解
    SQL中PIVOT 行列转换
    将WeX5部署到自己的Tomcat服务器上
    Cordova webapp实战开发:(2)认识一下Cordova
    Cordova webapp实战开发:(1)为什么选择 Cordova webapp?
    甲有5套房,不上班,靠收房租生活;乙有1套房,上班赚工资……(启示)
    Ubuntu 16.04下为Android编译OpenCV 3.1.0 Manager
    Dual Camera Info
    OpenCV 3.1
  • 原文地址:https://www.cnblogs.com/jlyg/p/7494388.html
Copyright © 2020-2023  润新知