线性哈希计算?

时间:2015-06-16 14:20:41

标签: data-structures hash hashtable

我目前正在为考试而学习,并提出反对这个问题:

(5d)假设我们使用线性散列,并从一个带有2个桶(M = 2),split = 0和0.9的加载因子的空表开始。解释添加以下哈希值时按顺序执行的步骤:

5,7,12,11,9

为此提供的答案是:

* - -5-(0,1)
* - -5,7 -

  • 拆分 - * - 5,7- - (0,1,2)

-12 * -5,7- - -

  • split -12-5 - * - 7-(0,1,2,3)
  • split = M,M = 2 * M,split = 0

* - 12-5- -7-
* -12-5- -7,11 -

  • 分裂 - * - 5- -7,11-12-(0,1,2,3,4)

- * - 5,9- -7,11-12 -

  • 拆分 - -9 * - -7,11-12-5-(0,1,2,3,4,5)

这个答案对我没有任何意义,而且讲师没有经历过这个。

我该如何处理这个问题?

1 个答案:

答案 0 :(得分:2)

我编辑了您的问题,因为在执行每个操作时,答案看起来像是哈希表状态的描述列表。你的教授是否完全覆盖了线性哈希? Wikipedia description准确地提到了一个加载因子,但它在original LH paper by Witold Litwin中。它是控制性分裂发生时不可或缺的一部分。我也找到了这些描述:

  

设l表示线性哈希方案的加载因子,即 l = S / b 其中 S 是记录总数, b 是使用的桶数。

Zhang等人的

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%的表桶已满时才会发生拆分 - 或者更确切地说,基于统一分配桶的预测将其填满。

基于此和我刚读过的维基百科文章,设置如下:

  • 表最初是空的,有两个桶( N = 2)- -(编号为0和1)
    • N n 桶的数量对我来说比 M 更有意义,所以我在我的使用它答案。
    • 即使将新的存储桶添加到表中,显然 N 也不会更改。
  • 我们的增长因子( l evel的 L )为0.每当表中的每个桶被拆分一次时,它就会递增,这与我们的时间一致桌子的尺寸增加了一倍。
  • 步指针 S (也称为分割指针)指向第0个桶。它表示下一个应用了哪个存储桶。

这是我上面链接的维基百科文章描述。现在我们需要覆盖哈希和桶分配。

  • 对于期望具有正态分布的整数,一个合适的哈希函数就是使用整数本身。因此,对于输入整数 I ,我们的哈希 H(I)只是 I 。我认为这遵循答案键,这很好,因为在不知道 H 的情况下问题是无法回答的。
  • 要确定添加了整数 I 的哪个存储桶,将使用两个函数值中的一个,具体取决于指定是指向 S 之前还是之后 。
    • 首先,计算 H(I) mod N x 2 L ),这实际上只是 mod N x 2 L )。为简洁起见,我将在下面调用此 B(I)(也适用于 b ucket)。将此作为分配地址 A
    • 如果 A 大于或等于 S ,我们将输入 I 分配给地址 A 并移动上。
    • 如果 A B(I))小于 S ,我们实际上使用了不同的哈希函数,I&#lll; ll致电 B'(I),计算为 I mod N x 2 L + 1 ),为我们提供 A' 的实际作业地址。
    • 我认为这样做的原因是为了保持对存储桶的分配更加均匀,因为存储桶一直是分开的,但我没有数学证明其重要性。

我认为上面答案的符号中的*表示分割指针 S 的位置。在我对下面问题的其余部分的表示法中:

  • -表示空桶,i表示其中包含整数i的存储桶,i,j表示同时包含i的存储桶其中j
  • 所以答案键的第一步是" - -5-(0,1)"是说桶0是空的,桶1中有5个。为清楚起见,我会将其重写为- 5

我认为您的答案分解如下:

  1. 在表格中添加5。
    • 线性哈希算法将其放入第二个桶(索引1),因为:
    • B(5) = 5 mod(2 x 2 0 )= 5 mod(2 x 1)= 5 {{ 1}} 2 = 1
    • 1大于 S ,仍为0,因此我们使用1作为地址。
    • 表现在有mod(第0个桶为空,第1个桶为5个。
    • N L S 未更改
  2. 在表格中添加7。

    • B(7) = 7 - 5 2 = 1,因此将7添加到与5相同的存储桶中。 S 仍然没有改变了,所以再次使用1作为地址。
    • 表现在有mod
    • 发生分裂!不是因为铲斗溢出,而是因为已经超过了载荷系数。添加了2个项目,总共2个桶,2/2 = 1.0> 0.9 =做分裂。
      • 首先在表格末尾添加一个新桶。
      • S 增加到1. N 不递增。 L 未更改
      • 分割是在水桶上完成的。拆分意味着存储桶中的所有项目都会根据新的哈希表大小重新计算其分配。但是,线性散列的一个关键是实际存储桶按顺序拆分,因此即使第一个存储桶是满的,第0个存储桶也会被拆分。
    • 分拆后,该表现在为- 5,7,其中0和2为空,1还有5和7。
  3. 在表格中添加12。

    • B(12) = 12 - 5,7 -(2 x 2 0 )= 12 mod 2 = 0
    • S 为1且 B(12)为0,因此我们计算 B'(12)代替我们的地址。
    • 巧合的是,这是12 mod(2 x 2 0 + 1 )= 12 mod 4,仍为0,因此将12添加到第0个桶
    • 表现在有mod,只有第3个新存储桶为空。
    • 再次发生分裂,因为3/3 = 1.0> 0.9。这种分裂有望比上一次更有趣!
    • 新表格会添加到表格的末尾,为我们提供12 5,7 -
    • S = 1,因此分割了12 5,7 - -的存储分区。这意味着挑选新的桶5和7。
    • S 增加到2.这是在拾取拆分目标存储桶之后但在分配新存储桶之前完成的。这可以确保新表更均匀地分布(再次,我的假设,没有证据)。
    • 5 5,7 2 = 1,1< S ,计算5 mod 2 x 2 1 = 5 mod 4 = 1. 5被重新分配到同一个桶中。
    • 7 mod 2 = 1,1< S ,计算7 mod 2 x 2 1 = 7 mod 4 = 3. 7重新分配到3。
    • 表现在有mod
    • S = 2, N 仍然等于2, L 仍然= 0. S 现已达到 N x 2 L = 2 x 2 0 = 2,因此 S 重置为0且 L 增加到1。
  4. 在表格中添加11。

    • B(11) = 11 12 5 - 7(2 x 2 1 )= 11 mod 4 = 3. 11分配给第3桶。
    • 表现在有mod,4个项目和4个存储桶,因此再次进行拆分。
    • S 再次为0,因此在添加新存储桶后重新分配带有12的第0个存储桶。在为12选择新存储桶之前, S 会增加到1。
    • B(12) = 12 12 5 - 7,11(2 x 2 1 )= 12 mod 4 = 0。0< 1,所以重新计算
    • B'(12) = 12 mod(2 x 2 1 + 1 )= 12 mod 8 = 4。 12被分配给第4个桶。
    • 表格现在包含mod
  5. 在表格中添加9。

  6. 我会把步骤留给最后一个给你。 LH算法有一些细微差别,我并不太了解。我可能会询问有关它们的其他问题。但希望这足以让你继续前进。将来,我建议直接询问课程讲师。