案例5-1.3 整型关键字的散列映射 (25 分)

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

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

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

输入样例1:

4 5
24 15 61 88

输出样例1:

4 0 1 3

输入样例2:

4 5
5 6 6 6 5 

输出样例2

0 1 1 1 0

我悟了:哈希的实质就是不断取模操作
注意:
>=1000的最小质数是1009
那么开数组的话最小规模是[1010].否则第四个测试节点显示段错误:数组越界
(可以用指针或者开大数组规避这个问题)
②对相同整型关键字位置处理
③题目未明确指出”线性探测法“的增量是+还是-或者是±.
此处经过不断实验得到 ”线性探测法“的增量是+

#include<stdio.h>
int hash[1010],n,p,cnt,val,t;
int main()
{
    
    
	scanf("%d %d\n",&n,&p);
	while(n--)
	{
    
    
		scanf("%d",&t);//t:abbr of temp 
		val=t%p;
		while(hash[val%p]&&hash[val%p]!=t) val++;//循环中的第一个条件是冲突,第二个条件是已经存入了相同值,满足其一就结束循环 
		hash[val%p]=t;
		printf(!cnt++?"%d":" %d",val%p);//控制格式 
	} 
}

猜你喜欢

转载自blog.csdn.net/weixin_49640089/article/details/114133017