の溶液により提案された差分オブ和トビとマリオは、実際には、我々は(一定時間)二項演算を定義することができるため、他のデータタイプに一般化することができる⊕あります。Θ (n )⊕
- 合計、そのような任意の値のこととB、⊕のBが定義されている同じタイプの(または操作者がいることのいくつかの適切なスーパータイプ、の少なくとも⊕まだ定義されています)。ab⊕ B⊕
- 連想、その結果⊕ (B ⊕ C )= (⊕ B )⊕ C。⊕ (B ⊕ C )= (⊕ B )⊕ C
- 可換ように、⊕ B = B ⊕。そして⊕ B = B ⊕ A
- cancellative逆オペレータが存在するように、満足すること(⊕ B )⊖ B =。技術的には、n要素の2つの合計をそれぞれ「減算」する時間がO(n )時間を超えない限り、この逆演算は必ずしも一定時間である必要はありません。⊖(⊕ B )⊖ B = AnO (n )
(型が有限数の異なる値しか受け取れない場合、これらのプロパティはそれをアーベル群にするのに十分です;そうでなくても、少なくとも可 換相殺半群になります。)
このような操作を使用して、我々は、アレイの"和"を定義することができ、A = (1、2、... 、N)としての(⊕⊕a = (a1、2、… 、an) 別のアレイの所与 B = (B 1、B 2、... 、B N、B N + 1)のすべての要素を含むプラス1つの追加の要素 Xを、我々はこのように持っている(⊕
(⊕a )= a1⊕ A2⊕ ⋯ ⊕ An。
b = (b1、b2、… 、 bn、bn + 1)aバツ、そして我々は計算することによって、この余分な要素を見つけることができるように:
X = (⊕(⊕b )=(⊕A )⊕ Xx =(⊕b )⊖(⊕a )。
アレイの値が整数である場合、例えば、次に加算(または整数モジュラ加算、有限長の整数タイプの)オペレータとして使用することができる逆の動作と減算と、⊖。代替的に、のために任意の値を持つ固定長のビット列として表すことができるデータの種類、我々が使用することができ、ビット単位XORを両方として⊕と⊖。⊕⊖⊕⊖
より一般的には、末尾のパディングを可逆的に削除する方法がある限り、必要に応じて同じ長さまでパディングすることで、可変長の文字列にビット単位のXORメソッドを適用することもできます。
場合によっては、これは簡単です。たとえば、Cスタイルのnullで終了するバイト文字列は暗黙的に独自の長さをエンコードするため、このメソッドをそれらに適用するのは簡単です。最終結果。ただし、中間のXOR-sum文字列にはnullバイトを含めることができるため、その長さを明示的に格納する必要があります(ただし、必要なのは1つまたは2つだけです)。
1001232バイト長の場合、各文字列の長さを32ビット整数としてエンコードし、文字列の先頭に追加できます。または、プレフィックスコードを使用して任意の文字列の長さをエンコードし、それらを文字列の先頭に追加することもできます。他の可能なエンコーディングも存在します。
Θ (n )
唯一の潜在的にトリッキーな部分は、キャンセルを機能させるために、各値に一意の標準ビット文字列表現を選択する必要があることです。2つの配列の入力値が与えられる場合、困難です異なる同等の表現で。ただし、これはこの方法の特定の弱点ではありません。入力に同値性が決定できない値が含まれることが許可されている場合、この問題を解決する他の方法も失敗させることができます。