Mi primer encuentro con algoritmos 😱

María PérezMaría Pérez
8 min read

¡Hola mundo! 🐈

Y sí, ese es oficialmente mi primer 'Hola mundo' que no termina en un error de sintaxis 😅

Soy María, y hasta hace tres semanas mi idea de 'algoritmo' era la misteriosa fórmula que usa TikTok para mostrarme todo el rato videos de gatitos. Ahora, en mi segundo mes de bootcamp, no solo puedo explicarte uno de los algoritmos más poderosos que existen, sino que también entiendo por qué los ingenieros de software se emocionan tanto cuando hablan de "complejidad logarítmica". ¿Coincidencia? ¡No lo creo! ¿Progreso? ¡Definitivamente!

Algoritmos: Las recetas secretas de la programación

Antes de sumergirnos en Binary Search, clarifiquemos qué es exactamente un algoritmo. Un algoritmo es simplemente una serie de instrucciones paso a paso para resolver un problema específico. Es como una receta de cocina meticulosamente elaborada: sigues ciertos pasos en un orden determinado para transformar ingredientes crudos en un delicioso resultado.

En el universo de la programación, los algoritmos son el núcleo que impulsa cada solución eficiente. Son los métodos que determinan si tu aplicación responde instantáneamente o si tus usuarios tienen tiempo de preparar café mientras esperan. Y como descubrirás a continuación, la diferencia entre un buen algoritmo y uno excepcional puede ser astronómica.

Binary Search: El método de búsqueda que cambió mi perspectiva

Imagina que estás buscando a Pikachu en tu colección completa de Pokémon 151. ¿Qué harías?

Método tradicional (búsqueda lineal)

Revisas carta por carta, desde Bulbasaur hasta encontrar la que buscas. Simple, intuitivo, pero potencialmente agotador.

Método inteligente (búsqueda binaria)

Existe una estrategia extraordinariamente más eficiente si tus cartas están ordenadas por su número de Pokédex. Este enfoque aprovecha la estructura ordenada para eliminar la mitad de las posibilidades con cada paso.

Binary Search en acción: La caza de Pikachu

Supongamos que tienes 100 cartas Pokémon perfectamente ordenadas por su número de Pokédex (de menor a mayor) y quieres encontrar a Pikachu (número 25).

Escenario con búsqueda lineal:

  1. Empiezas examinando la carta #1 (Bulbasaur) → No es Pikachu

  2. Continúas con la #2 (Ivysaur) → Tampoco es Pikachu

  3. Sigues este proceso metódicamente hasta llegar a la carta #25 → ¡Por fin! Pikachu

