7-42 整型关键字的散列映射 (25 分)
给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射到长度为P的散列表中。用线性探测法解决冲突。
输入格式:
输入第一行首先给出两个正整数N(≤1000)和P(≥N的最小素数),分别为待插入的关键字总数、以及散列表的长度。第二行给出N个整型关键字。数字间以空格分隔。
输出格式:
在一行内输出每个整型关键字在散列表中的位置。数字间以空格分隔,但行末尾不得有多余空格。
输入样例:
4 5
24 15 61 88
输出样例:
4 0 1 3
首先要了解什么是线性探测再散列,其次就是该问题中要注意的点:有重复关键字。因此要创建一个Num数组保存是否num在之前出现过。
#include<iostream>
using namespace std;
#define MAXN 2000
int visited[MAXN] = {0};
int Num[1000000]; //标记该数字是否出行过
int main()
{
for(int i = 0;i<1000000;i++)
Num[i] = -1;
int n,p;
cin>>n>>p;
for(int i = 0;i<n;i++)
{
int num;
cin>>num;
int l = num%p;
if(i!=0)
cout<<" ";
if(Num[num]!=-1)
{
cout<<Num[num];
continue;
}
if(!visited[l])
{
visited[l] = 1;
Num[num] = l;
cout<<l;
}
else
{
for(int j = 1;j<p;j++)
{
int temp = (num+j)%p;
if(visited[temp]==0)
{
visited[temp] = 1;
Num[num] = temp;
cout<<temp;
break;
}
}
}
}
return 0;
}