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

问题描述 投票:1回答:1

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

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

  1. 对于一对中的两个位置中的每一个,A和B的元素可以仅在一对中发生一次(即{a1,a2}{b1,a1}可以在一个子集S中,但在该子集S中不允许更多元素{a1,_} and {_,a1});
  2. C的元素可以在子集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)的1..N元素。之后,我应该以某种方式从那里生成成对的(2)。但我不确定这是正确的策略。

所以,更详细的问题是:

  • 如果集合M的元素是整数,那么在Erlang中创建集合和查找子集的最佳方法是什么?
  • 有没有现成的工具来在Erlang中查找集合的子集?
  • 有没有现成的工具来生成Erlang中所有可能的元素对?
  • 如何在Erlang中解决上述问题?
set erlang subset
1个回答
1
投票

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

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

(* there are some modules concerning sets)

© www.soinside.com 2019 - 2024. All rights reserved.