Está en la página 1de 27

Teora de complejidad

Algortmica

jhersi saavedra garcia


UNIVERSIDAD POLITCNICA DE LA AMAZONA

Ao de la Diversificacin Productiva y del


Fortalecimiento de la Educacin.

CARRERA: Ingeniera de Sistemas y Telemtica.

TEMA:

CURSO: .

PROFESOR: .

CICLO:

1
UNIVERSIDAD POLITCNICA DE LA AMAZONA

INTRODUCCIN: En un sentido amplio, dado un problema y un dispositivo


donde resolverlo, es necesario proporcionar un mtodo preciso que lo resuelva,
adecuado al dispositivo. A tal mtodo lo denominamos algoritmo. En el presente
texto nos vamos a centrar en aspectos muy importantes de los algoritmos, como
son su diseo y el estudio de su eficiencia. El primero se refiere a la bsqueda
de mtodos o procedimientos, secuencias finitas de instrucciones adecuadas al
dispositivo que disponemos, que permitan resolver el problema. Por otra parte,
el segundo nos permite medir de alguna forma el coste (en tiempo y recursos)
que consume un algoritmo para encontrar la solucin y nos ofrece la posibilidad
de comparar distintos algoritmos que resuelven un mismo problema.

2
UNIVERSIDAD POLITCNICA DE LA AMAZONA

LA COMPLEJIDAD DE LOS ALGORITMOS


CONCEPTO DE COMPLEJIDAD DE ALGORITMOS.
El anlisis de algoritmo es una parte muy importante de la ciencia de la
computacin, de modo que la medida de la eficiencia de u algoritmo ser uno de
los factores fundamentales. Por consiguiente es importante poder analizar los
requisitos de tiempo y espacio de u algoritmo para ver si existe dentro de limites
aceptables.
Es difcil realizar un anlisis simple de un algoritmo que determine la cantidad
exacta de tiempo requerida para ejecutarlo. La primera complicacin es que la
cantidad exacta de tiempo depender de la implementacin del algoritmo y de la
maquina en que se ejecuta. El anlisis normalmente debe ser independiente del
lenguaje o mquina que se utilice para implementar el algoritmo. El anlisis del
algoritmo tratar de obtener el orden de magnitud de tiempo requerido para la
ejecucin del mismo y cada algoritmo tendr un coste computacional diferente.
La eficiencia es un criterio que se debe utilizar cuando se selecciona un algoritmo
y su implementacin. Existe al menos tres dificultades fundamentales que son
los siguientes:

Cmo se codifican los algoritmos?


Que computadoras utilizara?
Qu datos debe utilizar el programa?

El anlisis del a eficiencia debe ser independiente de las implementacin


especficas de la computadora y de los datos especficos que se manipulan. Pero
las consideraciones de eficiencia fundamentales son: el tiempo y el espacio. La
complejidad del espacio de un programa es la cantidad de memoria que se
necesita para ejecutar hasta la complecin (terminacin).
La complejidad del tiempo de un programa es la cantidad de tiempo de
computadora que se necesita para ejecutar hasta la complecin al considerar
estos dos aspectos podremos tener la medida exacta de tiempo y espacio del
3

cual necesitamos para realizar u buen anlisis de algoritmos.


UNIVERSIDAD POLITCNICA DE LA AMAZONA

Un algoritmo ser mas eficiente comparado con otro, siempre que consuma
menos recursos, como el tiempo y espacio de memoria necesarios para
ejecutarlo.

ARITMTICA DE LA NOTACIN O.

La notacin O (tambin llamada O mayscula), se utiliza para comparar la


eficiencia de los algoritmos.

Tipos de anlisis de la Notacin O

Peor caso (usualmente)


T(n) = Tiempo mximo necesario para un problema de tamao n.

Caso medio (a veces)


T(n) = Tiempo esperado para un problema cualquiera de tamao n.

Requiere establecer una distribucin estadstica

Mejor caso (engaoso)

Anlisis del peor caso

Cul es el tiempo que necesitara un algoritmo concreto?



o Vara en funcin del ordenador que utilicemos.
o Vara en funcin del compilador que seleccionemos.
o Puede variar en funcin de nuestra habilidad como
programadores.

IDEA: Ignorar las constantes dependientes del contexto.

SOLUCIN: Fijarse en el crecimiento de T(n) cuando n ->


4
UNIVERSIDAD POLITCNICA DE LA AMAZONA

NOTACIN O

O(g(n)) = { f(n) | Ec,n0 constantes positivas tales que f (n) = c g(n) A n = n0 }

En la prctica, se ignoran las constantes y los trminos de menor peso:


3n3 + 90n2 5n + 6046 = O (n3)

Eficiencia asinttica

Cuando n es lo suficientemente grande


Un algoritmo O (1), es ms eficiente que un algoritmo O (log n),
Un algoritmo O (log n), es ms eficiente que un algoritmo O(n),
Un algoritmo O(n), es ms eficiente que un algoritmo O(n log n),
Un algoritmo O(n log n), es mas eficiente que un algoritmo O (n2),
Un algoritmo O (n2), es ms eficiente que un algoritmo O(n3),
Un algoritmo O (n3), es ms eficiente que un algoritmo O (2n).

