The perbedaan-jumlah yang diusulkan olehTobidanMariosebenarnya dapat digeneralisasi ke tipe data lain yang kita dapat mendefinisikan operasi biner (waktu konstan) ⊕ yaitu:Θ(n)⊕
- total , sehingga untuk nilai apa pun dan bab , didefinisikan dan dari jenis yang sama (atau setidaknya beberapa supertype yang tepat itu, yang operator ⊕ masih ditentukan);a⊕b⊕
- asosiatif , sehingga ;a⊕(b⊕c)=(a⊕b)⊕c
- komutatif , seperti itu ; dana⊕b=b⊕a
- pembatalan , sedemikian sehingga terdapat operator terbalik yang memenuhi ( a ⊕ b ) ⊖ b = a . Secara teknis, operasi terbalik ini bahkan tidak harus waktu yang konstan, selama "mengurangi" dua jumlah⊖(a⊕b)⊖b=a elemen yang masing-masing tidak memerlukan waktu lebih dari O ( n ) .nO(n)
(Jika tipe hanya dapat mengambil sejumlah nilai berbeda, properti ini cukup untuk membuatnya menjadi grup Abelian ; bahkan jika tidak, itu setidaknya akan menjadi semigroup pembatalan komutatif .)
Menggunakan operasi semacam itu , kita dapat mendefinisikan "jumlah" dari array a = ( a 1 , a 2 , …⊕a=(a1,a2,…,an)
(⊕a)=a1⊕a2⊕⋯⊕an.
b=(b1,b2,…,bn,bn+1)ax(⊕b)=(⊕a)⊕xx=(⊕b)⊖(⊕a).
⊕⊖⊕⊖
Secara lebih umum, kita bahkan dapat menerapkan metode XOR bitwise ke string dengan panjang variabel, dengan menambahkan mereka ke panjang yang sama seperti yang diperlukan, selama kita memiliki beberapa cara untuk menghapus pembalikan padding di akhir.
Dalam beberapa kasus, ini sepele. Sebagai contoh, C-style null terminasi byte string secara implisit mengkodekan panjangnya sendiri, jadi menerapkan metode ini untuk mereka adalah sepele: ketika XORing dua string, pad yang lebih pendek dengan null byte untuk membuat panjangnya cocok, dan pangkas setiap tambahan trailing nulls dari hasil akhir. Perhatikan bahwa string XOR-jumlah menengah dapat berisi byte nol, jadi Anda harus menyimpan panjangnya secara eksplisit (tetapi paling banyak hanya membutuhkan satu atau dua dari mereka).
1001232byte panjang, kita bisa menyandikan panjang setiap string sebagai integer 32-bit dan menambahkannya ke string. Atau kita bahkan bisa menyandikan panjang string acak menggunakan beberapa kode awalan , dan menambahkannya ke string. Penyandian lain yang mungkin ada juga.
Θ(n)
Satu-satunya bagian yang berpotensi rumit adalah bahwa, untuk pembatalan agar berfungsi, kita perlu memilih representasi bitstring kanonik unik untuk setiap nilai, yang mungkin sulit (memang, bahkan berpotensi secara komputasi tidak dapat dipastikan) jika nilai input dalam dua array dapat diberikan dalam representasi setara yang berbeda. Namun ini bukan kelemahan spesifik dari metode ini; metode lain untuk memecahkan masalah ini juga dapat dibuat gagal jika input diizinkan mengandung nilai yang ekivalennya tidak dapat diputuskan.