是否有任何散列函数为具有相同元素的向量生成相同的存储桶,具有相同的相对位置,但是移位了k次?偏移量独立散列函数
例如:
hash([1,9,8,7]) -> b1
hash([9,8,7,1]) -> b1
hash([1,8,9,7]) -> b2
hash([1,9,8,5]) -> b3
V1 = [1,9,8,7] V2 = [9,8,7,1]两种载体应该得到相同的哈希因为V2是v1左移k = 3次。
但V3 = [1,8,9,7]不保持相同的相对顺序和V4 = [1,9,8,5]有不同的值,所以他们都没有得到哈希B1。
我最初的方法是计算每个向量的最大值并将其位置视为参考(偏移量= 0)。有了这个,我只需要移动每个向量,使最大值总是在第一个位置。这种方式移动的向量看起来是一样的。然而,向量可以具有重复的元素,因此最大值具有不同的位置。
没有必要连接向量与自身,只是循环地从每个向量位置迭代,这将提供相同的结果,而不会使内存使用加倍。我认为你的解决方案在形式上是正确的,但如果我没有错,假设每个子阵列哈希计算都是O(n)[在这个例子中n = 4],那么你的方法的时间复杂度至少为O(n^2)。我想知道是否可以改进。 –
它取决于散列函数的计算:假设h(k)= a0 + a1 k^1 + a2 k^2 + ...那么我们可以用一个常数计算第二个置换的h与第二个置换的h操作次数。因此h(1,9,8,7)可以被重新用来计算h(9,8,7,1),我们可以重用9,8,7部分(用k除)。 – DDW