Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不转换为二进制的情况下检查汉明重量?_Python_Algorithm_Discrete Mathematics - Fatal编程技术网

Python 如何在不转换为二进制的情况下检查汉明重量?

Python 如何在不转换为二进制的情况下检查汉明重量?,python,algorithm,discrete-mathematics,Python,Algorithm,Discrete Mathematics,如何在不进行实际转换和计数的情况下获得二进制表示的“1”的数 e、 g 我不是一个python程序员,但我希望这足以让你跟上 c = 0 while n: c += 1 n &= n - 1 return c 虽然有点模糊,但它的主要优势是速度和简单。while循环只对n中设置为1的每一位迭代一次。如果您真的关心速度,请用C编写代码(参见了解如何编写代码),并使用类似的方式与C实现接口。IMO,一个好的方法是使用查找表-创建一个字典,将字节转换为1的数量(您可以使用您

如何在不进行实际转换和计数的情况下获得二进制表示的“1”的

e、 g


我不是一个python程序员,但我希望这足以让你跟上

c = 0
while n:
    c += 1
    n &= n - 1

return c

虽然有点模糊,但它的主要优势是速度和简单。while循环只对n中设置为1的每一位迭代一次。

如果您真的关心速度,请用C编写代码(参见了解如何编写代码),并使用类似的方式与C实现接口。

IMO,一个好的方法是使用查找表-创建一个字典,将字节转换为1的数量(您可以使用您发布的代码生成它,它只需要运行一次),然后使用如下内容:

def number_of_ones(n):
    sum = 0
    while n != 0:
        sum += lookup_table[n & 0xff]
        n >>= 8
    return sum

我认为这是在空间和运行时间之间的一个相当好的权衡。

如果您想在一行中完成这项工作,您可以使用:

sum( [x&(1<<i)>0 for i in range(32)] )

sum([x&(1你不能让这个计算变得不那么复杂。它将是O(n)位数,或者,正如&trick的答案所示,O(n)位数设置为1;但除非你使用的所有数字都是特例,否则后者平均应该是n/2,所以这两个O(n)位数是相同的

当然,查找表技巧实际上对计算复杂性没有任何作用;它只是用空间来支付时间,但不改变基本的经济性,即你必须以某种方式检查每一位,而这是没有办法的。从逻辑上讲,你不能用o来回答关于数字中位的问题ut检查每一个

现在,我想我有点草率,因为这些例子中有很多实际上是O(n^2),因为在Python中,你必须一次检查整数,所以对于一个Python长整数,比如说100字节,a+或a/操作将至少检查每个字节一次,这将反复发生,直到数字减少到零(在上面概述的方案中),所以这些操作实际上是O(n^2)操作。我不确定Python是否会允许真正的O(n)解决方案

无论如何:如果你真的在问计算复杂性,特别是指大O分析,那就是你的答案。:-

p=lambda n:n和1+p(n&(n-1))

它使用短路和递归,当n大于0时,它切换到计算1+p(n&(n-1)),其中调用p(n&(n-1)),以此类推,当n为0时,它返回0。复杂性为O(n),因为它运行的次数是二进制中存在的1的次数

例如:p(9)=1+p(8)=1+1+p(0)=1+1+0=2这里:

def bitCount(int_no):

    c = 0
    while(int_no):
        int_no &= (int_no - 1)
        c += 1
    return c
这可能是一种古老而有效的方法……最初是用C实现的(Algo有一个名字我记不起来了)。它对我来说很好,希望它对任何其他人都有用

具有O(log(n))的解,n是位长度

m1  = 0x5555555555555555 #binary: 0101...
m2  = 0x3333333333333333 #binary: 00110011..
m4  = 0x0f0f0f0f0f0f0f0f #binary:  4 zeros,  4 ones ...
m8  = 0x00ff00ff00ff00ff #binary:  8 zeros,  8 ones ...
m16 = 0x0000ffff0000ffff #binary: 16 zeros, 16 ones ...
m32 = 0x00000000ffffffff #binary: 32 zeros, 32 ones
h01 = 0x0101010101010101 #the sum of 256 to the power of 0,1,2,3...

def hammingWeight(self, x: int) -> int:
    x -= (x>>1)&m1
    x = (x&m2) + ((x>>2)&m2)
    x = (x+(x>>4))&m4
    return ((x*h01)>>56)&0x7f

在Python3.10中,int类型将有一个位_count()方法

这是@ChrisW的一个副本吗?python和c是两种不同的语言。它不是完全的副本。python中的逐位运算比c要昂贵得多。我关心的是计算复杂性,而不是实际速度或语言。如果这是一个有效的答案,请给出一些解释。
m1  = 0x5555555555555555 #binary: 0101...
m2  = 0x3333333333333333 #binary: 00110011..
m4  = 0x0f0f0f0f0f0f0f0f #binary:  4 zeros,  4 ones ...
m8  = 0x00ff00ff00ff00ff #binary:  8 zeros,  8 ones ...
m16 = 0x0000ffff0000ffff #binary: 16 zeros, 16 ones ...
m32 = 0x00000000ffffffff #binary: 32 zeros, 32 ones
h01 = 0x0101010101010101 #the sum of 256 to the power of 0,1,2,3...

def hammingWeight(self, x: int) -> int:
    x -= (x>>1)&m1
    x = (x&m2) + ((x>>2)&m2)
    x = (x+(x>>4))&m4
    return ((x*h01)>>56)&0x7f