我目前正在为考试而学习,并提出反对这个问题:
(5d)假设我们使用线性散列,并从一个带有2个桶(M = 2),split = 0和0.9的加载因子的空表开始。解释添加以下哈希值时按顺序执行的步骤:
5,7,12,11,9
为此提供的答案是:
* - -5-(0,1)
* - -5,7 -
-12 * -5,7- - -
* - 12-5- -7-
* -12-5- -7,11 -
- * - 5,9- -7,11-12 -
这个答案对我没有任何意义,而且讲师没有经历过这个。
我该如何处理这个问题?
答案 0 :(得分:2)
我编辑了您的问题,因为在执行每个操作时,答案看起来像是哈希表状态的描述列表。你的教授是否完全覆盖了线性哈希? Wikipedia description准确地提到了一个加载因子,但它在original LH paper by Witold Litwin中。它是控制性分裂发生时不可或缺的一部分。我也找到了这些描述:
Zhang等人的设l表示线性哈希方案的加载因子,即 l = S / b 其中 S 是记录总数, b 是使用的桶数。
Linear Hashing(PDF)
- 线性哈希算法以确定性顺序执行拆分,而不是在溢出的存储桶中拆分。拆分以线性顺序执行(首先是桶0,然后是桶1,然后是2,......),并且当任何桶溢出时执行拆分。如果溢出的桶不是拆分的桶(这是常见的情况),则使用链接等溢出技术,但常见的情况是需要很少的溢出桶。
剪断
- 而不是分裂每次碰撞,你可以在"加载" (字节存储 /( num buckets * 桶大小),即数据结构的利用率)穿过一些水印。这称为受控分裂;前面描述的称为不受控制的分裂。
Linear Hashing: A new Tool for File and Table Addressing Witold Litwin,摘要:Steve Gribble和Armando Fox,在线Berkley.edu 6月16日检索
基本上,负载因子是可预测地控制分裂何时发生的手段。线性散列的一种实现似乎被称为“不受控制的分裂”。它会添加一个新的存储桶,并在发生冲突时执行拆分。使用0.9的加载因子只有当90%的表桶已满时才会发生拆分 - 或者更确切地说,基于统一分配桶的预测将其填满。
基于此和我刚读过的维基百科文章,设置如下:
- -
(编号为0和1)
这是我上面链接的维基百科文章描述。现在我们需要覆盖哈希和桶分配。
mod
( N x 2 L ),这实际上只是我 mod
( N x 2 L )。为简洁起见,我将在下面调用此 B(I)(也适用于 b ucket)。将此作为分配地址 A 。mod
( N x 2 L + 1 ),为我们提供 A' 的实际作业地址。我认为上面答案的符号中的*表示分割指针 S 的位置。在我对下面问题的其余部分的表示法中:
-
表示空桶,i
表示其中包含整数i
的存储桶,i,j
表示同时包含i
的存储桶其中j
。- 5
。我认为您的答案分解如下:
mod
(2 x 2 0 )= 5 mod
(2 x 1)= 5 {{ 1}} 2 = 1 mod
(第0个桶为空,第1个桶为5个。在表格中添加7。
- 5
2 = 1,因此将7添加到与5相同的存储桶中。 S 仍然没有改变了,所以再次使用1作为地址。mod
- 5,7
,其中0和2为空,1还有5和7。在表格中添加12。
- 5,7 -
(2 x 2 0 )= 12 mod
2 = 0 mod
(2 x 2 0 + 1 )= 12 mod
4,仍为0,因此将12添加到第0个桶mod
,只有第3个新存储桶为空。12 5,7 -
12 5,7 - -
的存储分区。这意味着挑选新的桶5和7。5,7
2 = 1,1< S ,计算5 mod
2 x 2 1 = 5 mod
4 = 1. 5被重新分配到同一个桶中。mod
2 = 1,1< S ,计算7 mod
2 x 2 1 = 7 mod
4 = 3. 7重新分配到3。mod
在表格中添加11。
12 5 - 7
(2 x 2 1 )= 11 mod
4 = 3. 11分配给第3桶。mod
,4个项目和4个存储桶,因此再次进行拆分。12 5 - 7,11
(2 x 2 1 )= 12 mod
4 = 0。0< 1,所以重新计算mod
(2 x 2 1 + 1 )= 12 mod
8 = 4。 12被分配给第4个桶。mod
在表格中添加9。
我会把步骤留给最后一个给你。 LH算法有一些细微差别,我并不太了解。我可能会询问有关它们的其他问题。但希望这足以让你继续前进。将来,我建议直接询问课程讲师。