【发布时间】: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中取一个子集, - 从子集
2中再添加一个子集,以维护目前获得的“唯一”元素列表(如果子集包含*元素,则跳过对“唯一”列表的检查); - 重复
2,直到达到N。
换句话说,我需要生成所有可能的“链”(如果N == 2 是对,如果N==3 是三倍),但每个“链”应该只包含列表L 中的一个元素除了通配符元素* 可以在每个生成的链中出现多次。
我知道如何使用 N == 2(这是一个简单的对生成)来执行此操作,但我不知道如何增强算法以处理 N 的任意值。
也许Stirling numbers of the second kind 可以在这里提供帮助,但我不知道如何应用它们以获得所需的结果。
注意:这里使用的数据结构类型对我来说并不重要。
注意:这个问题源自我之前的similar 问题。
【问题讨论】:
标签: erlang set combinations data-partitioning