为什么在此电源集生成器中需要按位运算符?

Daniel Mak |

我目前正在遵循MITx的6.00.2x,要求我们在底部提出一种电源设置发生器的变体。

但是在我研究变体之前,我什至不了解给定生成器发生了什么。特别:

  1. 是什么(i >> j) % 2 == 1,而实际上整个for j in range(N):块吗?据我所知,i >> j偏移的二进制i通过j,然后返回的该十进制表示偏移二进制数。但是我绝对不知道为什么一开始在电源集生成器中甚至需要二进制文件,更不用说此条件的必要了。
  2. 我知道,对于任何给定的集合A,其基数为n,其幂集的基数为2 ** n-因为对于A的每个子集,每个成员都存在或不存在,因此我们将其重复n次。

    for i in range(2**N):是在做什么吗?即遍历2 ** n个子集,并且是否包含集合中的任何给定成员?

我尝试使用items=['apple,'banana','orange']和来运行它items=[1,2,3],并且都返回了一个空列表,这使它更加混乱。

def powerSet(items):
    # generate all combinations of N items, items is a Python list
    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])
        return combo
怪异的

因此,此处的算法首先观察到的任何子集{1,...,N}都可以视为一个函数f:{1,...,N}->{0,1},即特征函数。这个怎么运作?好吧,ifA{1,...,N}then的子集,ff(x)=0if xnot inAf(x)=1else给出。

现在另一个观察结果是,任何函数f:{1,...,N}->{0,1}都可以编码为二进制N位数:如果第j个位为1 f(j)=1,否则0。

因此,如果我们要生成{1,..,N}它的所有子集,就足以生成所有length的二进制数N那么有多少这样的数字呢?当然可以2**N并且由于介于0之间的每个数字2**N - 1-1因为我们从计数0)唯一地对应于的某个子集,{1,...,N}因此我们可以简单地遍历它们。这就是for i in range(2**N):循环的来源。

但是我们不只是处理的子集{1,...,N},我们实际上有一些未知items的length集/列表N因此,如果A是的子集{1,...,N},则意味着A是之间的数字02**N - 1那么我们如何将其转换为的子集items好吧,再次,我们使用一个事实,即该位1对应于“处于设置中”而该位0对应于“未处于设置中”。那就是(i >> j) % 2 == 1从哪里来的。它仅表示“如果第j位为1”,其结果是导致“第j个元素应位于子集中”。

您的代码有一个小问题。您应该屈服而不是返回:

def powerSet(items):
    N = len(items)
    for i in range(2**N):
        combo = []  # <-- this is our subset
        for j in range(N):
            if (i >> j) % 2 == 1:
                combo.append(items[j])
        yield combo  # <-- here we yield it to caller

subsets = list(powerSet(["apple", "banana", "pear"]))

这是子集的二进制编码的示例。说你有一个清单

[“苹果”,“香蕉”,“梨”]

它具有3个元素,因此我们正在研究(二进制)长度3的数量。因此,这里是所有可能的子集及其按“循环”顺序的编码:

000 == []

001 == [“ apple”]

010 == [“ banana”]

011 == [“ apple”,“ banana”]

100 == [“梨”]

101 == [“ apple”,“梨”]

110 == [“香蕉”,“梨”]

111 == [“苹果”,“香蕉”,“梨”]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在JavaScript中创建生成器迭代器时没有“ new”运算符?

来自分类Dev

GA中的Elistism:该步骤是否需要应用生成器运算符

来自分类Dev

为什么在此示例中按位运算符OR会截断该值?

来自分类Dev

Laravel查询生成器-IN运算符

来自分类Dev

CMake生成器表达式中的三元运算符

来自分类Dev

Laravel雄辩的查询生成器与SQL中的``或''运算符混淆

来自分类Dev

为什么在运算符重载中需要引用?

来自分类Javascript

为什么“或”运算符不能“ ||” 在此JavaScript代码中替换三元运算符“?:”?

来自分类Dev

