查找给定数字是否为2的幂的时间复杂度

时间:2013-01-26 03:14:41

标签: algorithm time-complexity

我正在尝试计算函数返回的时间复杂度 -

int isPowerof2(unsigned int num)
{
     if(((~num)&1) == 1)
          return 1;
      return 0;
}

我认为它应该是O(1),但我不确定否定的复杂性。有人可以帮助我理解如何识别这种复杂性。谢谢!

编辑 - 如果在单个数字的情况下将其视为n个输入并且函数检查2的幂,那么该情况下的复杂性是什么

2 个答案:

答案 0 :(得分:5)

以二进制表示的2的幂,正好一个位,其他都为零。

减去一个将反转右边的所有位,包括最右边的位:

110101100 - 1=> 110101011 (in the case of zero, all bits get inverted)
  

当且仅当num & (num - 1)是2的幂时,我们假设 num 将评估为零。

如果num实际上是2的幂,则总共设置一个位,减去1将使该位为零,并将所有位设置为右为1。

接下来,numnum - 1 无法共享任何设置位。因此,num & (num - 1)的计算结果为0.

如果num 2的幂(而不是零),则至少设置两位。当减去一个时,只有最右边的设置位被改变而右边的那个位被改变,接下来,其他的将不会受到影响。

因此,numnum - 1最多共享一个位集。我们得出结论:num & (num - 1) num不能为0而不是0的幂,而不是2的幂。

以下是正确的检查:num && !(num & (num - 1))

复杂性:在常规计算机上,所有二进制操作都会在固定时间内发生。因为有固定数量的常量时间操作,所以整个函数将在恒定时间内返回:O(1)

当您对该功能执行n次呼叫时,每次调用它时都会进行恒定的工作量。当n加倍时,工作量增加一倍。因此,该案例的复杂性为O(n)

答案 1 :(得分:1)

现代处理器对机器字大小的整数进行基本的算术和逻辑运算,其数量恒定,与这些整数的值无关。因此,函数中的所有这些操作都是O(1),并且因为有一定数量的操作,所以整个函数都是O(1)。

顺便说一句,该函数不会判断给定数字是否为2的幂。它告诉它是否为2的倍数,因为它只查看num的最低有效位。 / p>

正确检查2的幂将是这样的:

int isPowerof2(unsigned int num)
{
  return (num != 0) && ((num & (num - 1) == 0);
}