目录

开放地址法的查找性能

线性探测法

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

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

分离链接法的查找性能

总结


散列表的性能分析

  • 平均查找长度(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) 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

\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) 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

\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数据结构——陈越、何钦铭

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