数据结构与算法——23.哈希冲突及其解决方法

这篇文章我们主要讲一下哈希冲突及其解决方法。

目录

1.哈希冲突的介绍

2.解决哈希冲突的方法

2.1 开放地址法

2.1.1 线性探测法

2.1.2 平方探测法(二次探测法)

2.2再哈希法

2.3链地址法

2.4建立公共溢出区

3.总结


1.哈希冲突的介绍

首先,我们来了解一下哈希表与哈希冲突。

哈希表:哈希表也叫散列表,底层是由数组+链表实现的,是一种实现关联数组和抽象数据类型的数据结构,这种结构可以将关键码映射到给定值。简单来说哈希表(key-value)之间存在一个映射关系,是键值对的关系,一个键对应一个值

哈希冲突:当两个不同的数经过哈希函数计算后得到了同一个结果,即他们会被映射到哈希表的同一个位置时(就是对应数组的同一个索引),即称为发生了哈希冲突。简单来说就是哈希函数算出来的值有重复的了。

2.解决哈希冲突的方法

下面来看一下解决哈希冲突的方法

2.1 开放地址法

开放定址法:我们在遇到哈希冲突时(就是有重复哈希码时),去寻找一个新的空闲的哈希地址(就是通过另一个哈希算法再算一个哈希码)。

举例解释:就是当我们去教室上课,发现该位置已经存在人了,所以我们应该寻找新的位子坐下,这就是开放定址法的思路。

具体实现方法有以下几种

2.1.1 线性探测法

开放地址法的实现发法之一就是线性探测法

当我们的所需要存放值的位置被占了,我们就往已生成的哈希码后面一直加1并对m取模,直到存在一个空余的地址供我们存放值,取模是为了保证找到的位置在 0~m-1 的有效空间之中。

公式:h(x) = ( Hash(x) + i ) mod ( Hashtable.length );( i 会逐渐递增加1)

如下图所示:

存在的问题:出现非同义词冲突(两个不想同的哈希值,抢占同一个后续的哈希地址)被称为堆积或聚集现象。

2.1.2 平方探测法(二次探测法)

当我们的所需要存放值的位置被占了,平方探测法会前后寻找而不是单独方向的寻找

公式:h(x) = ( Hash(x) + i ) mod ( Hashtable.length );( i 依次为 + ( i^2 ) 和 - ( i^2 ) )

如下图所示:

2.2再哈希法

除了使用开放地址法之外,我们还可以用再哈希法

再哈希法:同时构造多个不同的哈希函数,等发生哈希冲突时就依次使用第二个、第三个……等其他的哈希函数计算地址,直到不发生冲突为止。虽然不易发生聚集,但是增加了计算时间。

2.3链地址法

这个就是我们很常见的了,就是在数组后面加链表进行存储

公式:h(x) = x mod ( Hashtable.length );

如下图所示:

2.4建立公共溢出区

建立公共溢出区:将哈希表分为基本表和溢出表,将发生冲突的都存放在溢出表中。

这个就很简单了,不接受了。

3.总结

这篇文章介绍了哈希表,哈希冲突和解决哈希冲突的四种方法。我们主要还是用第三种方法,就是用链表来增加存储。其实都很好理解,不多说了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue快速入门(二十五)本地存储与初始化使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 本地获取数据数据存储到本地 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

【浪漫 罗盘时钟 Js、css实现(附源代码) 美化版本】,前端面试必问的HashMap

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

WebKit简介及工作流程

文章目录 一、WebKit简介二、WebKit结构三、Webkit工作流程四、WebKit常见问题五、WebKit优点六、相关链接 一、WebKit简介 WebKit是一个开源的浏览器引擎&#xff0c;它的起源可以追溯到2001年&#xff0c;当时苹果公司推出了其首款基于Unix的操作系统Mac OS X。在2002年&…

最短网络kruskal算法

题目描述 农民约翰被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给其他农场。为了用最小的消费&…

【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 生命周期初始化时机常量和静态变量的区别静态变量相关性质静态变量的访问修饰符静态变量的线程安全性静态变量的命名规范 生命周期 生命周期&#xff08;Lifecycle&#xff09;是指一个对象从创建到销毁的整个…

光电传感器的工作原理简介

光电传感器是一种利用光电效应将光信号转换为电信号的传感器。 工作原理 光照射&#xff1a;光电传感器通过光源&#xff08;如LED或激光&#xff09;照射在其表面。 光电转换&#xff1a;光线与传感器材料发生光电反应&#xff0c;产生电信号。这种转换过程涉及到光子与电子的…

Albumentations库:为自定义数据进行数据增强

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 为什么在深度学习中使用增强&#xff1f; 深度学习和计算机视觉中的增强已经成为至关重要的几个原因。首先&#xff0c;它丰富了训练数据集&#xff0c;使模型能够从更多样化的示例中学习&#xff0c;这在标记数据有限时…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一&#xff1a;正式之前先回顾数据结构中的双向循环链表 二&#xff1a;list的简介 三&#xff1a;STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

【深度剖析】曾经让人无法理解的事件循环,前端学习路线

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

Mybatispuls-自动填充

一&#xff0c; 创建时间 . 修改时间! 这些个操作都是自动化完成的,我们不希望手动更新! 阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化! 二&#xff0c;如何实现 1&#xff0c;编写实体类&#xff08;字段属性上添加注解…

ubuntu 23.10.1 mysql 安装

注&#xff1a;请进入root用户模式下操作&#xff0c;若没有&#xff0c;输入命令前加上sudo 1、更新软件包列表 apt update2、安装最新版的Mysql服务器 apt install mysql-server -y如果不加-y 会在安装过程中&#xff0c;系统将提示你设置MySQL的root密码。确保密码足够强…

基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 VIVADO2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Design Name: // …

【御控物联】Java JSON结构转换(1):对象To对象——键值互换

文章目录 一、JSON是什么&#xff1f;二、JSON结构转换是什么&#xff1f;三、核心构件之转换映射四、案例之《JSON对象 To JSON对象》五、代码实现六、在线转换工具七、技术资料 一、JSON是什么&#xff1f; Json&#xff08;JavaScript Object Notation&#xff09;产生于20…

Leetcode876_链表的中间结点

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5…

类与对象(中)

目录 赋值运算符重载 运算符重载 赋值运算符重载 前置和后置重载 日期类的实现&#xff08;前置后置也在里面&#xff09; const 成员 ​编辑 取地址及const取地址操作符重载 赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载…

【python】python天气气候数据抓取分析可视化(源码+数据+可视化+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Redis入门到通关之ZSet命令

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素&#xff0c;并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

汇编基础-----通过x64dbg了解什么是堆栈

汇编基础-----通过x64dbg了解什么是堆栈 什么是堆栈 在汇编语言中&#xff0c;堆栈&#xff08;stack&#xff09;是一种用于存储临时数据和执行函数调用的内存结构。堆栈是一种后进先出&#xff08;Last-In-First-Out, LIFO&#xff09;的数据结构&#xff0c;通常用于保存函…

【Docker系列】容器访问宿主机的Mysql

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

前端标记语言HTML

HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。它是构建和设计网页及应用的基础&#xff0c;通过定义各种元素和属性&#xff0c;HTML使得开发者能够组织和格式化文本、图像、链接等内容。 HTML的基本结构 文档类型声明&#xff0…