C语言中位反转功能的时间复杂度

时间:2018-10-10 18:20:07

标签: c time-complexity

#include <stdio.h>

unsigned int reverseBits(unsigned int num)
{
    unsigned int reverse_num = 0;
    for(int i = 0; i < sizeof(unsigned int) * 8; ++i)
    {   
        reverse_num = (reverse_num | (num & 1));
        num = num >> 1;
        if(i != (sizeof(unsigned int) * 8) - 1)
            reverse_num = reverse_num << 1;
    }   
    return reverse_num;
}

int main()
{
    unsigned int num = 0;
    scanf("%u", &num);
    printf("bit reverse of %u is %u\n", num, reverseBits(num));
    return 0;
}

此位反转功能的时间复杂度是多少,如果我们将输入大小更改为uint_8 / uint_16 / uint64_t,则for循环将运行输入大小* 8倍。对于n个输入,此功能以恒定的时间运行。那么,以大“ O”符号表示此函数的时间复杂度是多少?

1 个答案:

答案 0 :(得分:0)

O(n),用于 n 位。

对于uint_8,该算法以8个步骤运行。
对于uint_16,算法运行16个步骤。


我不是专家,但是某些指令集可能会有一个单周期位反转(使用__asm__),因此您可以在O(n)中运行n个 bytes ;快八倍。如果您使用-O3,某些编译器可能会自动执行此操作。