NOTA: En ocasiones, un algoritmo ms ineficiente puede resultar msadecuado


para resolver un problema real ya que, en a prctica, hay que tener en cuenta
otros aspectos adems de la eficiencia.

Propiedades de la notacin O

c O(f(n)) = O(f(n))
O (f(n)+g(n)) = max {O (f(n)), O (g(n))}
O (f(n)+g(n)) = O (f(n)+g(n))
O (f(n)) O (g(n)) = O (f(n) g(n))
O(O (f(n))) = O (f(n))
5
UNIVERSIDAD POLITCNICA DE LA AMAZONA

COMPLEJIDAD

El anlisis de complejidad se basa en la comparacin del tipo de ejecucin de


los algoritmos desarrollados para resolver un problema.
A partir del anlisis de complejidad se han definido varias clases de problemas:
los problemas que se resuelven en tiempo polinomial por una mquina
determinista forman la clase P y los problemas que se resuelven en tiempo
polinomial por una mquina no determinista forman la clase NP.
En computacin, al hablar de complejidad, no se est refiriendo a la dificultad
que se tendra para disear un programa, o a lo rebuscado de un algoritmo. La
teora de complejidad tiene que ver con dos medidas de desempeo: tiempo y
espacio.
La complejidad computacional de un problema es una medida de los recursos
computacionales (generalmente el tiempo) requeridos para resolver el problema.
La complejidad temporal tiene que ver con el tiempo que tarda un programa para
ejecutarse. La complejidad espacial estudia la cantidad de espacio de
almacenamiento que es necesario para una operacin.

Tiempo de Ejecucin de un Algoritmo

o El tiempo de ejecucin de un algoritmo, es prioritario cuando este es


analizado.
o El tiempo de Ejecucin de un programa se mide en funcin de N, lo
que designaremos como T(N).

o Esta funcin se puede calcular fsicamente ejecutando el programa


acompaados de un reloj, o calcularse directamente sobre el cdigo,
contando las instrucciones a ser ejecutadas y multiplicando por el
tiempo requerido por cada instruccin. As, un trozo sencillo de cdigo
como:
6
UNIVERSIDAD POLITCNICA DE LA AMAZONA

S1;
For (x = 0; x < N; x++)
S2;
Demanda: T(N) = t1 + t2 * N
Donde t1 es el tiempo que lleva ejecutar la serie S1 de
sentencias, y t2 es el que lleva la serie S2.

o Habitualmente todos los algoritmos contienen alguna sentencia


condicional o selectiva, haciendo que las sentencias ejecutadas
dependan de la condicin lgica, esto hace que aparezca ms de un
valor para T(N), es por ello que debemos hablar de un rango de valores:

Tmin(N) T(N) Tmax(N)

o Estos extremos son llamados el peor caso" y "el mejor caso" y entre
ambos se puede hallar el caso promedio o el ms frecuente,
siendo este el ms difcil de estudiar; nos centraremos en el el
peor caso" por ser de fcil clculo y se acerca a el caso
promedio, brindndonos una medida pesimista pero fiable.

o Toda funcin T(N) encierra referencias al parmetro N, y a una serie


de constantes Ti dependientes de factores externos al
algoritmo. Se tratar de analizar los algoritmos dndoles
autonoma frente a estos factores externos, buscando
estimaciones generales ampliamente vlidas, a pesar de ser
demostraciones tericas.

o El tiempo de ejecucin de un algoritmo o estructura de datos depende


de varios factores relativos al hardware (procesador, reloj, memoria,
disco, etc) y el software (sistema operativo, lenguaje, compilador, etc.).
o Interesa hallar la dependencia del tiempo de ejecucin en funcin
del tamao de la entrada.
o Un mtodo para estudiar el tiempo de ejecucin es la experimentacin,
que tiene limitaciones:
7
UNIVERSIDAD POLITCNICA DE LA AMAZONA

1.-Los experimentos se pueden hacer sobre un conjunto


limitado de entradas de prueba.
2.-Es necesario realizar los experimentos con el mismo
hardware y software.
3.-Es necesario implementar y ejecutar el algoritmo.

Adicionalmente a la experimentacin conviene disponer de un enfoque analtico


que:
Tome en consideracin todas las posibles entradas.
Permita evaluar la eficiencia de dos algoritmos de forma independiente del
hardware y software.
Se pueda realizar estudiando una representacin de alto nivel del algoritmo sin
necesidad de implementarlo.

COMPLEJIDAD EN ESPACIO O ESPACIAL

Memoria que utiliza un programa para su ejecucin, La eficiencia en memoria de


un algoritmo indica la cantidad de espacio requerido para ejecutar el algoritmo;
es decir, el espacio en memoria que ocupan todas las variables propias al
algoritmo. Para calcular la memoria esttica de un algoritmo se suma la memoria
que ocupan las variables declaradas en el algoritmo. Para el caso de la memoria
dinmica, el clculo no es tan simple ya que, este depende de cada ejecucin
del algoritmo.

