【问题标题】:what is the motivation behind the procedure for multiplication method for hashing?哈希乘法过程背后的动机是什么?
【发布时间】:2019-08-29 09:31:11
【问题描述】:

我从 CLRS(Cormen 等人)开始学习散列。我能够理解数学过程以及计算机实现的方式。这本书简单地将数学过程描述为-

-> multiply the key k with a constant A (0<A<1), results into kA;

-> extract the fractional part of kA by doing (kA mod 1);

-> multiply the result with m (usually taken to be a power of 2 for easy 
implementation on computers);

-> take the floor of this result and that is the hashed value;

-> therefore, this is the hashing function, h(k) = floor[m*(kA mod 1)]

这本书进一步说明了它将如何在大多数计算机上实现,它优于除法方法和 Knuth 对“A”值的建议。

我无法理解的是,为什么我们要遵循这个程序,即专门将密钥与 0 到 1 范围内的数字 (A) 相乘,然后取小数部分,然后乘以 m,然后取地板?

这是否会产生“非常类似于”SUHA(简单统一散列假设)的散列值,即理想情况下每个键都应该独立散列到 m 个插槽中的任何一个,那么这种方法会产生“更接近”这个理想的结果吗?

【问题讨论】:

    标签: methods hash hashtable multiplication


    【解决方案1】:

    理想的散列应该满足简单统一散列的假设。

    例如,在散列函数 h(k): U--&gt; {0...m-1} 中,U 是可能键的全域,m 是表的大小

    这意味着每次对密钥进行散列时,密钥宇宙中的任何密钥都应该同样可能最终位于同一位置,并且密钥的分布均匀分布在所有位置上,对吗?

    嗯,在实践中并不是那么容易,我们事先不知道密钥分配的概率,即使我们知道,我们仍然不知道哪些密钥会被抽出那个宇宙。

    因此,我们需要根据我们对密钥的了解来实际操作,以便在 k 上创建一些性能良好的计算,并在整个表中很好地分配密钥。

    这就是我们在方法之间进行交易的地方,

    采用除法:只需h(k) = k mod m 键以表格大小为模。 简单、快速且仅产生合法值,但您必须非常小心地选择您的m!例如,如果表格是 2 的幂,那么您实际上是在取 k 的最低有效位,并且这些键可能显示某种结构。因此,为m 选择一个可能接近 2 的精确幂的素数。

    让我们继续讨论乘法方法以进行对比:h(k) = floor[m*(kA mod 1)] where (0&lt;A&lt;1)

    我们将密钥与小数相乘,因此mod 1 可以取出小数部分。本质上,您可以将 m 与 0 到但不包括 1 之间的数字相乘,最后,我们将取其结果的下限以获得一个整数。 这比除法方法要慢,但不管你为m 选择什么m 的值并不重要!

    回到你的问题,这完全取决于你有什么样的实现,因此你应该如何相应地使用哈希表。那里有很多。

    【讨论】:

      【解决方案2】:

      当我们将kA(在区间 [0,1] 中的某处)的小数部分乘以m 时,我们生成了一个 0 到 m-1 范围内的值,然后可以将其用作哈希表的索引。让我们用{kA} 来表示kA 的小数部分。

      这个过程也像任何其他散列函数一样,可能会也可能不会均匀地分配输入键(事先不知道)。

      假设有几个连续的整数键,我们希望确保它们的均匀分布。为此,我们需要使值{kA} 在区间 [0,1] 中尽可能一致。如果可以做到这一点,最终的哈希值(乘以m 之后)也将很好地分布在 0 到 m-1 的范围内。从这个意义上说,A 的值就变得很重要,CLRS 推荐(它本身指的是 Knuth)1/golden-ratio 用于A。这样,{kA} 的生成值将很好地分布在 [0,1] 中。

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 2012-08-05
        • 2011-07-14
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        相关资源
        最近更新 更多