Pemindaian linier adalah yang terbaik yang saya tahu bagaimana melakukannya, jika set diwakili sebagai daftar tertaut yang diurutkan. Waktu berjalan adalah .O(|A|+|B|)
Perhatikan bahwa Anda tidak perlu membandingkan setiap elemen terhadap setiap elemen B , berpasangan. Itu akan menyebabkan runtime O ( | A | × | B | ) , yang jauh lebih buruk. Sebagai gantinya, untuk menghitung perbedaan simetris dari dua set ini, Anda dapat menggunakan teknik yang mirip dengan operasi "penggabungan" di mergesort, yang dimodifikasi untuk menghilangkan nilai-nilai yang umum untuk kedua set.ABO(|A|×|B|)
Secara lebih rinci, Anda dapat membangun algoritme rekursif seperti berikut untuk menghitung , dengan asumsi A dan B direpresentasikan sebagai daftar tertaut dengan nilainya dalam urutan:A∖BAB
difference(A, B):
if len(B)=0:
return A # return the leftover list
if len(A)=0:
return B # return the leftover list
if A[0] < B[0]:
return [A[0]] + difference(A[1:], B)
elsif A[0] = B[0]:
return difference(A[1:], B[1:]) # omit the common element
else:
return [B[0]] + difference(A, B[1:])
Saya sudah mewakili ini dalam pseudo-Python. Jika Anda tidak membaca Python, A[0]
adalah kepala dari daftar yang ditautkan A
, A[1:]
adalah sisa dari daftar, dan +
mewakili gabungan daftar. Untuk alasan efisiensi, jika Anda bekerja dengan Python, Anda mungkin tidak ingin mengimplementasikannya persis seperti di atas - misalnya, mungkin lebih baik menggunakan generator, untuk menghindari membangun banyak daftar sementara - tetapi saya ingin menunjukkan kepada Anda ide-ide dalam bentuk sesederhana mungkin. Tujuan dari pseudo-code ini hanya untuk menggambarkan algoritma, bukan mengusulkan implementasi konkret.
Saya tidak berpikir itu mungkin untuk melakukan yang lebih baik, jika set Anda direpresentasikan sebagai daftar yang diurutkan dan Anda ingin hasilnya disediakan sebagai daftar yang diurutkan. Anda fundamental harus melihat setiap elemen dari dan B . Sketsa pembenaran informal: Jika ada elemen yang belum Anda lihat, Anda tidak bisa menampilkannya, jadi satu-satunya kasus di mana Anda dapat menghilangkan melihat elemen adalah jika Anda tahu elemen itu ada di A dan B , tetapi bagaimana Anda bisa tahu bahwa itu ada jika Anda belum melihat nilainya?ABAB