La Teoría de la Complejidad Computacional clasifica problemas computacionales según su dificultad inherente y estudia la relación entre clases de complejidad. Formaliza la noción de problemas intrínsecamente difíciles que requieren muchos recursos para resolverse independientemente del algoritmo. Determina los límites prácticos de lo que se puede y no se puede hacer en una computadora. Se diferencia del análisis de algoritmos en que analiza todos los posibles algoritmos para un problema, no solo uno en particular.