Las clases de complejidad computacional se definen considerando factores como el tipo de problema, el modelo de cómputo y los recursos acotados. La clase P contiene problemas solubles en tiempo polinómico por una máquina de Turing determinista. La clase NP incluye problemas de decisión para los cuales existe un certificado verificable en tiempo polinómico. El problema de satisfacibilidad booleana fue el primero en demostrarse NP-completo, lo que significa que es el problema más difícil en esta clase.