在分析算法时,我发现我们通常假设乘法来进行单一计算机指令。但是当数量的大小(就位数而言)时,这种假设是不合适的。在最基本的乘法形式中,乘以两个n位数通常是O(n ^ 2)。在这种情况下,计算x ^ n的复杂度(就位操作而言)可能是什么(x增加到n的幂)?
通过解释的方法,我的复杂性似乎是n的指数(但不确定确切的数字)
答案 0 :(得分:3)
计算x^n
的复杂性当然取决于用于计算功率和乘法的算法。如果通过平方计算每次指数的功率,则需要O(log n)次乘法。在每个步骤中,您可以将一个数字平方,或者将两个数字相乘并将两个数字中的一个相加。
如果x
有d(x)
个数字,x^n
有Θ(n * d(x))个数字,在最后一步中,您将数字大约为{{1} }数字(并且可能将该数字乘以较小的数字)然后通过将重复的正方形n/2*d(x)
(如果x^(2^k)
)与累加器相乘来完成算法。
设2^k <= n < 2^(k+1)
为S(m)
- 位数的平方成本(可能与可能乘以两个任意m
的成本M(m)
相同或不同号)。然后大约需要
m
的工作。自S(2^(k-1)*d(x)) + S(2^(k-2)*d(x)) + S(2^(k-3)*d(x)) + ...
起,即S(m) >= m
和S(2^(k-1)*d(x))
之间。因此,最后一步主要是工作的工作。对于2*S(2^(k-1)*d(x))
与累加器的乘法,同样成立,最终的乘法支配着工作。最终的累加器可能几乎与重复的平方一样大,因此通过重复平方将x^(2^s)
提升到x
次幂的总成本是
n
是Θ(M(2^k*d(x)),
。使用天真乘法 - Θ(M(n*d(x)))
- 您的总费用为M(m) = O(m^2)
。使用更先进的乘法算法(Karatsuba,Toom-Cook,Schönhage-Strassen,......),您可以获得更低的复杂度,低于O(n^2*d(x)^2)
。
通过乘以O(n*d(x)*log (n*d(x)) * log log (n*d(x)))
迭代计算功率,在x
步骤中,让n
表示将M(m,k)
- 位数乘以{{1}的成本}}-数字。由于其中一个因素始终为m
,因此总费用为
k
使用成本为x
的教科书算法,总计最新为M(d(x),d(x)) + M(d(x),2*d(x)) + M(d(x),3*d(x)) + ... + M(d(x),(n-1)*d(x))
,因此总费用再次为M(m,k) = m*k
。但是,常数因子比反复平方的指数更大。
如果你将数量大不相同的数字相乘,就像在几次迭代后发生的那样,你不能 - 据我所知 - 将成本n*(n-1)/2*d(x)^2
降低到Θ(n^2*d(x)^2)
以下 - 如果{{1在基数M(m,k)
中查看数字为1位数字和Θ(m*k)
- 位数字(m < k
),您可以降低使用“数字”倍增数字的成本算法如果r
足够大,但您无法减少r*m <= k < (r+1)*m
因子。因此,此算法的复杂度为b^m
,因此m
的因子无法消除。
答案 1 :(得分:2)
Wikipedia可以很好地概述各种乘法算法的复杂性时间。
回答你的问题,假设天真的教科书方法乘以两个m位数字(复杂度为O(平方公尺))和通过将数字乘以n次来提高功率的天真方法,你有n次乘法,因此复杂度为O(n * m ^ 2)或简单为O(nm ^ 2)
答案 2 :(得分:1)
n ^ k费用:
O((log(n))^k)
log(n) - n
的位表示^ k - 因为用于乘以两个n位数的简单算法花费O(n ^ 2)