哈希表
哈希函数
哈希函数形成的表为哈希表。元素关键字为K,位置为P
- 基本思想:K和P之间建立对应关系,使得P=f(K);f为哈希函数
- 哈希冲突:K不同的映射到同一位置
哈希函数构造方法
- 原则:函数本身便于计算,计算出来的地址分布均匀。减少冲突,
数学分析法
实现知道关键字集合,且每个关键字的位数比哈希表地址码位数多,可以从关键字中选取特殊的若干位形成哈希地址。
平方取中法
先平方,然后按照需要取中间几位作为哈希地址,因为中间几位与每一位都相关冲突概率相对较少
分段叠加
按哈希表地址位数将关键字分成位数相等的几部分,然后相加舍弃溢出
除留余数法
假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为 h(k)=k % p ,其中%为模p取余运算。
PS:为减少冲突,可取较大的m值和p值
处理冲突方法
开放定址法(再散列)
基本思想:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。 这种方法有一个通用的再散列函数形式:
Hi=(H(key)+di)% m i=1,2,…,n
其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。
- 线性探测再散列,从1,2,3,…
- 二次探测再散列,从1,4,9,16…
- 伪随机探测再散列:先建立一个伪随机数发生器(i=(i+p)%m)
再哈希法
构造多个哈希函数,冲突就下一个函数,虽然不易产生堆积,但是增加了计算时间
拉链法(HashMap的冲突处理方式)
基本思想: 将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
建立公共溢出区
字面意思,发送冲突的全部放入溢出表中