数据结构和算法——散列表的性能分析(开放地址法的查找性能、期望探测次数与装填因子的关系、分离链接法的查找性能)

目录

开放地址法的查找性能

线性探测法

平方探测法和双散列探测法

期望探测次数与装填因子的关系

分离链接法的查找性能

总结


散列表的性能分析

  • 平均查找长度(ASL)用来度量散列表查找效率:成功、不成功
  • 关键词的比较次数,取决于产生冲突的多少,影响产生冲突多少有以下三个因素
  1. 散列函数是否均匀;
  2. 处理冲突的方法;
  3. 散列表的装填因子\alpha

开放地址法的查找性能

线性探测法

可以证明,线性探测法的期望探测次数满足下列公式:

p=\frac{1}{2}\left [ 1+\frac{1}{​{(1-\alpha )}^2} \right ](对插入和不成功查找而言)

p=\frac{1}{2}\left ( 1+\frac{1}{1-\alpha } \right )(对成功查找而言)


\alpha =0.5时,

  • 插入操作和不成功查找的期望ASLu=0.5*\left [ 1+ \frac{1}{​{(1-0.5)}^2}\right ]=2.5
  • 成功查找的期望ASLs=0.5*\left ( 1+\frac{1}{1-0.5} \right )=1.5

在实际问题中,

H(key)0123456789101112
key1130477299845420
冲突次数060010313

\alpha =9/13=0.69,于是,经过公式计算得:

ASLu=5.70次,ASLs=2.11(实际计算ASLs=2.56)

平方探测法和双散列探测法

可以证明,平方探测法和双散列探测法探测次数满足下列公式:

p=\frac{1}{1-\alpha }(对插入和不成功查找而言)

p=-\frac{1}{\alpha }\ln(1-\alpha )(对成功查找而言)


\alpha =0.5时,

  • 插入操作和不成功查找的期望ASLu=\frac{1}{1-0.5}=2
  • 成功查找的期望ASLs=-\frac{1}{0.5}\ln (1-0.5)\approx 1.39

在实际问题中,

H(key)012345678910
key1130204784729954
冲突次数033020100

\alpha =9/11=0.82,于是,通过公式计算得:

ASLu=5.56次,ASLs=2.09次(实际计算ASLs=2)。

期望探测次数与装填因子的关系

  •  当装填因子\alpha < 0.5的时候,各种探测法的期望探测次数都不大,也比较接近。
  • 随着\alpha的增大,线性探测法的期望探测次数增加较快,不成功查找和插入操作的期望探测次数比成功查找的期望探测次数要大
  • 合理的最大装填因子应该不超过0.85

分离链接法的查找性能

所有地址链表的平均长度定义成装填因子\alpha\alpha有可能超过1。

不难证明:其期望探测次数p为:

p=\alpha +e^{-\alpha }(对插入和不成功查找而言)

p=1+\frac{\alpha }{2}(对成功查找而言)


\alpha =1时,

  • 插入操作和不成功查找的期望ASLu=1+e^{-1}=1.37
  • 成功查找的期望ASLs=1+\frac{1}{2}=1.5

在实际问题中,

前面例子14个元素分布在11个单链表中,所以\alpha =14/11\approx 1.27,故

期望ALSu=1.55次,ASLs=1.64次(实际计算ASLs为1.36).

总结

  • (优点)选择合适的h(key),散列表的查找效率期望是常数O(1),它几乎与关键字的空间的大小n无关!也适合于关键字直接比较计算量大的问题
  • 它是以较小的\alpha为前提。因此,散列方法是以空间换时间
  • (缺点)散列方法的存储对关键字是随机的,不便于顺序查找关键字,也不适用与范围查找,或最大值最小值查找。

开放地址法

  • (优点)散列表是一个数组,存储效率高,随机查找
  • (缺点)散列表有“聚集”现象

分离链接法

  • 散列表顺序存储和链式存储的结合,链表部分的存储效率和查找效率都比较低
  • (优点)关键字删除不需要“懒惰删除”法,从而没有存储“垃圾”
  • (缺点)太小的\alpha可能导致空间浪费,大的\alpha又将付出更多的时机代价。不均匀的链表长度导致时间效率的严重下降。

    end


    学习自:MOOC数据结构——陈越、何钦铭

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值