python中的powerset中的子集链

时间:2016-08-09 22:42:44

标签: python performance optimization

如果我列举了字母表的powerset,例如0,...,1<<< 26-1。

对于该范围内的给定数字,我想知道它的所有子集是什么。我可以做一些效率低下的事情:

def find_subset_chain(subset):
    return [i for i in subset if i & subset == i]

如果我为powerset的每个元素执行此操作,我可以从有问题的元素向后进行,直到我点击一个子集,然后附加我和#的东西39;我已经想通了,但碰巧的情况是我想为动力装置的某些选择元素而不是所有这些元素执行此操作。

也许存在一种更为数论的方法来生成给定元素a的子集列表,而不必遍历每个元素到?

1 个答案:

答案 0 :(得分:1)

我们可以找到一个数字的最低有效位设置为

n & -n

我们可以用它来"倒数"通过重复清除最低有效设置位并从原始数字恢复所有不太重要的设置位,表示为位掩码的集合的子集:

def subsets(bitmask):
    current = bitmask
    while current:
        yield current
        lssb = current & -current        # find least significant set bit
        current &= ~lssb                 # clear least significant set bit
        current |= bitmask & (lssb - 1)  # restore less significant bits from original
    yield current