哈希表的学习

概念:

哈希又称为散列,一种组织数据的方式;有散乱排列的意思

本质是通过哈希函数把关键字Key跟存储位置建立映射关系,查找时通过这个哈希函数计算出Key的位置以进行快速查找

1. 直接定址法 --- 用关键字计算出一个绝对位置或相对位置

一组[0,9]之间的关键字,我们开一个10个数的数组,每个关键字的值就是存储位置的下标

a,x\]的一组小写字母,我们开一个24个数的数组,每个关键字acsii就是存储位置的下标 当关键字的范围比较分散时,内存会被浪费或者内存不够 N个值,M个空间 ,M\>=N,关键字key放到数组的k(key)位置,k(key)在\[0,M)内 ## 哈希冲突: 两个不同的key可能会映射到同一个位置上 ## 负载因子: N:哈希表中映射存储的值的个数 M:哈希表的大小 负载因子:N/M 负载因子越大,哈希冲突概率越高,空间利用率越高 ## 关键字转为整数: 我们将关键字映射到数组中的位置,整数更方便做映射计算;不是整数的,我们要转换成整数 ## 哈希函数: 一个好的哈希函数应该是让N个关键字被等概率的均匀地散列分布到哈希表的M个空间中,当然,这是很难做到的,我们尽可能地设计这样的哈希函数去实现 ## 除法散列法/除留余数法 M:哈希表的大小 哈希函数:h(key)=key%M 要尽量避免M为2的幂10的幂 ## 乘法散列法 关键字K乘A(0\ 10 ![](https://i-blog.csdnimg.cn/direct/b9a50c6d048c47a49cb95d7cfa4d4ba1.png) ##### 例题: 某个哈希表的n个关键字具有相同的哈希值,如果使用二次探测再散列法(属于二次探测,探查序列为 Hi​=(H0​+i2)%m(i=1,2,⋯ ,m 为哈希表长度) )将这n个关键字存入哈希表,至少要进行()次探测 n个关键字具有相同的哈希值,会产生冲突,需要依次寻找下一个可以使用的位置 元素1:探测1次 元素2:探测2次,因为第一个关键字占用了原本冲突的位置 ...... 所以总共需要探测 1+2+ ... + n = n\*(n+1)/2 ### 链地址法/哈希桶/拉链法 所有的数据不再直接存储在哈希表中,哈希表中存储一个指针,没有数据映射这个位置时,这个指针为空,++有多个数据映射到这个位置时,我们把冲突的这些数据链接成一个链表挂在哈希表的位置下面++ ##### 例: {19,30,5,36,13,20,21,12,24,96} M=11 h(19)=19%11=8 h(30)=30%11=8 h(5)=5 h(36)=3 h(13)=2 h(20)=9 h(21)=10 h(12)=1 h(24)=2 h(96)=88 ![](https://i-blog.csdnimg.cn/direct/682ffa46dfe74de6a230c9cfb1dd3ebc.png) 链地址法的负载因子没有限制可以大于1 负载因子越大,哈希冲突该=概率越高,空间利用率越高 ##### 例题: 一个关键字序列:(19,14,23,1,68,20,84,27,55,11,10,79)散列存储在一个哈希表中,若散列函数为H(key)=key%7,并采用链地址法来解决冲突,则在等概率情况下查找成功的平均查找长度为() h(19)=5 h(14)=0 ..... \[0\] \[1\] \[2\] \[3\] \[4\] \[5\] \[6

14 1 23 10 11 19 20

84 79 68 25

77

第一层比较一次就能找到,第二层比较两次能找到

所以总的查找次数为 1*7 + 2*4 + 3*1 = 18

所以平均查找长度为 18/12=1.5

相关推荐
hmbbcsm1 天前
关于transformors库的学习笔记
笔记·学习
minglie11 天前
qemu相关脚本
学习
@小博的博客1 天前
CSDN年度技术趋势预测的技术
学习
可可西里_X_back1 天前
Linux学习(二)- 驱动开发步骤
linux·驱动开发·学习
GISer_Jing1 天前
测绘与GIS考试高频考点选择题精选
学习·arcgis
OBiO20131 天前
从单细胞多组学到体内验证:器官纤维化与代谢疾病的研究新范式
笔记·学习
Irene19912 天前
PMP管理大数据学习建议
大数据·学习·pmp
谙弆悕博士2 天前
Python快速学习——第8章:循环语句
python·学习·servlet
Tutankaaa2 天前
知识竞赛计分如何确保绝对准确?双机热备方案详解与实施要点
笔记·学习·职场和发展
xiaoxiaoxiaolll2 天前
Light: Sci & Appl. | 子阵列栅控HEMT超表面:太赫兹波前同时实现高速调制与物理层逻辑
学习