哈希-

构造哈希表以及二次探测法 构造哈希表(散列表)以及二次探测法 今天做笔试题时,遇到一道构造哈希表的题,hash函数是 k%11 ,然后一个数组记不清了,然后就是问二次探测法进行,问下面那个是正确,懵逼啊,没做过,不知道,乱选直接下一题,于是有这个博客,赶紧学习一波。 网上查询了一下。 构造哈希表的几种方法 常用方法是直接定址法和除留余数法 直接定址法(取关键字的某个线性函数为哈希地址) 类似于这样的... 阅读详情

哈希表:https://oi-wiki.org/ds/hash/

目录

一、存储结构

1.开放寻址法

2.拉链法

二、字符串哈希


哈希表(一种期望算法):1.存储结构---1)开放寻址法  2)拉链法 xmodk k是一个质数且k远离2^n
    O(1)                  2.字符串哈希方式
    添加(h[x])、查找(h[x])、删除(一般不删,开一个额外的数组,标记要删除的数组)
    

一、存储结构

题目来源:Acwing---840-模拟散列表

题目描述:

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

I x,插入一个数 x;
Q x,询问数 x 是否在集合中出现过;
现在要进行 N 次操作,对于每个询问操作输出对应的结果。

输入格式
第一行包含整数 N,表示操作数量。

接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q 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后如果有就往后找,有空的就存里面
                查找:取mod后,从前往后找,如果=x就找到,空的话就没有
                删除:一般不删,开一个额外的数组,标记要删除的数组

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;
const int N=200003,null=0x3f3f3f3f;////N一般开两倍且为质数

int h[N];

int find(int x){	//如果x在哈希表中,返回x的位置;如果x不在哈希表中,返回x应该存储的位置
	int k=(x%N+N)%N;
	while(h[k]!=null&&h[k]!=x){
		k++;
		if(k==N)k=0;
	}
	return k;
}
int main(){
	int n;
	cin>>n;
	memset(h,0x3f,sizeof h);
	while(n--){
		char op[2];
		int x;	
		cin>>op>>x;
		int k=find(x);
		if(op[0]=='I')h[k]=x;
		else{
			if(h[k]!=null)puts("Yes");
			else puts("No");
		}
	}	
}

2.拉链法

