当前位置: 首页 > news >正文

【基础算法】哈希表(拉链法)

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

文章目录

  • 前言
  • 哈希表:
    • 哈希表的含义:
    • 哈希表的作用:
    • 哈希表的思想:
      • 1.映射
      • 2.冲突:
    • 例题:
      • 题目:
      • 输入格式
      • 输出格式
      • 数据范围
      • 输入样例:
      • 输出样例:
    • 拉链法:
      • 1.先将原数组值域映射到哈希函数:
      • 2.建立一个槽,将映射的结果链接到槽上
      • 3.取模的N要为质数,且尽可能地离2的整数次幂尽可能的远。
      • 代码:
      • 代码解析:
  • 最后


前言

今天我们来学习一下新知识【哈希表】,这个是算法中比较重要的知识点,希望下面我的讲解你可以喜欢。如果有错误,请私信告知,望见谅。
——————————————————————————————————————————

首先先写上几句话:献给坚持创作的我和点开这篇文章希望进步的你
1.很喜欢《稻盛和夫对年轻人的忠告》里这段话:“大部分人对吃苦的含义了解得太浅了。吃苦不是穷,而是一个人长时间为了某个目标而聚焦的能力。在这个过程中,放弃娱乐生活,放弃无效社交,放弃无意义的消费以及在此过程中不被理解的孤独。”它本质是一种自控力,自制力,坚持和深度思考的能力。

2.以前我被误解的时候,我总会想去解释,你误会我了,我不是这样的人,我会想尽一切办法去证明自己。而现在,对于别人的误解,我不在乎也不想去辩解,我信任的人误会我,我会觉得挺好的,原来我在你心里是这样的人。
鱼那么相信水,水却煮了鱼;叶子那么信任风,风却吹落了叶;在自己的世界里独善其身,取悦自己,在别人的世界里顺其自然。

3.看到过这样一段话:“我希望你努力,不是为了要跟别人比成绩,而是因为,我希望你将来拥有选择的权利,选择有意义的生活,而不是被迫谋生。
当我们努力之后,我们才有机会不拘泥于方寸之地,不用只过着毫无新意、一眼望到头、没任何期待的日子。拥有选择权,我们才有底气和实力去选择我们想要的生活。

哈希表:

哈希表的含义:

在这里插入图片描述
上面是百度百科的说法;

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将所需查询的数据映射到表中一个位置来让人访问,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。

这是维基百科的解释,

一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表〈和建立人名z到首字母F(赏)的一个函数关系),在首字母为W的表中查找“王”姓的电话号码,显然比宜直接查找就要快得多。这里使用人名作为关键字,“取首字母”是这个例子中散列函数的函数法则F(),存放首字母的表对应荀列表。关键字和函数法则理论上可以任意确定.

两者在对于哈希表的解释都不约而同的说了两点:码值和映射

在这里插入图片描述
下面借助百度百科的这张图便于你的理解:
先建立一个哈希函数(设定一个范围),再将不同的数分别映射到哈希函数上。

哈希表的作用:

把一个复杂的数据结构(值域,数据)映射到[0,n];
n一般是10的五次方或者10的六次方
如将[0,109]映射到[0,105]

哈希表的思想:

1.映射

将一段较大的数组映射到一段相对较小的数组,当要查找一个元素的时候,可以根据这个元素所映射对应的位置进行直接查找,而不是遍历查找,这样就可以更加高效的完成查找功能。
注:哈希一般常用的是增加和查找功能,如果想要删除一个数据,也不是真正意义上的删除,而是设定一个布尔数值,布尔值为false时代表删除这个数据。

2.冲突:

我们可以从这个图上的得知:多个数据可能会映射到同一个数值的情况。
在这里插入图片描述
针对这个情况,处理冲突有多重方法,如:

1.拉链法:
2.开放寻址法
3.再散列法
4.建立一个公共溢出区

这里详细介绍一下:拉链法和开放寻址法

例题:

题目:

维护一个集合,支持如下几种操作:
I x,插入一个数 x;
Q x,询问数 x 是否在集合中出现过;
现在要进行 N 次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。

输出格式

对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。
每个结果占一行。

数据范围

1≤N≤105
−109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

拉链法:

1.先将原数组值域映射到哈希函数:

如果值域为[-109,109],将其映射到[0,105]
则 x mod105 (mod是取模)这样就可以使其范围在[0,105],
上面的数值都是假设便于你的理解。
真正的代码应该是这样的:

int k = (x % N + N) % N;

这个代码的意思是将x取余将x映射到[0,N]范围内。
因为在C++中如果负数取模后仍然是负数,因此需要先取模后加上N再对N取模其结果一定是一个正数。

2.建立一个槽,将映射的结果链接到槽上

在这里插入图片描述
如上图所示,假设11的映射为3,23的映射也是3,将11链接槽上的3,将23链接在11后面,这个使用的是链表的结构存储拉链。

