目录
散列函数
(散列表是根据给定的关键字计算出关键字在表中的地址。即散列表建立了关键字和存储地址之间的一种直接映射关系)
概念
一个把查找表中的关键字映射成对应地址的函数,记作Hash(key)=addr。
冲突
散列函数可能会把两个或两个以上的不同关键字映射到同一地址(这些发生碰撞的不同关键字称为同义词)
(从视频里截的图,嘿嘿)
构造散列函数tips
①散列函数定义域必须包含全部需要储存的关键字,而值域的范围则依赖与散列表的大小或地址范围
②散列函数计算出来的地址应该能够等概率,均匀的分布在整个地址空间,从而减少冲突的发生
③散列函数颖尽量简单,能够在较短的时间内计算出任意关键字对应的散列地址
构造hash函数的方法
直接定址法:直接取关键字的某个线性函数值为散列地址,散列函数为H(key)=a✖key+b。(最简单且不会产生冲突)
除留余数法:假定散列表表长称为m,取一个不大于m但最接近或等于m的质数p,利用取模把关键字转换成散列地址。散列函数为H(key)=key%p。(选p很重要)
处理冲突的方法
1、开放定址法
当冲突发生时,使用探测技术在散列表中形成一个探测序列。沿此序列逐个单元地查找,直到找到碰到一个开放的地址 (即该地址单元为空)为止,将待插入的新结点存人该地址单元。
(用开放定址法建立散列表时,建表前须将表中所有单元置空)
(装填因子:a一般取0.5到0.9之间。目的是为了确定合适的表长。)
***探查序列:Hi=(H(key)+di)% m (i=1,2,…,k (k≤m-1) )
H(key)为哈希函数;m为哈希表表长;di为增量序列,可有下列三种取法:
(1) di=1,2,3,…,m-1,称线性探测再散列;
(2) di=12,-12,22,-22,33,…,±k2,(k≤m/2)称二次探测再散列;
(3) di=伪随机数序列,称伪随机探测再散列。