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

news2024/11/24 17:18:54

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

  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.coloradmin.cn/o/1208815.html

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

相关文章

【论文阅读】(VAE-GAN)Autoencoding beyond pixels using a learned similarity metric

论文地址;[1512.09300] Autoencoding beyond pixels using a learned similarity metric (arxiv.org) / 一、Introduction 主要讲了深度学习中生成模型存在的问题&#xff0c;即常用的相似度度量方式&#xff08;使用元素误差度量&#xff09;对于学习良好的生成模型存在一定…

【C++】类与对象 I

类与对象 I &#xff1a; 前言&#xff1a;&#xff08;C&#xff09;面向过程 和&#xff08;C&#xff09;面向对象 初步认识前言&#xff1a;类的引入一、类的介绍二、类的定义&#xff08;一&#xff09;class 语法&#xff08;二&#xff09;类的两种定义方式&#xff1a;…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第七章 muduo编程示例(下)

7.5 一种自动反射消息类型的Protobuf网络传输方案 本节假定读者了解Google Protocol Buffers是什么&#xff0c;这不是一篇Protobuf入门教程。本节的示例代码位于examples/protobuf/codec。 本节要解决的问题是&#xff1a;通信双方在编译时就共享proto文件&#xff08;用于定…

解密N数之和问题的秘密

目录 两数之和三数之和 两数之和 我们来看力扣第一题 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

jetson配置笔记

typora-root-url: /home/msj/ubuntu笔记本台式机环境配置说明/images Ubuntu18.04 配置 说明&#xff1a;我们所有文档配置都是按照ubuntu18.04&#xff0c;保证x86架构(笔记本台式机)和 ARM架构(jetson Nano只能安装18.04)的一致性 1. 更换各类源 我们所有源都更换清华源&a…

一文说清楚Openai的这波更新内容,大地震 一大波套壳公司倒闭

前几天Openai召开了首届的开发者大会&#xff0c;45分钟的会议&#xff0c;让千万用户感到兴奋&#xff0c;但是让万千的套壳的创业公司&#xff0c;却感觉如坐针毡。这次发布会发布了哪些功能&#xff1f;为什么会导致这种情况的发生&#xff1f;让我们接着往下讲 API升级且降…

振南技术干货集:深入浅出的Bootloader(5)