Este anlisis se basa en las Complejidades Temporales, con este fin, para cada
problema determinaremos una medida N, que llamaremos tamao de la entrada
o nmero de datos a procesar por el programa, intentaremos hallar respuestas
en funcin de dicha N.
El concepto exacto que cuantifica N depender de la naturaleza del problema, si
hablamos de un array se puede ver a N como el rango del array, para una matriz,
el nmero de elementos que la componen; para un grafo, podra ser el nmero
de nodos o arcos que lo arman, no se puede establecer una regla para N, pues
cada problema acarrea su propia lgica y complejidad.
8
UNIVERSIDAD POLITCNICA DE LA AMAZONA

SELECCIN DE UN ALGORITMO

La seleccin del mejor algoritmo para el problema dado; en la prctica las


cosas no son tan fciles y en ocasiones no es tan obvio poder escoger un
algoritmo entre un grupo, pues la cantidad de operaciones no siempre es el
nico criterio a tener en cuenta. Tambin debe considerarse, por ejemplo, el
tamao del algoritmo, la claridad con que est expresado, etc.
- Finalidad.-Todo algoritmo tiene el objetivo o una finalidad de resolver un tipo
de problema y se ejecuta para obtener un resultado que es la solucin de un
caso particular de ese problema.

- Orden.-Los pasos del algoritmo tienen que ejecutarse en un orden preciso e


indicado en el algoritmo. Si este orden se altera, generalmente no se obtiene el
resultado deseado.

- Finitud.-El algoritmo tiene que ser finito en tres aspectos:

a. El algoritmo es una secuencia finita de pasos (no tiene sentido


ninguno un algoritmo cuya descripcin sea infinitamente larga)
b. La ejecucin del algoritmo termina despus de concluir un
nmero finito de pasos Ntese que este aspecto es diferente al
anterior, pues podra tenerse una cantidad pequea de pasos
en la definicin que se ejecutara repetidamente un nmero
infinito de veces. Por ejemplo: dividir un nmero racional mayor
que 0 por dos repetidamente hasta que el cociente sea cero.
c. La ejecucin de un paso cualquiera del algoritmo tiene que poder
ejecutarse en un tiempo finito.
9
UNIVERSIDAD POLITCNICA DE LA AMAZONA

EFICIENCIA Y COMPLEJIDAD. Una vez dispongamos de un algoritmo que


funciona correctamente, es necesario definir criterios para medir su rendimiento
o comportamiento. Estos criterios se centran principalmente en su simplicidad y
en el uso eficiente de los recursos. A menudo se piensa que un algoritmo sencillo
no es muy eficiente. Sin embargo, la sencillez es una caracterstica muy
interesante a la hora de disear un algoritmo, pues facilita su verificacin, el
estudio de su eficiencia y su mantenimiento. De ah que muchas veces prime la
simplicidad y legibilidad del cdigo frente a alternativas ms crpticas y eficientes
del algoritmo. Este hecho se pondr de manifiesto en varios de los ejemplos
mostrados a lo largo de este libro, en donde profundizaremos ms en este
compromiso. Respecto al uso eficiente de los recursos, ste suele medirse en
funcin de dos parmetros: el espacio, es decir, memoria que utiliza, y el tiempo,
lo que tarda en ejecutarse. Ambos representan los costes que supone encontrar
la solucin al problema planteado mediante un algoritmo. Dichos parmetros van
a servir adems para comparar algoritmos entre s, permitiendo determinar el
ms adecuado de entre varios que solucionan un mismo problema. En este
captulo nos centraremos solamente en la eficiencia temporal. El tiempo de
ejecucin de un algoritmo va a depender de diversos factores como son: los
datos de entrada que le suministremos, la calidad del cdigo generado por el
compilador para crear el programa objeto, la naturaleza y rapidez de las
instrucciones mquina del procesador concreto que ejecute el programa, y la
complejidad intrnseca del algoritmo. Hay dos estudios posibles sobre el tiempo:

1. Uno que proporciona una medida terica (a priori), que consiste en obtener
una funcin que acote (por arriba o por abajo) el tiempo de ejecucin del
algoritmo para unos valores de entrada dados.

2. Y otro que ofrece una medida real (a posteriori), consistente en medir el tiempo
de ejecucin del algoritmo para unos valores de entrada dados y en un ordenador
concreto.
Ambas medidas son importantes puesto que, si bien la primera nos ofrece
estimaciones del comportamiento de los algoritmos de forma independiente del
10

ordenador en donde sern implementados y sin necesidad de ejecutarlos, la


UNIVERSIDAD POLITCNICA DE LA AMAZONA

