指数算法分析

时间:2011-08-29 13:06:34

标签: algorithm

提供了关于指数的以下文字

我们有明显的计算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次?作者如何得到以上数字 谢谢!

3 个答案:

答案 0 :(得分:3)

因为第一算法的复杂性是线性的,而第二算法的复杂性是对数的(由于N)。 200位数字约为10^200log_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之间