Notación Big-O: complejidad temporal

Optimizing Code in Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

¿Qué es la complejidad temporal?

  • Complejidad temporal: cómo crece el tiempo de ejecución con el tamaño de entrada
  • Responde: «¿Qué pasa si mis datos son 10× mayores?»
  • No se centra en el tiempo absoluto
Optimizing Code in Java

Notación Big-O

Notación matemática para describir el peor caso.

Algunas clases comunes de complejidad:

  • O(1): Tiempo constante: independiente del tamaño
Optimizing Code in Java

Entender O(1)

  • Un ejemplo de operación O(1) es get() de ArrayList

Implementación interna (simplificada) de un ArrayList que guarda Strings:

public class ArrayList {}
    private String[] data; // Internal array
    private int size;

    // Get operation - direct array access
    public String get(int index) {
        return data[index]; // O(1)
    }
}
Optimizing Code in Java

Notación Big-O

Notación matemática para describir el peor caso

Algunas clases comunes de complejidad:

  • O(1): Tiempo constante: independiente del tamaño
  • O(n): Tiempo lineal: crece con la entrada
Optimizing Code in Java

Entender O(n)

  • Un ejemplo similar, pero para contains() de ArrayList
public boolean contains(Object o) {
    return indexOf(o) >= 0;
}

public int indexOf(Object o) {
    // Linear search through array
    for (int i = 0; i < size; i++) {
        if (o.equals(elementData[i])) {
            return i;
        }
    }
    return -1; // Not found
}
Optimizing Code in Java

Notación Big-O

Notación matemática para describir el peor caso

Algunas clases comunes de complejidad:

  • O(1): Tiempo constante: independiente del tamaño
  • O(n): Tiempo lineal: crece con la entrada
  • O(n²): Tiempo cuadrático: crece cuadráticamente con la entrada
Optimizing Code in Java

Un ejemplo práctico con complejidad cuadrática

// Finding a pair of numbers that sum to a target value
// Time complexity: O(n²)

public int[] findPairWithSum(ArrayList<Integer> numbers, int targetSum) {
    for (int i = 0; i < numbers.size(); i++) {
        for (int j = i + 1; j < numbers.size(); j++) {
            if (numbers.get(i) + numbers.get(j) == targetSum) {
                console.log("Found them!")
            }
        }
    }
}
Optimizing Code in Java

Por qué importa la complejidad temporal

Impacto del tamaño de entrada:

  • O(1): 1.000 -> 1.000.000 elementos = ¡mismo tiempo!
  • O(n): 1.000 -> 1.000.000 elementos = 1.000× más lento
  • O(n²): 1.000 -> 1.000.000 elementos = 1.000.000× más lento

Screenshot 2025-05-10 at 2.27.06 PM.png

Optimizing Code in Java

¡Vamos a practicar!

Optimizing Code in Java

Preparing Video For Download...