【问题标题】:Why is naive multiplication n^2 time?为什么天真的乘法 n^2 时间?
【发布时间】:2013-07-20 18:47:55
【问题描述】:

我读过诸如加法/减法之类的运算是线性时间,而“小学”长乘法是 n^2 时间。为什么这是真的?

当n是较小的操作数时,不是加法floor(log n)次吗?同样的论点也适用于减法和乘法,如果我们编写一个程序来进行长乘法而不是将整数加在一起,那么复杂度不应该是floor(log a) * floor(log b),其中 a 和 b 是操作数吗?

【问题讨论】:

    标签: big-o time-complexity multiplication


    【解决方案1】:

    答案取决于什么是“n”。当他们说加法是 O(n) 而乘法(使用朴素算法)是 O(n^2) 时,n 是数字的长度,以位或其他单位为单位。使用此定义是因为任意精度算术是作为“数字”列表(不一定以 10 为基数)的操作实现的。

    如果 n 是要相加或相乘的数字,只要数字存储在 log n 空间中,复杂度将是 log n 和 (log n)^2(对于正 n)。

    【讨论】:

      【解决方案2】:

      (例如)273 x 12 的简单乘法方法扩展为(使用分配规则)(200 + 70 + 3) x (10 + 2) 或:

        200 x 10 + 200 x  2 
      +  70 x 10 +  70 x  2
      +   3 x 10 +   3 x  2
      

      这种简化的想法是将乘法简化为可以轻松完成的事情。对于您的小学数学,假设您知道从零到九的乘法表,那将与数字一起使用。对于每个“数字”可能是 0 到 9999 之间的值(为了便于十进制打印)的 bignum 库,同样的规则适用,能够相对恒定地将小于 10,000 的数字相乘)。

      因此,如果n 是位数,那么复杂度确实是O(n<sup>2</sup>),因为“常量”操作的数量往往会随着“位数”计数的乘积而增加。

      即使您对数字的定义略有不同(例如从 0 到 9999 的值,甚至是二进制数字 01 之一)也是如此。

      【讨论】:

      • 这里的 n 是什么? 3? 5?我只看到总共 6 个乘法。那 n^2 怎么样?
      • @awgtek:不要将复杂性与指标混为一谈:-) 复杂性可以被认为是衡量输入变量接近某个足够大的值(如无限)时事物变得多么复杂的指标,而不是给定n 的特定结果。在这种情况下,您可以将其视为数字中的位数,因为它们增加。由于您必须将一个数字中的每个数字乘以另一个数字,因此乘法的数量实际上是两个数字的计数相乘。你得到六的原因是因为我们将三位数乘以二,但这并不复杂。
      • 换句话说,两个 10 位数字将是 100 次操作,两个 100 位数字将是 10,000 次操作,依此类推。操作计数趋向于随着两个数字中数字计数的平方而增加。显然,如果其中一个数字始终为单个数字,情况并非如此,但复杂性分析处理的是极限,而不是特定场景。
      • 好吧,我明白了,这是因为部分乘积方法中需要的最终加法的数量,所以假设最坏的情况 n 是 3(两者中最大的),那么总共需要 9 次加法.这就是我理解 n^2 来自哪里的方式......
      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 2012-11-10
      • 2014-02-02
      • 2011-10-27
      • 2018-11-05
      相关资源
      最近更新 更多