3.取模的N要为质数,且尽可能地离2的整数次幂尽可能的远。

在这里插入图片描述
这样的取N冲突的概率是最小的。

代码:

#include <cstring>
#include <iostream>using namespace std;const int N = 100003;//这里可以自己写一个求大于100000第一个质数的代码求出即可int h[N];//这是上面说的开一个槽
int e[N], ne[N], idx;//与槽链接的拉链,用链表存储,//e[N]用来存值,ne[N]下一个的位置,idx表示当前移动到哪一个位置void insert(int x)
{int k = (x % N + N) % N;//k是哈希值e[idx] = x;ne[idx] = h[k];h[k] = idx ++ ;//插入操作,类似于头插
}bool find(int x)
{int k = (x % N + N) % N;for (int i = h[k]; i != -1; i = ne[i])if (e[i] == x)return true;return false;
}int main()
{int n;scanf("%d", &n);memset(h, -1, sizeof h);//将槽清空,空指针一般用-1来表示while (n -- ){char op[2];int x;scanf("%s%d", op, &x);if (*op == 'I') insert(x);else{if (find(x)) puts("Yes");else puts("No");}}return 0;
}

代码解析:

const int N = 100003;//这里可以自己写一个求大于100000第一个质数的代码求出即可int h[N];//这是上面说的开一个槽
int e[N], ne[N], idx;//与槽链接的拉链,用链表存储,//e[N]用来存值,ne[N]下一个的位置,idx表示当前移动到哪一个位置

在这里插入图片描述

这里存一个字符用的是字符数组,读入字符串,而不是直接的一个字符进行存储,因为将其以一个字符串进行读入,这样scanf可以自动忽略掉空格和回车,这样可以降低出错概率。

void insert(int x)
{int k = (x % N + N) % N;//k是哈希值e[idx] = x;ne[idx] = h[k];h[k] = idx ++ ;//插入操作,类似于头插
}

这个是插入操作,类似于链表的头插。
下面做一个动图,便于你的理解:
在这里插入图片描述

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.这些年来一直在提醒自己一件事,千万不要感动自己,大部分人看似努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几个小时,多久没放假了。如果这些东西也值得炫耀,那么富士康流水线上任何一个人都比你努力多了。
人难免天生有自怜情绪,唯有时刻保持清醒,才看得清真正的价值在哪里。

2.这一生中有许多的人朝我走来,然后又匆匆忙忙的消失在人山人海中,那些人与我短暂交错,尾声潮落。从开始的不舍到最后的习以为常,便明白这是人生常态。真心待人,开始不再执着任何一段关系,即使是阶段性的陪伴,在相处的过程中我们开心就好,就活在当下。

海阔凭鱼跃,天高任鸟飞,路要朝前走,人要往前看。山林不向四季起誓,枯荣随缘,海洋不需对沙岸许诺,遇合尽兴。

3.见了太多糟糕的事情,反倒觉得一切都会好起来。心情不好就听歌,饿了就找吃的,怕黑就开灯,喜欢的东西就赚钱买。
有人紧握你的手就可能会松开,有人给你承诺也会有失言的时候,长大后才发现真正想要的东西总归要自己争取,只有自己才不会辜负自己。
顺其自然真的是我对当下的生活态度了,人就应该活在当下,把今天过得很积极明天一定不会太差。别想太多,好好生活,也许日子过着过着就有答案了。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

相关文章:

【基础算法】哈希表(拉链法)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

硬件学习 软件Cadence day07 PCB 底板电路图布线

1.根据原理图的元器件&#xff0c; 选择在 PCB 芯片制作的元器件 &#xff08;allegro中原理图和pcb中元件的交互&#xff09; 1.首先完成下列操作 可以尝试先关闭再打开&#xff0c; 等下操作的时候就好 发现新增的发光物体&#xff01;&#xff01; 2.完成操作 &#xff0c;…...

SkyWalking仪表盘使用

Skywalking仪表盘使用 1 仪表盘 作用&#xff1a;查看被监控服务的运行状态。 1)监控面板 1.1 APM APM&#xff1a;应用性能管理&#xff0c;通过各种探针采集数据&#xff0c;收集关键指标&#xff0c;同时搭配数据呈现以实现对应用程序性能管理和故障管理的系统化解决方案…...

面渣逆袭:分布式十二问,万字图文详解

大家好&#xff0c;我是老三&#xff0c;不管今年金三银四如何&#xff0c;面渣逆袭系列继续&#xff0c;这期我们来看看分布式。 分布式理论 1. 说说CAP原则&#xff1f; CAP原则又称CAP定理&#xff0c;指的是在一个分布式系统中&#xff0c;Consistency&#xff08;一致性…...

设计模式C++实现23:中介者模式(Mediator)

