题175.2021秋周练习-3-4 整型关键字的散列映射 (25 分)
一、题目
二、题解
考察除留余数法+线性探测。注意一点,当关键值重复时有可能是碰到了之前一样的data,此时应该输出之前data对应的关键值,判断依据就是那个所谓的hashdata[pos]==data了。
#include <bits/stdc++.h>
using namespace std;
int hashdata[10001];//我们设一个一维数组hashdata,下标表示关键值,即散列到的位置,数组元素表示存放的数据。
int main()
{
fill(hashdata,hashdata+10001,-1);//我们可以确保要放的数必定是非负数,不然除留余数得到了负数位置你就对头吗
int N,P;
cin>>N>>P;
for(int i=0; i<N; i++)
{
int data;
scanf("%d",&data);
int j=0;
while(1)//直接一个无限循环除留余数找位置,在循环里头满足条件再退出去
{
int pos=(data+(j++))%P;//每过一个循环j就会加1,即往后探测一位(当然求余之后可能位置会跑前面去)
if(hashdata[pos]==-1||hashdata[pos]==data)//当pos位置未被占用或者那个位置放的就是当前data,则停止找位置,做输出操作
{
hashdata[pos]=data;
if(i>0)
{
putchar(' ');
}
printf("%d",pos);
break;
}
if(j==P)//所有位置都已经放过了,退出来
{
break;
}
}
}
}