数据结构中的散列表(散列函数、哈希函数)存储结构
散列表(Hash table)
- 概念:根据关键字的值来计算出关键字在表中的地址,也即地址是关键字的函数
哈希函数的构造方法
-
直接定址:
取关键字或关键字的某个线性函数为Hash地址,即
H( key )=key 或者 H( key ) = a*key + b -
数字分析法:
前提是你的关键字解释数字,然后从中取出某些位来作为关键字的地址,取出哪些位作为关键字的地址即为分析过程
(适用于关键字的位数比较多,且表中可能的关键字都是已知的情况)例:电话号码为关键字
180******1234 电话号码前7位相等的概率是很大的,如果电话号码是关键字,用数字分析法给电话号码确定哈希地址的话,取后四位比较好 -
平方取中法:
取关键字平方后的中间几位作为hash地址,一个数平方后的中间几位数和数的每一位都相关 由此得到的hash地址随机性更大例 : 123
(123)^2 =15129 ------------ 取512作为其哈希地址 -
除留余数法(最常用的方法):
取关键字被某个不大于Hash表表长的数p除后所得的余数为Hash地址,即
例:H(key)= key mod p (p<=len(表))
哈希表常见的冲突处理方法
-
开放定址法:
- 线性探查法
Hi(key) = (H(key) +i ) Mod len(表)
特点:可以探测到表中所有位置,但是易产生推积问题-平方探查法
设发生冲突的地址为d,则探测到的新地址为:d +/- ( i^2) <= length-1
d+12 、 d-12、 d+22、 d-22、d+32……
特点:不可以探测到表中的所有位置,但是至少可以探测到一半的位置,不易产生堆积问题。 -
链地址法:
特点:数组中装的是指针,每个地址冲突的关键字依次挂在数组某一位置的链表指针下