分而治之解决一个数的幂,运行时分析与主定理

Divide and Conquer to solve the power of a number, runtime analysis with master theorem

我实现了一个分治算法来计算一个数的幂:

public static void main(String[] args) {
    System.out.println("Result: " + pow(2, 1));
    System.out.println("Result: " + pow(2, 9));
    System.out.println("Result: " + pow(2, 8));
    System.out.println("Result: " + pow(2, 0));
}

private static int pow(int n, int pow) {
    if(pow == 0) {
        return 1;
    }

    if(pow > 2) {
        int leftPow;
        int rightPow;

        if(pow % 2 != 0) {
            leftPow = pow/2;
            rightPow = pow/2+1;
        } else {
            leftPow = pow/2;
            rightPow = leftPow;
        }

        return pow(n, leftPow) * pow(n, rightPow);
    } else {
        if(pow == 1) {
            return n;
        } else {
            return n * n;
        }
    }
}

我的方法似乎有效,因为输出是:

Result: 2
Result: 512
Result: 256
Result: 1

现在我正在尝试使用 Master-Theorem:

来确定我的算法的运行时间

我假设

,由于递归调用出现了两次,

,因为我要从一个问题中创建两个子问题

,因为组合结果需要常数时间。

分水岭常数()应该是.

根据这些值,我假设定理的第一条规则成立: ,因为

因此运行时间应该是: .

我对这个结果很不确定,因为我从来没有遇到过这种情况

我的分析是否正确?

首先,您应该注意到复杂性将根据 pow 进行解释。因此,n 在您的分析中意味着 pow 而不是您程序中的 n 变量。

其次,由于比较和乘法运算的次数是常数(你的程序小于10),所以f(n) = \Theta(1)这里可以写成f(n) = 1

所以复杂度是T(n) = 2T(n/2) + 1(你也可以看Akra-Bazzi方法),T(n) = \Theta(n).