Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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 power方法的效率?_Java_Performance_Math - Fatal编程技术网

我的Java power方法的效率?

我的Java power方法的效率?,java,performance,math,Java,Performance,Math,所以我参加了一次求职面试,他们让我在白板上写一个快速的数学能力方法,这就是我在白板上写的 public static double pow(double base, double power) { double result = 1.0; for(double x = 0; x < power; x++) { result = result * base; } return result; } 公共静态双电源(双基双电源){ 双结果=1.

所以我参加了一次求职面试,他们让我在白板上写一个快速的数学能力方法,这就是我在白板上写的

public static double pow(double base, double power) {
    double result = 1.0;
    for(double x = 0; x < power; x++) {
        result = result * base;
    }

    return result;
}
公共静态双电源(双基双电源){
双结果=1.0;
用于(双x=0;x
这是可行的,他们对此很满意,但随后又问我如何才能提高效率,我没有回答。所以我的问题是,你能比这个更有效率吗?或者这只是一个让我流汗的问题?我想可能会有一些直接的位转移解决方案,但我不确定,我想那只适用于2的幂?有什么想法吗

*编辑 对不起,我忘了提到方法签名是给我的(双倍作为输入),我被告知我不能使用任何内置的数学库。

基本方法是O(logn),而不是这个O(n)算法。(具有非递归实现。)


此外,您的电源参数几乎肯定应该是
int
。(如果你真的想实现一种将数字提升为非整数次幂的算法,你需要更多的数学知识。)

将答案与自身和其他确定的倍数相乘可以得到不同的幂,这可以让你更快地接近解。路易斯提供的维基很好。如果您想要一个通用的解释,请考虑:

2^1 * 2^1 = 2^2
2^2 * 2^2 = 2^4
2^4 * 2^4 = 2^8
...
这对于二次幂非常有效。然而,我发现玩非二次幂很有趣。如果我想要2^13,我怎么能做到

2^1 * 2^1 = 2^2
2^1 * 2^2 = 2^3
2^3 * 2^3 = 2^6
2^6 * 2^6 = 2^12
2^12 * 2^1 = 2^13

上面的例子是为了说明你不必只玩方块。如果你使用一些不同的异能,你会发现有时候你可以做得比仅仅使用2的异能更好。。。这是一个有趣的数学问题。

稍微跳出框框思考一下,通常在内存和速度之间会有一个折衷。有一个概念,即

您可以添加一个静态双[][]缓存,用于存储任何特定值的结果

比如:

// look for the value in the cache, if it is there return it.

for(double x = 0; x < power; x++) {
    result = result * base;
    // store result in the cache
}
//在缓存中查找值,如果存在,则返回该值。
用于(双x=0;x

这会起作用,但会占用大量内存。

result*=base是首先想到的。不确定,可能与递归或动态编程有关吗?@nickecarlo递归将是额外的加载工作。@Smit我没有给出任何细节;)我说“可能与递归有关”维基百科链接使用递归。@nickecarlo我确实得到了一份工作,但没有接受,因为薪水不是我所希望的。嗯,当我在世界的另一边写我的评论时,你读到了我的心思。编辑我的帖子是为了澄清我忘记了方法签名是作为一项要求给我的。谢谢你的维基百科链接,我会查出来的