哈希表(c++)

1、介绍

哈希表,也称为散列表,是一种非常高效的数据结构。它通过将键(Key)映射到数组的特定位置来快速查找、插入和删除数据。这个映射过程由哈希函数(Hash Function)完成,该函数将键转化为一个整数,该整数用作数组的下标。


2、实现

哈希表将一个很大的集合映射成0~N
例如: 将x属于(-10^9 ~ 10^9)映射到0~10^5里
两部操作首先: x mod 10^5;其次 : 解决冲突{两种办法:{拉链发 和 开放寻址法}}

上述需要注意在做模运算的时候,最好取比10^5第一个大的质数模,这样会减少冲突冲突指的是会映射到一个地方去


2.1、拉链法
图解:

注意:算法题里,一般只会考添加和查找,几乎很少考删除操作,就算考删除,也不会真的删除,只是跳过这个点

添加操作和查找操作类似于单链表


如图:


2.2、开放寻址法

此方法只需要一个一维数组就可以实现

  • 规则:
  • 空间开到2~3倍的N:目的是可以减少冲突

  • 这里同样要找到开的N的第一个质数


3、例题:840. 模拟散列表 - AcWing题库


拉链法:
#include<iostream>
#include<cstring>using namespace std;
//找到100000的第一个质数去mod会减少冲突
const int N = 100003;
//h[]表示映射数组,e[],ne[]是单链表e存数,ne指向下一个节点,idx分配空间
int h[N],e[N],ne[N],idx;
//拉链法的存入操作
void insert(int x)
{//先让x%N是为了避免负数很大的情况,不能先加N再mod。int k = (x % N + N) % N; e[idx] = x;//存入xne[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);//方便单链表查找操作while (n -- ){char op[2];int x;scanf("%s%d", op,&x);if(op[0] == 'I'){insert(x);}else{if(find(x)) printf("Yes\n");else printf("No\n");}}return 0;
}

开放寻址法:
#include<iostream>
#include<cstring>using namespace std;const int N = 200003,null = 0x3f3f3f3f;
int h[N];
//开放寻址法
int find(int x)
{int k = (x%N+N)%N;//寻找映射值//去寻找k的位置,如果k下有这个数返回的就是这个数的位置//如果k下没这个数,返回的是这个数应该存的位置while(h[k] != null && h[k] != x){k++;if(k==N) k = 0;}return k;
}int main()
{int n;scanf("%d", &n);//解释一下这里为啥是0x3f是因为memset是按字节去存储的,一个int是4个字节//每个字节是0x3f所以4个字节就是3f3f3f3fmemset(h,0x3f,sizeof h);while (n -- ){char op[2];int x;scanf("%s %d", op, &x);int k = find(x);//与拉链法区别是,寻址法都需要寻找k,直接合并成一个就可以if(op[0] == 'I'){h[k] = x;}else{if(h[k] == x) printf("Yes\n");else printf("No\n");}}return 0;
}

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

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

相关文章

【JS】深度学习JavaScript

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【JS】深度学习JavaScript &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:JavaScript1.1 JavaScript是什么1.2 JS的引入方式1.3 JS变量1.4 数据类型1.5 …

三款优秀的伪原创改写软件,为你高效创作

近年来&#xff0c;随着互联网内容的爆炸式增长&#xff0c;原创内容的重要性日益凸显。然而&#xff0c;对于许多写手和创作者来说&#xff0c;时间和灵感可能成为限制因素。为了解决这个问题&#xff0c;伪原创改写软件应运而生。这些软件利用先进的算法和自然语言处理技术&a…

基于Java中的SSM框架实现多平台大学生创新团队管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现多平台学生创新团队管理系统演示 摘要 大学生作为社会向前发展的源动力&#xff0c;必须与知识经济时代发展要求相适应&#xff0c;具有较强的创新能力。而未来社会迫切需要的是具有创新创业能力的人才。高素质人才应具有独立生存的自信心、不断创新的…

PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教程

当前&#xff0c;城市生活的节奏日益加快&#xff0c;人们对各类便民信息的需求也愈发迫切。无论是寻找家政服务、二手交易&#xff0c;还是发布租房、求职信息&#xff0c;一个高效、便捷的信息平台显得尤为重要。传统的信息发布方式往往存在信息更新不及时、查找困难等问题&a…

Cesium安装部署运行

目录 1.简介 2.Cesium项目下载 3.Cesium项目运行 4.cesium运行 1.简介 Cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎。Cesium支持3D,2D,2.5D形式的地图展示&#xff0c;可以自行绘制图形&#xff0c;高亮区域&#xff0c;并提供良好的触摸支持&#xff0c;且支…

GAMMA数据处理问题(七)

phase_sim_orb报这个错是什么原因呢&#xff0c;说是我的hgt文件和模拟的干涉图行数不匹配&#xff0c;之前geocode生成hgt的参数不是在mli.par文件中看吗&#xff0c;为什么会出现行数不匹配的情况啊&#xff0c;难道不是par文件中里面看&#xff1f;&#xff1f;&#xff1f;…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中&#xff0c;敬请期待… 武汉唯众智创科技有限公司 2024 年 3 月 联系人&#xff1a;辜渝傧13037102709 题号&#xff1a;试题05 ZZ052-大数据应用与服务赛项试题 05 模块一:平台搭建与运维 (一…

