Algorithm 这个乘法算法的递推方程是什么?
乘法算法用于将两个基数r数相乘:Algorithm 这个乘法算法的递推方程是什么?,algorithm,Algorithm,乘法算法用于将两个基数r数相乘: 0 <= x,y < r^n x = x1 * r^(n/2) + x0 y = y1 * r^(n/2) + y0 所以我们现在有四个半位数的乘法(我们最初有一个n位数的乘法,现在有四个n/2位数的乘法) 在我看来,这种算法的重现性是: T(n) = O(1) + 4*T(n/2) 但显然它是T(n)=O(n)+3T(n/2) 无论哪种方式,解决方案都是T(n)=O(n^2),我可以看到这一点,但我想知道为什么有一个O(n)项而不是O(1)项?
0 <= x,y < r^n
x = x1 * r^(n/2) + x0
y = y1 * r^(n/2) + y0
所以我们现在有四个半位数的乘法(我们最初有一个n位数的乘法,现在有四个n/2
位数的乘法)
在我看来,这种算法的重现性是:
T(n) = O(1) + 4*T(n/2)
但显然它是T(n)=O(n)+3T(n/2)
无论哪种方式,解决方案都是
T(n)=O(n^2)
,我可以看到这一点,但我想知道为什么有一个O(n)项而不是O(1)
项?你是对的,如果你天真地计算术语x0*y1+x1*y0
,用两个乘积,时间复杂度是二次的。这是因为我们做了四个产品,正如您所建议的那样,重复性是,T(n)=O(n)+4T(n/2)
,它解决了O(n^2)
然而,Karatsuba观察到xy=z2*r^n+z1*r^(n/2)+z0
,其中我们让z2=x1*y2
,z0=x0*y0
,和z1=x0*y1+x1*y0
,最后一个术语可以表示为z1=(x1+x0)(y1+y0)-z2-z0
,它只涉及一种产品。使用这个技巧,循环确实会变成T(n)=O(n)+3T(n/2)
,因为我们总共做了三个产品(而不是四个,如果不使用这个技巧)
因为数字的顺序是r^n
,我们需要n
数字来表示数字(通常,对于固定的r>=2
,我们需要O(logn)
数字来表示数字n
)。要添加该顺序的两个数字,您需要“触摸”所有数字。因为有n
个数字,所以您需要O(n)
(正式地说,我会说Omega(n)
,意思是“至少有n
个时间的顺序”,但让我们把细节放在一边)时间来计算它们的总和
例如,当计算乘积N*M
时,位数N
将max(log N,log M)
(假设基数r>=2
为常数)
代数技巧在维基页面上有更详细的解释。它看起来很像Karatsuba()。我现在在火车上,即将失去互联网连接;如果问题在两小时后才开始,我会着手解决的是的,动机是Karatsuba,它将乘法次数从四次减少到三次。我只是不确定划分问题和合并解决方案的操作的时间复杂度是多少,这似乎是O(n)。我想知道为什么。
T(n) = O(1) + 4*T(n/2)