一.定义

哈希表是一种数据结构,它使用散列函数将数据存储在数组中,并使用哈希值快速查找数据。哈希表可以帮助我们快速插入、查找和删除数据,时间复杂度为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表相关推荐

  1. 0x14.基础数据结构 — hash表与字符串hash

    目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...

  2. hash表--c语言 字符串键值配对——(key, value)

    c语言键值配对--(key, value) 看一个C++项目时,其中解析配置文的部分引发了我的思考. 配置文件问普通字符文件,内容都是类似 如下: ipaddr=127.0.0.1 port=888 ...

  3. luogu4407 [JSOI2009]电子字典 字符串hash + hash表

    暴力枚举,然后\(hash\)表判断 复杂度\(O(26 * 20 * n)\) 具体而言 对于操作1:暴力枚举删除 对于操作2:暴力添加,注意添加不要重复 对于操作3:暴力替换,同样的注意不要重复 ...

  4. 从头到尾彻底解析Hash表算法

    从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26  阅读: 25156 次  推荐: 14   原文链接   [收藏]   作者:July.wuliming.pkuoliv ...

  5. 转 从头到尾彻底解析Hash表算法

    出处:http://blog.csdn.net/v_JULY_v.   说明:本文分为三部分内容,     第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部 ...

  6. 字符串Hash的原理与应用

    字符串Hash无论是在ACM竞赛中还是在工程中都有着广泛的应用,所以很有必要掌握好它的用法.主要分为两个部 分:Hash映射和冲突处理.而本文主要来详细讲解Hash映射的方法及应用,下篇文章将会介绍如 ...

  7. 原创:PHP内核研究:HASH表和变量

    PHP HASH表 在PHP中,所有的数据 无论变量,常量,类,属性 都用Hash表来实现. 先要说说 HASH表 [c]typedef struct bucket { ulong h; /* Use ...

  8. java hash取余_为什么Java的hash表的长度一直是2的指数次幂?为什么这个(hash(h-1)=hash%h)位运算公式等价于取余运算?...

    1.什么是hash表? 答:简单回答散列表,在hash结构散列(分散)存放的一种数据集结构. 2.如何散列排布,如何均匀排布? 答:取余运算 3.Java中如何实现? 答:hash&(h-1) ...

  9. Hash表——省市(洛谷 P3405)

    题目选自洛谷P3405 因为值和前两个字母有关系,所以对每个字符串只保留前两个字母,相当于有N个二元组 <ai,bi>,问<ai,bi> = <bi,ai> 的(i ...

最新文章

  1. 在Web页面上启动运行Linux系统
  2. codevs2693 上学路线(施工)
  3. MIP改造常见问题二十问
  4. 用API OleLoadPicture通过IStream来加载JPG、GIF格式的图片
  5. Linux学习之内核模块编程
  6. oracle日期的sql,Oracle中一些和日期有关的SQL查询
  7. implements Serializable有什么作用
  8. HBase的rowKey设计技巧
  9. python自动点击网页按钮_python网页自动化操作
  10. 超市购物管理系统php,超市进销存管理系统PHP源码
  11. 欢迎页面welcome.jsp
  12. Linux环境下进行本地Blast比对——操作流程
  13. 单调队列优化dp--bzoj5185: [Usaco2018 Jan]Lifeguards
  14. 初中数学分几个模块_初中数学分成三大模块
  15. PNAS|助人为乐—助人行为能减轻自身身体疼痛
  16. shing boot 做session共享 redis
  17. windows实战Git环境配置msysGit+TortoiseGit(zz)
  18. 2018青岛大学计算机考研真题,2018年青岛大学数学科学学院657数学分析考研基础五套测试题...
  19. checkBox 选中 移除
  20. MySQL学生综合测评系统_大学生综合测评系统的设计和实现(MySQL)

热门文章

  1. 基于流向算法的WSN覆盖优化
  2. LSTM论文翻译-《Understanding LSTM Networks》
  3. 安装node.js(‘npm‘ 不是内部或外部命令,也不是可运行的程序)
  4. 云豹短视频app源码中,标签选择功能的实现
  5. python imp模块
  6. Seurat的normalization和scaling
  7. Dennard scaling(MOSEFT scaling)
  8. Flex for .NET platform
  9. 第六节 交叉分析和非参数检验
  10. 橙色的商务企业网站模板 html整站下载 企业网站模板