Está en la página 1de 8

0910-17-1356

Kéller Eduardo Zapote Tún


Teoría de Autómatas y Lenguajes
Formales

Complejidad
Computacional

Intuitivamente todos tenemos noción de la complejidad de hecho, usamos la palabra


cotidianamente para significar situaciones difíciles de resolver. Trasladada la pregunta a un
ámbito formal, matemático o de ingeniería podemos reformular la pregunta en la siguiente
forma:
 ¿Por qué algunos problemas son computacionalmente más difíciles que otros?
Pues bien, la Teoría de la Complejidad tiene como finalidad dar respuesta a esta pregunta
mediante la creación de herramientas que permitan describir un problema complejo
mediante la definición de un posible o posibles algoritmos, si existen, que permitan
solucionar un problema.
 ¿Por qué se llegó hasta aquí al punto de existir una teoría?
Historia Breve
Todo inicia con Alan Turing, un brillante matemático inglés, quien en 1936 desarrolló un
modelo computacional teórico que años después probó estar en lo cierto a pesar de no
haber considerado la cantidad de memoria y el tiempo de ejecución requeridos para un
problema específico.
Hoy en día cualquier “gamer” sabe que la eficiencia de su sistema depende de la cantidad
de memoria y el tiempo de respuesta, pero en la época de Turing, nos encontrábamos en
los albores de la computación, no obstante, el modelo de Turing no pierde por ello su
importancia y trascendencia.
0910-17-1356
Kéller Eduardo Zapote Tún
Teoría de Autómatas y Lenguajes
Complejidad Computacional Formales

El primer paso para resolver un problema informático es encontrar un algoritmo que lo


resuelva. Pero una vez resuelto el problema, nos surgen las siguientes dudas: ¿Existen
algoritmos “mejores” para resolver el problema?
Pero, tanto el tiempo como el espacio utilizado dependen de la máquina en la que
ejecutemos el algoritmo, por tanto, hay que determinar una forma para estudiar la
eficiencia de los algoritmos independiente de la máquina que se utilice.
Tenemos que encontrar una forma para evaluar algoritmos independientes de la máquina
en la que se ejecuten, así que lo que haremos será contar el número de operaciones que
realiza un programa.
Supongamos que tenemos dos algoritmos A1 y A2 para resolver un determinado problema.
Cuando los algoritmos anteriores, actúan sobre n datos se tiene que A1 hace S1 sumas, P1
productos y C1 comparaciones, y A2 realiza S2 sumas, P2 productos y C2 comparaciones
siendo:

A1 A2

S1=n5+46n3 S2=23n2

P1=n2+37n P2=n3+456n2

C1=45n C2=n4+86n

Habrá que ver cuantos datos elementales tenemos y sustituir en cada una de las
expresiones, de esta forma veremos qué algoritmo hace más operaciones, pero interesa
saber qué algoritmo es mejor cuando n es grande, si n es pequeño no habrá diferencias
sustanciales.

Obviamente, cuando n tienda a infinito el algoritmo A1 utilizará casi todo el tiempo en


realizar sumas, mientras que A2 lo utilizará en realizar comparaciones. Por tanto, si n
tiende a infinito, A1 tenderá a infinito como n5 y A2 tenderá a infinito como n4, por lo que
podemos afirmar que A2 es más rápido que A1 salvo posiblemente para un número finito
de datos. Diremos que A1 tiene una complejidad de orden n5 (lo denotaremos O(n5)) y A2
tiene una complejidad de n4 (lo denotaremos O(n4)).

Así pues, para calcular la complejidad computacional de un algoritmo, no hay que


programarlo al detalle, basta con ver cuantas veces se realiza la operación que más se
repite.
0910-17-1356
Kéller Eduardo Zapote Tún
Teoría de Autómatas y Lenguajes
Formales

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
Los recursos que normalmente se estudian son:

 El tiempo: que por medio de una aproximación al número y patrón de pasos de


