セットが並べ替えられたリンクリストとして表されている場合、線形スキャンは、私が行う方法を知っている最高の方法です。実行時間はです。O (| A | + | B |)
のすべての要素をすべての要素とペアで比較する必要はないことに注意してください。それは実行時間につながりますが、これはさらに悪いことです。代わりに、これら2つのセットの対称差を計算するために、mergesortの「マージ」操作に似た手法を使用して、両方のセットに共通する値を省略するように適切に変更できます。ABO (| A | × | B |)
より詳細には、次のような再帰アルゴリズムを構築して、とが値がソートされたリンクリストとして表されると仮定して、を計算できます。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:])
これを擬似Pythonで表現しました。あなたは、Pythonを読んでいない場合は、A[0]
リンクリストの先頭でA
、A[1:]
リストの残りの部分で、+
リストの連結を表します。効率上の理由から、Pythonで作業している場合、おそらく上記のように正確に実装することは望ましくありません(たとえば、多くの一時リストを作成しないようにジェネレーターを使用した方がよい場合があります)アイデアを可能な限りシンプルな形で示します。この擬似コードの目的は、具体的な実装を提案することではなく、アルゴリズムを説明することだけです。
セットが並べ替えられたリストとして表され、出力が並べ替えられたリストとして提供されるようにしたい場合、これ以上良いことはできないと思います。基本的に、とすべての要素を調べる必要があります。正当化の非公式スケッチ:あなたはそれが両方に存在している知っている場合は、要素を見て省略することができる唯一のケースがあるので、あなたは、あなたがそれを出力することはできませんが、見ていないことをすべての要素がある場合にはと、しかし、その値を見ていなかった場合、どうしてそれが存在することを知ることができますか?ABAB