一尘不染

如何生成给定列表的幂集?

algorithm

我正在尝试生成长度为N的给定列表的所有2 ^ N-1个可能组合的集合。该集合会将组合中的元素数映射到包含特定长度的组合的组合的有序列表。例如,对于列表:

[A, B, C, D]

我想生成地图:

{
    1 -> [{A}, {B}, {C}, {D}]
    2 -> [{A, B}, {A, C}, {A, D}, {B, C}, {B, D}, {C, D}]
    3 -> [{A, B, C}, {A, B, D}, {A, C, D}, {B, C, D}]
    4 -> [{A, B, C, D}]
}

生成的数据库应保持原始顺序(其中[]表示有序序列(List),{}表示无序组(Set)),并应尽可能快地运行。

我整天都在努力处理一些递归代码(我知道实现应该是递归的),但无法深入了解它。

有没有我可以使用的参考/该算法的现成实现?


阅读 236

收藏
2020-07-28

共1个答案

一尘不染

您要找的实际上是 功率集
(可能减去空集)。番石榴实际上有这样的方法:Sets.powerSet()。如果您想自己编写该方法,则可以查看该类源代码Sets以了解该方法的实现方式。您可能需要修改它以返回a
List而不是a,Set因为您想保留订单,尽管此更改应该不会太大。设置好功率后,对其进行迭代并构建所需的地图应该很简单。

2020-07-28