Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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
计算(2^n)值的Java程序;程序应使用Big-O(2^n)运行_Java_Algorithm_Divide And Conquer - Fatal编程技术网

计算(2^n)值的Java程序;程序应使用Big-O(2^n)运行

计算(2^n)值的Java程序;程序应使用Big-O(2^n)运行,java,algorithm,divide-and-conquer,Java,Algorithm,Divide And Conquer,这个java程序是用Big-O(2^n)运行的吗?如果没有,对如何修改有何建议 此程序计算2^n的值: public static int exponent(int n) { if (n == 0) return 1; else return 2 * exponent(n - 1); } 好消息:它在O(n)中运行 每次迭代,n被1递减,因此它精确地循环n次是的,它甚至在O(n)中,因此也在O(2^n)中。此算法具有O(n)时间复杂度。如果

这个java程序是用Big-O(2^n)运行的吗?如果没有,对如何修改有何建议

此程序计算2^n的值:

public static int exponent(int n) {
    if (n == 0)
        return 1;   
    else
        return 2 * exponent(n - 1);
}

好消息:它在
O(n)
中运行

每次迭代,
n
1
递减,因此它精确地循环
n
次是的,它甚至在O(n)中,因此也在O(2^n)中。

此算法具有
O(n)
时间复杂度。如果添加第二个参数,则可以创建时间复杂度为
O(logn)
的方法

public static int power(int base, int n) {
    if (n == 0)
        return 1;
    else if (n % 2 == 0)
        return power(base * base, n/2);
    else
        return base * power(base * base, n/2);
}

在代码中,
n
每次减少
1
,因此需要
n
步骤才能终止。使用这种方法,
n
每次减半,因此它可以更快地完成。

要有一个与解决方案成比例的大O,它应该减少到1,即它应该发出与答案相同的呼叫

因为存在O(2^n)时间复杂度

public static int power(int base, int n) {
    return n == 0 ? 1 : multiply(base, power(base, n -1);
}

public static int multiply(int a, int b) {
    return a > 0 ? add(multiply(a - 1, b), b) : 0;
}

public static int add(int a, int b) {
    return a > b ? 1 + add(a -1, b) : b > 0 ? 1 + add(0, b -1) : 0;
}

要计算2^n,它将减少到
1+
2^n倍。

谢谢Jean,关于如何修改它以运行Big-O(2^n)的任何建议。@Mike它在O(2^n)中。如果一个算法在O(n)中,它也总是在O(2^n)中。太好了!!非常感谢Guyso,假设n=3;如果是Big-O(n),它会运行3次,但是如果是Big-O(2^n),它会运行8次,对吗?如果我错了,请纠正我。Thanks@Mike不,Big-O表示法要复杂得多。查看维基百科:@Mike:首先,它只是给出了一个上限,这就是为什么我的答案中的含义有效的原因。其次,允许应用一个乘法常数。第三,您的算法必须只尊重大于最小大小的问题的边界。太好了!!非常感谢你的澄清。这个问题看起来很像你在做作业,不理解Big-O的基本概念来回答你自己的问题。虽然StackOverflow是用于编程问题的,但人们希望提问的人在提问之前做一些自己的研究。请看,我是新来的:)有一个更简单的方法,只需使用返回指数(n-1)+指数(n-1);而不是返回2*指数(n-1);在有问题的代码中。