当前位置: 首页 > news >正文

散列表解决冲突的办法

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

上文解释了散列表的含义。通过哈希函数f(key)找到在表中的位置。aKey和bKey不相等时,f(aKey) 可能等于 f(bKey)。这种现象称为碰撞。 目前解决该问题有两种办法

  1. 开放寻址法
  2. 拉链法(又称分离链表法)

开放寻址法 开放寻址法 Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)为散列函数,m为散列表长,di为增量序列

从而有三种取法:

  1. di=1,2,3,…,m-1,称线性探测再散列
  2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)称二次探测再散列
  3. di=伪随机数序列,称伪随机探测再散列

Android 源码的 ThreadLocal 就是用的该方法解决冲突。 ThreadLocal使用的第一种线性探测方法,

f(key) = key & (len-1))
key += 0x61c88647
复制代码
int temp = 0;
for (int i = 0; i < 16; i++) {
    int k = temp & 15;
    Log.d("tag", " " + k);
    temp += HASH_INCREMENT;
}
D/tag:  0
D/tag:  7
D/tag:  14
D/tag:  5
D/tag:  12
D/tag:  3
D/tag:  10
D/tag:  1
D/tag:  8
D/tag:  15
D/tag:  6
D/tag:  13
D/tag:  4
D/tag:  11
D/tag:  2
D/tag:  9
复制代码

可以看到很分散。

当冲突时,i+1向后继续寻找位置,直到不为空的位置或无效位置。 同时当表即将满员后,会进行resize表大小。

图片来自 http://alexyyek.github.io/2014/12/14/hashCollapse/

拉链法

图片来自 http://faculty.cs.niu.edu/~freedman/340/340notes/340hash.htm

可以看到拉链法会找到key所对应的链表,通过链表链接f(key)相同的元素。

转载于:https://juejin.im/post/5ae8424451882567244dc64e

相关文章:

  • 访谈:摩尔定律后时代,看13位行业专家如何看量子计算机的未来?
  • 青云QingCloud黄允松:关于云计算未来的三个预测
  • slim.flatten——将输入扁平化但保留batch_size,假设第一维是batch
  • 深入浅出MyBatis:MyBatis插件及开发过程
  • 解决Mybatis配置ORM映射 时分秒都为0
  • Spring Cloud入门教程-Hystrix断路器实现容错和降级
  • 0505 php-数组、控制语句、函数
  • 第三期 行为规划——6.输出状态转换方程的量
  • Ping程序
  • 群发功能推广通知短信的一些问题
  • 蓝海存储开关机注意事项总结
  • Fragment向父Activity传值
  • jmeter学习笔记
  • 债券和股票
  • 使用Vagrant 在Virtual Box 上安装Docker--(补充九步构建自己的hello world Docker镜像)
  • @angular/forms 源码解析之双向绑定
  • 【刷算法】求1+2+3+...+n
  • HashMap剖析之内部结构
  • JavaScript异步流程控制的前世今生
  • JSDuck 与 AngularJS 融合技巧
  • laravel with 查询列表限制条数
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Redis 懒删除(lazy free)简史
  • Vue官网教程学习过程中值得记录的一些事情
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 模型微调
  • 学习笔记:对象,原型和继承(1)
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • #考研#计算机文化知识1(局域网及网络互联)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1)SpringCloud 整合Python
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (接口封装)
  • (译)计算距离、方位和更多经纬度之间的点
  • (转) Face-Resources
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • *上位机的定义
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Core引入性能分析引导优化
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @AutoConfigurationPackage的使用
  • @DataRedisTest测试redis从未如此丝滑
  • [2016.7 day.5] T2
  • [20171102]视图v$session中process字段含义
  • [2023年]-hadoop面试真题(一)
  • [C#]使用PaddleInference图片旋转四种角度检测
  • [HarekazeCTF2019]encode_and_encode 不会编程的崽
  • [java/jdbc]插入数据时获取自增长主键的值