【问题标题】:What is the recurrence equation for this multiplication algorithm?这个乘法算法的递归方程是什么?
【发布时间】:2016-04-08 13:03:33
【问题描述】:

乘法算法用于将两个 r 基数相乘:

0 <= x,y < r^n
x = x1 * r^(n/2) + x0
y = y1 * r^(n/2) + y0

其中x0x 中包含最低有效数字的一半,x1 是最高有效数字的一半,y 也是如此。

所以如果r = 10n = 4,我们就有x = 9723 = 97 * 10^2 + 23,其中x1 = 97 and x0 = 23

乘法可以这样完成:

z = x*y = x1*y1 + (x0*y1 + x1*y0) + x0*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) 项?

【问题讨论】:

标签: algorithm


【解决方案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*y2z0=x0*y0z1=x0*y1 + x1*y0,并且可以将最后一项表示为z1=(x1+x0)(y1+y0)-z2-z0,它只涉及一个产品。使用这个技巧,重复出现确实变成了T(n) = O(n) + 3T(n/2),因为我们一共做了三个产品(而不是四个如果不使用这个技巧)。

因为数字是有序的r^n,我们需要n 数字来表示数字(通常,对于固定的r&gt;=2,我们需要O(log N) 数字来表示数字N)。要添加该顺序的两个数字,您需要“触摸”所有数字。由于有n 数字,你需要O(n)(正式地我会说Omega(n),意思是“至少n 时间的顺序”,但让我们把细节放在一边)时间来计算它们的总和。

例如,在计算乘积 N*M 时,n 的位数将是 max(log N, log M)(假设基数 r&gt;=2 是常数)。

Karatsuba algorithm 的 Wiki 页面上更详细地解释了代数技巧。

【讨论】:

  • 是的,动机是 Karatsuba,它将乘法的数量减少到三个而不是四个。我只是不确定划分问题和组合解决方案的操作的时间复杂度是多少,这似乎是 O(n)。我想知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多