zoukankan      html  css  js  c++  java
  • 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
     
  • 相关阅读:
    转inux Shell编程入门
    转CentOS — MySQL备份 Shell 脚本
    JAVA4种线程池的使用
    http://cyber-dojo.org/
    tomcat内存大小设置
    rails的数据库查询方法
    Java 微信公众号上传永久素材的方法
    微信回复图文消息
    plsql解决64位解决办法
    Ruby中使用patch HTTP方法
  • 原文地址:https://www.cnblogs.com/jlyg/p/7494388.html
Copyright © 2011-2022 走看看