散列表的查找
散列表的查找
基本思想
记录的存储位置与关键字之间存在的对应关系.
使用哈希函数查找对应的数据
就是直接将学生的学号当做下标来存储.
这样就非常好查找
如何让查找
根据散列函数H(key)=k
查找key=n,则访问H(n)=n的地址,若内容为n则成功.
若查询不到,返回一个特殊值,空指针或空记录.
优点:查找效率非常高;
缺点:空间效率低!
若干术语
散列方法:使用一个函数计算元素的存储位置,按这个位置存放.
查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行对比,确定查找是否成功;
散列函数:散列方法中使用的转换函数;
冲突:不同关键码映射到同一个散列地址.
同义词:具有相同函数值的多个关键字.
散列函数的构造方法
在散列查找方法中,冲突不可避免,只能尽可能减少.
使用散列表要解决的两个问题
- 构造好散列函数
- 制定一个好的解决冲突的方案
构造散列函数考虑的因素
-
执行速度
-
关键字的长度
-
散列表的大小
-
关键字的分布情况
-
查找频率
散列表的构造的两个要求
- 希望散列的地址空间尽可能的小
- 尽量均匀的存放元素,避免冲突.
直接定址法
优点:以关键码key的某个线性函数值为散列地址,不会产生冲突.
缺点:要占用连续地址空间,空间效率低.
除留余数法
关键:如何选取合适的p?
技巧:设表长为m,取p<=m且为质数.
处理冲突的方法
1.开放地址法(开地址法)
基本思想:有冲突时,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入.
线性探测法
一旦冲突,就去找下一个地址,直到找到空地址存入.
例子
如果当前位置发生冲突,我们使用线性的方式向后面寻找合适的位置进行存放,最后再用线性的方式将其取出来.
二次探测法
例题
相比于线性探测法,他的增量为1,-1,4,-4,9,-9这样的平方数
伪随机探测法(开地址法)
相比于线性探测法,他的增量为一个随机数.
3.链地址法(拉链法)
基本思想:相同散列地址的记录链成一单链表m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针储存起来,形成一个动态结构.
链地址法建立散列表步骤
链地址法的优点
散列表的查找
给定值查找值k,查找过程如下.
使用线性探测法
使用链地址法处理冲突
散列表上的查找长度时间复杂度不是O(1)
散列表影响查找长度的因素
- 散列函数
- 处理冲突方法
- 删列表的装填因子a
各种方法的平均查找长度
几点结论
-
散列表技术具有很好的平均性能,优于一些传统技术
-
链地址法优于开地址法
-
除留余数法作散列函数优于其他类型函数