sup*_*r.t 0 java algorithm big-o time-complexity
鉴于double x和肯定int y我需要找到x^y假设输入不会导致溢出。
我想出了一个算法,它使用以下事实x^y:
x^y=(x^floor(y/2))^2 如果 y 是偶数。x^y=x*(x^floor(y/2))^2 如果 y 是奇数。x^y=1 如果 y 是 0实施:
public static double power(double x, int y) {
if(y==0)
return 1;
double z=power(x, y>>>1);
z*=z;
if((y&1)==1)
z*=x;
return z;
}
Run Code Online (Sandbox Code Playgroud)
我对它的复杂性分析有些挣扎。有log_2(y)递归级别,没有分支。在算法的每一层上z,乘法复杂度是O(n^2)中n的位数z。我们假设不会发生溢出,因此n最多是double类型中的一半。我是否将此乘法工作视为常数,这使算法的复杂度为O(log_2(y))?