-
什么是哈希表?哈希冲突?
根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。
对不同的关键字可能得到同一哈希地址,即key1≠key2,而f(key1)=f(key2),这种现象称
冲突(colllision)。具有相同函数值的关键字对该哈希函数来说称作
同义词。
-
哈希函数的构造方法?
- 直接定址法:H(key)=key 或 H(key)=a·key+b。地址集合和关键字集合的大小相同,实际中能使用这种哈希函数的情况很少。
- 数字分析法:关键字事先知道,可取关键字的若干数位组成哈希地址。
- 平方取中法:取关键字的中间几位为哈希地址。选定哈希函数时不一定能知道关键字的全部情况,一个数平方后的中间几位数和数的每一位都相关。
- 折叠法:关键字位数很多,而且关键字中每一位上数字分布大致均匀时,可以采用折叠法得到哈希地址。
- 除留余数法:H(key)=key MOD p , p≤m。最简单也最常用,一般情况下,可以选p为质数或不包含小于20的质因数的合数。
- 随机数法:H(key)=random(key)。当关键字长度不等时采用此法。
-
处理冲突的方法?
- 开放定址法:Hi=(H(key)+di) MOD m , i=1,2,···,k (k≤m-1)。(1)di=1,2,···,m-1 称线性探测再散列;(2)di=12,-12,22,-22,···,±k2,(k≤m/2) 称二次探测再散列;(3)di=伪随机序列,称伪随机探测再散列。两个第一个哈希地址不同的记录争夺同一个后继哈希地址的现象称作“二次聚集”。
- 再哈希法:Hi=RHi(key) , i=1,2,···,k,RHi均是不同的哈希函数,不易产生聚集,但增加了计算的时间。
- 链地址法:将所有关键字为同义词的记录存储在同一线性链表中,同义词在同一线性链表中按关键字有序。
- 建立一个公共溢出区:设向量HashTable[0..m-1]为基本表,设立向量 OverTable[0..v]为溢出表,一旦发生冲突,都填入溢出表。
java.util.HashMap采用的是链地址法。