Quét tuyến tính là cách tốt nhất mà tôi biết cách thực hiện, nếu các bộ được biểu diễn dưới dạng danh sách liên kết được sắp xếp. Thời gian chạy là .O(|A|+|B|)
Lưu ý rằng bạn không cần so sánh mọi yếu tố của với mọi yếu tố của B , theo cặp. Điều đó sẽ dẫn đến thời gian chạy của O ( | A | × | B | ) , tệ hơn nhiều. Thay vào đó, để tính toán sự khác biệt đối xứng của hai bộ này, bạn có thể sử dụng một kỹ thuật tương tự như thao tác "hợp nhất" trong sáp nhập, được sửa đổi phù hợp để bỏ qua các giá trị chung cho cả hai bộ.ABO(|A|×|B|)
Chi tiết hơn, bạn có thể xây dựng một thuật toán đệ quy như sau để tính , giả sử A và B được biểu diễn dưới dạng danh sách được liên kết với các giá trị của chúng theo thứ tự sắp xếp: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:])
Tôi đã trình bày điều này bằng giả Python. Nếu bạn không đọc Python, A[0]
là người đứng đầu danh sách được liên kết A
, A[1:]
là phần còn lại của danh sách và +
đại diện cho việc ghép các danh sách. Vì lý do hiệu quả, nếu bạn đang làm việc với Python, có lẽ bạn sẽ không muốn triển khai chính xác như trên - ví dụ, có thể tốt hơn khi sử dụng trình tạo, để tránh xây dựng nhiều danh sách tạm thời - nhưng tôi muốn cho bạn thấy những ý tưởng ở dạng đơn giản nhất có thể. Mục đích của mã giả này chỉ là để minh họa thuật toán, không đề xuất một triển khai cụ thể.
ABAB