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

C++ 模拟散列表 || 哈希表存储与查询,模版题(拉链法)

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

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

#include <iostream>
#include <cstring>using namespace std;const int N = 100003;int n;
int h[N], e[N], ne[N], idx; 
//h是哈希表(头结点数组)、e是元素数组、ne是链表中下一个元素的索引
/*h 数组是哈希表的数组,每个元素表示一个桶。
h[k] 存储的是第 k 个桶的头结点,即链表中第一个元素的索引。(存的拉链的头结点的下标)
e 数组存储具体的元素值,每个元素值对应一个索引。
ne 数组存储链表中每个元素的下一个元素的索引。
idx 是当前要插入的元素的索引。*/void insert(int x)
{// 计算哈希值,使用取模运算防止越界int k = (x % N + N) % N; // x % N x是负数的话保证这个哈希函数映射一定是正数// 插入到哈希表中,使用链地址法处理哈希冲突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()
{scanf("%d", &n);memset(h, -1, sizeof h);// 初始化哈希表的头结点为 -1,表示空链表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;
}
http://www.lryc.cn/news/279646.html

相关文章:

  • 详解Skywalking 服务Overview页面的参数含义(适合小白)
  • Android studio GridView应用设计
  • K8s 是如何完成调度和权重调整?
  • 计算机毕业设计----Springboot超市订单管理系统
  • 如何给AI下达精准的指令,哪些提示词对于AI是有效的?
  • 软件外包资源网站分享
  • 在控制理论里,单个输入变量被施加了饱和特性处理,那么后续怎么利用李雅普诺夫判据判断系统稳定性呢?
  • MySQL夯实之路-查询性能优化深入浅出
  • UniApp面试题
  • 30 树的定义
  • 程序员必备的面试技巧
  • 【NI-DAQmx入门】LabVIEW中DAQmx同步
  • FlinkRestAPI
  • Qt获取当前系统网络接口信息
  • 【C++】STL 算法 ④ ( 函数对象与谓词 | 一元函数对象 | “ 谓词 “ 概念 | 一元谓词 | find_if 查找算法 | 一元谓词示例 )
  • C++ 并发编程 | 并发世界
  • GitHub注册新账号的操作流程(详细)
  • Kali安装Xrdp结合内网穿透实现无公网ip远程访问系统桌面
  • 【WEB API自动化测试】接口文档与在线测试
  • 【深度学习每日小知识】Training Data 训练数据
  • [acm算法学习] 后缀数组SA
  • DNS解析和它的三个实验
  • [redis] redis的安装,配置与简单操作
  • C++ STL set容器
  • 专业课148,总分410+电子科技大学858信号与系统考研经验电子信息与通信
  • 密码学:一文读懂非对称加密算法 DH、RSA
  • ZooKeeper 实战(二) 命令行操作篇
  • 关于在前台应用路由调用子应用
  • Spring学习 Spring事务控制
  • c++一些使用频率较高的库函数