我有以下问题
在什么情况下可以将乘法视为单位时间 操作
但我认为乘法总是被视为单位时间。我错了吗?
答案 0 :(得分:7)
这取决于N
是什么。如果N
是任意大数的位数,那么随着位数的增加,计算产品需要更长的时间。但是,在大多数编程语言和应用程序中,数字的大小限制为一些合理的位数(通常为32或64)。在硬件中,这些数字在一个步骤中相乘,而不依赖于数字的大小。
当位数是固定数字时,如32,那么谈论渐近复杂度是没有意义的,你可以根据你的算法来处理乘法,就像O(1)
运算一样。 #39;重看。什么时候可以变得任意大,就像使用Java的BigInteger
类一样,然后乘法取决于这些数字的大小,存储它们所需的内存也是如此。
答案 1 :(得分:5)
只有在您对两个号码执行操作的情况下,of numeric type
(强调此处,不会进入二进制细节),您只需要假设正在执行的操作只是一个恒定的时间。
它没有被定义为单位时间,但更严格的是,即使我们增加数字的大小也不会改变的恒定时间间隔,但实际上计算确实利用了更多的时间对大数字进行计算)。这些通常被认为是微不足道的,除非乘以的数字太大,如 BigIntegers in Java
等。
但是,一旦我们开始执行二进制字符串的乘法运算,我们的复杂性就会增加,而朴素的方法会产生O(n ^ 2)的复杂性。
因此,为了简化,我们执行基于除法和征服的乘法,也称为Karatsuba's algorithm for multiplication,其复杂度为O(n ^ 1.59),这减少了乘法的总数并增加了一些较小的乘法乘法次数和一些加法。
我希望我没有错误判断这个问题。如果是这样,请提醒我 我可以删除这个答案。如果我理解了这个问题,那么这里贴出的另一个答案似乎就是 不完整的。
答案 2 :(得分:1)
表达式单位时间有点含糊不清(AFAIK用得不多)。
在单个时钟周期内执行乘法时,实现单位时间。这在现代处理器上很少发生。
如果乘法的执行时间不依赖于操作数的特定值,我们可以说它是在恒定时间中执行的。
当操作数长度有界时,时间永远不会超过给定的持续时间,我们也会说在恒定时间内执行操作。
此恒定持续时间可用作运行时间的计时单位,因此您可以计算“倍数”而不是秒数(操作,触发器)。
最后,您可以根据其执行的乘数的数量来评估算法的效果,而与其执行的时间无关。