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("\n");
    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.\n",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\n",1.0*cnt/m);
    return 0;
}
View Code