¿Existe algún estudio o teoría detrás de combinar la búsqueda binaria y la búsqueda de interpolación?

14

Acabo de leer ¿Puede este algoritmo seguir considerándose un algoritmo de búsqueda binaria? y recordé que hace unos años escribí un indexador / búsqueda de archivos de registro para encontrar entradas de registro en grandes archivos de texto sin formato por ventana de fecha / hora.

Mientras hacía esto, decidí probar la búsqueda de interpolación (no sabía cómo se llamaba, me tropecé con la idea por mí mismo). Luego, por alguna razón, continué con la idea de alternar los pasos de interpolación con los pasos binarios divididos: en el paso 0, interpolaría para decidir el punto de prueba, luego, en el paso 1, tomaría el punto medio exacto, etc.

Luego comparé el sistema con la búsqueda de interpolación pura, la búsqueda binaria pura y mi intento de combinación. El enfoque alternativo fue un claro ganador, tanto en tiempo como en número de pruebas requeridas antes de encontrar un conjunto de tiempos elegidos al azar.

Inspirado por la pregunta vinculada, hice una búsqueda rápida de "búsqueda de interpolación alterna y búsqueda binaria" y no encontré nada. También probé la "búsqueda de interpolación cubierta" como se sugiere en mi comentario sobre una de las respuestas.

¿Me he tropezado con algo conocido? ¿Existe alguna justificación teórica para que sea más rápido para ciertos tipos de datos? Los archivos de registro eran generalmente grandes para la época (por ejemplo, 1-2 GB de texto con quizás 10 millones de filas para buscar), y la propagación de fechas / horas en ellos era compleja con fuertes estallidos de actividad, horas pico generales y tiempos de silencio. Mis pruebas de referencia tomaron muestras de una distribución uniforme de tiempos objetivo para encontrar.

Neil Slater
fuente

Respuestas:

5

¿Me he tropezado con algo conocido?

Existen varios métodos, basados ​​en una combinación de búsqueda de interpolación y búsqueda binaria, con un tiempo promedio de acceso al caso (distribución uniforme) y O ( l o g n ) peor tiempo del caso (valores desigualmente distribuida):O(losol losol norte)O(losol norte)

  • La búsqueda introspectiva es su método (iteración entre una búsqueda de interpolación y una búsqueda binaria). No tengo más detalles.
  • Interpolación-búsqueda binaria (SII) por N. Santoro, JB Sidney (1985).

    La idea general es que la búsqueda de interpolación es útil solo cuando la matriz buscada es mayor que un umbral dado. Cuando el segmento de búsqueda considerado es más pequeño que un umbral definido por el usuario, la búsqueda binaria se aplica incondicionalmente. Viceversa, sobre ese umbral, se aplica un paso de búsqueda de interpolación, seguido finalmente por un paso de búsqueda binaria.

    Esto tiene muchos puntos en común con su enfoque.

  • Búsqueda adaptativa (AS) por Biagio Bonasera, Emilio Ferrara, Giacomo Fiumara, Francesco Pagano, Alessandro Provetti

    Usando las palabras de los autores:

    [Interpolation-binary search] ideó una solución similar que combina (pero no combina) la interpolación y la búsqueda binaria. Aunque la complejidad asintótica es la misma, existen algunas diferencias marcadas.

    [CORTAR]

    Por lo tanto, es posible mostrar que para cualquier entrada AS no tomará más operaciones elementales que IBS.

    El algoritmo puede gastar hasta el doble de operaciones que la búsqueda de interpolación "simple" para encontrar cuidadosamente la mejor reducción a la mitad del segmento de búsqueda, lo que a su vez significará que se necesitarán menos iteraciones para completar (pero tiene una sobrecarga aún mayor) .

manlio
fuente
6

Intercalar dos algoritmos para obtener lo mejor de ambos mundos es una técnica conocida, aunque generalmente se dice que los ejecuta en "paralelo" y devuelve una respuesta tan pronto como termina.

Aunque teóricamente más rápido, la búsqueda de interpolación tiene dos desventajas en comparación con la búsqueda binaria:

  • Tiene un rendimiento terrible (lineal) en el peor de los casos

  • La sobrecarga de calcular el punto medio es bastante grande; una iteración de búsqueda binaria es cientos de veces más rápida que una búsqueda de interpolación

Esperaría que un enfoque en el que realice una búsqueda de interpolación mientras el rango es grande y cambie a búsqueda binaria cuando el rango se vuelve pequeño es el más eficiente. Sería bueno si pudieras probar este experimento.

Iniciar sesiónnorteIniciar sesiónIniciar sesiónnorteIniciar sesiónnorteIniciar sesiónIniciar sesiónnorte

Creo que sus resultados pueden explicarse por dos fenómenos:

  • La combinación con la búsqueda binaria le permite evitar el peor comportamiento

  • El efecto positivo de cambiar a búsqueda binaria en un pequeño conjunto de datos

Tom van der Zanden
fuente
3
Usted escribió: "una iteración de búsqueda binaria es cientos de veces más rápida que una de interpolación". Tenga en cuenta que, en el caso de OP, la diferencia entre calcular el punto medio en esos dos métodos se ve reducida por el tiempo de E / S necesario para recuperar el valor del punto medio.
liori
@liori: Las primeras iteraciones de búsquedas binarias repetidas en los mismos datos podrían ser más amigables con la caché, porque se usan los mismos pocos elementos. Por lo tanto, se puede esperar que los trimestres y quizás los octavos se mantengan calientes en caché. Comenzar con binario y cambiar a interpolado después de tres iteraciones podría tener sentido, si los rangos son lo suficientemente grandes. (O si puede hacer E / S asíncrona y usar el resultado que llegue primero).
Peter Cordes
Además, incluso para una búsqueda en memoria, una pérdida de caché (más de 200 ciclos de latencia) tiene un par de veces la latencia de incluso una división entera de 64 bits (32-96 ciclos), en Intel Haswell, por ejemplo . La división de enteros de 32 bits es significativamente más rápida (22-29 ciclos). El ancho de banda de la memoria principal es un recurso compartido para todos los núcleos, pero la división de enteros solo usa recursos duplicados en cada núcleo.
Peter Cordes
2
Sin embargo, la latencia de la memoria es mucho peor que el ancho de banda de la memoria, ya que incluso los accesos dispersos múltiples son más rápidos si están en vuelo a la vez. Es una victoria obtener previamente (con prefetcht0instrucciones ) ambas posibilidades para la iteración NEXT antes de cargar el punto medio actual, para una búsqueda en memoria en el hardware moderno x86. No puede hacer eso si no puede predecir las próximas direcciones de búsqueda con anticipación. Por lo tanto, los detalles prácticos de implementación pueden ser significativos, aparte de las consideraciones teóricas .
Peter Cordes
@liori: Definitivamente, la E / S por punto medio fue el factor principal al indexar un archivo de registro, ya que se leía a pedido para encontrar registros. Probablemente hubo más de dos órdenes de magnitud entre el cálculo del desplazamiento en el archivo y la lectura de un bloque; por lo tanto, el número decisivo calculado sería el factor decisivo. Creo que si repito ahora sin un archivo de registro para indexar, algo que intentaré publicar aquí, es posible que no haya una diferencia de velocidad medible, pero puede haber una diferencia medible de "número de puntos medios necesarios".
Neil Slater