减少时间复杂性

时间:2011-01-25 09:55:20

标签: c++ c algorithm time-complexity

int main()
{
   int n ;
   std::cin >> n; // or scanf ("%d", &n);
   int temp;
   if( n ==1 ) temp = 1; // if n is 1 number is power of 2 so temp = 1
   if( n % 2 != 0 && n!= 1) temp =0; // if n is odd it can't be power of two
   else
   {
       for (;n && n%2 == 0; n /= 2);
       if(n  > 0 && n!= 1) temp = 0; // if the loop breaks out because of the second condition
       else temp = 1;
   }

   std::cout << temp; // or printf ("%d", temp);
}

以上代码检查数字是否为2的幂。最坏的情况是运行时复杂度为O(n)。如何通过降低时间复杂度来优化代码?

5 个答案:

答案 0 :(得分:15)

尝试if( n && (n & (n-1)) == 0) temp = 1;检查数字是否为2的幂。

例如:

n = 16;

  1 0 0 0 0 (n)
& 0 1 1 1 1 (n - 1)
  _________
  0 0 0 0 0 (yes)

2幂的数字只有一位。

n & (n - 1) unsets the rightmost set bit

运行时间O(1); - )

由于@GMan注意到n需要是无符号整数。负有符号整数的按位运算是实现定义的。

答案 1 :(得分:2)

这个怎么样?

bool IsPowerOfTwo(int value)
{
    return (value && ((value & (value-1)) == 0);
}

答案 2 :(得分:1)

试试这个:bool isPowerOfTwo = n && !(n & (n - 1));

答案 3 :(得分:0)

不是将数字除以2,而是可以将其右移1.这是一个通用优化规则,用于除以2,4,8,16,32等等。这种划分可以用右移1,2,3,4,5等代替。它们在数学上是等价的。

Shift更好,因为汇编器除法指令在大多数CPU架构上都非常低效。逻辑右移指令执行得更快。

然而,编译器应该能够为你做这个优化,或者它有一个非常糟糕的优化器。在样式方面,在C代码中编写除法和模运算符可能更好,但要验证编译器是否实际优化它们以转换操作。

答案 4 :(得分:0)

bool ifpower(int n)
{
    if(log2(n)==ceil(log2(n))) return true;
    else return false;
}