写在前面
- 思路分析
- 计算大于msize最⼩素数,并赋值msize
- 建立长度为msize的数组。
- 平⽅方探测法插⼊a,迭代下标
pos = (a + j * j) % msize
- 插⼊失败,输出”X cannot be inserted.”
- 计算平均查找时间,迭代计算pos = (a + j * j) % msize
- 找到
v[pos]==a
,退出循环 - v[pos]不存在,表示没找到,退出循环
- ans除以m得到平均查找时间,然后输出
- 题目基础,15分钟a题
测试用例
input:
4 5 4
10 6 4 15 11
11 4 15 2
output:
15 cannot be inserted.
2.8
ac代码
#include <iostream>
#include <vector>
using namespace std;
bool isprime(int a)
{
if(a<=1) return false;
for(int i=2; i*i<=a; i++)
if(a%i==0) return false;
return true;
}
int main()
{
int msize, n, m, a;
scanf("%d %d %d", &msize, &n, &m);
while(!isprime(msize)) msize++;
vector<int> v(msize);
for(int i=0; i<n; i++)
{
scanf("%d", &a);
int flag = 0;
for(int j=0; j<msize; j++)
{
int pos = (a + j*j) % msize;
if(v[pos]==0)
{
v[pos] = a;
flag = 1;
break;
}
}
if(!flag) printf("%d cannot be inserted.\n", a);
}
int ans = 0;
for(int i=0; i<m; i++)
{
scanf("%d", &a);
for(int j=0; j<=msize; j++)
{
ans++;
int pos = (a+j*j)%msize;
if(v[pos]==a || v[pos]==0) break;
}
}
printf("%.1lf", ans*1.0/m);
return 0;
}
参考文章
- A1078 Hashing (25 分| 素数| 平方探测法,附详细注释,逻辑分析)
- 可对比分析
- 1145. Hashing – Average Search Time (25) – 甲级