різницеві через сум рішення , запропоноване Tobi і Маріо насправді може бути узагальнений на будь-який інший тип даних , для якого ми можемо визначити (постійне час) бінарна операцію ⊕ , яке:Θ ( n )⊕
- всього , таким чином, що при будь-яких значеннях і б , ⊕ б визначена і ті ж типу (або , щонайменше , деякі відповідного надтип нього, для якого оператор ⊕ по - , як і раніше визначається);абa ⊕ b⊕
- асоціативний , такий, що ;a ⊕ ( b ⊕ c ) = ( a ⊕ b ) ⊕ c
- комутативний , такий, що ; іa ⊕ b = b ⊕ a
- скоротна , таким чином, що існує зворотний оператор , який задовольняє умові ( ⊕ б ) ⊖ б = . Технічно ця обернена операція навіть не обов'язково повинна бути постійною за часом, доки "віднімання" двох сум з n елементів не займе більше, ніж O ( n ) часу.⊖( a ⊕ b ) ⊖ b = aнO ( n )
(Якщо тип може приймати лише обмежену кількість різних значень, цих властивостей достатньо, щоб перетворити його в абелеву групу ; навіть якщо ні, це буде принаймні комутативна відмінна напівгрупа .)
З допомогою такої операції , ми можемо визначити «суму» масиву а = ( 1 , 2 , ... , н ) як ( ⊕⊕a = ( a1, а2, … , Ан) З огляду наінший масив Ь = ( Ь 1 , б 2 , ... , б п , б п + 1 ) , що містить всі елементиплюс один додатковий елемент х , митаким чиномє ( ⊕
( ⊕а ) = а1⊕ а2⊕ ⋯ ⊕ aн.
b = ( b1, б2, … , Бн, бn + 1)ах , і тому ми можемо знайти цей додатковий елемент, обчисливши:
x = ( ⊕( ⊕б ) = ( ⊕а ) ⊕ xx = ( ⊕б ) ⊖ ( ⊕а ) .
Наприклад, якщо значення масивів є цілими числами, то ціле додавання (або модульне додавання для цілих чисел кінцевої довжини) може використовуватися як оператор , з відніманням як обернена операція ⊖ . Як альтернативи, для будь-якого типу даних, значення яких можуть бути представлені в вигляді бітових рядків фіксованої довжини, ми можемо використовувати побітовое XOR і як ⊕ і ⊖ .⊕⊖⊕⊖
Більш загально, ми можемо навіть застосувати побітовий метод XOR до рядків змінної довжини, додавши їх до тієї самої довжини, скільки потрібно, доки у нас є спосіб реверсивно видалити оббивки в кінці.
У деяких випадках це банально. Наприклад, нульові завершені рядки байтів, що закінчуються C, неявно кодують власну довжину, тому застосування цього методу для них є тривіальним: коли XORing два рядки, прокладіть коротший з нульовими байтами, щоб їх довжина збігалася, і обріжте будь-які додаткові кінцеві нулі з кінцевий результат. Зауважте, що проміжні рядки суми XOR можуть містити нульові байти, тому вам потрібно буде чітко зберігати їх довжину (але вам потрібно лише максимум один або два).
1001232байтів у довжину, ми могли б кодувати довжину кожного рядка як 32-бітове ціле число і додавати його до рядка. Або ми могли навіть кодувати довільну довжину рядків за допомогою деякого коду префікса і додавати їх до рядків. Існують і інші можливі кодування.
Θ ( n )
Єдина потенційно складна частина полягає в тому, що для скасування роботи нам потрібно вибрати унікальне канонічне подання бітових рядків для кожного значення, що може бути важко (насправді, потенційно навіть обчислювально невизначним), якщо вхідні значення в двох масивах можуть бути задані в різних рівнозначних уявленнях. Однак це не є специфічною слабкістю цього методу; будь-який інший метод вирішення цієї проблеми також може бути невдалим, якщо вхід дозволено містити значення, еквівалентність яких не визначається.