840. 模拟散列表

  • 题目
  • 提交记录
  • 讨论
  • 题解
  • 视频讲解

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

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

现在要进行 N

次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数 N

,表示操作数量。

接下来 N

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

输出格式

对于每个询问指令 Q x,输出一个询问结果,如果 x

在集合中出现过,则输出 Yes,否则输出 No

每个结果占一行。

数据范围

1≤N≤105

−109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

1)拉链法:

 * 每个值模上 mod 以后就对应一条唯一的单链表,如果是插入就将此时的值插入这个链表
 * 的第一个位置,用 h[] 来表示每条链表的头节点;

/*** 每个值模上 mod 以后就对应一条唯一的单链表,如果是插入就将此时的值插入这个链表* 的第一个位置,用 h[] 来表示每条链表的头节点;
*//**
#include <iostream>
#include <algorithm>using namespace std;const int mod = 1e5+3;
int e[mod],ne[mod],h[mod],idx;  // 值应该是每次都插入链表的首部
void insert(int v)
{int hd=(v%mod+mod)%mod;e[idx]=v;ne[idx]=h[hd];h[hd]=idx;++idx;
}bool find(int v)
{int hd = (v%mod+mod)%mod;for(int i=h[hd];i!=-1;i=ne[i])if(e[i] == v)return true;    //如果找到了这个值,就返回truereturn false;   //返回false
}void print(int v)
{int hd = (v%mod+mod)%mod;for(int i=h[hd];i!=-1;i=ne[i])cout << e[i] << ' ';cout << endl;
}int main()
{fill(h,h+mod,-1);   //初始化所有链表为空int n;cin >> n;while (n -- ){string op;int x;cin >> op >> x;if(op == "I")insert(x);else {if(find(x) == true)puts("Yes");elseputs("No");}}return 0;
}
*/

2)平方探测法

#include <iostream>
#include <algorithm>using namespace std;#define squ(x) ((x)*(x))const int maxn = 2e5+3,inf = 1e9+5;
int hs[maxn];int  find(int v)
{int hd=(v%maxn+maxn)%maxn;int cnt=2;while(hs[hd]!=inf && hs[hd]!=v){if(cnt%2)   //如果cnt是奇数就减去(这个数/2 的平方) hd=((hd-squ(cnt/2))%maxn+maxn)%maxn;else        //否则加上(这个数/2 的平方)hd=((hd+squ(cnt/2))%maxn+maxn)%maxn;++cnt;}return hd;
}int main()
{fill(hs,hs+maxn,inf);int n;cin >> n;while(n--){string op;int x;cin >> op >> x;int idx = find(x);if(op == "I")hs[idx]=x;else {if(hs[idx] == x)puts("Yes");elseputs("No");}}return 0;
}

3)线性探测法:

#include <iostream>
#include <algorithm>using namespace std;const int maxn = 2e5+3,inf = 1e9+5;
int hs[maxn];int  find(int v)
{int hd=(v%maxn+maxn)%maxn;while(hs[hd]!=inf && hs[hd]!=v)hd=(hd+1)%maxn;return hd;
}int main()
{fill(hs,hs+maxn,inf);int n;cin >> n;while(n--){string op;int x;cin >> op >> x;int idx = find(x);if(op == "I")hs[idx]=x;else {if(hs[idx] == x)puts("Yes");elseputs("No");}}return 0;
}

4)用vector 来代替用数组实现的链表:

确实比数组实现来链表写起来更简单,但是相应的速度应该就稍逊一筹了;

#include <iostream>
#include <algorithm>
#include <vector>using namespace std;const int mod = 1e5+3;
vector<int> Adj[mod];void insert(int v)
{int hd = (v%mod + mod)%mod;Adj[hd].push_back(v);
}bool find(int v)
{int hd = (v%mod+mod)%mod;for(int i=0;i<Adj[hd].size();++i)if(Adj[hd][i] == v)return true;return false;
}int main()
{int n;cin >> n;while(n--){string op;int x;cin >> op >> x;if(op == "I")insert(x);else{if(find(x))puts("Yes");elseputs("No");}}
}

