问题描述
ASL 指的是平均查找时间
关键字序列:(7、8、30、11、18、9、14)
散列函数: H(Key) = (key x 3) MOD 7
装载因子: 0.7
处理冲突: 线性探测再散列法
查找成功的 ASL 计算方法:
因为现在的数据是 7 个,填充因子是 0.7。所以数组大小=7/0.7=10,即写出来的散列表大小为 10,下标从 0~9。
第一个元素 7,带入散列函数,计算得 0。
第二个元素 8,带入散列函数,计算得 3。
第三个元素 30,带入散列函数,计算得 6。
第四个元素 11,带入散列函数,计算得 5。
第五个元素 18,带入散列函数,计算得 5;此时和 11 冲突,使用线性探测法,得 7。
第六个元素 9,带入散列函数,计算得 6;此时和 30 冲突,使用线性探测法,得 8。
第七个元素 14,带入散列函数,计算得 0;此时和 7 冲突,使用线性探测法,得 1。
所以散列表:
地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
key | 7 | 14 | 8 | 11 | 30 | 18 | 9 | |||
成功 | 1 | 2 | 1 | 1 | 1 | 3 | 3 | |||
不成功 | 3 | 2 | 1 | 2 | 1 | 5 | 4 |
所以查找成功的计算:
如果查找 7,则需要查找 1 次。
如果查找 8,则需要查找 1 次。
如果查找 30,则需要查找 1 次。
如果查找 11,则需要查找 1 次。
如果查找 18,则需要查找 3 次:第一次查找地址 5,第二次查找地址 6,第三次查找地址 7,查找成功。
如果查找 9,则需要查找 3 次:第一次查找地址 6,第二次查找地址 7,第三次查找地址 8,查找成功。
如果查找地址 14,则需要查找 2 次:第一次查找地址 0,第二次查找地址 1,查找成功。
所以,ASL=(1+2+1+1+1+3+3)/ 7=12/ 7
查找不成功的 ASL 计算方法
1. 定义什么叫查找不成功
举个例子来说吧。在已知上面散列表的基础上,如果要查找 key 为 4 的关键字。根据散列函数可以计算 Hash(key)=Hash(4)=5。此时在地址为 5 的地方取出那个数字,发现 key=11,不等于 4。这就说明在装填的时候会发生冲突。根据冲突处理方法,会继续检测地址为 6 的值,发现 key=30,依然不等。这个时候到了地址为 6,但是依然没有找到。那么就说明根本就没有 key=4 这个关键字,说明本次查找不成功。注意:为什么到地址 6?因为散列函数中有 mod7 ,对应的地址为 0~6,即 0~6 查找失败的查找次数。
再举一个例子。查找 key 为 0的关键字,根据散列函数可以计算 Hash(key)=Hash(0)=0。此时在地址为 0 的地方取出那个数字,发现 key=7,不等于 0。这就说明在装填的时候会发生冲突。根据冲突处理方法,会继续检测地址为 1 的值,发现 key=14,依然不等。这个时候到了 地址为 2,发现为空,依然没有找到。所以停止查找,本次查找不成功。因为如果 key=0 这个关键字存在的话,依照冲突处理函数,就一定能找到它。总不能丢了吧。
2. 根据第一点定义的不成功,依次推下去:
查找地址为 0 的值所需要的次数为 3,
查找地址为 1 的值所需要的次数为 2,
查找地址为 2 的值所需要的次数为 1,
查找地址为 3 的值所需要的次数为 2,
查找地址为 4 的值所需要的次数为 1,
查找地址为 5 的值所需要的次数为 5,
查找地址为 6 的值所需要的次数为 4。 3.计算
查找不成功 ASL=(3+2+1+2+1+5+4)/ 7=18/ 7
原博客地址:https://www.cnblogs.com/qixinbo/p/7782314.html
链地址法
假设散列表的长度是 13,散列函数为 H(K) = k % 13,给定的关键字序列为{32, 14, 23, 01, 42, 20, 45, 27, 55, 24, 10, 53}。
查找成功时的平均查找长度:
ASL = (1*6+2*4+3*1+4*1)/12 = 7/4
查找不成功时的平均查找长度:
ASL = (4+2+2+1+2+1)/13
注意:查找成功时,分母为哈希表元素个数,查找不成功时,分母为 mod 的 K 值。