2011-10-29 3 views
1

Iは3つのサブセットA、BおよびCから成るセットMを有するErlangの制約を持つセットの3つのサブセットからすべての可能なペアを見つけるには?

問題:すべて含むMのすべての可能なサブセットS(1)、... S(N)を計算したいようにA、BおよびCの要素との間の可能なペア:AとBの

  1. 要素が対に一度だけ二つの位置のそれぞれについて一対で起こることができる(すなわち{a1,a2}あり、{b1,a1}はであることができます1つのサブセットSが、このサブセットS内にはこれ以上の要素{a1,_} and {_,a1}は許されない。
  2. Cの要素はサブセットSで1-N回起こることがあります(つまり、サブセットSでは{a,c}, {b,c}, {x,c}が発生する可能性があります)が、サブセットSではCのすべての要素のサブセットSを取得したいと考えています。
  3. 例えば

、我々はA = [a1,a2], B = [b1,b2], C = [c1,c2]、Sは以下のようになり結果のサブセットの後、いくつかの(彼らは要素のペアが含まれている必要があり、覚えている)がある場合:

- {a1,b1}, {b1,a2}, {a2,b2}, {b2,c1}; 
- {a1,b1}, {b1,a2}, {a2,b2}, {b2,c1}, {c1,c2}; 
- {a1,c1}, {c1,a2}, {c1,b2}, {b1,c1}; 
- etc. 

を私が最初に私が見つける必要があると考える傾向がありますAの1つの要素のみを含むMのすべての可能なサブセット、Bの1つの要素、およびCの1..N要素を含む。その後、私は何とかペアのセットを生成する必要があります(2)から。しかし、私はこれが正しい戦略であるとは確信していません。

ので、より精巧な質問は次のようになります。

  • セットを作成して、設定されたMの整数の要素場合Erlangでサブセットを見つけるための最善の方法は何ですか?
  • Erlangでセットのサブセットを見つけるための既製のツールはありますか?
  • アーランにある要素のすべての可能なペアを生成する既成のツールはありますか?
  • Erlangの上記の問題をどうやって解決できますか?

答えて

1

sets module*ありますが、私はあなたが最初アルゴリズムを考える方がいいでしょう疑う - アーランでの実装は、この後に来る問題は(またはしない)です。あなたは、アルゴリズムを考え出すとき(たぶん、あなたはその実際graph algorithm(のような、二部マッチング何か何かを)気づくと、あなたがwith Erlang's digraph module幸せ取得します。)

かいつまんで、Erlangのは非常におそらく実装するために使用することができますそれ。はい、セットのための特定のサポートがあります。しかし、「すべての可能なサブセット」を必要とする問題に対する解決策は指数関数的な傾向がある(すなわち、要素があり、サブセットには2^nサブセットがあります。

(* there are some modules concerning sets)

+0

約2^nサブセットを指摘してくれてありがとう。説明された問題は、おそらくグラフアルゴリズムでは解決できません(したがって私は質問しました)。 – skanatek

+0

パワーセットはセットのセットなので、['sofs'](http://www.erlang.org/doc/man/sofs.html)モジュールは、数学的である一方、役に立つかもしれません。 Erlangでパワーセットを構築するためのリストベースのアルゴリズムについては、[こちらをご覧ください](http://rosettacode.org/wiki/Category:Erlang)を参照してください。 (ここからは 'sets'''from_list'とおそらく' fold'を使ってすべての部分集合を繰り返し処理できます) –

関連する問題