首页 > 其他分享 >[学习笔记]哈希与哈希表

[学习笔记]哈希与哈希表

时间:2024-02-20 15:12:57浏览次数:26  
标签:Hash 函数 res 笔记 学习 次方 哈希 字符串

1.定义

我们定义一个把字符串映射到整数的函数 \(f\),这个 \(f\) 称为是 Hash 函数。

我们希望这个函数 \(f\) 可以方便地帮我们判断两个字符串是否相等。

词汇“映射”

映射意为将一个集合中的任意元素和另一个集合中的元素一一对应。(请大佬指正)

2.思想

Hash 的核心思想在于,将输入映射到一个值域较小、可以方便比较的范围,也就是为了让两个字符串更加容易比较(感谢大佬yeyou26的指正)。

Warning

这里的「值域较小」在不同情况下意义不同。

3.性质

具体来说,哈希函数最重要的性质可以概括为下面两条:
\(1.\)在 Hash 函数值不一样的时候,两个字符串一定不一样;
\(2.\)在 Hash 函数值一样的时候,两个字符串不一定一样(但有大概率一样,且我们当然希望它们总是一样的)。
我们将 Hash 函数值一样但原字符串不一样的现象称为哈希碰撞。

引申:哈希碰撞

例子: $ K_{i} \neq K_{j} $
Hash( Ki) == Hash( Kj)
该种现象称为哈希冲突或哈希碰撞。
把具有不同关键码而具有相同哈希地址的数据元素称为“同义词”。

如何计算哈希

Warning:以下数学表达式较多,但有通俗易懂的解释,不要慌张。
计算哈希我们通常采用的是多项式 Hash 的方法,但是本蒟蒻并不会使用第一种,故使用第二种。
公式:

看公式,求和1~l s3*自定义变量b的i-1次方的值,所以xyz的哈希值为

我们假设b为3,则有
当i为1时,处理x,由于s[i]b的i-1次方,而i=1,故值为0;
当i为2时,处理y,由于由于s[i]
b的i-1次方,而i=2,故值为1;
当i为3时,处理z,由于s[i]*b的i-1次方,而i=3,故值为2;
1+2=3,所以该字符串哈希值为3。
当然,最后结果还要Mod(模)M。

根据上方一次酣畅淋漓地推理,相信你已经看懂了过程,接下来讲述如何选择公式中的b与M
这里 M 需要选择一个素数(至少要比最大的字符要大),b 可以任意选择。因为如果M不为素数,为约数,哈希碰撞(上文提到过)的可能性会大大提升。

Hash 的准确率

懒得写了qwq(bushi)
管他干嘛?

实现

效率低下但容易理解的版本
int gethash(string s)
int res=0;
for(int i=0;i<s.size();i++)
res = ((long long)res * B + s[i]) % M;
return res;
这个程序最关键的一步就是res = ((ll)res * B + s[i]) % M;套公式
当然我不是那种写显然的人,但剩下步骤真的很好理解!!!

以上就是无任何优化的哈希计算方法详解,感谢大佬观看。
接下来还会完善,不要着急.

标签:Hash,函数,res,笔记,学习,次方,哈希,字符串
From: https://www.cnblogs.com/Doraemon-Blog/p/18023012

相关文章

  • 热辣滚烫,Salesforce开发入门指南:零基础学习宝典!
    开发人员将Salesforce组织扩展到声明式配置之外,构建应用程序,进而优化业务运营。Salesforce开发人员通常会使用两种编程语言:Apex和JavaScript。然而,Salesforce开发不仅仅只包括代码。为了在职业道路上脱颖而出,开发人员还需要了解声明性功能,将组织的设计和性能保持最佳状态。Sal......
  • 深度学习学习一
    深度学习(DL,DeepLearning)是机器学习(ML,MachineLearning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标——人工智能(AI,ArtificialIntelligence)。深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字,图像和声音等数据的解......
  • Go语言精进之路读书笔记第30条——使用接口提高代码的可测试性
    Go语言有一个惯例是让单元测试代码时刻伴随着你编写的Go代码。单元测试是自包含和自运行的,运行时一般不会依赖外部资源(如外部数据库、外部邮件服务器等),并具备跨环境的可重复性(既可在开发人员的本地运行,也可以在持续集成的环境中运行)。30.1实现一个附加免责声明的电子邮件发送函......
  • 做题笔记 III
    \(1\sim100\)的题目在做题笔记II。\(\texttt{Le0**an}\):我写了四篇做题笔记、一篇生成函数详解和一篇模拟赛复盘了!\(\texttt{xl****13}\):我写了零篇做题笔记了!!!111\(101\sim125\)\(\color{blue}(101)\)ARC172ELast9Digits难度\(^*2400\)。数论抽象题。有一个结......
  • Sentinel 源码学习
    引入依赖<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.7</version></dependency>基本用法try(Entryentry=SphU.entry("HelloWorld")){......
  • XSimGCL论文阅读笔记
    Abstract我们提出了一种非常简单的图对比学习方法作为推荐,该方法放弃了无效的图增强,而是使用一种简单而有效的基于噪声的嵌入增强来生成CL的视图Introduction这里介绍以下SimGCL的缺点:除了推荐任务的正向/反向传递外,每个小批内的对比任务还需要两个额外的正向和反向传递,也就是......
  • Kotlin学习, 新手向,变量总汇,基于《第一行代码Android(第三版)》
    作者做的思维导图变量val和var区别valvalue不可变变量varvariable可变变量变量的自动类型推导(弱)vala=10;print("a="+a);变量的显式声明(强)vala:Int=10;数据类型注意和java不同,这些都是对象数据类型,大写开头:IntShortLongFloatDoubleB......
  • 互联网信息服务算法推荐管理规定 (全文学习)2022年01月04日 本规定自2022年3月1日起施
    互联网信息服务算法推荐管理规定第一章总则第一条 为了规范互联网信息服务算法推荐活动,弘扬社会主义核心价值观,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,促进互联网信息服务健康有序发展,根据《中华人民共和国网络安全法》、《中华人民共和国数据安全法......
  • Godot学习中的问题及思考、学习笔记 03
    GameManager类在Godot项目中通常扮演着游戏管理器的角色,负责协调游戏内不同系统、状态和数据的管理。它是一种设计模式,用于集中管理游戏逻辑和状态,使得游戏的结构更加清晰,也便于维护和扩展。GameManager可以处理多种任务,包括但不限于:游戏状态管理:控制游戏的当前状态,比如开始......
  • 上海市促进 人工智能产业发展条例 (全文学习)2022年10月01日 本条例自2022年10月1日
    上海市促进人工智能产业发展条例(2022年9月22日上海市第十五届人民代表大会常务委员会第四十四次会议通过)第一章 总则  第一条 为了促进人工智能产业高质量发展,强化新一代人工智能科技创新策源功能,推动人工智能与经济、生活、城市治理等领域深度融合,打造人工智能世界级产业......