部分内容参考大话设计模式第25章&#xff1b;本实验通过C语言实现。 一 原理 意图&#xff1a;用一个中介对象来封装一系列对象的交互&#xff0c;中介者使得各个对象不需要显示地相互引用&#xff0c;从而使耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 上下文…...

Java方法【未完待续】

目录 前言 一、什么是方法&#xff1f; 二、方法的定义和调用 方法的定义 方法的调用 三、方法的重载 重载规则 实现理论 总结 前言 随着对Java这一编程语言的深入学习&#xff0c;大家可能会遇到一个熟悉又陌生的词——方法&#xff0c;其实Java方法就是我们学习C/C时…...

(考研湖科大教书匠计算机网络)第六章应用层-第一、二节:应用层概述和C/S及P2P

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;应用层概述二&#xff1a;客户/服务器&#xff08;C/S&#xff09;和对等&#xff08;P2P&#xff09;方式&#xff08;1&#xff09;客户/服务器&…...

禅道bug提醒脚本部署

环境准备 nginxpython3 服务器目录 以下目录为自定义配置&#xff0c;需在 nginx 默认配置文件的http{}内添加 include /www/conf/*.conf; 才会生效 /www ├── conf "存放配置文件 │ └── lowCode.zyl.conf "低代码bug统计页配置 ├── wwwlogs "存…...

利用spring的retry重试编写Feign远程调用重试

自定义注解FeignRetry为了解决上面提到的问题&#xff0c;让Feign调用的每个接口单独配置不同的重试机制。我们使用了面向切面编程并编写了一个自定义注解&#xff1a;FeignRetry。此注释的工作方式类似于Retryable的包装器&#xff0c;并与其共享相同的规范以避免混淆。Target…...

Docker启动RabbitMQ,实现生产者与消费者

目录 一、Docker拉取镜像并启动RabbitMQ 二、Hello World &#xff08;一&#xff09;依赖导入 &#xff08;二&#xff09;消息生产者 &#xff08;三&#xff09;消息消费者 三、实现轮训分发消息 &#xff08;一&#xff09;抽取工具类 &#xff08;二&#xff09;启…...

【C语言】函数栈帧的创建与销毁

Yan-英杰的主页 悟已往之不谏 知来者之可追 目录 ​0.ebp和esp是如何来维护栈帧的呢&#xff1f; 1.为什么局部变量的值不初始化是随机的&#xff1f; ​2.局部变量是怎么创建的&#xff1f; ​3 .函数是如何传参的&#xff1f;传参的顺序是怎样的 4.函数是如何调用的 ​…...

【Git】使用Git上传项目到远程仓库Gitee码云步骤详解

电脑里存放了很多项目&#xff0c;有的备份&#xff0c;有的没备份&#xff0c;如果不仔细分类管理的话&#xff0c;时间一长&#xff0c;到时看到那就会觉得非常杂乱&#xff0c;很难整理&#xff0c;这里有一个叫源代码托管&#xff0c;用过它的都知道&#xff0c;方便管理和…...

Head First设计模式---3.装饰者模式

3.1装饰者模式 亦称&#xff1a; 装饰者模式、装饰器模式、Wrapper、Decorator 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 举个例子&#xff1a;天气很冷&#xff0c;我们一件一件穿衣服&#xff0c…...

Python 算法交易实验48 表字段设计

说明 虽然说的是表&#xff0c;实际上用的是Mongo集合 基于ADBS(APIFunc DataBase Service)可以构造一个供后续研究、生产长时间使用的数据基础&#xff0c;这个基础包括了&#xff1a; 1 队列服务。通过队列&#xff0c;数据可以通过API实现零担和批量两种模式的快速存储。2 …...

库存管理系统-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-1】 库存管理系统 【案例介绍】 1.任务描述 像商城和超市这样的地方&#xff0c;都需要有自己的库房&#xff0c;并且库房商品的库存变化有专人记录&#xff0c;这样才能保证商城和超市正常运转。 本例要求编写一个程序&#xff0c;模拟库存管理系统。该系统主要包…...

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒&#xff08;解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题&#xff09; 【STM32笔记】低功耗模式配置及避坑汇总 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216…...

Python类变量和实例变量(类属性和实例属性)

无论是类属性还是类方法&#xff0c;都无法像普通变量或者函数那样&#xff0c;在类的外部直接使用它们。我们可以将类看做一个独立的空间&#xff0c;则类属性其实就是在类体中定义的变量&#xff0c;类方法是在类体中定义的函数。 在类体中&#xff0c;根据变量定义的位置不…...

Glide加载图片

使用Glide加载图片&#xff0c;默认情况下在内存中缓存该图片。这样的情况下如果我们保存头像在某个路径&#xff0c;当再次更换头像时可能由于缓存问题&#xff0c;UI上更新的不及时。 默认加载图片方式&#xff1a; Glide.with(context).load(coverPath).error(R.drawable.a…...

