【字符串】Hash表
一.定义
哈希表是一种数据结构,它使用散列函数将数据存储在数组中,并使用哈希值快速查找数据。哈希表可以帮助我们快速插入、查找和删除数据,时间复杂度为O(1),因此它是一种非常高效的数据结构。哈希表通常用于实现数据缓存、字典和其他数据存储方案。(来源于ChitGPT)
二.制表
(1)十进制辅助理解
当我们拿到十进制数时,可以表达为这样
198=1*100+9*10+8;他的位权值分别为:100,10,1;
11451=1*+1*+4*+5*+1*
那为什么我们要乘以位权值呢?
因为十进制数不乘以位权值的话就是这样了:
678=6+7+8=21;
579=5+7+9=21;
那么21是表达678?还是579?
如果我们乘以位权值就可以巧妙的化解这个矛盾了。
(2)字符串
让我们回忆一下ASCII:
当我们看到97是就可以想到‘a’;
当我们看到100时就可以想到‘d’;
那么‘ad’怎么表示呢?
难道是97+100=197?但'bc'怎么表示呢?还是98+99=197。
那么197表示'bc'?还是'ad'?
这时我们就要想到上面的位权值思想了;
若有26个字母,我们把位权值定义为int B=26;
当拿到'ad'时就可以表达为97*+100*=2622;
'bc'=98*+99*=2647;
这样我们就能保证没有重复了,2622也只能表示为'ad'。
(3)用函数表达
定义s='abcd';和h[]数组。
可以定义成这样:
const int B=26;
char a[4]={0,'a','b','c'};
int h[4];
for(int i=1;i<=strlen(a);i++){h[i]=h[i-1]*B+a[i];
}
三.查找
(1)十进制辅助理解
我们知道当有一个数:114时,如果我们想拿到14就可以114-1*=14;
123456,我们想拿到456时就可以123456-123*=456;
这样我们可以总结出结论:
定义十进制数(非字符串,只是用abc表示)abcde,要求cd,因为len(cd)=2;
则cd=abcd-ab*
即abcd-ab*
ps:如果不理解可以自己画一画看看。
(2)字符串
先定义进制 int B=26;
当拿到‘abcde’,让我们求'de'的话:'abcde'-'abc'*
其他和十进制数一样,只是进制的区别
我们可以总结出规律:
定义字符串'abcde'当要求'cd'时就:
strlen(cd)=2;
'cd'='abcd'-'ab'*
即:'cd'='abcd'-'ab'*
(3)用函数表达
当总字符串是string s=0"abcd"; //0要把下标0的位置占了
求子字符串"cd"时:
len=cd.length()=2
"cd"=h[5]-h[5-len]*
即"cd"=h[5]-h[3]*
四.哈希冲突
(1)定义
指的是当两个或多个不同的数据具有相同的哈希值时发生的现象
(2)举个栗子
int(max)=2147483647;
int(min)=-2147483628;
所以2174783648超界会自动转换为-2147483648;
那么-2147483648不超界时也是-2147483648;
那么-2147483648是表达哪一个呢?
所以这就是hash冲突。
(3)解决方案
当我们把2个大数分别取模两个互质的数AB,这样得到的数ansa1,ansa2和ansb1,ansb2一定ansa1!=ansb1&&ansa2==ansb2,这样就巧妙的解决了hash冲突。(至于为什么要这样取模是数学领域研究的问题,可以记住结论就行)
一般我们分别取模1e9+7和1e9+9
具体应用见下一期:hash表的应用
五.总结
hash是处理字符串问题中不可缺少的元素,具体应用见下一期:hash表的应用
【字符串】Hash表相关推荐
- 0x14.基础数据结构 — hash表与字符串hash
目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...
- hash表--c语言 字符串键值配对——(key, value)
c语言键值配对--(key, value) 看一个C++项目时,其中解析配置文的部分引发了我的思考. 配置文件问普通字符文件,内容都是类似 如下: ipaddr=127.0.0.1 port=888 ...
- luogu4407 [JSOI2009]电子字典 字符串hash + hash表
暴力枚举,然后\(hash\)表判断 复杂度\(O(26 * 20 * n)\) 具体而言 对于操作1:暴力枚举删除 对于操作2:暴力添加,注意添加不要重复 对于操作3:暴力替换,同样的注意不要重复 ...
- 从头到尾彻底解析Hash表算法
从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26 阅读: 25156 次 推荐: 14 原文链接 [收藏] 作者:July.wuliming.pkuoliv ...
- 转 从头到尾彻底解析Hash表算法
出处:http://blog.csdn.net/v_JULY_v. 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部 ...
- 字符串Hash的原理与应用
字符串Hash无论是在ACM竞赛中还是在工程中都有着广泛的应用,所以很有必要掌握好它的用法.主要分为两个部 分:Hash映射和冲突处理.而本文主要来详细讲解Hash映射的方法及应用,下篇文章将会介绍如 ...
- 原创:PHP内核研究:HASH表和变量
PHP HASH表 在PHP中,所有的数据 无论变量,常量,类,属性 都用Hash表来实现. 先要说说 HASH表 [c]typedef struct bucket { ulong h; /* Use ...
- java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...
1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...
- Hash表——省市(洛谷 P3405)
题目选自洛谷P3405 因为值和前两个字母有关系,所以对每个字符串只保留前两个字母,相当于有N个二元组 <ai,bi>,问<ai,bi> = <bi,ai> 的(i ...
最新文章
- 在Web页面上启动运行Linux系统
- codevs2693 上学路线(施工)
- MIP改造常见问题二十问
- 用API OleLoadPicture通过IStream来加载JPG、GIF格式的图片
- Linux学习之内核模块编程
- oracle日期的sql,Oracle中一些和日期有关的SQL查询
- implements Serializable有什么作用
- HBase的rowKey设计技巧
- python自动点击网页按钮_python网页自动化操作
- 超市购物管理系统php,超市进销存管理系统PHP源码
- 欢迎页面welcome.jsp
- Linux环境下进行本地Blast比对——操作流程
- 单调队列优化dp--bzoj5185: [Usaco2018 Jan]Lifeguards
- 初中数学分几个模块_初中数学分成三大模块
- PNAS|助人为乐—助人行为能减轻自身身体疼痛
- shing boot 做session共享 redis
- windows实战Git环境配置msysGit+TortoiseGit(zz)
- 2018青岛大学计算机考研真题,2018年青岛大学数学科学学院657数学分析考研基础五套测试题...
- checkBox 选中 移除
- MySQL学生综合测评系统_大学生综合测评系统的设计和实现(MySQL)
热门文章
- 基于流向算法的WSN覆盖优化
- LSTM论文翻译-《Understanding LSTM Networks》
- 安装node.js(‘npm‘ 不是内部或外部命令,也不是可运行的程序)
- 云豹短视频app源码中,标签选择功能的实现
- python imp模块
- Seurat的normalization和scaling
- Dennard scaling(MOSEFT scaling)
- Flex for .NET platform
- 第六节 交叉分析和非参数检验
- 橙色的商务企业网站模板 html整站下载 企业网站模板