2011-10-29 15 views
1

我有一組M它由三個子集A,B和C.如何在Erlang中使用約束從三個子集中找到所有可能的對?

問題:我想計算M的所有可能的子集S(1)... S(N),其包含所有以這種方式A,B和C的元素之間的可能的對:A和B的

  1. 元件可以在一對在一對只發生一次,每兩個位置(也就是{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中的上述問題?

回答

1

有一個sets module*,但我懷疑你最好想出一個算法第一 - 它在Erlang的實現是在此之後是問題來了(或沒有)。 (也許你注意到它實際上是一個graph algorithm(比如,二分配匹配的東西),你會得到快樂with Erlang's digraph module。)

長話短說,當你想出一個算法,Erlang可能很可能被用來實現它。是的,這對套件有一定的支持。但是對於需要「所有可能的子集」的問題的解決方案往往是指數級的(即給定n個元素,有2^n個子集;對於每個元素,你或者在你的子集中有或沒有),因此是不好的。

(* there are some modules concerning sets)

+0

感謝您指出了大約2^n個子集。所描述的問題可能無法用圖算法解決(因此我提出了這個問題)。 – skanatek

+0

由於冪集是一組集合,因此'[sofs'](http://www.erlang.org/doc/man/sofs.html)模塊也可能有幫助,而且是相當數學的。 [看這裏](http://rosettacode.org/wiki/Category:Erlang)爲基於列表的算法來構建Erlang中的冪集。 (從這裏你可以使用'set'''from_list'和可能'fold'來迭代所有的子集。) –

相關問題