如何在哈希表中均匀分配不同的键?

时间:2015-08-09 16:34:30

标签: algorithm collections hashtable hash-collision

我有这个公式:

index = (a * k) % M

将数字' k'从不同数字的输入集K映射到哈希表中的位置。我想知道如何写一个非暴力的程序,找到这样的' M'和' a'所以' M'是最小的,并且给定集合K没有碰撞。

2 个答案:

答案 0 :(得分:1)

如果,而不是数字乘法,你可以执行逻辑计算(和/或/不),我认为最优解(M的最小值)将是小到card(K)如果你能得到一个函数,它将K的每个值(一旦有序)与它在集合中的位置相关联。

理论上,必须可以为这样的关系(比特一点)写一个真值表,然后用适当的程序通过卡诺表简化minterms。根据所需的位数,计算复杂性是否可承受......或者不是。

答案 1 :(得分:0)

如果a是M的共同素数,那么a * k = a * k' mod M当且仅当k = k' mod M,所以你不妨使用a = 1,它总是与M共同素数。这也涵盖了M是素数的所有情况,因为除了0之外的所有数字都是M的共同素数。

如果a和M不是共同素数,那么它们共有一个共同因子,比如b,所以a = x * b和M = y * b。在这种情况下,乘以a的任何东西也可以被b mod M整除,你可能也可以使用mod y而不是mod M,所以通过使用一个非共同素数来获得M没有任何东西可以获得。

因此,对于您所述的问题,您可以通过保留= 1并尝试所有可能的M值来节省一些时间。

如果你是使用32位整数并且真的计算不是(a * k)mod M但是((a * k)mod 2 ^ 32)mod M你可能能够找到除1之外的值比a = 1更好的情况因为在(a * k)mod 2 ^ 32中发生了什么。