hash冲突的4种解决方案

hash冲突的4种解决方案解决哈希冲突有以下四种方法

原文网址:hash冲突的4种解决方案_IT利刃出鞘的博客-CSDN博客

简介

解决hash冲突(哈希冲突)有以下四种方法:

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

法1:链地址法

对于相同的哈希值,使用链表进行连接。(HashMap使用此法

优点

  1. 处理冲突简单,无堆积现象。即非同义词决不会发生冲突,因此平均查找长度较短;
  2. 适合总数经常变化的情况。(因为拉链法中各链表上的结点空间是动态申请的)
  3. 占空间小。装填因子可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计
  4. 删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。

缺点

  1. 查询时效率较低。(存储是动态的,查询时跳转需要更多的时间)
  2. 在key-value可以预知,以及没有后续增改操作时候,开放定址法性能优于链地址法。
  3. 不容易序列化

法2:再哈希法

        提供多个哈希函数,如果第一个哈希函数计算出来的key的哈希值冲突了,则使用第二个哈希函数计算key的哈希值。

优点

  1. 不易产生聚集

缺点

  1. 增加了计算时间

法3:建立公共溢出区

将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

法4:开放定址法

        当关键字key的哈希地址p =H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,若p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。

即:Hi=(H(key)+di)% m (i=1,2,…,n)

开放定址法有下边三种方式:

  1. 线性探测再散列
    1. 顺序查看下一个单元,直到找出一个空单元或查遍全表
    2. di=1,2,3,…,m-1
  2. 二次(平方)探测再散列
    1. 在表的左右进行跳跃式探测,直到找出一个空单元或查遍全表
    2. di=1^2,-1^2,2^2,-2^2,…,k^2,-k^2 ( k<=m/2 )
  3. 伪随机探测再散列
    1. 建立一个伪随机数发生器,并给一个随机数作为起点
    2. 例如,已知哈希表长度m=11,哈希函数为:H(key)= key % 11,则H(47)=3,H(26)=4,H(60)=5,假设下一个关键字为69,则H(69)=3,与47冲突。

      如果用线性探测再散列处理冲突,下一个哈希地址为H1=(3 + 1)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 + 2)% 11 = 5,还是冲突,继续找下一个哈希地址为H3=(3 + 3)% 11 = 6,此时不再冲突,将69填入5号单元。

      如果用二次探测再散列处理冲突,下一个哈希地址为H1=(3 + 12)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 – 12)% 11 = 2,此时不再冲突,将69填入2号单元。

      如果用伪随机探测再散列处理冲突,且伪随机数序列为:2,5,9,……..,则下一个哈希地址为H1=(3 + 2)% 11 = 5,仍然冲突,再找下一个哈希地址为H2=(3 + 5)% 11 = 8,此时不再冲突,将69填入8号单元。

    di=伪随机数序列。具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。

优点

  1. 容易序列化
  2. 若可预知数据总数,可以创建完美哈希数列

缺点

  1. 占空间很大。(开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间)
  2. 删除节点很麻烦。不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。

其他网址

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

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

(0)
上一篇 2026年3月26日 下午9:30
下一篇 2026年3月26日 下午9:31


相关推荐

  • 【动画教程】真封神南极服务端2.52架设第四集「建议收藏」

    【动画教程】真封神南极服务端2.52架设第四集「建议收藏」官方网站www.zfs2014.com动画名称:真封神南极服务端2.52架设第四集主讲人:diablo2208教程下载地址:http://pan.baidu.com/s/1bnf9EkZ

    2022年7月24日
    15
  • IDEA 集成git

    IDEA 集成gitgit 系列文章目录第九章 IDEA 集成 git 文章目录 git 系列文章目录前言一 IDEA 集成 git 二 使用步骤 1 使用 IDEA 完成本地库的初始化操作 2 使用 IDEA 完成代码并添加到 git 和提交到本地库 3 本地库和远程库的交互 4 从远程库的克隆操作总结前言命令方式比较繁琐 本章介绍常用的 IDEAgit 图形化操作一 IDEA 集成 git 示例 打开 IDEA 随便创建一个项目控制台项目找到 git 选项检查设置是否已经配置好了 git 路径然后确定二 使用步骤 1 使用 IDEA 完成

    2026年3月19日
    2
  • 更新pip版本(anaconda更新pip)

    @更新pip版本#window:正常windows下更新pip版本的指令无法更新时,可以尝试如下指令python-mpipinstall–upgradepip#Ubuntu更新pip版本指令:sudo-Hpython-mpipinstall–upgradepip…

    2022年4月11日
    41
  • pytest-allure_苹果11验机报告

    pytest-allure_苹果11验机报告前言allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面。mac环境:

    2022年7月29日
    7
  • 一句话讲清楚什么是JavaEE「建议收藏」

    一句话讲清楚什么是JavaEE「建议收藏」Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。Java平台有很多种,很多的Jav

    2022年8月3日
    9
  • 扣子空间手机版v1.5.2 安卓版

    扣子空间手机版v1.5.2 安卓版

    2026年3月12日
    2

发表回复

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

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