我想生成所有k-set(k = 2到4),它总是包含整数{0,1,2,3}的有序列表中的第一个元素0: [{0,1},{0,2},{0,3},{0,1,2},{0,1,3},{0,2,3},{0,1,2, 3}]。
目前,我的方式是 * m = 2:[{0,1},{0,2},{0,3}], * m = 3:仅通过在列表中添加大于(m-1)集的最大元素的元素从m = 2导出:[{0,1,2},{0,1,3},{ 0,2,3}}],例如,这里[2,3]大于1,它是集合{0,1}的最大整数,所以它们被添加,我又增加了2个集{0,1} ,2},{0,1,3}。
它有效,但当n很大时,它的速度不够快。
我想知道生成这些集合的更快方法是什么。
答案 0 :(得分:0)
不要打扰0 - 最后添加
使用1
到2^(k-1) - 1
(此处为1..7)的计数器进行简单循环
每个计数器值对应一组元素 - 考虑如果第j位为1,则j表示集合。
例如,5 =二进制101对应于集合{1,3}(第一和第三位是1)
答案 1 :(得分:0)
如果k
固定为2-4但n
不同,则没有理由避免使用嵌套循环。这是一个Python生成器,它将有效地迭代所有这些子集。它大量使用了内置函数enumerate()
,但核心思想很容易用任何语言实现:
def enumerator(nums):
#enumerates the k-element subsets of set nums
#which have between 2 and 4 elements, including
#the smallest element:
pool = sorted(list(nums)) #make a sorted copy
a = pool[0]
pool = pool[1:] #remaining items
n = len(pool)
#first the 2-element subsets:
for b in pool:
yield {a,b}
#3-element subsets:
for i,b in enumerate(pool[:n-1]):
for c in pool[i+1:]:
yield {a,b,c}
#4-element subsets:
for i,b in enumerate(pool[:n-2]):
for j,c in enumerate(pool[i+1:n-1]):
for d in pool[j+2:]: #enumerate() starts with 0 - so bump up 2
yield {a,b,c,d}
例如:
>>> for s in enumerator({0,1,2,3}): print(s)
{0, 1}
{0, 2}
{0, 3}
{0, 1, 2}
{0, 1, 3}
{0, 2, 3}
{0, 1, 2, 3}
如果k
未固定在此范围内,请使用combinations上维基百科文章中描述的算法之一。