如果你有足够的内存来计算O(1)中一个数的二进制表示中的1的个数,这是一个有效的方法。这是我在一个在线论坛上找到的一个面试问题,但它没有答案。有人能提个建议吗?我想不出能在O(1)时间内完成的方法。
发布于 2012-01-16 00:28:22
这就是Hamming weight的问题。人口计数。该链接提到了有效的实现。引用:
有无限的内存,我们可以简单地创建一个包含每个64位整数
的汉明权重的大型查找表
发布于 2012-01-16 00:48:11
我有一个计算O(Number of 1's)时间的解决方案:
bitcount(n):
count = 0
while n > 0:
count = count + 1
n = n & (n-1)
return count在最坏的情况下(当数字是2^n - 1,所有的1都是二进制),它将检查每一位。
编辑:刚刚发现了一个非常好的恒定时间,恒定内存的位数算法。下面是用C编写的代码:
int BitCount(unsigned int u)
{
unsigned int uCount;
uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
return ((uCount + (uCount >> 3)) & 030707070707) % 63;
}你可以在here上找到它的正确性证明。
发布于 2013-08-18 05:47:23
请注意: n&(n- 1 )总是消除最低有效的1。
因此,我们可以编写如下代码来计算1的数量:
count=0;
while(n!=0){
n = n&(n-1);
count++;
}
cout<<"Number of 1's in n is: "<<count;程序的复杂度是:n中1的个数(始终小于32)。
https://stackoverflow.com/questions/8871204
复制相似问题