给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
输入格式:
输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。
输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例:
4 5
24 15 61 88
输出样例:
4 0 1 3
散列表的应用加上线性探测法。。。
注意此题会有重复的元素输入,所以需要将某数的在散列表的位置记录下来。。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=1e6;
int n,p;
int vis[maxn]; //判断散列表某点是否已经有元素
int is[maxn]; //判断某一数字是否放入散列表
//初始化
void init ()
{
memset (vis,0,sizeof(vis));
memset (is,-1,sizeof(is));
}
int main()
{
scanf("%d%d",&n,&p);
init();
for (int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
int m=x%p;
//判断是否加入散列表
if(is[x]!=-1)
printf("%d",is[x]);
else if(!vis[m])
{
is[x]=m;
vis[m]=1;
printf("%d",m);
}
else //线性探测法
{
for (int k=1;k<=p/2;k++)
{
int temp;
temp=(m+k)%p;
//注意不要越界
if(!vis[temp]&&temp<p)
{
is[x]=temp;
vis[temp]=1;
printf("%d",temp);
break;
}
}
}
printf("%c",i==n-1? '\n':' ');
}
return 0;
}