Está en la página 1de 20

Complejidad Algortmica

Ing.: Nstor Daz Departamento de Sistemas FIET Universidad del Cauca

COMPLEJIDAD COMPUTACIONAL
Algoritmo: Secuencia finita de instrucciones, donde cada una de las cuales tiene un significado preciso y puede ejecutarse con una cantidad finita de recursos computacionales en un tiempo finito. Anlisis de algoritmos: herramienta para hacer la evaluacin del diseo de un algoritmo, permite establecer la calidad de un programa y compararlo con otros que puedan resolver el mismo problema, sin necesidad de desarrollarlos. El anlisis de algoritmos estudia, desde un punto de vista terico, los recursos computacionales que requiere la ejecucin de un programa, es decir su eficiencia (tiempo de CPU, uso de memoria, ancho de banda, ...).

COMPLEJIDAD COMPUTACIONAL
Tamao del problema: cantidad de datos a procesar, generalmente se denota como n. Otros factores relevantes: funcionalidad, correccin, robustez, usabilidad, modularidad, mantenibilidad, fiabilidad, simplicidad y an el propio costo de programacin.

COMPLEJIDAD COMPUTACIONAL
Para resolver un problema suele ser habitual disponer de varios algoritmos. Ejemplo: para obtener el M.C.D. de dos nmeros se puede utilizar:
Clculo de divisores Descomposicin en factores primos El Algoritmo de Euclides

El objetivo es elegir el algoritmo ms eficiente de ellos, mediante medidas de eficiencia.

COMPLEJIDAD COMPUTACIONAL
Regla: La eleccin del algoritmo nunca debera afectar a la correccin de la solucin ni a la claridad (evitar algoritmos incomprensibles). Excepcin: A veces se eligen algoritmos aproximados o heursticos porque la solucin correcta resulta inmanejable. Estos algoritmos no alcanzan la solucin ptima pero s una solucin aceptable. Ejemplos:
Algoritmo aproximado: Clculo de la raz cuadrada Algoritmo Heurstico: Problema del viajero

COMPLEJIDAD COMPUTACIONAL
Por qu buscar algoritmos eficientes? Con el logro de computadores cada vez ms rpidos se podra caer en la tentacin de preguntarse si vale la pena preocuparse por aumentar la eficiencia de los algoritmos. (No sera mas sencillo aguardar a la siguiente generacin de computadores?).

COMPLEJIDAD COMPUTACIONAL
Supongamos que se dispone, para resolver un problema dado, de un algoritmo que necesita un tiempo exponencial y que, en un cierto computador, una implementacin del mismo emplea 10-4 x 2n segundos. Este programa podr resolver un ejemplar de tamao n = 10 en una dcima de segundo. Necesitar ms de 1 minuto para resolver un ejemplar de tamao 20 (10-4 x 220=104,8576 seg.). Un da entero no bastar para resolver uno de tamao 30 (10-4 x 230=29,8262 horas). En un ao de clculo ininterrumpido, a duras penas se resolver el problema de tamao 38 (10-4 x 238=318,1457 das).

COMPLEJIDAD COMPUTACIONAL
Imaginemos que necesitamos resolver ejemplares ms grandes y compramos para ello un computador cien veces ms rpido. El mismo algoritmo conseguir resolver ahora un ejemplar de tamao n en slo 10-6 x 2n segundos. En un ao, apenas se consigue resolver un ejemplar de tamao 45 (10-6 x 245=407,23 das.). En general, si en un tiempo dado se poda resolver un ejemplar de tamao n, con el nuevo computador se resolver uno de tamao n + 7 en ese mismo tiempo. Imaginemos, en cambio, que investigamos en algoritmia y encontramos un algoritmo capaz de resolver el mismo problema en un tiempo cbico. La implementacin de este algoritmo en el computador inicial podra necesitar, por ejemplo 10-2 x n3 segundos. Ahora se podra resolver en un da un ejemplar de un tamao superior a 200. Un ao permitira alcanzar casi el tamao 1500 (10-2 x 15003 = 390,625 das).

COMPLEJIDAD COMPUTACIONAL
El nuevo algoritmo no slo permite una aceleracin ms significativa que la compra de un equipo ms rpido, sino que hace dicha compra ms rentable. Para comparar algoritmos se puede utilizar una medida del grado de dificultad del algoritmo: la complejidad computacional. Complejidad computacional: Indica el esfuerzo que hay que realizar para aplicar un algoritmo y lo costoso que ste resulta. Dicho coste se puede medir de diversas formas (espacio en disco, memoria, tiempo...).

