【发布时间】:2021-04-06 13:43:56
【问题描述】:
如标题中所述,我正在尝试生成一组大小为 n 的所有分区,其中所有子集的大小为 2,如果 n 不均匀,则有 ne 单例集。我稍微修改了一些生成所有分区的 SO 代码来得到这个:
def partitionIntoPairs(collection):
if len(collection) == 1:
yield [ collection ]
return
first = collection[0]
for smaller in partition2(collection[1:]):
for n, subset in enumerate(smaller):
if len(subset):
yield smaller[:n] + [[ first ] + subset] + smaller[n+1:]
yield [ [ first ] ] + smaller
这可行,但遗憾的是太慢了。我的第二个想法是使用 itertools.combinations 为某个集合生成所有对,然后在不删除给定对的情况下为每个 det 递归调用该函数,但我猜这会更慢。实现也不正确,它只返回一个可能的分区,我不确定如何让它返回所有分区:
from itertools import combinations
def partitionIntoPairs2(collection):
if not collection:
return []
elif len(collection) == 1:
return [(next(iter(collection)))]
else:
pairs = set(combinations(collection, 2))
for pair in pairs:
collection.remove(pair[0])
collection.remove(pair[1])
return partition3(collection) + [pair]
我偶然发现了一些用于具有给定数量集的分区的算法,以及生成所有可能分区的算法的各种实现,但据我所知,这些都不能有效地解决我的问题。
所以,提出一个更具体的问题:如果第二种算法是可行的选择,那么正确的实现方式是什么?当然,有没有更快的方法来做到这一点?如果是,怎么做?
【问题讨论】:
标签: python list set itertools combinatorics