散列表,(拉链法,平方探测法,线性探测法)相关推荐

  1. Hash表_拉链法_开放寻址法_模拟散列表

    文章目录 Hash表 作用 ① 拉链法 ② 开放寻址法 例 - 模拟散列表 > 拉链法 > 开放寻址法 Hash表 一般只有添加.查找 (注意:离散化为特殊的哈希方式,因为离散化需要提前保 ...

  2. 查找算法【哈希表】 - 处理冲突的方法:开放地址法-线性探测法

    查找算法[哈希表] - 处理冲突的方法 无论如何设计散列函数,都无法避免发生冲突. 如果发生冲突,就需要处理冲突. 处理冲突的方法分为3种: 开放地址法 链地址法 建立公共溢出区. [开放地址法] 开 ...

  3. 散列表(开放定址法)

    散列表(开放定址法) 1.线性探测法 将具体的值输入到哈希函数中,映射出的具体的哈希表中的下标索引.当下标索引冲突时. 离散链表法:将重复了的值用链表的方式挂在对应索引的链表下. 线性探测法:一个位置 ...

  4. ThreadLocalMap线性探测法解决hash冲突

    第一.前言 ThreadLocal使用的是自定义的ThreadLocalMap,接下来我们来探究一下ThreadLocalMap的hash冲突解决方式. 第二.ThreadLocal的set()方法 ...

  5. 【数据结构】散列表知识点

    散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...

  6. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))

    本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...

  7. 散列表及散列冲突解决方案

    1.散列表 看过HashMap源码的同学应该知道,HashMap是基于哈希表(散列表)的 Map 接口的非同步实现. 在我们put了一条key-value数据后,如下图,程序会先将key通过hash( ...

  8. 数据结构与算法(七)—— 散列表结构及其实现和应用

    注:本篇内容参考了<Java常用算法手册>.<大话数据结构>和<算法导论(第三版)>三本书籍.并参考了百度百科. 本人水平有限,文中如有错误或其它不妥之处,欢迎大家 ...

  9. c++数据结构:散列表(哈希)

    记录的存储位置与关键字之间存在对应关系,对应关系---hash函数 Loc(i)=H(keyi) 假设散列函数为H(key)=k 数据为:1 2 5 8 9 6 7  访问的话可以通过下标来访问数据. ...

  10. 散列表-开放地址法和链地址法的实现

    基本定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使得每个关键字key对应一个存储位置f(key).这种对应关系f称为散列或哈希函数.采用上述思想将数据存储在一块连续的存 ...

最新文章

  1. mysql 主从复制 position_mysql 主从复制原理及步骤。
  2. linux+输出分页,是否可以在zsh中自动分页输出?
  3. postgresql查询栅格数据范围(extent)
  4. Java机器学习库ML之十一线性SVM
  5. 软件oem要注意什么_做化妆品oem,选择化妆品包材要注意什么问题
  6. .NET重要技术思考
  7. java 日志框架 详解_springboot日志详解
  8. Java基础面试题大全
  9. cad批量 谷歌翻译lisp_LISP批量打开CAD图操作
  10. FANUC机器人SYST-034 SOP或UOP的暂停信号丢失-警告的含义
  11. MOOS-ivp之第一个MOOSApp:向MOOSDB发布数据
  12. Linux下输出大字、艺术字--figlet
  13. 论文投稿指南——中文核心期刊推荐(新闻事业)
  14. yum-utils与yum-config-manager
  15. js如何打开编辑服务器端文件夹,js 打开本地或共享文件夹
  16. 【TA工具】快速结合/叠加多张法线贴图
  17. 《succes can be a lonely road》 【istrangeboy精品英文励志短文系列】之最美英文励志诗《成功是一条孤独之路》英译汉
  18. ansys仿真论文描述
  19. android 导航栏位置,android手机导航栏
  20. 2022-2028全球及中国先进储能系统行业研究及十四五规划分析报告

热门文章

  1. JVM内存和垃圾回收-12.String Table
  2. 从零到英雄:资产商店发行人的故事
  3. inkscape:图层
  4. spark-面试题(含答案)
  5. CSS图片保持原比例
  6. oracle用plsql导出dmp文件
  7. CCTV-TIME特别关注:深圳首届弘扬关公文化促进两岸统一忠义论坛
  8. Holt_Winters三次平滑指数实现
  9. 【数据库】HIVE SQL实现本月一号、月底的提取
  10. 用手机远程控制扫描仪