Una exploración lineal es lo mejor que sé hacer, si los conjuntos se representan como listas enlazadas ordenadas. El tiempo de ejecución es .O(|A|+|B|)
Tenga en cuenta que no necesita comparar cada elemento de con cada elemento de B , en pares. Eso llevaría a un tiempo de ejecución de O ( | A | × | B | ) , que es mucho peor. En cambio, para calcular la diferencia simétrica de estos dos conjuntos, puede usar una técnica similar a la operación "fusionar" en mergesort, modificada adecuadamente para omitir valores que son comunes a ambos conjuntos.ABO(|A|×|B|)
Con más detalle, puede crear un algoritmo recursivo como el siguiente para calcular , suponiendo que A y B se representen como listas vinculadas con sus valores en orden ordenado: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:])
Lo he representado en pseudo-Python. Si no lee Python, A[0]
es el encabezado de la lista vinculada A
, A[1:]
es el resto de la lista y +
representa la concatenación de listas. Por razones de eficiencia, si está trabajando en Python, probablemente no quiera implementarlo exactamente como se indicó anteriormente; por ejemplo, podría ser mejor usar generadores para evitar la creación de muchas listas temporales, pero quería mostrarle las ideas de la forma más simple posible. El propósito de este pseudocódigo es solo ilustrar el algoritmo, no proponer una implementación concreta.
No creo que sea posible hacerlo mejor, si sus conjuntos se representan como listas ordenadas y desea que la salida se proporcione como una lista ordenada. Usted fundamentalmente tiene que mirar todos los elementos de y B . Bosquejo informal de justificación: si hay algún elemento que no ha visto, no puede generarlo, por lo que el único caso en el que puede omitir mirar un elemento es si sabe que está presente tanto en A como en B , pero, ¿cómo podría saber que está presente si no ha analizado su valor?ABAB