我试图理解麻省理工学院在线课程中的一些代码,这些代码使用右移位运算符来生成列表的所有唯一组合
# 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,然后将其添加到唯一组合列表中。但是,我不确定这是如何在列表中生成所有唯一集的。任何人都可以用简单的英语解释这个吗?
答案 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
) 。如果是这样,我们会在组合中添加一个项目。