我有一組M它由三個子集A,B和C.如何在Erlang中使用約束從三個子集中找到所有可能的對?
問題:我想計算M的所有可能的子集S(1)... S(N),其包含所有以這種方式A,B和C的元素之間的可能的對:A和B的
- 元件可以在一對在一對只發生一次,每兩個位置(也就是
{a1,a2}
和{b1,a1}
可以在一個子集S,但在該子集S中不允許有更多元素{a1,_} and {_,a1}
;可以在子集S中發生1-N次(即{a,c}, {b,c}, {x,c}
可以發生在一個子集S中),但是我想爲子集S中的C的所有可能數量的元素獲得子集S.
例如,如果我們有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.
我傾向於認爲,第一,我需要找到所有可能的M的子集,其中只包含A的一個元素,B的一個元素和C的1..N個元素。之後,我應該以某種方式從中產生一組配對(2)
。但我不確定這是否是正確的策略。
所以,更精細的問題是:
- 什麼是創建集並找到二郎子集的最好的方式,如果設置的M一整數的要素是什麼?
- 是否有任何現成的工具來查找Erlang中的一組集合?
- 是否有任何現成的工具可以在Erlang中生成一組所有可能的元素對?
- 如何解決Erlang中的上述問題?
感謝您指出了大約2^n個子集。所描述的問題可能無法用圖算法解決(因此我提出了這個問題)。 – skanatek
由於冪集是一組集合,因此'[sofs'](http://www.erlang.org/doc/man/sofs.html)模塊也可能有幫助,而且是相當數學的。 [看這裏](http://rosettacode.org/wiki/Category:Erlang)爲基於列表的算法來構建Erlang中的冪集。 (從這裏你可以使用'set'''from_list'和可能'fold'來迭代所有的子集。) –