利用开放定址法实现散列表的创建、插入、删除、查找操作_散列表(hash-table)...

afee56a0e105d803491f9fc5886ee0e8.png

key-value lookup table

字典的操作主要包括三个:

  1. 查询
  2. 插入
  3. 删除
Hashing | Set 1 (Introduction) - GeeksforGeeks​www.geeksforgeeks.org
539e65a50b5bf06b0598219ff0fa6728.png

基本概念

建立了key与储存地址之间的一种直接映射关系

冲突:散列函数可能把两个或者两个以上的不同key检测映射到一个同地址


如何构造Hash Function

数据结构] 散列表(Hash Table)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

所以Hash Function就是将Key映射到不同地址空间的一个函数,为了减少冲突的发生,就需要Hash Function可以计算出的地址可以等概率,均匀的分布在整个地址空间。而且Hash Fucntion需要尽可能的简单,可以在较短的时间内计算出任意关键字的散列地址。

  1. 直接定址法:Hash(key) = a * key + b 不会产生冲突
  2. 除留余数法:如果散列表的表长为m,取一个不大于m但是最近或者等于m的质数p H(key) = key % p
  3. 数字分析法:

选取数码在各位上出现频率均匀的若干位作为散列地址

3c9a697652e2d65067bae4417f83afbf.png
后面四位

4. 平方取中法:

取关键字的平方值的中间几位作为地址

取中间三位227作为散列地址

取中间三位990作为散列地址

5. 折叠法:123456789

123|456|789|0 --》 123 + 456 + 789 + 0 = 1368


冲突处理方法

开放定址法:将产生冲突的Hash地址作为自变量,通过某种冲突解决得到一个新的地址

  1. 线性探测法:冲突之后,查找下一个单元,当探测到表尾m-1的时候,转到地址0,直到找到空闲单元。(会在大量的散列地址上聚集起来,大大降低了查找效率)
  2. 平方探测法:
    (大量空闲单元)
  3. 再散列法:

Hash1(Key) = KeyMod8(第一个得到散列地址)

Hash2(key) = KeyMod2(发生冲突时候,计算该关键字的地址增量)

第i次发生冲突

2f0ede066297bbb7619135aeb61e1295.png

4. 伪随机序列法:

当发生地址冲突时候,地址增量为伪随机数序列

拉链法:对于不同的关键词可能会通过散列函数映射到同一地址,为了避免非同义词发生冲突,可以把所有的同义词储存再一个线性列表中,这个线性列表由其散列表地址唯一识别。拉链法适用于经常插入和删除的情况。


散列表如何进行查找

6c5592f4cb0fb61c229619c84bd69ca4.png

103303a79445b71c2ce08806ea8425e9.png

5dedbbbbed4968790218554ef0210f91.png

506c5b5267361706b0e6ed57a4af9a9c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值