Methods 散列乘法方法过程背后的动机是什么?

Methods 散列乘法方法过程背后的动机是什么?,methods,hash,hashtable,multiplication,Methods,Hash,Hashtable,Multiplication,我从CLR开始学习哈希(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

我从CLR开始学习哈希(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)]
->将键k乘以常数a(0)将结果乘以m(为方便起见,通常取2的幂)
在计算机上实施);
->取这个结果的下限,即散列值;
->因此,这是散列函数,h(k)=floor[m*(kA mod 1)]
这本书进一步说明了它将如何在大多数计算机上实现,它比除法的优势,以及Knuth对“A”值的建议

我无法理解的是,为什么我们要遵循这个程序,将键与0到1范围内的数字(a)相乘,然后取小数部分,然后乘以m,然后取底数


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

理想情况下,散列应该满足简单均匀散列假设

例如,在散列函数中,
h(k):U-->{0…m-1}
其中,
U
是可能键的范围,
m
是表的大小

这意味着每次对密钥进行散列时,密钥集合中的任何密钥都有可能在同一位置结束,并且密钥的分布均匀地分布在所有位置,对吗

实际上这并不容易,我们事先不知道钥匙的分布概率,即使我们知道了,我们也不知道会从宇宙中抽出哪些钥匙

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

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

采用除法:简单地
h(k)=k mod m
Key模化表的大小。 简单、快速且只生成合法值,但您必须非常小心地选择
m
!例如,如果表是2的幂,则实际上是取
k
的最低有效位以及可能显示特定结构的键。因此,为
m
选择一个接近精确幂o的素数f2


让我们继续使用乘法方法进行对比:
h(k)=floor[m*(kA mod 1)]
其中
(0理想情况下,散列应满足简单均匀散列的假设

例如,在散列函数中,
h(k):U-->{0…m-1}
其中,
U
是可能键的范围,
m
是表的大小

这意味着每次对密钥进行散列时,密钥集合中的任何密钥都有可能在同一位置结束,并且密钥的分布均匀地分布在所有位置,对吗

实际上这并不容易,我们事先不知道钥匙的分布概率,即使我们知道了,我们也不知道会从宇宙中抽出哪些钥匙

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

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

采用除法:简单地
h(k)=k mod m
Key模化表的大小。 简单、快速且只生成合法值,但您必须非常小心地选择
m
!例如,如果表是2的幂,则实际上是取
k
的最低有效位以及可能显示特定结构的键。因此,为
m
选择一个接近精确幂o的素数f2


让我们继续使用乘法方法进行对比:
h(k)=floor[m*(kA mod 1)]
其中
(0当我们将
kA
的小数部分相乘时(在区间[0,1]的某个地方)通过
m
,我们将生成一个范围为0到m-1的值,然后可以将其用作哈希表的索引。让我们通过
{kA}
来表示
kA
的小数部分

与任何其他散列函数一样,此过程也可以统一分配输入键(事先未知),也可以不统一分配


假设有两个连续的整数键,我们希望确保它们的均匀分布。为此,我们需要在区间[0,1]中使值
{kA}
尽可能均匀。如果可以做到这一点,最后的散列(与
m相乘后)也将在0到
m-1的范围内很好地分布。从这个意义上说,
A
的值变得很重要,CLRS建议(它本身指Knuth)为
A
提供
1/黄金比例。这样,
{kA}
的生成值将在[0,1]中很好地分布.

当我们将
kA
的小数部分(在区间[0,1]的某个地方)乘以
m
时,我们将生成一个范围为0到m-1的值,该值可以用作哈希表的索引。让我们用
{kA}
表示
kA
的小数部分

与任何其他散列函数一样,此过程也可以统一分配输入键(事先未知),也可以不统一分配

假设有两个连续的整数键,我们希望确保它们的均匀分布。为此,我们需要使区间[0,1]中的值
{kA}
尽可能均匀。如果可以做到这一点,最后的散列(在与
m
相乘后)也将在0到