目录
开放地址法的查找性能
线性探测法
平方探测法和双散列探测法
期望探测次数与装填因子的关系
分离链接法的查找性能
总结
散列表的性能分析
- 平均查找长度(ASL)用来度量散列表查找效率:成功、不成功
- 关键词的比较次数,取决于产生冲突的多少,影响产生冲突多少有以下三个因素:
- 散列函数是否均匀;
- 处理冲突的方法;
- 散列表的装填因子
开放地址法的查找性能
线性探测法
可以证明,线性探测法的期望探测次数满足下列公式:
(对插入和不成功查找而言)
(对成功查找而言)
当时,
- 插入操作和不成功查找的期望
- 成功查找的期望
在实际问题中,
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 |
,于是,经过公式计算得:
ASLu=5.70次,ASLs=2.11(实际计算ASLs=2.56)
平方探测法和双散列探测法
可以证明,平方探测法和双散列探测法探测次数满足下列公式:
(对插入和不成功查找而言)
(对成功查找而言)
当时,
- 插入操作和不成功查找的期望
- 成功查找的期望
在实际问题中,
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 |
,于是,通过公式计算得:
ASLu=5.56次,ASLs=2.09次(实际计算ASLs=2)。
期望探测次数与装填因子的关系
- 当装填因子的时候,各种探测法的期望探测次数都不大,也比较接近。
- 随着的增大,线性探测法的期望探测次数增加较快,不成功查找和插入操作的期望探测次数比成功查找的期望探测次数要大。
- 合理的最大装填因子应该不超过0.85
分离链接法的查找性能
所有地址链表的平均长度定义成装填因子,有可能超过1。
不难证明:其期望探测次数p为:
(对插入和不成功查找而言)
(对成功查找而言)
当时,
- 插入操作和不成功查找的期望
- 成功查找的期望
在实际问题中,
前面例子14个元素分布在11个单链表中,所以,故
期望ALSu=1.55次,ASLs=1.64次(实际计算ASLs为1.36).
总结
- (优点)选择合适的h(key),散列表的查找效率期望是常数O(1),它几乎与关键字的空间的大小n无关!也适合于关键字直接比较计算量大的问题
- 它是以较小的为前提。因此,散列方法是以空间换时间
- (缺点)散列方法的存储对关键字是随机的,不便于顺序查找关键字,也不适用与范围查找,或最大值最小值查找。
开放地址法
- (优点)散列表是一个数组,存储效率高,随机查找
- (缺点)散列表有“聚集”现象
分离链接法
- 散列表顺序存储和链式存储的结合,链表部分的存储效率和查找效率都比较低
- (优点)关键字删除不需要“懒惰删除”法,从而没有存储“垃圾”
- (缺点)太小的可能导致空间浪费,大的又将付出更多的时机代价。不均匀的链表长度导致时间效率的严重下降。
end
学习自:MOOC数据结构——陈越、何钦铭