¿Por qué las personas usan mid = low + (high-low) / 2 en lugar de (low + high) / 2?

Puedes llegar a la mitad usando ambos

bajo + (alto – bajo) / 2

y

(bajo + alto) / 2

Si lo resuelven matemáticamente, dos cosas son iguales entre sí. Cuando la gente de ciencia no se da cuenta de que el número en la computadora está limitado por la CPU. En una computadora de 64 bits, el número más alto que puede obtener es 18,446,744,073,709,551,616. Entonces, si el número es mayor que ese número, se desborda.

Digamos

(bajo + alto) / 2 -> Versión 1

bajo + (alto – bajo) / 2 -> Versión 2

En la versión 1, está agregando más de lo que necesita. Piénselo de esta manera, digamos que tiene dos cuerdas, y está logrando la mitad de ellas al unir dos cuerdas juntas y luego cortarlas después de eso, lo que aún es correcto. Pero, si hace esto en la computadora, y si el número es demasiado grande, se desbordará como dije antes. Dependiendo de la implementación, puede obtener resultados diferentes (algunos pueden obtener un número negativo, otros pueden obtener un número máximo). Por ejemplo en Java,

int bajo = 1170105034
int high = 1347855270
(bajo + alto) / 2 // salidas -888503496
bajo + (alto – bajo) / 2 // salidas 1258980152

Pero lo que realmente tiene que hacer es saber cuánto más se va a comparar la media a baja, en este caso es (alta – baja) / 2 más, lo que da como resultado la versión 2. Pero, de nuevo, todavía puede obtener un desbordamiento en la versión 2, pero es mejor que la versión 1 porque es más probable que la versión 1 se desborde aunque la versión 2 no lo haga en algunos casos de gran número.

Se utiliza principalmente para evitar el desbordamiento. Considere un ejemplo donde el tipo de datos de bajo y alto es entero. Entonces, entero tiene un rango superior de 65535 si es un entero sin signo. Ahora considere el valor de bajo como 1000 y alto como 65000. Ahora si calcula el medio como (bajo + alto) / 2, le dará un resultado incorrecto debido al desbordamiento del tipo de datos enteros. Ahora, si calcula mid como low + (high-low) / 2, obtendrá un resultado correcto. Por lo tanto, para evitar el desbordamiento, la segunda forma es mucho mejor que el primer método de cálculo medio. Espero que entiendas mi punto.

Como mid es una instancia de tipo numérico, tiene un límite superior en el valor que puede contener. Es posible que la suma de bajo y alto pueda exceder este valor máximo, lo que lleva a un desbordamiento y resultados impredecibles. Esto puede ocurrir incluso si bajo y alto son valores legales (es decir, positivo y alto> = bajo).

La expresión mid = low + (high – low) / 2 nunca se desbordará para valores legales de high y low y siempre dará el resultado deseado.

Esta técnica se usa para evitar el desbordamiento de enteros
encontrarás detalles aquí
Cálculo medio en búsqueda binaria