Complejidad Computacional.

###

**Complejidad Computacional**

### La Teoría de la Complejidad

La teoría de la computación es una ciencia, específicamente una rama de la matemática y de la computación que centra su interés en estudio y definición formal de los cómputos y su principal objetivo es responder ¿Cuáles son las capacidades y limitaciones de los ordenadores? Para ello se vale de otras teorías como teoría de autómatas, teoría de computabilidad y teoría de complejidad computacional.

#### **Teoría de autómatas**

Estudia las máquinas abstractas y los problemas que éstas son capaces de
resolver. La teoría de autómatas está estrechamente relacionada con la teoría
del lenguaje formal ya que los autómatas son clasificados a menudo por la clase
de lenguajes formales que son capaces de reconocer. Tiene un papel central en
varias aplicaciones de las ciencias de la computación, incluyendo procesamiento
de texto, compiladores, diseño de hardware e inteligencia artificial.

#### **Teoría de la computabilidad**

Explora los límites de la posibilidad de solucionar problemas mediante algoritmos. Gran parte de las ciencias computacionales están dedicadas a resolver problemas de forma algorítmica, de manera que el descubrimiento de problemas imposibles es una gran sorpresa.

Por ultimo y en lo que nos enfocaremos en esta ocasión está la **Teoría** de la Complejidad Computacional**que se centra en la clasificación de** los problemas computacionales de acuerdo a su dificultad inherente, y en la relación entre dichas clases de complejidad. Estudia la eficiencia de los algoritmos estableciendo su efectividad de acuerdo al tiempo de corrida y al espacio requerido en la computadora o almacenamiento de datos, ayudando a evaluar la viabilidad de la implementación práctica en tiempo y costo.

##### **…Érase una vez, una Máquina de Turing que no calculaba tiempo ni memoria**

La historia de la teoría computacional comienza con uno de los aportes más influyentes como lo fueron las Máquinas de Turing en 1936, las cuales resultaron ser una noción de computadora muy flexible y robusta. A medida que las computadoras se desarrollaban en los 40’s y los 50’s, la Máquina de Turing demostró ser el modelo teórico correcto de cómputo. Aunque luego se comprobó estas máquinas fallaban al cuantificar el tiempo y la memoria requerida por una computadora, constituyendo un problema crítico. La idea de medir el tiempo y espacio como una función de la longitud de la entrada, se originó a principios de los 60’s por Hartmanis and Stearns, y así, nació la teoría de la complejidad computacional.

En los inicios, los investigadores trataban de entender las nuevas medidas de complejidad, y cómo se relacionaban unas con otras. En 1965, Edmonds definió un  algoritmo en el cual un polinomio acotaba el tiempo de ejecución (de aquí nace el término tiempo polinómico), lo que conllevó a la formulación de uno de los conceptos más importantes de la teoría de la complejidad computacional: la NP-completitud y su pregunta fundamental, si ¿P=NP? lo que en palabras comunes y silvestres pregunta si ¿es posible “verificar” rápidamente soluciones positivas a un problema del tipo SI/NO?, y de ser afirmativa la respuesta ¿es que entonces también se pueden “obtener” las respuestas rápidamente?

El objetivo principal de esta teoría es la creación de mecanismos y herramientas capaces de describir y analizar la complejidad de un algoritmo y
la complejidad intrínseca de un problema. En otras palabras, busca la respuesta
a ¿Qué hace a algunos problemas computacionalmente difíciles y a otros sencillos?

Para ello, considera los 2 tipos de recursos requeridos durante el
cómputo para resolver un problema:

* **Tiempo:** Número de pasos base de ejecución de un algoritmo para resolver un problema.
* **Espacio:** Cantidad de memoria utilizada para resolver un problema.

#### **La complejidad computacional y los problemas de decisión.**

Si establecemos que un problema es un conjunto de frases de longitud finita que tienen asociadas frases resultantes también de longitud finita. Un problema
de decisión es un problema en donde las respuestas posibles son “sí” o “no”. Según la Teoría de la Complejidad Computacional lo problemas de decisión tienen
distintas clases de complejidad:

* **Clase L:** Es el conjunto de los problemas de decisión que pueden ser resueltos en espacio log(n) (sin contar el tamaño de la entrada), donde n es el tamaño de la entrada, por una máquina de Turing *determinista* tal que la solución si existe es única.
* **Clase NL:** La clase de complejidad NL (espacio logarítmico no determinista) es el conjunto de los problemas de decisión que pueden ser resueltos en espacio log(n) (sin contar el tamaño de la entrada), donde n es el tamaño de la entrada, por una máquina de Turing *no determinista* tal que la solución si existe es única.

* **Clase P:** Son todos aquellos problemas de decisión que pueden ser resueltos en una máquina determinista secuencial en un período de tiempo polinómico en proporción a los datos de entrada.
* **Clase NP:** Es el conjunto de problemas que pueden ser resueltos en tiempo polinómico por una máquina de Turing no determinista. La importancia de esta clase de problemas de decisión es que contiene muchos problemas de búsqueda y de optimización para los que se desea saber si existe una cierta solución o si existe una mejor solución que las conocidas.

* **Clase NP-Completo:** Informalmente, los problemas de NP-completos son los problemas más difíciles de NP, en el sentido de que son los más probables de no encontrarse en P. Los problemas de NP-completos son esos problemas NP-duros que están contenidos en NP.

#### Referencias

(2015, 11 10). Retrieved from https://frikosfera.wordpress.com/2015/03/13/la-teoria-de-la-complejidad-computacional-en-palabras-no-tan-complejas/: https://frikosfera.wordpress.com/2015/03/13/la-teoria-de-la-complejidad-computacional-en-palabras-no-tan-complejas/

(2016, 5 4). Retrieved from https://datasena.wordpress.com/about/: https://datasena.wordpress.com/about/

(Miguel, 10)

 (Abeliuk, 11)

(Cárdenas-Montes, )