Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 这个乘法算法的递推方程是什么?_Algorithm - Fatal编程技术网

Algorithm 这个乘法算法的递推方程是什么?

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)项?

乘法算法用于将两个基数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)
项?
你是对的,如果你天真地计算术语
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)