【问题标题】:Find all possible pairs between the subsets of N sets with Erlang使用 Erlang 查找 N 个集合的子集之间的所有可能对
【发布时间】:2012-09-03 23:14:35
【问题描述】:

我有一组S。它包含N 子集(其中又包含一些不同长度的子子集):

1. [[a,b],[c,d],[*]]
2. [[c],[d],[e,f],[*]]
3. [[d,e],[f],[f,*]]
N. ...

我还有一个列表 L 包含在集合 S 中的“唯一”元素:

a, b, c, d, e, f, *

我需要从每个子集的每个子集之间找到所有可能的组合,以便每个结果组合恰好具有列表 L 中的一个元素,但元素 [*] 的出现次数不限(它是通配符元素)。

因此,所需函数与上述集合 S 一起工作的结果应该是(不是 100% 准确):

- [a,b],[c],[d,e],[f];
- [a,b],[c],[*],[d,e],[f];
- [a,b],[c],[d,e],[f],[*];
- [a,b],[c],[d,e],[f,*],[*];

所以,基本上我需要一个执行以下操作的算法:

  1. 从子集1中取一个子集,
  2. 从子集2 中再添加一个子集,以维护目前获得的“唯一”元素列表(如果子集包含* 元素,则跳过对“唯一”列表的检查);
  3. 重复2,直到达到N

换句话说,我需要生成所有可能的“链”(如果N == 2 是对,如果N==3 是三倍),但每个“链”应该只包含列表L 中的一个元素除了通配符元素* 可以在每个生成的链中出现多次。

我知道如何使用 N == 2(这是一个简单的对生成)来执行此操作,但我不知道如何增强算法以处理 N 的任意值。

也许Stirling numbers of the second kind 可以在这里提供帮助,但我不知道如何应用它们以获得所需的结果。

注意:这里使用的数据结构类型对我来说并不重要。

注意:这个问题源自我之前的similar 问题。

【问题讨论】:

    标签: erlang set combinations data-partitioning


    【解决方案1】:

    这些是一些指针(不是完整的代码),可能会带你走向正确的方向:

    1. 我认为您在这里不需要一些高级数据结构(使用 erlang list comprehensions)。您还必须探索 erlang setslists 模块。由于您正在处理集合和子集列表,因此它们似乎是一个理想的选择。
    2. 下面是列表推导式如何为您轻松解决的问题:[{X,Y} || X <- [[c],[d],[e,f]], Y <- [[a,b],[c,d]]]. 这里我只是生成一个 {X,Y} 2 元组列表,但对于您的用例,您必须在此处放置真正的逻辑(包括你的明星案例)
    3. 进一步注意,通过列表推导,您可以使用一个生成器的输出作为后续生成器的输入,例如[{X,Y} || X1 <- [[c],[d],[e,f]], X <- X1, Y1 <- [[a,b],[c,d]], Y <- Y1].
    4. 还可以从L = ["a", "b", "a"]. 的事物列表中删除重复项,您可以随时简单地执行 sets:to_list(sets:from_list(L)).

    使用上述工具,您可以轻松生成所有可能的链,并在生成这些链时强制执行您的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多