【发布时间】:2010-10-02 09:47:31
【问题描述】:
给定这个输入:[1,2,3,4]
我想生成一组跨越集:
[1] [2] [3] [4]
[1] [2] [3,4]
[1] [2,3] [4]
[1] [3] [2,4]
[1,2] [3] [4]
[1,3] [2] [4]
[1,4] [2] [3]
[1,2] [3,4]
[1,3] [2,4]
[1,4] [2,3]
[1,2,3] [4]
[1,2,4] [3]
[1,3,4] [2]
[2,3,4] [1]
[1,2,3,4]
每个集合都包含原始集合的所有元素,排列后出现在唯一的子集中。产生这些集合的算法是什么?我已经尝试使用选择、排列、组合、幂集等 Python 生成器函数,但无法获得正确的组合。
2009 年 1 月 20 日
这不是作业问题。这是我正在为 www.projecteuler.net 问题 #118 研究的改进答案。我已经有了一个缓慢的解决方案,但想出了一个更好的方法——除了我无法弄清楚如何进行跨越集。
我会在就职派对回来后发布我的代码。
2009 年 1 月 21 日
这是我最终使用的算法:
def spanningsets(items):
if len(items) == 1:
yield [items]
else:
left_set, last = items[:-1], [items[-1]]
for cc in spanningsets(left_set):
yield cc + [last]
for i,elem in enumerate(cc):
yield cc[:i] + [elem + last] + cc[i+1:]
@Yuval F:我知道如何做一个powerset。这是一个简单的实现:
def powerset(s) :
length = len(s)
for i in xrange(0, 2**length) :
yield [c for j, c in enumerate(s) if (1 << j) & i]
return
【问题讨论】:
-
这对 haskell 和 ruby 来说也是个好问题