📜  散列练习题

📅  最后修改于: 2021-09-27 14:55:52             🧑  作者: Mango

在本文中,我们将讨论基于散列的问题类型。在理解这一点之前,您应该了解散列、散列函数、开放寻址和链接技术(请参阅:介绍、分离链接、开放寻址)。

这些是散列的一些关键点:

  • 散列的目的是实现复杂度为 O(1) 的元素的查找、插入和删除。
  • 散列函数旨在在散列表上均匀分布密钥。
  • 哈希表中的负载因子 α 可以定义为哈希表中的槽数与要插入的键数。
  • 对于开放寻址,负载因子 α 始终小于 1。
  • 使用开放寻址的插入、删除和搜索的复杂度为 1/(1-α)。
  • 使用链式方法插入、删除和搜索的复杂度为(1+α)。

这些是散列中提出的问题类型。

类型 1:计算给定键的哈希值 –
在这类问题中,哈希值是通过在给定的键上应用给定的哈希函数来计算的。

Que – 1.给定以下输入 (4322, 1334, 1471, 9679, 1989, 6171, 6173, 4199) 和哈希函数x mod 10,以下哪些陈述是正确的? (GATE CS 2004)
一世。 9679, 1989, 4199 散列到相同的值
ii. 1471, 6171 散列到相同的值
三、所有元素散列到相同的值
四、每个元素散列到不同的值
(A) 我只
(B) 仅 ii
(C) 仅 i 和 ii
(D) iii 或 iv

解决方案:使用给定的哈希函数h(x) = x mod 10

h(9679) = 9679%10 = 9 
h(1989) = 1989%10 = 9 
h(4199) = 4199%10 = 9 
h(1471) = 1471%10 = 1 
h(6171) = 6171%10 = 1 

正如我们所看到的,9679、1989 和 4199 散列到相同的值 9。此外,1471 和 6171 散列到相同的值 1。因此,与选项 (C) 匹配的语句 (i) 和 (ii) 是正确的。

类型 2:使用线性探测作为冲突解决技术将键插入哈希表 –
在线性探测技术中,通过在哈希表中线性搜索直到找到空位置来解决冲突。

Que – 2.使用散列函数h(k) = k mod 10 和线性探测的开放寻址将密钥 12、18、13、2、3、23、5 和 15 插入到长度为 10 的初始空散列表中。结果哈希表是什么?

3

解决方案:将键 12、18、13、2、3、23、5 和 15 插入哈希表中,如下所示:

对于键 12,h(12) 是 12%10 = 2。因此,12 被放置在哈希表中的第二个索引处。
对于键 18,h(18) 是 18%10 = 8。因此,18 被放置在哈希表中的第 8 个索引处。
对于键 13,h(13) 是 13%10 = 3。因此,13 被放置在哈希表中的第三个索引处。
对于键 2,h(2) 为 2%10 = 2。然而,索引 2 已经被 12 占用。因此,使用线性探测,2 将被放置在索引 4 处,因为索引 2 和 3 已经被占用。
对于键 3,h(3) 是 3%10 = 3。然而,索引 3 已经被 13 占用。因此,使用线性探测,3 将被放置在索引 5 处,因为索引 3 和 4 已经被占用。
同样,23、5 和 15 将分别放置在索引 6、7、9 处。

因此,正确选项为(C)。

替代方法:我们也可以使用消除方法来解决这个问题:

选项 (A) 和 (B) 不正确,因为所有键都没有插入哈希表中。
选项 (D) 不正确,因为哈希表中的某些索引具有多个键,而使用线性探测从未发生过。
剩下的选项是(C),这是答案。

类型 3:给定一个带有键的哈希表,验证/找到导致哈希表的键的可能序列 –
对于给定的哈希表,我们可以验证哪个键序列可以导致该哈希表。然而,为了找到导致给定哈希表的可能序列,我们需要考虑所有可能性。

