Skan liniowy jest najlepszym, co wiem, jak to zrobić, jeśli zestawy są reprezentowane jako posortowane listy połączone. Czas działania to .O(|A|+|B|)
Zauważ, że nie musisz porównywać każdego elementu z każdym elementem B , parami. Prowadziłoby to do czasu wykonania O ( | A | × | B | ) , co jest znacznie gorsze. Zamiast tego, aby obliczyć różnicę symetryczną tych dwóch zestawów, można użyć techniki podobnej do operacji „scalania” w trybie scalania, odpowiednio zmodyfikowanej w celu pominięcia wartości wspólnych dla obu zestawów.ABO(|A|×|B|)
Bardziej szczegółowo, możesz zbudować algorytm rekurencyjny, taki jak poniżej, aby obliczyć , zakładając, że A i B są reprezentowane jako listy połączone z ich wartościami w uporządkowanej kolejności: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:])
Reprezentowałem to w pseudo-Pythonie. Jeśli nie czytasz Pythona, A[0]
jest on głową połączonej listy A
, A[1:]
jest resztą listy i +
reprezentuje konkatenację list. Ze względu na wydajność, jeśli pracujesz w Pythonie, prawdopodobnie nie chciałbyś go wdrożyć dokładnie tak, jak powyżej - na przykład lepiej byłoby użyć generatorów, aby uniknąć tworzenia wielu list tymczasowych - ale chciałem pokażę Ci pomysły w najprostszej możliwej formie. Celem tego pseudokodu jest jedynie zilustrowanie algorytmu, a nie zaproponowanie konkretnej implementacji.
Nie sądzę, aby można było zrobić coś lepszego, jeśli twoje zbiory są reprezentowane jako listy posortowane i chcesz, aby dane wyjściowe były dostarczane jako lista posortowana. Ci zasadniczo trzeba patrzeć na każdy element i B . Nieformalny szkic uzasadnienia: jeśli istnieje jakikolwiek element, którego nie obejrzałeś, nie możesz go wydrukować, więc jedynym przypadkiem, w którym możesz pominąć patrzenie na element, jest to, że wiesz, że jest on obecny zarówno w A, jak i B , ale skąd możesz wiedzieć, że jest obecny, jeśli nie spojrzałeś na jego wartość?ABAB