|
|
|
|
移动端

1.13 Hash(哈希)

《程序员面试笔试真题与解析》本书针对当前各大 IT企业面试笔试中特性与侧重点,精心挑选了 3年以来近百家典型 IT企业的面试笔试真题,这些企业涉及业务包括系统软件、搜索引擎、电子商务、手机 APP、安全关键软件等,面试笔试真题非常具有代表性与参考性。本节为大家介绍Hash(哈希)。

作者:猿媛之家来源:机械工业出版社|2017-12-06 17:37

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


1.13 Hash(哈希)

【真题 191】下面属于构造散列函数的方法是( )。

A.直接定址法  B.数字分析法  C.除留余数法  D.平方取中法

答案:A、B、C、D。

常用的构造哈希函数的方法有:直接定址法、数字分析法、平方取中法、折叠法、除留余数法和随机数法。以下将分别对这几种方法进行介绍。

1)直接定址法:取关键字或关键字的某个线性函数值为哈希地址。例如: H(key)=a*key+b,其中, a和 b为常数。

2)数字分析法:假设关键字是以 r为基数(例如:以 10为基的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。

3)平方取中法:取关键字平方后的中间几位作为哈希地址。

4)折叠法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和作为哈希地址。

5)除留余数法:取关键字被某个小于或等于哈希表长 m的数 p除后所得的余数作为哈希地址。(f(key) = key mod p (p≤m),m为散列表长)

6)随机数法:选择一个随机函数,取关键字的随机函数值作为它的哈希地址。

【真题 192】假设有 n个关键字具有相同的 Hash函数值,则用线性探测法把这 n个关键字映射到 Hash表中需要执行的线性探测次数为()。

A.n2 B.n*(n+1) C.n*(n+1)/2 D.n*(n-1)/2答案:D。开放定址法就是从发生冲突的那个单元开始,按照一定的次序,从哈希表中找出一个空闲的存储单

元,把发生冲突的待插入关键字存储到该单元中,从而解决冲突。在哈希表未填满时,处理冲突需要的“下一个”空地址在哈希表中解决。开放定址法利用下列公式求“下一个”空地址:

Hi = (H(key)+di) MOD m di =1,2,…m-1

其中,H(key)为散列函数, m为散列表长度, di为增量序列。

由于 n个关键字的 hash值是相同的,因此,第一个关键字需要探测的次数为 0,第二个关键字需要

探测的次数为 1,依此类推,第 n个关键字需要探测的次数为 n-1。所以,总共探测次数为 1+2+3+…+(n-1)=n(n-1)/2。所以,选项 D正确。

【真题 193】如果采用哈希表组织 100万条记录,以支持字段 A快速查找,那么以下描述中,正确的是()。

A.理论上可以在常数时间内找到特定记录 B.所有记录必须存在内存中

C.拉链式哈希法的昀坏查找时间复杂度是 O(n) D.哈希函数的选择与字段 A无关答案:C。对于选项 A,对哈希表而言,散列冲突的问题需要解决,尤其是当数据量大的时候,散列冲突的现

象将更加明显,因此,不能在常数的时间找到特定记录。所以,选项 A不正确。对于选项 B,哈希表中的数据既可以在内存中,也可以被映射到外存中(例如:文件)。所以,选项 B不正确。对于选项 C,在昀坏的情况下,每个记录都有散列冲突,在这种情况下,查找的效率跟线性查找的效率是一样的,时间复杂度为 O(n)。所以,选项 C正确。对于选项 D,哈希函数的选择跟字段 A有直接的关系,根据 A的数据类型的不同,需要选择不同的哈希函数。哈希函数的好坏对查找性能有着直接的影响。所以,选项 D不正确。

【真题 194】以下不属于单向哈希表的特征的是()。

A.它把任意长度的信息转换成固定的长度输出

B.它把固定的信息转换成任意长度信息输出

C.根据特定的哈希值,它可以找到对应的原信息值

D.不同的信息很难产生一样的哈希值答案:B。哈希表( Hash Table)是一个较为常见的概念,它指的是一种根据关键字直接访问内存存储位置的数

据结构。通过哈希表,可以在数据元素的存放位置和数据元素的关键字之间建立起某种对应关系。而单向散列函数,又称单向 Hash函数、压缩函数、缩短函数、消息摘要、指纹、密码校验和、信息完整性检验和操作检验码等,就是把任意长度的输入消息串变化成固定长度的输出串且由输出串难以得到输入串的一种函数。这个输出串称为该消息的散列值。它是现代密码学的中心,是许多协议的另一个结构模块。

一个安全的单向散列函数应该至少满足以下几个条件:

①输入长度是任意的。

②输出长度是固定的,根据目前的计算技术应至少取 128位的长度,以便抵抗外界攻击。

③对每一个给定的输入,计算输出即散列值是很容易的。

