Các sự khác biệt-of-tiền giải pháp được đề xuất bởi Tobi và Mario trong thực tế có thể được khái quát hóa cho bất kỳ loại dữ liệu khác mà chúng ta có thể định nghĩa một (không đổi theo thời gian) hoạt động nhị phân ⊕ đó là:Θ(n)⊕
- tổng , như vậy mà cho bất kỳ giá trị và b , một ⊕ b được định nghĩa và cùng loại (hoặc ít nhất là một số siêu kiểu thích hợp của nó, mà các nhà điều hành ⊕ vẫn được xác định);aba⊕b⊕
- kết hợp , sao cho ;a⊕(b⊕c)=(a⊕b)⊕c
- giao hoán , như vậy mà ; vàa⊕b=b⊕a
- cancellative , chẳng hạn rằng có tồn tại một nhà điều hành ngược thỏa mãn ( một ⊕ b ) ⊖ b = một . Về mặt kỹ thuật, thao tác nghịch đảo này thậm chí không nhất thiết phải là thời gian không đổi, miễn là "trừ" hai tổng số n phần tử, mỗi phần tử không mất nhiều thời gian hơn O ( n ) .⊖(a⊕b)⊖b=anO(n)
(Nếu loại chỉ có thể có một số lượng hữu hạn các giá trị riêng biệt, thì các thuộc tính này đủ để biến nó thành một nhóm Abel ; ngay cả khi không, ít nhất nó sẽ là một nửa nhóm hủy giao hoán .)
Sử dụng như một hoạt động , chúng ta có thể xác định "tiền" của một mảng một = ( một 1 , một 2 , ... , một n ) như ( ⊕⊕a=(a1,a2,…,an) Với một mảng b = ( b 1 , b 2 , ... , b n , b n + 1 ) chứa tất cả các yếu tố của một cộng với một yếu tố thêm x , chúng ta nên có ( ⊕
(⊕a)=a1⊕a2⊕⋯⊕an.
b=(b1,b2,…,bn,bn+1)ax , và vì vậy chúng tôi có thể tìm thấy yếu tố phụ này bằng cách tính toán:
x = ( ⊕(⊕b)=(⊕a)⊕xx=(⊕b)⊖(⊕a ).
Ví dụ, nếu các giá trị trong mảng là các số nguyên, sau đó số nguyên Ngoài (hoặc modul nữa cho số nguyên hữu hạn có độ dài các loại) có thể được sử dụng như các nhà điều hành , với phép trừ như các hoạt động ngược ⊖ . Ngoài ra, đối với bất kỳ kiểu dữ liệu có giá trị có thể được biểu diễn dưới dạng chuỗi bit chiều dài cố định, chúng ta có thể sử dụng Bitwise XOR như cả ⊕ và ⊖ .⊕⊖⊕⊖
Tổng quát hơn, chúng ta thậm chí có thể áp dụng phương pháp XOR bitwise cho các chuỗi có độ dài thay đổi, bằng cách đệm chúng lên cùng một độ dài cần thiết, miễn là chúng ta có một số cách để loại bỏ phần đệm ở cuối.
Trong một số trường hợp, điều này là tầm thường. Ví dụ, các chuỗi byte kết thúc null kiểu C hoàn toàn mã hóa độ dài của riêng chúng, do đó, áp dụng phương thức này cho chúng là không quan trọng: khi XORing hai chuỗi, đệm chuỗi ngắn hơn với byte rỗng để làm cho độ dài của chúng khớp với nhau kết quả cuối cùng. Tuy nhiên, xin lưu ý rằng các chuỗi tổng XOR trung gian có thể chứa byte rỗng, do đó, bạn sẽ cần lưu trữ độ dài của chúng một cách rõ ràng (nhưng bạn sẽ chỉ cần tối đa một hoặc hai trong số chúng).
Tổng quát hơn, một phương thức hoạt động cho các chuỗi bit tùy ý sẽ là áp dụng đệm một bit , trong đó mỗi chuỗi bit đầu vào được đệm với bit đơn và sau đó có càng nhiều 0 bit cần thiết để khớp với độ dài (đệm) của chuỗi đầu vào dài nhất. (Tất nhiên, phần đệm này không cần phải được thực hiện trước một cách rõ ràng; chúng ta chỉ có thể áp dụng nó khi cần trong khi tính toán tổng XOR.) Cuối cùng, chúng ta chỉ cần tách bất kỳ bit 0 nào và 1 bit cuối cùng từ kết quả. Ngoài ra, nếu chúng ta biết rằng các chuỗi là ví dụ nhiều nhất là 2 321001232dài byte, chúng ta có thể mã hóa độ dài của mỗi chuỗi dưới dạng một số nguyên 32 bit và thêm nó vào chuỗi. Hoặc thậm chí chúng ta có thể mã hóa độ dài chuỗi tùy ý bằng cách sử dụng một số mã tiền tố và thêm chúng vào chuỗi. Các mã hóa khác có thể tồn tại là tốt.
Trong thực tế, do bất kỳ loại dữ liệu nào có thể biểu diễn trên máy tính, theo định nghĩa, có thể được biểu diễn dưới dạng chuỗi bit có độ dài hữu hạn, phương pháp này mang lại giải pháp cho vấn đề.Θ ( n )
Phần khó khăn tiềm năng duy nhất là, để hủy bỏ hoạt động, chúng ta cần chọn một đại diện chuỗi bit chính tắc duy nhất cho mỗi giá trị, điều này có thể khó khăn (thực sự, thậm chí có thể tính toán được) nếu các giá trị đầu vào trong hai mảng có thể được đưa ra trong các đại diện tương đương khác nhau. Tuy nhiên, đây không phải là điểm yếu cụ thể của phương pháp này; bất kỳ phương pháp nào khác để giải quyết vấn đề này cũng có thể được thực hiện để thất bại nếu đầu vào được phép chứa các giá trị có tính tương đương là không thể giải quyết được.