1145 Hashing - Average Search Time (正向的平方探查法)
考察数据结构书上的hash的内容。
大致题意就是给出一组元素,按照哈希映射公式pos = (Data+k*k) mod Tablesize(哈希表大小为素数)确定可插入元素位置并插入,如果无法插入,就按行输出这个元素。
然后再给出一组元素,求出查找所有元素的平均查找长度。
注意点:
查找插入位置时, k取【0,Tablesize-1】
查找元素(无论成功或者失败)时,k取【0,Tablesize】
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 bool isPrime(int n) { 6 for(int i =2 ; i*i <=n ; ++i) 7 if(n %i == 0) return false; 8 return true; 9 } 10 int main() { 11 int msize,n,m; 12 cin>>msize>>n>>m; 13 while(!isPrime(msize)) msize++; 14 vector<int> mp(msize); 15 for(int i = 0; i < n; ++i) { 16 int a,flag = 0; 17 scanf("%d",&a); 18 for(int j = 0; j < msize; ++j) { //查找可插入位置 j~【0,msize-1】 19 int pos = (a+j*j) % msize; 20 if(mp[pos] == 0) { 21 mp[pos] = a; 22 flag = 1; 23 break; 24 } 25 } 26 if(flag == 0) printf("%d cannot be inserted.\n",a); 27 } 28 int a,ans = 0; 29 for(int i = 0; i < m; ++i) { 30 scanf("%d",&a); 31 for(int j = 0 ; j <= msize; ++j) {//查找元素 32 ans++; 33 int pos = (a+j*j)%msize; 34 if(mp[pos] == a || mp[pos] == 0) break; //找到 a,或空位,则退出循环 35 } 36 } 37 printf("%.1f",ans*1.0/m); 38 return 0; 39 }