【发布时间】:2010-10-02 16:00:14
【问题描述】:
我有一个包含 15 个数字的列表,我需要编写一些代码来生成这些数字的所有 32,768 个组合。
我发现some code(通过谷歌搜索)显然可以满足我的要求,但我发现代码相当不透明并且对使用它持谨慎态度。另外,我觉得必须有一个更优雅的解决方案。
我唯一想到的就是循环遍历十进制整数 1-32768 并将它们转换为二进制,然后使用二进制表示作为过滤器来挑选合适的数字。
有人知道更好的方法吗?使用map(),可能吗?
【问题讨论】:
-
读者应该注意,列表项是否唯一是一个非常重要的考虑因素,因为许多算法会过度计算某些子集(例如'abccc' -> ['', 'a', 'b', 'c', 'c', 'c', 'ac', 'ac', 'ac', ...]. 一个简单的解决方法是将所有元素推入集合 在得到它们的排列之前。
-
@ninjagecko 使用 Set 库效率不高,因为每个库的最佳时间都是 O(n)。因此将 n 个函数添加到一个集合实际上是 O(n^2)!
-
从仔细阅读问题来看,似乎 OP 要求的是他的 15 个数字列表中的 PowerSet,而不是所有组合。我想这可能就是为什么答案到处都是。
-
@Scott Biggs:你确定你在这里了解 Python 吗?集合插入和查找是 O(1) 平均情况。它们就像字典。他们使用散列。 Python 没有特殊的集合库(它在标准库中)。我们在这里插入数字而不是函数。 (使用 O(2^n) 内存仍然效率低下;对于想要组合而不是 powerset 的人来说,正确的解决方案是简单的递归实现,或
product等)
标签: python combinations