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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 有序的hashmap_treemap是有序的吗

    有序的hashmap_treemap是有序的吗如何给HashMap中的值排序?这个问题很多人都遇到过,很常见的一个方案是使用LinkedHashMap,因为LinkedHashMap可以记住元素放入的顺序,可以认为是真正的“有序”(想让HashMap有序是不可能的),我比较喜欢。然而问题是往往数据已经封装在了HashMap中,我们必须手动的排序后再放入LinkedHashMap,这当然也就成了思路,代码实现起来也很简单,写出来看起来还挺舒服的…

    2022年9月24日
    2
  • 数字电路实验环境 (Quartus II 9.0)

    数字电路实验环境 (Quartus II 9.0)大家好,我是孙不坚1208,记录一下数字电路这门课的实验环境((QuartusII9.0))安装。所需文件网盘链接:https://pan.baidu.com/s/1VnCc4wR7HAOgxfyWjoUHjw提取码:0kjq安装教程仅限于学习,安装前先关闭各类杀毒软件,注意安装路径不能有中文,存放安装包的路径最好也不要有中文。我们首先在c盘建好相应的文件目录,然后进行安装在此目录下。一、安装QuartusII9.0等它稍微加载,出现下面这个界面。这里进行安装,无脑点击下一步

    2022年7月12日
    20
  • 图像处理——Canny算子

    图像处理——Canny算子首先感谢以下两位的渊博知识:(1)爱鱼     https://www.cnblogs.com/mightycode/p/6394810.html(2)mitutao  https://www.cnblogs.com/love6tao/p/5152020.html图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。我们知道微分运算是求信号的变化率,具有加

    2022年5月30日
    48
  • mybatiscodehelperpro2.8.3激活码_navicat premium激活

    mybatiscodehelperpro2.8.3激活码_navicat premium激活目录一、前言二、安装插件MyBatisCodeHelperPro插件三、激活一、前言在开发中编写生成bean,mapper,mapper.xml即费时也费力,可以通过MyBatisCodeHelperPro自动生成bean,dao,mapper.xml等文件,然后根据自己的需要进行修改。MyBatisCodeHelperPro是IDEA下的一个插件,类似于mybatisplugin,但是是收费的,但可以进行激活使用:下面这个大佬的个人主页上有多个版本的下载链…

    2022年9月21日
    2
  • 转换 datetime 和 smalldatetime 数据[通俗易懂]

    转换 datetime 和 smalldatetime 数据[通俗易懂]转换datetime和smalldatetime数据转换为datetime时,Microsoft®SQLServer™2000将拒绝所有无法识别为日期的值(包括1753年1月1日以前的日期)。当日期在适当的范围内(1900年1月1日到2079年6月6日)时,可将datetime值转换为smalldatetime。时间值被四舍五入

    2022年5月19日
    45
  • 搜索类似图_智能搜索相似图片

    搜索类似图_智能搜索相似图片—————–转载自yclzh0522的博客————————–你想凭着一张现有图片找出它的原始图片,或者是凭着一张小的缩略图找出原始大图吗?下面的十一款搜索引擎可以帮你实现,以图找图,以图搜图,以图片搜索相似的图片。1.http://tineye.com/Tineye是典型的以图找图搜索引擎,输入本地硬盘上的图片或者输入图片网址

    2025年10月25日
    4

发表回复

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

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