基础数据结构第十期 哈希表(数组+STL)

news2025/1/18 9:10:19

前言:

哈希表是一种非常重要的数据结构,希望大家都能够熟练掌握!!!

一、哈希表的基本内容

哈希表(Hash Table),也被称为哈希映射(Hash Map)或字典(Dictionary),是一种常见的数据结构,用于高效地存储和检索数据。它利用哈希函数(Hash Function)将关键码(Key)映射到存储位置,从而实现快速的查找、插入和删除操作。哈希表的基本思想是将关键码通过哈希函数转换成一个固定长度的哈希值(Hash Value),然后将该哈希值作为索引来访问数组(或者称为哈希桶)中的特定位置。这样,可以通过哈希函数直接计算出元素的存储位置,从而快速定位到所需的数据。

在C++中底层使用了哈希表的有unordered_map、unordered_set这两个STL的容器。

unordered_map:

unordered_map底层存储的是<key,value>键值对,可以通过key快速的索引到value,在unordered_map内部因为是数据是通过映射存入哈希桶内的,所以对unordered_map进行遍历得到的是一个无序的序列。

unordered_set:

unordered_set和set的使用是一样的,但是底层的存储方式是不同的,set使用的是红黑树,unordered_set底层使用的是哈希桶,进行查找的时间复杂度是常数次,但是底层的数据是无序的。

二、使用步骤

1.模拟散列表:

AC代码:

数组:
//哈希表
//开放寻址法
#include <iostream>
#include <cstring>
using namespace std;
const int N = 200003, null = 0x3f3f3f3f;
//0x3f3f3f3f是个大于1e9的数,一定不在x的范围内
int h[N];

//核心操作find
//如果x在哈希表中存在,那么返回x在哈希表中的位置,
//如果x在哈希表中不存在,那么返回x应该在哈希表中存储的位置
int find(int x) {
	int k = (x % N + N) % N;

//当前位置不等于空,也就是坑位上有人,并且这个坑位上的人不等于x,那就应该去看下一个坑位
	while (h[k] != null && h[k] != x) {
		k++;
		if (k == N)//说明已经看完了最后一个坑位
			k = 0;//就循环看第一个坑位
	}
	return k;
}

int main() {
	int n;
	scanf("%d", &n);
	memset(h, 0x3f, sizeof h);//数组初始化,把h数组初始化成0x3f
	while (n--) {
		char op[2];
		int x;
		scanf("%s%d", op, &x);
		int k = find(x);
		if (*op == 'I')
			h[k] = x;
		else {
			if (h[k] != null)
				puts("Yes");
			else
				puts("No");
		}
	}
	return 0;
}
STL:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
vector<int>v;
int n,x;
char c;
int main()
{
	cin>>n;
	while(n--){
		cin>>c>>x;
		if(c=='I'){
			v.push_back(x);
		}
		if(c=='Q'){
		 if(count(v.begin(),v.end(),x))cout<<"Yes"<<endl;
			else cout<<"No"<<endl;
		}
	}
	return 0;
}

2.字符串哈希:


AC代码:

//快速判断两个字符串是否相等,可以用字符串前缀哈希这个做法
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
const int  N = 100010, P = 131;
//p一般取131或13331,代表P进制
int  n, m;
char str[N];
ULL h[N], p[N];
//h数组表示某一个值前缀哈希值
//p数组用来表示乘了p的多少次方

ULL get(int l, int r) { //计算l~r区间的哈希值的公式
	return h[r] - h[l - 1] * p[r - l + 1];
}

int main() {
	scanf("%d%d%s", &n, &m, str + 1);
	p[0] = 1;//表示p的0次方等于1
	for (int i = 1; i <= n; i++) {
		p[i] =  p[i - 1] * P;
		h[i] = h[i - 1] * P + str[i]; //字符串前缀哈希值
	}
	while (m--) {
		int l1, r1, l2, r2;
		scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
		if (get(l1, r1) == get(l2, r2))
			puts("Yes");
		else
			puts("No");
	}

	return 0;
}

总结

哈希表真的十分的重要,希望我们都能够熟练的掌握,感谢大家的观看,谢谢大家!!!

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

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

相关文章

Redis底层原理

持久化 Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是…

vue2使用文件上传读取本地照片并转化base64格式进行展示

创建个vue2项目,直接把代码放到一个vue2页面内运行就好,下面代码拿来即用 <template><div><div class"replace_menu_mask" click"closeMenu"><img :src"replaceImg" alt"" style"width: 100%;">&l…

企业微信forMAC,如何左右翻动预览图片

1、control commandshifd 进入企业微信的debug调试模式 2、按照如下步骤选择 3、重启企业微信

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…

【复习】人工智能 第7章 专家系统与机器学习

专家系统就是让机器人当某个领域的专家&#xff0c;但这章专家系统不咋考&#xff0c;主要靠书上没有的机器学习。 一、专家系统的基本组成 二、专家系统与传统程序的比较 &#xff08;1&#xff09;编程思想&#xff1a; 传统程序 数据结构 算法 专家系统 知识 推理 &…

ansible基础概念

一、【写在前面】 前面断更了几天&#xff0c;笔者被流感给干倒了&#xff0c;去拍了个核磁&#xff0c;给我脑子干成脱髓鞘了&#xff0c;也不知道是之前新冠导致的还是如何&#xff0c;哎要变成愚蠢的低级动物了……稍微恢复一点体力&#xff0c;今天赶快来博客水一水文章。…

