数组10000有16位元素,找到位设置(无限RAM) - 谷歌访谈

noM*_*MAD 21 algorithm data-structures

最近在我的谷歌采访中提到了这一点,我提供了一个涉及位移的答案,并且是O(n),但她说这不是最快的方式.我不明白,有没有办法计算位集而不必迭代提供的整个位?

Eug*_*sky 19

蛮力:10000*16*4 = 640,000 ops.(每个16位字的移位,比较,递增和迭代)

更快的方式:

我们可以构建表00-FF - >设置的位数.256*8*4 = 8096 ops

即我们构建一个表,我们计算每个字节设置的位数.

然后对于每个16位int,我们将它分成上下

for (n in array)
   byte lo = n & 0xFF; // lower 8-bits
   byte hi = n >> 8;   // higher 8-bits
   // simply add number of bits in the upper and lower parts 
   // of each 16-bits number
   // using the pre-calculated table
   k += table[lo] + table[hi];
}
Run Code Online (Sandbox Code Playgroud)

迭代中共有60000个操作.即总共68096个操作.它虽然是O(n),但是不那么恒定(减少~9倍).

换句话说,我们计算每8位数的位数,然后将每个16位数分成两个8位,以便计算使用预建表设置的位.

  • 另一种简单的方法是执行此操作,`table [n] = table [n >> 1] + n&1`,这需要更少的内存访问. (3认同)
  • 当然,您假设随机访问64kB表的成本与任何其他操作相同...... (2认同)

Car*_*rum 6

(几乎)总是以更快的方式.阅读有关查找表的信息.