2012-10-05 5 views
5

セットAがセットBのサブセットであるかどうかをチェックするアルゴリズムがありますか?セットAがセットBのサブセットであるかどうかをチェックするためのアルゴリズム

この問題を解決するためにデータ構造を作成しても、ランタイムにはカウントされません。

+1

この回答を見つけました:http://stackoverflow.com/a/1338515/174674 – volni

+1

設定されたコンテンツに関する詳細情報が必要です。一般的なアルゴリズムは、あなたに一定の時間の複雑さを与えません。少なくとも、私が知っているものはありません。 –

+0

セットされた要素は文字列ですが、高速のアルゴリズムが得られるならば、ハッシュを通してそれらを実行したり、ビットセット内の位置を割り当てることができます。 – volni

答えて

1

これは、Aの各要素を調べる必要があるため、少なくともAのサイズの線形時間である必要があります。

ハッシュテーブル(ハッシュテーブルにBという要素を格納してから、各要素を検索してAを検索する)を使用するとアルゴリズムが簡単です。私はあなたがBのいくつかの先進的な構造を知らない限り、あなたはどんなこともできるとは思わない。たとえば、Bがソート順に格納されている場合、バイナリ検索を使用してO(A log B)を実行できます。

+0

両方を並べ替えると、2つのコレクションの先頭項目を比較できます。このアルゴリズムのパフォーマンスはO(A + B) – Miguel

0

ブルームフィルタ(http://en.wikipedia.org/wiki/Bloom_filter)に行くかもしれません。しかし、そこの上にキースが言及した方法によって対処することができます偽陽性、あること(ただし、ハッシュの最悪の場合の複雑さはO(n)とされていませんが、あなたはO(nlogn)。

  1. を行うことができますことに注意してくださいかもしれませんあなたができる、AがYESの場合
  2. をブルームフィルタによるBの部分集合であるならば、あなたの文字列のセット内の文字の最小共通文字とペアのリストを持っている場合は、完全なチェック
+0

です。私の場合、後処理を行うのが非常に速いので、私はこのアルゴリズムが気に入っています。 Bloomフィルタはサーバー上で実行され、結果セットはクライアント側で実行されます。 – volni

0

を行う参照してください。最も一般的な文字と文字のペアでソートされたセットを保存し、できるだけ早くネガティブマッチを捨てる機会を最大限に活用してください。 これがブルームフィルタとどのくらいうまく組み合わされるかは分かりません。おそらく、多くのデグラムと文字がないため、ハッシュテーブルが実行します。

サブセットの最大サイズや共通サイズについての情報がある場合は、同じサイズのサブセットをすべて前述のようにブルームフィルタに入れることで同様にデータを事前処理できます。

これらの両方の組み合わせを実行することもできます。

関連する問題