Introducción

La búsqueda binaria es un algoritmo eficiente para encontrar un elemento en una lista ordenada. Se basa en dividir repetidamente el rango de búsqueda a la mitad hasta que el elemento deseado se encuentra o se determina que no está presente. Este método es mucho más rápido que la búsqueda lineal, especialmente para listas grandes.

Conceptos Básicos

  1. Lista Ordenada: La búsqueda binaria solo funciona en listas que están ordenadas.
  2. División y Conquista: El algoritmo divide el problema en subproblemas más pequeños y los resuelve de manera recursiva o iterativa.
  3. Complejidad Temporal: La búsqueda binaria tiene una complejidad temporal de \(O(\log n)\), donde \(n\) es el número de elementos en la lista.

Algoritmo de Búsqueda Binaria

Pseudocódigo

BúsquedaBinaria(lista, objetivo):
    inicio = 0
    fin = longitud(lista) - 1

    mientras inicio <= fin:
        medio = (inicio + fin) / 2

        si lista[medio] == objetivo:
            retornar medio
        sino si lista[medio] < objetivo:
            inicio = medio + 1
        sino:
            fin = medio - 1

    retornar -1  // Elemento no encontrado

Implementación en Python

def busqueda_binaria(lista, objetivo):
    inicio = 0
    fin = len(lista) - 1

    while inicio <= fin:
        medio = (inicio + fin) // 2

        if lista[medio] == objetivo:
            return medio
        elif lista[medio] < objetivo:
            inicio = medio + 1
        else:
            fin = medio - 1

    return -1  # Elemento no encontrado

Ejemplo

lista = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
objetivo = 7

indice = busqueda_binaria(lista, objetivo)
print(f"El elemento {objetivo} está en el índice {indice}.")

Salida:

El elemento 7 está en el índice 3.

Variantes de la Búsqueda Binaria

Búsqueda Binaria Recursiva

La búsqueda binaria también se puede implementar de manera recursiva.

Implementación en Python

def busqueda_binaria_recursiva(lista, objetivo, inicio, fin):
    if inicio > fin:
        return -1  # Elemento no encontrado

    medio = (inicio + fin) // 2

    if lista[medio] == objetivo:
        return medio
    elif lista[medio] < objetivo:
        return busqueda_binaria_recursiva(lista, objetivo, medio + 1, fin)
    else:
        return busqueda_binaria_recursiva(lista, objetivo, inicio, medio - 1)

Ejemplo

lista = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
objetivo = 7

indice = busqueda_binaria_recursiva(lista, objetivo, 0, len(lista) - 1)
print(f"El elemento {objetivo} está en el índice {indice}.")

Salida:

El elemento 7 está en el índice 3.

Búsqueda Binaria para el Primer o Último Elemento Igual

En algunos casos, la lista puede contener elementos duplicados y puede ser necesario encontrar el primer o el último elemento igual al objetivo.

Implementación en Python

def busqueda_binaria_primero(lista, objetivo):
    inicio = 0
    fin = len(lista) - 1
    resultado = -1

    while inicio <= fin:
        medio = (inicio + fin) // 2

        if lista[medio] == objetivo:
            resultado = medio
            fin = medio - 1  # Seguir buscando en la mitad izquierda
        elif lista[medio] < objetivo:
            inicio = medio + 1
        else:
            fin = medio - 1

    return resultado

def busqueda_binaria_ultimo(lista, objetivo):
    inicio = 0
    fin = len(lista) - 1
    resultado = -1

    while inicio <= fin:
        medio = (inicio + fin) // 2

        if lista[medio] == objetivo:
            resultado = medio
            inicio = medio + 1  # Seguir buscando en la mitad derecha
        elif lista[medio] < objetivo:
            inicio = medio + 1
        else:
            fin = medio - 1

    return resultado

Ejemplo

lista = [1, 3, 5, 7, 7, 7, 9, 11, 13, 15, 17, 19]
objetivo = 7

indice_primero = busqueda_binaria_primero(lista, objetivo)
indice_ultimo = busqueda_binaria_ultimo(lista, objetivo)
print(f"El primer elemento {objetivo} está en el índice {indice_primero}.")
print(f"El último elemento {objetivo} está en el índice {indice_ultimo}.")

Salida:

El primer elemento 7 está en el índice 3.
El último elemento 7 está en el índice 5.

Ejercicios Prácticos

  1. Implementación Básica: Implementa la búsqueda binaria iterativa y recursiva en tu lenguaje de programación preferido.
  2. Búsqueda de Primer y Último Elemento: Modifica la búsqueda binaria para encontrar el primer y el último índice de un elemento en una lista con duplicados.
  3. Aplicación en Datos Reales: Utiliza la búsqueda binaria para encontrar un elemento en una lista de nombres ordenados alfabéticamente.

Soluciones

  1. Implementación Básica: Ver el código proporcionado en las secciones anteriores.
  2. Búsqueda de Primer y Último Elemento: Ver el código proporcionado en las secciones anteriores.
  3. Aplicación en Datos Reales:
nombres = ["Ana", "Carlos", "Daniel", "Elena", "Fernando", "Gabriela", "Hugo", "Isabel", "Jorge", "Luis"]
objetivo = "Elena"

indice = busqueda_binaria(nombres, objetivo)
print(f"El nombre {objetivo} está en el índice {indice}.")

Salida:

El nombre Elena está en el índice 3.

Conclusión

La búsqueda binaria es una técnica fundamental en la informática que permite encontrar elementos en listas ordenadas de manera eficiente. Comprender tanto la implementación iterativa como la recursiva, así como las variantes para manejar duplicados, es esencial para resolver problemas complejos de búsqueda en grandes conjuntos de datos.

© Copyright 2024. Todos los derechos reservados