首页 > 其他分享 >哈希

哈希

时间:2024-10-12 08:53:37浏览次数:1  
标签:head 哈希 val int mp key

哈希

常用于需要 \(O(1)\) 比较两个 \(O(n)\) 的东西。可以采用双模数减少冲突概率。

哈希冲突率的粗略计算:可以看做 \(\frac{n}{\prod mod}\)。

字符串哈希

常用于需要 \(O(1)\) 比较两个字符串,可以代替一些字符串匹配的 KMP 题目。以及可以使用哈希 + 二分的技巧 \(\log\) 的时间比较两个字符串的大小。

一般求出每个前缀的哈希值,然后子串哈希值就可以通过差分得到。

比较字符串大小的技巧是,二分第一个出现不同的位置,每次比较使用哈希判断,因此时间复杂度是 \(O(\log len)\) 的。

哈希表

如果不卡 \(\log\) 和常数的话可以使用 map,如果 key 值是标准类型可以使用 unordered_map,如果不是标准类型需要手写哈希函数比较麻烦,而且 STL 常数太大,不如自己手写哈希表。

哈希表的工作原理是对于一个 val 值计算哈希函数,存在桶里,如果不同 val 值的哈希值冲突,则以某种方式换一个地方存储。可以有效处理哈希冲突。

不过由于哈希函数的计算时间取决于 val 的长度,所以如果你需要映射一个数组等很长的东西,可能需要先使用双哈希算出数组的哈希,再把双哈希插入哈希表。

因为出题人不一定可以卡到你的模数,所以哈希表的操作可以看做 \(O(1)\) 的。

哈希表常用模数有 \(1e7+103\)。

拉链法

对于每一个 key 开一个链式前向星结构来处理冲突。比较好理解而且不难写。

板子代码。

const int sz=1e7+103;
struct _hash{
	int head[sz];
	int f(pii key) {
		return (key.fi+key.se)%sz;
	}
	struct _map {
		pii val;
		int key;
		int num;
		int ne;
	}mp[N];
	int cnt;
	void clear() {
		while(cnt) head[mp[cnt--].key]=0;
	}
	int find(pii key) {
		int h=f(key);
		for(int i=head[h];i;i=mp[i].ne) if(mp[i].val==key) return i;
		return 0; 
	}
	void insert(pii key) {
		int h=f(key);
		int it=find(key);
		if(it) mp[it].num++;
		else mp[++cnt]={key,h,1,head[h]},head[h]=cnt;
	}
	int operator [] (int it) const { return mp[it].num; }
}hashmp;

经验

20AB-day3 Good Subsegments

标签:head,哈希,val,int,mp,key
From: https://www.cnblogs.com/liyixin0514/p/18459723

相关文章

  • SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。
    SMB签名是ServerMessageBlock(SMB)协议中的一种安全机制,旨在确保数据的完整性和身份验证。1.什么是SMB签名?SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。它通过对数据进行哈希处理,并附加一个签名,确保接收方能够确认收到的数据没有被篡改。......
  • Redis 数据类型hash(哈希)
    目录1基本特性2主要操作命令 2.1设置和获取字段2.1.1 HSETkeyfieldvalue2.1.2 HGETkeyfield2.1.3 HMSETkeyfield1value1[field2value2...] 2.1.4 HMGETkeyfield1[field2...]2.2检查字段是否存在2.2.1 HEXISTSkeyfield2.3获取所有字段和......
  • 散列表(Hash table哈希表)应用案例
    文章目录散列表基础内容散列表的基本操作包括:散列表的关键组成部分:散列表的优点:散列表的缺点:实现散列表的方法1.散列函数的设计2.冲突解决策略3.重新哈希实现示例具体案例展示步骤:Python实现:输出结果:扩展功能:Python实现:输出结果:新增功能解释:进一步扩展:散列表......
  • 记录一道面试题(哈希表 稀疏矩阵)
    题目:有一个游戏中的三维地图,是由i,j,k三个轴组成的三维网络。每个立方体由不同的种类代表,比如空气,水,沙子,泥土。地图上方的空气方块,不会经常变动且数量占大多数,下方是各种类型的方块,会经常相互转换(水变沙子,沙子变泥土等)。问题:请你实现一个存储该地图的方案(地图方块和对应类型)。要......
  • 【JS】哈希法解决两数之和
    思路使用哈希法:需要快速查询一个元素是否出现过,或者一个元素是否在集合里时本题需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,符合要求的某元素是否遍历过,也就是是否出现在这个集合。因为要返回下标,所以使用Map集合,key存放元素值,value存放元素下......
  • 【模板】树哈希
    https://peehs-moorhsum.blog.uoj.ac/blog/7891题目描述对一棵树求hash值,以判断两棵树是否同构。有有根树和无根树两个版本。solution找一个随机函数\(f\)(可以选xor-shift),然后每个点的子树的哈希值如下计算:\[h_u=1+\sum_{v}f(h_v)\]这是有根树的情况,对于无根树,1.可以换......
  • 洛谷 P7469 [NOI Online 2021 提高组] 积木小赛(字符串哈希)
    题目传送门解题思路读题后,我们可以发现,字母串  只能从两边删除,于是我们可以枚举一个区间 ,然后在字母串  中匹配(可以用指针来进行匹配),同时可以做字符串哈希去重。注意如果怕被卡,可以用双模哈希;记得开longlong代码#include<bits/stdc++.h>usingnamespacestd;......
  • python3常用库之哈希hashlib和hmac使用
    hashlibimporthashlib#MD5是最常见的哈希算法,速度很快,生成结果是固定的128bit/16字节,通常用一个32位的16进制字符串表示。md5=hashlib.md5()md5.update("hello".encode())print(md5.hexdigest())#5d41402abc4b2a76b9719d911017c592#数据量很大时分块多次调用up......
  • 哈希表和字符串哈希算法
    哈希哈希表(HashTable)是一种数据结构,它可以通过一个哈希函数将键(key)映射到存储位置,从而实现高效的数据查找、插入和删除操作。哈希表的特点是能够在常数时间(O(1))内完成查找和更新,前提是哈希冲突处理得当。哈希表的基本结构数组:哈希表的底层通常是一个数组,数组中的每个元......
  • 代码随想录算法训练营第六天|Day6哈希表基础
    242.有效的字母异位词题目链接/文章讲解/视频讲解:https://programmercarl.com/0242.%E6%9C%89%E6%95%88%E7%9A%84%E5%AD%97%E6%AF%8D%E5%BC%82%E4%BD%8D%E8%AF%8D.html思路1.暴力的解法,两层为循环,很明显时间复杂度是O(n^2)。boolisAnagram(char*s,char*t){if(......