我正在实现一个简单的二进制搜索来查找整数的平方根。代码运行正常。但是,如果我将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;
}
};
因此我得出结论,除法比乘法更快。但到目前为止我所做的研究都指出乘法比分裂更快。
答案 0 :(得分:3)
mid > (x / mid)
优于
(mid * mid) > x
因为你避免了整数溢出。
答案 1 :(得分:3)
大输入的问题是mid * mid > x
可能会溢出整数,然后二进制文件可能会进入一个非常奇怪的状态。在这种情况下你也可能得到正确的值,但这有点纯粹的运气。另一方面,使用除法可避免整数溢出。