散列表的查找

散列表的查找

基本思想

记录的存储位置与关键字之间存在的对应关系.

使用哈希函数查找对应的数据

image-20230729102725184

就是直接将学生的学号当做下标来存储.

image-20230729103051035

这样就非常好查找

image-20230729103148029

如何让查找

image-20230729103539745

根据散列函数H(key)=k

查找key=n,则访问H(n)=n的地址,若内容为n则成功.

若查询不到,返回一个特殊值,空指针或空记录.

优点:查找效率非常高;

缺点:空间效率低!

若干术语

image-20230729104110783

散列方法:使用一个函数计算元素的存储位置,按这个位置存放.

查找时,由同一个函数对给定值k计算地址,将k与地址单元中元素关键码进行对比,确定查找是否成功;

散列函数:散列方法中使用的转换函数;

冲突:不同关键码映射到同一个散列地址.

同义词:具有相同函数值的多个关键字.

image-20230729104809228

散列函数的构造方法

在散列查找方法中,冲突不可避免,只能尽可能减少.

image-20230729104958359

使用散列表要解决的两个问题

  1. 构造好散列函数
  2. 制定一个好的解决冲突的方案

image-20230729105229761

构造散列函数考虑的因素

  1. 执行速度

  2. 关键字的长度

  3. 散列表的大小

  4. 关键字的分布情况

  5. 查找频率

    image-20230729105539051

散列表的构造的两个要求

  1. 希望散列的地址空间尽可能的小
  2. 尽量均匀的存放元素,避免冲突.

image-20230729105813810

直接定址法

优点:以关键码key的某个线性函数值为散列地址,不会产生冲突.

缺点:要占用连续地址空间,空间效率低.

image-20230729110139121

除留余数法

关键:如何选取合适的p?

技巧:设表长为m,取p<=m且为质数.

image-20230729110400287

处理冲突的方法

1.开放地址法(开地址法)

基本思想:有冲突时,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将数据元素存入.

image-20230801092223521

线性探测法

一旦冲突,就去找下一个地址,直到找到空地址存入.

image-20230801092341434

例子

如果当前位置发生冲突,我们使用线性的方式向后面寻找合适的位置进行存放,最后再用线性的方式将其取出来.

image-20230801093337016

二次探测法

例题

相比于线性探测法,他的增量为1,-1,4,-4,9,-9这样的平方数

image-20230801094429476

伪随机探测法(开地址法)

相比于线性探测法,他的增量为一个随机数.

image-20230801094540683

3.链地址法(拉链法)

基本思想:相同散列地址的记录链成一单链表m个散列地址就设m个单链表,然后用一个数组将m个单链表的表头指针储存起来,形成一个动态结构.

image-20230801095236453

链地址法建立散列表步骤

image-20230801095403276

链地址法的优点

image-20230801095647289

散列表的查找

给定值查找值k,查找过程如下.

image-20230802093307443

使用线性探测法

image-20230802094456085

使用链地址法处理冲突

image-20230802094618462

散列表上的查找长度时间复杂度不是O(1)

image-20230802094849696

散列表影响查找长度的因素

  1. 散列函数
  2. 处理冲突方法
  3. 删列表的装填因子a

image-20230802095108780

各种方法的平均查找长度

image-20230802095228415

几点结论

  1. 散列表技术具有很好的平均性能,优于一些传统技术

  2. 链地址法优于开地址法

  3. 除留余数法作散列函数优于其他类型函数

    image-20230802095457325

posted @ 2023-07-29 11:05  harper886  阅读(80)  评论(0)    收藏  举报