您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之查找七:线性之哈希表

2015-12-03 14:37 381 查看

数据结构实验之查找七:线性之哈希表


TimeLimit:1000msMemorylimit:65536K有疑问?点这里^_^

题目描述

根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突。重复关键字放在hash表中的同一位置。

输入

连续输入多组数据,每组输入数据第一行为两个正整数N(N<=1000)和p(p>=N的最小素数),N是关键字总数,p是hash表长度,第2行给出N个正整数关键字,数字间以空格间隔。

输出

输出每个关键字在hash表中的位置,以空格间隔。注意最后一个数字后面不要有空格。

示例输入

55
2121212121
45
24156188
45
24396115
55
2439611539


示例输出

11111
4013
4012
40120


/*有关于哈希表的线性探测法解决冲突的方法仔细阅读下例:

【题目】已知一组关键字为(26,36,41,38,44,15,68,12,06,51),用除余法构造散列函数,用线性探查法解决冲突构造这组关键字的散列表。

【解答】为了减少冲突,通常令装填因子α(即上题中的素数)由除余法的散列函数计算出的上述关键字序列的散列地址为(0,10,2,12,5,2,3,12,6,12)。
 前5个关键字插入时,其相应的地址均为开放地址,故将它们直接插入T[0],T[10),T[2],T[12]和T[5]中。
 当插入第6个关键字15时,其散列地址2(即h(15)=15%13=2)已被关键字41(15和41互为同义词)占用。故探查h1=(2+1)%13=3,此地址开放,所以将15放入T[3]中。
 当插入第7个关键字68时,其散列地址3已被非同义词15先占用,故将其插入到T[4]中。
 当插入第8个关键字12时,散列地址12已被同义词38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%13=1,此地址开放,可将12插入其中。
 类似地,第9个关键字06直接插入T[6]中;而最后一个关键字51插人时,因探查的地址12,0,1,…,6均非空,故51插入T[7]中。

*/


#include<algorithm>
#include<iostream>
#include<numeric>
#include<cstring>
#include<iomanip>
#include<string>
#include<vector>
#include<cstdio>
#include<queue>
#include<stack>
#include<cmath>
#include<map>
#include<set>
#defineLLlonglong
constintM=1001000;
constdoubleesp=1e-6;
constdoublePI=3.14159265359;
constintINF=0x3f3f3f3f;
usingnamespacestd;
intarr[1024];
intmain(){
intn,m,ant;
while(~scanf("%d%d",&n,&m)){
memset(arr,-1,sizeof(arr));
for(inti=0;i<n;i++){
scanf("%d",&ant);
if(arr[ant%m]==-1){
printf(i==0?"%d":"%d",ant%m);
arr[ant%m]=ant;
}
else{
intflag=-1;
for(intj=0;j<m;j++){
if(arr[j]==ant){
flag=j;
break;
}
}
if(flag!=-1){
printf(i==0?"%d":"%d",flag);
}
else{
for(intj=ant%m;1;j++){
if(arr[j%m]==-1){
printf(i==0?"%d":"%d",j%m);
arr[j%m]=ant;
break;
}
}
}
}
}
printf("\n");
}
return0;
}

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: