《算法导论》学习分享——11. 散列表(哈希表)
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。
散列表
直接寻址表的缺点很明显:
- 如果全域U非常大,则计算机无法存储
- 如果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<1α = n/m < 1α=n/m<1的开放寻址散列表,并假设是均匀散列的:
对于一次不成功的查找,期望的探查次数至多为1/(1−α)1/(1-α)1/(1−α)
对于一次成功的查找,期望的探查次数至多为1αln(1/(1−α))\frac{1}{α}\ln(1/(1-α))α1ln(1/(1−α))
完全散列
基于全域散列,完全没看。。。
涉及数据结构
点击查看实现
- 使用链接法的散列表
Github Source: https://github.com/maomao9003/Introduction-to-Algorithms/blob/master/Docs/Chapter/11.散列表.md
《算法导论》学习分享——11. 散列表(哈希表)相关推荐
- 算法设计与分析——散列表/哈希表(Hash Table):直接寻址表
分类目录:<算法设计与分析>总目录 相关文章: ·散列表/哈希表(Hash Table)(一):基础知识 ·散列表/哈希表(Hash Table)(二):直接寻址表 ·散列表/哈希表(Ha ...
- 【数据结构笔记41】散列表/哈希表的性能分享
本次笔记内容: 11.4 散列表的性能分析 文章目录 平均查找长度 影响冲突产生的三个因素 不同方法的性能 线性探测法查找性能 平方探测法和双散列探测法的查找性能 期望探测次数与装填因子α的关系 分离 ...
- MIT算法导论公开课第七讲哈希表
哈希表又称散列表,其定义是根据一个哈希函数将集合S中的关键字映射到一个表中,这个表就称为哈希表,而这种方法就称为Hashing.从作用上来讲,构建哈希表的目的是把搜索的时间复杂度降低到O(1),考虑到 ...
- 散列表(哈希表)(散列函数构造、处理冲突、查找)
本文转载自: [1]https://blog.csdn.net/qq_22238021/article/details/78258605 [2]https://blog.csdn.net/duan19 ...
- 算法笔记(三)特殊数据结构——哈希表、有序表、并查集、KMP、Manacher、单调栈、位图、大数据类题
layout: post title: 算法笔记(三)特殊数据结构--哈希表.有序表.并查集.KMP.Manacher.单调栈.位图.大数据类题 description: 算法笔记(三)特殊数据结构- ...
- 算法导论答案 第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]} ...
- 算法导论中C语言代码,算法导论-学习笔记与进度
算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...
- 算法导论 — 思考题8-6 合并有序列表的下界
(合并有序列表的下界)合并两个有序列表是我们经常会遇到的问题.作为MERGE-SORT的一个子过程,我们在2.3.1节中已经遇到过这一问题.对这一问题,我们将证明在最坏情况下,合并两个都包含nnn个元 ...
- 【算法导论学习-012】n个数随机等概率的抽样m个
算法法导论>P129页课后题5.3-7 suppose we want to create a random sample of the set {1,2,3,-,n}, thatis, an ...
最新文章
- 全面剖析linux【bind】服务お理论篇
- 细数非对称加密与对称加密的区别
- c 调用python_c调用python
- 五年级计算机下册工作计划,五年级下学期工作计划
- 忽略异常_忽略已检查的异常,所有出色的开发人员都在这样做–基于600,000个Java项目...
- 再见腾讯,创业我来了!!!
- 如何卸载mysql server 2005_如何卸载SQL Server 2005
- boot spring 解析csv_spring-boot-starter-thymeleaf 避坑指南
- CamShift算法,OpenCV实现2-Mean Shift算法
- 地理空间数据云下载的dem数据(xxxdem.tif格式)中的栅格大小从度(0.000002)改成米(30)
- xml配置service服务器文件路径,xml配置service服务器文件路径
- Chrome插件有哪些?
- 软件测试之黑盒测试方法介绍及测试用例练习
- 如何用Excel制作heatmap(热图)
- Golang:加密解密算法
- 英语在线听力翻译器_英语听力翻译app下载-英语听力翻译官方版v2.1.4-upan
- 谷歌、亚马逊全面开火,一场前所未有的AI芯片大战
- 使用VBA将Excel数据导入到Word的表格中
- 13. Roman to Integer
- 2023校招美团第二次笔试