是否有任何散列函數爲具有相同元素的向量生成相同的存儲桶,具有相同的相對位置,但是移位了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