ejecución de un algoritmo para solucionar algún problema.

 El espacio: que por medio de una aproximación a la cantidad de memoria que


utilizamos para solucionar algún problema.

Podemos estudiar al igual otros parámetros, así como el número de procesadores que
necesitamos para solucionar el problema en equivalente. La teoría de la complejidad se
distingue de la teoría de la computabilidad en que ésta se necesita de la posibilidad de
manifestar problemas como algoritmos más efectivos sin tomar en cuenta los recursos
necesarios para esto.
Los problemas que tienen una solución con orden de complejidad lineal son los
problemas que se resuelven en un tiempo que se vincula linealmente con su tamaño.
Los problemas de decisión son clasificados en conjuntos de complejidad comparable
llamados clases de complejidad.
0910-17-1356
Kéller Eduardo Zapote Tún
Teoría de Autómatas y Lenguajes
Teoría de la Complejidad Formales

Clases de Complejidad
Una clase de complejidad es un conjunto de problemas de decisión de complejidad
relacionada. Es el conjunto de problemas de decisión que se pueden resolver por una máquina
turing utilizando O(f(n)) del recurso R, donde el tamaño n es la entrada.

01 (D Log Space): Son aquellos problemas que pueden ser resueltos por una
MT determinista utilizando una cantidad de espacio o memoria
logarítmicamente proporcional al tamaño de la entrada: log(n), donde n es el
01 Clase L tamaño de la entrada; en estos problemas si existe una solución es única.
02 (Nondeterministic Logarithmic space): Son los problemas de decisión que
02 Clase NL pueden ser resueltos en espacio log(n), por una MT no determinista tal que la
solución si existe es única.
03 Clase P 03 (Polynomial Time): Son todos aquellos problemas de decisión que pueden
ser resueltos por una MT determinista en un período de tiempo polinómico.
04 Clase NP Estos problemas son tratables, es decir se pueden resolver en tiempos
razonable; buena parte de los problemas de ordenamiento, priorización y
búsqueda caben dentro de esta clase.
04 NP (Non Deterministic Polynomial Time): Formalmente, es el conjunto de
problemas que pueden ser resueltos en tiempo polinómico por una MT no
determinista. Una definición más intuitiva es la siguiente: Es el conjunto de
los problemas de decisión para los cuales las instancias donde la respuesta es
“si” tienen demostraciones verificables por cálculos determinísticos en
tiempo polinómico.
 Clase NP-Completo: Estos problemas son NP, sus soluciones sus
soluciones son reducibles a NP en tiempo polinómico.
 Clase NP-Hard: Informalmente son aquellos problemas tan difíciles de
resolver como el más difícil de NP.

Ejemplo
1. Buscar en un diccionario tiene complejidad logarítmica. Se puede iniciar la búsqueda de una
palabra por la mitad del diccionario. Inmediatamente se sabe si se ha encontrado la palabra
o, en el caso contrario, en cuál de las dos mitades hay que repetir el proceso (es un proceso
recursivo) hasta llegar al resultado. En cada (sub)búsqueda el problema (las páginas en las
que la palabra puede estar) se ha reducido a la mitad, lo que se corresponde con la función
logarítmica. Este procedimiento de búsqueda (conocido como búsqueda binaria) en una
estructura ordenada tiene complejidad logarítmica O (ln n).
0910-17-1356
Kéller Eduardo Zapote Tún
Teoría de Autómatas y Lenguajes
Teoría de la Formales

Computabilidad

La Teoría de la Computabilidad es el estudio matemático de los modelos de computación.


