传送门
给定一系列整型关键字和素数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);//控制格式
}
}