幻兽帕鲁Linux服务器安装Mod

系列文章目录 幻兽帕鲁游戏搭建&#xff08;docker&#xff09; 幻兽帕鲁服务器安装Mod&#xff08;Linux&#xff09; 文章目录 系列文章目录前言一、Mod类别1.模型mod2.功能性mod 二、ue4ss三、Mod选择1. N网2. 3DM MOD 四、服务器安装1.关闭服务2.上传mod3.启动服务 总结 前…

深度分析鸿蒙应用开发的准确红利期、前景、未来发展方向

近年来&#xff0c;随着互联网技术的不断发展&#xff0c;鸿蒙生态开发逐渐成为热门话题。作为一种新兴的操作系统&#xff0c;其发展趋势备受关注。同时&#xff0c;鸿蒙生态开发的价值、就业岗位需求以及相关学习方面也引起了广泛关注。 那么就目前的形势来看&#xff0c;鸿…

Docker专题-03 Log-Driver日志转存

Docker专题教程 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com 转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-03-19 csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 说明 容器…

软考 系统架构设计师系列知识点之系统性能(1)

所属章节&#xff1a; 第2章. 计算机系统基础知识 第9节. 系统性能 系统性能是一个系统提供给用户的所有性能指标的集合。它既包括硬件性能&#xff08;如处理器主频、存储器容量、通信带宽等&#xff09;和软件性能&#xff08;如上下文切换、延迟、执行时间等&#xff09;&a…

【深度学习】四种天气分类 模版函数 从0到1手敲版本

引入该引入的库 import torch import torch.nn as nn import matplotlib.pyplot as plt import torch.nn.functional as F import torchvision import torch.optim as optim %matplotlib inline import os import shutil import glob os.environ["KMP_DUPLICATE_LIB_OK&q…

iOS应用审核问题解决方案及优化方法 ✨

摘要 本文将针对iOS应用提交审核时可能遇到的问题&#xff0c;如“你必须在Xcode中添加com.apple.developer.game-center密钥”&#xff0c;以及突然间提交送审报错情况进行探讨。通过大量查询资料和尝试&#xff0c;结合案例分析&#xff0c;提供了解决方案和优化方法&#x…

【模糊逻辑】Type-1 Fuzzy Systems-2

【模糊逻辑】Type-1 Fuzzy Systems 3.4.3 模糊化及其推理的影响3.4.3.1 Singleton Fuzzifier例3.5例3.6 3.4.3.2 Non-Singleton Fuzzifier例3.7 Non-Singleton Fuzzifier 量化求解 Firing Level 3.5 对规则触发&#xff08;Fired-Rule&#xff09;的输出集进行组合3.5.1Mamdani…

【linux】CentOS查看系统信息

一、查看版本号 在CentOS中&#xff0c;可以通过多种方法来查看版本号。以下是几种常用的方法&#xff1a; 使用cat命令查看/etc/centos-release文件&#xff1a; CentOS的版本信息存储在/etc/centos-release文件中。可以使用cat命令来显示该文件的内容&#xff0c;从而获得C…

力扣hot100:153. 寻找旋转排序数组中的最小值(二分的理解)

由力扣hot100&#xff1a;33. 搜索旋转排序数组&#xff08;二分的理解&#xff09;-CSDN博客&#xff0c;我们知道二分实际上就是找到一个策略将区间“均分”。对于旋转数组问题&#xff0c;在任何位置分开两个区间&#xff0c;如果原区间不是顺序的&#xff0c;分开后必然有一…

BRAM底层原理详细解释(1)

目录 一、原语 二、端口简述 2.1 端口简介 2.2 SDP端口映射 三、端口信号含义补充说明 3.1 字节写使能&#xff08;Byte-Write Enable&#xff09;- WEA and WEBWE&#xff1a; 3.2 地址总线—ADDRARDADDR and ADDRBWRADDR 3.3 数据总线—DIADI, DIPADIP, DIBDI, and D…

【c++初阶】C++入门(下)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

AI元年,这5款AI写作能为你提供帮助

自从人工智能技术的迅猛发展以来&#xff0c;AI在各个领域都取得了巨大的进步。其中&#xff0c;AI写作工具成为越来越多人关注的焦点。在这个AI元年&#xff0c;小编想向大家分享5款可能对你有帮助的AI写作工具&#xff0c;如果你也想找AI写作相关的工具&#xff0c;那么来看看…

【数据结构基础】之八大排序(C语言实现)

【数据结构基础】之八大排序(C语言实现&#xff09; &#x1f427; 冒泡排序♈️ 冒泡排序原理及代码实现♈️ 稳定性分析 &#x1f427; 选择排序♈️ 选择排序原理及代码实现♈️ 稳定性分析 &#x1f427; 插入排序♈️ 插入排序的原理及代码实现♈️ 稳定性分析 &#x1f4…