Sei sulla pagina 1di 11

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

TEMA 2 Complejidad de algoritmos iterativos

Objetivos del tema


Identificar los recursos consumidos por un algoritmo y los distintos factores que afectan a este consumo. Distinguir los distintos tiempos de ejecucin que se utilizan en el estudio de algoritmos: caso mejor, peor y promedio. Aprender la tcnica bsica de estudio terico de algoritmos: anlisis del tiempo por conteo de instrucciones. Diferenciar claramente el concepto de tiempo de ejecucin de una ejecucin particular del de complejidad de un algoritmo. Conocer las notaciones de complejidad O (orden), , y o (o-pequea), diferenciando claramente el significado y utilidad de cada una. Saber calcular (y reconocer intuitivamente) la complejidad algortmica de una gama amplia de algoritmos Saber comparar las complejidades de distintas funciones Conocer la complejidad de las funciones que aparecen ms frecuentemente en el estudio de algoritmos, as como la relacin entre las complejidades de estas funciones.

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

1. Introduccin
Algoritmo: Conjunto de reglas para resolver un problema. Su ejecucin consume recursos.

Eficiencia: Relacin entre los recursos que consume un algoritmo y los resultados que obtiene. Recursos consumidos Tiempo de ejecucin Memoria principal Entradas/salidas a disco Comunicaciones, procesadores, Objetivo: Maximizar la eficiencia Factores que influyen en el consumo de recursos: Factores externos: o el ordenador donde se ejecute o el lenguaje de programacin y el compilador usado o la implementacin que haga el programador del algoritmo. En particular, las estructuras de datos utilizadas Tamao de los datos de entrada. Magnitud(es) que al aumentar incrementa la complejidad del algoritmo. o Valor del nmero, nmero de elementos, dimensiones de matrices, Contenidos de los datos de entrada. En funcin de cules sean los datos de entrada se ejecutarn o no determinadas instrucciones de decisin y ser distinto el nmero de iteraciones de los bucles El problema se resolver en ms o menos tiempo. o Mejor caso (tm(n)). El contenido favorece una rpida ejecucin o Peor caso (tp(n)). La ejecucin ms lenta posible o Caso promedio (t1/2(n)). Media de todos los posibles contenidos Resultados obtenidos Resolver un problema de forma exacta Resolverlo de forma aproximada Resolver algunos casos

Principio de invarianza: Dos implementaciones de un mismo algoritmo no diferirn ms que en una constante multiplicativa. Si f1(n) y f2(n) son los tiempos consumidos por dos implementaciones de un mismo algoritmo, se verifica que c,d R tal que: f1(n) cf2(n) f2(n) df1(n) Los factores externos no aportan informacin sobre el algoritmo. El estudio se hace en funcin del tamao de la entrada y, quiz, del contenido de la entrada.

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

El tiempo de ejecucin se mide en unidades de tiempo desde que empieza la ejecucin del programa hasta que se obtienen los resultados, y se denota como t(n), con t una funcin t: N R+, y tamao de la entrada n. Consideremos dos algoritmos distintos para un mismo problema: Algoritmo 1: t(n) = 10-42n s n t(n) 10 0,1 s 20 2m 30 >1 da 38 1 ao

Algoritmo 2: t(n) = 10-2n3 s n t(n) 200 1 da 1000 1 ao

Si no se puede estimar el tiempo, se puede intentar acotarlo o calcular la forma en que crece. El tiempo en el mejor caso sirve como cota inferior del tiempo de ejecucin. El tiempo en el caso ms desfavorable sirve como cota superior. Errores comunes El mejor caso no es tener el menor tamao posible en la entrada sino, dado un tamao de entrada fijo, cul es el contenido de los datos que necesita un menor tiempo de ejecucin, aun para tamaos grandes. El tiempo promedio no es la media de los tiempos ms favorable y ms desfavorable, aunque siempre estar entre ambos.

2. Anlisis de algoritmos
El anlisis de algoritmos tiene sentido en dos casos: A priori. Antes de realizar el programa. Evitamos la implementacin si el algoritmo es poco eficiente. Medida terica A posteriori. Implementar el algoritmo y contar lo que tarda para distintas entradas. Medida experimental. A priori Nos da valores aproximados.

