java 哈希冲突

java 哈希冲突问题一:什么是哈希冲突通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的哈希值。这时候就产生了哈希冲突。问题二:怎么解决哈希冲突开放地址法;再哈希法;链地址法(拉链法);公共溢出区法。开放地址法:开放地址法处理冲突的基本原则就是出现冲突后按照一定算法查找一个空位置存放…

大家好,又见面了,我是你们的朋友全栈君。

问题一 : 什么是哈希冲突

通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的哈希值。这时候就产生了哈希冲突。

问题二:怎么解决哈希冲突

1)开放地址法;再哈希法;链地址法(拉链法);公共溢出区法。

开放地址法:开放地址法处理冲突的基本原则就是出现冲突后按照一定算法查找一个空位置存放
Hi=(H(key)+di)% m i=1,2,…,n
其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:

线性探测再散列

dii=1,2,3,…,m-1
这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

二次探测再散列

di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )

这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。

伪随机探测再散列

di=伪随机数序列。

具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。
2) 再哈希法
这种方法是同时构造多个不同的哈希函数:

Hi=RH1(key) i=1,2,…,k

当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

3)链地址法
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

4)建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
拉链法与开放地址法相比的缺点:
拉链法的优点

与开放定址法相比,拉链法有如下几个优点:

①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;

②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间;

④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

拉链法的缺点

拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148949.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月16日 下午2:00
下一篇 2022年6月16日 下午2:00


相关推荐

  • 软件测试缺陷报告内容_软件测试缺陷分析

    软件测试缺陷报告内容_软件测试缺陷分析1软件缺陷缺陷是一种泛称,它可以指功能的错误,也可以指性能低下,易用性差等 并不是所有的测试人员都能提交被开发认可的缺陷,也不是测试人员在任何时候都能提交被开发认可的缺陷2什么是软件缺陷软件未达到产品说明书标准的功能 软件出现了产品说明书指明不会出现的错误 软件功能超出产品说明书指明范围 软件未达到产品说明书虽未指出但应达到的目标 软件测试员认为软件难以理解,不易使用,运行速度缓慢,或者最终用户认为不好3缺陷产生的原因4发现缺陷用户体验不够好 界面上有明显的错误信

    2026年1月15日
    8
  • 史上最全的SpringMVC学习笔记

    史上最全的SpringMVC学习笔记

    2022年3月2日
    64
  • ORB-SLAM 2+3 rgbd稠密地图 (地图可回环)「建议收藏」

    ORB-SLAM 2+3 rgbd稠密地图 (地图可回环)「建议收藏」高博曾经在他的github上提供过,但因为大佬时间少,并没有将回环加入到稠密地图,现提供一个可回环的稠密地图版本https://github.com/tiantiandabaojian/ORB-SLAM2_RGBD_DENSE_MAP.git第一张图片是TUM数据集未回环的地图第二张图片是经过回环的地图第三张是博主自己用KinectV2跑出的地图望能帮到各位…

    2026年1月18日
    4
  • Petri网学习(四):Petri网的结构性质

    Petri网学习(四):Petri网的结构性质一 结构有界性 amp 守恒性 1 结构有界性定义 设 N P T F 为一个网 对 N 赋予任意的初始标识 M0 网 N M0 都是有界的 则称 N 为结构有界网 再回忆一下什么是有界 petri 网 在 PN P T F M0 中 库所 p 都有界 则称 PN 为有界 petri 网 区别在于是不是任意初始标识 什么是库所有界 nbsp 定理 设 A 为网 N P T F 的关联矩阵 N 是结构有界网的充分必

    2026年3月18日
    1
  • linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb

    linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb原因 挂载时未格式化 使用的文件系统格式不对解决方案 格式化 sudomkfs text4 dev sdb 再挂载 sudomount dev sdb xxx 用 df h 检查 发现已挂载

    2026年3月19日
    1
  • pycharm环境下导入包

    pycharm环境下导入包本人以 python3 10 为例子首先打开设置在这里打开 在指定搜索域搜索自己想要查找的包 选择后点击安装软件包 如果报错无法进行 进行以下操作 首先在解析器查看自己的 python 路径 进入上层的 Scripts 的文件夹在蓝色区域输入 cmd 并 enter 建进入 cmd 命令行继续输入 pip install 需要安装的软件包 继续 enter 在执行完之后 回到 pycharm 查看包是否安装如未有显示 继续进行这步操作 或者 pipinstall 国

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号