c++哈希表——超实用的数据结构

文章目录

  • 1. 概念引入
    • 1.1 整数哈希
      • 1.1.1 直接取余法。
      • 1.1.2 哈希冲突
        • 1.1.2.1 开放寻址法
        • 1.1.2.2 拉链法
    • 1.2 字符串哈希
  • 3.结语

1. 概念引入

  • 哈希表是一种高效的数据结构 。
  • H a s h Hash Hash表又称为散列表,一般由 H a s h Hash Hash函数(散列函数)与链表结构共同实现。
  • 散列(映射)方法是使用函数 h h h 将元素 U U U映射到表 T [ 0... m − 1 ] T[0...m-1] T[0...m1] 的下标上 ( m = O ( ∣ U ∣ ) ) (m=O(|U|)) (m=O(U))。这样以 U U U中关键字为自变量,以h为函数的运算结果。
    就是相应结点的存储地址。从而达到在 O ( 1 ) O(1) O(1)时间内就可完成查找。

1.1 整数哈希

我们以一道例题来举例:哈希表。

这道题目是这么做的:

1.1.1 直接取余法。

关键字 k k k除以 m m m,取余数作为在 H a s h Hash Hash表中的位置。
函数表达式可以写成:
哈希函数 h ( k ) = k h(k) = k h(k)=k m o d mod mod m m m
一般 m m m 选择为素数,建议选择 2 e 5 + 10 2e5+10 2e5+10

1.1.2 哈希冲突

  • H a s h Hash Hash函数把复杂信息映射到一个容易维护的值域内。
  • 值域变小,有可能造成两个不同的信息被 H a s h Hash Hash函数映射为相同的值(两数同余), H a s h Hash Hash冲突,需要处理这种情况。
1.1.2.1 开放寻址法
  • 使用 H a s h Hash Hash函数 h h h把整数 x x x映射为 h [ x ] h[x] h[x],如果 h [ x ] h[x] h[x]已经有值,说明当前查询到的地址发生了冲突
  • 如果当前地址发生冲突,就向这个地址的右边继续查询,直到遇到 N U L L NULL NULL或值 x x x为止。

代码:

#include<bits/stdc++.h>
using namespace std;
#define PII pair<int, int>
#define For(i, a, b) for(int i = a;i <= b;i++)
const int N = 2e5 + 3;
const int null = 0x3f3f3f3f;
int n, h[N];
int get(int x){int idx = (x % N + N) % N;while (h[idx] != null && h[idx] != x){idx = (idx == N ? 0 : idx + 1);}return idx;
}
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);memset(h, 0x3f, sizeof h);int n, x;string op;cin >> n;while (n--){cin >> op;cin >> x;if (op[0] == 'I'){h[get(x)] = x;}else{cout << (h[get(x)] == x ? "Yes\n" : "No\n");}}return 0;
}

在这里插入图片描述

1.1.2.2 拉链法
  • Hash函数设为 h ( x ) = x h(x) = x % P h(x)=x ,这里 P P P 是较大质数,但不超过数组大小 N N N
  • 这个 H a s h Hash Hash函数 h h h 把整数分为了 P P P 类( M o d P = 1 , 2 , . . . , P − 1 Mod P = 1, 2, ..., P-1 ModP=1,2,...,P1),每一类用一个单独的链表存储。
  • 查找整数 x x x 的时候,就在整数 x x x 所在类的链表里进行查找。

代码:

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
#define PII pair<int, int>
#define For(i, a, b) for(int i = a;i <= b;i++)
const int N = 2e5 + 3;
int head[N], val[N], nxt[N], idx;
void add(int x){int k = (x % N + N) % N;val[idx] = x;nxt[idx] = head[k];head[k] = idx++;
}
bool get(int x){int k = (x % N + N) % N;int res = head[k];while (res != -1){if (val[res] == x){return 1;}res = nxt[res];}return 0;
}
signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);memset(head, -1, sizeof head);int n;cin >> n;while (n--){char op;cin >> op;int x;cin >> x;if (op == 'I'){add(x);}else{if (get(x)){cout << "Yes\n";}else{cout << "No\n";}}}return 0;
}

在这里插入图片描述

1.2 字符串哈希

