哈希法建表时会发生冲突..解决冲突的方法:
(一)开放地址法_
此方法使用一个公式进行计算..当一个值发生位置冲突时..可以使用三种方法解决冲突...
公式: 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