Uma varredura linear é a melhor que eu sei fazer, se os conjuntos forem representados como listas vinculadas classificadas. O tempo de execução é .O ( | A | + | B | )
Observe que você não precisa comparar todos os elementos de com todos os elementos de B , em pares. Isso levaria a um tempo de execução de O ( | A | × | B | ) , que é muito pior. Em vez disso, para calcular a diferença simétrica desses dois conjuntos, você pode usar uma técnica semelhante à operação "mesclar" no mergesort, modificada adequadamente para omitir valores comuns a ambos os conjuntos.UMABO ( | A | × | B | )
Mais detalhadamente, você pode criar um algoritmo recursivo como o seguinte para calcular , assumindo que A e B sejam representados como listas vinculadas com seus valores em ordem classificada:A ∖ BUMAB
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:])
Eu representei isso em pseudo-Python. Se você não lê Python, A[0]
é o chefe da lista vinculada A
, A[1:]
é o restante da lista e +
representa a concatenação de listas. Por motivos de eficiência, se você estiver trabalhando em Python, provavelmente não deseja implementá-lo exatamente como acima - por exemplo, talvez seja melhor usar geradores, para evitar a criação de muitas listas temporárias - mas eu queria mostre as idéias da forma mais simples possível. O objetivo deste pseudocódigo é apenas ilustrar o algoritmo, não propor uma implementação concreta.
Eu não acho que seja possível melhorar, se seus conjuntos forem representados como listas classificadas e você desejar que a saída seja fornecida como uma lista classificada. Você fundamentalmente tem que olhar para cada elemento de e B . Esboço informal da justificativa: se houver algum elemento que você não tenha examinado, não poderá produzi-lo; portanto, o único caso em que você pode omitir a observação de um elemento é se souber que ele está presente em A e B , mas como você poderia saber que ele está presente se não analisou seu valor?UMABUMAB