Optimización de código

📌 ¿Qué son las Notaciones Asintóticas?

Las notaciones asintóticas nos ayudan a describir cómo crece el tiempo de ejecución o el uso de memoria de un algoritmo a medida que aumenta el tamaño de la entrada (n).

✅ Nos permiten comparar algoritmos sin depender de la velocidad del hardware o del lenguaje de programación.

📌 Ejemplo:
Si un algoritmo toma 1 segundo para n = 1000 y 4 segundos para n = 2000, significa que su tiempo de ejecución no es constante, sino que crece con n.


Para describir la eficiencia de un algoritmo usamos tres tipos de notaciones:

  • O(n) → Límite superior (el peor caso).
  • Ω(n) → Límite inferior (el mejor caso).
  • Θ(n) → Caso ajustado (cuando el peor y el mejor caso son iguales).

📌 O(n) – Notación O grande (cota superior)

La notación O (O grande) representa el peor caso de un algoritmo. Nos dice cómo crece el tiempo de ejecución en función de n.

Ejemplo: Búsqueda Lineal (O(n))

Si tenemos un array de n elementos y buscamos un número, en el peor caso recorremos todo el array.

1public class LinearSearch {
2    public static boolean search(int[] arr, int target) {
3        for (int num : arr) {
4            if (num == target) {
5                return true;
6            }
7        }
8        return false;
9    }
10}

📌 Conclusión: En el peor caso, debemos recorrer los n elementos, por lo que O(n) significa que el tiempo de ejecución crece linealmente.


📌 Ω(n) – Notación Omega (cota inferior)

La notación Ω (Omega) representa el mejor caso de un algoritmo. Nos dice el mínimo tiempo posible que puede tomar.

Ejemplo: Búsqueda Lineal (Ω(1))

Si el elemento buscado está en la primera posición, lo encontramos de inmediato.

1public class BestCaseSearch {
2    public static boolean search(int[] arr, int target) {
3        if (arr[0] == target) return true; // Mejor caso: Primer elemento
4        for (int num : arr) {
5            if (num == target) return true;
6        }
7        return false;
8    }
9}

📌 Conclusión: En el mejor caso, encontramos el elemento en la primera posición, lo que nos da Ω(1).


📌 Θ(n) – Notación Theta (cota ajustada)

La notación Θ (Theta) indica que el tiempo de ejecución siempre crece al mismo ritmo, sin importar el caso.

  • Ejemplo: Sumar los elementos de un array
    • Siempre recorremos todos los elementos.
    • El peor y mejor caso son iguales.
1public class SumArray {
2    public static int sum(int[] arr) {
3        int total = 0;
4        for (int num : arr) {
5            total += num;
6        }
7        return total;
8    }
9}

📌 Conclusión: En este caso, siempre recorremos todo el array, por lo que el mejor y peor caso son iguales, lo que da Θ(n).


📌 Comparación de Notaciones

NotaciónSignificadoEjemplo
O(n)Peor caso (cota superior)Buscar en un array sin orden
Ω(n)Mejor caso (cota inferior)Encontrar el primer elemento
Θ(n)Caso ajustado (misma ejecución en todos los casos)Recorrer un array