edubun
Español

¿Qué tan rápido? La notación O grande

A mil millones de pasos por segundo, un método n² con un millón de valores tarda unos 17 minutos; un método n log n tarda 0.02 segundos.

El crecimiento importa más que el conteo exacto

Hasta ahora hemos contado los pasos con exactitud: 45 comparaciones, 4 intercambios, 20 comprobaciones. Los conteos exactos sirven para ejemplos pequeños, pero dependen de detalles como si el ordenamiento de burbuja termina antes o cómo se elige un pivote. Cuando la entrada se hace grande, hay algo que domina todo lo demás: cómo crece el conteo a medida que crece n. Un algoritmo cuyos pasos crecen como n² terminará perdiendo contra uno cuyos pasos crecen como n log n, por muy bien ajustado que esté el primero.

La notación O grande es la forma abreviada de expresar ese crecimiento. Escribir que un algoritmo es O(n²), que se lee "O grande de n al cuadrado", significa que para n grande su número de pasos es como máximo una constante por n². Dos reglas lo hacen fácil de usar. Se eliminan los factores constantes: 3n y n/2 son los dos O(n). Se conserva solo el término que crece más rápido: n²/2 − n/2, las comparaciones del ordenamiento por selección, es O(n²), porque para n grande la parte n² es casi todo. El curso 6.006 del MIT usa la misma idea cuando compara estructuras de datos y ordenamientos por su tiempo de ejecución asintótico.

Las tasas de crecimiento más comunes

  • O(1), constante. El trabajo no depende de n: leer el primer valor de una lista, o un valor en una posición conocida.
  • O(log n), logarítmica. Cada paso parte el problema por la mitad: la búsqueda binaria. Un millón de valores, unos 20 pasos.
  • O(n), lineal. Cada valor se trata una vez: la búsqueda lineal, encontrar el valor más grande, sumar una lista.
  • O(n log n). El ordenamiento por mezcla, y el quicksort en promedio. Lo mejor que puede hacer un ordenamiento por comparación.
  • O(n²), cuadrática. Se mira cada par: los ordenamientos de burbuja, selección e inserción en el peor caso, o dos bucles anidados uno dentro de otro.
  • O(2ⁿ), exponencial. El trabajo se duplica con cada valor extra: probar todos los subconjuntos de n elementos, o mover n discos en la Torre de Hanói.
Cargando

Arrastra para girar. Desplaza o pellizca para acercar.

Seis tasas de crecimiento dibujadas en los mismos ejes. Mueve n y activa la escala logarítmica; la tabla da los conteos de pasos para tu n y el tiempo para un millón de valores a mil millones de pasos por segundo.

Qué significan las cifras en segundos

Supón que una computadora hace mil millones (10⁹) de pasos básicos por segundo, una cifra redonda razonable para un núcleo de procesador. Esto es lo que significa cada tasa de crecimiento para un millón de valores. O(log n) son unos 20 pasos, muy por debajo de un microsegundo. O(n) es un millón de pasos, un milisegundo. O(n log n) son unos 20 millones de pasos, 0.02 segundos. O(n²) son 10¹² pasos, mil segundos, unos 17 minutos. O(2ⁿ) no se puede terminar: 2 elevado a un millón es un número de más de 300 000 dígitos. Por eso elegir el algoritmo correcto suele importar mucho más que comprar una computadora más rápida. Una máquina diez veces más rápida convierte 17 minutos en 1.7 minutos; pasar de O(n²) a O(n log n) los convierte en una cincuentava parte de segundo.

CrecimientoPasos para n = 1 000 000Tiempo a 10⁹ pasos por segundo
O(1)1alrededor de un nanosegundo
O(log n)unas 20unos 20 nanosegundos
O(n)1,000,0001 milisegundo
O(n log n)unos 20 000 000unos 0.02 segundos
O(n²)1,000,000,000,000unos 17 minutos
O(2ⁿ)más de 300 000 dígitosnunca termina

Leer la O grande en el código

Muchas veces puedes leer la tasa de crecimiento directamente en la forma del código. Un solo bucle sobre la lista es O(n). Dos bucles, uno dentro del otro, ambos sobre la lista, son O(n²): por cada una de las n vueltas del bucle exterior, el interior da hasta n vueltas. Un bucle que parte un número por la mitad cada vez, como while (n > 1) n = Math.floor(n / 2), es O(log n): empezando en 1000 se ejecuta 9 veces, y empezando en un millón, 19. Los pasos que ocurren uno tras otro se suman, y gana el término mayor: un bucle O(n) seguido de un bucle O(n²) es O(n²) en total.

