Estructuras de Datos y Algoritmos · Programación

Búsqueda binaria e invariante

Implementar búsqueda binaria sobre datos ordenados en O(log n) y razonar su corrección con un invariante de rango, evitando errores de límites.

Búsqueda binaria e invariante

Diagrama de estructuras de datos: arbol binario, lista enlazada y tabla hash.
Estructuras de datos fundamentales y analisis de complejidad algoritmica.

Mapa conceptual

Descartar la mitad cada vez Buscar en un diccionario ordenado hojeando hoja a hoja es O(n). La búsqueda binaria pregunta por la mitad y descarta la otra: O(log n). Su trampa son los límites del rango; su salvación es el invariante.

La idea

Sobre un arreglo ORDENADO, se compara con el elemento del medio. Si el buscado es menor, todo el lado derecho queda descartado; si es mayor, el izquierdo. Se repite sobre el rango restante, que se reduce a la mitad en cada paso: log₂ n pasos para n elementos.

El invariante

La corrección se demuestra con un invariante: «si el valor existe, está dentro del rango [lo, hi]». Se cumple al inicio (el arreglo entero) y cada paso lo preserva: descartamos solo elementos que ya sabemos que no pueden ser la solución. Cuando el rango se vacía, el valor no existe.

[Comparaciones en el peor caso]

Esta actividad interactiva ('Grafico interactivo') requiere el motor completo de Lumbre. El contenido estatico se muestra arriba; para la experiencia interactiva, visita la version online de este objeto.

Cuidado con el medio

El índice medio se calcula como lo + (hi − lo)//2, NO como (lo + hi)//2, para evitar desbordamiento de entero en lenguajes de tamaño fijo. Es un error famoso: el código de Java de la biblioteca estándar lo tuvo durante años.

Casi todos los bugs de búsqueda binaria son de límites, no de lógica.
ElementoRol en el invarianteError típico
loextremo inferior vivoolvidar que está incluido
hiextremo superior vivomezclar rangos cerrados y abiertos
midla comparaciónusar (lo+hi)//2 con overflow
retornoposición o no-existeconfundir no encontrado con índice 0

¿Qué debe cumplirse para poder aplicar búsqueda binaria?

Más allá de «encontrar»

La búsqueda binaria resuelve una clase amplia: buscar la primera posición que cumple una condición monótona (bisecar una función, encontrar dónde insertar, contar elementos menores). En todos, el motor es el mismo invariante sobre un rango.

Versiones y rangos

El costo de log n

Para un millón de elementos, log₂ es unos 20 pasos. Para mil millones, 30. La búsqueda binaria hace que crecer mil veces apenas cueste algunos pasos más: por eso escala tan bien.

La búsqueda binaria funciona sobre una lista enlazada ordenada con costo O(log n).

Errores frecuentes

Ordena los pasos de la búsqueda binaria:

Inicio
Ciclo
Fin

Wikipedia
Búsqueda binaria, variantes y el problema del overflow.

Escribe el invariante de la búsqueda binaria para «primera posición cuyo valor es mayor o igual a x» (biseca a la izquierda). Explica cómo cambian lo e hi y por qué el rango se reduce sin perder la solución.

VisuAlgo
Visualizaciones animadas de estructuras de datos y algoritmos.