平方探测法是解决哈希冲突的一个方法,数值a的位置为num[a+i*i],i从0开始到size-1(哈希表长),有空位就插入,停止循环,没有就继续。有这种情况就是循环了size-1但依旧没有位置插入,则判定为此数不可以插入。
平均查找时间即为总查找次数/查找个数。查找方法和插入方法相同,找num[a+i*i],看是不是查找数a,没有找到则继续,找到或者该位置为空则停止。
但个题有个小问题,也不知道为啥查找时要从0找到size而不是size-1,好奇怪
1145 Hashing - Average Search Time
int num[20000]; //虽然说不超过10000,但是如果输入10000,则要求一个比他大的素数会超过10000
int si;
bool prime(int a) //判断素数
{
if (a <= 1)
return false;
for (int i = 2;i <= sqrt(a);i++)
{
if (a%i == 0)
return false;
}
return true;
}
void insert(int a)
{
int i;
for (i = 0;i < si;i++)
{
if (num[(a + i*i) % si] == -1)
{
num[(a + i*i) % si] = a;
break;
}
}
if (i == si)
printf("%d cannot be inserted.\n", a);
}
int find(int a)
{
int i,all = 0;
for (i = 0;i <= si;i++) //按道理不应该有等号,但是不知道为啥这个题这样
{
all++;
if (num[(a + i*i) % si] == a|| num[(a + i*i) % si] == -1) //如果为空也停止查找
break;
}
return all;
}
int main(void)
{
int l1, l2, i;
scanf("%d%d%d", &si, &l1, &l2);
memset(num, -1, sizeof(num));
while (!prime(si))
si++;
for (i = 0;i < l1;i++)
{
int a;
scanf("%d", &a);
insert(a);
}
int alltime = 0;
for (i = 0;i < l2;i++)
{
int a;
scanf("%d", &a);
alltime+=find(a);
}
printf("%.1f\n", alltime*1.0 / l2);
return 0;
}