【问题标题】:How to find all possible pairs from three subsets of a set with constraints in Erlang?如何从 Erlang 中具有约束的集合的三个子集中找到所有可能的对?
【发布时间】:2011-10-29 09:04:48
【问题描述】:

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

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

  1. 对于一对中的两个位置中的每一个,A 和 B 的元素只能在一对中出现一次(即 {a1,a2}{b1,a1} 可以在一个子集 S 中,但不允许更多元素 {a1,_} and {_,a1} 出现在这个子集 S);
  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】:

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

    长话短说,当你想出一个算法时,Erlang 很可能可以用来实现它。是的,对套装有一定的支持。但是对于需要“所有可能的子集”的问题的解决方案往往是指数级的(即,给定 n 元素,有 2^n 子集;对于每个元素,无论您是否将其包含在子集中),因此很糟糕。

    (* there are some modules concerning sets)

    【讨论】:

    • 感谢您指出大约 2^n 个子集。所描述的问题可能无法用图形算法解决(因此我提出了这个问题)。
    • 由于幂集是一组集合,sofs 模块也可能会有所帮助,同时还比较数学。 Look here 用于在 Erlang 中构建幂集的基于列表的算法。 (从这里你可以使用sets'from_list 和可能fold 来遍历所有子集。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多