Python 如何在不转换为二进制的情况下检查汉明重量?
如何在不进行实际转换和计数的情况下获得二进制表示的“1”的数 e、 gPython 如何在不转换为二进制的情况下检查汉明重量?,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的数量(您可以使用您
我不是一个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