字符串 H a s h Hash Hash(字符串前缀 H a s h Hash Hash法),把字符串 s s s 变成一个 p p p 进制数字( H a s h Hash Hash值),实现不同的字符串映射到不同的数字。
字符串 s s s 中 的每个字符本质上就是一个数字( A S C I I ASCII ASCII值)。
s = s 0 s 1 s 2 s 3 ⋅ ⋅ ⋅ s n − 1 s = s_0 s_1s_2s_3···s_n - 1 s=s0s1s2s3⋅⋅⋅sn1
h ( s ) = s 0 ⋅ p n − 1 + s 1 ⋅ p n − 2 + ⋅ ⋅ ⋅ + s n − 1 ⋅ p 0 h(s) = s_0·p^{n-1}+s_1·p^{n-2}+···+s_n-1·p^0 h(s)=s0pn1+s1pn2+⋅⋅⋅+sn1p0

代码:

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int unsigned long long
#define PII pair<int, int>
#define For(i, a, b) for(int i = a;i <= b;i++)const int N = 1e5 + 10;
int n, m;
char s[N];
int h[N], p[N];int get(int l, int r){return h[r] - h[l - 1] * p[r - l + 1];
}signed main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin >> n >> m >> s + 1;h[0] = 0;p[0] = 1;For (i, 1, n){h[i] = h[i - 1] * 131 + s[i];p[i] = p[i - 1] * 131;}while (m--){int l1, r1, l2, r2;cin >> l1 >> r1 >> l2 >> r2;if ((get(l1, r1)) == get(l2, r2)) {cout << "Yes\n";}else{cout << "No\n";}}return 0;
}

在这里插入图片描述

3.结语

今天的文章就到这里啦,三连必回哦!

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

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

相关文章

docker学习——汇总版

历时一个月将docker系统的学习了一下&#xff0c;并且记录了详细的笔记和实践过程。 希望能对工作需要的小伙伴们有所帮助~ docker基础篇 docker学习&#xff08;一、docker与VM对比&#xff09; docker学习&#xff08;二、安装docker&#xff09; docker学习&#xff08;…

用通俗易懂的方式讲解大模型:一个强大的 LLM 微调工具 LLaMA Factory

LLM&#xff08;大语言模型&#xff09;微调一直都是老大难问题&#xff0c;不仅因为微调需要大量的计算资源&#xff0c;而且微调的方法也很多&#xff0c;要去尝试每种方法的效果&#xff0c;需要安装大量的第三方库和依赖&#xff0c;甚至要接入一些框架&#xff0c;可能在还…

【INTEL(ALTERA)】使用 ReadFile 读取时出错: juart-terminal: error: 从 STDIO 收集输入

说明 由于 英特尔 Quartus Prime Pro Edition 软件版本 22.4 中存在一个问题&#xff0c;您在从 Windows 操作系统上的 Nios V 命令外壳输入字符时可能会看到此错误&#xff1a; 使用 ReadFile 读取时出错&#xff1a; juart-terminal&#xff1a; error&#xff1a; 从 STDI…

机器学习(二) -- 数据预处理(3)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 未完待续…… 目录 前言 tips&#xff1a;这里只是总结&#xff0c;不是教程哈。本章开始会用到numpy&#xff0c;pandas以及matpl…

亚信安慧AntDB数据库引领数字时代通信创新

在数字经济与实体经济深度融合的时代&#xff0c;通信行业正迎来前所未有的新机遇。特别是在中国信通院的预测中&#xff0c;2027年5G专网市场规模预计将达到802亿元&#xff0c;呈现出显著的增长态势&#xff0c;年复合增长率高达42%。 亚信安慧AntDB数据库一直致力于紧跟科技…

不同角度深入探讨Maya和Blender这两款软件的差异

当我们面对三维建模软件的选择时&#xff0c;许多初学者可能会感到迷茫。今天&#xff0c;我们将从不同角度深入探讨Maya和Blender这两款软件的差异&#xff0c;特别是对于游戏建模领域的用户来说&#xff0c;这将有助于您更好地理解两者之间的区别。 软件授权与开发背景&#…

