algorithm - 具有 16 位元素的 10000 数组,查找位集(无限 RAM)- Google 访谈

标签 algorithm data-structures

这是我最近在 Google 采访中被问及的问题,我提供了一个涉及位移位且为 O(n) 的答案,但她说这不是最快的方法。我不明白,有没有一种方法可以在不必遍历提供的整个位的情况下对位集进行计数?

最佳答案

蛮力:10000 * 16 * 4 = 640,000 次操作。 (每个 16 位字的移位、比较、递增和迭代)

更快的方法:

我们可以构建表 00-FF -> 位数集。 256 * 8 * 4 = 8096 次操作

即我们构建了一个表,其中我们为每个字节计算了一些位集。

然后对于每个 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];
}

迭代中总共有 60000 次操作。 IE。总共 68096 个操作。虽然它是 O(n),但常数较少(少了约 9 倍)。

换句话说,我们计算每个 8 位数字的位数,然后将每个 16 位数字拆分为两个 8 位数字,以便使用预先构建的表格计算位集。

关于algorithm - 具有 16 位元素的 10000 数组,查找位集(无限 RAM)- Google 访谈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021074/

相关文章:

c# - AutoResetEvent 和多个 Set

c++ - 顺时针和逆时针旋转数组的有效方法

algorithm - Cormen 中关于插入排序的矛盾

algorithm - 如果以前的解决方案不满足某些条件,如何尝试新的排列?

algorithm - 算出算法的下界

c - 为什么不增加?

algorithm - 为什么将交叉添加到我的遗传算法中会给我带来更差的结果?

data-structures - 是否有一个很好的数据结构来执行查找、联合和去联合?

c++ - 实现一个指向可变大小结构的指针

java - 二叉搜索树 - Java 实现