【问题标题】:Linear Hashing calculation?线性哈希计算?
【发布时间】:2015-06-16 14:20:41
【问题描述】:

我目前正在准备考试,遇到了这个问题:

(5d) 假设我们使用线性散列,并从具有 2 个桶 (M = 2)、拆分 = 0 和负载因子 0.9 的空表开始。解释我们在添加以下哈希时所经历的步骤(按顺序):

5,7,12,11,9

为此提供的答案是:

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

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

—12*—5,7— — —

  • 拆分—12—5—*—7—(0,1,2,3)
  • 拆分 =M,M = 2*M,拆分 = 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)

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

我该如何解决这个问题?

【问题讨论】:

    标签: data-structures hash hashtable


    【解决方案1】:

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

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

    Linear Hashing 张等人 (PDF)

    • 线性散列算法以确定的顺序执行拆分,而不是在溢出的存储桶上拆分。拆分按线性顺序执行(首先是存储桶 0,然后是存储桶 1,然后是 2,...),当任何存储桶溢出时执行拆分。如果溢出的bucket不是被split的bucket(这是常见的情况),使用chaining等溢出技术,但常见的情况是需要的溢出bucket很少。

    剪辑

    • 您可以在“负载”(存储的字节数 / (桶数 * 桶大小),即数据结构的利用)越过一些水印。这称为受控分裂;前面描述的称为不受控制的分裂。

    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 永远不会改变,即使向表中添加了新的存储桶。
    • 我们的增长因子(桶 level 的 L 为 0。每次表中的每个桶被拆分一次时,它都会递增,这与我们的桌子的大小增加了一倍。
    • 步骤指针S(也称为分割指针)指向第0 个桶。它指示哪个存储桶接下来将应用拆分。

    这遵循我上面链接到的维基百科文章描述。现在我们需要介绍哈希和桶的分配。

    • 对于期望具有正态分布的整数,一个不错的散列函数是只使用整数本身。所以对于一个输入整数I,我们的散列H(I)就是I。我认为这遵循答案键,这很好,因为在不知道 H 的情况下这个问题是无法回答的。
    • 要确定将整数 I 添加到哪个存储桶,将使用两个函数值之一,具体取决于分配指向 S 之前还是之后.
      • 首先,计算H(I)mod(N x 2L),即真的只是 I mod (N x 2L)。为了简洁起见,我将在下面将其称为 B(I)(也用于 bucket)。将此称为分配地址A
      • 如果 A 大于或等于 S,我们将输入 I 分配给地址 A 并移动开。
      • 如果 A (B(I)) 小于 S,我们实际上使用了不同的哈希函数,我将调用 B'(I),计算公式为 I mod (N x 2L + 1),给我们一个实际的分配地址A'
      • 我认为这样做的原因是为了在存储桶沿途拆分时更多地保留对存储桶的分配,但我没有其重要性的数学证明。

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

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

    我认为您的答案细分如下所示:

    1. 将 5 添加到表中。
      • 线性哈希算法将其放入第二个桶(索引 1),因为:
      • B(5) = 5 mod (2 x 20) = 5 mod (2 x 1) = 5 mod 2 = 1
      • 1大于S,还是0,所以我们用1作为地址。
      • 表现在有 - 5(第 0 个桶是空的,第一个桶有 5 个。
      • NLS不变
    2. 将 7 添加到表中。

      • B(7) = 7 mod 2 = 1,所以 7 被添加到与 5 相同的桶中。S 仍然没有改变,所以再次使用 1作为地址。
      • 表现在有- 5,7
      • 出现分裂!不是因为一个桶溢出了,而是因为超过了负载因子。添加了 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 mod (2 x 20) = 12 mod 2 = 0
      • S 为 1,B(12) 为 0,所以我们计算 B'(12) 来代替我们的地址。
      • 巧合的是,这是 12 mod (2 x 20 + 1) = 12 mod 4,还是 0,所以第 0 个桶加了 12。
      • 表现在有12 5,7 -,只有第三个,新桶是空的。
      • 再次发生分裂,因为 3/3 = 1.0 > 0.9。这次拆分肯定会比上一次更有趣!
      • 一个新的桶被添加到表的末尾,给我们12 5,7 - -
      • S = 1,因此带有5,7 的存储桶被拆分。这意味着为 5 和 7 挑选了新的桶。
      • S 增加到 2。这是在选择拆分目标存储桶之后、分配新存储桶之前完成的。这可以确保新表分布更均匀(我的假设是,没有证据)。
      • 5 mod 2 = 1, 1 S, 计算 5 mod 2 x 21 = 5 mod 4 = 1. 5 是 re - 分配给同一个存储桶。
      • 7 mod 2 = 1, 1 S,计算 7 mod 2 x 21 = 7 mod 4 = 3。7 是-分配给 3。
      • 表现在有12 5 - 7
      • S = 2,N 仍然等于 2,L 仍然 = 0。S 现在已达到 N x 2L = 2 x 20 = 2,所以 S 重置为 0 并且 L em> 递增到 1。
    4. 将 11 添加到表中。

      • B(11) = 11 mod (2 x 21) = 11 mod 4 = 3。11 分配给第三个桶。
      • 表现在有 12 5 - 7,11、4 个项目和 4 个存储桶,因此再次发生拆分。
      • S 又是 0 了,所以第 0 个有 12 的 bucket 会在添加新的 bucket 后重新分配。 S 在为 12 选择新存储桶之前递增到 1。
      • B(12) = 12 mod (2 x 21) = 12 mod 4 = 0. 0
      • B'(12) = 12 mod (2 x 21+1) = 12 mod 8 = 4. 12 分配给第 4 个桶。
      • 表现在包含- 5 - 7,11 12
    5. 将 9 添加到表中。

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

    【讨论】:

    • 哇,我真的非常感谢你花时间写下所有这些,我真的,真的很感激!非常感谢你,你的解释很详细,真的会增加我的考试知识:D 再次感谢你!
    • 不客气。这实际上很有趣。我只希望我做对了!
    猜你喜欢
    • 2016-06-23
    • 2020-09-24
    • 2017-02-04
    • 2012-04-14
    • 2014-01-14
    • 1970-01-01
    • 2017-12-26
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多