时间复杂度有效找到数字的力量方法

时间:2014-11-05 13:22:23

标签: java algorithm data-structures multiplication

我写了一小段代码来找到数字的力量

任何人都可以告诉我如何找到此代码的时间复杂度。 这段代码的时间复杂度是多少? 并且它是一种有效的方法来查找数字的权力

代码是:

public static void main(String[] args) {

        System.out.println(optPower(7, 15));    
    }

    static int optPower(int x, int y) {
        // divide in buckets

        if (y == 0) {
            return 1;
        }
        if (y == 1) {
            return x;
        }
        if (y == 2)
            return x * x;

        int tmpY;

        boolean isYmodified = false;
        if (y % 2 == 0) {
            tmpY = y;
        } else {
            tmpY = y - 1;
            isYmodified = true;
        }

        int biggestBucket = 2;
        int n = biggestBucket;

        /*
         * tmpY/4 , here '4' can be used as a tweking parameter to size the
         * buckets
         */
        while (tmpY % n == 0 && tmpY / 4 >= n) {
            biggestBucket = n;
            n = n * 2;
        }

        int res = 1;
        for (int i = 0; i < biggestBucket; i++) {
            res = res * x;
        }

        int mul = res;
        for (int j = 1; j < tmpY / biggestBucket; j++) {
            mul = mul * res;
        }

        return isYmodified ? mul * x : mul;

    }

根据要求,我添加了更多注释,以便更清楚地解释算法。

如果我想计算5加注到16

第1步: -

5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5

上述方法中的x=5y=16

如果y为奇数,我们会在最终结果中多加x并将tmpY指定为y-1以使其均匀

so noOfBuckets = 4 because of below code

while (tmpY % n == 0 ) {
        biggestBucket = n;
        n = n * 2;
    }
    that is 
 16/(2 raise to 2)

step 2:-

divide 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 into 4 buckets
bucket1 :- 5,5,5,5
bucket2 :- 5,5,5,5
bucket3 :- 5,5,5,5
bucket4 :- 5,5,5,5

第3步: -  仅计算存储桶1,并将此存储桶的结果用于剩余存储桶  桶1的结果= 625 = 5*5*5*5

第4步:在这里输入代码  最终结果为bucket1*bucket1*bucket1*bucket1,即625 * 625 * 625 * 625,即5加注到16

然后我们避免在桶2,3,4中进行迭代,并直接使用桶1中的值来获得最终结果。

2 个答案:

答案 0 :(得分:2)

square-and-multiply方法需要时间O(log n):

function power(b, e)
    if (e == 0) return 1
    if (e is even) return power(b*b, e/2)
    /* e is odd */ return b * power(b, e-1)

答案 1 :(得分:0)

假设你的代码使用2的幂以外的指数,那么你的代码确实在O(log n)时间内运行