Das Differenz von Summen Lösung vorgeschlagen Tobi und Mario kann in der Tat zu jedem anderen Datentyp verallgemeinert werden , für die wir eine (konstante Zeit) Binäroperation definieren ⊕ , der:Θ ( n )⊕
- insgesamt , so dass für alle Werte und b , a ⊕ b definiert und von der gleichen Art (oder zumindest von einigen geeigneten Supertypen davon, für die der Betreiber ⊕ definiert ist nach wie vor);einba ⊕ b⊕
- assoziativ , so dass ;a ⊕ ( b ⊕ c ) = ( a ⊕ b ) ⊕ c
- kommutativ , so dass ; unda ⊕ b = b ⊕ a
- cancellative , so dass es existiert ein inverser Operator dass erfüllt ( a ⊕ b ) ⊖ b = a . Technisch gesehen muss diese inverse Operation nicht unbedingt eine konstante Zeit sein, solange das "Subtrahieren" von zwei Summen von jeweils n Elementen nicht mehr als O ( n ) Zeit in Anspruch nimmt .⊖( a ⊕ b ) ⊖ b = anO ( n )
(Wenn der Typ nur eine begrenzte Anzahl unterschiedlicher Werte annehmen kann, reichen diese Eigenschaften aus, um ihn in eine abelsche Gruppe zu verwandeln . Selbst wenn dies nicht der Fall ist, handelt es sich zumindest um eine kommutative abbrechende Halbgruppe .)
Mit einer solchen Operation können wir die "Summe" eines Arrays a = ( a 1 , a 2 , … , a n ) als ( ⊕ definieren⊕a = ( a1, ein2, … , An) Wenn ein anderes Array b = ( b 1 , b 2 , ... , b n , b n + 1 ) alle Elemente von a plus ein zusätzliches Element x enthält , haben wir somit ( ⊕)
( ⊕ein ) = a1⊕ a2& Xoplus; ⋯ & xoplus; an.
b = ( b1,b2, … , Bn, bn + 1)einx , und so können wir dieses zusätzliche Element finden, indem wir berechnen:
x = ( ⊕(⊕b ) =( ⊕a ) ⊕ xx = ( ⊕b ) ⊖ ( ⊕a ) .
Wenn beispielsweise die Werte in den Arrays ganze Zahlen sind, dann ganzzahlige Addition (oder modulare Addition für finite Länge ganzen Zahlen Typen) kann als Operator verwendet werden , mit Subtraktion als die inverse Operation ⊖ . Alternativ kann für jeden Datentyp , deren Werte als fester Länge Bit - Strings dargestellt werden, können wir verwenden bitweise XOR als beide ⊕ und ⊖ .⊕⊖⊕⊖
Im Allgemeinen können wir die bitweise XOR-Methode sogar auf Zeichenfolgen variabler Länge anwenden, indem wir sie auf die erforderliche Länge auffüllen, sofern wir die Möglichkeit haben, die Auffüllung am Ende reversibel zu entfernen.
In einigen Fällen ist dies trivial. Beispielsweise codieren nullterminierte Byte-Strings im C-Stil implizit ihre eigene Länge, sodass die Anwendung dieser Methode für sie trivial ist: Wenn Sie zwei Strings per XOR verknüpfen, füllen Sie den kürzeren String mit null Bytes auf, damit die Länge übereinstimmt, und schneiden Sie alle zusätzlichen nachgestellten Nullen ab das Endergebnis. Beachten Sie, dass die XOR-Summen-Zwischenzeichenfolgen jedoch Null-Bytes enthalten können , sodass Sie deren Länge explizit speichern müssen (Sie benötigen jedoch höchstens ein oder zwei davon).
1001232Bei einer Länge von Bytes können wir die Länge jeder Zeichenfolge als 32-Bit-Ganzzahl codieren und der Zeichenfolge voranstellen. Oder wir könnten sogar beliebige Zeichenfolgenlängen mit einem Präfixcode codieren und diese den Zeichenfolgen voranstellen. Es gibt auch andere mögliche Codierungen.
Θ ( n )
Der einzige potenziell schwierige Teil besteht darin, dass wir eine eindeutige kanonische Bitstring-Darstellung für jeden Wert auswählen müssen, damit die Löschung funktioniert. Dies kann schwierig (möglicherweise sogar rechnerisch unentscheidbar) sein, wenn die Eingabewerte in den beiden Arrays angegeben werden in verschiedenen äquivalenten Darstellungen. Dies ist jedoch keine spezifische Schwäche dieser Methode; Jede andere Methode zur Lösung dieses Problems kann ebenfalls zum Scheitern verurteilt werden, wenn die Eingabe Werte enthalten darf, deren Äquivalenz nicht entschieden werden kann.