PAT A1078 Hashing (25) [⼆次⽅探查法 素数 质数]

题目

题目链接 PAT A1078
hash表,平方探测解决冲突,插入数据并返回插入位置
注:hash表长必须为质数,若不为质数,需要转换为大于指定表长n的最小质数为表长

解题思路

平方探测hash函数H(key)=(key+d*d)%m;(d=0,1,2,..表长-1)
1 若不冲突,插入返回位置
2 若冲突,平方探测,有空位置,插入并返回位置
3 若冲突,平方探测,探测一轮后i从0~表长-1,没有空位置,打印'-'

易错点

1 找到插入位置后,除了打印,还要将数据插入该位置或者标记该位置已占用

单词语法

Quadratic probing /kwɑˈdrætɪk/ 二次探测
(with positive increments only) 只正序探测
solve the collisions 解决冲突

Code

Code 01

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
bool isPrime(int x) {
	if(x<=1)return false;
	int sqr = (int)sqrt(1.0*x);
	for(int i=2; i<=sqr; i++) {
		if(x%i==0)return false;
	}
	return true;
}
int main(int argc,char * argv[]) {
	int m,n,k;
	scanf("%d%d",&m,&n);
	while(!isPrime(m))m++;
	int ht[m]= {0};
	for(int i=0; i<n; i++) {
		scanf("%d",&k);
		int h = k%m;
		//平方探测
		int j;
		for(j = 0; j<m&&ht[(h+j*j)%m]!=0; j++);
		if(i!=0)printf(" ");
		if(j>=m)printf("-"); //如果没有探测到位置 
		else { //如果探测到位置 
			int hq = (h+j*j)%m;
			ht[hq]=k;
			printf("%d",hq);
		}
	}
	return 0;
}
posted @ 2020-07-18 22:18  JamieHou  阅读(119)  评论(0编辑  收藏  举报