【发布时间】:2015-04-21 20:03:38
【问题描述】:
我有以下问题
什么情况下乘法可以看成单位时间 操作?
但我认为乘法总是被认为需要单位时间。我错了吗?
【问题讨论】:
标签: algorithm time-complexity complexity-theory multiplication execution-time
我有以下问题
什么情况下乘法可以看成单位时间 操作?
但我认为乘法总是被认为需要单位时间。我错了吗?
【问题讨论】:
标签: algorithm time-complexity complexity-theory multiplication execution-time
这取决于N 是什么。如果N 是任意大数中的位数,那么随着位数的增加,计算乘积需要更长的时间。然而,在大多数编程语言和应用程序中,数字的大小被限制在一些合理的位数(通常是 32 或 64)。在硬件中,这些数字是一步相乘的,与数字的大小无关。
当位数是一个固定的数字,比如 32 时,讨论渐近复杂度是没有意义的,你可以将乘法视为O(1) 运算,无论你在看什么算法.什么时候可以变得任意大,比如 Java 的 BigInteger 类,那么乘法取决于这些数字的大小,存储它们所需的内存也是如此。
【讨论】:
仅在您对两个数字执行操作的情况下,of numeric type(此处强调,不涉及二进制细节),您只需假设正在执行的操作是只有恒定的时间。
它没有定义为单位时间,但更严格地说,是一个恒定的时间间隔,即使我们增加数字的大小也不会改变,但实际上计算确实会利用更多的时间来对大数字进行计算)。这些通常被认为是微不足道的,除非相乘的数字太大,例如 BigIntegers in Java 等。
但是,一旦我们开始执行二进制字符串的乘法运算,我们的复杂度就会增加,而简单的方法会产生 O(n^2) 的复杂度。
因此,为了简单起见,我们执行基于分而治之的乘法,也称为Karatsuba's algorithm for multiplication,其复杂度为 O(n^1.59),从而将乘法和加法的总数减少到较少的数量乘法和一些加法。
我希望我没有误判这个问题。如果是这样,请提醒我,以便 我可以删除这个答案。如果我正确理解了这个问题,那么这里发布的其他答案似乎 不完整。
【讨论】:
unit time 表达有点模棱两可(AFAIK 用的不多)。
真正的单位时间是在单个时钟周期内执行乘法运算时实现的。这在现代处理器上很少发生。
如果乘法的执行时间不依赖于操作数的特定值,我们可以说它是在恒定时间中执行的。
当操作数的长度是有界的,所以时间永远不会超过给定的持续时间,我们也说一个操作是在恒定时间中执行的。
这个恒定的持续时间可以作为运行时间的计时单位,这样你就可以用“乘数”而不是秒数(ops, flops)来计算。
最后,您可以根据算法执行的乘法次数来评估算法的性能,而与它们所花费的时间无关。
【讨论】: