我正在尝试计算函数返回的时间复杂度 -
int isPowerof2(unsigned int num)
{
if(((~num)&1) == 1)
return 1;
return 0;
}
我认为它应该是O(1),但我不确定否定的复杂性。有人可以帮助我理解如何识别这种复杂性。谢谢!
编辑 - 如果在单个数字的情况下将其视为n个输入并且函数检查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。
接下来,num
和num - 1
无法共享任何设置位。因此,num & (num - 1)
的计算结果为0.
如果num
不 2的幂(而不是零),则至少设置两位。当减去一个时,只有最右边的设置位被改变而右边的那个位被改变,接下来,其他的将不会受到影响。
因此,num
和num - 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);
}