最后一个,线性探测hash表,跟上一个平方探测基本类似,触类旁通型的。
详情***看注释***
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int n,p;
int hash[1510],v[1510];//定义存储数值的hash表,定义存储数值在hash表中的位置的v数组(位谐音v)
while(cin>>n>>p){
memset(hash,-1,sizeof(hash));//给hash表赋初值-1
int j = 0;//j用来记录位置函数v的增加
for(int i=0; i<n; i++){
int x;
cin>>x;
int z = x%p;//每一个值对表长进行取余
if(hash[z]==-1){//如果哈希表的当前位置没有值,则把数值放到此地,并记录下数值在hash表中的位置,j++
hash[z] = x;
v[j++] = z;
}
else{//否则的话开始线性探测,直至探测到没有值的位置
int f = 1;
int d = 1;//此时的d是用于标记的
int mid = z;//以当前的z值为起点
while(hash[mid]!=-1){//向右寻找
if(hash[mid]==x){//如果hash表中的数值等于目前的数值,只需要记录下当前的位置即可
v[j++] = mid;
d = 0;//标记为已经找到数值的位置
break;
}
mid = (z+f)%p;//线性探测也别忘了对表长取余
f++;//越来越远
}
if(d){
hash[mid] = x;
v[j++] = mid;
}
}
}
for(int i=0; i<j; i++){
if(i==j-1)
cout<<v[i]<<endl;
else
cout<<v[i]<<" ";
}
}
return 0;
}