一日一题:第十二题---模拟散列表(三种方法!!)

news2024/10/6 6:47:13

​作者:小妮无语
专栏:一日一题

🚶‍♀️✌️道阻且长,不要放弃✌️🏃‍♀️

今天来给大家介绍的是简单的Hash表的应用


目录

关于哈希的知识点 

题目描述(模拟散列表)

代码 1(拉链法)

 代码 2(开放寻址法)

代码 3 (map结构)

小记 


关于哈希的知识点 


 直达链接

题目描述(模拟散列表)

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

  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

代码 1(拉链法)

//拉链法
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+3;//最好是质数,且离2的次方远点
int n[N],ne[N],idx,k[N];//这里采用的技术就是单链表
void insert(int x)
{
    int m=(x%N+N)%N;//构造哈希函数,为了防止出现负数所以加了N又mod了N,如果是正数就没影响
    n[idx]=x;//就是现在索引被存到了idx
    ne[idx]=k[m];//ne[idx],idx这个数的下一个数的地址
    k[m]=idx++;//就是相同m的这槽(像是表头)这个表的头指针是什么,通过表头往后查找数据
}
bool find(int x)
{
    int m=(x%N+N)%N;
    for(int i=k[m];i!=-1;i=ne[i])//通过每个位置在上挂的数组的表头往后找,一般一个位置不会挂太多数,时间复杂度与等于1
    {
        if(n[i]==x)
        {
            return true;
        }
    }
    return false;
}
int main()
{
    int h;
    cin>>h;
    memset(k,-1,sizeof k);//把数组先全搞成数据范围外的数
    while(h--)
    {
        char a[2];
        int x;
        cin>>a>>x;
        
        if(a[0]=='I')
        {
            insert(x);
        }
        else
        {
            if(find(x))puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

 代码 2(开放寻址法)

//开放寻址法
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e5+3;//数组开2~3倍大,最好是质数,且离2的次方远点
const int null=0x3f3f3f3f;//在int范围里都可以算得上无穷大了
int n,g[N];
// map<int,int> g;
int find(int x)//作用:找个能存x的地方
{
    int m=(x%N+N)%N;//构造哈希函数,为了防止出现负数所以加了N又mod了N,如果是正数就没影响
    while(g[m]!=x&&g[m]!=null)
    {
        m++;
        if(m>=N) m%=N;
        //如果数组到头了,其实并不一定是存满了,
        //有可能是你要存的数太大了,就从头找个空位或者肯是否出现过
    }
    return m;//返回要么是空的要么等于x的下标,几乎不可能不返回,以为我们N开始就开的很大
}
int main()
{
    cin>>n;
    memset(g,null,sizeof g);//把数组先全搞成数据范围外的数
    while(n--)
    {
        char a[2];
        int x;
        cin>>a>>x;
        int u=find(x);
        //找到可以存放x的地方,这个题,其实有点像是默认了只要出现过就OK
        //而且不用担心是否有重复的数
        if(a[0]=='I')
        {
            g[u]=x;
        }
        else
        {
            if(g[u]==x)puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

代码 3 (map结构)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int n;
map<int,int> g;
int main()
{
    cin>>n;
    
    while(n--)
    {
        char a[2];
        int x;
        cin>>a>>x;
        if(a[0]=='I')
        {
            g[x]=1;
        }
        else
        {
            if(g[x])puts("Yes");
            else puts("No");
        }
    }
    return 0;
}

小记 

上述三个方法我最喜欢第二个,哈哈哈,第三个虽然好用,但从时间上看是前面两种的两倍,开放寻址法和拉链法默认的时间复杂度都是O(1) 

map函数我不经常用,有次看到一个大佬这样写的,感觉很好用,应该后续会学到

开放寻址法思想很简单,就是你通过哈希函数来算出一个值,看看该值的位置是否为空,不为空就往后找,这里默认不会找太远,所以时间复杂度固定的O(1)

拉链法需要写两个函数,插入函数,采用的是单链表的插入,查找函数,也是模仿链表的查找,通过哈希函数来算出一个值,然后把值相同的数串在一起,根据idx指针索引来进行查找,因为默认的一个位不会串太多元素,所以时间复杂度也给的O(1)

          == 欢迎来到一日一题的小菜鸟频道,睡不着就看看吧!==

跟着小张刷题吧!

                     ==  跟着小张刷题吧!==

 

 

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

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

相关文章

基于GPT-4的神仙插件Bito,亲测好用

基于GPT-4的神仙插件&#xff0c;无需魔法,目前免费 一、Bito 简介 最近发现一个可以有效提升coding效率的插件神器&#xff0c;截止当前(20230425)已有65k的下载量了&#xff01; 类似与Cursor一样&#xff0c;可以使用AI辅助写代码&#xff0c;但是又解决Cursor没有语法提…

力扣刷题day35|416分割等和子集

416. 分割等和子集 力扣题目链接 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割…

keil设置程序起始地址及生成bin文件的方法

一.keil设置程序起始地址 1.1FLASH APP 的起始地址设置 随便打开一个之前的实例工程&#xff0c;点击 Options for Target→Target 选项卡 默认的条件下&#xff0c;图中 IROM1 的起始地址&#xff08;Start&#xff09;一般为 0X08000000&#xff0c;大小&#xff08;Size&a…

通用el-table 修改样式

通用el-table 修改样式 el-table实现下图效果: <template><div class"contentbox"><el-table:data"tableData"height"310"style"width: 40%"highlight-current-rowcurrent-change"handleCurrentChange"&g…

利用Floodlight进行DDOS攻击防御实验笔记

Floodlight Floodlight是Apache授权并基于JAVA开发的企业级OpenFlow控制器&#xff0c;当前最新版本是1.2。 Floodlight OpenFlow Controller -ProjectFloodlight&#xff1a;http://www.projectfloodlight.org/floodlight/ 流表 把同一时间&#xff0c;经过同一网络中具有某种…

线程同步方式之二条件变量

Linux线程同步方法之二 条件变量 饥饿状态&#xff1a;由于线程A频繁地申请/释放锁&#xff0c;而导致其他线程无法访问临界资源的情况。 同步synchronized&#xff1a;在保证数据安全的前提下&#xff0c;让线程能够按照某种特定的顺序访问临界资源&#xff0c;从而有效避免…

Spring Security实战(九)—— 使用Spring Security OAuth实现OAuth对接

一、OAuth2.0介绍 OAuth2.0是一种授权协议&#xff0c;允许用户授权第三方应用程序代表他们获取受保护的资源&#xff0c;如个人信息或照片等。它允许用户授权访问他们存储在另一个服务提供商上的资源&#xff0c;而无需将其凭据共享给第三方应用程序。OAuth2.0协议建立在OAuth…

直升机空气动力学基础--004翼型的阻力

来源 1. 空气的粘性 2.阻力的产生 3.形成因素 4.阻力系数曲线

LeetCode-242. 有效的字母异位词

题目链接 LeetCode-242. 有效的字母异位词 题目描述 题解 题解一&#xff08;Java&#xff09; 作者&#xff1a;仲景 首先&#xff0c;满足条件的情况下&#xff0c;两个字符串的长度一定是相等的&#xff0c;不相等一定不满足条件 使用Hash表来存储字符串s中各个字符出现的…

回溯算法——我欲修仙(功法篇)

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️我欲修仙】 系列文章目录 第一章 ❤️ 学习前的必知知识 第二章 ❤️ 二分查找 文章目录 系列文章目录回溯算法&#x1f914;&#x1f914;&#x1f914;回溯算法一般可以解决的问题回溯算法的实现回…

Python语言简介

B站讲解视频&#xff1a;https://www.bilibili.com/video/BV1Mv4y1n7n8/?vd_source515e6808c21c69114a4fae34589dfb0e Python是什么 Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。具有很强的可读性&#xff0c;相比其他语言经常使用英文关键字&a…

为什么有时候磁珠会使电源的纹波变大

电路设计时&#xff0c;我们常常在芯片电源的输入放一个磁珠和电容&#xff0c;用以滤除电源上的高频噪声。 但是有时候会发现&#xff0c;加了磁珠后&#xff0c;芯片电源输入处纹波竟然变大了&#xff0c;超出了电源纹波范围&#xff0c;导致芯片工作异常。 把磁珠换成0R电阻…

论文阅读:Heterogeneous Graph Contrastive Learning for Recommendation(WSDM ’23)

论文链接 Motivation&#xff1a; 在推荐系统中&#xff0c;图神经网络在建模图结构数据上已经变成一个强有力的工具。但是现实生活的推荐语义通常涉及异质关系&#xff08;像用户的社交关系&#xff0c;物品知识关系的依赖&#xff09;&#xff0c;这些都包含丰富的语义信息…

Linux下实现C语言程序

一.情况说明 写这篇博客的情况比较复杂&#xff0c;首先我本来是参加新星计划按照规划现在去学习shell脚本语言的&#xff0c;但是博主现在由于其他原因需要了解makefile&#xff0c;makefile是Linux系统下的一种工具&#xff0c;makefile的一些背景要涉及链接库的知识&#xf…

从0开始搭建一个简单的前后端分离的XX系统-vue+Springboot+mybatis-plus+mysql

一、准备工作 1.安装node 2.idea 旗舰版** idea**教程 上述教程中的idea**工具 3.安装mysql任意版本 mysql 4.安装mysql workbench&#xff08;没用上&#xff09; 5.安装navicate 参考文章&#xff1a;百度-从小白到架构&#xff08;作者&#xff09;-Navicat16** Nav…

Thinkphp获取项目最近更改变动的所有文件

导读&#xff1a; 企业级的网站项目都是要不断优化迭代更新的&#xff0c;做为一名后端程序员&#xff0c;在编写更新模块时&#xff0c;如何能快速获取最近修改的文件&#xff0c;然后打包压缩成更新补丁呢&#xff1f;我们先来看一下最终效果图&#xff1a; 步骤&#xff1a…

使用FFMPEG分离mp4/flv文件中的264视频和aac音频

准备 ffmpeg 4.4 一个MP4或flv格式的视频文件 分离流程 大致分为以下几个简单步骤&#xff1a; 1.使用avformat_open_input 函数打开文件并初始化结构AVFormatContext 2.查找是否存在音频和视频信息 3.构建一个h264_mp4toannexb比特流的过滤器&#xff0c;用来给视频avpa…

Hudi 数据湖技术之集成Flink

目录 1 安装Flink2 快速入门2.1 集成Flink概述2.2 环境准备2.3 创建表2.4 插入数据2.5 查询数据2.6 更新数据 3 Streaming query3.1 创建表3.2 查询数据3.3 插入数据 4 Flink SQL Writer4.1 Flink SQL集成Kafka4.2 Flink SQL写入Hudi4.2.1 创建Maven Module4.2.2 消费Kafka数据…

【C++】了解设计模式、 stackqueue的使用与模拟实现

文章目录 1.设计模式2.stack1.stack的使用1.stack的结构2.stack的接口 2.stack的模拟实现1.stack的结构2.接口实现 3.queue1.queue的使用1.queue的结构3.queue的接口 2.queue的模拟实现1.queue的结构2.接口实现 4.了解deque1.deque的原理介绍2.deque的底层结构3.deque的迭代器设…

Codeforces Round 861 (Div. 2)(A~D)

A. Lucky Numbers 给出边界l和r&#xff0c;在区间[l, r]之间找到幸运值最大的数字。一个数字的幸运值被定义为数位差的最大值&#xff0c;即数字中最大的数位和最小的数位的差。 思路&#xff1a;因为涉及到至少两位&#xff0c;即个位和十位变化最快&#xff0c;最容易得到相…