Que – 3.长度为 10 的哈希表使用具有哈希函数h(k)=k mod 10 的开放寻址和线性探测。将6个值插入空的hash表后,表如下图。

4

以下哪个选项给出了键值插入表中的可能顺序?
(一) 46、42、34、52、23、33
(乙) 34, 42, 23, 52, 33, 46
(C) 46、34、42、23、52、33
(四) 42, 46, 33, 23, 34, 52

解决方案:我们将检查选项A中给出的序列是否可以导致有问题的哈希表。选项 A 插入 46、42、34、52、23、33 为:

对于键 46,h(46) 为 46%10 = 6。因此,46 被放置在哈希表中的第 6 个索引处。
对于键 42,h(42) 是 42%10 = 2。因此,42 被放置在哈希表中的第二个索引处。
对于键 34,h(34) 是 34%10 = 4。因此,34 被放置在哈希表中的第 4 个索引处。
对于键 52,h(52) 为 52%10 = 2。然而,索引 2 被 42 占用。因此,52 被放置在哈希表中的第 3 个索引处。但是在给定的哈希表中,52 位于第 5 个索引处。因此,选项A中的序列不能生成有问题的哈希表。

以类似的方式,我们也可以检查其他选项,这导致答案为(C)。

Que – 4.使用相同的散列函数和线性探测的键值的不同插入序列有多少会导致上面问题3中给出的散列表?
(一) 10
(乙) 20
(C) 30
(四) 40

解决方案:第一个不在hash函数计算出的索引处的key是52,表示索引2、3、4已经被占用,所以将key 52放在索引5处。

键 42、23 和 34 分别出现在索引 2、3 和 4 处。由于这些键位于正确的位置,因此它们的插入顺序无关紧要。这3把钥匙可以插3把! = 6 种方式。因此,序列将是 (42, 23, 34) 后跟 52 的任意顺序。

下一个不在哈希函数计算的索引处的键是33。这意味着索引3到6已经被占用,键33被放置在索引7处。因此,它是最后一个要插入哈希表的键。

密钥 46 出现在其由散列函数计算的正确位置。因此,它可以插入序列中 33 之前的任何位置。除了 33 之外的序列有 4 个元素 42、23、34、52,它们为 46 创建了 5 个位置(3 个中间和 2 个角)。
总路数为:6*5 =30

类型 4:基于链的碰撞解决技术——
在基于链接的冲突解决技术中,生成相同散列值的键使用指针放置在同一个桶中。基于链接技术的不同类型的问题是:

Que – 5.考虑一个有 100 个槽的哈希表。使用链接解决冲突。假设简单的均匀散列,在前 3 次插入后前 3 个槽未被填充的概率是多少? (GATE-CS-2014)
(A) (97 × 97 × 97)/100^3
(B) (99 × 98 × 97)/100^3
(C) (97 × 96 × 95)/100^3
(D) (97 × 96 × 95)/(3! × 100^3)

解决方案:在统一哈希中,该函数将键均匀地分配到哈希表的槽中。此外,每个键被放置到一个插槽中的概率是相等的,独立于已经放置的其他元素。

因此,第一次插入(选择 4 到 100 个时隙)剩余的前 3 个时隙为空的概率 = 97/100。由于下一次插入与前一次插入无关,因此下一次插入的概率也将为 97/100。所需的概率为 (97/100)^3。

Que – 6.对于从 0 到 2020 的 i,以下哪个整数哈希函数将最均匀地将键分布在编号为 0 到 9 的 10 个桶上? (GATE-CS-2015)
(A) h(i) =i^2 mod 10
(B) h(i) =i^3 mod 10
(C) h(i) = (11 ∗ i^2) mod 10
(D) h(i) = (12 * i) mod 10

解决方案:在均匀分布中,该函数将键均匀分布到哈希表的槽中。
对于给定的散列函数,我们计算了键 0 到 9 的散列值:

5

从表中我们可以看出,i^3 mod10 从索引 0 到 9 均匀分布。其他函数没有使用所有索引。