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 }

 

posted @ 2020-03-14 13:22  tangq123  阅读(210)  评论(0编辑  收藏  举报