#include<iostream>
#include<cstring>
using namespace std;
const int N=100003;
int h[N],e[N],ne[N],idx;
void insert(int x){
	int k=(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(){
	int n;
	cin>>n;
	memset(h,-1,sizeof h);
	while(n--){
		char op[2];
		int x;	
		cin>>op>>x;
		if(op[0]=='I')insert(x);
		else{
			if(find(x))puts("Yes");
			else puts("No");
		}
	}	
}

二、字符串哈希

步骤:

1.把字符串看成p进制的数(可以把字符串转换成数字)
    eg:ABCD --- A:1 B:2 C:3 D:4    
2.把p进制的数转换成10进制的数    eg: ABCD=1*p^3+2*p^2+3*p^1+4*p^0
3.取mod    eg: ABCD=(1*p^3+2*p^2+3*p^1+4*p^0)%mod ---将ABCD映射成从0~mod-1的数


注意:1.  一般情况下:不能把某个字母映射成0        --eg: a:0  则 aa=0、aaa=0

           2. 假定我们人品足够好,不存在冲突,有经验值,当p=131或者p=13331,mod取2^64,这种方式99.99%不会出现冲突。

以上哈希方式+前缀哈希的好处:可以利用前缀哈希计算出任意子串的哈希值
    eg: 有一个长度为n的字符串,已知h[r],h[l-1],求l~r的hash
        h[r]
        h[l-1]*p^(r-l+1)//左移,和h[r]对齐
        h[l~r]=h[r]-h[l-1]*p^(r-l+1)
        unsigned long long 存储h,unsigned long long会溢出,相当于mod2^64。

哈希字符串作用:可以快速判断两个字符串是否相同(如下)

题目来源:Acwing---841-字符串哈希

问题描述:

代码如下:

//字符串前缀哈希法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
const int N=100010,P=131;
int n,m;
char str[N];
ULL h[N],p[N];//h[i]: 前i个字符的哈希值,前0个字符的哈希值是0
ULL get(int l,int r){
	return h[r]-h[l-1]*p[r-l+1];
}
int main(){
	scanf("%d%d%s",&n,&m,str+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;
}

C++ 中使用哈希表(unordered_map)的常用操作 //建立基本数据类型的哈希表 unordered_map<int,int> m; //<string,string>,<char,char> //向哈希表中添加元素 1.insert 函数 m.insert(pair<int,int>(1, 10)); m.insert(pair<int,int>(2, 20)); 2.用数组方法直接添加 m[3]=30; m[4]=40; //begin(),end() m.begin() //指向哈希表的第 阅读详情

相关推荐

AcWing 840. 模拟散列表

题目来源:AcWing 840. 模拟散列表 一、题目描述 维护一个集合,支持如下几种操作: I x,插入一个数 xxx; Q x,询问数 xxx 是否在集合中出现过; 现在要进行 NNN 次操作,对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 NNN,表示操作数量。 接下来 NNN 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。 输出格式 对于每个询问指令 Q x,输出一个询问结果,如果 xxx 在集合中出现过,则输出 Yes,否则输出 No。 每个结果占一行。 数据范围

郭松源的博客 1079

哈希表基础入门

索引 哈希表的概念 哈希函数的构造方法 处理冲突的方法 哈希表的实现 哈希表的查找性能 4.1、哈希表的概念 把关键字集合*K*到一个有限的连续的地址集(区间)D的映射关系表示为: K为主关键字集合,H称为哈希函数或散列函数。按哈希函数构建的表称为哈希表。D的大小m称为哈希表的地址区间长度。 先看一个简单的例子: 假设要建立一个地址区间长度为13的哈希表,哈希函数为 其中函数Ord为求字母再在字母表中的序号。例如,字母A在字母表中的序号为Ord(‘A’)=1。现将关键字依次为Zhao、Qian、Sun

Nulidebaibai的博客 5739

相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)

图像相似度比较哈希算法: 什么是哈希(Hash)? • 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定 下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums, 或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。 • 通过哈希算法得到的任意长度的二进制值映射为较短的固定长度的二进制

瞳瞳瞳呀 4206

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

查找算法【哈希表】 - 处理冲突的方法:开放地址法-二次探测法 & 随机探测法 & 再散列法

代码改变世界 1万+

密码学之哈希算法

1 哈希算法 哈希算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。 哈希算法又称为摘要算法,它可以将任意数据...

star_yang的博客 1万+

密码学基础(一)——哈希算法

由于哈希算法的单向性,可以从前一个数据块原文计算出下一个数据块所用的哈希值输入,但已知一个哈希值输入,难以反推出所有可能的数据块原文。哈希算法:哈希算法不可逆,包括:MD4、MD5、hash1、ripeMD160、SHA256、SHA3、Keccak256、国家标准SM3(国家密码管理局)哈希加“盐”(salt),所谓加“盐”,就是在明文的随机位置加上一串随机的字符串再进行hash,防止彩虹表攻击。加密/解密算法:加密解密算法可逆,但是必须要有秘钥,对称加密,非对称加密,数字签名算法DSA。

奔跑的蜗牛_Kieasr 7910

计算与数据结构篇 - 哈希算法 (Hash)

计算与数据结构篇 - 哈希算法 (Hash) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法) 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大...

stark张宇 1万+

C++哈希算法详解(hash、hash!)

C++哈希算法详解

2401_90042730的博客 1977

哈希算法

对于哈希算法,在我们平时的开发中,都是基本上拿来就用就行了,所以这节我们将重点放在如何使用,并不进行哈希算法的原理剖析和如何设计一个哈希算法的讲解. 什么是哈希算法? 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值(散列值).一个优秀的哈希算法需要满足: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)...

Tattoo的博客 4万+

【算法】理解哈希算法 hash 和常见应用

概念 将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是 哈希算法。 通过原始数据映射之后得到的二进制值串就是 哈希值。 要求 从哈希值不能反向推导出原始数据 对输入数据非常敏感,一个 Bit 修改得到的哈希值也大不相同 散列冲突的概率要很小 执行效率高效 常见应用 安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。 后三个应用均与分布式系统有关。 下面...

scxyz的博客 2927

相场断裂模型中的各向异性机制:从裂纹密度到驱动力的数值实现

