【Java】哈希冲突(哈希碰撞)

article/2025/9/22 18:23:45

文章目录

  • 为什么发生哈希冲突(哈希碰撞)
  • 能否完全避免哈希冲突
  • 常用处理哈希冲突的方法
    • 1.开放地址法
      • 1.1线性探测再散列
        • 缺点:二次聚集
      • 1.2二次探测再散列
      • 1.3伪随机探测再散列
    • 2.再哈希地址法
    • 3.链地址法
    • 4.建立公共溢出区


为什么发生哈希冲突(哈希碰撞)

  当向hash表中存放数据时,会使用hash函数计算出对应的hash函数值,即哈希地址,所以会出现不同关键字具有相同hash函数值,即不同数据具有同一hash地址的情况,这个时候就发生了哈希冲突。

能否完全避免哈希冲突

  虽然可以选择不同的哈希函数去避免冲突的产生,但是数据量增长,始终会产生哈希冲突,因此只能尽量减少。

常用处理哈希冲突的方法

  1. 开放地址法
  2. 再哈希地址法
  3. 链地址法
  4. 建立公共溢出区

1.开放地址法

  当产生哈希冲突时,就在哈希表中寻找另一个空的位置存放关键字。如何寻找另一个空的位置,也有不同的规则。

  1. 线性探测再散列
  2. 二次探测再散列
  3. 伪随机探测再散列

1.1线性探测再散列

  当发生哈希冲突时,即某一位置已放了关键字,会查询下一个位置上是否是空的,空的便放入,否则再下一个位置尝试放入直到解决冲突。每次查询下一个未冲突的位置的增量d为1、2、3、4…(不断自增),即不断加上增量d,从而寻找下一个空的位置。
例如:
  关键字(35、74、02、31、39、98、99、100)按哈希函数H(key) = key / 7 和开放地址法中的线性探测处理哈希冲突

  1. 35关键字放在0位置
0123456789
35
  1. 74关键字放在4位置
0123456789
3574
  1. 02关键字放在2位置
0123456789
350274
  1. 31关键字放在3位置
0123456789
35023174
  1. 39关键字应放在(39/7 = 5…4)4位置,但4位置已有关键字,则根据线性探测,下一个空的位置为5,则将39关键字放在5位置
0123456789
3502317439
  1. 类似的情况,98关键字由于0位置已被占用,顺延一位至1位置
0123456789
359802317439
  1. 99关键字应放入1位置,但由于前面位置均已被占用,跳过已占有的所有位置,找到最近的空位,被放入6位置
0123456789
35980231743999
  1. 100关键字同理
0123456789
35980231743999100

缺点:二次聚集

  发现当表中i、i+1、i+2位置上已经填有记录时,下一个哈希地址为i、i+1、i+2、i+3的关键字,都将先填入i+3位置,这种解决哈希冲突过程中,发生的两个第一哈希地址不同的记录,争夺同一个后继哈希地址的现象称之为  二次聚集 ,显然数据量大了后,后续探测距离会特别长,线性探测会造成二次聚集,这对查找不利,但是这也可以保证只要哈希表未填满,总能找到一个不发生哈希冲突的地址。

1.2二次探测再散列

  二次探测再散列也是类似的思路,一旦将填入的位置已有关键字,便会根据规则寻找下一个未被占用的位置,即不断加上增量d,从而寻找下一个空的位置。但规则区分于自增的线性探测,增量d为12 、-12、22、-22 、32、-32
例如:
  同样的关键字(35、74、02、31、39、98、99、100)按哈希函数H(key) = key / 7 和开放地址法中的二次探测再散列处理哈希冲突

  1. 39关键字应放在4位置,但4位置已有关键字,则根据增量d=12,放在4+1=5,5位置上
0123456789
3502317439
  1. 98关键字由于0位置已被占用,根据增量d=12 =1,放在1位置
0123456789
359802317439
  1. 99关键字应放入1位置,但1已被占用,根据增量d=12 =1,放入(1+1)2位置,但2已占用,继续下一个增量d=-12,放入(1-1)0位置,但0已占用。d= 22 = 4,放入(1+4)5位置,但5已占用,继续下一个增量。d= -22 已越界,继续下一个增量d= 32 = 9,放入(1+9)10位置
012345678910
35980231743999
  1. 100关键字,尝试放入位置为2、(+1)3、(-1)1、(+4)6
012345678910
35980231743910099

  二次探测再散列使用并不多,因为当增量d非常大时,每一个跨度都非常大,需要跨过很多空地址。

1.3伪随机探测再散列

  取决于伪随机数列


2.再哈希地址法

  当产生哈希地址冲突时,使用另一个不同的哈希函数计算哈希函数地址直到冲突不再产生。这不容易产生聚集,但会有计算时间的额外开销。


3.链地址法

  建立一个单链表(同一线性链表),链表上的数据均为相同的哈希地址x,该链表中的数据插入位置可以在头尾或中间,保持同意立案表中按关键字有序,将同一链表的头指针放在哈希表中x的位置。
例如:
  关键字(01、14、20、27、55、68)按哈希函数H(key)= key MOD 13 和链地址法处理哈希冲突,得到的哈希表如图所示
在这里插入图片描述
                (链地址法得到的哈希表)


4.建立公共溢出区

  建立溢出表和基本表,出现与基本表有冲突的数据,无论哈希函数计算得到的哈希地址是什么,一旦发生冲突,都填入溢出表。会有额外的空间开销。


http://chatgpt.dhexx.cn/article/41hL0cG3.shtml

相关文章

什么是哈希,哈希表,哈希函数,哈希碰撞?

