Análisis de Código
Gráfica de Crecimiento
Section titled “Gráfica de Crecimiento”Es vital entender qué tan rápido “explotan” las funciones conforme crece.
Orden de mejor a peor:
Ejemplos Prácticos
Section titled “Ejemplos Prácticos”- Tiempo Constante
Section titled “O(1)O(1)O(1) - Tiempo Constante”No importa si o , tarda lo mismo.
// Acceso a array o matemáticas simplesint obtenerElemento(vector<int>& arr, int index) { return arr[index]; // Una sola operación}El problema se reduce a la mitad en cada paso. Típico de Binary Search.
- Si , solo toma pasos .
// Dividir N sucesivamentewhile (N > 0) { N /= 2; // El espacio de búsqueda se reduce a la mitad // Operaciones constantes aquí...}- Raíz Cuadrada
Section titled “O(n)O(\sqrt{n})O(n) - Raíz Cuadrada”Común en teoría de números (Test de primalidad, descomposición en factores).
- Si , toma pasos. Mucho mejor que .
// Test de primalidad ingenuobool esPrimo(int n) { if (n < 2) return false; for (long long i = 2; i * i <= n; ++i) { // i llega hasta sqrt(n) if (n % i == 0) return false; } return true;}Recorremos la entrada una vez. Si duplicas N, duplicas el tiempo.
// Suma de elementos o Búsqueda lineallong long suma = 0;for (int i = 0; i < N; ++i) { suma += arr[i];}El estándar de los ordenamientos eficientes (std::sort, Merge Sort) y estructuras de datos basadas en árboles (Maps, Sets, Segment Trees).
- Si , toma operaciones. Es el límite seguro para 1 segundo con .
// La mayoría de los ordenamientos eficientessort(arr.begin(), arr.end()); // C++ usa Introsort (mezcla de Quick, Heap y Insertion)- Cuadrático
Section titled “O(n2)O(n^2)O(n2) - Cuadrático”Bucles anidados. Típico de fuerza bruta o algoritmos sencillos como Bubble Sort.
- Peligroso para N>104 (10,000 elementos).
// Recorrer todos los pares posiblesfor (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { // Operación con arr[i] y arr[j] cout << i << ", " << j << endl; }}- Exponencial
Section titled “O(2N)O(2^N)O(2N) - Exponencial”Recursión ramificada. Por cada elemento, generamos dos ramas nuevas. Típico de generar Subsets (Subconjuntos) o Fibonacci recursivo sin DP.
- Solo viable para .
// Fibonacci recursivo ineficienteint fib(int n) { if (n <= 1) return n; return fib(n-1) + fib(n-2); // Dos llamadas por cada n}- Factorial
Section titled “O(N!)O(N!)O(N!) - Factorial”Generar todas las permutaciones posibles de un arreglo. Crece extremadamente rápido.
- Solo viable para .
// Generar todas las formas de ordenar el arreglosort(arr.begin(), arr.end());do { // Procesar permutación actual} while (next_permutation(arr.begin(), arr.end()));