第18讲 散列表 课堂互动 隐藏答案 | 返回首页

作者:欧新宇(Xinyu OU)

最后更新:2023-12-19


【课前自测18】

1. 只能在顺序存储结构上进行的查找方法是()。
A. 顺序查找法
B. 折半查找法
C. 树型查找法
D. 散列查找法

答案及解析:B
顺序查找可以是顺序存储或链式存储;折半查找只能是顺序存储且要求关键字有序;树形查找法要求采用树的存储结构,既可以采用顺序存储也可以采用链式存储;散列查找中的链地址法解决冲突时,采用的是顺序存储与链式存储相结合的方式。

2. 散列查找一般适用于()的情况下的查找。
A. 查找表为链表
B. 查找表为有序表
C. 关键字集合比地址集合大得多
D. 关键字集合与地址集合之间存在对应关系

答案及解析:D
关键字集合与地址集合之间存在对应关系时,通过散列函数表示这种关系。这样,查找以计算散列函数而非比较的方式进行查找。

3.【2022统考真题】下列因素中,影响散列(哈希)方法平均查找长度的是()。
Ⅰ. 装填因子
Ⅱ. 散列函数
Ⅲ. 冲突解决策略
A. 仅Ⅰ、Ⅱ
B. 仅Ⅰ、Ⅲ
C. 仅Ⅱ、Ⅲ
D. Ⅰ、Ⅱ、Ⅲ

答案及解析:D
填装因子越大,说明哈希表中存储的元素越满,发生冲突的可能性就越高,导致平均查找长度越大。散列函数、冲突解决策略也会影响发生冲突的可能性。说法Ⅰ、Ⅱ、Ⅲ都正确。

4. 设有一个含有200个表项的散列表,用线性探测法解决冲突,按关键字查询时找到一个 表项的平均探测次数不超过1.5,则散列表项应能够容纳()个表项(设查找成功的平均查找长度为 ASL = [1 + 1/(1-a)]/2,其中α为装填因子)。
A. 400
B. 526
C. 624
D. 676

答案及解析:A
根据题设给出的公式,并代入ASL=1.5可得:
ASL=12[1+11α]1.5=>α0.5ASL = \frac{1}{2} [1+\frac{1}{1-\alpha}] \leq 1.5 => \alpha \leq 0.5
根据上式,当装填因子的最大值为0.5,且散列表项为200时,可容纳的数据量最大为200/0.5 = 400,故选A。

5. 假定有 K 个关键字互为同义词,若用线性探测法把这K个关键字填入散列表,至少要进行()次探测。
A. K-1
B. K
C. K+1
D. K(K+1)/2

答案及解析:D
K个关键字在依次填入的过程中,除第一个不会发生冲突,其他同义词都会发生冲突,其故探测次数为(1+2+3+…+K) = K(K+1)/2,即选D。

【课堂互动18.1】处理冲突的方法

1. 设散列表长 m = 14,散列函数为 H(key) = key%11,表中仅有4个结点 H(15) = 4,H(38)=5,H(61)=6,H(84)=7, 若采用线性探测法处理冲突,则关键字为49的结点地址是()。
A. 8
B. 3
C. 5
D. 9

答案及解析:A
根据线性探测法的公式 Hi(Key)=keymodm+i=>Hi+1=Hi(Key)+1H_i(Key) = key \mod{m} + i => H_{i+1} = H_i(Key) + 1,H(49)=49%11=5,发生冲突;H₁=H(49)+1=6,发生冲突;H₂=H₁+1=7,发生冲突;H₃=H₂+1=8,无冲突。选A。

2.【2011统考真题】为提高散列表的查找效率,可以采取的正确措施是()。
Ⅰ. 增大装填(载)因子
Ⅱ. 设计冲突(碰撞)少的散列函数
Ⅲ. 处理冲突(碰撞)时避免产生聚集(堆积)现象
A. 仅Ⅰ
B. 仅Ⅱ
C. 仅Ⅰ、Ⅱ
D. 仅Ⅱ、Ⅲ

答案及解析:D
散列表的查找效率取决于:散列函数、处理冲突的方法和装填因子。显然,冲突的产生概率与装填因子(即表中记录数与表长之比)的大小成正比,装填因子越大,发生冲突的几率也就越高,查找的次数也越多,效率也月底,选项Ⅰ与题意相反。选项Ⅱ显然正确。采用合适的冲突处理方法可避免聚集现象,也将提高查找效率,选项Ⅲ正确。例如,用链地址法处理冲突时不存在聚集现象,用线性探测法处理冲突时易引起聚集现象。

