磊磊零基础打卡算法:day18 c++模拟哈希表来模拟散列表
5.21
哈希表
Hash表又称为散列表,一般由Hash函数(散列函数)与链表结构共同实现,与离散化思想类似。
一般要求:防止冲突,便于查询
模拟hash表:
拉链法:两个核心操作insert(),find();
int h[N], e[N], ne[N], idx; //邻接表进行存储;

void insert(int x) {
// c++中如果是负数 那他取模也是负的 所以 加N 再 %N 就一定是一个正数
int k = (x % N + N) % N;
//hash防冲突取值
e[idx] = x;
//赋值
ne[idx] = h[k];
//h[k]是一个拉链的结点,例如2下面的拉链;
h[k] = idx++;
//通过拉链进行延申
}bool find(int x) {
//用上面同样的 Hash函数 讲x映射到 从 0-1e5 之间的数
int k = (x % N + N) % N;
for (int i = h[k]; i != -1; i = ne[i]) {
//经典的邻链表的遍历操作;
if (e[i] == x) {
return true;
//能找到
}
}
return false;
}
例题链接:https://www.acwing.com/problem/content/842/
#include "cstring"
#include "iostream"
using namespace std;
const int N = 100003;
int h[N], e[N], ne[N], idx;
void insert(int x) {
int t = (x % N + N) % N;
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() {
// for (int i = 100000; i; i++) {
// bool flag = true;
// for (int j = 2; j * j < i; j++) {
// if (i % j == 0) {
// flag = false;
// break;
// }
// }
// if (flag) {
// cout << i;
// break;
// }
// }
//这里是找到N的操作,一般是取质数为hash计算的最好办法
memset(h, -1, sizeof h);
//将槽先清空 空指针一般用 -1 来表示
int m;
cin >> m;
while (m--) {
char op;
int x;
cin >> op >> x;
if (op == 'I') {
insert(x); } else {
if (find(x))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}0;
}< "No" << endl;
}
}
return 0;
}
开放寻址法(推荐):
其实就是开辟两到三倍的一维数组空间大小来存放原来的数值;
主要方法:find(int x)找到x;两种结果
如果能找到,就返回x的下标,同时也对应着query操作
如果不能找到,那么返回x需要被插入的位置,对应着insert的操作;
#include "cstring"
#include "iostream"
using namespace std;
const int N = 200003, null = 0x3f3f3f3f;
int h[N];
int find(int x) {
//找一个数是否存在,结果两种:一是存在的话,就返回它的位置,如果不存在,那么就需要返回它被插入的位置;
int k = (x % N + N) % N;
//散列原数,同时也找到x的位置
while (h[k] != null && h[k] != x) {
//如果k位置的元素是空要么k位置的元素就是x的位置,那么就不需要判断,直接返回k就是要找的位置
k++;
//如果当前位置被人家占了,就往后挪,直到N数组总长。总长都不够就从头开始
if (k == N)
k = 0;
}
return k;
}
int main() {
int m;
cin >> m;
memset(h, 0x3f, sizeof h);
//对所有元素初始化为null配合h[k]!=null的查找
while (m--) {
char op;
int x;
cin >> op >> x;
int k = find(x);
if (op == 'I')
h[k] = x;
//直接将k的位置给x元素就行
else {
if (h[k] != null)
//说明存在元素;
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}
磊磊零基础打卡算法:day18 c++模拟哈希表来模拟散列表的更多相关文章
- Java数据结构和算法(十三)——哈希表
Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...
- 算法导论 第十章 基本数据类型 & 第十一章 散列表(python)
更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python怎么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO p ...
- 数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现
Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列 ...
- 零基础学C#算法(零基础学算法——C#版)
今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...
- Leedcode算法专题训练(哈希表)
Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中.如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在.例如对于只有小写字符的元素,就可以用一个长度为 2 ...
- Java基础知识笔记(一:修饰词、向量、哈希表)
一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...
- 散列表(hash table)——算法导论(13)
1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...
- 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...
- Android零基础入门第71节:CardView简单实现卡片式布局
还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...
- 【零基础学习iOS开发】【转载】
原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...
随机推荐
- OceanBase使用OBLOADER、OBDUMPER进行导入导出
需求背景 需要定时给OB进行数据备份,并且在需要时可以全量导入,所以只能通过脚本来减少手动操作的繁琐. 脚本示例 导出脚本 #!/bin/bash # 这一步不能省,如果不设置定时运行时可能会有问题 ...
- win10系统下mysql安装
1.官网下载压缩包 2.添加环境变量到PATH 3.在bin的同级目录下,新增my.ini,内容如下(严重注意,是斜杠,千万别写成反斜杠!!!): [mysqld] basedir = D://sof ...
- Oracle.DataAccess使用问题汇总
1.使用参数化传参 先看一段sql select TABLE_COLUMN_NAME from CSV_PARA_MAPPING where TABLE_NAME = ':v_tabName' and ...
- Day 22 22.1:增量式爬虫
Day 22 22.1:增量式爬虫 爬虫应用场景分类 通用爬虫 聚焦爬虫 功能爬虫 分布式爬虫 增量式爬虫: 用来监测网站数据更新的情况(爬取网站最新更新出来的数据). 只是一种程序设计的思路,使用什 ...
- 解决GitHub网页githubusercontent地址无法访问问题
问题 解决GitHub网页githubusercontent地址无法访问问题 解决方法: 参考链接:https://zhuanlan.zhihu.com/p/107691233 注意 安装有火绒的,可 ...
- antd Vue--this.$confirm弹窗使用
看API中this.$confirm弹窗使用不对 讲的也不明确,在此记录下正确的用法 this.$confirm("确认删除文件?",{ type:'error'}).then(( ...
- (面试题)面试官为啥总是让我们手撕call、apply、bind?
引言 上一篇关于<面试官为啥总是喜欢问前端路由实现方式>的文章发布后,发现还是挺受欢迎的.这就给我造成了一定的困惑 之前花了很长时间,实现了一个自认为创意还不错的关于前端如何利用node+ ...
- TypeScript String(字符串)
TypeScript String(字符串) String 对象用于处理文本(字符串). 语法 var txt = new String("string"); 或者更简单方式: v ...
- ES操作
总结一些ES的操作方式及语法 查看健康状态 curl -XGET http://localhost:9200/_cluster/health?pretty 查看索引 curl -XGET ht ...
- linux smb
/etc/samba/smb.conf [global]workgroup =WORKGROUPsecurity = usermap to guest =Bad Userpassdb backend ...