Una scansione lineare è la migliore che io sappia fare, se gli insiemi sono rappresentati come elenchi collegati ordinati. Il tempo di esecuzione è .O ( | A | + | B | )
Nota che non è necessario confrontare ogni elemento di con ogni elemento di B , a coppie. Ciò porterebbe a un tempo di esecuzione di O ( | A | × | B | ) , che è molto peggio. Invece, per calcolare la differenza simmetrica di questi due set, è possibile utilizzare una tecnica simile all'operazione "unisci" in mergesort, opportunamente modificata per omettere i valori comuni a entrambi i set.UNBO ( | A | × | B | )
Più in dettaglio, è possibile creare un algoritmo ricorsivo come il seguente per calcolare , supponendo che A e B siano rappresentati come elenchi collegati con i loro valori in ordine ordinato:A ∖ BUNB
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:])
L'ho rappresentato in pseudo-Python. Se non leggi Python, A[0]
è il capo dell'elenco collegato A
, A[1:]
è il resto dell'elenco e +
rappresenta la concatenazione degli elenchi. Per motivi di efficienza, se stai lavorando in Python, probabilmente non vorrai implementarlo esattamente come sopra - per esempio, potrebbe essere meglio usare i generatori, per evitare di creare molti elenchi temporanei - ma volevo mostrarti le idee nella forma più semplice possibile. Lo scopo di questo pseudo-codice è solo quello di illustrare l'algoritmo, non proporre un'implementazione concreta.
Non penso che sia possibile fare di meglio, se i tuoi set sono rappresentati come elenchi ordinati e vuoi che l'output sia fornito come un elenco ordinato. È fondamentalmente deve guardare ogni elemento di e B . Schizzo informale della giustificazione: se c'è qualche elemento che non hai guardato, non puoi emetterlo, quindi l'unico caso in cui puoi omettere di guardare un elemento è se sai che è presente sia in A che in B , ma come fai a sapere che è presente se non hai osservato il suo valore?UNBUNB