胡凡《算法笔记》总结2——Hash散列

目录

1.定义及本质

2.基本概念

性质

3.经典实例

3.1常用HASH函数

3.2构造方法


1.定义及本质

散列是常用的算法思想之一,散列的本质是一种数学映射,是输入(input)通过散列函数(hash function)映射到输出(output)的一种压缩变换。

百科上是这样介绍散列的:

关联数组是这样的数组,它的每个数据元素与一个键相对配对,该键用于识别数据元素。由于散列函数用来创建关联数组中的指定元素,并在关联数组中查找指定元素,因此关联数组通常称为散列。在某种意义上,数组元素与列表类似,而散列元素的存放与几何类似,其元素之间没有相对次序。在Ruby中,数组与散列之间的两个最本质的区别是:数组使用数值下标来定位特定的元素,而散列使用字符串值(键)来定位元素;数组中的元素按下标排序,而散列中的元素则不是。散列的创建方法有两种:new方法或将一个字面量赋值给一个变量。

准确地说,数组是数字下标与数值的映射,而散列则是任何类型的数字/字符/字符串都可以进行相关映射,来定位元素。无论从范围还是内涵上,散列都具有更一般的含义。

关于散列函数,定义如下:

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

2.基本概念

  • 若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个事先建立的表为散列表
  • 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表散列,所得的存储位置称散列地址
  • 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。

性质

所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。

典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的一一对应。一一对应的散列函数也称为排列。可逆性可以通过使用一系列的对于输入值的可逆“混合”运算而得到。

3.经典实例

先来看一个简单例子:给出N个正整数,再给出M个正整数,问这M个数中的每一个数分别是否在N个数中出现过。

最朴素的思路是将M中的每个元素在N个元素的数组中挨个查找,找到说明存在;找不到说明不存在。这种情况下的时间复杂度位O(N*M)。这种方法的弊端是如果数据量太大,比如达到10^5级别,时间效率就会变得极低。

还可以采用先将N个元素快速排序,在采用二分查找的方法,这种方法会提高效率。但是如果数据过多,快排和查找的时间就会比较长。这种情况下可以开辟一个数组。比如我们有一个字符串,就可以开辟一个a[128]的数组,数组初始化为0,然后查找,凡是出现过的字符,都记录为1,这样再判断下一个字符时,就可以根据是否为0就可以判断该字符之前是否出现过。

浏览网页时,键入的网址(WWW)会通过DNS解析:DNS resolution 转化成IP地址(比如:199.24.123.34)。DNS解析的过程就是散列函数的映射和变换。

3.1常用HASH函数

·直接取余法:f(x):= x mod maxM ; maxM一般是不太接近 2^t 的一个质数。

·乘法取整法:f(x):=trunc((x/maxX)*maxlongit) mod maxM,主要用于实数。

·平方取中法:f(x):=(x*x div 1000 ) mod 1000000); 平方后取中间的,每位包含信息比较多。

3.2构造方法

散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。

(详细构造方法可以参考hash函数中的【哈希表的构造方法】)

1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)

2. 数字分析法

3. 平方取中法

4. 折叠法

5. 随机数法

6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《算法笔记》是一本由胡凡撰写的计算机科学书籍,该书主要介绍了一些常见的算法和数据结构,并且给出了相应的代码实现。 胡凡的代码非常简洁清晰,注释详细。他的代码实现旨在提供读者一个易于理解和实现的参考模板,以提高读者对算法和数据结构的理解和应用能力。 《算法笔记》的代码实现涵盖了众多经典的算法和数据结构,如排序算法、图算法、动态规划等。通过学习这些代码,读者可以更好地理解算法的思想和设计方法。 此外,胡凡的代码实现还包括一些实际应用的案例,这使得读者能够将所学的算法和数据结构应用到自己的项目中。通过实际的案例,读者可以进一步加深对算法的认识,并学会如何将算法应用到实际问题中解决。 总的来说,胡凡的代码实现非常有参考价值,对于算法和数据结构的学习和应用都具有很大的帮助。他的代码简洁清晰,容易理解和实现,是学习算法的一本不可多得的好书。 ### 回答2: 《算法笔记》是由胡凡编写的一本关于算法的学习资料。这本书主要介绍了算法的基本概念、常见的算法思想和常用的算法模板。胡凡是一位算法领域的专家,他将自己多年的学习和研究经验融入其中,旨在帮助读者更好地理解算法的本质和应用。 在《算法笔记》中,胡凡通过清晰明确的语言和丰富多样的示例,向读者介绍了常见的排序算法、查找算法、图算法等等。同时,他还特别强调了算法的时间复杂度和空间复杂度分析的重要性,以及如何通过优化算法提升程序的效率。这对于想要提高编程水平的读者来说是非常有价值的。 胡凡的代码也是《算法笔记》的重要内容之一。他以Python为主要编程语言,用简洁而易懂的代码实现了书中介绍的各种算法。这些代码通常具有较高的复用性和可读性,既能够帮助读者理解算法的具体实现逻辑,也可以作为实际项目中的参考代码。 总之,《算法笔记》是一本很好的算法学习资料,它通过详细的讲解和清晰的代码示例,帮助读者建立了对算法的深入理解。无论是初学者还是有一定经验的程序员,都可以从中获得很多有价值的知识和技巧。通过不断地学习和实践,读者可以在编程中灵活应用这些算法,提高自己的编程水平。 ### 回答3: 《算法笔记》是一本非常经典的算法教材,由胡凡和曾磊合著。书中详细介绍了各种常见的算法及其实现方法,对算法的思想和原理进行了深入剖析,为读者提供了全面的学习指南。 在《算法笔记》中,作者以清晰的逻辑和简洁的代码,让读者了解算法设计的基本原则和常见的解题思路。胡凡的代码是书中的重要组成部分,通过实例和案例,读者可以深入理解算法的实际应用,同时也能掌握用代码实现各种算法的技巧。 胡凡的代码非常精炼和高效,他在编写代码时注重算法的时间和空间复杂度,以求得最优解。无论是经典算法的实现,如排序算法、贪心算法,还是动态规划、图算法等高级算法胡凡的代码都能给读者带来很多启发和思考。 此外,胡凡的代码还注重代码复用和模块化设计,他通过定义适当的数据结构和函数,使得代码结构清晰,易于理解和修改。这有助于读者在实际项目中灵活运用算法,并提高编码的质量和效率。 总之,《算法笔记》中胡凡的代码是一道亮丽的风景线,它不仅仅是学习算法的工具,更是一本智慧的结晶。通过学习胡凡的代码,读者可以提升自己的算法水平,拓宽思维的广度和深度,从而在日后的工作和学习中取得更好的成果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吉大秦少游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值