A posteriori Nos da valores exactos (tiempo en segundos, memoria en bytes) para una mquina y unos datos determinados. Completamente dependiente de la mquina. Poco informativo: no podemos saber qu pasara con otra mquina u otros datos. Requiere implementar el ejecutarlo repetidas veces.

Independiente de la mquina. Mucho ms informativo: permite hacer predicciones sobre el comportamiento en cualquier mquina. La informacin obtenida es extrapolable. algoritmo y Se puede aplicar sin necesidad de haber implementado el algoritmo.

El estudio a posteriori trata con programas. El estudio a priori trata con algoritmos. Es preferible el estudio a priori.

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

El estudio a priori del tiempo de ejecucin se suele hacer por conteo de operaciones. Conteo de operaciones: Seguir la ejecucin del algoritmo, sumando las operaciones que se ejecutan. Qu operaciones nos interesa contar? Operaciones elementales (OE). Aquellas que el ordenador realiza en tiempo acotado por una constante. Contabilizarn como instrucciones elementales las operaciones aritmticas bsicas, asignaciones, saltos (llamadas a funciones, retornos de funciones, etc), comparaciones y accesos a estructuras indexadas bsicas (vectores y matrices). Cada una de ellas contabilizar 1 OE. Operaciones significativas.

Reglas bsicas del conteo de operaciones elementales: El tiempo de una OE es 1. El tiempo de ejecucin de una secuencia consecutiva de instrucciones se calcula sumando los tiempos de ejecucin de cada una de las instrucciones. El tiempo de ejecucin de la sentencia si C entonces S1 sino S2 finsi; es T = T(C) + max{T(S1),T(S2)}. El tiempo de ejecucin de la sentencia casos C de v1:S1|v2:S2|...|vn:Sn fincasos; es T = T(C) + max{T(S1),T(S2),...,T(Sn)}. Obsrvese que T(C) incluye el tiempo de comparacin con v1, v2 ,..., vn. El tiempo de ejecucin de un bucle de sentencias mientras C hacer S finmientras; es T = T(C) + (n iteraciones)*(T(S) + T(C)). Obsrvese que tanto T(C) como T(S) pueden variar en cada iteracin, y por tanto habr que tenerlo en cuenta para su clculo. Para calcular el tiempo de ejecucin del resto de sentencias iterativas (FOR, REPEAT, LOOP) basta expresarlas como un bucle WHILE. El tiempo de ejecucin de una llamada a un procedimiento o funcin F(P1, P2,..., Pn) es 1 (por la llamada), ms el tiempo de evaluacin de los parmetros P1, P2,..., Pn, ms el tiempo que tarde en ejecutarse F, esto es, T = 1 + T(P1) + T(P2) + ... + T(Pn) + T(F). No contabilizamos la copia de los argumentos a la pila de ejecucin, salvo que se trate de estructuras complejas (registros o vectores) que se pasan por valor. En este caso contabilizaremos tantas OE como valores simples contenga la estructura. El paso de parmetros por referencia, por tratarse simplemente de punteros, no contabiliza tampoco. El tiempo de ejecucin de las llamadas a procedimientos recursivos va a dar lugar a ecuaciones en recurrencia, que veremos posteriormente. Tambin es necesario tener en cuenta, cuando el compilador las incorpore, las optimizaciones del cdigo y la forma de evaluacin de las expresiones, que pueden ocasionar cortocircuitos o realizarse de forma perezosa (lazy). En el presente trabajo supondremos que no se realizan optimizaciones, que existe el cortocircuito y que no existe evaluacin perezosa.

Ejemplo: Para hacer un estudio del tiempo de ejecucin para los tres casos citados comenzaremos con un ejemplo concreto. Supongamos que disponemos de la siguiente definicin de tipos y constantes: CONST n = ; /* num. mximo de elementos de elementos de un vector */ TYPE vector = array [1..n] OF INTEGER; 4

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