COMPLEJIDAD COMPUTACIONAL
En muchos casos, la complejidad de tiempo de un algoritmo es igual para todas las instancias de tamao n del problema. En otros casos, la complejidad de un algoritmo de tamao n es distinta dependiendo de las instancias de tamao n del problema que resuelve. Esto plantea la necesidad de estudiar la complejidad del peor caso, mejor caso, y caso promedio.

COMPLEJIDAD COMPUTACIONAL
Para un tamao dado (n), la complejidad del algoritmo:
en el peor caso resulta de tomar el mximo tiempo (complejidad mxima) en que se ejecuta el algoritmo, entre todas las instancias del problema de tamao n que resuelve el algoritmo; en el caso promedio es la esperanza matemtica del tiempo de ejecucin del algoritmo para entradas de tamao n, y en el mejor caso es el menor tiempo en que se ejecuta el algoritmo para entradas de tamao n. Por defecto se toma la complejidad del peor caso como medida de complejidad del algoritmo.

COMPLEJIDAD COMPUTACIONAL
Un algoritmo es ms eficiente cuanto menos complejo sea. La eficiencia suele medirse en trminos de consumo de recursos:
Complejidad espacial: cantidad de memoria que un algoritmo consume o utiliza durante su ejecucin Complejidad temporal: tiempo que necesita el algoritmo para ejecutarse Otros: utilizacin de CPU, utilizacin de perifricos, tiempo y coste de implementacin.

COMPLEJIDAD COMPUTACIONAL
La complejidad de un programa depende de:
La mquina y el compilador utilizados. El tamao de los datos. Ejemplo: Ordenamiento de un vector nmero de elementos; Factorizar un nmero en sus factores primos valor del nmero

Dado que al realizar un estudio terico de la complejidad, se ignoran aspectos como las caractersticas de la mquina y el compilador, se tiene en cuenta que las diferencias en eficiencia se hacen ms significativos para tamaos grandes de los datos de entrada.

COMPLEJIDAD COMPUTACIONAL
Se analiza la complejidad en trminos de su comportamiento asinttico, dejando un poco de lado la forma exacta de la funcin de complejidad. Constantes y trminos de menor orden no se tienen en cuenta. Objetivos Complejidad Computacional:
Determinar, matemticamente, la necesarios para ejecutar el algoritmo cantidad de recursos

Obtener una funcin genrica (f(n)) que permita hacer predicciones sobre la utilizacin de recursos, siendo n el tamao del problema.

COMPLEJIDAD COMPUTACIONAL
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: c1, c2 R, tales que: f1(n) c1 *f2(n) f2(n) c2 *f1(n)

COMPLEJIDAD COMPUTACIONAL
COMPLEJIDAD ASINTTICA: Consiste en el clculo de la complejidad temporal a priori de un algoritmo en funcin del tamao del problema, prescindiendo de factores constantes multiplicativos y suponiendo valores de n muy grandes. No sirve para establecer el tiempo exacto de ejecucin, sino que permite especificar una cota (inferior, superior o ambas) para el tiempo de ejecucin de un algoritmo. Tamao del problema: cantidad de datos a procesar, generalmente se denota como n.

COMPLEJIDAD COMPUTACIONAL
Funcin de tiempo: Representa el nmero de instrucciones primitivas que realiza un algoritmo. Generalmente se denota como T(n) o T(N). Se establece en uno de tres casos:
Mejor caso: se realiza la menor cantidad de instrucciones Caso promedio: se tienen en cuenta las probabilidades de distribucin de los datos de entrada para el algoritmo Peor caso: se asume que el algoritmo va a realizar el mayor numero de instrucciones posible. Este es el ms comn.

COMPLEJIDAD COMPUTACIONAL
Ejemplo: Mximo valor de un array
Peor caso: T(n) = 7*n - 2 Mejor caso: T(n) = 5*n Caso promedio : T(n) = 6*n - 1

COMPLEJIDAD COMPUTACIONAL
Ejemplo: Mximo valor de un array (Peor Caso)
Algoritmo Primitivas

maximoArray(A) Entrada: A array de n enteros Salida: elemento mximo de A INICIO


Lnea 1 Lnea 2 Lnea 3 Lnea 4 Lnea 5 Lnea 6

maxActual A[0] PARA i 1 HASTA n - 1 HACER SI A[i] > maxActual ENTONCES maxActual A[i] DEVOLVER maxActual FIN

