计算 O(1) 中的幂函数

Computing the power function in O(1)

本文关键字:函数 计算      更新时间:2023-10-16

我写了一个函数,用O(logb(计算pow(a,b(。

double pow(double a, int b){
double res=1;
while(b>0){
if (b%2==1){
res=res*a;
}
b=b>>1;
a=a*a;
}
return res;
}

我偶然发现了一个问题,是否有可能在O(1)时间内编写一个函数pow(双a,双b(。然而,我还没有找到答案。

如果您不允许自己使用标准的 pow/exp/log 函数或预先计算的表,但允许浮点乘法,那么您的解决方案是最优的(恒定时间是不可能的(。

如果您允许对参数(a正数、ab双精度数(和结果(双精度数(进行一些限制,您可以使用

exp(b * log(a))

即使有可能获得确切的结果,这通常也不会准确。在Borland Delphi的日子里,我编写了一个类似的例程,但使用了基本2而不是经常使用的基本e。这提高了代码的准确性和速度,因为 CPU 以基本2工作。但我不知道如何在C++做到这一点。

是的,您可以使用预计算编写一个。将所有可能的功率计算到一个表中,并在必要时进行循环。事实上,这种方法适用于许多问题。

现在,假设您找到了除表查找之外的新算法,并且新算法的复杂性为 O(1(。现在是一个结果;

  • 加法的复杂度是 O(1( 乘以 x^b * x^c = x^(a+c(。 计算并取对数基数 b,尤其是基数为 2 时。

因此,您可以使用新算法减少几乎所有算术运算。

正如伊维斯所说,这是最佳的。