segunda representa las medidas reales del comportamiento del algoritmo. Estas
medidas son funciones temporales de los datos de entrada. Entendemos por
tamao de la entrada el nmero de componentes sobre los que se va a ejecutar
el algoritmo. Por ejemplo, la dimensin del vector a ordenar o el tamao de las
matrices a multiplicar. La unidad de tiempo a la que debe hacer referencia estas
medidas de eficiencia no puede ser expresada en segundos o en otra unidad de
tiempo concreta, pues no existe un ordenador estndar al que puedan hacer
referencia todas las medidas. Denotaremos por T(n) el tiempo de ejecucin de
un algoritmo para una entrada de tamao n. Tericamente T(n) debe indicar el
nmero de instrucciones ejecutadas por un ordenador idealizado. Debemos
buscar por tanto medidas simples y abstractas, independientes del ordenador a
utilizar. Para ello es necesario acotar de alguna forma la diferencia que se puede
producir entre distintas implementaciones de un mismo algoritmo, ya sea del
mismo cdigo ejecutado por dos mquinas de distinta velocidad, como de dos
cdigos que implementen el mismo mtodo. Esta diferencia es la que acota el
siguiente principio:

PRINCIPIO DE INVARIANCIA
Dado un algoritmo y dos implementaciones I1 y I2 (mquinas distintas o cdigos
distintos) que tardan T1(n) y T2(n) respectivamente, el principio de invarianza
afirma que existe una constante real c>0 y un nmero natural n0 tales que para
todo n>=n0 se verifica que T1(n)<=cT2(n).

Es decir, el tiempo de ejecucin de dos implementaciones distintas de un


algoritmo dado no va a diferir ms que en una constante multiplicativa.

Asumimos que un algoritmo tarda un tiempo del orden de T(n) si existen una
constante real c>0 y una implementacin I del algoritmo que tarda menos que
cT(n), para todo n tamao de entrada.

El comportamiento de un algoritmo puede variar notablemente para diferentes


11

secuencias de entrada. Suelen estudiarse tres casos para un mismo algoritmo:


caso mejor, caso peor, caso medio.
UNIVERSIDAD POLITCNICA DE LA AMAZONA

ANLISIS PEOR CASO, MEJOR CASO Y CASO PROMEDIO


Puede analizarse un algoritmo particular o una clase de ellos. Una clase de
algoritmo para un problema son aquellos algoritmos que se pueden clasificar por
el tipo de operacin fundamental que realizan.

Ejemplo:

Problema: Ordenamiento

Clase: Ordenamiento por comparacin

Para algunos algoritmos, diferentes entradas (inputs) para un tamao dado


pueden requerir diferentes cantidades de tiempo. Por ejemplo, consideremos el
problema de encontrar la posicin particular de un valor K, dentro de un arreglo
de n elementos. Suponiendo que slo ocurre una vez. Comentar sobre el mejor,
peor y caso promedio.

Cul es la ventaja de analizar cada caso? Si examinamos el peor de los


casos, sabemos que al menos el algoritmo se desempear de esa forma.

En cambio, cuando un algoritmo se ejecuta muchas veces en muchos tipos de


entrada, estamos interesados en el comportamiento promedio o tpico.
Desafortunadamente, esto supone que sabemos cmo estn distribuidos los
datos.

Si conocemos la distribucin de los datos, podemos sacar provecho de esto,


para un mejor anlisis y diseo del algoritmo. Por otra parte, sino conocemos la
distribucin, entonces lo mejor es considerar el peor de los casos.

Tipos de anlisis:

Peor caso: indica el mayor tiempo obtenido, teniendo en consideracin


todas las entradas posibles.
Mejor caso: indica el menor tiempo obtenido, teniendo en consideracin
todas las entradas posibles.
Media: indica el tiempo medio obtenido, considerando todas las entradas
12

posibles.
UNIVERSIDAD POLITCNICA DE LA AMAZONA

Como no se puede analizar el comportamiento sobre todas las entradas posibles,


va a existir para cada problema particular un anlisis en l:

- peor caso

- mejor caso
- caso promedio (o medio)
El caso promedio es la medida ms realista de la performance, pero es ms difcil
de calcular pues establece que todas las entradas son igualmente probables, lo
cual puede ser cierto o no. Trabajaremos especficamente con el peor caso.

EJEMPLO
Sea A una lista de n elementos A1, A2, A3, ... , An. Ordenar significa permutar
estos elementos de tal forma que los mismos queden de acuerdo con un orden
preestablecido.

Ascendente A1<=A2<=A3..........<=An

Descendente A1>=A2>=........>=An

Caso peor: Que el vector est ordenado en sentido inverso.

Caso mejor: Que el vector est ordenado.

Caso medio: Cuando el vector est desordenado aleatoriamente.

COMPLEJIDAD ALGORTMICA: Es difcil realizar un anlisis simple de un


algoritmo que determine la cantidad exacta de tiempo que este requiere para ser
ejecutado, porque depende en gran parte del algoritmo y de la computadora en
que se ejecute. Adems, conocer el tiempo exacto que tardar un programa de
cmputo en dar resultados es una tarea difcil de determinar. En su lugar, es
mejor calcular la cantidad de operaciones que se realizan de acuerdo con los
datos de entrada del problema a tratar, lo que se conoce como clculo de la
funcin temporal. As, una vez que se cuenta con un algoritmo que funciona de
manera idnea, es necesario definir los criterios que permitan medir su
rendimiento o comportamiento. Estos deben considerar el uso eficiente de los
13

