11. 散列表(哈希表)

文章目录

  • 11. 散列表(哈希表)
    • 直接寻址表
    • 散列表
      • 链接法散列分析
    • 散列函数
      • 除法散列
      • 乘法散列
      • 全域散列
    • 开放寻址法
      • 线性探查
      • 双重探查
      • 开放寻址法分析
    • 完全散列
    • 涉及数据结构

许多应用都需要一种动态集合,至少支持Insert,Search和Delete的字典操作。
散列表(Hash Table)是实现字典操作的一种有效数据结构。尽管最坏情况下散列表查询一个元素的时间和链表的查询时间相同,为Θ(n)。但是在实际应用中,散列表的查询性能是极好的。在一些合理的假设下,散列表中扎寻一个元素的平均时间能为Ο(1)。

假设某应用需要用到一个动态集合,其中每个元素的KEY都是取自全域U={0, 1, …, m-1}。本章讨论方法都是基于这样的动态集合。

直接寻址表

当KEY的全域U较小时,直接寻址表是一种简单而有效的技术。
为了表示这个动态集合,我们用一个数组作为直接寻址表,记为T[0…m-1],其中数组的每个位置称为,与全域U中的KEY一一对应。
K集合表示实际存在的元素的KEY集合。
槽k指向KEY为k的元素,如果K集合中没有k,那么T[k] = nil。

散列表

直接寻址表的缺点很明显:

  1. 如果全域U非常大,则计算机无法存储
  2. 如果K集合相对于全域U非常小,那么将非常浪费空间

如果直接寻址表占用的存储空间为Θ(∣U∣)\Theta(|U|)Θ(∣U∣),那么散列表能将存储需求降至Θ(∣K∣)\Theta(|K|)Θ(∣K∣),同时散列表中查找一个元素的时间为O(1)\Omicron(1)O(1),不过是平均时间。

散列方式不同于直接寻址表的地方是,元素存储在散列表中的位置由散列函数决定,即k元素存储在散列表的h(k)位置。h(k)叫做k的散列值。

散列表T的大小比|U|小很多,所以肯定会有冲突的情况。

冲突最简单的解决方式是使用链接法,后面还介绍一种开放寻址法。
下图是链接法的图示,当有两个k值映射到了同一个散列值时,将它们保存在一个链表内。

链接法散列分析

如果要将n个数据存储在m大小的散列表中,我们称α=n/mα = n/mα=n/m为装载因子,即散列表的每个槽平均存放的数据。
假设散列函数能等可能的把数据散列到m个槽中,我们称这个假设为简单均匀散列
这时每个槽存放元素个数的期望值为α

所以,一次不成功查找的平均时间为Θ(1+α)\Theta(1+\alpha)Θ(1+α)。(1 表示散列函数消耗的时间)

因为每个槽的期望为α,而不成功的情况下,查找的期望时间就是从槽链表的头遍历到链表尾,所以期望时间就是槽链表的长度α。

一次成功查找的平均时间为Θ(1+α)\Theta(1+\alpha)Θ(1+α)。

具体证明参考公开课中老师的推理,或者书中推理。
自我理解:一个元素在槽中的位置是等概率随机的(1/α),而且期望时间为元素在槽中位置的期望。期望位置为(1+2+..+α)*(1/α) = (α+1)/2

散列函数

最好的散列函数便是能达到简单均匀散列
下面介绍一些的散列函数。其中全域散列能够达到这样的要求。

除法散列

h(k) = k mod m

m最好是一个素数,并且不能太接近2或者10的乘方。

乘法散列

h(k) = [(a * k) mod 2^w] >> (w − r)

k是w bits的数
m = 2^r
a最好是一个奇数,并且不能太接近2或者10的乘方。

全域散列

随机的选择散列函数,称为全域散列
Example:

h(k) = [(ak+b) mod p] mod m
where a and b are random ∈ {0, 1, . . . p−1}, and p is a large prime (> |U|).

证明全域散列为简单均匀散列的过程,参考公开课中老师的推理,或者书中推理。

开放寻址法

  • 无链表,所有的元素都保存在table中
  • 每个槽存储一个元素,m>=n
  • 散列函数为h(k, i),i从0开始,当有冲突后i++,直到找到一个空的位置,所以散列函数需要有如下性质:
对同一个KEY做m次探查,能把散列表填满h : U × {0, 1,...,m − 1} → {0, 1,...,m − 1}{h(k, 0), h(k, 1), . . . , h(k, m − 1)} == {0, 1,...,m − 1}

删除时,不能直接删除!删除后需要标记此位为删除位。

线性探查

h(k, i) = (h1(k) +i) mod m

双重探查

h(k, i) =(h1(k) + i·h2(k)) mod mh2(k) 需要和 m 互为质数
e.g. m = 2^r, h2(k) 永远为奇数

