¿Puede este algoritmo seguir considerándose un algoritmo de búsqueda binaria?

14

Mientras hago el segundo código kata (que le pide que implemente un algoritmo de búsqueda binaria cinco veces, cada vez con un método diferente), he encontrado una solución ligeramente diferente que funciona de la siguiente manera:

Si tengo un conjunto ordenado de longitud 100 y veo que su campo inicial contiene el número 200 y su campo final contiene el número 400, yo, como matemático que estudia a humanos, probablemente comenzaría a buscar alrededor del campo 35 si estuviera buscando el número 270, y no el campo 50 como en un algoritmo de búsqueda binaria normal.

Entonces, si el número en el campo 35 de la matriz es 270, 35 es el índice que estaba buscando.

Si ese no es el caso, puedo comparar el número que obtuve (digamos 280) y repetir la operación tomando la parte inferior de la matriz (entonces tengo 35 campos con el campo inicial que contiene 200 y el campo final que contiene 280) si el el número que encontré es mayor que el que estoy buscando, o la parte superior de la matriz (digamos que obtuve 260: ahora tengo 65 índices, el primero contiene 260 y el último contiene 400. Orientativamente, me dirigiría hacia el revés índice 4 de esta matriz secundaria, que es el índice 39 de toda la matriz) si el número que obtuve es menor que el número que estoy buscando.

La pregunta es: ¿puede este algoritmo considerarse un algoritmo de búsqueda binaria? Si no, ¿tiene su propio nombre?

usuario6245072
fuente
2
Si es una búsqueda binaria o no, parece ser puramente una cuestión de opinión. Esencialmente, la única respuesta que puede dar es "Sí, está lo suficientemente cerca de la búsqueda binaria como para llamarla búsqueda binaria" o "No, no lo es". El argumento se produce.
David Richerby

Respuestas:

23

No llamaría a esto una búsqueda binaria.

Es claramente similar a la búsqueda binaria y es natural verlo como un refinamiento de la búsqueda binaria. Sin embargo, tiene características de complejidad de algoritmo significativamente diferentes, la búsqueda de interpolación ha esperado un tiempo de ejecución de O (log (log (n)) suponiendo que los datos se distribuyen uniformemente, sin embargo, paga esto teniendo O (n) el peor tiempo de ejecución.

Prefiero decir "El peor tiempo de ejecución de la búsqueda binaria es O (log (n))" en lugar de "Dependiendo de la elección de los elementos delimitadores, el peor tiempo de ejecución de la búsqueda binaria es O (log (n))". Esto significa que no puedo clasificar la búsqueda de interpolación como un algoritmo de búsqueda binaria.

Taemyr
fuente
Presumiblemente, si sale de la búsqueda de interpolación cuando va mal, puede retener O (log n) en el peor de los casos y O (log log n) en datos suficientemente lineales. Mi conjetura es que algo como "si no he encontrado el objetivo después de iniciar sesión y luego intentar cambiar a búsqueda binaria" funcionará, pero soy demasiado vago para probarlo. Por supuesto, habrá una clase de entradas asesinas en las que esto lleva básicamente el doble de tiempo que una búsqueda binaria.
Steve Jessop
Esa idea de entrada asesina es interesante. ¿Qué pasa si en lugar de permitir que las entradas asesinas afecten negativamente la búsqueda (es decir, al dividir cerca del final de una matriz) limitamos / recortamos el "rango divisible" al segundo tercio de la matriz o similar. Eso tendría un peor caso log3 (n) pero aún así disfrutaría de un mejor registro (log).
Andrew Gallasch
1
@SteveJessop Recuerde que la complejidad asimétrica no es la imagen completa. O (log n) es muy rápido. Además, la búsqueda binaria hace muy poco trabajo en cada ciclo. Entonces, el problema para la búsqueda de interpolación es que necesitas una entrada muy larga para compensar el hecho de que trabajas más en cada ciclo. Su sugerencia agrega más trabajo a eso. Si no pude aceptar O (n) para datos que no eran uniformes, sospecho que la mejor solución es realizar una búsqueda binaria pura, en lugar de un enfoque híbrido.
Taemyr
@SteveJessop: no es necesario cambiar los algoritmos; Esto se puede hacer en paralelo. Dado un rango R, puede determinar el punto P1 como el punto medio habitual para la búsqueda binaria, y P2 utilizando la interpolación. Ahora tiene tres subranges, ninguno de los cuales puede ser mayor que la mitad del rango original. Comprueba el valor objetivo con P1 y P2, y sabes en cuál de las tres subranges se
repetirá
17

O(loglogn)

Tom van der Zanden
fuente
Frio. Ahora la pregunta es si puedo usarlo para el código kata, pero es mi problema jajaja. Sin embargo, me resulta más complicado que la búsqueda binaria, así que ¿por qué no?
user6245072
Descubrí esto una vez cuando escribía código para indexar un archivo de registro hace unos años. También descubrí que para mis datos, alternar los pasos entre la interpolación y el corte binario era mejor que cualquiera de las opciones por sí solo. No estoy seguro de si eso tiene un nombre o es un efecto conocido.
Neil Slater
¿La búsqueda de interpolación cubierta @NeilSlater quizás?
Steve Cox
@SteveCox: acabo de buscar ese término y no encontré nada. Decidí hacer eso como una nueva pregunta: cs.stackexchange.com/questions/59750/…
Neil Slater
-1

Creo que la terminología correcta sería una búsqueda psicotómica analizada.

Usted busca en una matriz plana con una búsqueda ponderada posterior basada en la supuesta distribución plana de los números que contiene.

Esto corresponde a cómo una persona buscaría una palabra en un diccionario. Pero puede ser muy ineficiente si la distribución de datos es irregular.

Ludovic Zenohate Lagouardette
fuente