¿Cuáles son algunas aplicaciones inteligentes de búsqueda binaria?

Ejemplos de desarrollo de software:

  • depuración de una pieza de código algo lineal. Si el código tiene muchos pasos ejecutados principalmente en una secuencia y hay un error, puede aislar el error al encontrar el primer paso donde el código produce resultados que son diferentes de los esperados.
  • cherry eligiendo un cambio de código incorrecto de un candidato de lanzamiento. Al impulsar un lanzamiento de código grande en producción, a veces se encuentra que hay un problema con ese binario. Si revertir todo el lanzamiento no fuera una opción, el ingeniero de lanzamiento buscaría binariamente a través de los identificadores de cambio de código. Él descubriría el primer cambio de código que crea el error.
  • averiguar los requisitos de recursos para un sistema grande. uno podría intentar ejecutar pruebas de carga en el sistema y buscar en binario la cantidad mínima de CPU requerida para manejar una carga prevista. (este enfoque es mejor que adivinar al azar, pero mucho peor que hacer un análisis de su sistema y hacer algunas conjeturas bien fundamentadas)

Ejemplos de acertijos algorítmicos:

  1. Dado A, una matriz ordenada descubre cuántas veces ocurre x en A.
  2. Dado un número real x, descubre su raíz cúbica.
  3. Dado A una matriz ordenada con números distintos, encuentre una i tal que A [i] == i.
  4. Dadas las operaciones +, -, *, /, sqrt y un número real x, encuentre un algoritmo para obtener log_2_x.
  5. Dado un conjunto de números distintos A, de modo que A [0]> A [1] y A [n-1]> A [n-2] encuentre un mínimo local (descubra un i tal que A [i-1] > A [i] <A [i + 1]).
  6. Deje A ser una matriz ordenada con elementos distintos. A se gira k posiciones hacia la derecha (se desconoce k). Descubre k.
  7. Deje A ser una matriz ordenada con elementos distintos. A se gira k posiciones hacia la derecha (se desconoce k). Averigüe si A contiene un número x.
  8. Dadas dos matrices ordenadas de longitud ny m, descubra el elemento k de su unión ordenada.
  9. Dado A, una matriz compuesta por una secuencia creciente de números seguida inmediatamente por una secuencia decreciente. Determine si un número dado x está en la matriz.
  10. Dada una matriz de N valores int distintos en orden ascendente, determine si un entero dado está en la matriz. Puede usar solo sumas y restas y una cantidad constante de memoria adicional.
  11. El jugador A elige un número secreto n. El jugador B puede adivinar un número xy A responde cómo se compara x con n (igual, mayor, menor). ¿Cuál es una estrategia eficiente para que B adivine n?

Akinator es definitivamente uno.

Es un juego gratuito desarrollado por tres programadores franceses donde un genio te hace un montón de preguntas e intenta adivinar quién o qué estabas pensando en función de tus respuestas. Se necesita después de veinte preguntas (que también usa una variante de búsqueda binaria).

Utiliza la coincidencia de árbol para centrarse en quién o en qué estaba pensando según sus respuestas. Si siente que se ha enterado, ofrecerá su respuesta al usuario y le preguntará si es correcto. Si dice que no, lo intentará hasta dos veces más en función de otras preguntas antes de darse por vencido y pedirle que ingrese la respuesta para que pueda agregarla a la base de datos.

Elimina las opciones (que pueden no ser exactamente la mitad del espacio de la solución, a diferencia de la búsqueda binaria tradicional) con cada respuesta, centra la atención en una región particular del espacio de la solución y continúa haciéndolo hasta que se concentra. Llega hasta 40 preguntas. teóricamente puede identificar 2 ^ 40 personas. A partir de esto, probablemente pueda decir que no es probable que salga mal a menos que la respuesta no esté en su base de datos, o que el usuario no conozca su propio personaje de elección lo suficientemente bien. ¡Allí, la magia está volada!

Uno puede desarrollar varios juegos ingeniosos como este usando el concepto de búsqueda binaria.

NOTA: No puede engañarlo respondiendo repetidamente “Sí” o “No” o “No estoy seguro”, y si está pensando en usted o en un miembro de su familia, ¡también lo captará! Incluso adivinó “resfriado común” al mostrar el virus que lo causa cuando un amigo intentó engañarlo usando eso. Bastante hábil, incluso si sabes lo que está pasando.

Por cierto, algunos de sus datos pueden estar desactualizados. Han pasado dos años desde que Juan Mata se unió al Chelsea desde Valencia y todavía espera un “No” como respuesta cuando le pregunta si ha vivido en más de un país. Supongo que los creadores no estaban preparados para el duro trabajo de actualización.

Pruébalo:
Akinator, el genio web

La búsqueda binaria puede ser útil para encontrar valores específicos en ciertas funciones continuas.

Por ejemplo, ¿qué es [math] \ sqrt {67} [/ math]? Una manera simple de hacer esto es hacer una búsqueda binaria de dos etapas:

  1. Aproximadamente un límite inferior / superior
    Repetidamente potencias cuadradas de 2 hasta que encuentre un valor al menos tan grande como 67. En este caso, [matemática] 8 ^ 2 = 64 [/ matemática] y [matemática] 9 ^ 2 = 81 [/ matemática], entonces [matemática ] \ sqrt {67} [/ math] está entre 8 y 9. Esto está garantizado en tiempo logarítmico.
  2. Búsqueda binaria entre los límites.
    Ahora simplemente haga una búsqueda binaria entre los límites. Para ciertos valores, nunca alcanzará la raíz real, pero al establecer un margen de error aceptable, encontrará la raíz cuadrada en muy poco tiempo.

Aunque hay mejores formas de encontrar raíces cuadradas, este método funciona para todas las funciones monótonas, lo cual es bastante bueno.

Ahora, ¿qué pasa con las funciones con máximos / mínimos locales (como una parábola)? Sorprendentemente, la búsqueda binaria, cuando se usa de una manera inteligente, también puede hacer el truco. Todo lo que necesita es establecer primero el límite inferior / superior para este punto. Aquí está el algoritmo (para encontrar un máximo):

  1. Consulta los puntos 1/3 y 2/3 en el camino entre los límites
    Si el punto 1/3 es menor que el punto 2/3, entonces sabemos que el máximo debe estar a la derecha del punto 1/3. De lo contrario, el máximo está a la izquierda del punto 2/3.
  2. Si el punto 1/3 es menor que el punto 2/3, mueva el límite inferior al punto 2/3
    Los otros casos son similares.
  3. Deténgase una vez que los límites inferior y superior estén suficientemente juntos

Este algoritmo se conoce comúnmente como una “búsqueda ternaria”, que (en mi opinión) es una extensión muy inteligente de la búsqueda binaria.

git bisect
para descubrir el mal compromiso.

Dibujar curvas cuadráticas de Bézier.