1 前言
- 平均查找长度(ASL)用来度量散列表查找效率:成功、不成功
- 关键词的比较次数,取决于产生冲突的多少
影响产生冲突多少有以下三个因素:
(1)散列函数是否均匀;
(2)处理冲突的方法;
(3)散列表的装填因子α。
分析:不同冲突处理方法、装填因子对效率的影响
2 线性探测法的查找性能
可以证明,线性探测法的期望探测次数 满足下列公式:
当α= 0.5时,
插入操作和不成功查找的期望 ASLu = 0.5*(1+1/(1-0.5) 2 ) = 2.5 次
成功查找的期望 ASLs = 0.5*(1+1/(1-0.5) ) = 1.5次
h(key) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
key | 11 | 30 | 47 | 7 | 29 | 9 | 84 | 54 | 20 | ||||
冲突次数 | 0 | 6 | 0 | 0 | 1 | 0 | 3 | 1 | 3 |
α= 9/13=0.69,于是
期望 ASLu = 0.5*(1+1/(1-0.69) 2 ) = 5.70次
期望 ASLs = 0.5*(1+1/(1-0.69) ) = 2.11次(实际计算ASLs =2.56)
根据公式算出来的只是一个期望值,顶部是实际的成功平均查找长度(ASLs)与不成功平均查找长度 (ASLu)
3 平方探测法和双散列探测法的查找性能
可以证明,平方探测法和双散列探测法探测次数 满足下列公式:
当α= 0.5时,
插入操作和不成功查找的期望 ASLu = 1/(1-0.5) = 2 次
成功查找的期望 ASLs = -1/0.5* ln(1-0.5) ≈ 1.39 次
h(key) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|---|
key | 11 | 30 | 20 | 47 | 84 | 7 | 29 | 9 | 54 | ||
冲突次数 | 0 | 3 | 3 | 0 | 2 | 0 | 1 | 0 | 0 |
α= 9/11=0.82,于是
期望 ASLu = 1/(1-0.82) ≈ 5.56次
期望 ASLs = -1/0.5* ln(1-0.5) ≈ 2.09次(例中ASLs =2)。
下面通过一个图更加直观的反应在不同的填充因子下,期望查找次数的变化。
从图中可以看到:
(1)当装填因子α< 0.5的时候,各种探测法的期望探测次数都不大,也比较接近。
(2)随着 α 的增大,线性探测法的期望探测次数增加较快,不成功查找和插入操作的期望探测次数比成功查找的期望探测次数要大。
(3)合理的的最大装入因子α应该不超过0.85。
4 分离链接法的查找性能
所有地址链表的平均长度定义成装填因子α,α有可能超过1。
其期望探测次数 p为:
当α = 1时
插入操作和不成功查找的期望 ASLu = 1+e-1 = 1.37 次,
成功查找的期望 ASLs = 1+1/2 = 1.5 次。
前面例子14个元素分布在11个单链表中,所以α= 14/11≈1.27, 故
期望 ASLu = 1.27+e-1.27 ≈ 1.55次
期望 ASLs = 1+1.27/2 ≈ 1.64次(例中ASLs =1.36)。
5 散列查找优缺点比较:
优点: 选择合适的 h(key) ,散列法的查找效率期望是常数O(1),它几乎与关键字的空间的大小n无关!也适合于关键字直接比较计算量大的问题
中性:它是以较小的α为前提。因此,散列方法是一个以空间换时间它是以较小的α为前提。因此,散列方法是一个以空间换时间
缺点:散列方法的存储对关键字是随机的,不便于顺序查找关键字,也不适合于范围查找,或最大值最小值查找。
开放地址法优缺点比较:
优点:散列表是一个数组,存储效率高,随机查找。
缺点:散列表有“聚集”现象
总结
- 了解线性探测法,平方探测法,分离链表法的查找性能。
- 了解散列查找优缺点