Симметричная разность: A∪B - A∩B
т.е. возвращает новый набор с элементами либо в A, либо в B, но не в обоих.Прямой способ из определения:
# result = A ^ B
result = set() # start with empty set
# add all items that are in A but not in B
for item in A: # for each item in A; O(|A|), where |A| - number of elements in A
if item not in B: # amortized O(1) (for hash-based implementation)
result.add(item) # amortized O(1) (for hash-based implementation)
# add all items that are in B but not in A
for item in B:
if item not in A:
result.add(item)
Сложность O(|A|+|B|)
.
В C ++ тип - unordered_set
, в Java, C # - HashSet
, в Python -set
.
Другой подход ( используемый в Python ) состоит в том, чтобы скопировать A в результат, а затем попытаться удалить B элементов из результата:
# result = A ^ B
result = set(A) # copy A into result
for item in B:
try: result.remove(item) # O(1)
except KeyError: # item was not in the result
result.add(item) # add previously not-found item
СложностьO(|A|+|B|)
.