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

Algorithm 查找给定数字是否为2的幂的时间复杂度,algorithm,time-complexity,Algorithm,Time Complexity,我试图计算下面函数返回的时间复杂度- int isPowerof2(unsigned int num) { if(((~num)&1) == 1) return 1; return 0; } 我认为应该是O(1),但我不确定否定的复杂性。有人能帮助我理解如何识别这一问题的复杂性吗。谢谢 编辑-如果在一个数字的情况下把它看成是N个输入,函数检查2的功率,那么在这种情况下的复杂性是什么? < P>现代处理器在一个独立于这些整数的值的恒定数量的时钟上

我试图计算下面函数返回的时间复杂度-

int isPowerof2(unsigned int num)
{
     if(((~num)&1) == 1)
          return 1;
      return 0;
}
我认为应该是O(1),但我不确定否定的复杂性。有人能帮助我理解如何识别这一问题的复杂性吗。谢谢


编辑-如果在一个数字的情况下把它看成是N个输入,函数检查2的功率,那么在这种情况下的复杂性是什么?

< P>现代处理器在一个独立于这些整数的值的恒定数量的时钟上对机器字大小的整数进行基本的算术和逻辑运算。所以,函数中的所有操作都是O(1),因为有固定数量的操作,所以整个函数都是O(1)

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

2次方的正确检查如下:

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

以二进制表示的二次幂正好有一个位集,其他的都是零

减去1将反转包括最右边一位在内的所有位:

110101100 - 1=> 110101011 (in the case of zero, all bits get inverted)
我们假设
num&(num-1)
当且仅当
num
是二的幂时,将求值为零

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

因此,
num
num-1
不能共享任何设置位。因此,
num&(num-1)
的计算结果为0

如果
num
不是二的幂(且不是零),则至少设置了两个位。当减去一位时,只有最右边的设定位被改变,其右边的设定位也随之改变,其他设定位将不受影响

因此,
num
num-1
最多共享一个设置位。我们得出结论,
num&(num-1)
对于
num
不是零且不是二的幂,不能计算为零

因此正确的检查是:
num&&!(num和(num-1))

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


当您对该函数执行
n
调用时,每次调用该函数时,您都会执行固定时间的工作量。当
n
加倍时,工作量加倍。因此,这种情况的复杂性是
O(n)

输入的大小是固定的(它是一个单无符号int)。在这种情况下,谈论算法复杂性根本没有意义。是的,一个i/p。所以当我被问到这个问题时,我很困惑。同样,考虑到如果我有N个输入,那么复杂的是什么呢?我认为问“如果输入的类型可以有多少位?如果时间复杂度如何随着比特数的增长而增长呢?”当然更有意义。那么你就不用标准的&运算符了——你必须定义一个新的按位的,并且可以处理任意数量的位。这个算法在我看来并不合适。一个整数是2的幂,如果它正好有一个非零位。@unix\u用户任何算法的时间复杂度总是基于假定的计算模型。接受一个功能强大的模型是比较常见的,其中具有许多固定大小位长度的按位操作在恒定时间内运行,但根据您所谈论的对象,它们可以假定一个不同的计算模型,该模型没有此类操作,因此可能不再只需要恒定时间。