哈希表的查找和算法

数据结构的一道题目:

设有一组关键字{12,11,35,25,22,58},采用哈希函数:H(key)=key%6,采用开放
地址法的二次探测再哈希方法解决冲突,试在0~10的哈希地址空间中对该关键字序列
构造哈希表。

解法:
依题,m=11,二次探测再哈希的下一地址计算公式为
d1=H(key),
d2=(d1+i*i)%m,
d3=(d1-i*i)%m
其中(i=1,2,3,...)
则有:
H(12)=12%6=0
H(11)=11%6=5
H(35)=35%6=5(冲突)
H(35)=(5+1*1)%11=6
H(25)=25%6=1
H(22)=22%6=4
H(58)=58%6=4(冲突)
H(58)=(4+1*1)%11=5(冲突)
H(58)=(4-1*1)%11=3

[b]对应的构造算法实现:[/b]


#include<iostream>
using namespace std;

void CrtHash(int a[],int val,int n1,int n2)
{
int temp=val%n1; //没有冲突
if(a[temp]==0){a[temp]=val;return;}
else //发生冲突
{
int temp1;
for(int j=1;;++j)
{
temp1=(temp+j*j)%n2;
if(a[temp1]==0){a[temp1]=val;return;}

temp1=(temp-j*j)%n2;
if(a[temp1]==0){a[temp1]=val;return;}
}
}
}

int main()
{
int KEY[6]={12,11,35,25,22,58};
int hashtable[11];
memset(hashtable,0,sizeof(hashtable));

for(int i=0;i<6;++i)
{
CrtHash(hashtable,KEY[i],6,11);
}
for(int i=0;i<11;++i)
{
cout<<hashtable[i]<<" ";
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值