模拟散列表(哈希表拉链法)

维护一个集合,支持如下几种操作:

  1. I x,插入一个整数 x;
  2. Q x,询问整数 x 是否在集合中出现过;

现在要进行 N 次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数 N,表示操作数量。

接下来 N 行,每行包含一个操作指令,操作指令为 I xQ x 中的一种。

输出格式

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

每个结果占一行。

数据范围

1≤N≤10^5
−10^9≤x≤10^9

输入样例:
5
I 1
I 2
I 3
Q 2
Q 5
输出样例:
Yes
No

思路:要把范围这么大的X存到集合中,直接放进数组不合适,所以就要把大范围映射到小范围------>哈希表

哈希表

本题使用拉链法,也就是哈希表一个位置上有一条链表,用来存取模后映射到小范围上相等的数字(避免冲突),实现两个功能,插入和查找

其中取模要用到这个公式 ,保证结果是正数(哈希表范围从0到N)

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

拉链法需要注明的点:

哈希表上每个点对应一条链表,用来存取模后映射到小范围上相等的数字(避免冲突),h[]表示哈希表,h[k]表示哈希表中第k个位置上的值,h[k]存的是它这个位置上对应的链表的头结点下标

看图比较好理解:

插入部分:
void insert(int x)
{//h[k]是链表k的第一个元素在e数组中的索引int k=(x%N+N)%N;   //把它映射为0-N的一个正数e[idx]=x;  //赋值ne[idx]=h[k]; //当前节点的下一个位置是原来的头结点(下标)h[k]=idx; //现在头节点是当前节点(这里是下标)idx++; //自增,之后会继续操作
}

 查找部分:
bool find(int x)
{int k=(x%N+N)%N; for(int i=h[k];i!=-1;i=ne[i])  //从头结点开始,到-1(没有节点了),i向后遍历{if(e[i]==x)  //如果在这个哈希表上的某条链表里找到了值return true;}return false;
}

 

puts()函数用来向标准输出设备屏幕输出字符串并换行

示例代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int  N=1e5+10;int h[N],e[N],ne[N],idx; //h[N]是表,e和ne表示拉链这个链表中的值和下一个点下标/*h[]是一个整数数组,用于表示哈希表。
h[k]表示哈希表中第k个槽位的值。
当h[k]的值为-1时,表示第k个槽位为空,即对应的链表为空。
当h[k]的值不为-1时,表示第k个槽位存储了链表的头结点下标。它指向链表中第一个元素的位置。
*/void insert(int x)
{//h[k]是链表k的第一个元素在e数组中的索引int k=(x%N+N)%N;   //把它映射为0-N的一个正数e[idx]=x;  //赋值ne[idx]=h[k]; //当前节点的下一个位置是原来的头结点(下标)h[k]=idx; //现在头节点是当前节点(这里是下标)idx++; //自增,之后会继续操作
}
bool find(int x)
{int k=(x%N+N)%N; for(int i=h[k];i!=-1;i=ne[i])  //从头结点开始,到-1(没有节点了),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;
}

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

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

相关文章

SpringBoot3+Vue3+Mysql+Element Plus完成数据库存储blob类型图片,前端渲染后端传来的base64类型图片

前言 如果你的前后端分离项目采用SpringBoot3Vue3Element Plus&#xff0c;且在没有OSS&#xff08;对象存储&#xff09;的情况下&#xff0c;使用mysql读写图片&#xff08;可能不限于图片&#xff0c;待测试&#xff09;。 耗时三天&#xff0c;在踩了无数雷后&#xff0c…

Python基础入门----使用Pipenv工具时产生的Pipfile和Pipfile.lock文件有什么区别以及有什么作用

文章目录 PipfilePipfile.lock实操示例当我们使用 Pipenv 工具进行 Python 项目的依赖管理时,会遇到两个重要的文件:Pipfile 和 Pipfile.lock。这两个文件在项目中扮演着不同但又相互补充的角色。接下来,我将详细介绍这两个文件的区别和作用,并提供一些具体的使用示例。 P…

并查集详解(附例题和模板)

一、并查集 &#xff08;1&#xff09;处理问题的类型 1.将两个集合合并 2.询问两个元素是否在一个集合当中 询问 1.fa[x]a; 2.if(fa[x]fa[y]) o(1) 在o(1)的复杂度内进行两个操作 &#xff08;2&#xff09;基本原理 基本原理&#xff1a;每个集合用一棵树来表示&#…

Redis 5大数据类型命令解读

目录 Redis key的命令 1、redis字符串&#xff08;String&#xff09; 2、redis列表(List) 3、redis哈希表(Hash) 4、redis集合(Set) 5、redis有序集合(ZSet) Redis 命令网站&#xff1a;redis中文文档 Redis key的命令 命令说明示例keys *查看当前库所有的keykeys *…

uniapp——项目day04

购物车页面——商品列表区域 渲染购物车商品列表的标题区域 1. 定义如下的 UI 结构&#xff1a; 2.美化样式 渲染商品列表区域的基本结构 1. 通过 mapState 辅助函数&#xff0c;将 Store 中的 cart 数组映射到当前页面中使用&#xff1a; import badgeMix from /mixins/tab…

Linux shell编程学习笔记25:tty

1 tty的由来 在 1830 年代和 1840 年代&#xff0c;开发了称为电传打字机&#xff08;teletypewriters&#xff09;的机器&#xff0c;这些机器可以将发件人在键盘上输入的消息“沿着线路”发送在接收端并打印在纸上。 电传打字机的名称由teletypewriters&#xff0c; 缩短为…

R语言——taxize(第一部分)

ropensci 系列之 taxize &#xff08;中译手册&#xff09; taxize 包1. taxize支持的网络数据源简介目前支持的API&#xff1a;针对Catalogue of Life&#xff08;COL&#xff09; 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…

【Qt之QWizard】使用1

QWizard使用 描述方法枚举&#xff1a;enum QWizard::WizardButton枚举&#xff1a;enum QWizard::WizardOption枚举&#xff1a;enum QWizard::WizardStyle枚举&#xff1a;enum QWizard::WizardPixmap常用成员方法槽函数信号 示例设置标题添加page页设置按钮文本设置自定义按…

基于SpringBoot+Vue的宿舍管理系统

基于SpringBootVue的学生宿舍管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宿舍公告 登录界面 管理员界面 维修人员 商家界面 学生界面 摘要 摘…

No202.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

Python爬虫——入门爬取网页数据

目录 前言 一、Python爬虫入门 二、使用代理IP 三、反爬虫技术 1. 间隔时间 2. 随机UA 3. 使用Cookies 四、总结 前言 本文介绍Python爬虫入门教程&#xff0c;主要讲解如何使用Python爬取网页数据&#xff0c;包括基本的网页数据抓取、使用代理IP和反爬虫技术。 一、…

Python---集合中的交集 、并集 | 与差集 - 特性

用 & 来求两个集合的交集&#xff1a;-----键盘上的7上的符号&#xff0c;shift 7 同时按 用 | 来求两个集合的并集&#xff1a; -----键盘上的7上的符号&#xff0c;shift 同时按&#xff08;就是enter键上面那个|\ &#xff09; 用 - 来求两个集合的差集&#xff…