Un balayage linéaire est le meilleur que je sais faire, si les ensembles sont représentés sous forme de listes chaînées triées. Le temps d'exécution est .O(|A|+|B|)
Notez que vous n'avez pas besoin de comparer chaque élément de à chaque élément de B , par paire. Cela conduirait à un temps d'exécution de O ( | A | × | B | ) , ce qui est bien pire. Au lieu de cela, pour calculer la différence symétrique de ces deux ensembles, vous pouvez utiliser une technique similaire à l'opération de "fusion" dans mergesort, modifiée de manière appropriée pour omettre les valeurs communes aux deux ensembles.ABO(|A|×|B|)
Plus en détail, vous pouvez créer un algorithme récursif comme le suivant pour calculer , en supposant que A et B sont représentés sous forme de listes liées avec leurs valeurs dans l'ordre trié: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:])
J'ai représenté cela en pseudo-Python. Si vous ne lisez pas Python, A[0]
est la tête de la liste liée A
, A[1:]
est le reste de la liste et +
représente la concaténation des listes. Pour des raisons d'efficacité, si vous travaillez en Python, vous ne voudrez probablement pas l'implémenter exactement comme ci-dessus - par exemple, il serait préférable d'utiliser des générateurs, pour éviter de créer de nombreuses listes temporaires - mais je voulais vous montrer les idées sous la forme la plus simple possible. Le but de ce pseudo-code est juste d'illustrer l'algorithme, pas de proposer une implémentation concrète.
Je ne pense pas qu'il soit possible de faire mieux, si vos ensembles sont représentés sous forme de listes triées et que vous souhaitez que la sortie soit fournie sous forme de liste triée. Vous avez fondamentalement regarder tous les éléments de et B . Croquis informel de justification: s'il y a un élément que vous n'avez pas regardé, vous ne pouvez pas le produire, donc le seul cas où vous pouvez omettre de regarder un élément est si vous savez qu'il est présent à la fois dans A et B , mais comment pourriez-vous savoir qu'il est présent si vous n'avez pas regardé sa valeur?ABAB