④给定散列函数的描述,找到两个不同的输入消息散列到同一个值是计算上不可行的,或给定散列函数的描述和一个随机选择的消息,找到另一个与该消息不同的消息使得它们杂凑到同一个值计算上是不可行的。

本题中,对于选项 A,hash函数可以把字符串等任意长度的输入映射成固定长度的整数,也就是哈希值。所以,选项 A正确。

对于选项 B,它的描述与选项 A说法正好相反。所以,选项 B错误。

对于选项 C,哈希中存放了哈希值与原值信息存储之间的联系,所以可以通过哈希值在哈希表中查找到原值信息。所以,选项 C正确。

对于选项 D,为了哈希列表高效,在设计的时候尽可能会避免冲突或降低冲突的概率。因此实际的哈希表冲突的概率很小。就算有冲突出现了,也会有一些冲突的解决算法,例如开放地址法,链地址法等。因此,一般很难冲突。所以,选项 D正确。

【真题 195】假设把整数关键码 K散列到 N个槽列表,以下散列函数是好的散列函数的是()。

A.h(K)=K/N; B.h(K)=1;

C.h(K)=K mod N; D.h(K)=(K+rand(N)) mod N, rand(N)返回 0到 N-1的整数答案:C。在数据结构中,哈希函数的作用是将一个字符串(或任何其他类型)转化为小于哈希表大小且大于

等于零的整数。

通常情况下,对任意一类的数据都存在一个理论上完美的哈希函数,该函数定义是不会发生任何冲突的,但实际上,这样一个函数很难找到。一个完美的哈希函数,就是在一个特定的数据集上产生的冲突昀少的函数。

Hash法通常有直接寻址法、数字分析法、平方取中法、折叠法、随机数法和除留余数法。以下将分别对这几种方法进行介绍。

(1)直接寻址法

取关键字或关键字的某个线性函数值为散列地址。即 H(key)=key或 H(key) = a*key + b,其中, a和 b为常数(这种散列函数叫作自身函数)。

(2)数字分析法

分析一组数据,比如一组员工的出生年月日,这时会发现出生年月日的前几位数字大体相同,这样的话,出现冲突的概率就会很大,但是通过分析不难发现,年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此,数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。

(3)平方取中法

先通过求关键字的平方值扩大相近数的差别,然后根据表长度取中间的几位数作为散列函数值。又因为一个乘积的中间几位数和乘数的每一位都相关,所以,由此产生的散列地址较为均匀。

(4)折叠法

将关键字分割成位数相同的几部分,昀后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。

(5)随机数法

选择一个随机函数,取关键字的随机函数值作为它的散列地址,即 h(key)=random(key),其中,random为伪随机函数,需要保证函数值的范围是 0~m-1。

(6)除留余数法

除留余数法是以表长 m来除关键字,取其余数作为散列地址,即 h(key)=key%m,该方法成功的关键是选取合适的 m值。选取的 m应使得散列函数值尽可能与关键字的各位相关。通常, m昀好为素数。如果选 m是关键字基数的幂次,那么就等于是选择关键字的昀后若干位数字作为地址,而与高位无关。于是,高位不同而低位相同的关键字均互为同义词。

事实上,哈希函数一般是通过取模运算来实现的(例如本题中的 h(K)=K mod N),当产生冲突时,可以用链接法解决。所以,选项 C正确。

【真题 196】已知一个线性表( 38, 25, 74, 63, 52, 48),假定采用散列函数 h(key)=key%7计算散列地

址,并散列存储在散列表 A[0..6]中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查

找的平均查找长度为( )。

A.1.5  B.1.7  C.2.0  D.2.3

答案:C。

本题中,由于散列函数为 h(key)=key%7,所以,可以首先将线性表的元素全部取 hash值,38,25, 74,63,52,48对应的解算结果分别为 3,4,4,0,3,6。采用线性探测方法解决冲突过程如下:

1)h(38)=3,无冲突,所以,查找 38需要 1次。

2)h(25)=4,无冲突,所以,查找 25需要 1次。

3)h(74)=4与 25冲突,线性探测方法解决冲突:H(i)=(4+i)mod7,i=1,2,3.....,所以,H(1)=(4+1)mod7=    5,无冲突,所以,查找 25需要 2次。

4)h(63)=0,无冲突,所以,查找 63需要 1次。

5)h(52)=3,与 38冲突, H(1)=(3+1)mod7=4,与 25冲突,H(2)=(3+2)mod7=5,与 74冲突, H(3)=(3+3)mod7=6,无冲突,所以,查找 52要需 4次

6)同样,查找 48需要 3次。具体查找次数见下表:

成功查找的平均查找长度 =(1+3+1+1+2+4)/6=2,所以,选项 C正确。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

开源osCommerce 轻松架设专业电子商务平台

osCommerce是一款免费的、开放源代码的专业电子商务解决方案。本书以通俗易懂的语言向读者展示了该软件强大的功能和简易的操作方法,主要内...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