¿Por qué start + (end – start)/2 es el método preferible para calcular el medio de una array sobre (start + end)/2?

Estoy muy seguro de que todos pueden encontrar el índice medio de la array una vez que conocen el índice de inicio y el índice final de la array, pero hay ciertos beneficios de usar start + (end – start)/2 over (start + end)/2 , que se describen a continuación:

La primera forma de encontrar el índice medio es 

mid = (start + end)/2

Pero hay un problema con este enfoque, ¿y si el valor de inicio o final o ambos es INT_MAX , causará un desbordamiento de enteros?
La mejor manera de calcular el índice medio es: 

mid = start + (end - start)/2

Probemos estos dos métodos en el programa C:  

C

// program for calculating mid of array
#include <stdio.h>
#include <limits.h>
int main()
{
    int start = INT_MAX, end = INT_MAX;
    printf("start = %dn", start);
    printf("end = %dn", end);
 
    // method 1
    int mid1 = (start + end) / 2;
    printf("mid using (start + end)/2 = %dn", mid1);
 
    // method 2
    int mid2 = start + (end - start) / 2;
    printf("mid using start + (end - start)/2 = %dn", mid2);
    return 0;
}

Producción: 

start = 2147483647
end = 2147483647
mid using (start + end)/2 = -1
mid using start + (end - start)/2 = 2147483647

Nota: (fin – inicio) puede desbordarse si final < 0 o inicio < 0
Si ve el resultado, al usar el segundo método obtiene el resultado correcto y el primer método no calcula la mitad y si usa este índice (-1 en este caso ) , puede causar una falla de segmentación debido a un índice de array no válido.

start + (end – start)/2 también funciona incluso si está utilizando punteros: 

Ejemplo: 
Método 1  

C

int s = 2, e = 3;
int* start = &s;
int* end = &e;
int* mid = (start + end) / 2;

Producción : 

error: invalid operands of types ‘int*’ and ‘int*’ to binary ‘operator+’
     int *mid = (start + end)/2;

Método 2  

C

int s = 2, e = 3;
int* start = &s;
int* end = &e;
int* mid = start + (end - start) / 2;

Producción : 

It will compile and give expected results

Explicación: la suma de punteros no se admite en C, mientras que la resta de punteros sí se admite, ya que el resultado de la resta es la diferencia (en elementos de array) entre los operandos. La expresión de resta produce un resultado integral con signo de tipo ptrdiff_t (definido en el archivo de inclusión estándar STDDEF.H) (en resumen, la resta da la distancia de memoria) , pero la suma de dos punteros no tiene sentido, por eso no es compatible.

Referencias: 
1) Operadores aditivos: + y – 
2) por qué-preferir-inicio-fin-inicio-2-sobre-inicio-fin-2-al-calcular-el 
3) apuntador-suma-vs-resta

Este artículo es una contribución de Mandeep Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *