7-7 整型关键字的散列映射 (25分)

今天一天因为这道题 荒废了一天
裂开。。。。大于1000的第一个质数不是1001呀,妈呀,是1009。
也怪自己直接new一下也不会错一下午。是我太菜了。。。

7-7 整型关键字的散列映射 (25分)
给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。

输入格式:
输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。

输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。

输入样例:

4 5
24 15 61 88

输出样例:

4 0 1 3

这题其实不难的,很简单hash冲突的处理方式–线性探测
注意有坑,关键字值相同的只存一次,不在重复插入了

#include
#include
using namespace std;
int n, p;
int Hash_get(int x);//hash查找
int a[1005] = { 0 };
int* hash_list;
int main()
{
	ios::sync_with_stdio(false);
	cin >> n >> p;
	hash_list = new int[p]; 
	//最后一个样例错了一下午,原来大于1000的最小质数不是1001,而是1009.开始hash_list[1005]错了一下午
	memset(hash_list, 0, sizeof(int) * p);
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
		if (i) cout << " ";
		cout << Hash_get(a[i]);
	}
	cout << endl;
	delete[]hash_list;
	return 0;
}
int Hash_get(int x)
{
	int val = x % p;
	while (hash_list[val % p] && hash_list[val % p] != x) val++;
	/*满足两个条件 第一hash冲突
	第二x在之前已经映射进hash_list
	因为他会有关键字一样的,这样不用在加了,直接输入第一次出现时的映射值而不是新的,也就是说一样的值只插入一次
	比如 4 5 1 1 1 1 ,答案应该都是1.不是1 2 3 4
	*/
	hash_list[val % p] = x;
	return val % p;
}

这几天争取把剩下的都做完,还剩几天了,加油!!
到时候可以把全部的代码放到github上了。嘻嘻

你可能感兴趣的:(DataStructure)