计算 O(1) 中的幂函数
Computing the power function in O(1)
我写了一个函数,用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
正数、a
和b
双精度数(和结果(双精度数(进行一些限制,您可以使用
exp(b * log(a))
即使有可能获得确切的结果,这通常也不会准确。在Borland Delphi的日子里,我编写了一个类似的例程,但使用了基本2
而不是经常使用的基本e
。这提高了代码的准确性和速度,因为 CPU 以基本2
工作。但我不知道如何在C++做到这一点。
是的,您可以使用预计算编写一个。将所有可能的功率计算到一个表中,并在必要时进行循环。事实上,这种方法适用于许多问题。
现在,假设您找到了除表查找之外的新算法,并且新算法的复杂性为 O(1(。现在是一个结果;
- 加法的复杂度是 O(1( 乘以 x^b * x^c = x^(a+c(。 计算并取对数基数 b,尤其是基数为 2 时。
因此,您可以使用新算法减少几乎所有算术运算。
正如伊维斯所说,这是最佳的。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 函数计算用户按下按钮的频率
- C++ 在编译时具有函数计算全局变量
- C++ - 使用特定函数计算 x 和 y 的最终值
- 尝试使用函数计算有剩余球员的球队数量
- 我正在尝试创建一个布尔函数,该函数计算字符并在字符为"()*-+"时返回 true
- 哈希函数计算
- 为什么 if 语句对于运算符重载函数计算 false
- 使用C 中的内在函数计算相交
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- vector.size() 函数计算量大吗?
- 如何使用opencv函数计算图像的孔数(二进制)
- 斐波那契函数计算不正确
- 如何用3个用户定义的函数计算一个数字的真平方根
- 元函数计算 x^n 并返回整数限制而不溢出(如果不可能)
- 使用递归函数计算字符串中的元音
- 如何使用 pow() 函数计算 C++ 中超过 2^32 的幂
- 返回 void 的函数的无序函数计算
- 在 C++ 中使用尾递归函数计算列表的总和
- 使用结构和函数计算线的长度