基本算术操作(如乘法,平方根,对数,标量和矩阵乘积)常见算法的大 O 复杂度是多少?
是否有一些异类算法,它们在大 O 复杂度方面更加高效,但在实际解决方案中并不常见(例如不在流行的软件库中实现)?
基本算术操作(如乘法,平方根,对数,标量和矩阵乘积)常见算法的大 O 复杂度是多少?
是否有一些异类算法,它们在大 O 复杂度方面更加高效,但在实际解决方案中并不常见(例如不在流行的软件库中实现)?
方阵矩阵乘积:
还有一个O(N2.38)的Coppersmith–Winograd算法,但由于巨大的隐藏常数,它并不普及。
大整数乘法:
2008年也发表了一种O(n log n · 2O(log* n))的算法,但这种算法太新,普及率不高。
通常情况下,朴素算法对于常规大小的输入已足够。
操作本身并没有复杂度,算法才有。例如,有各种不同的平方根算法,它们的复杂度也会不同。
平方根和对数可以用多种方式实现,这会极大地影响复杂度(通过所需精度来判断)。
如果它们使用查找表(和某种插值方法)实现,随着需要更高的精度,内存需求会急剧增加,但复杂度只是在数组中查找值并可能应用插值。
更流行的做法似乎是通过它们的级数定义来实现。递归或迭代一个语句一定次数,直到达到所需精度。在这里,所需次数可能会非常高,因为需要更高的精度,而且计算本身也会受到增加精度的影响。
看一下BigInteger,它是关于任意长度整数的。现在每个操作都有一个成本,以输入大小为代价,即位数(通常对于数字K
,位数为O(log K)
)。以下我将使用N
表示位数。
例如,加法和减法现在是O(N)
。乘法可以是朴素的O(N^2)
,也可以是O(n (log n)^(2+epsilon))
,其中使用FFT算法。
其他算法包括“幂”函数,需要O(N)
次乘法。(但现在每个乘法都有一个成本!)
对于BigDecimals,即任意长度的十进制数,还有其他复杂性,除了一些基本操作外,一些更有趣的事情也很重要(特别是如果您想弄清楚需要多少精度)。您可以查看Java的实现。
N
是位数。然而,幂运算对于某些数字 K
确实是 O(log K)
的。 - Larry大量位数的除法和平方根计算并不比乘法更复杂。对于这两种操作,普通的牛顿迭代可以被安排成只包含乘法。由于每一步中正确数字的数量增加了一倍,我们可以在每一步中将计算精度加倍。
有一种傅里叶类型的算法也可以进行整数乘法(Schonhage-Strassen)
我曾认为 Strassen 算法有一个版本可以稍微比普通整数乘法更好,但现在想想,那个版本最终与直接方法相同...
加法和减法基本上就是加法和减法。除法和平方根可能会有趣一些...
此外:请注意,到目前为止,每个人都谈论了整数算术。一旦涉及浮点数/双精度浮点数,一切都不确定了。然后你就进入了numerical analysis 的世界,那是一个完全不同的领域...