2 1+n+2(n-1) 2(n-1) 2(n-1) 1

COMPLEJIDAD COMPUTACIONAL
Ejemplo: Mximo valor de un array (Mejor Caso)
Algoritmo Primitivas

maximoArray(A) Entrada: A array de n enteros Salida: elemento mximo de A INICIO


Lnea 1 Lnea 2 Lnea 3 Lnea 4 Lnea 5 Lnea 6

maxActual A[0] PARA i 1 HASTA n - 1 HACER SI A[i] > maxActual ENTONCES maxActual A[i] DEVOLVER maxActual FIN

2 1+n+2(n-1) 2(n-1) 2(0) 1

10

COMPLEJIDAD COMPUTACIONAL
Ejemplo: Mximo valor de un array (Caso promedio)
Algoritmo Primitivas

maximoArray(A) Entrada: A array de n enteros Salida: elemento mximo de A INICIO


Lnea 1 Lnea 2 Lnea 3 Lnea 4 Lnea 5

maxActual A[0] PARA i 1 HASTA n - 1 HACER SI A[i] > maxActual ENTONCES maxActual A[i] DEVOLVER maxActual FIN

2 1+n+2(n-1) 2(n-1) 2*p*(n-1) 1

COMPLEJIDAD COMPUTACIONAL
Ejemplo: Mximo valor de un array (Caso promedio) p: es la probabilidad de que se cumpla la condicin al interior del bucle para del algoritmo. En este caso la probabilidad es 0.5, dado que existe la misma posibilidad de que la condicin se cumpla o no.

11

COMPLEJIDAD COMPUTACIONAL
Notacin O: Sean f(n) y g(n) dos funciones arbitrarias tales que {f(n), g(n): Z+ R+}. Se dice que f(n) es O grande de g(n) escrito como: f(n) = O(g(n)), S existen constantes positivas c y n0 tales que f(n)c*g(n) nn0

COMPLEJIDAD COMPUTACIONAL
Notacin : Sean f(n) y g(n) dos funciones arbitrarias tales que {f(n), g(n): Z+ R+}. Se dice que f(n) es Omega grande de g(n) escrito como: f(n) = (g(n)), S existen constantes positivas c y n0 tales que f(n) c*g(n) nn0

12

COMPLEJIDAD COMPUTACIONAL
Notacin : Sean f(n) y g(n) dos funciones arbitrarias tales que {f(n), g(n): Z+ R+}. Se dice que f(n) es Theta grande de g(n) escrito como: f(n) = (g(n)), S existen constantes positivas c1, c2 y n0 tales que c1*g(n) f(n) c2*g(n) nn0

COMPLEJIDAD COMPUTACIONAL
Ejemplo Notacin Asinttica: S f(n) = 7n 2 f(n) = O(n), dado que se cumple que f(n)c*g(n) nn0, con c = 7 y n0 = 1 f(n) = (n), dado que se cumple que f(n)c*g(n) nn0, con c = 6 y n0 = 2 f(n) = (n), dado que se cumple que c1*g(n) f(n)c2*g(n) nn0, con c1 = 7, c2 = 6 y n0 = 2

13

COMPLEJIDAD COMPUTACIONAL
Mquina de Acceso Directo (MAD): Es el modelo de computacin ms usado para evaluar algoritmos. Este modelo asume la existencia de un solo procesador genrico, memoria de acceso directo y un conjunto de operaciones bsicas que el procesador puede ejecutar. En este modelo, para determinar el tiempo de ejecucin de un algoritmo se debe determinar el tiempo requerido por cada operacin bsica y multiplicarlo por el nmero de veces que cada instruccin es ejecutada.

COMPLEJIDAD COMPUTACIONAL
Ejemplo: Mquina de Acceso Directo
Algoritmo Tiempo Primitivas

Potencia(real x, entero positivo n)


Lnea 1 Lnea 2 Lnea 3 Lnea 4

resultadox para i1 hasta n-1 hacer resultadoresultado*x devolver resultado

t1 t2 t3 t4

1 n -1 n -1 1

De acuerdo al modelo MAD el tiempo de ejecucin del algoritmo Potencia es: T(n) = t1+t2(n-1)+t3(n-1)+t4 = (t2+t3)(n-1)+t1+t4

14