Resultado: Podrías necesitar revisar hasta 25 cartas. Si buscas a Mew (#151), revisarías todas las cartas de tu colección. La eficiencia está completamente a merced de la posición del elemento buscado.

Escenario con búsqueda binaria:

  1. Comienzas en el punto medio, carta #50 (Diglett) → Es mayor que #25

  2. Como Diglett (#50) supera a Pikachu (#25), sabes con certeza absoluta que Pikachu debe estar en la primera mitad

  3. Ahora examinas el medio de la primera mitad, carta #25 → ¡Eureka! Es Pikachu

Resultado: ¡Localizaste a Pikachu examinando solo 2 cartas! 🎉

En el peor escenario imaginable (buscando a Mew o a un Pokémon inexistente), con Binary Search solo necesitarías revisar aproximadamente 7 cartas (log₂ 100 ≈ 6.64) de tu colección de 100, a diferencia de las 100 revisiones que potencialmente requeriría la búsqueda lineal.

Binary Search sigue este elegante proceso:

  1. Identifica el elemento en el centro exacto de tu colección ordenada

  2. Si es el elemento objetivo, ¡misión cumplida!

  3. Si el objetivo es menor que el elemento central, repite el proceso exclusivamente con la mitad izquierda

  4. Si el objetivo es mayor, repite el proceso únicamente con la mitad derecha

  5. Continúa recursivamente hasta encontrar el elemento o determinar concluyentemente que no existe

Binary Search traducido a código

La implementación en JavaScript revela la sorprendente simplicidad de este algoritmo:

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  // Iniciamos nuestra búsqueda estratégica
  while (left <= right) {
    // Calculamos el punto medio con precisión matemática
    let mid = Math.floor((left + right) / 2);

    // Si encontramos el objetivo, retornamos su posición
    if (arr[mid] === target) {
      return mid;
    }

    // Si el objetivo es menor que el elemento central, descartamos la mitad derecha
    if (arr[mid] > target) {
      right = mid - 1;
    }
    // De lo contrario, descartamos la mitad izquierda
    else {
      left = mid + 1;
    }
  }

  // Si llegamos aquí, el elemento definitivamente no existe en nuestra colección
  return -1;
}

// Simulación con nuestra colección de Pokémon
const pokemons = [1, 4, 7, 10, 13, 16, 19, 21, 25, 27, 31, 34, 38, 43, 46, 50];
const pikachu = 25;

const result = binarySearch(pokemons, pikachu);
console.log(`¡Pikachu está en la posición ${result}!`);  // ¡Pikachu está en la posición 8!

La magia exponencial de la eficiencia logarítmica

Lo verdaderamente fascinante de Binary Search es su escalabilidad. La diferencia entre búsqueda lineal y binaria se amplifica dramáticamente conforme crece el tamaño de tu colección:

Tamaño de la colecciónBúsqueda Lineal (peor caso)Búsqueda Binaria (peor caso)
10 elementos10 comparaciones4 comparaciones
100 elementos100 comparaciones7 comparaciones
1,000 elementos1,000 comparaciones10 comparaciones
1,000,000 elementos1,000,000 comparaciones20 comparaciones
1,000,000,000 elementos1,000,000,000 comparaciones30 comparaciones

¿Percibes el patrón? Mientras que la búsqueda lineal crece proporcionalmente con el tamaño de la colección, la búsqueda binaria crece logarítmicamente (log₂n). Con mil millones de elementos, Binary Search requiere únicamente 30 pasos. Esta es la diferencia entre esperar microsegundos o días enteros para obtener resultados.

Prerrequisito fundamental: El poder del orden

Es crucial comprender que Binary Search exige una colección previamente ordenada. Este requisito no es negociable—es la base estructural que permite las decisiones inteligentes del algoritmo. Si tus elementos están desordenados, primero deberás ordenarlos (un tema fascinante para otro artículo).

La notación Big O: El lenguaje universal de la eficiencia algorítmica

💭 Confesión de María: La primera vez que escuché "Big O", pensé que era el nombre de algún antagonista de un anime que no había visto.

Cuando los desarrolladores discutimos la eficiencia de nuestras soluciones, utilizamos la "notación Big O" como lenguaje universal. Es el sistema métrico de la complejidad algorítmica que responde a la pregunta crítica: "Si tengo que procesar N elementos, ¿cuántos pasos requerirá mi algoritmo en el peor de los casos?"

El espectro de la eficiencia algorítmica:

  • O(1) - Tiempo constante: El algoritmo ejecuta el mismo número de operaciones independientemente del tamaño de entrada. Como encontrar tu movil cuando SABES con certeza que está en tu bolsillo derecho.

  • O(log n) - Tiempo logarítmico: El tiempo de ejecución crece muy lentamente a medida que aumenta el tamaño de entrada. ¡Aquí reside la belleza de Binary Search!

  • O(n) - Tiempo lineal: El tiempo crece proporcionalmente al tamaño de entrada. Como revisar sistemáticamente cada carta Pokémon en tu colección, una por una.

  • O(n²) - Tiempo cuadrático: El tiempo de ejecución crece exponencialmente con el tamaño de entrada. Equivale a comparar exhaustivamente cada carta Pokémon con todas las demás cartas de tu colección (un proceso que se vuelve prohibitivamente lento con colecciones extensas).

Cuando afirmo que Binary Search tiene una complejidad temporal de O(log n), estoy destacando su extraordinaria eficiencia y su capacidad para mantener un rendimiento excepcional incluso con conjuntos de datos masivos.

Como programadora en formación, inicialmente me costó visualizar la mecánica interna de este algoritmo. Tres estrategias transformaron mi comprensión:

  1. Representación visual: Elaboré diagramas detallados para cada paso del proceso

  2. Ejemplos minimalistas: Comencé practicando con colecciones de 10 elementos antes de escalar

  3. Depuración estratégica: Implementé puntos de control con console.log para monitorear cada iteración

Desafío para consolidar tu comprensión

¿Te animas a implementar Binary Search en tu lenguaje de programación favorito? ¿Qué tal si lo aplicas a una colección de elementos que te apasione—ya sean canciones, películas o libros?

Pon a prueba tu comprensión: Mini Quiz

¿Has captado los fundamentos de Binary Search? ¡Compruébalo con este cuestionario rápido!

  1. ¿Cuál es el requisito fundamental para implementar Binary Search?

    • a) La colección debe estar desordenada

    • b) La colección debe estar ordenada

    • c) La colección debe contener un número par de elementos

    • d) No existen requisitos especiales

  2. Si tienes una colección ordenada de 1,000 elementos, ¿cuál es el máximo número de comparaciones que necesitarías con Binary Search para localizar cualquier elemento?

    • a) 1,000

    • b) 500

    • c) 100

    • d) Aproximadamente 10

  3. En el escenario más desfavorable, ¿cuál es la complejidad temporal de Binary Search?

    • a) O(n)

    • b) O(n²)

    • c) O(log n)

    • d) O(1)

  4. ¿Qué ocurre si el elemento que buscas no existe en la colección?

    • a) Binary Search entrará en un bucle infinito

    • b) Binary Search lanzará una excepción

    • c) Binary Search eventualmente determinará que el elemento no existe

    • d) Binary Search continuará buscando en colecciones adyacentes

  5. ¿Por qué Binary Search supera radicalmente a la búsqueda lineal en eficiencia?

    • a) Porque siempre inicia desde el principio de la colección

    • b) Porque elimina estratégicamente la mitad de las posibilidades en cada iteración

    • c) Porque puede buscar múltiples elementos simultáneamente

    • d) Porque funciona con cualquier estructura de datos