// O(n): una pasada
let total = 0;
for (const x of list) total += x;

// O(n²): todos los pares
for (let i = 0; i < list.length; i++)
  for (let j = i + 1; j < list.length; j++)
    if (list[i] === list[j]) console.log("duplicate", list[i]);

// O(log n): partir por la mitad
let k = list.length, rounds = 0;
while (k > 1) { k = Math.floor(k / 2); rounds++; }

Mejor caso, caso promedio y peor caso

Un mismo algoritmo puede comportarse de forma muy distinta con entradas distintas. El ordenamiento por inserción es O(n) con una lista que ya está ordenada y O(n²) con una invertida. El quicksort es O(n log n) en promedio y O(n²) con pivotes malos de forma sistemática. Cuando alguien da una sola cifra de O grande sin decir de qué caso, normalmente se refiere al peor caso, porque es una garantía: el algoritmo nunca lo hará peor. La O grande también deja cosas fuera. Ignora los factores constantes, así que con entradas pequeñas un método O(n²) de pasos muy simples puede ganarle a uno O(n log n). Por eso muchas rutinas de ordenamiento reales pasan al ordenamiento por inserción para los trozos cortos de la lista.

La O grande puede describir la memoria además del tiempo. El ordenamiento por mezcla usa O(n) de memoria extra para su segunda lista; el ordenamiento por inserción usa O(1) de memoria extra, apenas unas cuantas variables.
O grandeCómo crece el número de pasos con n, ignorando los factores constantes
O(1)Constante: el mismo trabajo para cualquier n
O(log n)Logarítmica: se parte por la mitad en cada paso, como en la búsqueda binaria
O(n)Lineal: una pasada sobre la entrada
O(n log n)El ordenamiento por mezcla; lo mejor para ordenar por comparación
O(n²)Cuadrática: todos los pares, dos bucles anidados
O(2ⁿ)Exponencial: se duplica con cada elemento extra
peor casoUna garantía: el algoritmo nunca hace más que esto
  1. ¿Cómo se escribe 3n² + 5n + 2 en notación O grande?
    • O(n)
    • O(n²)
    • O(3n²)
    • O(n² + n)
  2. Dos bucles anidados uno dentro de otro, cada uno sobre n valores. ¿O grande?
    • O(n)
    • O(2n)
    • O(n²)
    • O(log n)
  3. La búsqueda binaria es
    • O(1)
    • O(log n)
    • O(n)
    • O(n log n)
  4. Un método O(n²) tarda 2 segundos con 1000 valores. ¿Más o menos cuántos segundos con 10 000 valores?
  5. Un método O(n) tarda 2 segundos con 1000 valores. ¿Más o menos cuántos segundos con 10 000 valores?
  6. A 10⁹ pasos por segundo, ¿cuántos segundos tardan 10¹² pasos (un método n² con un millón de valores)?
  7. ¿Cuántas veces se ejecuta while (n > 1) n = Math.floor(n / 2) cuando n empieza en 64?
  8. Un programa ejecuta un bucle O(n) y luego un bucle O(n²). En total es
    • O(n)
    • O(n²)
    • O(n³)
    • O(n + 2)
  9. El ordenamiento por inserción con una lista que ya está ordenada es
    • O(1)
    • O(n)
    • O(n log n)
    • O(n²)
  10. ¿Por qué un método O(n²) puede ganarle a un método O(n log n) con entradas pequeñas?
    • La O grande ignora los factores constantes, y el método más simple puede hacer menos en cada paso
    • La O grande está mal para n pequeño
    • n² es menor que n log n para todo n
    • Las entradas pequeñas siempre están ordenadas
  11. La memoria extra del ordenamiento por mezcla es
    • O(1)
    • O(log n)
    • O(n)
    • O(n²)
  12. Ordena estas tasas de crecimiento de la que crece más despacio a la que crece más rápido.
Ideas clave
  • La O grande describe cómo crecen los pasos con n, ignorando los factores constantes y los términos menores.
  • Tasas comunes: 1, log n, n, n log n, n², 2ⁿ.
  • Un millón de valores a 10⁹ pasos/s: n log n, unos 0.02 s; n², unos 17 minutos.
  • Un bucle es O(n); dos bucles anidados, O(n²); partir por la mitad, O(log n).
  • Una sola O grande citada suele referirse al peor caso.
Fuentes de este curso (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Fecha de consulta: 2026-10-17