2 つのセットが与えられた場合に、それらの交差を線形時間で計算するアルゴリズムはありますか?
2 つのループを実行for
して要素のすべてのペアをチェックし、両方のセットで見つかった要素を記録できます。ただし、実行時間は O(n 2 ) になります。これを O(n) 時間で行うにはどうすればよいですか?
2 つのセットが与えられた場合に、それらの交差を線形時間で計算するアルゴリズムはありますか?
2 つのループを実行for
して要素のすべてのペアをチェックし、両方のセットで見つかった要素を記録できます。ただし、実行時間は O(n 2 ) になります。これを O(n) 時間で行うにはどうすればよいですか?
それはあなたのセットの実装に依存します。
ハッシュ セット (O(1) ルックアップ) がある場合、他のすべての投稿者が示したアプローチは正しいです。最初のセットのすべての要素を反復処理します。2 番目のセットにある場合は、結果に追加します。これは O(n) 時間で実行されます。
ツリー セット (O(lg n) ルックアップ) がある場合、このアプローチは機能しますが、O(n lg n) 時間で実行されます。もっと上手にできます。O(n) ソリューションがあります。2 つのセットの要素を昇順でトラバースできるある種の反復子があると仮定します。もしそうなら、問題は「2 つのリストをソートされた順序で与えて、それらの交点を見つけること」です。これは、2 つの範囲をマージするために使用するアルゴリズムの修正版を使用して行うことができます。アイデアは、2 つの反復子を追跡することです。各ステップで、範囲の最初の要素を比較します。それらが等しい場合は、要素を交差点に追加し、両方の反復子を前方に進めます。1 番目が 2 番目よりも小さい場合は、最初のイテレータを進めます。最初の要素の方が大きい場合は、2 番目の反復子を進めます。
誰もハッシュテーブルについて言及していないのだろうか。
setの実装に関係なく(ここでの「set」は単純な配列を意味します)、次のことができます。
O(n)
intersection(a, b):
result = new empty set
for x in b:
if a contains x:
add x to result
return result
contains
テストが一定時間 (実装としてハッシュ テーブルを使用するセットなど) である場合、このアルゴリズムはO(n)
.
2 つの配列を結合し、この結合された配列内の各要素の出現回数を数え、これらを新しい配列に入れます。次に、このカウント配列をチェックして、2 を含むエントリを探します。これらの要素は、2 つのセットの交差部分にあります。
2 つのリストのいずれかが順序付けされている場合、順序付けられていないリストから開始できます。
FUNCTION: INTERSECTION ( LIST A, LIST B )
{
CREATE C AS EMPTY LIST
FOR EVERY: NUMBER n IN A
{
IF BINARY-SEARCH(n) IN B
{
ADD n TO C
}
}
RETURN C
}
Time Complexity = O(n O(BINARY-SEARCH)) = O(n log n)
リスト B がhashed
の場合、BIG-THETA(C n + T(hash))
ここで、BIG-THETA は漸近平均であり、C
およびconstant
はT(hash)
ハッシュ関数に必要な時間です。
セット 1 のすべての要素について: その要素がセット 2 にあるかどうかを確認します。O(1) ルックアップ時間を償却したセットを実装できます。