3.【2014统考真题】用哈希(散列)方法处理冲突(碰撞)时可能出现堆积(聚集)现象. 下列选项中,会受堆积现象直接影响的是()。
A. 存储效率
B. 散列函数
C. 装填(装载)因子
D. 平均查找长度

答案及解析:D
产生堆积现象,即产生了冲突,它对存储效率、散列函数和装填因子均不会有影响,而平均查找长度会因为堆积现象而增大,选D。

4.【2018统考真题】现有长度为7、初始为空的散列表HT,散列函数H(k)=k%7,用线性探测再散列法解决冲突。将关键字22,43,15依次插入HT 后,查找成功的平均查找长度是() 。
A. 1.5
B. 1.6
C. 2
D. 3

答案及解析:C
根据题意,得到的HT如下:

散列地址 0 1 2 3 4 5 6
关键字 - 22 43 15 - - -

查找成功时,22,43,15分别需要探测1次,2次和3次,因此:ASL成功 = (1+2+3)/3 = 2。

5.【2019统考真题】现有长度为11且初始为空的散列表HT, 散列函数是H(key)=key%7,采用线性探查(线性探测再散列)法解决冲突。将关键字序列87,40,30,6,11,22,98,20依次插入HT 后 ,HT查找失败的平均查找长度是()。
A. 4
B. 5.25
C. 6
D. 6.29

答案及解析:C
采用线性探查法计算每个关键字的存放情况如下表所示。

散列地址 0 1 2 3 4 5 6 7 8 9 10
关键字 98 22 30 87 11 40 6 20 - - -

由于H(key) = 0~6,因此,查找失败时可能对应的地址有7个。对于计算出地址为0的关键字key0,只有在比较完0~8号地址后才能确定该关键字不在表中,比较次数为9;对于计算出地址为1的关键字key1,只有比较完1~8号地址后才能确定该关键字不在表中,比较次数为8;以此类推。需要特别注意的是,散列函数不可能计算出地址7,因此有ASL失败_{失败} = ( 9 + 8 + 7 + 6 + 5 + 4 + 3 ) / 7 = 6

【扩展练习18】

1. 下列关于散列表的说法中,正确的是()。
Ⅰ. 若散列表的填装因子α<1,则可避免碰撞的产生
Ⅱ. 散列查找中不需要任何关键字的比较
Ⅲ. 散列表在查找成功时平均查找长度与表长有关
Ⅳ. 若在散列表中删除一个元素,不能简单地将该元素删除
A.Ⅰ 和 Ⅳ
B.Ⅱ 和 Ⅲ
C.Ⅲ  
D. Ⅳ

答案及解析:D
选项Ⅰ,冲突(碰撞)是不可避免的,与装填因子无关,因此需要设计处理冲突的方法,选项I错误。
选项Ⅱ,散列查找的思想是计算出散列地址来直接进行定位,但是当发生冲突时,仍然需要向后进行逐元素对比;此外使用链地址方法,确定链头后,也依然需要使用关键字对比。因此,选项Ⅱ错误。
选项Ⅲ,当散列表长度固定时,装填因子越大,平均查找长度越小;反之,装填因子越小,平均查找长度越大。因此,选项Ⅲ错误。
选项Ⅳ,在开放定址的情形下,不能随便删除散列表中的某个元素,否则可能会导致搜索路径被中断。因此通常的做法是在要删除的地方做删除标记,而不是直接删除,选项IV正确。

2. 在开放定址法中散列到同一个地址而引起的“堆积”问题是由于()引起的。
A. 同义词之间发生冲突
B. 非同义词之间发生冲突
C. 同义词之间或非同义词之间发生冲突
D. 散列表“溢出”

答案及解析:C
在开放定址法中,当同义词发生冲突后需要向后进行探测并写入,此时就会产生堆积现象;同时,当同义词向后写入时,又可能占用非同义词本来的空间,让相邻的非同义词产生二次冲突,导致非同义词之间产生冲突。因此,在开放定址法中散列到同一个地址而产生的“堆积”问题,是同义词冲突的探查序列和非同义词之间不同的探查序列交织在一起。

