Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 求数幂的有效方法的时间复杂度_Java_Algorithm_Data Structures_Multiplication - Fatal编程技术网

Java 求数幂的有效方法的时间复杂度

Java 求数幂的有效方法的时间复杂度,java,algorithm,data-structures,multiplication,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

我已经写了一小段代码来寻找数字的幂

有人能告诉我如何找到这段代码的时间复杂度吗。 这段代码的时间复杂度是多少。 这是求一个数的幂的有效方法吗

代码是:

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;

    }
在上述方法中,
x=5
y=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
625*625*625*625*625
5
上升到
16


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

假设您的代码使用的指数不是2的幂,那么您的代码确实在
O(logn)
time

中运行,平方乘方法需要时间O(logn):


我不明白你的代码在做什么。你为什么用桶来计算功率?如果您在代码中添加注释以更清楚地解释每个步骤所做的事情,这将是非常有帮助的。我想时间复杂性是
O(biggestBucket+y/biggestBucket)
:Dlog(n)我想,但我不确定Hello Mike Ounsworth,我已经在代码中添加了一些澄清。请查看它是否有助于我的查询..在我的代码中,我正在减少已完成的乘法的数量,也就是说,我正在将其减少到桶大小。然后使用桶结果计算其他桶的结果。你能帮我解决这个问题吗。。。。。
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
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)