【发布时间】:2016-03-08 10:56:20
【问题描述】:
我有一个方法可以生成数组的所有子集,我想尝试和实现的是同一种方法,但是使用二进制来实现。 Gosper's Hack 似乎是最好的主意,但我不知道如何实现它。下面的代码用于生成所有子集。子集可能是未知的 (http://imgur.com/KXflVjq) 这显示了运行几秒钟后的输出。感谢您的任何建议
int m = prop.length;
int list = (1 << m);
for(long i = 1; i<list; i++) {
final List sub = new ArrayList<>();
for(long j=0; j<m; j++) {
if((i & (1<<j)) > 0) {
sub.add(j);
}
}
Collections.sort(sub);
System.out.println(sub);
}
编辑:由于我的问题措辞不正确,我需要的输出是:
2 1 0
0 0 1 = 0
0 1 0 = 1
等等
【问题讨论】:
-
你的问题是什么?生成所有子集的速度很慢吗?
-
不管怎样,
Collections.sort(sub)在这里是不必要的,因为项目被添加到sub中是为了在初始数组中存在,所以排序是浪费时间。 -
好吧,太棒了,我把那一点去掉。是的,因为程序需要尽可能快,并且以这种方式生成它们并不是最佳的。
-
(en.wikipedia.org/wiki/Combinatorial_number_system#Applications) 这是我找到的唯一描述它但很难理解的方法
-
如果您需要生成 所有可能 子集,没有什么比这更快了,因为子集的数量成倍地取决于输入大小(例如,对于 30 个元素,存在约 10 亿个子集,对于 40 个元素 - 10^12 等)