算法导论—散列表

华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/9/8

散列表(hash table)是一种支持高效插入,查询,删除操作的动态集合结构。并且在满足一些合理假设下,这些操作的平均时间复杂度可以达到 Θ(1) ,这也是散列表能够和二叉搜索树(红黑树)抗衡的一个重要方面。

一、直接寻址表
当关键字集合很小的时候,例如 [1,2,...,m] ,直接寻址法的思路是分配一个长度为 m 的直接寻址表 T ,每个关键字 k 对应数组中唯一的一个元素 T(k) ,数组中每一个元素保存一个指向这个关键字对应的数据结构。进行插入,查询,删除操作的时候,时间复杂度严格的等于 Θ(1)
缺点:关键字集合比较大的时候,需要的直接寻址表的存储空间太大。

二、散列表
关键字全域 |U| 远大于散列表长度 m 时,利用散列函数(hash function) h(k) 将关键字 k 映射到散列表 Th(k) 槽位上。

三、散列函数
1、除法散列法
h(k)=k mod m
2、乘法散列法
h(k)=ceil(m(kA mod 1))

四、链接法
由于 m<|U| ,肯定会有不同的key得到的散列值 h(k) 相同,所以必然会存在冲突。链接法解决冲突的思路是建立一个边表,插入的时候将具有相同散列值的那些数据以链表的形式添加到边表末尾。查询,删除的时候对 T[h(k)] 的边表挨个匹配。

五、开放寻址法
如果已知装载因子小于1的话,可以使用开放寻址法。开放寻址法的思路是如果当前 T[h(k)] 已经被别的关键字占用了,就按照一定规则在散列表中寻找一个空的位置插入。这个规则包括
1、线性探查
2、二次探察
3、双重散列

六、完全散列
对于关键字集合是静态集合的时候,采用完全散列。

补充:
1、使用散列表的那些数据结构:
python: set,dict
C++: hashmap

你可能感兴趣的:(算法导论—散列表)