PAT甲級1145 Hashing - Average Search Time (25分) 平方探測法

在這裏插入圖片描述
在這裏插入圖片描述
注意:這裏說了探測只有正的探測,然後使用平方探測法、進行插入時,i的最大值爲size(table)-1 (也有部分說是size(table)/2,這裏倒是都能過了PAT的測試點);使用平方探測法進行查找時,i的最大值爲size(table), 否則你湊不出4個數字的查找需要進行11次。。。。

關於平方探測法,看到了一篇文章寫得不錯,也有關於一般質數表長,一半空白必可插入的證明,感覺選擇質數的表長是爲了方便在mod後得到唯一值
https://www.cnblogs.com/hongshijie/archive/2018/08/06/9432838.html

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int isPrime(int a)
{
    if(a<2)
        return 0;
    for(int i=2; i<=sqrt(a); i++)
    {
        if(a%i==0)
            return 0;
    }
    return 1;


}

int main()
{
    int Msize,N,M;
    cin>>Msize>>N>>M;
    while(isPrime(Msize)==0)
        Msize++;
    int ha[Msize];
    fill(ha,ha+Msize,-1);
    int sn[M];
    for(int i=0; i<N; i++)
    {
        int num;
        cin>>num;
        int signIn=0;
        for(int step=0; step<=Msize/2; step++)
        {
            if(ha[(num+step*step)%Msize]==-1)
            {
                signIn=1;
                ha[(num+step*step)%Msize]=num;
                break;
            }
        }
        if(signIn==0)
        {
            printf("%d cannot be inserted.\n",num);
        }
    }
    int searchTime=0;
    for(int i=0; i<M; i++)
    {
        int num;
        cin>>num;
        for(int step=0; step<=Msize; step++)
        {
            searchTime++;
            int pos=num+step*step;
            //cout<<pos<<' '<<(num+step*step)%Msize<<endl;
            if(ha[(num+step*step)%Msize]==num||ha[(num+step*step)%Msize]==-1)
            {

                break;
            }
        }
    }
    //cout<<searchTime;
    printf("%.1f",searchTime/(double)M);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章