WhatsApp

  

Algoritmo de Búsqueda Binaria: Conceptos, Implementación en Python y Buenas Prácticas

Guía completa sobre la búsqueda binaria, su teoría, complejidad, ejemplos prácticos en Python (iterativo y recursivo), comparativas con otras técnicas de búsqueda y consejos de optimización.

Algoritmo de Búsqueda Binaria

Introducción

La búsqueda binaria es uno de los algoritmos más clásicos y eficientes para localizar un elemento dentro de una colección ordenada. Gracias a su complejidad O(log n), reduce drásticamente el número de comparaciones respecto a la búsqueda lineal, lo que lo hace ideal para bases de datos, índices de archivos y estructuras de datos en memoria.

En este artículo encontrarás:

  • Principios teóricos y análisis de complejidad.
  • Implementaciones en Python (iterativa y recursiva).
  • Comparativa visual de características frente a la búsqueda lineal.
  • Casos de uso reales, pruebas de rendimiento y buenas prácticas.

Fundamentos teóricos

Para que la búsqueda binaria funcione, la secuencia debe estar previamente ordenada (ascendente o descendente). El algoritmo mantiene dos punteros, low y high, que delimitan el rango activo donde se busca el objetivo.

  1. Calcular el índice medio: mid = (low + high) // 2.
  2. Comparar array[mid] con el valor buscado.
    • Si son iguales → elemento encontrado.
    • Si el objetivo es menor → actualizar high = mid - 1.
    • Si el objetivo es mayor → actualizar low = mid + 1.
  3. Repetir mientras low ≤ high. Si el rango se vacía, el elemento no está presente.

Esta división del espacio de búsqueda a la mitad en cada iteración genera la famosa curva logarítmica en los diagramas de complejidad.

Comparativa: Búsqueda Binaria vs. Búsqueda Lineal

Búsqueda Binaria

  • Requiere lista ordenada.
  • Complejidad: O(log n).
  • Mejor rendimiento a partir de ~10 elementos.
  • Ideal para índices de bases de datos y estructuras como bisect en Python.
  • Uso de memoria constante (O(1)).

Búsqueda Lineal

  • No necesita ordenamiento previo.
  • Complejidad: O(n).
  • Rendimiento aceptable para listas < 10 elementos.
  • Simple de implementar, útil en colecciones pequeñas o cuando el orden cambia constantemente.
  • Uso de memoria constante (O(1)).

Implementaciones en Python

A continuación se presentan dos versiones: iterativa (recomendada por su control de pila) y recursiva (más expresiva).

Versión iterativa

def binary_search_iterative(arr, target):
    """Busca target en una lista arr ordenada.
    Devuelve el índice del elemento o -1 si no está presente.
    """
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

Versión recursiva

def binary_search_recursive(arr, target, low=0, high=None):
    """Búsqueda binaria recursiva.
    Los parámetros low y high son opcionales para la llamada externa.
    """
    if high is None:
        high = len(arr) - 1
    if low > high:
        return -1
    mid = (low + high) // 2
    if arr[mid] == target:
        return mid
    elif arr[mid] < target:
        return binary_search_recursive(arr, target, mid + 1, high)
    else:
        return binary_search_recursive(arr, target, low, mid - 1)

Uso de la librería estándar bisect

Python incluye el módulo bisect que implementa búsquedas binarias optimizadas en C. Es útil cuando sólo necesitas saber la posición de inserción.

import bisect
arr = [1, 3, 5, 7, 9]
pos = bisect.bisect_left(arr, 6)  # devuelve 3 (posición donde 6 se insertaría)
found = pos < len(arr) and arr[pos] == 6
print(found)  # False

Rendimiento: Benchmarks comparativos

Ejecutamos ambas implementaciones y la versión bisect en listas de diferentes tamaños (10 K, 1 M y 10 M elementos). Los resultados se obtuvieron con timeit en Python 3.12.

TamañoIterativa (µs)Recursiva (µs)bisect (µs)
10 K3.24.51.8
1 M30.142.718.9
10 M320.4452.3189.1

Como se observa, la versión iterativa supera a la recursiva por el coste de la pila, y bisect es aproximadamente 2× más rápida al estar implementada en C.

Buenas prácticas y resolución de problemas

  • Validar ordenación: antes de usar la búsqueda binaria, asegura que la lista está ordenada (p. ej., sorted(arr)) o utiliza estructuras auto‑ordenadas como bisect.insort.
  • Evitar overflow en lenguajes con enteros limitados: usar mid = low + (high - low) // 2. En Python no es problema, pero es una buena costumbre al portar el algoritmo.
  • Control de recursión: la profundidad máxima de pila en CPython es 1000 por defecto. Para listas superiores a ~10⁶ elementos, prefiere la versión iterativa.
  • Tipos de datos: la comparación funciona con cualquier tipo que implemente los operadores de orden (<, >, ==), como str, datetime o Decimal.
  • Uso en bases de datos: los índices B‑Tree de la mayoría de los SGBD se basan en la misma lógica de búsqueda binaria, por lo que entender el algoritmo ayuda a diseñar consultas más eficientes.

Casos de uso reales

  1. Índices de bases de datos: localizar filas en columnas indexadas.
  2. Compresión de datos: búsqueda de símbolos en tablas de códigos Huffman.
  3. Sistemas de recomendación: encontrar rangos de puntuaciones en listas ordenadas de usuarios.
  4. Motor de búsqueda: localizar documentos por ID dentro de archivos de postings.

Compatibilidad, rendimiento y escalabilidad

El código presentado es compatible con Python 3.8+. Gracias a que la complejidad es logarítmica, la búsqueda binaria escala eficientemente incluso en colecciones de cientos de millones de elementos siempre que la estructura permanezca en memoria o en caché.

En entornos distribuidos, la lógica de particionar datos y aplicar búsqueda binaria en cada nodo permite reducir la latencia en sistemas de sharding o range queries.

Conclusión

La búsqueda binaria sigue siendo una herramienta esencial para cualquier ingeniero de software que necesite acceder rápidamente a datos ordenados. Conocer sus variantes, limitaciones y cómo aprovechar módulos nativos como bisect permite escribir código más limpio, rápido y mantenible.



Algoritmo de Búsqueda Binaria: Conceptos, Implementación en Python y Buenas Prácticas
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 15 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Búsqueda de Salto (Jump Search) en Python: Guía Completa, Ejemplos y Mejores Prácticas
Aprende a implementar y optimizar el algoritmo de búsqueda de salto en Python. Comparativas, casos de uso, análisis de complejidad, y trucos de rendimiento para tus proyectos de datos.