数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)

文章目录

  • 散列表(哈希表)
  • 处理冲突的方法-拉链法
  • 散列查找
    • 平均查找成功长度
    • 平均查找失败长度
  • 常见的散列函数
    • 除留取余法
    • 直接定址法
    • 数组分析法
    • 平方取中法
  • 处理冲突的方法-开放地址法
    • 线性地址法
      • 查找操作
      • 删除操作
      • 查找效率分析
        • 平均查找成功长度
        • 平均查找失败长度
    • 平方探测法
      • 查找操作
      • 散列表长度要求
    • 伪随机序列法
    • 开放定址法-小结
  • 处理冲突的方法-再散列法
  • 小结
  • 拉链法的小优化

散列表(哈希表)

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第1张图片

处理冲突的方法-拉链法

当出现关键字通过散列函数后对应一个位置时,该位置可存储一个链表,通过链表链接所有同义词,即出现同义词时,链接到链尾或链头
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第2张图片

散列查找

通过散列韩素华计算查找目标在散列表中的位置
当查找27时,通过哈希函数计算其位置为1,到1所对应的链表从头开始寻找
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第3张图片
查找20
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第4张图片
查找21,通过哈希函数找到对应的位置,发现链表为空,所以没有
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第5张图片
查找长度参考学校题目
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第6张图片
查找66
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第7张图片

平均查找成功长度

通过一层一层来计算
或者一类一类同义词来计算
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第8张图片
冲突是指的同义词很多,都占一个位置了所以说冲突
此时如果同义词没有,那么查找长度会低很多
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第9张图片

平均查找失败长度

此时映射到每个位置的概率相等
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第10张图片

常见的散列函数

除留取余法

此时发现取质数发现同义词更多了,原因是关键字是连续的
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第11张图片
如果是关键字是偶数较多
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第12张图片

直接定址法

此时直接定址法,如果由于关键字对应的位置也是连续的,所以如果关键字缺少,那么对应的位置的内容也会缺少。此时会造成空位,那么存储空间会浪费

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第13张图片

数组分析法

分布比较均匀,即每个关键字对应的位置可能都不同
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第14张图片

平方取中法

适用于每位取值都不均匀或小于散列地址所需的位数
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第15张图片
使得散列地址和关键字每一位都相关

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第16张图片
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第17张图片

处理冲突的方法-开放地址法

此时空闲表的地方既可以存关键字经过哈希函数映射到此的关键字,也可以存不被映射到此的关键字
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第18张图片

线性地址法

此时存1时,出现0次冲突,然后再次计算其对应的哈希表位置,出现1次冲突,再次计算,此时不冲突
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第19张图片
此时存84时,出现0次冲突,然后再次计算其对应的哈希表位置,出现1次冲突,再次计算,此时冲突,再次计算,此时不冲突,注意di都是从0开始的
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第20张图片
27同理
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第21张图片
55同理
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第22张图片
10同理
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第23张图片
79同理
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第24张图片
假如此时还存25
此时注意取模的长度不同
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第25张图片

查找操作

查找27
依然需要调用H公式去寻找比对
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第26张图片
查找11数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第27张图片
查找21
当比对的空的哈希表位置时,认为查找失败
注意此时需要比较空位置
由于拉链法其实每个哈希表位置存放的是指针,所以不算作对比关键字的次数。而开发地址法存的是和关键字同类型的,所以看作比对关键字
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第28张图片
空位置越早遇到,越早可确定查找失败,同样查找21,下面这种情况只需要比对3次
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第29张图片

删除操作

删除1,如果直接置为空
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第30张图片
此时查找27遇到空,将认为是没有找到,而此时27确是存在的
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第31张图片
所以删除应该做一个删除标记
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第32张图片
此时依然可以找到27
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第33张图片
查找79此时由于大量被删除,做了删除标记,但由于仍然需要从0次冲突开始计算,导致浪费时间
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第34张图片

查找效率分析

平均查找成功长度

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第35张图片

平均查找失败长度

由于对应哈希表位置关键字不对时,需要通过冲突函数向后查找比对
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第36张图片
由于对应关键字冲突是放后面,是连续的,所以容易扎堆聚集
在这里插入图片描述

平方探测法

注意负数的取模操作,余数为正数
此时因为增量序列不是连续的,所以在哈希表中的位置不容易堆积
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第37张图片

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第38张图片

查找操作

查找71,由增量序列来查找
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第39张图片

散列表长度要求

表长为偶数发现根据增量序列有重复的散列表位置,并且不能探测到所有位置

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第40张图片

伪随机序列法

伪随机序列是自己定义的增量序列,探测根据伪随机序列探测
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第41张图片
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第42张图片

开放定址法-小结

注意三种增量序列对应的删除都需要做删除标记
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第43张图片

处理冲突的方法-再散列法

就是计算的一个关键字对应的哈希表位置发生冲突就使用下一个哈希函数计算关键字在哈希表中的位置
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第44张图片

小结

数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第45张图片

拉链法的小优化

提高查找效率,当查找失败时不必每个关键字都比对
数据结构和算法-散列查找(哈希查找 哈希函数 处理冲突的方法)_第46张图片

你可能感兴趣的:(王道数据结构和算法考研笔记,算法,数据结构,哈希算法)