位移的位成本

时间:2013-06-19 19:39:07

标签: algorithm math complexity-theory bit-manipulation big-o

我更新了之前问过的一个问题但是由于最初的问题得到了回答,我猜我应该在一个新问题中单独提出这个问题。

以简单的乘法算法为例。我在很多地方看到声称这是一个Log ^ 2(N)操作。给出的解释是,这是由于它包含Log(N)数的Log(N)加法。

我遇到的问题是虽然这是真的,但它忽略了这样一个事实,即每个Log(N)数字都是位移的结果,到最后我们将至少有Logh(N)次移位。由于比特移位1是一个Log(N)操作,单独考虑的位移给我们Log ^ 2(N)操作。

因此,当我看到它进一步声称在实践中乘法实际上不使用Log ^ 2(N)操作时,对我来说没有任何意义,因为各种方法可以减少所需的添加数量。由于单独的位移给我们Log ^ 2(N),我对这种说法如何成真感到困惑。

事实上,任何移位和添加方法似乎都有这个位成本,而不管有多少加法。

即使我们使用完美的最小位编码,任何Mbit by Nbit乘法都会产生大约M + Nbit数,因此M + N位必须至少移位N次才输出/存储/组合项,这意味着至少N ^ 2位操作。

这似乎与Toom-Cook等所声称的操作次数相矛盾,所以有人可以指出我的推理存在缺陷的地方。

1 个答案:

答案 0 :(得分:1)

我认为解决这个问题的方法是你可以进行操作

 a + b << k

根本不需要进行任何轮班。如果你想象添加的样子,它看起来像这样:

  bn b(n - 1) ... b(n-k) b(n-k-1)     b0   0    ... 0  0  0  0
                  an     a(n-1)   ... ak a(k-1) ... a3 a2 a1 a0

换句话说,数字的最后k个数字将只是数字a的最后k个数字,中间数字将由b个数字的子集和一个数字的子集的总和组成,并且通过对b的剩余数字进行任何进位的纹波传播,可以形成数字。换句话说,总运行时间将与a和b中的位数以及要进行转换的位数成比例。

这里真正的诀窍是意识到你可以通过k个位置移动,而不需要在一个地方进行个别移位。不是将所有内容拖垮k次,而是可以确定这些位最终会在哪里直接写入。换句话说,移位k比特的成本不是移位1比特的成本的k倍。它是O(N + k),其中N是数字中的位数。

因此,如果您可以根据某些“使用移位添加两个数字”操作来实现乘法,则不必执行O((log n) 2 )位操作。每个加法执行O(log n + k)总位操作,因此如果k很小(例如,O(log n))并且您只进行少量添加,那么您可以做得比O((log n)更好 2 )位操作。

希望这有帮助!

相关问题