61散列表的性能分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
'''
散列表的性能分析
平均查找长度ALS 用来度量散列表查找效率:成功、不成功。
关键词的比较次数,取决于产生冲突的多少,
影响产生冲突多少的因素有:
1、散列函数是否均匀
2、处理冲突的方式
3、散列表的装填因子a

一、线性探测法查找性能分析
线性探测法期望探测次数满足以下公式:
p = 0.5 * [1+1/(1-a)^2] # 插入和不成功查找
p = 0.5 * [1+1/(1-a)] # 成功查找
查找次数的期望仅仅和 a装填因子 有关。

二、平方探测法和双散列探测法查找性能
探测次数满足以下公式:
p = 1/(1-a) # 插入和不成功查找
p = -(1/a) * In(1-a) # 成功查找哦
查找次数的期望仅仅和 a装填因子 有关。

三、分离链接法的查找性能
所有地址链表 的平均长度定义成 装填因子a,a有可能超过1,
期望探测次数有如下公式:
p = a + e^(-a) # 插入和不成功查找
p = 1 + a/2 # 成功查找
注意:装填因子的定义和 开放地址法的 是不一样的。

回顾散列查找的特点:
一、优点:
复杂度和问题的规模没有关系,不像搜索树logN 这样和规模N有关。
只要不冲突就是一次算出位置,不用一个一个比较找位置。
二、优点:
适用于str字符串管理,因为关键词key经常是字符串,一个一个比较不方便。
散列表直接把str转为了数字。
三、a小冲突就少,散列表是以空间换时间的做法。
四、缺点:
散列表存储关键字是随机的,不便于顺序查找关键字,
比如 不适合查询 范围、最大值、最小值。

开放地址法 与 分离链接法的比较:
开放地址法
优点:散列是一个数组,存储效率高,随机查找。
缺点:有"聚集"现象。
分离链接法
优点:关键词删除不需要"懒惰删除",没有存储垃圾。
缺点:a小,链表短了,可能需要更多的数组空间来细分位置,
从而浪费空间。
a大,链表长了,一旦进入了链表内的查找,效率低。
'''