Búsqueda Binaria encuentra un elemento en un arreglo ordenado en O(log n) dividiendo el espacio de búsqueda por la mitad en cada paso. Es el algoritmo de búsqueda estándar para arreglos ordenados.
Funciona manteniendo dos punteros (low y high) que delimitan la región donde el target puede existir. En cada iteración, compara el target con el elemento central y descarta la mitad que no lo contiene.
Cómo Funciona
- Inicializa:
low = 0,high = n(intervalo[low, high)). - Calcula
mid = low + (high - low) / 2(evita overflow). - Compara
arr[mid]con el target:- “Si
arr[mid] == target: encontrado.” - “Si
arr[mid] < target: descarta la mitad izquierda,low = mid + 1.” - “Si
arr[mid] > target: descarta la mitad derecha,high = mid.”
- “Si
- Repite hasta que
low >= high(no encontrado).
Idea Clave
El loop invariante es que el target siempre está en el intervalo [low, high) si existe. Cada comparación reduce el intervalo a la mitad, dando log₂ n iteraciones máximo. Por eso necesita el arreglo ordenado: sin orden, no puedes descartar la mitad.
El cálculo de mid es sutil: low + (high - low) / 2 evita overflow cuando low y high son grandes, a diferencia de (low + high) / 2.
Ejemplo Trabajado
Busca target = 7 en [1, 3, 5, 7, 9, 11, 13]:
Iteración 1: low=0, high=7, mid=3
arr[3] = 7== target → encontrado en índice 3
Busca target = 6 en el mismo arreglo:
Iteración 1: low=0, high=7, mid=3
arr[3] = 7> 6 → descarta derecha,high = 3
Iteración 2: low=0, high=3, mid=1
arr[1] = 3< 6 → descarta izquierda,low = 2
Iteración 3: low=2, high=3, mid=2
arr[2] = 5< 6 → descarta izquierda,low = 3
Iteración 4: low=3, high=3 → low >= high → no encontrado
Observa el visualizador mostrar la región de búsqueda encogiendo.
Casos Extremos y Trampas
- Arreglo no ordenado — Búsqueda Binaria retorna resultados incorrectos sin advertencia.
- Duplicados —
binary_searchestándar retorna cualquier ocurrencia. Para el primer/último índice, usa varianteslower_bound/upper_bound. - Overflow en
mid— usalow + (high - low) / 2, no(low + high) / 2. - Intervalo vacío —
low >= highsignifica no encontrado; no olvides esta condición de parada.
Variantes Comunes
| Variante | Qué retorna | Cuándo usar |
|---|---|---|
binary_search | Cualquier ocurrencia | Solo existencia |
lower_bound | Primer índice ≥ target | Rango de valores |
upper_bound | Primer índice > target | Rango exclusivo |
equal_range | [lower, upper) | Rango completo de duplicados |
Aplicaciones
- Búsqueda en arreglos ordenados — arrays, listas estáticas
- “Lower/upper bound — APIs de C++
std::lower_bound, JavaCollections.binarySearch” - Optimización — muchas soluciones de programación competitiva usan binary search en la respuesta
- Debugging — buscar en logs ordenados por timestamp
Trayectoria de Práctica
- Implementa Búsqueda Binaria iterativa; prueba en arreglo par e impar.
- Modifica para retornar el primer índice donde
arr[i] >= target(lower_bound). - Prueba con todos los elementos iguales:
[5, 5, 5, 5, 5]buscando 5. - Explica por qué
low + (high - low) / 2es seguro paralow=2^30, high=2^30+1. - Extiende a búsqueda en floating-point: encuentra la raíz cuadrada de
xcon precisión1e-6.