Hablando en términos generales, la complejidad del tiempo es una forma de resumir cómo crece el número de operaciones o el tiempo de ejecución de un algoritmo a medida que aumenta el tamaño de entrada.
Como la mayoría de las cosas en la vida, un cóctel puede ayudarnos a entender.
EN)
Cuando llegas a la fiesta, tienes que estrechar la mano de todos (hacer una operación en cada elemento). A medida que N
aumenta el número de asistentes , el tiempo / trabajo que le llevará estrechar la mano de todos aumenta a medida que O(N)
.
¿Por qué O(N)
y no cN
?
Existe una variación en la cantidad de tiempo que se necesita para estrechar la mano de las personas. Podría promediar esto y capturarlo de manera constante c
. Pero la operación fundamental aquí, estrechar la mano de todos, siempre sería proporcional O(N)
, sin importar lo que c
fuera. Al debatir si deberíamos ir a una fiesta de cócteles, a menudo estamos más interesados en el hecho de que tendremos que conocer a todos que en los detalles minuciosos de cómo son esas reuniones.
O (N ^ 2)
El anfitrión del cóctel quiere que juegues un juego tonto donde todos se encuentran con todos los demás. Por lo tanto, debe conocer a N-1
otras personas y, debido a que la siguiente persona ya lo ha conocido, debe conocer a otras N-2
personas, y así sucesivamente. La suma de esta serie es x^2/2+x/2
. A medida que crece el número de asistentes, el x^2
término se hace grande rápidamente , por lo que simplemente dejamos todo lo demás.
O (N ^ 3)
Debe conocer a todos los demás y, durante cada reunión, debe hablar sobre todos los demás en la sala.
O (1)
El anfitrión quiere anunciar algo. Beben una copa de vino y hablan en voz alta. Todos los oyen. Resulta que no importa cuántos asistentes haya, esta operación siempre toma la misma cantidad de tiempo.
O (log N)
El anfitrión ha colocado a todos en la mesa en orden alfabético. ¿Donde esta Dan? Usted razona que debe estar en algún lugar entre Adam y Mandy (¡ciertamente no entre Mandy y Zach!). Dado eso, ¿está entre George y Mandy? No. Debe estar entre Adam y Fred, y entre Cindy y Fred. Y así sucesivamente ... podemos localizar eficientemente a Dan mirando la mitad del conjunto y luego la mitad de ese conjunto. Finalmente, nos fijamos en los individuos O (log_2 N) .
O (N log N)
Puede encontrar dónde sentarse en la mesa utilizando el algoritmo anterior. Si un gran número de personas se acercara a la mesa, una a la vez, y todas hicieran esto, eso llevaría tiempo O (N log N) . Esto resulta ser cuánto tiempo lleva ordenar una colección de artículos cuando deben compararse.
Mejor / peor caso
Llegas a la fiesta y necesitas encontrar a Iñigo: ¿cuánto tiempo te llevará? Depende de cuando llegues. Si todo el mundo está dando vueltas, has tocado el peor de los casos: tomará O(N)
tiempo. Sin embargo, si todos están sentados a la mesa, solo tomará O(log N)
tiempo. O tal vez pueda aprovechar el poder de gritos de copa de vino del anfitrión y solo tomará O(1)
tiempo.
Suponiendo que el anfitrión no esté disponible, podemos decir que el algoritmo de búsqueda de Íñigo tiene un límite inferior O(log N)
y un límite superior O(N)
, según el estado de la fiesta cuando llegue.
Espacio y comunicación
Se pueden aplicar las mismas ideas para comprender cómo los algoritmos usan el espacio o la comunicación.
Knuth ha escrito un buen artículo sobre el anterior titulado "La complejidad de las canciones" .
Teorema 2: existen canciones arbitrariamente largas de complejidad O (1).
PRUEBA: (debido a Casey y la Sunshine Band). Considere las canciones Sk definidas por (15), pero con
V_k = 'That's the way,' U 'I like it, ' U
U = 'uh huh,' 'uh huh'
para todos los k.