recursos y la simplicidad del algoritmo. El que sea sencillo no le demerita calidad,


UNIVERSIDAD POLITCNICA DE LA AMAZONA

ya que su simplicidad facilita su mantenimiento, su verificacin y su eficiencia. Al


hablar del uso eficiente de los recursos, este puede medirse en funcin de dos
indicadores: espacio (cantidad de memoria que utiliza) y tiempo (lo que tarda en
ejecutarse). Si para resolver un problema P un algoritmo A requiere de poca
memoria del equipo de cmputo o ejecuta un pequeo nmero de instrucciones
comparado con el resto de los algoritmos conocidos que resuelven P, entonces
se puede afirmar que A es ms eficiente que los restantes cuando se resuelve
P. Un programa es eficiente si su costo es mnimo en cuanto a: El costo espacial
(espacio), que es la medida de la cantidad de memoria necesaria para ejecutarlo
hasta su trmino. El costo temporal (tiempo), que es una medida del tiempo
empleado por el programa para ejecutarse y dar resultado a partir de los datos
de entrada, y que considera una aproximacin al nmero de pasos de ejecucin
que el algoritmo emplea para resolver un problema. As, el rendimiento de un
programa se mide con dos variables: la memoria ocupada y el tiempo de
ejecucin. Cuando un clculo necesita ms tiempo que otro se dice que es ms
complejo, y se le llama a esto complejidad temporal; si requiere ms espacio que
otro es complejidad espacial.

MEMORIA OCUPADA: La eficiencia de la memoria o complejidad espacial de


un algoritmo muestra la cantidad de memoria que ocupan todas las variables
utilizadas por este, es decir, la suma del almacenamiento necesario para
ejecutarlo, que est constituida por la memoria esttica y la memoria dinmica.
Para el clculo de la memoria esttica solo hay que sumar la memoria ocupada
por cada una de las variables declaradas en el algoritmo. El clculo de la
memoria dinmica depende de la ejecucin del algoritmo y puede ser liberada,
se modifica de forma permanente; concretamente, es un espacio de
almacenamiento que se solicita en el tiempo de ejecucin. La complejidad en
funcin de la memoria utilizada radica en el consumo del espacio de esta en la
computadora. Un problema con costo espacial elevado gastar una cantidad de
memoria con incremento exponencial conforme el problema aumente en tamao,
pues el nmero de variables a utilizar tambin aumentar. Esto en algn
14
UNIVERSIDAD POLITCNICA DE LA AMAZONA

momento causara que el algoritmo no se realice correctamente por falta de


memoria en la computadora.

TIEMPO DE EJECUCIN: La complejidad temporal de un algoritmo


computacional se evala generando una funcin, llamada funcin temporal, la
cual define el nmero de instrucciones ejecutadas por el programa cuando se
resuelve un problema. De este nmero de instrucciones se puede obtener el
tiempo aproximado si se conoce el tiempo que el equipo de cmputo en uso tarda
en ejecutar una instruccin. De esa manera se puede representar el nmero de
unidades de tiempo requeridas para que un programa o algoritmo de cualquier
entrada de datos de tamao n produzca un resultado. El tiempo de ejecucin de
un algoritmo depende del nmero de datos de entrada n del problema y de la
velocidad que el equipo de cmputo posea.

La complejidad temporal se expresa normalmente utilizando la notacin O, o


de la O grande, con la cual se dispone de un medio para expresar la cota
asinttica de una funcin en el peor de los casos. El trmino asinttico se refiere
al tamao de la entrada del problema, en este caso, para un valor de n grande.
El peor de los casos indica cuando el algoritmo lleva a cabo el total de las
instrucciones que este puede ejecutar. Es una expresin aproximada de la
relacin entre el tamao de un problema y la cantidad de instrucciones
necesarias en el algoritmo para obtener un resultado. El ejemplo en la tabla 1 es
una muestra de un anlisis detallado que debe realizarse en una serie de
instrucciones que se aplican en un algoritmo computacional para resolver un
problema. Para evaluar la eficiencia de los algoritmos se requiere evaluar su
complejidad, y el beneficio de hacerlo es que se puede trabajar en el anlisis
para el diseo de un algoritmo que pueda tener mejor calidad y eficiencia.
15
UNIVERSIDAD POLITCNICA DE LA AMAZONA

Joyanes y Zahonero presentan los siete tipos de complejidades ms comunes,