Javaweb之Mybatis的动态SQLforeach和include的详细解析

3.3 动态SQL-foreach 案例&#xff1a;员工删除功能&#xff08;既支持删除单条记录&#xff0c;又支持批量删除&#xff09; SQL语句&#xff1a; delete from emp where id in (1,2,3); Mapper接口&#xff1a; Mapper public interface EmpMapper {//批量删除public voi…

re:Invent 2023 技术上新|使用管理控制台中的全新 myApplications 简化应用程序资源的管理...

亚马逊云科技支持应用程序操作的 myApplications 正式上线&#xff0c;这组新功能可帮助您在亚马逊云科技上开始使用您的应用程序&#xff0c;以更少的工作量操作应用程序&#xff0c;并更快地进行大规模迁移。使用亚马逊云科技管理控制台中的 myApplication&#xff0c;您可以…

Spark与Elasticsearch的集成与全文搜索

Apache Spark和Elasticsearch是在大数据处理和全文搜索领域中非常流行的工具。在本文中&#xff0c;将深入探讨如何在Spark中集成Elasticsearch&#xff0c;并演示如何进行全文搜索和数据分析。将提供丰富的示例代码&#xff0c;以便更好地理解这一集成过程。 Spark与Elastics…

555断线报警器电路图

电路的核心部分由NE555组成&#xff0c;R1、R2、C1和NE555组成一个频率越为3KHz左右的多谐振荡电路&#xff0c;当电路接通电源时&#xff0c;振荡器开始工作蜂鸣器LS1发出响声&#xff1b;当1和2被短接时&#xff0c;振荡器的工作条件被破坏&#xff0c;LS1停止工作。 电路分…

【动态规划】【矩阵】C++算法329矩阵中的最长递增路径

作者推荐 【动态规划】C算法312 戳气球 题目 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外&…

如何正确地理解应用架构并开发

许多同学或多或少都经历过这样的流程&#xff1a; 新同学刚来公司&#xff0c;学习了解团队的一些工程代码&#xff0c;并了解其中的代码风格团队新接手了一些其他团队的项目&#xff0c;需要了解工程结构以及概念如何定义工程项目的工程结构&#xff0c;包目录结构并达成团队共…

IO进程线程 day7 进程间通信

1.使用消息队列完成两个进程之间相互通信 2.信号通信相关代码的重新实现 &#xff08;1&#xff09;signal函数的实例 #include <head.h>//定义信号处理函数 void handler(int signum) {if(signum SIGINT) //表明要处理2号信号{printf("用户按下了ctrl c键…

【数据结构】二叉树的链式实现

树是数据结构中非常重要的一种&#xff0c;在计算机的各方个面都有他的身影 此篇文章主要介绍二叉树的基本操作 目录 二叉树的定义&#xff1a;二叉树的创建&#xff1a;二叉树的遍历&#xff1a;前序遍历&#xff1a;中序遍历&#xff1a;后序遍历&#xff1a;层序遍历&#…

图解Kubernetes的服务(Service)

pod 准备&#xff1a; 不要直接使用和管理Pods&#xff1a; 当使用ReplicaSet水平扩展scale时&#xff0c;Pods可能被terminated当使用Deployment时&#xff0c;去更新Docker Image Version&#xff0c;旧Pods会被terminated&#xff0c;然后创建新Pods 0 啥是服务&#xf…

使用Excel批量给数据添加单引号和逗号

表格制作过程如下&#xff1a; A2表格暂时为空&#xff0c;模板建立完成以后&#xff0c;用来放置原始数据&#xff1b; 在B2表格内输入公式&#xff1a; ""&A2&""&"," 敲击回车&#xff1b; 解释&#xff1a; B2表格的公式&q…

C++面试宝典第17题:找规律填数

题目 仔细观察下面的数字序列,找到规律,并填写空白处的数字。 (1)1, 2, 4, 7, 11, 16, __ (2)-1, 2, 7, 28, __, 126 (3)6, 10, 18, 32, 57, __ (4)19, 6, 1, 2, 11, __ (5)2, 3, 5, 7, 11, __ (6)1, 8, 9, 4, __, 1/6 (7)1, 2, 3, 7, 16, __, 321 (8)1, 2, …

【Kubernetes】如何使用 kubectl 操作 cluster、node、namespace、pod

如何使用 kubectl 操作 cluster、node、namespace、pod 在列出、描述、修改或删除其他命名空间中的对象时&#xff0c;需要给 kubectl 命令传递 --namespace&#xff08;或 -n&#xff09;选项。如果不指定命名空间&#xff0c;kubectl 将在当前上下文中配置的默认命名空间中执…

java进阶||jdk进阶之循环

从18年学java到现在除了各种各样的数据类型和集合烧不了要遍历这些变量, for循环这时就少不了啦(当然还有8后引入的神器泛型) 先来看一段精髓业务代码, 使用了多个新特性当然也少不了循环和分支判断 代码较长解析在后面 private CommonPage<List<Object>> handle…

Apache Doris (六十二): Spark Doris Connector - (2)-使用

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. 将编译jar包加入本地Maven仓库