Como tal estudio teórico, se originó en la década de los años 30 con los trabajos de los
lógicos Church, Gödel, Kleene, Post y Turing.
Téngase en cuenta que en aquellos años el avance tecnológico ni siquiera podía prever la
revolución que en la década de los 60 traerían los ordenadores, y sin embargo, conceptos
habituales hoy en día (computadores universales, programas como listas de instrucciones
de un lenguaje formal, intérpretes, ...) ya fueron definidos desde un punto de vista teórico
por esos matemáticos.
También denominada teoría de la recursión es una de las cuatro partes que constituyen la
lógica matemática, siendo las otras tres, la teoría de conjuntos, la teoría de modelos y la
teoría de la demostración, y se ocupa del estudio y clasificación de las relaciones y
aplicaciones computables.
Además, la teoría de la computabilidad, junto con la teoría de autómatas, lenguajes y
máquinas, es el fundamento de la informática teórica y esta, a su vez, de la industria de los
ordenadores. Desde tiempo inmemorial se sabe que cierta clase de problemas, e.g., la
determinación del máximo común divisor de dos números enteros, mediante el algoritmo
de Euclides, o la determinación de los números primos, mediante la criba de Eratóstenes,
son algorítmicamente solubles, i.e., hay algoritmos o procedimientos mecánicos que
permiten obtener la solución del problema en cuestión. De manera que hasta principios del
siglo XX se daba por hecho que existían algoritmos y que el único problema residía en
determinarlos.
0910-17-1356
Kéller Eduardo Zapote Tún
Teoría de Autómatas y Lenguajes
Teoría de la Computabilidad Formales

Problemas Computables y no
Computables

El identificar los problemas que son computables y los que no lo son tiene un considerable
interés, pues indica el alcance y los límites de la computabilidad, y así demuestra los límites
teóricos de los ordenadores. Además de las cuestiones sobre algoritmos, se han encontrado
numerosos problemas menos "generales" que han resultado ser no computables. La mayoría
de las demostraciones de no computabilidad se basan en el método de la diagonal. Como
ejemplos de estos problemas podemos citar:

Ejemplos de problemas computables y no computables

1. El problema de la palabra para Grupos. - Dado un subconjunto S de elementos de un


grupo G, se trata de decidir si una expresión compuesta por elementos de S y con las
operaciones del grupo es igual al elemento neutro del grupo. Durante muchos años
se buscaron ejemplos de grupos finitamente presentados para los que este problema
fuese indecidible. La existencia de uno de estos grupos fue encontrada por Novikov
en 1955 y por Boone en 1957. En el algebra moderna hay abundantes ejemplos de
interesantes problemas no computables; una gran cantidad de ellos sobre
propiedades de palabras o generadores semejantes al problema de la palabra para
grupos.

2. Décimo problema de Hilbert. Una ecuación diofántica es la ecuación de los ceros


enteros de un polinomio con coeficientes enteros. El décimo problema de Hilbert,
propuesto en 1900, pregunta si hay un procedimiento efectivo que determine si una
ecuación diofántica tiene o no solución. Y. Matiyasevich demostró en 1970 que este
problema no tiene solución.
3. Decibilidad de las teorías lógicas. El desarrollo de la teoría de la computabilidad ha ido
íntimamente ligado al desarrollo de la lógica matemática. Esto ha sido así porque la
decibilidad de los distintos sistemas lógicos es una cuestión fundamental. Es bastante
fácil ver que el cálculo proposicional es decidible. Church y Turing demostraron en
1936 que el cálculo de predicados no era decidible. Por otro lado, para cada una de
las distintas teorías se ha ido estudiando su posible decibilidad. Como ejemplo más
ilustrativo, Tarski demostró que la teoría de los números reales era decidible.

Por otro lado, son muchos los problemas interesantes que se han demostrado computables.
Todas las funciones construidas por recursividad primitiva o minimalización a partir de
funciones calculables resultan ser calculables como consecuencia de los trabajos de Church
y Turing.
0910-17-1356
Kéller Eduardo Zapote Tún
Teoría de Autómatas y Lenguajes
Formales

Problemas de
Decisión

