0
在每一段代码我看了网上或书,说如果有人想计算S和E之间的中点,他们这样做:为什么用这种方式计算二分搜索索引?
int mid = s + ((e - s)/2);
数学这不就是一回事
int mid = (s + e)/2;
那么为什么它经常以第一种方式写?我的猜测是防止整数溢出,但不确定。
由于
在每一段代码我看了网上或书,说如果有人想计算S和E之间的中点,他们这样做:为什么用这种方式计算二分搜索索引?
int mid = s + ((e - s)/2);
数学这不就是一回事
int mid = (s + e)/2;
那么为什么它经常以第一种方式写?我的猜测是防止整数溢出,但不确定。
由于
如果e接近最大值为整数,则可以(s+e)/2
溢出,但s+(e-s)/2
不能(假设s
非负)。
例如(MAX_INT-2 + MAX_INT)
== -4
,所以(MAX_INT-2 + MAX_INT)/2
== -2
您得到了正确的答案。实际上,有些代码确实使用'(s + e)/ 2',但是,它可能会导致整数溢出问题。 –
由于整数分割的原因,它们是不一样的。 –
@EdHeal问题只是溢出。只要's'和'e'都是正值,那么在该部门中的四舍五入就是一样的。 –