COMPLEJIDAD COMPUTACIONAL
El tiempo de ejecucin del algoritmo Potencia esta determinado (dominado), por el trmino (t2+t3)(n-1) de la funcin de tiempo (T(n)). Por esta razn, se usa normalmente la notacin asinttica para expresar el tiempo de ejecucin de un algoritmo. En el caso de la funcin Potencia podemos decir: T(n) = (n), dado que se pueden encontrar constantes positivas c y n0 tales que: (t2+t3)(n-1)+t1+t4 c*n, nn0

COMPLEJIDAD COMPUTACIONAL
T(n) = (n), dado que se pueden encontrar constantes positivas c1, c2, y n0 tales que: c1*n (t2+t3)(n-1)+t1+t4 c2*n, nn0 T(n) = O(n), dado que se pueden encontrar constantes positivas c, y n0 tales que: (t2+t3)(n-1)+t1+t4 c*n, nn0

15

COMPLEJIDAD COMPUTACIONAL
En general, el uso de la notacin asinttica en el anlisis de un algoritmo implica ciertas ventajas, por cuanto el objetivo es obtener un anlisis independiente de la implementacin o de la plataforma particular. En el ejemplo la notacin asinttica oculta la cantidades constantes (t1, t2, t3, t4), cuyos valores seran especficos de la mquina en la que se realizara la implementacin del algoritmo; y por otra parte permite enfatizar los aspectos ms importantes de un algoritmo, en el caso del ejemplo: que su ejecucin crecer linealmente cuando aumente el tamao de la potencia (n).

COMPLEJIDAD COMPUTACIONAL
Lo que nos interesa en el anlisis de algoritmos es la tasa de crecimiento del tiempo de ejecucin y no el tiempo exacto de ejecucin de una implementacin del algoritmo en una mquina determinada. El uso de notacin asinttica implica que podemos ignorar los trminos de menor orden y constantes presentes en una funcin que exprese el tiempo de ejecucin de un algoritmo, permitiendo por tanto concentrarnos en el trmino de orden ms alto, pues es este trmino el que determina la tasa de crecimiento de la funcin. Igualmente, cualquier coeficiente constante que multiplique al trmino de orden ms alto puede ser ignorado, dado que este valor constante corresponde a detalles especficos de la implementacin. Al tiempo de ejecucin obtenido de esta manera se le denomina complejidad asinttica del tiempo de ejecucin o complejidad en tiempo del algoritmo.

16

COMPLEJIDAD COMPUTACIONAL
Repaso de matemticas Exponentes: xaxb = xa+b xa/xb = xa-b (xa)b =x ab xn+xn = 2xn x2n 2n+2n = 2n+1

COMPLEJIDAD COMPUTACIONAL
Repaso de matemticas Logaritmos: En informtica los logaritmos son en base 2, a menos que se especifique otra cosa. Def.: xa = b si y solo si logx b = a loga b= logc b/ logc a log ab = log a + log b log a/b = log a - log b log (ab) = b log a alog n = nlog a log x < x, x>0 log 1 = 0, log 2 = 1, log 1024 = log 210 = 10
2 b

17

COMPLEJIDAD COMPUTACIONAL
Repaso de matemticas Sumatorias:
n n

cai = c ai
i =1 n i =1 n n

(a + b ) = a + b
i i i i =1 i =1 i =1

Serie Aritmtica (n0):

i = 1 + 2 + ... + n =
i =1

n( n + 1) 2

COMPLEJIDAD COMPUTACIONAL
Repaso de matemticas Serie Geomtrica (n 0, x<>1, x=kte):
1 x = 1 + x + x + ... + x = x 1 x
n i 2 n i =1 n +1

Serie Harmnica (n 0):

i = 1 + 2 + 3 ... + n ln n
i =1

18

COMPLEJIDAD COMPUTACIONAL
Repaso de matemticas Serie Cuadrtica (n 0):

i
i =1

n( n + 1)(2n + 1) 6

Operacin Algebraica:

f (n) = nf (n)
i =1

COMPLEJIDAD COMPUTACIONAL
Repaso de matemticas Funcin Piso ( ): Ejemplo: 3,9 = 3

Funcin Techo ( ): Ejemplo: 3,1 = 4

19

COMPLEJIDAD COMPUTACIONAL
TALLER Comparar los siguientes pares de funciones usando notacin asinttica, establecer si f(n) = O(g(n)), f(n) = (g(n)) f(n) = (g(n)): f(n) g(n) -3 4 103n3 10 n n2 n*log n log n log(log n) n^2 2 22^n 100*n+log10n n + (log n)2 log n log n2 nlog n n

20

También podría gustarte