Respuestas: 1-b, 2-d, 3-c, 4-c, 5-b

¿Acertaste todas? ¡Felicidades! Has internalizado los principios fundamentales de Binary Search y estás preparado para aplicarlos en contextos cada vez más complejos.

Conclusión: El inicio de mi romance con los algoritmos eficientes

Así concluye mi primera inmersión en el fascinante mundo de los algoritmos. Si, como yo, estás comenzando tu viaje en la programación, recuerda: todos los expertos fueron principiantes alguna vez.

El poder de Binary Search trasciende su implementación técnica—representa un paradigma de pensamiento que prioriza la eficiencia y la elegancia sobre la fuerza bruta. Es una lección que aplicaré en cada línea de código que escriba.

Próximamente: Mi batalla épica con la recursión, o como prefiero llamarla: 'Inception pero con funciones'. ¡No te lo pierdas!

¿Has experimentado momentos de confusión con Binary Search? ¿O quizás has tenido un '¡ajá!' revelador? ¡Comparte tu experiencia en los comentarios! Estamos unidos en esta travesía de hacer que las computadoras ejecuten nuestras instrucciones (la mayor parte del tiempo).


María - Desarrolladora en formación, entusiasta de Pokémon y recientemente obsesionada con la eficiencia logarítmica 📊✨

¿Te resultó útil este artículo? ¡No olvides darle like y compartirlo con otros estudiantes de programación que puedan encontrarlo valioso! Sígueme para más contenido sobre mi viaje de aprendizaje en el apasionante universo del desarrollo de software.

0
Subscribe to my newsletter

Read articles from María Pérez directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

María Pérez
María Pérez