我在 C 中有一个相对较短的数组(<32 个元素),并且想要遍历该数组的所有可能的长度 >= 2 的子集。有很多方法可以通过递归构建所有子列表的列表来实现,但我想避免这增加的额外开销。我所需要的只是遍历每个子集;我不需要跟踪它们。
这听起来像是一个奇怪的要求,但原因是我还希望能够在每个工作项内存非常昂贵的 OpenCL 内核中使用它。分配列表列表是我真正想避免的事情。
最佳答案
如果您包含大小为 0 和 1 的子集,然后将它们过滤掉(这很简单,
if ((set & (set - 1)) == 0)
,忽略它),你实际上只是从 0 迭代到 1 << n
.
这比 Gosper 的 Hack 简单得多,后者很酷,但是由于无论如何您基本上都需要所有子集长度,因此使用它没有什么意义。只有几个子集以这种方式被跳过,因为你不想要的唯一一个非平凡的组只有大小 n
.
关于c - 在 C 中查找短数组的所有可能子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634719/