如何在哈希表中均匀分布不同的键?
Posted
技术标签:
【中文标题】如何在哈希表中均匀分布不同的键?【英文标题】:How can I evenly distribute distinct keys in a hashtable? 【发布时间】:2015-11-01 14:10:02 【问题描述】:我有这个公式:
index = (a * k) % M
它将来自不同数字的输入集 K 的数字“k”映射到它在哈希表中的位置。我想知道如何编写一个非暴力程序来找到这样的“M”和“a”,这样“M”是最小的,并且给定的集合 K 没有冲突。
【问题讨论】:
我假设您在找到这些数字时拥有所有k
的集合?否则,我看不出如何在您的约束下找到数字(即没有冲突)。
@JohnPirie 我需要这个特定问题的答案,而不是如何构造一个好的散列函数。
查找Perfect hash function。
a
是作为算法输入的常量吗?
@JohnPirie 那么为什么在这种情况下 M 最小?
【参考方案1】:
如果,您可以执行逻辑计算(和/或/不)而不是数字乘法,我认为最佳解决方案(M 的最小值)将是 em> 小到card(K)
,如果你能得到一个函数,将 K 的每个值(一次排序)与其在集合中的位置相关联。
理论上,必须可以为这样的关系(有点)写一个真值表,然后用适当的程序通过卡诺表来简化最小项。根据所需的位数,计算复杂度将是负担得起的......或者不是。
【讨论】:
【参考方案2】:如果 a 与 M 互质,则 a * k = a * k' mod M 当且仅当 k = k' mod M,所以你不妨使用 a = 1,它总是 co- M 的素数。这也涵盖了 M 为素数的所有情况,因为除 0 之外的所有数字都与 M 互质。
如果 a 和 M 不是互质数,那么它们共享一个公因数,比如 b,所以 a = x * b 和 M = y * b。在这种情况下,任何乘以 a 的东西也可以被 b mod M 整除,你也可以通过工作 mod y,而不是 mod M,所以使用 a 的非互质数对 M 没有任何好处。
因此,对于您陈述的问题,您可以通过保留 a=1 并尝试所有可能的 M 值来节省一些时间。
如果你是例如使用 32 位整数并真正计算不是 (a * k) mod M 而是 ((a * k) mod 2^32) mod M 你可能会发现 a 的值不是 1 比 a=1 好因为在 (a * k) mod 2^32 中发生了什么。
【讨论】:
以上是关于如何在哈希表中均匀分布不同的键?的主要内容,如果未能解决你的问题,请参考以下文章