一. 概念
1.引例
有线性表(1,75,324,43,1353,90,46,… )
目的:查找值为90的元素
常见做法:
1、通过一维数组进行遍历查找 (依次比较)( O(n) )
2、如果关键字有序,可采用二分查找 ( O(logn) )
缺陷:当数据规模极大的时候,查找将会变得效率低下。
假设:如果知道待查询关键字的地址,则只需要一次就可以查到。
问题:如何立刻知道关键字的地址?
Hash函数: 根据关键字直接计算出元素所在位置的函数。
例:设哈希函数为:H(K)=K/3+1,则构造关键字序列为 1、2、5、9、11、13、16、21、27 的哈希表(散列表)为:
2.哈希表
根据设定的哈希函数 H(key) 和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象”作为记录在表中的存储位置,这种表便称为哈希表,这一映象过程称为哈希造表或散列,所得存储位置称为哈希地址或散列地址。
简单的说,哈希表可以根据一个key值来直接访问数据。其实,哈希表其实本质上就是一个数组
3.冲突
两个不同的关键字具有相同的存储位置。(多个关键字通过hash函数得到的地址是同一个地址)
在哈希存储中,若发生冲突,则必须采取特殊的方法来解决冲突问题,才能使哈希查找能顺利进行。虽然冲突不可避免,但可以减少冲突的发生,发生冲突的可能性与三个方面因素有关。
1、装填因子α
装填因子是指哈希表中己存入的元素个数 n 与哈希表的大小 m 的比值,即α=n/m。α越小,发生冲突的可能性越小,反之,发生冲突的可能性就越大。但是,α太小又会造成大量存贮空间的浪费,因此必须兼顾存储空间和冲突两个方面。
2、所构造的哈希函数
构造好的哈希函数,使冲突尽可能的少。
3、解决冲突的方法
设计有效解决冲突的方法 。
二.哈希函数的构造方法
构造哈希函数的方法很多,下面我们来列举常见的几种&#x