在C ++中,如果我对两个位集执行逻辑OR(或AND),例如:
bitset<1000000> b1, b2;
//some stuff
b1 |= b2;
这是在O(n)还是O(1)时间内发生的?为什么呢?
另外,这可以在O(1)时间内使用一系列bool来完成吗?
感谢。
答案 0 :(得分:5)
它必须在O(N)时间内发生,因为在给定的处理器平台的任何给定的块时间内可以处理有限数量的比特。换句话说,位设置越大,每个操作所花费的时间越长,并且相对于位集中的位数,增加将是线性的。
使用bool
类型的数组也会遇到同样的问题。虽然每个单独的操作本身将花费O(1)时间,但N个对象的总时间将为O(N)。
答案 1 :(得分:1)
我认为需要明确的是Big O是一个边界 - 一个渐近边界(所需的最小时间不能小于f(x)的Big O.,并且在考虑到它,它说明了计算速度的数量级。所以如果你想一下数组是如何工作的 - 如果你能说我可以在一次计算中完成这个操作,或者有一个已知的量是如果你需要以某种方式迭代(在这种情况下你会看到所有的位都需要检查,并且没有按位OR的快捷方式 - 因此需要N位需要非常小且小于N,然后它是常量。要计算,因此它是O(n)。[它实际上比这更严格,但我们只处理大O]。数组本身存储N位。
事实上,很少有东西真的是O(1)(使用指针查看已知地址的索引可以是O(1)(如果你已经知道你在查找什么)。但是,如果你有M个东西需要在恒定时间内查找,然后是O(M)* O(1)= O(M)。
这是现代计算机的功能 - 因为大多数事情都是按顺序处理的。 (多核有帮助,但还没有接近影响大O符号)。当然,计算机能够并行处理单词,但即使这只是一个不变的减法。 O(n)/ O(64)仍为O(n)。
答案 2 :(得分:0)
在单位时间内对任意标志数组执行逻辑运算(例如OR或AND)是不可能的。真正的Big-Oh分析处理运行时,因为数据的大小趋于无穷大,并且Core i7永远不会在与OR一起使用两个位的同时将十亿个OR组合在一起。