开放寻址法分析

给定一个装载因子α=n/m&lt;1α = n/m &lt; 1α=n/m<1的开放寻址散列表,并假设是均匀散列的:
对于一次不成功的查找,期望的探查次数至多为1/(1−α)1/(1-α)1/(1−α)
对于一次成功的查找,期望的探查次数至多为1αln⁡(1/(1−α))\frac{1}{α}\ln(1/(1-α))α1​ln(1/(1−α))

完全散列

基于全域散列,完全没看。。。

涉及数据结构

点击查看实现

  • 使用链接法的散列表

Github Source: https://github.com/maomao9003/Introduction-to-Algorithms/blob/master/Docs/Chapter/11.散列表.md

《算法导论》学习分享——11. 散列表(哈希表)相关推荐

  1. 算法设计与分析——散列表/哈希表(Hash Table):直接寻址表

    分类目录:<算法设计与分析>总目录 相关文章: ·散列表/哈希表(Hash Table)(一):基础知识 ·散列表/哈希表(Hash Table)(二):直接寻址表 ·散列表/哈希表(Ha ...

  2. 【数据结构笔记41】散列表/哈希表的性能分享

    本次笔记内容: 11.4 散列表的性能分析 文章目录 平均查找长度 影响冲突产生的三个因素 不同方法的性能 线性探测法查找性能 平方探测法和双散列探测法的查找性能 期望探测次数与装填因子α的关系 分离 ...

  3. MIT算法导论公开课第七讲哈希表

    哈希表又称散列表,其定义是根据一个哈希函数将集合S中的关键字映射到一个表中,这个表就称为哈希表,而这种方法就称为Hashing.从作用上来讲,构建哈希表的目的是把搜索的时间复杂度降低到O(1),考虑到 ...

  4. 散列表(哈希表)(散列函数构造、处理冲突、查找)

    本文转载自: [1]https://blog.csdn.net/qq_22238021/article/details/78258605 [2]https://blog.csdn.net/duan19 ...

  5. 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题

    layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...

  6. 算法导论答案 第11章:散列表

    11.1 直接寻址表 11.1-1 findmax(T,m) {max=T[0];for i=1 to m-1{if T[i]!=NIL && T[i]>maxmax=T[i]} ...

  7. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

  8. 算法导论 — 思考题8-6 合并有序列表的下界

    (合并有序列表的下界)合并两个有序列表是我们经常会遇到的问题.作为MERGE-SORT的一个子过程,我们在2.3.1节中已经遇到过这一问题.对这一问题,我们将证明在最坏情况下,合并两个都包含nnn个元 ...

  9. 【算法导论学习-012】n个数随机等概率的抽样m个

    算法法导论>P129页课后题5.3-7 suppose we want to create a random sample of the set {1,2,3,-,n}, thatis, an ...

最新文章

  1. 全面剖析linux【bind】服务お理论篇
  2. 细数非对称加密与对称加密的区别
  3. c 调用python_c调用python
  4. 五年级计算机下册工作计划,五年级下学期工作计划
  5. 忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...
  6. 再见腾讯,创业我来了!!!
  7. 如何卸载mysql server 2005_如何卸载SQL Server 2005
  8. boot spring 解析csv_spring-boot-starter-thymeleaf 避坑指南
  9. CamShift算法,OpenCV实现2-Mean Shift算法
  10. 地理空间数据云下载的dem数据(xxxdem.tif格式)中的栅格大小从度(0.000002)改成米(30)
  11. xml配置service服务器文件路径,xml配置service服务器文件路径
  12. Chrome插件有哪些?
  13. 软件测试之黑盒测试方法介绍及测试用例练习
  14. 如何用Excel制作heatmap(热图)
  15. Golang:加密解密算法
  16. 英语在线听力翻译器_英语听力翻译app下载-英语听力翻译官方版v2.1.4-upan
  17. 谷歌、亚马逊全面开火,一场前所未有的AI芯片大战
  18. 使用VBA将Excel数据导入到Word的表格中
  19. 13. Roman to Integer
  20. 2023校招美团第二次笔试

热门文章

  1. 深度学习项目实战——1.基于WordCloud词云生成
  2. 2.4 二进制除法运算(原码一位除恢复余数法)
  3. oracle定时器查看,oracle定时器-Oracle
  4. 北京54坐标系转80西安坐标系的简便方法
  5. 【多线程整理 4】notify与notifyAll
  6. xcode 4 制作静态库详解
  7. vc++6.0 计算器制作资料 MFC
  8. NAND闪存基础知识
  9. TN屏的工作电压跟偏压的关系
  10. 计算机毕设Python+Vue写字楼物业管理系统(程序+LW+部署)