【问题标题】:Why is multiplication O(n^2)?为什么乘法是 O(n^2)?
【发布时间】:2015-09-14 02:00:48
【问题描述】:

嗨,我正在学习 Big-O,想知道为什么乘法是 O(n^2)。我想我知道为什么,但我不确定。是因为乘法需要多长时间吗?我知道加法是线性时间 O(n),如果我们进行二进制乘法,我们首先将所有位相乘并移位。在我们完成所有位的移位和相乘后,我们将进行加法。所以我猜乘法的递归调用是O(n),结果的加法是O(n)。所以结合这两个运行时间会给我们 O(n^2)。这是对的还是我走错了路? 编辑: 所以我想我要问的是为什么小学乘法是O(n^2)

谢谢

【问题讨论】:

    标签: algorithm big-o


    【解决方案1】:

    首先,乘以什么?你在乘法吗,矩阵?你在乘法吗,多项式?你是乘法吗,整数?你在乘以浮点数吗?你是在乘以整数模素数吗?

    假设你在谈论你在小学学习的整数乘法 --

    (幼稚的)小学算法是O(n^2),因为当您使用它将n-digit 数字乘以m 数字数字时,您最终得到的基本上是m 的移位副本的总和n 数字然后你必须加起来。它涉及写下大约 n+mm 的数字网格,然后将所有这些数字相加,因此在该方法中您需要大约 n^2 的时间和空间。

    但是,已知有许多更好的乘法方法,例如俄罗斯农民乘法,对于非常大的数字,最快的方法大约可以达到 O(n log n) 时间。这些方法基于快速傅立叶变换,非常复杂。

    没有人知道如何证明乘法不能在O(n) 时间内完成,理论上有可能。

    所以当你问

    为什么乘法是 O(n^2)?

    答案是,它不是,它到底是什么,我们不知道,它介于O(n)O(n log n) 之间。只有特定的算法是O(n^2)

    【讨论】:

    • 赞成不仅因为这是正确答案,还因为您在 9 分钟内写下了它。那一定是某种记录。但我认为答案会更好,如果它有一些指向更多关于该主题的材料的链接。
    • 对不起,我忘了说我将 m 位数 x 和 n 位数 y 相乘。如果是这种情况,我的第一条思路是否正确,因为我正在考虑长乘法?
    • @RonnieGarcia:所以当你说这部分时“我知道加法是线性时间 O(n),如果我们进行二进制乘法,我们首先将所有位相乘并移位。在我们完成移位之后并将我们要做的所有位相乘。”这听起来像俄罗斯农民乘法。但是当你说这个“所以我猜乘法的递归调用是 O(n) 并且结果的加法将是 O(n)。”我不确定递归调用是什么。所以写实际的伪代码可能会更好?
    • @Juan Lopes:“那一定是某种记录”呵呵,一天的工作:)所以我不确定要添加哪些链接,我的意思是我可以添加指向维基百科的链接或东西,但感觉有点不值钱。如果您想要这些算法的参考资料,最好参考一些教科书或一些论文,即使我猜?但这是很多工作。我认为 OP 可能只关心小学算法或其他东西,不确定。
    • @RBarryYoung:在某些情况下,卷积绝对用于多项式相乘。我在帖子中提到的整数算法是 Schonage-Strassen 算法,它更像是一系列卷积而不是单个卷积 iiuc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2012-07-13
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多