las cuales se muestran en la tabla 2.
COMPLEJIDAD DE PROBLEMAS: La teora de la complejidad estudia la
manera de clasificar problemas de acuerdo con la dificultad propia para
resolverlos, basndose en los recursos necesarios y requeridos para establecer
su grado de complejidad. Un clculo resulta complejo si es difcil de realizar. Se
puede definir complejidad como la cantidad de recursos necesarios para
efectuar un clculo. Si este es complicado, requerir de ms recursos que uno
de menor dificultad. Un algoritmo que puede resolver un problema pero que se
tarda mucho tiempo en hacerlo, no es muy til; la misma consideracin si ocupa
un gigabyte o memoria en exceso. Pero la tarea de encontrar un algoritmo que
resuelva con pocos recursos un problema, no es lo que realmente importa; el
inconveniente es saber si existe una solucin o no a esta problemtica
presentada y qu tan compleja resultar su solucin. Para saber el grado de
complejidad que puede tener un problema, nos apoyamos en el modelo
computacional de la mquina de Turing, con el cual se obtiene una clasificacin
de los problemas con base en el grado de complejidad inherente para
resolverlos.

LA MQUINA DE TURING
Alan Turing, en 1936 desarroll su Mquina de Turing (la cual se cubre en los
cursos denominados Teora de la Computacin o Teora de Automtas),
16

estableciendo que cualquier algoritmo puede ser representado por ella.


UNIVERSIDAD POLITCNICA DE LA AMAZONA

Turing mostr tambin que existen problemas matemticos bien definidos para
los cuales no hay un algoritmo. Hay muchos ejemplos de problemas para los
cuales no existe un algoritmo. Un problema de este tipo es el llamado problema
de paro (halting problem): Dado un programa de computadora con sus entradas,
parar este alguna vez?

Turing prob que no hay un algoritmo que pueda resolver correctamente todas
las instancias de este problema.

Alguien podra pensar en encontrar algunos mtodos para detectar patrones que
permitan examinar el programa para cualquier entrada. Sin embargo, siempre
habr sutilezas que escapen al anlisis correspondiente.

Alguna persona ms suspicaz, podra proponer simplemente correr el programa


y reportar xito si se alcanza una declaracin de fin. Desgraciadamente, este
esquema no garantiza por s mismo un paro y en consecuencia el problema no
puede ser resuelto con los pasos propuestos. Como consecuencia de acuerdo
con la definicin anterior, ese ltimo procedimiento no es un algoritmo, pues no
se llega a una solucin.

Muchas veces aunque exista un algoritmo que pueda solucionar correctamente


cualquier instancia de un problema dado, no siempre dicho algoritmo es
satisfactorio porque puede requerir de tiempos exageradamente excesivos para
llegar a la solucin.

El modelo computacional de Turing clasifica los problemas por el grado de


complejidad para resolverlos. A travs de este modelo se han detectado
problemas intratables, clasificados como NP (nondeterministic polynomial time),
que se piensa son imposibles de resolver en un tiempo razonable cuando el
nmero de variables que los componen es una cantidad extremadamente
grande. Este grupo incluye problemas como el del agente viajero, el de la
mochila, el transporte, la asignacin de horarios para cursos universitarios o la
asignacin de maquinaria en talleres de manufactura. Dentro de este grupo de
17

problemas NP se encuentran dos subconjuntos de problemas:


UNIVERSIDAD POLITCNICA DE LA AMAZONA

Problemas P, para los cuales existe una mquina de Turing determinista que los
puede resolver en tiempo polinmico. Esto indica que existe un algoritmo
determinista con complejidad polinomial que los puede resolver. Se consideran
como la clase de problemas de reconocimiento relativamente sencillos, aquellos
para los que existen algoritmos eficientes o exactos.

Los NP-completos. No existe una mquina de Turing determinista que pueda


resolverlos en tiempo polinmico. En su lugar, se puede encontrar un valor
prximo a la solucin del problema mediante una mquina de Turing no
determinista acotando polinomialmente el tiempo. Estos problemas NP son
aquellos cuya solucin, hasta la fecha, no se ha resuelto de manera exacta por
medio de algoritmos deterministas en tiempo polinomial. En su lugar, se tratan
de resolver por algoritmos no deterministas acotados en tiempo polinomial, cuya
solucin deseable sea de complejidad polinomial. Esta clase de algoritmos se
conoce como heursticas computacionales (en la figura 1 se muestra la
diferencia entre una solucin obtenida en tiempo polinomial y una en tiempo
exponencial).

Acerca de por qu los problemas P estn incluidos dentro de los considerados


difciles de resolver NP, esto es porque los algoritmos no determinsticos usados
para los problemas NP y NP-completo, tambin pueden usarse en los problemas
P; pero no es posible, en caso contrario, que un algoritmo determinstico que
resuelva un problema P en tiempo polinomial, tambin pueda resolver un NP.13
De ser esto cierto, entonces tendramos que P=NP.14 La relacin entre la clase
P y la clase NP es estrecha: P NP. Cualquier problema de decisin P resuelto
por un algoritmo determinstico en tiempo polinomial, tambin puede ser resuelto
por un algoritmo no determinstico en el mismo tiempo.
18
UNIVERSIDAD POLITCNICA DE LA AMAZONA

Figura 1.Comportamiento de Soluciones en


Tiempo polinomial y exponencial

La figura 2 muestra la clasificacin de los problemas con base en la complejidad


