如何从Erlang中的约束中找到一组中三个子集的所有可能对?

时间:2011-10-29 09:04:49

标签: set erlang subset

我有一个M,它由三个子集A,B和C组成。

问题:我想计算M的所有可能子集S(1)... S(N),它们包含A,B和C元素之间所有可能的对,其方式是: :

  1. 对于一对中的两个位置中的每一个,A和B的元素只能在一对中发生一次(即{a1,a2}{b1,a1}可以在一个子集S中,但不再有元素{{在这个子集S)中允许1}};
  2. C的元素可以在子集S中发生1-N次(即{a1,_} and {_,a1}可以在一个子集S中发生),但是我希望获得C中所有可能数量的C元素的子集S.子集S.
  3. 例如,如果我们有{a,c}, {b,c}, {x,c},那么一些结果子集S将是(记住,它们应该包含元素对):

    A = [a1,a2], B = [b1,b2], C = [c1,c2]

    我倾向于认为首先我需要找到M的所有可能子集,其中只包含A的一个元素,B的一个元素和C - {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. 的1..N个元素。之后,我应该以某种方式从中生成(1)对。但我不确定这是正确的策略。

    所以,更详细的问题是:

    • 如果集合M的元素是整数,那么在Erlang中创建集合和查找子集的最佳方法是什么?
    • 是否有任何现成的工具可以在Erlang中查找集合的子集?
    • 是否有任何现成的工具可以在Erlang中生成所有可能的元素对?
    • 如何解决Erlang中的上述问题?

1 个答案:

答案 0 :(得分:1)

有一个sets module*,但我怀疑你最好先考虑算法 - 它在Erlang中的实现是在此之后出现的问题(或不是)。 (也许你注意到它实际上是graph algorithm(比如,二分相匹配的东西),你会很高兴with Erlang's digraph module。)

长话短说,当你想出一个算法时,Erlang很可能会被用来实现它。是的,对套装有一定的支持。但是对于需要“所有可能的子集”的问题的解决方案往往是指数级的(即,给定n个元素,有2^n个子集;对于每个元素,你要么在你的子集中都有它,因此坏。

(* there are some modules concerning sets)