这两个功能在效率方面有什么区别吗?

时间:2014-12-08 13:14:27

标签: algorithm

我遇到了这两个功能,比另一个更有效吗?如果我在第一个函数中将pow1(x^2, n/2) * x更改为return x*pow1(x^2, n/2)会怎样?

int pow1(int x, int n){
 if(n==0)
  return 1; else
 if(n==1)
  return x; else
 if("n is odd")
  return pow1(x^2, n/2) * x ; else // change to return x*pow1(x^2, n/2) ?
 if("n is even")
  return pow1(x^2, n/2);
}

int pow2(int x, int n){
 p=1;
 for(int i=1;i<=n;i++){
  p = p*x;
 }
 return p;
}

2 个答案:

答案 0 :(得分:2)

第二种算法执行n次乘法。第一个对n中的每个执行一次乘法运算;这使得它在n中成对数。该方法称为exponentiation by squaring

  

如果我在第一个函数中更改pow1(x ^ 2,n / 2)* x以返回x * pow1(x ^ 2,n / 2)会发生什么?   没有什么变化,因为乘法是可交换的。

在侧节点上,这是用某种编程语言编写的,还是伪编码?在许多语言中,x ^ 2表示x和2之间的按位XOR,而不是x平方。要平方x,只需执行x * x。

答案 1 :(得分:1)

首先是O(logn),第二个是O(n)。因此,对于足够大的n,第一个更快。