注解目录 1、烧录方式的更新迭代 1.1 古老的烧录方式 (怀旧一下&#xff0c;单片机高压烧录器。) 1.2 ISP 与ICP 烧录方式 (还记得当年我们玩过的 AT89S51?) 1.3 更方便的 ISP 烧录方式 1.3.1串口 ISP &#xff08;是 STC 单片机成就了我们&#xff0c;还是我们成就了…

以阿里云全球故障为例,聊聊如何保障 Auth 服务的 SLA

在刚刚过去的“双十一”购物狂欢季&#xff0c;阿里云经历了一次大规模故障&#xff0c;导致阿里系产品集体中断服务。据报道&#xff0c;11 月 12 日&#xff0c;淘宝、钉钉、闲鱼、阿里云盘等阿里系产品出现无法使用的问题&#xff0c; “阿里全系产品崩了” 的话题迅速引发众…

龙迅LT9211D MIPI(DSI/CSI)转LVDS和集创北方ICN6202 MIPIDSI转LVDS比对

龙迅LT9211D描述&#xff1a; Lontium LT9211D是一款高性能的MIPI DSI/CSI- 2到双端口LVDS转换器。LT9211D反序列化输入的MIPI视频数据&#xff0c;解码数据包&#xff0c;并将格式化的视频数据流转换为AP和移动显示面板或摄像机之间的LVDS发射机输出。LT9211D支持最大14 dB输…

【luckfox】0、开发环境搭建

前言 本章简单介绍如何搭建luckfox的开发环境。 一、抓取luckfox源码 需要提前准备好ubuntu环境。 git clone https://github.com/LuckfoxTECH/luckfox-pico.git二、编译 youkaiubuntu:/home/luckfox/luckfox-pico$ ./build.sh lunchyoukaiubuntu:/home/luckfox/luckfox-p…

二十、泛型(7)

本章概要 动态类型安全泛型异常混型 C 中的混型与接口混合使用装饰器模式与动态代理混合 动态类型安全 因为可以向 Java 5 之前的代码传递泛型集合&#xff0c;所以旧式代码仍旧有可能会破坏你的集合。Java 5 的 java.util.Collections 中有一组便利工具&#xff0c;可以解…

ubuntu中使用 vscode 连接docker开发环境

文章目录 ubuntu中使用 vscode 连接docker开发环境步骤一&#xff1a;安装 Remote Development 插件步骤二&#xff1a;连接远程环境步骤三&#xff1a;开发 问题解决参考连接 ubuntu中使用 vscode 连接docker开发环境 Remote Development 是一个 Visual Studio Code 插件&…

【python 生成器 面试必备】yield关键字,协程必知必会系列文章--自己控制程序调度,体验做上帝的感觉 1

python生成器系列文章目录 第一章 yield — Python (Part I) 文章目录 python生成器系列文章目录前言1. Generator Function 生成器函数2.并发和并行&#xff0c;抢占式和协作式2.Let’s implement Producer/Consumer pattern using subroutine: 生成器的状态 generator’s st…

【EI会议征稿】第四届环境资源与能源工程国际学术会议(ICEREE 2024)

第四届环境资源与能源工程国际学术会议&#xff08;ICEREE 2024&#xff09; 2024 4th International Conference on Environment Resources and Energy Engineering ICEREE&#xff08;2020-2023&#xff09;大会先后在珠海&#xff0c;昆明&#xff0c;长沙成功召开。会议主…

自定义Matplotlib中的颜色映射(cmap)

要自定义Matplotlib中的颜色映射&#xff08;cmap&#xff09;&#xff0c;您可以按照以下步骤进行操作&#xff1a; 导入所需的库&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap创建自定义颜色映…

ViewPager2和TabLayout协同使用,实现多Fragment页面切换类似于QQ音乐,bilibili效果

一、ViewPager2的基本用法 使用前先添加依赖&#xff1a; implementation androidx.appcompat:appcompat:1.4.0 // AndroidX AppCompatimplementation com.google.android.material:material:1.4.0 // Material Design Components1、制作Fragment 首先制作一个Fragment的xml布…

欧拉回路和欧拉路径

目录 欧拉回路基础 欧拉回路的定义 欧拉回路的性质 判断图中是否存在欧拉回路的java代码实现 寻找欧拉回路的三个算法 Hierholzer算法 详细思路 代码实现 欧拉路径 欧拉路径的定义 欧拉路径的性质 欧拉回路基础 欧拉回路的定义 欧拉回路遍历了所有的边&#xff0c;…

spring cloud 简介

springcloud 定义 1.定义&#xff1a;springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具&#xff08;例如配置管理、服务发现、断路器、路由、控制总线等&#xff09;2.微服务:基于单体应用&#xff0c;基于业务进行拆分&#xff0c;每个服务都是独立应用…

栈的实现---超详细

栈的实现 文章目录 栈的实现一、栈的模型二、栈的代码实现以及测试用例①栈的初始化②入栈③出栈④弹出栈顶⑤判断栈空间是否为空⑥计算栈空间长度⑦销毁栈⑧测试用例 一、栈的模型 首先栈有两个概念 1.数据结构里的栈。2.语言/操作系统中的栈(内存空间)&#xff0c;可能会在递…

xshell连接云服务器(保姆级教程)

文章目录 1. 前言2. 查看云服务器的信息3. xshell7连接云服务器 1. 前言 云服务器&#xff0c;也被称为Elastic Compute Service (ECS)&#xff0c;是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。它源于物理服务器集群资源池&#xff0c;可以像从大海中取水一样&am…