为数字供电的时间复杂性

时间:2013-12-29 18:14:49

标签: algorithm time-complexity exponentiation

从麻省理工学院开放式课程的算法课程中学习,一位教授谈论为一个数字及其时间复杂性提供动力。

x ^ n简单地计算为x * x * x ...... n次(想象一个简单的for循环,在其中执行乘法)

他说这种方法的时间复杂度是theta(n)。

以下是我的分析:

设N(x)是一个给出x中位数的函数。然后,复杂性:

x * 1 = N(x)

x * x = N(x)* N(x)

x * x * x = N(x ^ 2)* N(X)

x * x * x * x = N(x ^ 3)* N(x)

依旧......

总之,T(x ^ n)= N(x)+ N(x)* N(x)+ N(x ^ 2)* N(x)+ N(x ^ 3)* N( x)+ ........... N(x ^(n-1))* N(x)

T(x ^ n)= N(x)[1 + N(x)+ N(x ^ 2)+ N(x ^ 3)+ ....... N(x ^ n-1 )]

然而,我无法进一步解决。它最终如何产生theta(n)?

3 个答案:

答案 0 :(得分:3)

这样想。

如果你将两个数字之间的乘法运算成一个需要单位时间的运算。然后在θ(1)时间内完成2数乘法的复杂性。 现在,在for循环中,n个数字运行n-1次。您应用此操作n-1次。因此theta(1)成本操作发生N-1次,这使得操作theta(n-1)的总成本在渐近项中是theta(n)

乘法就像这样

  • x = x
  • x ^ 2 = x * x
  • x ^ 3 =(x ^ 2)* x
  • x ^ 4 =(x ^ 3)* x
  • ................
  • .................
  • .................
  • x ^(n-1)=(x ^(n-2))* x
  • x ^ n =(x ^(n-1))* x

每个步骤都是theta(1),因为您可以使用上一步的结果来计算整个产品。例如,当你计算x ^ 2时。您可以存储x ^ 2的值并在计算x ^ 3时使用它。类似地,当您计算x ^ 4时,您可以使用x ^ 3的存储值。

现在所有单独的操作都需要花费时间(1)。如果你这样做n次,总时间是theta(n)。现在计算x ^ n的复杂性。

  • 对于x ^ 2,T(2)= theta(1)
    这是我们归纳的基本情况。
  • 让我们假设x ^ k,T(k)= theta(k)为真实
  • x ^(k + 1)=(x ^ k)* x,T(k + 1)= theta(k)+ theta(1)

因此,对于x ^ n,时间复杂度是T(n)= theta(N)

如果你想总结复杂性。你总结错了。

我们知道T(2)= theta(1),乘以两个数字的时间复杂度。

  • T(n)= T(n-1)+ T(2)(乘以两个数的时间复杂度和乘以(n-1)个数的时间复杂度)
  • T(n)= T(n-2)+ T(2)+ T(2)
  • T(n)= T(n-3)+ T(2)+ T(2)+ T(2)
  • ...................
  • ...................
  • T(n)= T(3)+(n-3)* T(2)
  • T(n)= T(2)+(n-2)* T(2)
  • T(n)=(n-1)* T(2)
  • T(n)=(n-1)* theta(1)
  • T(n)= theta(n)

如您所知,C是一个如何编写幂(天真)函数的例子。

 int power(int x,int n)
 {
     int powerVal=1;
     for(int i=1;i<=n;++i)
     {
          powerVal=powerVal*x;
     }
     return powerVal;
 }

现在,正如您所看到的,每次都会发生两个整数的乘法,并且只需要ata(1)时间。你运行这个循环n次。所以总复杂度是theta(n)

答案 1 :(得分:1)

你正在离开赛道。

乘法是单一操作。

您正在应用此操作n次。

因此,O(1 * n),即O(n)。

完成。

答案 2 :(得分:0)

如果您正在寻找计算给定数字功效的最佳算法,那么这不是最佳解决方案。实际上,正如您所说,数字的幂没有计算,这种方法给出了复杂度o(n),因为您正在应用相同的操作nX*X*...*X。下面的算法给出了复杂度o(log n)

pow(x,n)
{
  R=1; X=x; N=n;
   while (N > 0)
   {
      if N mod 2=1  R= R*X
      N= N div 2
      X= X · X
   }
   return R
}