什么是从整数列表生成k-set的最快方法?

时间:2016-10-26 11:23:17

标签: algorithm set combinatorics

我想生成所有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很大时,它的速度不够快。

我想知道生成这些集合的更快方法是什么。

2 个答案:

答案 0 :(得分:0)

不要打扰0 - 最后添加

使用12^(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上维基百科文章中描述的算法之一。