散列表
什么是散列表
用于查找,通过对元素关键字key进行某种运算,直接求出元素的地址,就可以直接访问到元素了,无需像基于线性表、树结构的查找进行多次比较
- 散列函数、散列地址:散列地址p=H(key),H为散列函数
- 散列表:简单理解就是一个一维数组,散列地址就是数组的下标
- 冲突、同义词:H(key1)=H(key2),key1!=key2,key1和key2为同义词
解决冲突的方法
- 开放地址法(数组所有未被占的位置都开放):发生冲突,找下一个空散列地址,Hi=(H(key)+d)%m
- 线性探测:d=1,2,3,4,5...m-1
- 优点:散列表未填满,就可以找到不冲突地址
- 缺点:二次聚集现象,两个第一个散列地址不同的key争夺同一个后继散列地址
- 二次探测:d=1²,-1²,2²,-2²...(m/2)²,(-m/2)²
- 优点:没有二次聚集现象
- 缺点:可能找不到不冲突的地址,比如d=3就找不到
- 伪随机探测:d=伪随机数序列
- 优点:没有二次聚集现象
- 缺点:可能找不到不冲突的地址
- 线性探测:d=1,2,3,4,5...m-1
- 链地址法
- 把具有相同散列地址的key放在一个单链表中,数组中存链表的头指针