哈希表
-
概念:哈希表是用来存储键值对的,可以平衡时间和空间的数据结构,用空间来换空间。
当键是整数时,可以用无序数组来实现哈希表。
-
哈希函数:要将键映射到存储的下标(地址),就需要一个函数,这就是哈希函数的功能。
-
哈希冲突处理:使用哈希函数时,很多时候存在将多个键映射到同一个下标(地址)的情况,这就产生了冲突,此时就需要处理哈希冲突。
Hash函数构造方法:
-
直接定址法:直接定址法是以数据元素关键字k本身或它的线性函数作为它的哈希地址
-
数字分析法:从中提取分布均匀的若干位或它们的组合作为地址,适用于能预先估计出全体关键字的每一位上各种数字出现的频度
-
折叠法(移位叠加、间接叠加):将关键字分割成若干部分,然后取它们的叠加和为哈希地址。适用于关键字的数字位数特别多
-
平方取中法: 先取关键字的平方,然后根据可使用空间的大小,选取平方数是中间几位为哈希地址。适用于关键字中的每一位都有某些数字重复出现频度很高的现象
-
减去法: 减去法是数据的键值减去一个特定的数值以求得数据存储的位置
-
除留余数法:假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为
h(k)=k % p ,其中*%为模p*取余运算。
-
随机数法:设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数。适用于对长度不等的关键字构造哈希函数。
Hash冲突处理方法:
- 开放地址法(存在一个通用的在散列函数)、
- 再哈希法(同时有多个哈希函数)、
- 链地址法(这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表)、
- 建立公共溢出区(将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表)