3. 下列关于散列冲突处理方法的说法中,正确的有()。
Ⅰ. 采用再散列法处理冲突时不易产生聚集
Ⅱ. 采用线性探测法处理冲突时,所有同义词在散列表中一定相邻
Ⅲ. 采用链地址法处理冲突时,若限定在链首插入,则插入任意一个元素的时间相同
Ⅳ. 采用链地址法处理冲突易引起聚集现象
A.Ⅰ和Ⅲ
B.Ⅰ、Ⅱ和Ⅲ
C.Ⅲ和Ⅳ
D.Ⅰ和 Ⅳ

答案及解析:A
选项Ⅰ,再散列法又称为双散列法,它使用两个不同的散列函数实现跳跃式探测,可有效地解决冲突后的二次聚集,但增加了计算散列地址的计算量,因此,选项Ⅰ正确。
选项Ⅱ,线性探测法中,散列地址为i的关键字的同义词和为解决冲突形成的某次探测地址为i的关键字,都争夺地址i,i+1,...。因此,冲突时的同义词不一定总能够相邻,选项Ⅱ错误。
选项Ⅲ,显然正确,当使用链首插入,则时间复杂度都为O(1)。
选项Ⅳ,链地址法处理冲突时将同义词放在同一个链表中,不会引起聚集现象,选项IV 错误。

4. 对包含n个元素的散列表进行查找,平均查找长度()。
A. O(log₂n)
B. O(1)
C. 不直接依赖于n
D. 直接依赖于表长m

答案及解析:C
在散列表中,平均查找长度与装填因子α直接相关,表的查找效率不直接依赖于表中已有表项个数n或表长m。若散列表中存放的记录全部是某个地址的同义词,则平均查找长度为O(n)而非O(1)。

5. 采用开放定址法解决冲突的散列查找中,发生聚集的原因主要是()。
A. 数据元素过多
B. 负载因子过大
C. 散列函数选择不当
D. 解决冲突的方法选择不当

答案及解析:D
聚集是因选取不当的处理冲突的方法,而导致不同关键字的元素对同一散列地址进行争夺的现象。用线性再探测法时,容易引发聚集现象。

6. 一组记录的关键字为 {19,14,23,1,68,20,84,27,55,11,10,79},用链地址法构造散列表,散列函数为 H(key) = key%13,散列地址为1的链中有()个记录。
A. 1
B. 2
C. 3
D. 4

答案及解析:D
由散列函数可依次计算出每个元素的哈希值,分别为:6, 1, 10, 1, 3, 7, 6, 1, 3, 11, 10, 1。故散列地址为1的链中有4个元素,分别是14, 1, 27, 79。

7. 在采用链地址法处理冲突所构成的散列表上查找某一关键字,则在查找成功的情况下,所探测的这些位置上的关键字值()。
A. 一定都是同义词
B. 不一定都是同义词
C. 都相同
D. 一定都不是同义词

答案及解析:A
因为在链地址法中,映射到同一地址的关键字都会链到与此地址相对应的链表上,所以探测过 程一定是在此链表上进行的,从而这些位置上的关键字均为同义词。

8. 在采用线性探测法处理冲突所构成的散列表上查找某一关键字,则在查找成功的情况下,所探测的这些位置上的关键字值()。
A. 一定都是同义词
B. 不一定都是同义词
C. 都相同
D. 一定都不是同义词

答案及解析:B
在线性探测法中出现两个同义关键字时,会把该关键字对应地址的下一个地址也占用掉,两个地址分别记为Addr、Addr+1,查找一个满足H(key) = Addr+1的关键字key时,显然首次探测到的不是key的同义词。

9. 若采用链地址法构造散列表,散列函数为 H(key) = key mod 17,则这些链的链首指针构成一个指针数组,数组的下标范围为()。
A. 0~17
B. 1~17
C. 0~16
D. 1~16

答案及解析:C
H 的取值有17种可能,对应到不同的链表中,所以链表的个数应为17。由于H(key)的取值范围是0~16,所以数组下标为0~16。

10. 将10个元素散列到100000个单元的散列表中,则()产生冲突。
A. 一定会
B. 一定不会
C. 仍可能会
D. 不确定

答案及解析:C
由于散列函数的选取,仍然有可能产生地址冲突,冲突不能绝对地避免。

第18讲 散列表 课堂互动 隐藏答案 | 返回首页