本系列是《数据结构与算法分析-C语言描述》(Data Structures and Algorithm Analysis in C,作者Mark Weiss)一书的学习笔记,当我在做cc150需要补某个知识点时,就会把这本书翻出来学习一下,同时分享~
如果你有任何问题和建议,希望能与我分享.
1. 回顾
上一次我们简单介绍了:
- Hash表的概念
由输入数据的数据结构构成的Array - 优缺点
查找、插入、删除平均常数时间。但不维护Array的顺序。 - 四大要素
Hash表主体,Hash表大小,Hash Function,冲突解决方案。
实际上,Hash表最难设计的就是Hash Function以及冲突解决方法(Collision Resolution)。关于Hash Function的设计,没有一个统一的方法,常用的方法我们也在第一章介绍过了。
这一章,我们将介绍一种常用的冲突解决方案,即开散列法(Separate Chaining)。
2. Separate Chaining简介
Separate Chaining的思想无比简单。即原本Hash表每个元素是一个输入数据的数据结构类型,现在把每个元素改成一个由该数据结构类型构成的指针链表。这样,当发生冲突时,只要在该指针链表的尾端或首端插入该值即可。
3.Rehash
在详述我们的HashTable实现之前,我们还要引入最后一个概念:rehash。当我们不断往HashTable内插入元素,HashTable就会越来越满,而Find,Insert,Remove的操作都会越来越慢!
事实上,我们定义一个负重参数(load factor) λ ,它的值是HashTable已有的元素数除以HashTable表大小。对于每一次不成功的搜索,平均搜索次数为 λ (不包括最后的NULL),对于每一次成功的搜索,平均搜索次数为 1+λ/2 。因此,HashTable本身的大小对性能的影响并不大,重要的是load factor的大小。Mark Weiss建议,general rule是保证 λ