DEV Community

Cover image for Big-O en Español - Parte 1
Martin Pi
Martin Pi

Posted on

Big-O en Español - Parte 1

La notación Big-O es una herramienta fundamental en el desarrollo de software, ya que nos permite analizar y comprender la eficiencia de los algoritmos que implementamos. Más allá de ser un concepto teórico, Big-O juega un papel crucial al momento de optimizar tiempos de procesamiento y garantizar la escalabilidad de nuestras aplicaciones.

Esta serie de posts nace de conversaciones con clientes, donde frecuentemente trabajo en optimizar no solo arquitecturas, sino también los tiempos de respuesta de funcionalidades críticas. Comprender Big-O no solo mejora el rendimiento de nuestros sistemas, sino que también nos ayuda a entender conceptos como la complejidad ciclomatica y a tomar decisiones más informadas en el diseño de soluciones.

A través de esta serie, exploraremos desde los conceptos más básicos hasta los casos avanzados, proporcionando ejemplos prácticos que te ayudarán a aplicar estas ideas en tus proyectos.


¿Qué encontrarás en esta serie?

  1. Parte 1: Expresiones Lineales y Constantes

    Introducción a las notaciones más simples y cómo afectan el rendimiento de nuestros algoritmos.

  2. [Parte 2: Expresiones Cuadráticas, Cúbicas y de Otras Potencias]

    Un análisis más profundo sobre cómo crecen los tiempos de ejecución en algoritmos más complejos.

  3. [Parte 3: Expresiones Logarítmicas, Exponenciales y Factoriales]

    Exploraremos casos donde el tiempo de ejecución crece de forma mucho más drástica.

  4. [Parte 4: Combinando Complejidades y Comparando Estructuras de Datos]

    Analizaremos cómo diferentes estructuras de datos afectan la complejidad y cómo combinar varios algoritmos.

  5. [Parte 5: Consideraciones Avanzadas y Casos Reales]

    Reflexiones finales sobre trade-offs entre tiempo y espacio, complejidades amortizadas, y cómo aplicar Big-O en escenarios reales.


¿Por qué es importante?

En un mundo donde la experiencia del usuario y la escalabilidad son aspectos esenciales, optimizar el rendimiento no es opcional, es un imperativo. La notación Big-O nos da una base sólida para:

  • Identificar puntos de mejora en nuestros algoritmos.
  • Evaluar el impacto de decisiones arquitectónicas.
  • Garantizar que nuestras aplicaciones sean escalables a medida que crecen los datos.

Te invito a sumarte a esta serie y profundizar en uno de los conceptos más importantes en el desarrollo de software moderno.


En esta primera parte, exploraremos dos de las notaciones más comunes: O(n) (lineal) y O(1) (constante), utilizando ejemplos prácticos.


Expresiones Lineales

Imagina que tienes una lista de personas en un arreglo desordenado:

const personas = ["Juan", "Pedro", "Pablo", "Damian", "Maria", "Diego", "Nelson", "Jose", "Monica", "Juana"];
Enter fullscreen mode Exit fullscreen mode

Si quieres buscar a una persona específica en la lista, necesitas recorrer cada elemento uno por uno hasta encontrarla. Si la persona no está en la lista, tendrás que revisar todos los elementos.

El siguiente código ilustra este proceso:

function encontrarPersona(nombre) {
  for (let persona of personas) {
    if (persona === nombre) {
      return "Persona Encontrada";
    }
  }
  return "Persona No Encontrada";
}
Enter fullscreen mode Exit fullscreen mode

En este caso:

  • Mejor caso: La persona está en la primera posición (O(1)).
  • Peor caso: La persona no está o está al final de la lista (O(n)).
  • Caso promedio: Se recorre la mitad de los elementos, pero en Big-O se simplifica como O(n).

En matemáticas, esta relación se expresa como:

f(x) = x
Enter fullscreen mode Exit fullscreen mode

En notación Big-O, se representa así:

O(n)
Enter fullscreen mode Exit fullscreen mode

Esto significa que, a medida que el número de elementos en el arreglo crece, el tiempo necesario para encontrar una persona también crece linealmente.


Expresiones Constantes

Ahora supongamos que tienes una tabla hash (hashtable). Este tipo de estructura permite recuperar valores en base a una clave de forma casi instantánea.

Ejemplo de tabla hash:

const colores = {
  "Blanco": "#FFFFFF",
  "Rojo": "#FF0000",
  "Negro": "#000000",
  "Amarillo": "#FFFF00",
  "Verde": "#008000"
};
Enter fullscreen mode Exit fullscreen mode

Cuando intentas recuperar un valor por su clave, como en los siguientes ejemplos:

const colorBlanco = colores["Blanco"]; // Resultado: "#FFFFFF"
const colorVerde = colores["Verde"];   // Resultado: "#008000"
const colorAzul = colores["Azul"];    // Resultado: undefined
Enter fullscreen mode Exit fullscreen mode

El tiempo necesario para acceder a cualquier valor es constante, independientemente de cuántos elementos haya en la tabla hash.

En matemáticas, esta relación se expresa como:

f(x) = c
Enter fullscreen mode Exit fullscreen mode

Y en notación Big-O:

O(1)
Enter fullscreen mode Exit fullscreen mode

Esto significa que el tiempo de ejecución no depende del tamaño de la estructura de datos.


Las gráficas de estas dos notaciones se pueden ver a continuación

Image description


Respondiendo Preguntas Comunes

¿Qué pasa si mi procesador es antiguo o muy rápido?

La notación Big-O mide la tendencia del tiempo de ejecución en relación con el tamaño de los datos, no el tiempo exacto. Por ejemplo:

  • Si el procesador es más lento, podrías tener:
  f(x) = 2x
Enter fullscreen mode Exit fullscreen mode
  • Si es más rápido:
  f(x) = x / 2
Enter fullscreen mode Exit fullscreen mode
  • Si hay un retraso inicial antes de ejecutar:
  f(x) = x + 2
Enter fullscreen mode Exit fullscreen mode

Sin embargo, en todos estos casos, la tendencia sigue siendo la misma: f(x) = x (lineal).

Lo mismo aplica para O(1), donde el tiempo puede variar, pero sigue siendo constante.


Conclusión

En este post, hemos explorado las dos notaciones más simples de Big-O: O(n) (lineal) y O(1) (constante). Estas son esenciales para entender cómo los algoritmos escalan con datos más grandes.

En la próxima parte, hablaremos de expresiones cuadráticas y otros casos más complejos. ¡Prepárate para llevar tu comprensión de Big-O al siguiente nivel!

Top comments (0)