1

假设我有一个字符串数组列表,例如[a, b, c, d, ....]. 任何人都可以帮助我提供一个示例代码,我怎样才能得出一个包含此列表中所有可能的功率子集的结果,其中包括该列表中的特定字符串(单个和空子集除外)?

例如:如果我想a从示例列表中获取所有功率子集,那么输出将是:

[a,b], [a,c], [a,d], [a,b,c], [a,b,d], [a,c,d] without the empty and single subset([a])

同样,如果我想要,b那么输出将是:

[b,a], [b,c], [b,d], [b,a,c], [b,a,d], [b,c,d] without the empty and single subset([b])

由于示例列表中的所有项目都是字符串,因此当子集太丰富时,它们可能是内存问题。因为我需要一次将这些子集保存在内存中以保存一个字符串。因此,我还需要有关此场景的优化解决方案的帮助?

我需要 Java 的帮助。因为我不太擅长Java,如果我犯了任何错误,请原谅我!

谢谢!

4

1 回答 1

2

如果您的初始字符串数组列表包含 30 个或更少的项目,您可以使用 set 方法 powerSet (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Sets.html# powerSet%28java.util.Set%29 - 谢谢,Jochen)。该文档声称该方法返回的集合的内存使用量仅为 O(n)。然后,您可以使用 if 条件对其进行迭代,以仅考虑包含“A”且大小为 2 或更大的集合。

我建议您先尝试上述或类似的简单解决方案,看看您是否遇到内存问题。

如果确实遇到内存问题,可以尝试通过最小化内存中保存的字符串的副本数量来进行优化。例如,您可以使用字节、短或整数列表(取决于您的数组列表的长度),其中每个列表都是字符串数组列表的索引。

然而,减少内存使用的最终方法是一次只在内存中保存一个子集(如果可能的话)。即生成(A,B),处理它,丢弃它,然后生成(A,C),处理它,丢弃它,等等。

于 2012-06-21T18:52:19.480 回答