Tengo un bucle de búsqueda binaria que se golpea muchas veces en la ruta de ejecución.Promedio rápido sin división
Un perfilador muestra que la parte de la división de búsqueda (búsqueda del índice medio teniendo en cuenta los índices altos y bajos de la gama de búsqueda) es en realidad la parte más costosa de la búsqueda, en un factor de aproximadamente 4.
(creo) no es crítico para la búsqueda binaria eficiente encontrar el valor medio exacto, solo un valor cercano al medio que no tiene sesgo en ninguna dirección.
¿Hay algún algoritmo que alterne poco para reemplazar mid = (low + high)/2
con algo mucho más rápido?
Editar: El lenguaje es C#, pero la operación de bit equivalente es válida en cualquier idioma (aunque puede no tener ningún beneficio en el rendimiento), por lo que dejé la etiqueta C# desactivada.
¿Qué tan grandes son sus matrices? ¿Has intentado utilizar una búsqueda lineal en su lugar? –
Esto realmente no es algo que pueda ser independiente del idioma; los detalles de qué tan rápido es este tipo de operación son muy específicos de la plataforma. Es completamente posible que si se trata de un lenguaje de tipado dinámico que la división se está haciendo en matemática de punto flotante, o que se está utilizando una estructura de gran int. También se espera que en la mayoría de los lenguajes estáticos, algo como (bajo + alto)/2 se optimice automáticamente para un cambio de aritmético y un desplazamiento aritmético a la derecha. – Eclipse
"solo un valor cerca del centro que no tiene sesgo en ninguna dirección". ¿Su división de enteros no tiene 2 ya un sesgo? – Nosredna