断裂力学是研究材料在载荷作用下裂纹萌生与扩展规律的基础学科,其核心在于理解材料失效的能量准则与路径选择。传统方法通常预设裂纹路径,而相场断裂模型通过引入连续的相场变量,将裂纹模拟转化为一个能量最小化问题,能够自发预测裂纹的萌生、扩展与分叉,在工程失效分析中具有重要价值。当材料具有显著的方向依赖性时,如单晶、复合材料或轧制金属板,各向同性假设会失效,此时需引入各向异性机制。该机制的核心在于改造两个关键部分:一是裂纹密度函数,通过引入各向异性张量来定义不同方向上形成裂纹微结构的能量成本;二是临界能量释放率(断裂

weixin_31421613的博客 298

识别哈希算法类型hash-identifier

识别哈希算法类型hash-identifier hash-identifier是一款哈希算法识别工具。通过该工具,用户可以识别哈希值所使用的哈希算法。确定算法后,就可以采用对应的工具进行xx。执行该命令如下所示: root@daxueba:~# hash-identifier 输出信息如下所示: ############################################...

大学霸__IT达人 1967

【现代电路理论】【2】考尔法设计无源单口网络

夏 弥:其实你在冰面上看到鱼浮上来 明年冬天如果你还在那里,那鱼还是会上来换气 那时候你就可以带一把冰镐 把冰面砸开把鱼捞上来熬汤

痛苦的时候装出幸福相,这不是那么难做到的事 2888

必学算法——哈希算法

哈希算法是必须掌握的一种基础算法,在一些比较出名的竞赛acm、蓝桥杯,并且在一些公司面试题中都可能会出现,而且作为简单题我们必须要拿下,所以我们要引起重视,下面让我们来深入了解哈希算法。哈希算法,也称为散列算法,是一种数学函数或算法,它能够将任意长度的数据(称为“消息”)转换为固定长度的字符串(称为“哈希值”或简称“哈希”)。学习算法是一个很艰难,漫长的过程,我们要克服一切困难,学习算法本就是由易到难,我相信通过我们坚持不懈的努力一定能理解并熟练掌握其中细节,加油,我相信你一定能行。

ycs66的博客 5290

ClearML中文文档实战:从安装到第一个实验的保姆级教程

本文提供ClearML从零开始的实战指南,涵盖核心组件理解、Python SDK安装、服务器配置及首个自动化实验的完整流程。通过改造PyTorch训练脚本的实例,详细演示了如何利用ClearML自动记录实验参数、指标与模型,实现机器学习实验的可复现性与高效管理,并简要介绍了进阶的自动化工作流。

weixin_29216049的博客 398

从‘裸纤’到成品:手把手拆解光纤阵列(FA)的装配、点胶与端面研磨全流程

本文详细拆解了光纤阵列(FA)从裸纤到成品的全流程,包括装配、点胶与端面研磨等关键工艺。通过实战经验和数据对比,揭示了5G基站、数据中心等场景中FA的精密制造要点与常见故障解决方案,为光通信器件生产提供专业指导。

weixin_42652674的博客 751

【18】哈希算法

18 哈希算法1. 什么是哈希算法?2. 哈希算法的常见应用有哪些?3. 思考4. 参考资料5. 声明 1. 什么是哈希算法? 定义 将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 如何设计一个优秀的哈希算法? 1)单向哈希: 从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。 2)篡改无效: 对输入敏...

Jock2018的博客 1602

【A_Star三维路径规划】基于matlab A_Star算法结合B样条平滑三维地形路径规划(含雷达威胁)【含Matlab源码 3527期】

A_Star算法结合B样条平滑三维地形路径规划(含雷达威胁) 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 743

哈希(Hash)算法

Hash算法的通俗理解,简单的自定义Hash算法,Hash值有限问题(Hash值冲突)的解决办法,Hash算法的解密的原理

weixin_45777235的博客 6114

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

【WRF-Urban】使用 NUDAPT 数据集与 BEP/BEP_BEM 方案的 WRF 配置指南

WW、forever的博客 1964

PCL DBSCAN密度聚类【2026最新版】

点云密度聚类的PCL代码实现,与matlab自带的密度聚类算法进行对比验证,结果一致。3万多个点能再2秒左右运行出结果,算法效率尚可。

点云侠的博客 5682

kali工具集-hash-identifier哈希算法识别

本实验旨在通过实际操作,掌握常见哈希算法(如 MD5、SHA-1、SHA-256)的生成方法,并使用 hash-identifier 工具对哈希值进行识别。同时,了解不同哈希算法输出长度的区别,以及如何批量识别多个哈希值。实验还进一步探讨了加盐哈希的生成与识别,分析 hash-identifier 在面对加盐哈希时的局限性。

qq_46487664的博客 1680

别再只当调包侠了!YOLO检测头到损失函数全链路拆解,看完才算真懂

YOLO的精妙不在于某个单一创新,而在于各模块围绕“实时精准检测”这一目标的协同设计。Backbone追求高效特征压缩,Neck保障多尺度信息流通,Head解耦任务冲突,Loss动态引导优化方向。只有理解这套内在逻辑,才能跳出“调包-试错”的低效循环,在面对新场景、新问题时做出有理有据的改进决策。技术深度决定职业天花板。下次再调YOLO时,不妨先问自己:我改的这个参数,到底影响了系统中的哪一环?参考资料。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 186

【hash】哈希算法、哈希碰撞、一致性哈希

一、hash算法 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 哈...

鲜衣怒马楼兰月 4579

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

哈希算法简介

哈希算法 RToax 2020年9月 哈希算法(Hash 算法,Hash 算式,散列算法,消息摘要算法) 1. 什么是哈希算法 哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。 2. 哈希算法的特点 哈希表是根据设定的

RToax 3555

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

哈希算法(Hash)

哈希算法是将输入数据转换为固定长度哈希值的算法,具有确定性、快速计算、冲突抵抗性、雪崩效应和单向性的特点。哈希算法在数据校验、密码存储、数字签名、哈希表、区块链等众多领域有着广泛的应用。

宋发元 1488

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 堆(不是STL中的堆)
下一篇: 最大异或对--Acwing143
01star️
博客等级 码龄3年 96粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值