y de un algoritmo cuya implementacin es: PROCEDURE buscar (VAR a: vector; c: INTEGER): CARDINAL VAR j: CARDINAL; BEGIN (1) j := 1; (2) WHILE (a[j] < c) AND (j < n) DO (3) j := j + 1; (4) END; (5) IF a[j] = c THEN (6) RETURN j; (7) ELSE RETURN 0; (8) END END buscar; Para determinar el tiempo de ejecucin, calcularemos primero el nmero de operaciones elementales (OE) que se realizan: En la lnea (1) se ejecuta 1 OE (asignacin). En la lnea (2) se efecta la condicin del bucle con un total de 4 OE (dos comparaciones, un acceso al vector y la op. lgica AND) La lnea (3) esta compuesta de un incremento y una asignacin (2 OE) La lnea (5) consta de una condicin y un acceso al vector (2 OE) La lnea (6) contiene un retorno (1 OE) si la condicin se cumple. La lnea (7) contiene un retorno (1 OE) si la condicin no se cumple. No se contabiliza la copia del vector a la pila de ejecucin del programa ya que se pasa por referencia. Con esto: En el caso mejor: tm(n) = 6. En el caso peor: tp(n) = 6n + 2. Conteo en el caso promedio: Se trata de multiplicar cada operacin por la probabilidad
k

de que se ejecute. Tendramos

t
i =1

(n, i ) donde k es el nmero de operaciones del

programa y tp(n,i) es el nmero promedio de veces que se ejecuta la operacin i para tamao de problema n. A su vez, tp(n,i) = operacin i se ejecute j veces. En el caso promedio: t1/2(n) = 3n + 3.

p(i, j) j , con p(i,j) la probabilidad de que la


j =1

El tiempo de ejecucin de un algoritmo va a ser una funcin que mide el nmero de operaciones (elementales o significativas) que realiza el algoritmo para un tamao de entrada dado.

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

3. Notaciones asintticas
Representan o acotan la forma en que crece t(n) cuando el tamao del problema tiende a infinito y sin tener en cuenta las constantes que dependen de factores externos. Orden de complejidad de f(n): O(n) Dada una funcin f: N R+, llamamos orden de f al conjunto de todas las funciones de N en R+ acotadas superiormente por un mltiplo real positivo de f, para valores de n suficientemente grandes.
O( f ) = t : N R + / c R + , n0 N , n n0 ; t (n) c f (n)

O(f) es un conjunto de funciones, no una funcin. valores de n suficientemente grandes: no nos importa lo que pase para valores pequeos funciones acotadas superiormente por un mltiplo de f: nos quitamos las constantes multiplicativas La definicin es aplicable a cualquier funcin de N en R, no slo tiempos de ejecucin

Uso de los rdenes de complejidad: 1. Dado un tiempo t(n), encontrar la funcin f ms simple tal que t O(f), y que ms se aproxime asintticamente. Ejemplo: t(n) = 2n2/5 + 6n + 3nlog2 n + 2 t(n) O(n2) 2. Acotar una funcin difcil de calcular con precisin Ejemplo: t(n) O(f(n)) 3. Acotar una funcin que no tarda lo mismo para el mismo tamao de entrada (distintos casos, mejor y peor) Ejemplo: t(n) O(tp(n))

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

Igual que con la cota superior, podramos hacer con la cota inferior.
Relacin de orden entre O(..) = Relacin de inclusin entre conjuntos: O(t) O(g) O(f) O(g) Para todo t O(f), t O(g).

Se cumple que: O(c) = O(d), siendo c y d constantes positivas O(c) O(n) O(cn+b) = O(dn+e) O(p) = O(q), si p y q son polinomios del mismo grado O(p) O(q), si p es un polinomio de menor grado que q Orden inferior u omega de f(n): (f) Dada una funcin f: N R+, llamamos omega de f al conjunto de todas las funciones de N en R+ acotadas inferiormente por un mltiplo real positivo de f, para valores de n suficientemente grandes.

( f ) = t : N R + / c R + , n0 N , n n0 ; t (n) c f (n)

La notacin omega se usa para establecer cotas inferiores del tiempo de ejecucin. Relacin de orden: igual que antes, basada en la inclusin.

Orden exacto de f(n): (f) Dada una funcin f: N R+, llamamos orden exacto de f al conjunto de todas las + funciones de N en R que crecen igual que f, asintticamente y salvo constantes.

( f ) = O( f ) ( f ) = t : N R + / c, d R + , n0 N , n n0 ; cf (n) t (n) d f (n)

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

Si un algoritmo tiene un t tal que t O(f) y t (f) entonces t (f).


Notacin o pequea de f(n): o(f)

R+, llamamos o pequea de f al conjunto de todas las Dada una funcin f: N funciones de N en R+ que crecen igual que f asintticamente.