为什么python生成器需要yield?

来自分类Dev

为什么在赋值运算符之后在此代码中调用复制构造函数?

来自分类Dev

为什么后增量运算符无法在此代码中增加“a”?

来自分类Dev

F#-为什么我不能在此代码中不使用管道运算符?

来自分类Dev

为什么在此setTimeout()示例中rxjs共享运算符无法按预期工作?

来自分类Dev

为什么Go中的位运算符比除法和模运算慢?

来自分类Java

我为什么可以结合位运算符与数学运算符,如&+,Java中?

来自分类Dev

为什么在Java中存在按位运算符时使用逻辑运算符

来自分类Dev

为什么在比较布尔值时,按位运算符比Java中的“正常”运算符要慢?

来自分类Dev

为什么我需要先将生成器函数存储到变量中?

来自分类Dev

为什么在 Java 中需要 new 运算符,而在 C++ 中不需要

来自分类Dev

在此示例中,为什么使用生成器函数比填充和迭代数组要慢?

来自分类Dev

在此R代码段中,'$'运算符做什么?

来自分类Dev

递归生成器-手动zip vs运算符

来自分类Dev

Codeigniter 3-查询生成器“ join”方法“!=”运算符未提供预期的输出

来自分类Dev

SphinxQL查询生成器-如何添加多个和/或运算符以进行匹配

来自分类Java

Java中的电源运算符?

来自分类Java

为什么在Java中捕获多个异常时使用按位OR运算符(|)?

来自分类Java

Java为什么不需要运算符重载?

来自分类Dev

为什么Map的+运算符需要双括号?

来自分类Dev

为什么C ++需要运算符同义词?

Related 相关文章

  1. 1

    为什么在JavaScript中创建生成器迭代器时没有“ new”运算符?

  2. 2

    GA中的Elistism:该步骤是否需要应用生成器运算符

  3. 3

    为什么在此示例中按位运算符OR会截断该值?

  4. 4

    Laravel查询生成器-IN运算符

  5. 5

    CMake生成器表达式中的三元运算符

  6. 6

    Laravel雄辩的查询生成器与SQL中的``或''运算符混淆

  7. 7

    为什么在运算符重载中需要引用?

  8. 8

    为什么“或”运算符不能“ ||” 在此JavaScript代码中替换三元运算符“?:”?

  9. 9

    为什么python生成器需要yield?

  10. 10

    为什么在赋值运算符之后在此代码中调用复制构造函数?

  11. 11

    为什么后增量运算符无法在此代码中增加“a”?

  12. 12

    F#-为什么我不能在此代码中不使用管道运算符?

  13. 13

    为什么在此setTimeout()示例中rxjs共享运算符无法按预期工作?

  14. 14

    为什么Go中的位运算符比除法和模运算慢?

  15. 15

    我为什么可以结合位运算符与数学运算符,如&+,Java中?

  16. 16

    为什么在Java中存在按位运算符时使用逻辑运算符

  17. 17

    为什么在比较布尔值时,按位运算符比Java中的“正常”运算符要慢?

  18. 18

    为什么我需要先将生成器函数存储到变量中?

  19. 19

    为什么在 Java 中需要 new 运算符,而在 C++ 中不需要

  20. 20

    在此示例中,为什么使用生成器函数比填充和迭代数组要慢?

  21. 21

    在此R代码段中,'$'运算符做什么?

  22. 22

    递归生成器-手动zip vs运算符

  23. 23

    Codeigniter 3-查询生成器“ join”方法“!=”运算符未提供预期的输出

  24. 24

    SphinxQL查询生成器-如何添加多个和/或运算符以进行匹配

  25. 25

    Java中的电源运算符?

  26. 26

    为什么在Java中捕获多个异常时使用按位OR运算符(|)?

  27. 27

    Java为什么不需要运算符重载?

  28. 28

    为什么Map的+运算符需要双括号?

  29. 29

    为什么C ++需要运算符同义词?

热门标签

归档