Algorithm “Karatsuba算法v.s.”*&引用;操作人员

Algorithm “Karatsuba算法v.s.”*&引用;操作人员,algorithm,Algorithm,今天,我听说了Karatsuba算法,一种快速乘法算法。我很好奇这个“快”是什么意思 通常,当计算一段代码的时间复杂度时,我们考虑使用*运算符作为O(1)的乘法运算,如果它总是真的,那么为什么我们有一个关于渐近符号的更快的算法?或*在非常大的数字上执行时不应被视为O(1),其中Karatsuba算法可能有用 在机器级别,编译器总是对*进行一些优化。例如,使用逐位运算将数字乘以2^n。Karatsuba算法在实际运行时间内是否优于* 此算法属于长数。大于CPU中的寄存器大小。 这来自维基百科: K

今天,我听说了Karatsuba算法,一种快速乘法算法。我很好奇这个“快”是什么意思

通常,当计算一段代码的时间复杂度时,我们考虑使用*运算符作为O(1)的乘法运算,如果它总是真的,那么为什么我们有一个关于渐近符号的更快的算法?或*在非常大的数字上执行时不应被视为O(1),其中Karatsuba算法可能有用


在机器级别,编译器总是对*进行一些优化。例如,使用逐位运算将数字乘以2^n。Karatsuba算法在实际运行时间内是否优于*

此算法属于长数。大于CPU中的寄存器大小。 这来自维基百科:

Karatsuba算法是一种快速乘法算法。是的 1960年由安纳托利·阿列克谢维奇·卡拉祖巴发明,出版于 1962它将两个n位数的乘法减少到最多3 n^(log_2 3)=3 n^1.585个单位数乘法 一般来说(当n是2的幂时,正好是n^(log_2 3)


经典乘法是O(n2),其中n是被乘法的数字中的位数

当测量正常的计算机代码时,您处理的是固定大小(通常为32位或64位)的数字,因此变成O(1)(因为大小不变)


一旦开始处理大整数,这一点就变得非常重要。

这个问题的问题是,您所称的
*
运算符不是算法。这完全取决于编译器(或解释器)和CPU的某种组合,以确定如何得出答案

我不确定使用内置乘法是O(1)的说法在哪里,但这不可能是真的,除非对输入有一些限制(可能是这样的,N必须足够小,以适合CPU寄存器)或使用某种查找表

正如SLaks提到的,当乘法发生在CPU中时(对于大多数CPU),数字总是相同的大小,32位或64位。尽管数字1可以用一个位表示,但它仍然占用32位空间(在大多数实现中)

Big-O表示法只是告诉您存在一定大小的输入,在输入之后,更高效的算法(用Big-O术语)将比效率较低的算法更快

位移位不能应用于所有任意乘法,因此,虽然实际上它很有用,但在算法上,它只能与其他只适用于二的幂乘法的方法进行比较


大多数语言都有一种特殊类型,用于处理大于32位的数字,甚至在使用
*
进行乘法时,可能会使用Karatsuba算法。

我想总的观点是,理论和实践之间存在交叉点,但它们不是一回事。内置乘法将是O(1),因为它只为某些固定宽度类型定义。但当然,严格来说,这使得O()-表示法不适用。@DanielFischer“因为它只为某些固定宽度类型定义”OP没有指定语言,有些语言是为任意大小的数字定义运算符的,例如Python(不确定它是否是任意大小的,但只是成功地用大于2^64的
*
运算符乘以了2个数字)我认为,通过内置,OP指的是CPU。如果它是内置的语言,那当然是不同的。是的,Python有任意大的(嗯,对于所有实际用途而言)内置数字。@Danielf发现OP可能是这么想的,但是问题中没有提到它,
*
运算符是在语言级别而不是CPU级别定义的,尽管在许多情况下,它与CPU指令一一对应。