1145 Hashing

如果查找了 TSize 次,每次查找的位置上均有数,但都不等于要查找的数,则认为查找时间是 TSize+1。

const int N=1e4+10;
int Tsize,n,m;
int h[N];
int cnt;

bool isprime(int x)
{
    if(x < 2) return false;
    for(int i=2;i*i<=x;i++)
        if(x % i == 0)
            return false;
    return true;
}

int find(int x)
{
    int k=x%Tsize;
    for(int i=0;i<Tsize;i++)
    {
        int t=(k+i*i)%Tsize;
        cnt++;
        if(!h[t] || h[t] == x) return t;
    }
    return -1;
}

int main()
{
    cin>>Tsize>>n>>m;

    while(!isprime(Tsize)) Tsize++;

    for(int i=0;i<n;i++)
    {
        int x;
        cin>>x;
        int k=find(x);
        if(k == -1) cout<<x<<" cannot be inserted."<<endl;
        else h[k]=x;
    }

    double sum=0;
    for(int i=0;i<m;i++)
    {
        int x;
        cin>>x;
        cnt=0;
        int k=find(x);
        if(k == -1) sum+=Tsize+1;
        else sum+=cnt;
    }

    printf("%.1f
",sum/m);
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14520029.html