题目
思路
主要是对hash表搜索时间的题意理解,对于一个数据,如果找到它或者是发现它不存在就应该停止搜索,否则就要搜索msize次才能退出
代码
#include <iostream>
#include <vector>
using namespace std;
vector<int> vec;
int msize, n, m;
int sum_all = 0;
bool IsPrime(int num) {
if (num <= 1)
return false;
int sqr = sqrt(1.0 * num);
for (int i = 2; i <= sqr; ++i) {
if (num % i == 0)
return false;
}
return true;
}
bool Hash(int num) {
int cur = num % msize;
for (int i = 0; i < msize; ++i) {
int tmp = (cur + (int)pow(i, 2)) % msize;
if (vec[tmp] == -1){
vec[tmp] = num;
return true;
}
}
return false;
}
void Find(int num) {
int cur = num % msize;
bool founded = false;
for (int i = 0; i < msize; ++i) {
++sum_all;
int tmp = (cur + (int)pow(i, 2)) % msize;
if (vec[tmp] == num || vec[tmp] == -1) {
founded = true;
break;
}
}
if (!founded)
++sum_all;
}
int main()
{
cin >> msize >> n >> m;
while (!IsPrime(msize)) ++msize;
vec.resize(msize);
fill(vec.begin(), vec.end(), -1);
for (int i = 0; i < n; ++i) {
int tmp;
cin >> tmp;
if (!Hash(tmp))
cout << tmp << " cannot be inserted."<<endl;
}
for (int i = 0; i < m; ++i) {
int tmp;
cin >> tmp;
Find(tmp);
}
printf("%.1lf", (double)sum_all / m);
return 0;
}