基本概念
- 哈希函数:又叫散列函数,在关键字与记录在表中的存储位置之间建立一个函数关系,以 H(key) 作为关键字为 key 的记录在表中的位置,通常称这个函数 H(key) 为哈希函数。
- 哈希地址:由哈希函数得到的存储位置称为哈希地址
- 装填因子:设散列表空间大小为n,填入表中的结点 数为m,则称a=m/n为散列表的装填因子。
- 冲突(Collision)与同义词: 若H(k1)=H(k2),则称 为冲突,发生冲突的两个关键字k1和k2称为同义词。
哈希函数的构造原则
- 计算简单
- 分布均匀
哈希函数的构造方法
- 直接地址法
取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a*key+b
其中a、b为常数。又称H(key)为自身函数。
- 数字分析法
- 平方取中法
- 折叠法
将关键字分割成位数相同的几段,最后一位可以 不同。段的长度取决于散列表的地址位数,然后 将各段的叠加和(舍去进位)作为散列地址
- 除留余数法
设桶数B,取质数 m ≤ B ,Hash ( key ) = key % m
- 除随机数法
设定哈希函数为: H(key) = Random(key) 其中,Random 为伪随机函数
处理冲突的方法
开放地址法
Hi = ( H(key) + di ) MOD m i = 1,2,…,k ( k≤m-2 )
对增量 d i 有三种取法:
H(key) 为哈希函数,m为表长,d i 为增量序列:
- di = 1,2,3,…,m-1— 线性探测再散列
- di = 12,-12,22,-22,…,± k2 (k ≤m/2) —二次探测再散列 或平方探测再散列
- di 为伪随机序列 —随机探测再散列
- 双散列函数探测-发生冲突是采用两个散列函数 H1(key)和H2(key)
**链地址法(又称拉链法) **
- 根据关键字K找到关键字为K的结点所在 单链表的首地址;
- 在所找到的单链表上进行顺序查找,若找 到返回地址值,否则返回空值。
哈希表的查找和分析
决定哈希表查找的ASL的因素:
- 选用的哈希函数;
- 选用的处理冲突的方法;
- 哈希表饱和的程度–装载因子,α=n/m 值的大小(n—记录数,m—表的长度
装载因子α 越小,发生冲突的可能性就越小