使用右移位运算符生成列表中的所有唯一项

时间:2016-10-21 07:18:37

标签: arrays algorithm bit

我试图理解麻省理工学院在线课程中的一些代码,这些代码使用右移位运算符来生成列表的所有唯一组合

# generate all combinations of N items
def powerSet(items):
    N = len(items)
    # enumerate the 2**N possible combinations
    for i in range(2**N):
        combo = []
        for j in range(N):
            # test bit jth of integer i
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo

据我所知,电梯if (i >> j) % 2 == 1:将该位右移N次,并查看最后一位是否为1,然后将其添加到唯一组合列表中。但是,我不确定这是如何在列表中生成所有唯一集的。任何人都可以用简单的英语解释这个吗?

1 个答案:

答案 0 :(得分:2)

该算法的关键在于可能存在2个N个不同的N项组合。这很容易理解:我们可以为每件物品带一件物品;假设N个项目的集合具有M个不同的组合,然后向该集合添加项目使得2 * M组合成为可能。

但是这是"是/否"组合中项目的状态强烈提醒位(或实际上,数字的二进制表示)。如果我们有2个项目,我们可以编写如下所有组合。

00
01
10
11

现在,为了生成所有组合,我们只是反转这个过程:我们循环遍历从0到2 ** N-1的数字,看看,哪个组合对应它。比方说,对于数字2(或二进制表示中的10),组合将仅包含一个索引为1的项目。我们正在查看当前数字的二进制表示(上面代码中的i),并循环遍历它的数字,测试,如果第j个数字为1((i >> j) % 2 == 1) 。如果是这样,我们会在组合中添加一个项目。