什么是哈希? 比方我有个原始值,S[“老铁双击666”,‘感谢老铁送的飞机’], 通过某种算法(比如java的hasecode(获得变量的物理地址))得到的666这个就是“哈希码“(将字符串转换成尽可能不重复的int类型数字…

解决哈希碰撞的方法

什么是hash表 根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或…

公网IP/内网IP:

转自:http://hi.baidu.com/qkjzsjqsehailte/item/1042151cc0959f426926bbb4 IP地址分配 IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同…

公网ip、内网ip

首先解释一下“内网”与“外网”的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的。但两个局域网内的内网IP可以有相同的。 外网:即互联网&a…

什么是公网IP和内网IP?

1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么?又有什么关系呢?另外,内行都知道&#xff0c…

内网地址与公网地址及作用

下个礼拜就要过年喽 每天离假期更近了一步,就充满了动力 大家回家路上也要注意防护安全哦 ———————————————————— 一般内网指的就是我们园区内网,用的地址一般都是私有地址 私有地址在RFC1918草案中被提到,指的就是10…

java如何获得内网ip、外网ip、以及如何根据ip查询地址

今天突发奇想地想要用java写一个小的工具类。 用来实现如何获得本机的内网ip,外网ip和根据ip获得相应的地址。 花了几个小时才弄清,然后整理了一下,希望有用。 首先要明白以下三种ip地址的区别: (1)127.0.0…

简单介绍 内网与外网IP地址,域名,子网掩码,网关与路由器,ping

IP地址 IP地址是在网络给主机分配的地址如53.159.232.5或者192.168.1.1 。具体格式就是00000000.00000000.00000000.00000000,32位二进制,平时都用十进制。 但是主机在网络上不是一个主机连一个主机,而是网络连接网络,在一个网络…

局域网固定内网IP地址的方法(亲测有效)

公司有十来台电脑,想要做文件共享,但是碍于内网IP经常变动共享文件很不方便。 网上查了一些资料,局域网中的电脑ip若不是设置固定的话,一般都是动态获取的ip,若是需要固定ip,那要如何设置呢? 经…

查询自己的IP地址(内网和外网)

查询自己的内网IP和外网IP的方法,以及判断是否直接连接到公网 本方法使用命令行,无需其他软件 内网IP,即局域网IP: 打开cmd窗口,输入 ipconfig 后回车 IPv4地址一栏下即为内网IP,我的电脑是192.168.3.19 顺…

192.168.和10.0.开头的IP、内网IP段、IP简介、分类——(IP观止)

在这三类地址中,绝大多数的IP地址都是公有地址,需要向国际互联网信息中心申请注册。但是在IPv4地址协议中预留了3个IP地址段,作为私有地址,供组织机构内部使用。 这三个地址段分别位于A、B、C三类地址内: A类地址&…

VS2019安装+IVF2020安装+abaqus2021安装+关联(亲测有效附安装包)

VS2019安装IVF2020安装abaqus2021安装关联(亲测有效附安装包) 0. 说明1. 安装与汉化abaqus20211.1 下载解压安装包1.2 参考以下链接的安装步骤安装1.3 安装注意事项和提示 2. VS2019安装IVF2020安装2.1 下载解压VS2019在线安装包2.2 安装配置VS20192.3 下…

abaqus一维固结模拟

初学者学习ABAQUS时,真可谓一头雾水,为什么? 第一因为它是全英文界面(不过这是可以汉化的哦);第二因为它是有限元分析软件,俗称“CAE”即计算机辅助求解分析复杂工程(不同于CAD即计算…

Abaqus安装在lincense server1出错

问题描述:LMtools显示启动成功,但是安装abaqus时填写过License Server1后测试链接不上 原因:Lincense server1中应为27011主机名(格式不要错了),而我输入成了27500主机名(原因是找的一个安装教程…

基于Python向Abaqus导入txt、dat数据(附abaqus中python二次开发课程)

这次推送聚焦于解决采用Python向Abaqus里导入txt、dat数据的问题(dat文件只需要将txt文件的后缀名改为dat就可以生成dat文件),Abaqus基于Python读入txt、dat数据主要有read()、readlines()、readlines()、numpy.loadtxt()函数,导入…

ABAQUS后处理常用功能

ABAQUS分析完成后,除了看看动画,看看云图,可能还需要进行其他操作,此处记录自己常用的一些功能在哪设置。 使用版本6.14,进行了中文汉化 修改背景颜色 修改图例坐标轴标题文字大小 修改图例应力范围颜色 不显示模型上…

搅拌摩擦焊有限元仿真分析学习笔记(一)——comsol、abaqus相关案例学习

目录 COMSOL搅拌摩擦焊官方案例△ 原理及分析△ 操作流程△ 分析 ABAQUS搅拌摩擦焊有限元仿真△ 操作流程○ 创建模型○ 配置材料属性○ 模型装配○ 分析步设置○ 创建相互作用○ 创建载荷○ 划分网格○ 建立温度场○ 运算求解○ 结果与分析 △ 总结分析 ABAQUS搅拌摩擦焊CEL模…

abaqus帮助文档翻译,中英对照

abaqus2016在线帮助文档因为比较简洁,打开响应速度较快,相对于需要注册的高版本帮助文档算是一大优点。 但文档内容对于英文水平一般的同学不太友好,为了提高阅读效率隧寻找网页翻译的方法。 1.浏览器右键的网页翻译,实测无效。…

Abaqus运行脚本print时中文乱码问题

脚本打印输出时出现乱码问题 运行脚本想要直接输出位移数据,发现中文打印出现乱码。 #!/usr/bin/env python # -*- coding:utf-8 -*- #codingutf-8a 位移数据为:0.25555 print(a)运行上面代码出现以下情况 解决办法 将打印内容使用UTF-8解码,然后使…