【问题标题】:Performance of doing bitwise operations on bitsets对位集进行按位运算的性能
【发布时间】:2012-03-05 04:18:51
【问题描述】:

在 C++ 中,如果我对两个位集执行逻辑 OR(或 AND),例如:

bitset<1000000> b1, b2;
//some stuff
b1 |= b2;

这发生在 O(n) 还是 O(1) 时间内?为什么?

另外,这是否可以在 O(1) 时间内使用 bool 数组来完成?

谢谢。

【问题讨论】:

  • |= 不是按位且不合逻辑吗?
  • 这听起来像是一道作业题。如果是这样,它应该被标记为这样。

标签: c++ bitset


【解决方案1】:

它必须在 O(N) 时间内发生,因为给定处理器平台可以在任何给定时间块内处理有限数量的位。换句话说,bit-set 越大,每次操作所花费的时间就越长,并且增加的时间与 bitset 中的位数成线性关系。

使用bool 类型的数组也会遇到同样的问题。虽然每个单独的操作本身将花费 O(1) 时间,但 N 个对象的总时间将是 O(N)。

【讨论】:

  • 有限量可以是位集的最大可能大小,因此给出 O(1)。当然,这永远不会发生。
  • 对,这将需要一台具有无限资源的理论机器,此时您开始玩 NP 类型的问题。
  • 百万核处理器的梦想一直存在。
  • 实际上,您至少需要一台带有寄存器的单处理器机器,每个寄存器可以存储无限量的内存......这几乎是不可能的。
  • @Jason 不,C++ 中不能存在无限内存。我认为这是毫无意义的讨论,因为它在实践中无关紧要。
【解决方案2】:

不可能在单位时间内对任意标志数组执行逻辑运算(例如 OR 或 AND)。真正的 Big-Oh 分析处理运行时,因为数据的大小趋于无穷大,Core i7 永远不会在对两个位进行 OR 运算的同时对十亿位进行 OR 运算。

【讨论】:

    【解决方案3】:

    我认为需要明确一点,Big O 是一个边界 - 渐近 边界(所需的最短时间不能小于 f(x) 的 Big O.,并且在考虑一下,它说明了计算速度的数量级。因此,如果您考虑数组的工作原理-如果您可以说我可以在一次左右的计算中完成此操作,或者有一个已知的数量是非常小且远小于 N,那么它是恒定的。如果您需要以某种方式迭代(在这种情况下,您将看到所有位都需要检查,并且按位或没有捷径 - 因此需要 N 位被计算,因此它是 O(n)。[它实际上比这更严格的边界,但我们只处理大 O]。一个数组本身在其中存储 N 位。

    事实上,很少有东西是真正的 O(1)(使用指针在已知地址上进行索引查找可能是 O(1)(如果您已经知道要查找的内容)。但是,如果您有 M 个东西需要在常数时间内查找,则为 O(M) * O(1) = O(M)。

    这是现代计算机的一项功能 - 因为大多数事情都是按顺序处理的。 (多核有帮助,但还没有接近影响大 O 符号)。当然,计算机也有并行处理单词的能力,但即使这样也只是不断的减法。 O(n) / O(64) 仍然是 O(n)。

    【讨论】:

    • 大 O 是一个渐近的上界。例如,快速排序将在 最小 处进行 N log(N) 比较。此外,常数因子不必必须小于N才能成为常数时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多