Решение разности сумм, предложенное Тоби и Марио, может быть фактически обобщено для любого другого типа данных, для которого мы можем определить двоичную операцию (с постоянным временем) ⊕, которая:Θ(n)⊕
- всего , таким образом, что при любых значениях и б , ⊕ б определена и те же типа (или , по меньшей мере , некоторые соответствующего надтип него, для которого оператор ⊕ по - прежнему определяется);aba⊕b⊕
- ассоциативный , такой, что ;a⊕(b⊕c)=(a⊕b)⊕c
- коммутативный , такой, что ; иa⊕b=b⊕a
- сократимая , таким образом, что существует обратный оператор , который удовлетворяет условию ( ⊕ б ) ⊖ б = . Технически, эта обратная операция даже не обязательно должна иметь постоянное время, если «вычитание» двух сумм из n элементов каждый не займет больше O ( n ) времени.⊖(a⊕b)⊖b=anO(n)
(Если тип может принимать только конечное число различных значений, этих свойств достаточно, чтобы превратить его в абелеву группу ; даже если нет, он будет, по крайней мере, коммутативной полугруппой сокращения .)
⊕a=(a1,a2,…,an)
(⊕a)=a1⊕a2⊕⋯⊕an.
b=(b1,b2,…,bn,bn+1)ax(⊕b)=(⊕a)⊕xx=(⊕b)⊖(⊕a).
⊕⊖⊕⊖
В более общем смысле, мы можем даже применить побитовый метод XOR к строкам переменной длины, дополняя их до той же длины, что и при необходимости, при условии, что у нас есть некоторый способ обратимо удалить заполнение в конце.
В некоторых случаях это тривиально. Например, строки байтов с нулевым символом в конце в стиле C неявно кодируют свою собственную длину, поэтому применение этого метода для них тривиально: когда XOR обрабатывает две строки, дополняет более короткую строку нулевыми байтами, чтобы соответствовать их длине, и обрезает любые дополнительные завершающие нули из конечный результат. Обратите внимание, что промежуточные строки XOR-суммы могут содержать нулевые байты, поэтому вам нужно явно хранить их длину (но вам понадобится только один или два из них максимум).
1001232длиной в байты мы могли бы закодировать длину каждой строки как 32-разрядное целое и добавить ее к строке. Или мы могли бы даже кодировать произвольные длины строк, используя некоторый префиксный код , и добавлять их к строкам. Существуют и другие возможные кодировки.
Θ(n)
Единственная потенциально сложная часть заключается в том, что для отмены работы нам нужно выбрать уникальное каноническое представление цепочки битов для каждого значения, что может быть трудным (даже потенциально неразрешимым с точки зрения вычислений), если могут быть заданы входные значения в двух массивах. в разных эквивалентных представлениях. Это не особая слабость этого метода, однако; любой другой метод решения этой проблемы также может быть потерпел неудачу, если входные данные могут содержать значения, эквивалентность которых неразрешима.