要約:それを行う方法はありますか?これが私が言いたいことです: unsigned int番号があるとします。次に、それを数回乗算します(予想されるオーバーフローがあります)。それでは、元の値を「元に戻す」ことは可能ですか?
詳細に:
Rabin-Karp ローリング ハッシュがすべてです。私がする必要があるのは、長い文字列のハッシュを持っていることです。たとえば、「abcd」です。次に、「cd」などの短い部分文字列のハッシュを取得します。与えられた2つのハッシュを使用して、O(1)で「ab」ハッシュを計算する方法は?
私が今アルゴリズムとして持っているもの:
- 「abcd」ハッシュから「cd」ハッシュを減算します(多項式から最後の要素を削除します)
- 「abcd」ハッシュを
p ^ len( "cd" )
で割ります。ここp
で、 は基数 (素数) です。
これは次のとおりです。
a * p ^ 3 + b * p ^ 2 + c * p ^ 1 + d * p ^ 0
-abcd _
c * p ^ 1 + d * p ^ 0
- CD
abは次を取得します。
( ( a * p ^ 3 + b * p ^ 2 + c * p ^ 1 + d * p ^ 0 ) - ( c * p ^ 1 + d * p ^ 0 ) ) / ( p ^ 2 ) = a * p ^ 1 + b * p ^ 0
そして、オーバーフローがない場合p
(小さい場合)、これは機能します。しかし、そうでない場合は機能していません。
何か裏技とかありますか?
PSc++
タグは、特定のものであるため、番号のオーバーフローが原因です(そして、python、scheme、またはsthとは異なります)