提供了关于指数的以下文字
我们有明显的计算X来计算功率N使用N-1乘法。递归算法可以做得更好。 N <= 1是递归的基本情况。否则,如果n是偶数,我们有xn = xn / 2。 xn / 2,如果n是 奇数,x到幂的n = x(n-1)/ 2 x(n-1)/ 2 x。
具体而言,200位数字被提升为大功率(通常是 另一个200位数字),只保留了200个左右的数字 每次乘法后。由于计算需要处理 200位数字,效率显然很重要。该 用于求幂的直接算法需要大约10到10 200次乘法的功率,而递归算法呈现 仅需约1,200。
我对上述文字的疑问 1.对于简单算法和递归算法,作者如何使用10次幂乘以200次乘法,只有大约1,200次?作者如何得到以上数字 谢谢!
答案 0 :(得分:3)
因为第一算法的复杂性是线性的,而第二算法的复杂性是对数的(由于N)。
200位数字约为10^200
,log_2(10^200)
约为1,200
。
答案 1 :(得分:2)
指数有200个数字,因此它的功率大约为10到200.如果使用朴素求幂,你将不得不进行这样的乘法运算。
另一方面,如果使用递归取幂,则乘法次数取决于指数的位数。由于指数几乎是10 ^ 200,因此它具有log(10 ^ 200)= 200 * log(10)位。这是600,其中的2是因为如果你有1位,你将不得不进行两次乘法。
答案 2 :(得分:1)
以下是两种可能的算法:
算法给出了^ N
SimpleExp(a,N):
return a*simpleExp(a,N-1)
所以它是N操作,所以对于^(10 ^ 200)它是10 ^ 200
OptimizedAlgo(a,N):
if N == 0:
return 1
if (N mod 2) == 0:
return OptimizedAlgo(a,N/2)*OptimizedAlgo(a,N/2) // 1 operation
else:
return a*OptimizedAlgo(a,(N-1)/2)*OptimizedAlgo(a,(N-1)/2) //2 operations
这里是你在log2(N)和2 * log2(N)操作之间的^(10 ^ 200)(2 ^(log2(N)= N)
和log2(10^200) = 200 * log2(10) ~ 664.3856189774724
和2 * log2(10 ^ 200)= 1328.771237954945
所以操作次数介于664和1328之间