大O基本算术运算的复杂性

时间:2010-03-05 14:07:57

标签: algorithm math complexity-theory big-o time-complexity

基本算术运算的广泛算法(如乘法,平方根,对数,标量和矩阵乘积)的Big-O复杂度是多少?

在Big-O复杂性方面,是否有更高效的外来算法,但在实际解决方案中并不十分普遍(例如,在流行的软件库中没有实现)?

7 个答案:

答案 0 :(得分:18)

请参阅http://en.wikipedia.org/wiki/Computational_complexity_of_mathematical_operations


方矩阵的矩阵乘积:

还有一个O(N 2.38 Coppersmith–Winograd algorithm但我不认为它是由于巨大的隐藏常数而广泛传播。

Big-int multiplication

2008年还发布了一个n log n·2 O(log * n)算法,但这个算法太新了,无法普及。


通常,天真的方法对于正常大小的输入来说已经足够了。

答案 1 :(得分:5)

操作没有复杂性,算法也没有。例如,有各种平方根算法,它们将具有不同的复杂性。

答案 2 :(得分:5)

您会将大多数简单操作视为O(1),因为您的输入大小通常是固定的(即32位或64位)。

在正常情况下,无论输入的“大小”如何,您的平台将执行与乘法,平方根,对数等完全相同的操作(即int a = 0; int b = Int32.MaxValue都是32位整数)。

一旦你开始查看矩阵或表示任意精度数字,它就会变得有趣,但有人已经将维基百科摘要链接起来,所以我不会进入那个。

只是不要使用Schönhage–Strassen来增加“正常”的小数字。它会让我哭泣。仅仅因为算法是O( n 2 )并不意味着它很糟糕 - 特别是当 n 几乎总是2 5 < / sup>或2 6

答案 3 :(得分:1)

平方根和对数可能以各种方式实现,极大地影响了复杂性(根据所需的精度判断)。

如果使用查找表(以及某种插值)实现它们,则内存需求确实会爆炸,因为需要更高的精度,但复杂性是查找数组中的值并可能应用插值。

更普遍的是,它们似乎是通过系列定义来实现的。递归或迭代语句多次,直到达到所需的精度。在这里,由于需要更高的精度,轮数可能会变得非常高,而且计算本身也会受到精度提高的影响。

答案 4 :(得分:1)

在任意长度的整数上查看BigInteger。根据输入的大小,现在所有内容都有成本,即位数(通常为O(log K)K位)。我将使用N作为下面的位数。

例如,加法和减法现在是O( N )。乘法是O( N^2 )(天真)或O( n (log n)^(2+epsilon) )与FFT。

其他算法包括“power”函数,它需要O( N )次乘法。 (现在除了每个乘法都有成本!)

BigDecimals还有其他复杂性,它是任意长度的十进制等值,除了一些更基本的操作之外,其中一些东西也更有趣(特别是如果你想弄清楚多少精度)想)。您可以看一下Java的实现。

答案 5 :(得分:0)

还有一种傅里叶型算法也可以进行整数乘法(Schonhage-Strassen

我认为有一个版本的Strassen算法在整数乘法方面的效果略好于正常,但现在我想起来了,那个结果就像直截了当一样......

加法和减法非常相似,只是加法和减法。虽然分区和平方根可能很有意思......

另请注意:到目前为止,每个人都谈到了INTEGER算法。一旦你得到浮点数/双打,所有的赌注都会被取消。然后你进入numerical analysis的世界,这是它自己的整个领域......

答案 6 :(得分:0)

大量位的除法和平方根并不比乘法复杂得多。对于这两个操作,可以以牛顿迭代仅具有乘法的方式来布置普通的旧牛顿迭代。由于每一步中正确位数的数量加倍,我们可以将每一步计算的精度加倍。