La mayor parte de los problemas en teoría de la complejidad tienen que ver con los
problemas de decisión, que corresponden a poder dar una respuesta positiva o negativa a
un problema dado. Por ejemplo, el problema ES-PRIMO se puede describir como: Dado un
entero, responder si ese número es primo o no. Un problema de decisión es equivalente a
un lenguaje formal, que es un conjunto de palabras de longitud finita en un lenguaje dado.
Para un problema de decisión dado, el lenguaje equivalente es el conjunto de entradas para
el cual la respuesta es positiva.

Los problemas de decisión son importantes porque casi todo problema puede ser
transformado en un problema de decisión. Por ejemplo, el problema CONTIENE-FACTORES
descrito como: Dados dos enteros n y k, decidir si n tiene algún factor menor que k. Si se
puede resolver CONTIENE-FACTORES con una cierta cantidad de recursos, su solución se
puede utilizar para resolver FACTORIZAR con los mismos recursos, realizando una búsqueda
binaria sobre k hasta encontrar el más pequeño factor de n, luego se divide ese factor y se
repite el proceso hasta encontrar todos los factores.

En teoría de la complejidad, generalmente se distingue entre soluciones positivas o


negativas. Por ejemplo, el conjunto P se define como el conjunto de los problemas en donde
las respuestas positivas pueden ser verificadas muy rápidamente (es decir, en tiempo
polinómico). El conjunto Co-P es el conjunto de problemas donde las respuestas negativas
pueden ser verificadas rápidamente. El prefijo "Co" abrevia "complemento". El complemento
de un problema es aquel en donde las respuestas positivas y negativas están intercambiadas,
como entre ES-COMPUESTO y ES-PRIMO.
0910-17-1356
Kéller Eduardo Zapote Tún
Problemas de Decisión Teoría de Autómatas y Lenguajes
Formales

En teoría de la computación, 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». Un ejemplo típico de
problema de decisión es la pregunta: ¿Es un número entero dado primo? Una instancia de
este problema sería: ¿Es 17 primo?

Un problema de decisión también se puede formalizar como el problema de decidir si una


cierta frase pertenece a un conjunto dado de frases, también llamado lenguaje formal. El
conjunto contiene exactamente las frases para las cuales la respuesta a la pregunta es
positiva. La pregunta anterior sobre los números primos se puede ver también como el
lenguaje de todas las frases en el alfabeto {0, 1, ..., 9} tales que el entero correspondiente
es primo.

Si existe un algoritmo que pueda decidir para cada posible frase de entrada si esa frase
pertenece al lenguaje, entonces se dice que el problema es decidible, de otra forma se dice
que es un problema indecidible. Cuando existe un algoritmo que puede responder
positivamente cuando la frase está en el lenguaje, pero que corre indefinidamente cuando
la frase no pertenece al lenguaje se dice que el problema es parcialmente decidible. En
Teoría de la computabilidad, se estudia qué lenguajes son decidibles con diferentes tipos de
máquinas. En teoría de la complejidad computacional se estudia cuántos recursos necesita
un algoritmo decidible para ejecutar (recursos de tiempo, espacio, número de
procesadores, tipo de máquina, etc.).

Ejemplos
Esos son algunos ejemplos de problemas de decisión expresados como lenguajes:

 Las frases sobre el alfabeto {a, b} que contienen alternadas las letras a y b.

 Las frases sobre el alfabeto {a, b, c} que contienen igual número de letras a y b.

 Las frases que describen un grafo con aristas etiquetadas con números naturales que
indican su longitud, dos vértices del grafo y un camino en el grafo que es el camino
más corto entre esos dos vértices.
 Las frases que describen una máquina de Turing y una cinta de entrada para esta
máquina tal que la máquina separa en un tiempo finito al procesar esa entrada.

Los problemas de decisión son interesantes dado que todos los problemas matemáticos
pueden ser redactados para que tomen la forma de un problema de decisión. Las soluciones
al problema de decisión y al problema originales diferencian a lo sumo por un factor lineal.

También podría gustarte