从麻省理工学院开放式课程的算法课程中学习,一位教授谈论为一个数字及其时间复杂性提供动力。
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)?
答案 0 :(得分:3)
这样想。
如果你将两个数字之间的乘法运算成一个需要单位时间的运算。然后在θ(1)时间内完成2数乘法的复杂性。 现在,在for循环中,n个数字运行n-1次。您应用此操作n-1次。因此theta(1)成本操作发生N-1次,这使得操作theta(n-1)的总成本在渐近项中是theta(n)
乘法就像这样
每个步骤都是theta(1),因为您可以使用上一步的结果来计算整个产品。例如,当你计算x ^ 2时。您可以存储x ^ 2的值并在计算x ^ 3时使用它。类似地,当您计算x ^ 4时,您可以使用x ^ 3的存储值。
现在所有单独的操作都需要花费时间(1)。如果你这样做n次,总时间是theta(n)。现在计算x ^ n的复杂性。
因此,对于x ^ n,时间复杂度是T(n)= theta(N)
如果你想总结复杂性。你总结错了。
我们知道T(2)= theta(1),乘以两个数字的时间复杂度。
如您所知,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)
,因为您正在应用相同的操作n
次X*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
}