power() 的时间复杂度
我实现了这个函数 power()
,它接受两个参数 a
和 b
并计算 ab。
typedef long long int LL;
LL power(int a,int b)
{
int i = 1;
LL pow = 1;
for( ; i <= b ; ++i )
pow *= a;
return pow;
}
给定:ab落在long long int
范围内。
问题:如何降低算法的时间复杂度?
I implemented this function power()
which takes two arguments a
and b
and computes ab.
typedef long long int LL;
LL power(int a,int b)
{
int i = 1;
LL pow = 1;
for( ; i <= b ; ++i )
pow *= a;
return pow;
}
Given : ab falls in the range of long long int
.
Problem : How to reduce the time complexity of my algorithm?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
通过平方求幂。
非递归实现
该算法需要 log2b< /strong> 平方和最多 log2b 乘法。
运行时间O(log b)
Exponentiation by Squaring.
A non-recursive implementation
This algorithm requires log2b squarings and at most log2b multiplications.
The running time is O(log b)
使用通过平方求幂
Use Exponentiation by squaring
通过平方求幂并不能在所有情况下给出最小乘法次数。寻找“加法链”、“布劳尔链”、“汉森链”和“肖尔茨猜想”。
Exponentiation by squaring does not give the minimal number of multiplications in all cases. Look for "addition chains", "Brauer chains", "Hansen chains", and "Scholz conjecture".
我建议:如果您确实需要更快的函数(使用 long double ),请使用 pow() 函数,或者自己考虑一下您的作业。
对于任意精度:请参阅 GMP 库
http://gmplib.org/manual/Integer-Exponentiation.html#Integer-Exponentiation
I would suggest: Use the pow() function if you really need a faster function (with long double ) or think about your homework for yourself.
For arbitrary precision: See the GMP lib
http://gmplib.org/manual/Integer-Exponentiation.html#Integer-Exponentiation
使用平方求幂。也就是说,如果我们需要a^b,我们检查b是否是偶数,如果b是偶数,我们找到
(a^2)^(b/2)
,否则我们找到a* ((a^2)^(b/2))
。这可能不是最好的算法,但它比线性算法更好。Use exponentiation by squares. That is if we need a^b, we check if b is even, if b is even, we find
(a^2)^(b/2)
, else we finda*((a^2)^(b/2))
. This may not be the best algorithm, but it is better than the linear algorithm.下面是Java代码的递归实现
使用 通过平方求幂 计算 2 的 n 次方,复杂度为 O(log n)
Here is the recursive implementation of Java code
for 2 to the power of n with O(log n) complexity using Exponentiation by squaring