初学哈希函数

哈希法建表时会发生冲突..解决冲突的方法:  

(一)开放地址法_ 

   此方法使用一个公式进行计算..当一个值发生位置冲突时..可以使用三种方法解决冲突...

公式: Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)  //m表示数据的个数 = 地址的个数 ; di是变量值

三种方法的不同在于di的取值方式的不同...

1.线性探测再散列.

di值可能为1,2,3,...m-1,称线性探测再散列

2.二次探测再散列.

如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,4,-4,9,-9,16,-16,...k*k,-k*k(k<=m/2)//即±k^2(k <= m/2);

 3. 随机探测再散列。

di取值可能为伪随机数列。

实例:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key)=key%7计算散列地址,并散列存

储在散列表A[0..6]中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为___


A.1.5 B.1.7 C.2.0 D.2.3

分析:利用该散列函数散列存储结果为
63|48|38|25|74|52

位置 0 1 2 3 4 5 6

平均查找长度=总的查找次数/元素数=(1*3+2*1+3*1+4*1)/6=2.0

参考答案:(52)C
具体分析:
要计算散列表上的平均查找长度,我们首先必须要知道在建立这个散列表时,每个数据存储时进行了几次散列。这样就知道哪一个元素,查找的长度是多少。

散列表的填表过程如下:

首先存入第一个元素38,由于h(38)=38%7=3,又因为3号单元现在没有数据,所以把38存入3号单元。

接着存入第二个元素25,由于h(25)=25%7=4,又因为4号单元现在没有数据,所以把25存入4号单元。 

接着存入第三个元素74,由于h(74)=74%7=4,此时的4号单元已经被25占据,所以进行线性再散列,线性再散列的公式为:Hi=(H(key)+di)% m ,其中的di=1,2,3,4...。所以H1=(4+1)%7=5,此时的单元5没有存数据,所以把74存入到5号单元。 

接着存入第四个元素63,由于h(63)=63%7=0,此时的0号单元没有数据,所以把63存入0号单元。

接着存入第五个元素52,由于h(52)=52%7=3,此时的3号单元已被38占据,所以进行线性再散列:H1=(3+1)%7=4,但4号单元也被占据了,所以再次散列:H2=(3+2)%7=5,但5号单元也被占据了,所以再次散列:H3=(3+3)%7=6,6号单元为空,所以把52存入6号单元。

最后存入第六个元素48,由于h(48)=48%7=6,此时的6号单元已被占据,所以进行线性再散列:H1=(6+1)%7=0,但0号单元也被占据了,所以再次散列:H2=(6+2)%7=1,1号单元为空,所以把48存入1号单元。 

如果一个元素存入时,进行了N次散列,相应的查找次数也是N,所以38,25,63这三个元素的查找长度为1,74的查找长度为2,48的查找长度为3,52的查找长度为4。所以平均查找长度为:(1+1+1+2+3+4)/6=2。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(二)再哈希法:

H_i = RH_i (key) | i = 1, 2, ... k;

RH_i 均是不同的哈希函数..如果发生冲突则.按照i的顺序 调用不同的哈希函数继续计算..直到不再发生冲突..

相应的查找时候 也是需要多次 哈希查找...

(三)链地址法

在线性表中存放数据..但是当发生冲突时候.在该数据上做链表..也就是将若干个冲突数据.放到一个链表里..链表中可以是有序的..便于查找.

(四)公共溢出区

将产生冲突的数据统统放到溢出区中..可以对溢出排序..便于查找..


部分摘自网络..2013年12月1日12:44:59





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值