para resolverlos, a partir del modelo de Turing. El esfuerzo necesario para
resolver un problema de forma eficiente puede variar enormemente. Un
problema muy complejo se denomina NPcompleto si su solucin requiere de
una cantidad significativa de recursos computacionales sin importar el algoritmo
utilizado, lo cual significa que es imposible encontrar un algoritmo eficiente que
compruebe que se alcanz la mejor solucin.

Figura 2.Clasificacion de los problemas


NP
19
UNIVERSIDAD POLITCNICA DE LA AMAZONA

De ah el uso de algoritmos heursticos no determinsticos acotados en tiempo


polinomial para este tipo de problemas. El impacto de esta teora en la
investigacin computacional es significativo porque permite determinar el grado
de complejidad de un problema para ser resuelto, as como saber si se puede
encontrar un algoritmo eficiente para el problema, o bien, tratarlo por el camino
de las heursticas. De acuerdo con la teora de la complejidad y apoyndose en
la figura 1, si el problema se puede clasificar como P, entonces se podra hacer
uso, encontrar o desarrollar algoritmos eficientes que comprueben si obtienen la
mejor solucin para dicho problema. En caso de que el problema estuviera
clasificado como NP o NP-completo, entonces se perdera el tiempo tratando de
encontrar algoritmos eficientes. En lugar de eso, el camino ms adecuado es
trabajar con heursticas computacionales, por lo que solo quedara tratar de
proponer nuevas heursticas de baja complejidad. En el mbito internacional, se
han enfocado al estudio de la complejidad computacional investigadores como
Gilbert Laporte, en Francia; Christos H. Papadimitriou, en Grecia; Kenneth
Steiglitz, en Estados Unidos, entre otros. En la UAEM, el Cuerpo Acadmico de
Optimizacin y Software16 ha diseado y aplicado heursticas computacionales
en las cuales la teora de la complejidad ha permitido que los algoritmos
propuestos sean eficientes en cuanto al uso de recursos. Con ello se han
obtenido soluciones para problemas planteados en tiempos computacionales
rpidos y aceptables para el uso que se les da. Tal es el caso del problema de
ruteo vehicular con ventanas de tiempo, asignacin y calendarizacin de tareas
en mquinas en un taller de manufactura, asignacin de tareas en mquinas
paralelas, entre otros, para los cuales ya se han diseado o mejorado heursticas
computacionales que permiten obtener buenas soluciones. Otro campo de
trabajo es el del diseo de algoritmos cuya complejidad permita la solucin
eficiente y eficaz de problemas, en el cual se han retomado otras investigaciones
novedosas.
20
UNIVERSIDAD POLITCNICA DE LA AMAZONA

El tamao
Para cada problema determinaremos un medida N de su tamao (por nmero de
datos) e intentaremos hallar respuestas en funcin de dicho N. El concepto exacto
que mide N depende de la naturaleza del problema. As, para un vector se suele
utilizar como N su longitud; para una matriz, el nmero de elementos que la
componen; para un grafo, puede ser el nmero de nodos (a veces es mas
importante considerar el nmero de arcos, dependiendo del tipo de problema a
resolver); en un fichero se suele usar el nmero de registros, etc. Es imposible dar
una regla general, pues cada problema tiene su propia lgica de coste.
Recursos
A efectos prcticos o ingenieriles, nos deben preocupar los recursos fsicos
necesarios para que un programa se ejecute. Aunque puede haber muchos
parmetros, los mas usuales son el tiempo de ejecucin y la cantidad de memoria
(RAM). Ocurre con frecuencia que ambos parmetros estn fijados por otras
razones y se plantea la pregunta inversa: cual es el tamao del mayor problema
que puedo resolver en T segundos y/o con M bytes de memoria?
En lo que sigue usaremos esta notacin
tiempo de ejecucin en funcin del tamao n del problema
espacio (RAM) en funcin del tamao n del problema
En lo que sigue nos centraremos casi siempre en tiempo de ejecucin, si bien las
ideas desarrolladas son fcilmente aplicables a otro tipo de recursos.
Tiempo de ejecucin
Una medida que suele ser til conocer es el tiempo de ejecucin de un programa en
funcin de N, lo que denominaremos T(N). Esta funcin se puede medir fsicamente
(ejecutando el programa, reloj en mano), o calcularse sobre el cdigo contando
instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instruccin.
As, un trozo sencillo de programa como
S1;
for (i= 0; i < N; i++)
S2;
Requiere
T(N) = t1 + t2*N
21
UNIVERSIDAD POLITCNICA DE LA AMAZONA

