Cada programa, no importa cuán trivial, se ejecute en una computadora, incluidas las computadoras teóricas como las máquinas Turing. Además, todos los programas requieren cierta cantidad de memoria para almacenar resultados temporales.
Esto surge debido a la complejidad de tiempo y espacio del algoritmo, mientras que el análisis de algoritmos es la ciencia de saber cuán complejo es un algoritmo (en términos de tiempo y espacio).
Típicamente, la complejidad se mide por cuántas veces se realiza una operación clave o cuántas veces se necesita almacenar una pieza clave de información.
- ¿Qué puedo hacer para reducir el correo electrónico no deseado que he recibido últimamente? Más información en comentarios.
- ¿Cuáles son algunas de las nuevas tecnologías que son fáciles de usar para personas mayores de 65 años?
- ¿Los cambios que Harvey Mudd College hizo en su programa de CS para atraer a tantas mujeres serán fácilmente replicables por otras universidades?
- ¿Qué sistema operativo es mejor para mantener el anonimato: Redhat, Debian, Linux Mint o Ubuntu?
- ¿Cómo se usa exactamente el aprendizaje automático en los motores de recomendación?
Hacemos esto porque cada computadora del mundo real ejecutará cualquier algoritmo dado a diferentes velocidades. Entonces, cuando compara en implementaciones de código, es casi inútil decidir qué algoritmo usar para resolver un problema.
La complejidad se mide (informalmente), usando la notación Big-O, y se escribe como O (x), donde x es alguna expresión matemática que se relaciona con el número de entradas (comúnmente llamadas n entradas).
Así por ejemplo,
- Un programa O (1) se completa en la misma cantidad de tiempo, independientemente de sus entradas.
- Un programa O (n) se completa en una cantidad de tiempo que está en proporción directa con sus entradas.
- Un algoritmo [matemático] O (n ^ 2) [/ matemático] se completa en el cuadrado de n (n tiempo n).
Todo lo anterior es manejable incluso para entradas muy grandes en casi cualquier computadora, pero hay una clase de algoritmos informalmente referidos como NP-completo, con la definición formal volviéndose realmente desordenada.
Incluso para un número relativamente pequeño de entradas, esta clase lleva un tiempo extremadamente largo, por lo tanto, a menudo se etiquetan (informalmente) como algoritmos O (n!). ¡NORTE! significa n factorial, que se define como n * n-1 * n-2 * … * 1.
Vea lo siguiente: 4! = 4 * 3 * 2 * 1 = 24. Es fácil discernir que agregar uno a n lo hace 5 veces más difícil, mientras que agregar uno más lo hace 6 veces más difícil que el nuevo (30 veces más difícil que n = 4). Y así sucesivamente … Obviamente, esto comerá cualquier computadora del mundo real con vida muy rápidamente.
En el lenguaje cotidiano, los problemas del orden de O (1), O (n), [matemáticas] O (n ^ 2) [/ matemáticas] se denominan problemas “P”. Una de las preguntas más importantes de la informática, si no el Santo Grial de la CS, es ¿P = NP?
La gran mayoría de los informáticos no creen que sí, incluido yo mismo. Contrariamente a lo que afirman las personas que realmente no entienden las computadoras cuánticas, los artilugios de pie en el cielo no resuelven esta pregunta. Para obtener más información, consulte P vs. NP (tema de Quora).