有关时间复杂度和空间复杂度的练习

目录 一、消失的数字 二、轮转数组 三、 单选题 一、消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O(n) 时间内完成吗&#xff1f; 注意&#xff1a;本题相对书上原题稍作改动 示例 1&#xff1a; 输入…...

linux服务器nfs数据挂载

参考&#xff1a;https://blog.csdn.net/qq_43721935/article/details/119889841?from_wecom1 1、NFS 介绍 NFS 即网络文件系统&#xff08;Network File-System&#xff09;&#xff0c;可以通过网络让不同机器、不同系统之间可以实现文件共享。通过 NFS&#xff0c;可以访问…...

多模态数据挖掘前沿:生物医学与情感分析领域论文深度解析

多模态数据挖掘前沿&#xff1a;生物医学与情感分析领域论文深度解析 在人工智能与大数据技术飞速发展的当下&#xff0c;多模态数据因能更全面、立体地刻画研究对象&#xff0c;已成为科研领域的核心研究方向。本文将深度解析两篇聚焦多模态数据挖掘的重磅论文——《多模态生物…...

【ArkTS】编程规范

ArkTS 是 HarmonyOS 应用的默认开发语言,在 TypeScript(简称 TS)生态基础上做了扩展,保持 TS 的基本风格。通过规范定义,从而强化了开发期的静态检查和分析,提升了程序执行的稳定性和性能。 一、术语与定义 术语 缩略语 中文解释 ArkTS 无 ArkTS编程语言 TypeScript TS …...

Python中的生成器和迭代器:原理与实践

Python中的生成器和迭代器&#xff1a;原理与实践 一、背景与动机 在Python编程中&#xff0c;处理大量数据时&#xff0c;内存管理是一个常见的挑战。生成器&#xff08;Generators&#xff09;和迭代器&#xff08;Iterators&#xff09;为解决这一问题提供了一种高效的方式&…...

MultiHighlight插件完全指南:5步提升代码阅读效率300%

MultiHighlight插件完全指南&#xff1a;5步提升代码阅读效率300% 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors &#x1f3a8;&#x1f4a1; 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight 在当今快…...

制造业数据库选型实战:为什么我们从 MySQL 迁移到 TiDB

写在前面 作为一个制造业数字化团队的开发负责人&#xff0c;我最怕听到的一句话就是&#xff1a;“数据库又慢了”。 MOM 平台上线 4 年&#xff0c;数据量从最初的几百 G 涨到几个 T。每次月底报表、跨工厂查询&#xff0c;系统就开始”喘气”。加索引、拆表、优化 SQL………...

中国AI模型调用量领跑全球:成本与开源优势塑造竞争新范式

当前&#xff0c;全球人工智能&#xff08;AI&#xff09;领域的竞争正经历着深刻变革。据全球最大AI模型API聚合平台OpenRouter的最新监测数据&#xff0c;中国AI大模型的周调用量已连续数周实现对美国的稳定且显著的超越&#xff0c;并在特定时期内包揽了全球调用量排行榜的前…...

python-flask-djangol框架的校园餐厅菜品自选系统

目录 技术选型核心功能模块数据库设计开发流程部署方案关键代码示例测试重点 项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 技术选型 使用Python的Flask或Django框架作为后端基础。Flask适合轻量级快速开发&#xff0c;Djan…...

企业级 Agent SKILL 最佳实践

最近&#xff0c;真的是屁颠屁颠地使用Openclaw作为业务核心为客户打造智能体的工作流程&#xff0c;包括组织、业务、技术三个全面的转型。同时&#xff0c;由于OpenAI的Sora下线&#xff0c;年初刚刚建立的AI漫剧工作流&#xff0c;资产库以及提示词都需要转换成替代品。还有…...

GitHub Desktop中文汉化终极指南:三分钟解锁全中文Git操作体验

GitHub Desktop中文汉化终极指南&#xff1a;三分钟解锁全中文Git操作体验 【免费下载链接】GitHubDesktop2Chinese GithubDesktop语言本地化(汉化)工具 项目地址: https://gitcode.com/gh_mirrors/gi/GitHubDesktop2Chinese 还在为GitHub Desktop的英文界面而烦恼吗&am…...

GIS开发必备:5分钟搞定EPSG3857转WGS84坐标转换(附proj4.js完整代码)

GIS开发实战&#xff1a;从原理到代码实现EPSG3857与WGS84的高效坐标转换 刚接触WebGIS开发的工程师们&#xff0c;常常会被各种坐标系搞得晕头转向。为什么高德地图上显示的位置和GPS设备采集的数据对不上&#xff1f;为什么Leaflet、OpenLayers这些库加载的瓦片地图坐标数值大…...