![afee56a0e105d803491f9fc5886ee0e8.png](https://img-blog.csdnimg.cn/img_convert/afee56a0e105d803491f9fc5886ee0e8.png)
key-value lookup table
字典的操作主要包括三个:
- 查询
- 插入
- 删除
![539e65a50b5bf06b0598219ff0fa6728.png](https://img-blog.csdnimg.cn/img_convert/539e65a50b5bf06b0598219ff0fa6728.png)
基本概念
建立了key与储存地址之间的一种直接映射关系
冲突:散列函数可能把两个或者两个以上的不同key检测映射到一个同地址
如何构造Hash Function
数据结构] 散列表(Hash Table)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com所以Hash Function就是将Key映射到不同地址空间的一个函数,为了减少冲突的发生,就需要Hash Function可以计算出的地址可以等概率,均匀的分布在整个地址空间。而且Hash Fucntion需要尽可能的简单,可以在较短的时间内计算出任意关键字的散列地址。
- 直接定址法:Hash(key) = a * key + b 不会产生冲突
- 除留余数法:如果散列表的表长为m,取一个不大于m但是最近或者等于m的质数p H(key) = key % p
- 数字分析法:
选取数码在各位上出现频率均匀的若干位作为散列地址
![3c9a697652e2d65067bae4417f83afbf.png](https://img-blog.csdnimg.cn/img_convert/3c9a697652e2d65067bae4417f83afbf.png)
4. 平方取中法:
取关键字的平方值的中间几位作为地址
5. 折叠法:123456789
123|456|789|0 --》 123 + 456 + 789 + 0 = 1368
冲突处理方法
开放定址法:将产生冲突的Hash地址作为自变量,通过某种冲突解决得到一个新的地址
- 线性探测法:冲突之后,查找下一个单元,当探测到表尾m-1的时候,转到地址0,直到找到空闲单元。(会在大量的散列地址上聚集起来,大大降低了查找效率)
- 平方探测法:
(大量空闲单元)
- 再散列法:
Hash1(Key) = KeyMod8(第一个得到散列地址)
Hash2(key) = KeyMod2(发生冲突时候,计算该关键字的地址增量)
![2f0ede066297bbb7619135aeb61e1295.png](https://img-blog.csdnimg.cn/img_convert/2f0ede066297bbb7619135aeb61e1295.png)
4. 伪随机序列法:
当发生地址冲突时候,地址增量为伪随机数序列
拉链法:对于不同的关键词可能会通过散列函数映射到同一地址,为了避免非同义词发生冲突,可以把所有的同义词储存再一个线性列表中,这个线性列表由其散列表地址唯一识别。拉链法适用于经常插入和删除的情况。
散列表如何进行查找
![6c5592f4cb0fb61c229619c84bd69ca4.png](https://img-blog.csdnimg.cn/img_convert/6c5592f4cb0fb61c229619c84bd69ca4.png)
![103303a79445b71c2ce08806ea8425e9.png](https://img-blog.csdnimg.cn/img_convert/103303a79445b71c2ce08806ea8425e9.png)
![5dedbbbbed4968790218554ef0210f91.png](https://img-blog.csdnimg.cn/img_convert/5dedbbbbed4968790218554ef0210f91.png)
![506c5b5267361706b0e6ed57a4af9a9c.png](https://img-blog.csdnimg.cn/img_convert/506c5b5267361706b0e6ed57a4af9a9c.png)