E - 数据结构实验之查找七:线性之哈希表
Description
根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突。重复关键字放在hash表中的同一位置。
Input
连续输入多组数据,每组输入数据第一行为两个正整数N(N <= 1500)和p(p >= N的最小素数),N是关键字总数,p是hash表长度,第2行给出N个正整数关键字,数字间以空格间隔。
Output
输出每个关键字在hash表中的位置,以空格间隔。注意最后一个数字后面不要有空格。
Sample
Input
5 5 21 21 21 21 21 4 5 24 15 61 88 4 5 24 39 61 15 5 5 24 39 61 15 39
Output
1 1 1 1 1 4 0 1 3 4 0 1 2 4 0 1 2 0
Submit
Solutions
Time Limit | 1000 ms |
Mem. Limit | 65536 KiB |
Source | xam |
思路:构建哈希表并存储,数组地址是通过mod p获得,如果该地址存有数,则+1;然后每完成一次操作将地址推入栈顶,最后只需要输出栈中元素即可
代码如下:
#include <bits/stdc++.h>
using namespace std;
int s[1509];
int main()
{
ios::sync_with_stdio(false);
int n,p;
while(cin>>n>>p){
int pop[1899],c=0;
memset(s,0,sizeof(s));
while(n--){
int key;
cin>>key;
int k=key%p;
k=abs(k);
while(1){
if(s[k]==key){pop[++c]=k;
break;
}
else if(!s[k]){
s[k]=key;pop[++c]=k; break;
}
else{
k++;
if(k==p)k=0;
}
}
}
for(int i=1;i<=c;++i){
printf("%d%c",pop[i],i==c?'\n':' ');
}
}
return 0;
}