数组分治算法中两种mid计算方式的区别是什么?
两种区间中点计算方式的区别
核心差异为是否存在整数溢出风险,两种写法在无溢出的场景下计算结果完全一致,具体差异如下:
- 写法1:
mid = (leftSide + rightSide) / 2
绝大多数编程语言的整数类型都有长度上限(比如32位int的最大值为2147483647),如果leftSide和rightSide的数值都接近类型上限,二者相加后的结果会超出存储范围,发生整数溢出得到错误的负值,作为数组下标使用时会直接触发越界错误,导致程序崩溃。 - 写法2:
mid = leftSide + (rightSide - leftSide) / 2
合法区间下rightSide >= leftSide,先计算二者的差值,差值范围肯定不会超出当前整数类型的上限,再加上leftSide后的结果也不会超过rightSide,完全规避了整数溢出问题,计算结果始终正确。
举个实际场景的例子:假设使用32位int类型,leftSide = 2147483640,rightSide = 2147483646,第一种写法二者相加结果为4294967286,超出int上限后溢出得到负值,无法作为数组下标使用;第二种写法计算差值为6,除以2得3,加上leftSide得到正确结果2147483643。
补充说明:如果你使用的是无溢出风险的大整数类型,或者能确定区间的左右边界之和永远不会超出当前整数类型的上限,两种写法的效果完全一致,没有性能或结果上的差异。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

