【发布时间】:2012-03-23 18:01:56
【问题描述】:
对于经典的面试问题“如何在没有乘法运算符的情况下执行整数乘法?”,最简单的答案当然是 C 中的以下线性时间算法:
int mult(int multiplicand, int multiplier)
{
for (int i = 1; i < multiplier; i++)
{
multiplicand += multiplicand;
}
return multiplicand;
}
当然,还有更快的算法。如果我们利用向左移位相当于乘以 2 的移位次数的幂的性质,我们可以向上移位到最接近的 2 的幂,并使用我们之前的算法相加从那里。所以,我们的代码现在看起来像这样:
#include <math.h>
int log2( double n )
{
return log(n) / log(2);
}
int mult(int multiplicand, int multiplier)
{
int nearest_power = 2 ^ (floor(log2(multiplier)));
multiplicand << nearest_power;
for (int i = nearest_power; i < multiplier; i++)
{
multiplicand += multiplicand;
}
return multiplicand;
}
我无法确定该算法的时间复杂度。我不相信O(n - 2^(floor(log2(n)))) 是表达这一点的正确方式,尽管(我认为?)它在技术上是正确的。谁能提供一些关于这方面的见解?
【问题讨论】:
-
multiplicand += multiplicand;
-
已修复 - 感谢您指出这一点。
-
你的第一个算法不是乘法算法,但是结果是
multiplicant * pow(2,multiplier),不是吗? -
啊,一个错误...感谢您指出,已修复。
-
@HerroRygar - 值得注意的是,这两个仅适用于正乘数(我的位移和加法也有这个问题)。也不是
log2()和移位乘法一样昂贵吗?
标签: c performance complexity-theory big-o