一、前言
一种数据结构,查找效率即时间复杂度为O(1)。
二、内容
2.1、实现
在待查记录中的关键字值与它存储的位置建立一一对应的关系,就可以实现我们的查找效率为O(1)的终极目标了。
2.1.1、实例1
(1)如以下我们的学生信息的存贮,哈希函数为f(n) = n - 32001
2.1.2、实例2
(2)But,并不是所有的数据都如此有规律的,比如以下这种数据
类似于这样的数据,比如我们取末位来作为哈希的关键字,就会发现,5379624与5966554这样的记录发现关键字冲突了,所以第二部分我们将一下如何解决哈希冲突?
2.2、哈希冲突的解决方案
前面我们知道了"哈希冲突"即当待查记录中,不同的记录的关键字即key通过哈希取值时,结果相同。
2.2.1、开放定址法
即在发生冲突之后,对于冲突的结果进行探测再哈希。
线性探测:遇到冲突时,我们将冲突的结果
加1
,然后再进行哈希,如果再哈希的结果还是冲突的话,就将再次冲突的结果加2
,再进行哈希,以此类推,直到找到未占用的坑。
二次线性探测(推荐):遇到冲突时,我们将冲突的结果加(1的平方)
,然后再进行哈希,如果再哈希的结果还是冲突的话,就将再次冲突的结果加-(1的平方)
,再进行哈希,以此类推,直到找到未占用的坑。
2.2.2、链地址法
当遇到冲突时,将记录以节点的形式,插入链表的头部。
注意:这种冲突的解决方式,当存在大部分哈希冲突时,查找效率也会降为O(n)。
2.2.3、公共溢出区
当出现哈希冲突时,我们将冲突的数据,一次放在溢出区,如下图。
注意:与链地址法类似,这种冲突的解决方式,当存在大部分哈希冲突时,查找效率也会降为O(n)。
2.3、哈希查找
其实就是按照着之前定的哈希函数,进行查找。
如果找了位置不为空,比较关键字:
不同
就继续按照哈希规则,往下找
相同
就返回数据记录
如果找到位置为空:
就说明关键字不存在