Siendo t1 el tiempo que lleve ejecutar la serie "S1" de sentencias, y t2 el que lleve
la
serie "S2".
Prcticamente todos los programas reales incluyen alguna sentencia condicional,
Haciendo que las sentencias efectivamente ejecutadas dependan de los datos
concretos que se le presenten. Esto hace que mas que un valor T(N) debamos
hablar de un rango de valores
Tmin(N) = T(N) = Tmax(N)
los extremos son habitualmente conocidos como "caso peor" y "caso mejor". Entre
ambos se hallara algn "caso promedio" o ms frecuente. Cualquier frmula T(N)
incluye referencias al parmetro N y a una serie de constantes "Ki" que dependen
de factores externos al algoritmo como pueden ser la calidad del cdigo generado
por el compilador y la velocidad de ejecucin de instrucciones del ordenador que lo
ejecuta. Dado que es fcil cambiar de compilador y que la potencia de
los ordenadores crece a un ritmo vertiginoso , intentaremos analizar los algoritmos
con algn nivel de independencia de estos factores; es decir, buscaremos
estimaciones generales ampliamente vlidas.
Asntotas

Por una parte necesitamos analizar la potencia de los algoritmos


independientemente de la potencia de la mquina que los ejecute e incluso de la
habilidad del programador que los codifique. Por otra, este anlisis nos interesa
especialmente cuando el algoritmo se aplica a problemas grandes. Casi siempre
los problemas pequeos se pueden resolver de cualquier forma, apareciendo las
limitaciones al atacar problemas grandes. No debe olvidarse que cualquier tcnica
de ingeniera, si funciona, acaba aplicndose al problema ms grande que sea
posible: las tecnologas de xito, antes o despus, acaban llevndose al lmite de
sus posibilidades.
Las consideraciones anteriores nos llevan a estudiar el comportamiento de un
algoritmo cuando se fuerza el tamao del problema al que se aplica.
Matemticamente hablando, cuando N tiende a infinito. Es decir, su comportamiento
asinttico.
22

2 Metodologa
UNIVERSIDAD POLITCNICA DE LA AMAZONA

Para enfocar la comparacin de algoritmos seguiremos los siguientes pasos:


1. Averiguar la funcin f(n) que caracteriza los recursos requeridos por un
algoritmo en funcin de tamao n de los datos a procesar.
2. Dadas dos funciones f(n) y g(n) definir una relacin de orden entre ellas que
llamaremos complejidad y que nos dir cundo una funcin es ms compleja
que la otra o cundo son equivalentes.
3. Seleccionar una serie de funciones de referencia para situaciones tpicas.
4. Definir conjuntos de funciones que llamaremos rdenes de complejidad.
Paso 1 funcin caracterstica
Decidimos cmo medir N.
Decidimos el recurso que nos interesa
tiempo de ejecucin = f(N)
memoria necesaria = f(N)
A partir de aqu analizaremos f(n).
Como veremos ms adelante, calcular la frmula analtica exacta que caracteriza un
algoritmo puede ser bastante laborioso.
Con frecuencia nos encontraremos con que no es necesario conocer el
comportamiento exacto, sino que basta conocer una cota superior, es decir, alguna
funcin que se comporte "an peor". De esta forma podremos decir que el programa
prctico nunca superar una cierta cota.
Paso 2 complejidad
Dadas dos funciones f(n) y g(n) diremos que f(n) es ms compleja que g(n) cuando

()
lim ( )=
()

Diremos que f(n) es menos compleja que g(n) cuando


()
lim ( )=0
()

Y diremos que f(n) es equivalente a g(n) cuando


()
lim ( )=
23

()
UNIVERSIDAD POLITCNICA DE LA AMAZONA

Siendo K 0 y K 8
Ntese que esta definicin nos permite un anlisis algortmico conociendo la
Formulacin de la funcin, y tambin un anlisis experimental observando los
recursos consumidos para valores crecientes de N.
Paso 3 funciones de referencia
Se suelen manejar las siguientes

f(n) = 1 constante

f(n) = log (n) logaritmo

f(n) = n lineal

f(n) = n log(n)
f(n) = cuadrtica

f(n) = polinomio (de grado a > 2)

f(n) = exponencial (a > 2)

f(n) = n! Factorial

Por qu estas y no otras? Simplemente porque (1) son sencillas y (2) la


experiencia
Paso 4 rdenes de complejidad
A un conjunto de funciones que comparten un mismo comportamiento asinttico
le denominaremos un orden de complejidad. Habitualmente estos conjuntos se
denominan O, existiendo una infinidad de ellos; pero nos centraremos en unos
pocos de uso frecuente.
Para cada uno de estos conjuntos se suele identificar un miembro f(n) que se
utiliza como representante de la clase.
24
UNIVERSIDAD POLITCNICA DE LA AMAZONA

conjuntos u rdenes de complejidad

O (1) orden constante

O (log n) orden logartmico

O (n) orden lineal

O (n log n)

O ( ) orden cuadrtico

O ( ) orden polinomial (a > 2)

O ( ) orden exponencial (a > 2)

O (n!) orden factorial

La definicin matemtica de estos conjuntos debe ser muy cuidadosa para


involucrar los dos aspectos antes comentados:

superior de otras funciones menos malas.


Dcese que el conjunto O(f(n)) es el de las funciones de orden de f(n), que se
define

tales que existen las constantes K y M


25
UNIVERSIDAD POLITCNICA DE LA AMAZONA

26

También podría gustarte