整数乘法和除法之间意外的明显性能差异
Posted
技术标签:
【中文标题】整数乘法和除法之间意外的明显性能差异【英文标题】:Unexpected apparent performance difference between integer multiplication and division 【发布时间】:2014-04-09 07:56:39 【问题描述】:我正在实现一个简单的二进制搜索来查找整数的平方根。代码运行正确。但是,如果我将if
中的条件从mid * mid > x
更改为mid > (x / mid)
,那么大输入似乎会超时,那么一切都很好。
int sqrt(int x)
if(x < 0) return -1;
if(x <= 1) return x;
int l,r,mid,ans;
l = 0;
r = x;
while(l <=r )
mid = (l + r) / 2;
if((mid * mid) == x) return mid;
if((mid * mid) > x ) //<===== here if I change to mid > (x / mid)
r = mid - 1;
else
l = mid + 1;
ans = mid;
return ans;
;
因此我得出结论,除法比乘法快。但到目前为止我所做的研究都表明乘法比除法更快。
【问题讨论】:
Should I use multiplication or division? 的可能重复项 我不同意这种重复,因为这更多地是关于浮点运算,而这种情况是整数运算。我还编辑了标题以反映这一点。 OP,如果您不同意,请回滚。 你在不到一分钟的时间内投了反对票,你真的看懂了我的问题吗? @Bathsheba:是的,我同意,我担心没有人会因为投反对票而回答我的问题,谢谢。 我最后编辑了它。两个答案(在我撰写本文时)是正确的。 【参考方案1】:mid > (x / mid)
优于
(mid * mid) > x
因为你避免了整数溢出。
【讨论】:
非常感谢,我太傻了,没想到,错误一直说“超出时间限制”,我只是一直在考虑速度。【参考方案2】:大输入的问题是mid * mid > x
可能会溢出整数,然后二进制可能会进入一个非常奇怪的状态。在这种情况下,您也可能会得到正确的值,但这有点纯粹是运气。另一方面,使用除法可以避免整数溢出。
【讨论】:
非常感谢您的回答,我只能接受一个答案。既然你的声望更高,我会接受另一个人:)以上是关于整数乘法和除法之间意外的明显性能差异的主要内容,如果未能解决你的问题,请参考以下文章