PAT_甲級_1145 Hashing - Average Search Time

題目大意:

給定N個數字插入到用戶指定長度爲MSize的hash表中,若是X沒法插入就輸出X cannot be inserted.緊接着給出M個查詢的數字,計算平均M個數字的查找時間。算法

算法思路:

首先對於輸入的hash表長度MSize得判斷是否爲素數,若是不是,須要將其增長爲最小素數table_size,其次對於插入過程,若是當前數字num的插入位置沒有衝突就直接插入其中,不然就進行正向平方探針法查找插入位置,若是查找了table_size步尚未查找到插入位置,說明沒法插入。對於查找過程:若是查找的位置上的數字等於當前數字說明查找成功,不然進行正向平方探針進行查詢,直到查找成功,或者遇到0(沒有數字),每一次進行hash運算,都得算做一次查找操做,一個數字最多查找table_size+1次。spa

注意點:

  • 一、對於查詢失敗的情形爲2種,第一種是找到數字爲0的位置,表明根本沒有數字插入到該位置,第二種是該查詢數字沒有插入到hash表中,該情形須要查詢table_size+1次後回到初始位置才知道查詢失敗。

提交結果:

image.png

AC代碼:

#include<cstdio>
#include<cmath>

using namespace std;

int hash_table[10006];

bool isPrime(int n){
    if(n<=1) return false;
    int sqrtn = (int)sqrt(n*1.0);
    for(int i=2;i<=sqrtn;++i){
        if(n%i==0) return false;
    }
    return true;
} 

int getPrimeTableSize(int n){
    while(!isPrime(n)){
        ++n;
    }
    return n;
}

int main(){
    int MSize,N,M;
    scanf("%d %d %d",&MSize,&N,&M);
    int table_size = getPrimeTableSize(MSize);
    for(int i=0;i<N;++i){
        // 插入N個數字
        int num;
        scanf("%d",&num);
        int pos = -1;// 插入位置 
        for(int step=0;step<table_size;++step){
            // 最多table_size步,查找不到插入位置就說明沒法插入
            int p = (num+step*step)%table_size;
            if(hash_table[p]==0){
                pos = p;
                break;
            }
        }
        if(pos==-1){
            printf("%d cannot be inserted.\n",num);
            continue;
        }
        // 查找到插入位置
        hash_table[pos] = num;
    }
    // 查找M個數字
    int cnt = 0;// 查找總次數 
    for(int i=0;i<M;++i){
        int num;
        scanf("%d",&num);
        for(int step=0;step<=table_size;++step){
            // 最多table_size+1步,查找不到就說明沒有 
            int p = (num+step*step)%table_size;
            ++cnt;
            if(hash_table[p]==num||hash_table[p]==0){
                break;
            }
        }
    }
    printf("%.1lf",cnt*1.0/M);
    return 0;
}
相關文章
相關標籤/搜索