我目前正在努力计算Big O的递归指数函数,只要n%2 == 0就会获取一个快捷方式。代码如下:
public static int fasterExponent(int x, int n){
if ( n == 0 ) return 1;
if ( n%2 == 0 ){
int temp = fasterExponent(x, n/2);
return temp * temp;
}
return x * fasterExponent(x, --n); //3
}
据我所知,在没有(n%2 == 0)的情况下,这个递归指数函数将是O(n)。包含(n%2 == 0)的情况会加快执行时间,但我不知道如何确定它的复杂性和它的证据c的值。
答案 0 :(得分:6)
答案是O(log n)。
原因: fasterExponent(x, n/2)
这是每一步中输入的一半,当它达到0
时,我们就完成了。这显然需要log n步骤。
但是fasterExponent(x, --n);
呢?我们在输入是奇数时执行此操作,在下一步中它将是偶数并且我们回退到n / 2情况。让我们考虑每次将n除以2时必须执行此操作的最坏情况。然后,每次执行第一个递归步骤时,我们都会执行第二次递归步骤。所以我们需要2 * log n个操作。那仍然是O(log n)。
我希望我的解释有所帮助。
答案 1 :(得分:3)
直观地看到,在每个阶段,您将问题规模缩小了一半。例如,要找到x 4 ,您会发现x 2 (让我们称之为A),并将结果返回为A * A.再次通过将x 2 除以x和x来找到它。
考虑将两个数相乘作为基本运算,您可以看到重复是:
T(N) = T(N/2) + O(1)
Solving this recurrence(using say the Master Theorem) yields:
T(N) = O(logN)