QT上位机开发(倒计时软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 倒计时软件是生活中经常遇到的一种场景。比如运动跑步&#xff0c;比如学校考试&#xff0c;比如论文答辩等等&#xff0c;只要有时间限制规定的地…

Debezium发布历史36

原文地址&#xff1a; https://debezium.io/blog/2018/07/26/debezium-0-9-0-alpha1-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 0.9 Alpha1 和 0.8.1 发布 七月 26, 2018 作者&#xff…

C#,入门教程(02)—— Visual Studio 2022开发环境搭建图文教程

如果这是您阅读的本专栏的第一篇博文&#xff0c;建议先阅读如何安装Visual Studio 2022。 C#&#xff0c;入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程https://blog.csdn.net/beijinghorn/article/details/123350910 一、简单准备 开始学习、编写程序…

日志高亮 | notepad

高亮显示日志 日志文件无法清晰看到关键问题所在? 看到一堆日志头疼?高亮日志可以清晰展示出日志的 ERROR级等各种等级的问题, 一下浏览出日志关键所在 tailspin 项目地址&#xff1a; https://githubfast.com/bensadeh/tailspin 使用Rust包管理器cargo安装 安装 - Cargo 手…

3D视觉-ToF测量法(Time of Flight)

概念 ToF 是 Time of Flight 的缩写&#xff0c; ToF 测量法又被称作飞光时间测量法&#xff0c;是通过给目标连续发射激光脉冲&#xff0c;然后用传感器接收在被测平面上反射回来的光脉冲&#xff0c;通过计算光脉冲的飞行往返时间来计算得到确切的目标物距离。因为返回时间很…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存&#xff08;CustomData&#xff09;功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据保存&#xff08;CustomData&#xff09;功能的技术背景CameraExplorer如何使用图像剪切&#xff…

优化算法3D可视化

编程实现优化算法&#xff0c;并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 import numpy as np from matplotlib import pyplot as plt import torch# 画出x**2 class Op(object):def __init__(self):passdef __call__(self, inputs):return self.forward(inputs)def for…

Python 下载与安装

1、下载 打开Python官网&#xff1a;Welcome to Python.org 点击下图所示的【Downloads】按钮进入下载页面。 ​ 进入下载页面后下拉至下图位置&#xff0c;选择版本&#xff0c;点击下载按钮下载。 页面会跳转至下一页下载页面&#xff0c;下拉到下图位置&#xff0c;选择…

PHP8使用PDO对象增删改查MySql数据库

PDO简介 PDO&#xff08;PHP Data Objects&#xff09;是一个PHP扩展&#xff0c;它提供了一个数据库访问层&#xff0c;允许开发人员使用统一的接口访问各种数据库。PDO 提供了一种用于执行查询和获取结果的简单而一致的API。 以下是PDO的一些主要特点&#xff1a; 统一接口…

荣耀之城(富饶之地)

规则简介 这是一个回合制的游戏&#xff0c;每个回合都是先选角色然后按照角色编号依次执行回合。 8个角色&#xff1a;刺客、小偷、魔术师、国王、住持、商人、建筑师、领主 根据人数的不同&#xff0c;按照不同的规则依次选取一个角色&#xff0c;国王第一个选&#xff0c…

2023年03月17日_微软和谷歌办公AI的感慨

2023年3月17日 最近这个科技圈的消息 有点爆炸的让人应接不暇了 各种大公司简直就是神仙打架 你从来没有见过这么密集的 这么高频的产品发布 昨天微软是发布了Office 365 Copilot 在里边提供了大量的AI的功能 然后谷歌呢也发布了这个Google Workspace AI 也是跟365 Cop…

『番外篇七』SwiftUI 获取视图全局位置在 NavigationStack 中失效的解决方法

概览 在 番外篇六』SwiftUI 取得任意视图全局位置的三种方法 这篇博文里,我们详细讨论了在 SwiftUI 中获取任意视图全局坐标的几种方法。 不过,我们也从中提到了某些方法无法适用于 NavigationStack 视图,本篇博文由此应运而生。 在本篇博文种,您将学到如下内容: 概览1.…

MFC连接mqtt服务器订阅和发送数据-自设计函数库

以下是一个简单的MQTT连接库文件&#xff0c;其中包含了连接、断开、订阅主题、发送数据和接收数据等函数。请注意&#xff0c;这只是一个示例&#xff0c;你可能需要根据自己的实际需求进行修改。 #include <iostream> #include <cstring> #include <sys/type…

分布式技术之故障隔离技术

文章目录 什么是故障隔离&#xff1f;分布式故障隔离策略线程级隔离进程级隔离资源隔离故障隔离策略综合对比 什么是故障隔离&#xff1f; 故障隔离就是&#xff0c;把故障通过某种方式与其他正常模块进行隔离&#xff0c;以保证某一模块出现故障后&#xff0c;不会影响其他模…