Ein linearer Scan ist das Beste, was ich tun kann, wenn die Sätze als sortierte verknüpfte Listen dargestellt werden. Die Laufzeit ist .O(|A|+|B|)
Beachten Sie, dass Sie nicht jedes Element von paarweise mit jedem Element von B vergleichen müssen. Das würde zu einer Laufzeit von O ( | A | × | B | ) führenABO(|A|×|B|) , was viel schlimmer ist. Um die symmetrische Differenz dieser beiden Mengen zu berechnen, können Sie stattdessen eine Technik verwenden, die der "Zusammenführungs" -Operation in mergesort ähnelt und die so geändert wurde, dass Werte weggelassen werden, die beiden Mengen gemeinsam sind.
Im Einzelnen können Sie einen rekursiven Algorithmus wie den folgenden erstellen , um zu berechnen , vorausgesetzt, A und B werden als verknüpfte Listen mit ihren Werten in sortierter Reihenfolge dargestellt: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:])
Ich habe dies in Pseudo-Python dargestellt. Wenn Sie Python nicht lesen, A[0]
ist es der Kopf der verknüpften Liste A
, A[1:]
der Rest der Liste und+
die Verkettung von Listen. Wenn Sie in Python arbeiten, möchten Sie es aus Effizienzgründen wahrscheinlich nicht genau so implementieren, wie oben beschrieben. Beispielsweise ist es möglicherweise besser, Generatoren zu verwenden, um das Erstellen vieler temporärer Listen zu vermeiden, aber ich wollte zeigen Ihnen die Ideen in möglichst einfacher Form. Der Zweck dieses Pseudocodes besteht nur darin, den Algorithmus zu veranschaulichen, und keine konkrete Implementierung vorzuschlagen.
Ich denke nicht, dass es besser geht, wenn Ihre Sets als sortierte Listen dargestellt werden und Sie möchten, dass die Ausgabe als sortierte Liste erfolgt. Man muss sich grundsätzlich jedes Element von und B ansehen . Informelle Rechtfertigungsskizze: Wenn es ein Element gibt, das Sie nicht angesehen haben, können Sie es nicht ausgeben. Daher können Sie nur dann auf die Betrachtung eines Elements verzichten, wenn Sie wissen, dass es sowohl in A als auch in B vorhanden ist. Aber woher wissen Sie, dass es vorhanden ist, wenn Sie seinen Wert nicht untersucht haben?ABAB