給定N個數字插入到用戶指定長度爲MSize的hash表中,若是X沒法插入就輸出X cannot be inserted.緊接着給出M個查詢的數字,計算平均M個數字的查找時間。算法
首先對於輸入的hash表長度MSize得判斷是否爲素數,若是不是,須要將其增長爲最小素數table_size,其次對於插入過程,若是當前數字num的插入位置沒有衝突就直接插入其中,不然就進行正向平方探針法查找插入位置,若是查找了table_size步尚未查找到插入位置,說明沒法插入。對於查找過程:若是查找的位置上的數字等於當前數字說明查找成功,不然進行正向平方探針進行查詢,直到查找成功,或者遇到0(沒有數字),每一次進行hash運算,都得算做一次查找操做,一個數字最多查找table_size+1次。spa
#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; }