谁能解释一下这个算法的作用?

时间:2016-03-07 11:01:46

标签: algorithm

我遇到了这个算法但却无法解决它的问题。作者说这是优雅和美丽的,但我无法弄清楚它的作用。有人可以帮忙吗?

multiply(n, m)
  sum = 0
  while true
     if n is odd then
        sum += m
     if n = 1 then
        return sum
     n = n / 2
     m = m * 2

1 个答案:

答案 0 :(得分:4)

基本上它会增殖。

迭代设置的n位,并将m加到变量sum上,一旦算法终止,它将保存结果。在每一步,m被更新为乘以2.在每一步,n除以2,这导致长度为1的位向右移位。

给定算法所利用的等式可以通过以下表达式来描述。

m * n = (n / 2) * (m * 2)        if n is even
m * n = (n / 2) * (m * 2) + m    if n is odd

循环导致n连续减小,同时将m加到最终结果,其中n为奇数。 (即设置n的最右边的位)

我不认为这种算法对于大多数语言中的典型int数据类型都是有效的,因为乘法可以通过CPU的单个指令来完成。然而,检查位可能是作者可能想到的优雅。

使用设置为乘法的位(或数字)是许多算法中使用的一种想法,例如帮助实现数字的 O(logn)时间取幂,尤其是在大整数实现中。

简单地说,当找到 b 而不是乘以a(b-1)次时,你会发现诸如a,a 2 之类的权力, 4 8 ,......预处理,当你想找到 6 时,你可以乘以 4 < / sup>带有 2 ,两者都是在预处理过程中发现的。例如,在这个例子中,3次乘法就足以代替线性情况,这需要5次乘法。