[PAT-A 1078]Hashing

在这里插入图片描述
题目大意:
给出散列表长TSize和欲插入的元素,将这些元素按读入的顺序插入散列表中,其中散列函数为H(key)=key%TSize,Hash冲突的解决采用平方探查法(正向增加)。
如果题目给叔的TSize不是素数,那么需要将TSize重新赋值为第一个比TSize大的素数元素进行插入。

思路:
1)首先对于一个输入的TSize,如果不是素数,则必须找见一个比它大的素数。
2)开一个bool类型数组HashTable,HashTable[i]==false表示key=i号位未被使用,对每个插入的元素a,计算H(a)并判断对应的位置是否可以使用,。
1.如果未被使用, 那么找见插入的位置,并输出。
2.如果已经被使用,那么下一个检查值key=(a+step*step)%TSize,判断该位置是否被使用,如果使用,则令step++,再进行判断, 当step=Tsize时还没有找见,则表示没有位置。

//PAT_A 1078
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int N = 11111;
bool isPrime(int n) {
	if (n <= 1)return false;
	int sqr = (int)sqrt(1.0 * n);
	for (int i = 2; i <= sqr; i++) {
		if (n % i == 0)return false;
	}
	return true;
}
bool HashTable[N] = { false };//HashTable[i]==false,表示i号位没有被使用
int main() {
	int n, Tsize, a;
	(void)scanf("%d %d", &Tsize, &n);
	while (isPrime(Tsize) == false)Tsize++;
	for (int i = 0; i < n; i++) {
		(void)scanf("%d", &a);
		int key = a % Tsize;
		if (HashTable[key] == false) {
			HashTable[key] = true;
			printf("%d", key);
		}
		else {
			int step;
			for (step = 1; step < Tsize; step++) {
				key = (a + step * step) % Tsize;
				if (HashTable[key] == false) {
					HashTable[key] = true;
					printf("%d", key);
					break;
				}
			}
			if (step == Tsize)printf("-");
		}
		if (i < n - 1)printf(" ");
	}
	return 0;
}

发布了142 篇原创文章 · 获赞 1 · 访问量 4576

猜你喜欢

转载自blog.csdn.net/weixin_44699689/article/details/104282063