为什么以下代码的时间复杂度为o(logn)

时间:2017-12-02 21:51:48

标签: algorithm bit-manipulation time-complexity

我试图了解下面代码的时间复杂度。当我尝试自己计算时间复杂度时,它会变成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;
    }              

2 个答案:

答案 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)。