Rozwiązanie różnicy sum zaproponowane przez Tobiego i Mario można w rzeczywistości uogólnić na dowolny inny typ danych, dla którego możemy zdefiniować operację binarną (o stałym czasie) ⊕, która:Θ ( n )⊕
- Całkowita tak, że dla wszystkich wartości i b , ⊕ b jest określony i tego samego rodzaju (przynajmniej w pewnym odpowiednim supertypem nim, na którym operator ⊕ wciąż wyżej);zaba ⊕ b⊕
- asocjacyjny , taki, że ;a ⊕ ( b ⊕ c ) = ( a ⊕ b ) ⊕ c
- przemienne , takie, że ; ia ⊕ b = b ⊕ a
- anulujący , taki, że istnieje operator odwrotny który spełnia ( a ⊕ b ) ⊖ b = a . Technicznie rzecz biorąc, ta odwrotna operacja niekoniecznie musi być czasem stałym, o ile „odjęcie” dwóch sum n elementów nie zajmuje więcej niż O ( n ) czasu.⊖( a ⊕ b ) ⊖ b = anO ( n )
(Jeśli typ może przyjąć tylko skończoną liczbę odrębnych wartości, właściwości te są wystarczające, aby przekształcić go w grupę abelową ; nawet jeśli nie, będzie to przynajmniej przemienna półgrupa anulacyjna ).
Za pomocą takiej operacji możemy zdefiniować „sumę” tablicy a = ( a 1 , a 2 , … , a n ) jako ( ⊕⊕a = ( a1, a2), … , An) Biorąc pod uwagę macierz drugiego b = ( b 1 , b 2 , ... , b n , b, n + 1 ) , zawierający wszystkie elementyplus jeden dodatkowy element X , mamy więc ( ⊕
( ⊕a ) = a1⊕ a2)⊕ ⋯ ⊕ an.
b = ( b1, b2), … , Bn, bn + 1)zax , więc możemy znaleźć ten dodatkowy element, obliczając:
x = ( ⊕( ⊕b ) = ( ⊕za ) ⊕ xx = ( ⊕b ) ⊖ ( ⊕za) .
Na przykład, jeśli wartości w tablicach są liczbami całkowitymi, to dodawanie liczb całkowitych (lub dodawanie modułowe dla typów liczb całkowitych o skończonej długości) może być użyte jako operator , z odejmowaniem jako operacja odwrotna ⊖ . Alternatywnie, dla dowolnego typu danych, którego wartości mogą być reprezentowane jako ciągi bitów o stałej długości, możemy użyć bitowego XOR jako ⊕ i ⊖ .⊕⊖⊕⊖
Mówiąc bardziej ogólnie, możemy nawet zastosować bitową metodę XOR do łańcuchów o zmiennej długości, wypełniając je do tej samej długości, jeśli to konieczne, o ile mamy jakiś sposób na odwrócenie usunięcia wypełnienia na końcu.
W niektórych przypadkach jest to banalne. Na przykład ciągi bajtowe zakończone znakiem null w stylu C domyślnie kodują własną długość, więc zastosowanie dla nich tej metody jest trywialne: gdy XORing dwóch ciągów, wypełnij krótszy bajtami zerowymi, aby dopasować ich długość, i odetnij dodatkowe końcowe null z Wynik końcowy. Zauważ, że pośrednie łańcuchy sumy XOR mogą zawierać bajty zerowe, więc musisz jawnie zapisać ich długość (ale potrzebujesz tylko jednego lub dwóch z nich).
Mówiąc bardziej ogólnie, jedną metodą, która działałaby dla dowolnych ciągów bitów, byłoby zastosowanie wypełnienia jednobitowego , w którym każdy wejściowy ciąg bitów jest wypełniany jednym bitem, a następnie tyloma bitami 0, ile potrzeba, aby dopasować (wypełnioną) długość najdłuższy ciąg wejściowy. (Oczywiście tego wypełniania nie trzeba wykonywać z wyprzedzeniem; możemy go po prostu zastosować w razie potrzeby podczas obliczania sumy XOR.) Na koniec musimy po prostu usunąć końcowe bity 0 i ostatni 1 bit z wynik. Alternatywnie, gdybyśmy wiedzieli, że struny mają np. Maksymalnie 2 3210012)32bajtów długości, możemy zakodować długość każdego łańcucha jako 32-bitową liczbę całkowitą i dodać go do łańcucha. Lub moglibyśmy nawet zakodować dowolne długości ciągów za pomocą jakiegoś kodu prefiksu i wstawić je do ciągów. Istnieją również inne możliwe kodowania.
W rzeczywistości, ponieważ każdy typ danych do zakodowania w komputerze, z definicji, jest przedstawiony jako ciąg bitów skończonej długości, metoda ta daje rodzajowy rozwiązanie tego problemu.Θ ( n )
Jedyną potencjalnie trudną częścią jest to, że aby anulowanie zadziałało, musimy wybrać unikalną kanoniczną reprezentację ciągu bitowego dla każdej wartości, co może być trudne (a nawet potencjalnie nierozstrzygalne obliczeniowo), jeśli można podać wartości wejściowe w dwóch tablicach w różnych reprezentacjach równoważnych. Nie jest to jednak szczególna słabość tej metody; każda inna metoda rozwiązania tego problemu może również zawieść, jeśli dane wejściowe mogą zawierać wartości, których równoważność jest nierozstrzygalna.