用两个递归情况确定递归方法的Big O?

时间:2016-02-24 06:37:34

标签: java algorithm recursion big-o

我目前正在努力计算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的值。

2 个答案:

答案 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)