o( f ) = {t : N R + / lim t (n) / f (n) = 1}


n

Esta notacin conserva las constantes multiplicativas para el trmino de mayor orden. Ejemplo: t(n) = amnm + am-1nm-1 + + a1n + a0 t(n) O(nm) y t(n) o(amnm)
Propiedades de las notaciones asintticas Transitividad. o Si f O(g) y g O(h) entonces f O(h) o Si f (g) y g (h) entonces f (h) Si f O(g) entonces O(f) O(g) Si f (g) entonces (f) (g) Relacin pertenencia/contenido. Dadas f y g de N en R+ se cumple: o O(f) = O(g) f O(g) y g O(f). ( (f) = (g) f (g) y g (f)) o O(f) O(g) f O(g). ((f) (g) f (g)) Propiedad del mximo. Dadas f y g de N en R+ se cumple: o O(f+g) = O(max(f,g)) o (f+g) = (max(f,g)) Equivalencia entre notaciones. Dadas f y g de N en R+ se cumple: o O(f) = O(g) (f) = (g) f (g) (f) = (g) Relacin lmites/rdenes. Dadas f y g de N en R+ se cumple: f ( n) o lim ( R+ ( O(f) = O(g), (f) = (g) y (f) = (g). n g ( n ) f ( n) o lim = 0 O(f) O(g) n g ( n ) f ( n) o lim = + (f) (g) y O(g) O(f). n g ( n )

Notaciones con varios parmetros En general, el tiempo consumido puede depender de muchos parmetros. f: Nm R+ (f: N x...m..x N R+). Orden de complejidad de f(n1, n2, ..., nm): Dada una funcin f: Nm R+, llamamos orden de f al conjunto de todas las funciones de Nm en R+ acotadas superiormente por un mltiplo real positivo de f, para valores de (n1, ..., nm) suficientemente grandes.
O( f ) = {t : N m R + / c R +, n1 , n2 ,..., nm N , k1 n1 , k 2 n 2 ,..., k m n m ;

t (k1 , k 2 ,..., k m ) c f (k1 , k 2 ,..., k m )}

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

Podemos extender los conceptos de (f) y (f), para funciones con varios parmetros. Notaciones condicionales. En algunos casos interesa estudiar el tiempo slo para ciertos tamaos de entrada. Ejemplo. Algoritmo de bsqueda binaria: Si N es potencia de 2 el estudio se simplifica. Orden condicionado de f(n): Dada una funcin f: N R+, y P: N B, llamamos orden de f segn P (o condicionado a P) al conjunto:
O( f | P ) = {t : N R + / c R + , n0 N , n n0 ; P (n) t (n) c f (n)}

Se cumple la inclusin O(f) O(f|P). De igual forma, tenemos (f |P) y (f |P). En algunos casos puede interesar restringirnos a valores de n que cumplan una condicin de tipo n = bk donde k N, es decir, n es potencia de b, y posteriormente quitar la restriccin utilizando el siguiente teorema: Si b 2 es un entero y f: N R+ una funcin que es no decreciente a partir de un valor n0 (eventualmente no decreciente) y f(bn) O(f(n)) (f es b-armnica), y t: N R+ es eventualmente no decreciente tal que t(n) (f|n potencia de b) entonces t(n) (f). Algunas relaciones entre rdenes de complejidad frecuentes: O(1) O(log n) O(n) O(nlog n) O(n(log n)2) O(n1.001...) O(n2) O(n3) ... O(2n) O(n!) O(nn)

Con la notacin

se invierten las inclusiones.

Observaciones sobre las cotas asintticas: - El orden de un polinomio anxn+ + a1x + a0 es O(xn). -

1 O ( n) ;
i =1

i O(n 2 ) ;
i =1

i
i =1

O(n m+1 )

Si hacemos una operacin para n, otra para n/2, n/4,, aparecer un orden logartmico O(log2 n) Los logaritmos son del mismo orden, independientemente de la base. Por eso, se omite normalmente. Sumatorios: se pueden aproximar con integrales, una acotando superiormente y otra inferiormente.

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

Casos promedio: usar probabilidades. Para un algoritmo dado se pueden obtener tres funciones que miden su tiempo de ejecucin que corresponden a sus casos mejor, peor y promedio y que denominamos respectivamente, tm(n), tM(n) y tp(n). Para cada una de ellas podemos dar tres cotas asintticas de crecimiento, por lo que se obtiene un total de nueve cotas para el algoritmo. Para simplificar, dado un algoritmo diremos que su orden de complejidad es O(f) si su tiempo de ejecucin para el peor caso es de orden O de f, es decir, tp(n) es de orden O(f). De forma anloga diremos que su orden de complejidad para el mejor caso es (g) si su tiempo de ejecucin para el mejor caso es de orden de g, es decir, Tm(n) es de orden (g). Por ltimo, diremos que un algoritmo es de orden exacto (f) si su tiempo de ejecucin en el caso promedio, T1/2(n) es de ese orden.

Ejemplo: Pasos para calcular la complejidad de un algoritmo. El cuerpo del algoritmo que suma los elementos de una matriz cuadrada de tamao n es el siguiente: Suma = 0; i = 0; while (i < n) { j = 0; while (j < n) { Suma = Suma + Matriz[i][j]; j ++; } i++; } 1. Cal es el tamao del problema? (Segn el algoritmo, puede depender de ms de una variable) - La dimensin de la matriz 2. Cal es la medida significativa que queremos medir? - Nmero de asignaciones totales - Nmero de operaciones aritmticas - Nmero de accesos a la matriz 3. Se pueden distinguir caso mejor y peor? - En este caso, no. 4. Calcular t(n): - Si tomamos como medida significativa el nmero de asignaciones totales: - Si tomamos como medida significativa el nmero de operaciones aritmticas: - Si tomamos como medida significativa el nmero de accesos a la matriz: 5. Asociar medidas asintticas - Como no hay caso mejor y caso pero, (n2)

10

Departamento de Informtica rea de Lenguajes y Sistemas Informticos

EDA 2006/2007

Hasta aqu hemos venido hablando de algoritmos. Cuando nos enfrentamos a un problema concreto, habr una serie de algoritmos aplicables. Se suele decir que el orden de complejidad de un problema es el del mejor algoritmo que se conozca para resolverlo. As se clasifican los problemas, y los estudios sobre algoritmos se aplican a la realidad. Estos estudios han llevado a la constatacin de que existen problemas muy difciles, problemas que desafian la utilizacin de los ordenadores para resolverlos. En lo que sigue esbozaremos las clases de problemas que hoy por hoy se escapan a un tratamiento informtico. Clase P.Los algoritmos de complejidad polinmica se dice que son tratables en el sentido de que suelen ser abordables en la prctica. Los problemas para los que se conocen algoritmos con esta complejidad se dice que forman la clase P. Aquellos problemas para los que la mejor solucin que se conoce es de complejidad superior a la polinmica, se dice que son problemas intratables. Seria muy interesante encontrar alguna solucin polinmica (o mejor) que permitiera abordarlos. Clase NP.Algunos de estos problemas intratables pueden caracterizarse por el curioso hecho de que puede aplicarse un algoritmo polinmico para comprobar si una posible solucin es vlida o no. Esta caracterstica lleva a un mtodo de resolucin no determinista consistente en aplicar heursticos para obtener soluciones hipotticas que se van desestimando (o aceptando) a ritmo polinmico. Los problemas de esta clase se denominan NP (la N de no-deterministas y la P de polinmicos). Clase NP-completos.Se conoce una amplia variedad de problemas de tipo NP, de los cuales destacan algunos de ellos de extrema complejidad. Grficamente podemos decir que algunos problemas se hayan en la "frontera externa" de la clase NP. Son problemas NP, y son los peores problemas posibles de clase NP. Estos problemas se caracterizan por ser todos "iguales" en el sentido de que si se descubriera una solucin P para alguno de ellos, esta solucin sera fcilmente aplicable a todos ellos. Actualmente hay un premio de prestigio equivalente al Nobel reservado para el que descubra semejante solucin ... y se duda seriamente de que alguien lo consiga! Es ms, si se descubriera una solucin para los problemas NP-completos, esta sera aplicable a todos los problemas NP y, por tanto, la clase NP desaparecera del mundo cientfico al carecerse de problemas de ese tipo. Realmente, tras aos de bsqueda exhaustiva de dicha solucin, es hecho ampliamente aceptado que no debe existir, aunque nadie ha demostrado, todava, la imposibilidad de su existencia

11

Potrebbero piacerti anche