サブセットルックアップアルゴリズム


9

{ 1、。のサブセットのリストがあるとします。n }。必要に応じて、このリストの前処理を行うことができます。この前処理の後、私は別のセットを提示していますA { 1 n }。私は、任意のセットを識別したいB XをB AX{1,...,n}A{1,...,n}BXBA

(前処理なし)明白なアルゴリズムは、時間のかかる -あなただけでテストA各に対するB X別途。これより良いものはありますか?O(n|X|)ABX

それが助け場合は、いずれかのために、それを取ることができる、マッチの総数B Xがのようなものに囲まれているO 1 ABXO(1)

回答:


3

これは答えではありません。シンプルですが長い観察です。お役に立てれば幸いです。

問題の決定バージョンは次のとおりですXサブセットが含まれていAますか?

n{1,,n}nXfnffg(y)=(xy,f(x))g(A)f=gfX

fgggΩ((nn/2))

しかし、(1)より優れた分析が可能であり、(2)このアプローチをより良くするための微調整があるかもしれません。たとえば、のサイズとのBDD のサイズの間の相関関係をまったく使用しませんでした。(相関関係があるはずですが、それが単純か、ここで使用できるかはわかりません。)Xg

完全を期すために、のBDDからのBDDを計算する簡単なアルゴリズムは次のとおりです。 ここで、はの標準の演算です。gf

m(x?f1:f0)=x?(m(f0)m(f1)):m(f0)

2
これは、各サブセットの回答を事前計算し、すべての結果をサイズバイナリツリーにキャッシュしてから、適切なものを探すこととほぼ同等ではありません結果(時間で)あなたが与えられている?{1,2,...,n}2nO(n)A
mjqxxxx 2012年

前処理されたデータを格納するために指数空間を使用することは、私をだますことのように聞こえますが、質問では禁止されていません。しかし、私は最悪の場合の複雑さの教会に偏っているかもしれません。
伊藤剛

mjqxxxxとTsuyoshi:私はあなたの両方に同意します。私が同意することをより明確にするために、私はテキストを書き直しました。:)
Radu GRIGore 2012年

3

おそらく「情報検索」手法を使用できます。前処理フェーズで、要素をマップする逆インデックス(この場合、単純な 2次元配列で十分です)を構築します。を含むセット:。n×|X|xi{1,...,n}Xinv(xi)={XjX|xiXj}

長さ整数配列を設定します 。occ|X|

次に、各取得し、各でyiAinv(yi)Xjinv(yi)occ[j]=occ[j]+1

最後に必要なセットは、のセットです。|Xj|=occ[j]

2つ以上の要素を一緒にインデックス付けすることにより、(指数空間を犠牲にして)プロセスを任意に高速化できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.