Al escribir un código hoy, me he encontrado con una circunstancia que me ha llevado a escribir una búsqueda binaria de una clase que nunca había visto antes. ¿Esta búsqueda binaria tiene un nombre, y es realmente una búsqueda "binaria"?¿Hay un nombre para este tipo de búsqueda binaria?
motivación
En primer lugar, con el fin de hacer la búsqueda más fácil de entender, voy a explicar el caso de uso que dio lugar a su creación.
Supongamos que tiene una lista de números pedidos. Se le pide que encuentre el índice del número en la lista más cercana a x.
int findIndexClosestTo(int x);
Las llamadas a findIndexClosestTo()
siempre seguir esta regla:
Si el último resultado de
findIndexClosestTo()
erai
, a continuación, los índices más cerca dei
tienen mayor probabilidad de ser el resultado de la llamada actual afindIndexClosestTo()
.
En otras palabras, es más probable que el índice que necesitamos encontrar esta vez sea más cercano al último encontrado que alejado de él.
Por ejemplo, imagine un niño simulado que camina hacia la izquierda y hacia la derecha en la pantalla. Si a menudo estamos consultando el índice de la ubicación del niño, es probable que esté cerca del último lugar donde lo encontramos.
Algoritmo
Dado el caso anterior, sabemos que el último resultado de findIndexClosestTo()
era i
(si ésta es realmente la primera vez que la función se ha llamado, i
por defecto el índice medio de la lista, por simplicidad, aunque una búsqueda binaria separada para encontrar el resultado de la primera llamada en realidad sería más rápida), y la función ha sido llamada nuevamente. Teniendo en cuenta el nuevo número x
, seguimos este algoritmo para encontrar su índice:
interval = 1;
- es el número que estamos buscando,
x
, posicionada eni
? Si es así, devuelvai
; - De lo contrario, determine si
x
está por encima o por debajo dei
. (Recuerde, la lista está ordenada.) - Mueva
interval
índices en la dirección dex
. - Si hemos encontrado
x
en nuestra nueva ubicación, devolvemos esa ubicación. - Doble
interval
. (Es decirinterval *= 2
) - Si hemos pasado
x
, volverinterval
índices, establezcainterval = 1
, vaya a 4.
Teniendo en cuenta la regla de probabilidad se ha dicho (bajo el encabezado de motivación), esto parece a mí ser la forma más eficiente de encontrar el índice correcto. ¿Conoces una manera más rápida?
Supongo que esto es realmente una matriz y no una lista? Porque la búsqueda binaria en una lista sería estúpida. – Nemo
Supongo que la mejor respuesta dependerá de exactamente cuál es la distribución de probabilidad para la posición basada en i. por ejemplo, si hay un 99% de probabilidad de que esté dentro de 3 de i, una respuesta muy diferente será útil en comparación con si solo tiene un 0.001% más de probabilidad de estar en i que en cualquier otro lugar. Creo que la respuesta óptima sería una distribución basada en la probabilidad, de modo que la búsqueda binaria elija un punto que ofrezca un 50% de posibilidades de que el elemento deseado esté en cada lado. Entonces, si puede definir la curva de probabilidad, probablemente pueda definir un algoritmo bastante bueno. – Chris
@Chris muy buen punto. Si todos los puntos de datos fueran casi iguales en probabilidad, esto probablemente sería peor que una búsqueda binaria regular. En mi caso, la probabilidad parece decaer exponencialmente cuanto más se obtiene desde el último punto, en cuyo caso, creo que esta búsqueda es más rápida. –