bit count的时间复杂度是什么?我不确定这个方法如何工作,但我认为它应该在O(logn)时间内完成。
具体来说,对于这段代码(其中x = 4,y = 1):
return Integer.bitCount(x^y);
根据其实施方式,该方法由六个O(1)语句按顺序执行组成,因此它是O(1)。
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
popcnt
指令。虽然这并不真正改变结论(尽管这意味着Integer.bitCount()
和Long.bitCount()
通常需要相同的时间 - 如果您查看源代码,这将不是您的结论)。 - BeeOnRope它是O(1)
,以下是针对JDK 1.5+的实现:
public static int bitCount(int i) {
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
do_intrinsic(_bitCount_i, java_lang_Integer, bitCount_name, int_int_signature, F_S)
的代码,这表明该函数_可能_是内置函数。 - BeeOnRopeInteger.bitCount()
中,我每秒获得了约20亿次调用bitCount
,而对于JDK代码的精确副本,我只获得了4亿次/秒。 - BeeOnRopememcpy
并经常替换它一样。 - BeeOnRopenative
方法非常不同。这是 JVM 规范的一部分(可能 JLS 中也简要提到了 native
关键字),用于实现 JNI 方法。基本上,你有一个 C 类似的函数在某些二进制文件中,该函数被调用并执行其工作,然后返回。有关如何传递参数和其他各种事项的规则。它应该在任何平台上都可以工作,等等 - 尽管当然你需要为不同的体系结构包含不同的库。 - BeeOnRope
O(log n)
中的n
是什么?整数中的总位数吗?在谈论大 O 时,我们将某些任意操作的成本设置为1,并且可以合理地假设bitCount
的成本为1。 - MephyO(1)
,参见例如:https://dev59.com/2HM_5IYBdhLWcg3wQQpd - jonrsharpe