所以我一直在尝试实现2个功能:
在O(d)时间内执行整数多项式求值的方法,其中d是多项式的次数。
计算取幂。我需要它在0(log b)时间内执行
这是我到目前为止所做的:
public static int polynomialEvaluation(int[] coefficients, int x){
int n = coefficients.length -1;
int y = coefficients[n];
for (int i = n-1; i >= 0; i--){
y = coefficients[i] + (x*y);
}
return y;
}
public static int exponentiation(int a, int b) {
int res = 1;
while (b > 0) {
res = res * a;
b--;
}
return res;
}
}
这两个中的任何一个是否符合时间复杂度要求?我认为我有指数函数,但不确定第一个的成本。
编辑:我重写了指数函数,尝试避免迭代循环如下。在我看来,它现在可以更有效地计算
public static int exponentiation(int a, int b) {
if ( b == 0) return 1;
int res = exponentiation(a, b/2);
if (a % 2 == 0)
return res * res;
else
return (a * res * res);
}
答案 0 :(得分:4)
基本代数运算(例如加法和乘法),数组查找和赋值都被视为需要恒定时间。由于您的代码仅在循环中包含这些操作,因此复杂性是循环的迭代次数(加上外部操作的常量,但在O表示法中消失)。每个循环执行多少次迭代?
这有望告诉你多项式计算具有所需的复杂度,而指数计算则没有。提示更好的算法:如果你已经计算了 b 2 ,那么使用该答案计算 b 4 ?如果你有这个结果,你如何计算 b 8 ?如果您已计算出例如 b 2 , b 4 , b 8 , b 16 , b 32 , b 64 以这种方式(当然,你仍然有原始的 b 1 ),你怎么能用这些结果来计算,例如 B'SUP> 93