我遇到了这个算法但却无法解决它的问题。作者说这是优雅和美丽的,但我无法弄清楚它的作用。有人可以帮忙吗?
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
答案 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次乘法。