我试图了解下面代码的时间复杂度。当我尝试自己计算时间复杂度时,它会变成o(n)。因为“NO_OF_BITS”对于任何int总是相同的,因此循环不会随输入增加/减少。我不确定在循环内执行的按位操作。任何人都可以帮助我理解/计算此代码的时间复杂度。
unsigned int reverseBits(unsigned int num)
{
int NO_OF_BITS = sizeof(num) * 8;
int reverse_num = 0;
int i;
for (i = 0; i < NO_OF_BITS; i++)
{
if((num & (1 << i)))
reverse_num |= 1 << ((NO_OF_BITS - 1) - i);
}
return reverse_num;
}
答案 0 :(得分:5)
根据您的逻辑,代码实际上是O(1)
,因为NO_OF_BITS
始终为32
。
如果你谈论时间复杂度和渐近行为,你必须增加输入大小。此代码为O(NO_OF_BITS)
,即O(log(num))
。
由于函数的输入是num
,因此将n
定义为num
而不是NO_OF_BITS
是有意义的。
答案 1 :(得分:1)
由于你所说的原因,复杂性不是o(n),它是o(1) - 也就是说,是常数。无论您插入什么号码,费用总是相同的,只取决于NUM_OF_BITS。
但是如果按最大数量N考虑顺序,那就是:如果你支持N 1 (比如256),N 2 (比如65536),1048586等......然后你会发现你需要越来越多的位,对吗?因此,时间增加了。它增加了多少?每增加一倍的最大数量需要一个额外位,这意味着时间增长就像MaxN的基数2对数一样。因此,也许,你正在寻找的o(log n)。