El diferencia de sumas solución propuesta por Tobi y Mario de hecho, puede ser generalizado a cualquier otro tipo de datos para los que podemos definir un (constante de tiempo) operación binaria ⊕ que es:Θ ( n )⊕
- total de , tal que para cualquier valor de y b , un ⊕ b se define y del mismo tipo (o al menos de algunos supertipo apropiada de la misma, para que el operador ⊕ todavía se define);unasia ⊕ b⊕
- asociativo , tal que ;a ⊕ ( b ⊕ c ) = ( a ⊕ b ) ⊕ c
- conmutativo , de modo que ; ya ⊕ b = b ⊕ a
- cancelativo , de modo que existe un operador inverso que satisface ( a ⊕ b ) ⊖ b = a . Técnicamente, esta operación inversa ni siquiera tiene que ser necesariamente de tiempo constante, siempre y cuando "restar" dos sumas de n elementos cada una no tome más de O ( n ) tiempo.⊖( a ⊕ b ) ⊖ b = anorteO ( n )
(Si el tipo solo puede tomar un número finito de valores distintos, estas propiedades son suficientes para convertirlo en un grupo abeliano ; incluso si no, al menos será un semigrupo conmutativo cancelativo ).
Usando tal operación , podemos definir la "suma" de una matriz a = ( a 1 , a 2 , ... , a n ) como ( ⊕⊕a = ( a1, una2, ... , unnorte) Dada otra matriz b = ( b 1 , b 2 , … , b n , b n + 1 ) que contiene todos los elementos de a más un elemento extra x , tenemos ( ⊕
(⊕a)=a1⊕a2⊕⋯⊕an.
b=(b1,b2,…,bn,bn+1)ax , y entonces podemos encontrar este elemento adicional calculando:
x = ( ⊕(⊕b)=(⊕a)⊕xx=(⊕b)⊖(⊕a).
⊕⊖⊕⊖
En términos más generales, incluso podemos aplicar el método XOR bit a bit a cadenas de longitud variable, rellenándolas hasta la misma longitud que sea necesaria, siempre que tengamos alguna forma de eliminar el relleno de forma reversible al final.
En algunos casos, esto es trivial. Por ejemplo, las cadenas de bytes terminadas en nulo estilo C codifican implícitamente su propia longitud, por lo que aplicar este método para ellas es trivial: cuando XORing dos cadenas, rellene la más corta con bytes nulos para hacer que su longitud coincida, y recorte cualquier nulo final adicional de el resultado final. Sin embargo, tenga en cuenta que las cadenas de suma XOR intermedias pueden contener bytes nulos, por lo que deberá almacenar su longitud explícitamente (pero solo necesitará uno o dos como máximo).
1001232bytes de longitud, podríamos codificar la longitud de cada cadena como un entero de 32 bits y anteponerla a la cadena. O incluso podríamos codificar longitudes de cadena arbitrarias utilizando algún código de prefijo y anteponerlas a las cadenas. También existen otras posibles codificaciones.
Θ(n)
La única parte potencialmente complicada es que, para que la cancelación funcione, necesitamos elegir una representación de cadena de bits canónica única para cada valor, lo que podría ser difícil (de hecho, potencialmente incluso computacionalmente indecidible) si se pueden proporcionar los valores de entrada en las dos matrices. en diferentes representaciones equivalentes. Sin embargo, esta no es una debilidad específica de este método; cualquier otro método para resolver este problema también puede fallar si se permite que la entrada contenga valores cuya equivalencia es indecidible.