2010-12-28 8 views
5

何組ものセットがあると仮定します。これらのセットのそれぞれのドメインは同じです。それは有限で離散的でもあります。したがって、各セットは、比較的短い長さ(例えば:1024)のビットフィールド(例えば:0000100111 ...)として記憶されてもよい。すなわち、ビットフィールドのビットXは、(1024個の可能なアイテムのうちの)アイテムXが所定のセットに含まれるか否かを示す。同じドメインを持つ大きな集合の集合に対して部分集合のテスト操作を行う最速の方法

ここで、データストア内のどのセットがYをサブセットとして設定しているかというクエリに効率的に応答するストレージ構造とアルゴリズムを考案したいと考えています。セットY自体はデータストアに存在せず、実行時に指定されます。

これを解決する最も簡単な方法は、YのビットフィールドにAND結果が一致するものを1つずつ取り出して、セットYのビットフィールドとビットセットを1つずつANDでANDすることです。

これをスピードアップするにはどうすればよいですか?ツリー構造(インデックス)やスマートなアルゴリズムがあります。これは、すべてのストアドセットのビットフィールドとANDを取らずにこのクエリを実行できるようにするものですか?

このような操作をすでにサポートしているデータベースは、大量の集合でですか?

+0

使用しているデータベースのタイプは何ですか?独自のフォーマット? SQLサーバー? –

+0

DBの選択は、巨大なセットに対して与えられたセット操作を効率的にサポートするかどうかによって異なります。 SQL DBSのどれもが必要なサイズに拡大することはありません(RDMS DBはこの問題のための貧しい選択です)。ですから、私が自分で実装する専用のDBかDBのどちらかを選択してください。 – niktech

+0

解決策はありますか?このタスクのためのよく知られたデータベースがないことは奇妙です。 – actual

答えて

0

私は、ビットフィールドが非常に低い基数のため、答えはいいえと言いがちです。

0

これは、グラフストレージモデルに基づいてNeo4jを見たことがありますあなたのボリュームに基づいて、従来のRDBMSのストレッチですか?

+1

大きなセットでの作業を効率的にサポートしていますか?私の理解から、グラフではなく、セットを保存する方が便利です。 – niktech

4

セットを前処理することができれば、サブセットリレーションはDAGとして表現できます(posetを記述しているため)。推移の減少が計算されたら、Yが現在の訪問セットのサブセットではなくなるたびにDFSを実行し、最大のセットから開始するだけですべてのセットをテストすることを避けることができると思います。

+0

あなたは詳しく説明できますか?基本的には、次のようなDAGを構築することについて話していますか?http://en.wikipedia.org/wiki/File:Hypercubeorder_binary.svg DFSを実行すると、どのように開始ノードが選択されますか? – niktech

+2

はい、本質的に。 AがBのスーパーセットであるならば、集合Aから集合Bへのエッジが存在する。辺の数が減少するので、推移減少を用いる方が良い(したがって、分岐因子も減少するので無駄なノードを調べる必要がない)。グラフは非周期的なので、入力する辺がないノードの集合が存在し、そこから始めることができます(これらはコレクションにスーパーセットを持たない集合を表します)。これらのすべてでDFSを起動する必要があります(または、これらのすべてのセットに接続されている仮想ノード(スーパーセットなし)から始めるだけです)。 – lijie

+0

興味深い。このアルゴリズムを念頭に置いておきますが、データストア内の集合の集合には多くのサブセット/スーパーセット関係が存在する可能性は低いので、多くの開始ノードでDFSを行うことになります。 – niktech

1

すべてのセットが描画されるセットのカーディナリティに応じて、1つのオプションは、要素からそれらを含むセットへの逆インデックスマッピングを構築することです。集合Yが与えられると、各要素を個別に含むすべての集合を見つけてそれらの交わりを計算することによって、Yを部分集合として持つすべての集合を見つけることができます。ソートされた順序でリストを格納する場合(データベース内のすべての集合に値0、1などの番号を付けるなど)、この交点をかなり効率的に計算できるはずです。多くのセット。

+0

良い点。データストア内の集合の基数は〜<= 1024です。今、複雑な部分は効率的に交差を行うことになります。交点の結果は、集合の全体集合と同じくらい大きくても、数十の集合であってもかまいません。どの交差点アルゴリズムをお勧めしますか? – niktech

+0

2つの並べ替えられたシーケンスがあり、交差点を計算したい場合は、次の操作を繰り返すことができます:2つのリストが空でない間は、各シーケンスの最初の値を見てください。同じでない場合は、小さい方を削除します。それらが同じ場合は、交差点の値を検出しました。これは時間O(n + m)で実行され、nとmは2つのシーケンスの長さです。シーケンスのペアに対してこのプロシージャを実行した後、結果などで、これはO(n lg k)で実行されます。ここで、kはシーケンスの数、nはシーケンスの最大長です。 – templatetypedef

0

DDDソリューションのアイデアに沿った、BDDについて考えてみましょう。あるいは、ZDD。

0

RDBMSはあなたの唯一の選択肢だった場合、私はSQLでDAGをモデリングする上で、この興味深い記事を見てお勧めします:

http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx?msg=3051183

OracleまたはMSSQLを買う余裕ができない場合は、を見て再帰クエリをサポートするPostgresQL 9また、かなりの時間、クロスジョインもサポートされています。