Está en la página 1de 34

UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA COORDINACIN GENERAL DE INVESTIGACIN Y POSTGRADO MAESTRIA EN CIENCIAS DE LA COMPUTACIN

Unidad I Tema 1: Anlisis de Algoritmos

Prof. Ing. Carlos Guevara, Msc

Anlisis de Algoritmos

Definicin de algoritmos Complejidad Computacional Notacin O Comparacin de Algoritmos

Objetivos
El alumno calcular la complejidad de un algoritmo: en el peor de los casos, en el promedio de los casos, y en el mejor de los casos, y determinar sus lmites asintticos. Dados dos algoritmos, el alumno determinar bajo que circunstancias uno es mejor que otro, basndose en los tiempos de corrida y la complejidad asinttica de ambos.

Definicin de Algoritmos
Un algoritmo es cualquier procedimiento computacional bien definido que toma algn o algunos valores de entrada, y produce algn valor o un conjunto de valores de salida.
Instruccin 1 Instruccin 2 . . Instruccin N

Entrada(s)

Salida(s)

Es una secuencia finita de pasos, cada una de los cuales tiene un significado preciso y puede ejecutarse en un tiempo finito. Adems un algoritmo es independiente de los valores de entrada y debe tener fin. Escrito en lenguaje natural (informal), leng. natural+leng. prog. (pseudo-cdigo), leng. de programacin (programa). Se dice que un algoritmo es correcto si para cada valores de entrada se genera una salida correcta.

Medidas de Desempeo

Cantidad de almacenamiento principal requerido por sus variables Cantidad de trfico que genera en una red de computadoras Cantidad de informacin que debe moverse desde y hacia las unidades de almacenamiento secundario Simplicidad del algoritmo Tiempo de cmputo

Tiempo de Ejecucin de un Algoritmo

5 min

Peor Caso Caso Promedio? Mejor Caso

TIEMPO

4 min 3 min 2 min 1 min


A B C D E F G

ENTRADA

Medicin del Tiempo de Ejecucin de un Algoritmo


Cmo podemos medir el tiempo de ejecucin de un algoritmo? Estudio Experimental:
Escribir un programa implemente el algoritmo. que

Ejecutar el programa con un conjunto de datos de tamao y composicin variable. Usar algn mtodo para obtener una medida precisa del tiempo de ejecucin actual. Ejemplo Java:
System.CurrenTimeMillis()

Medicin del Tiempo de Ejecucin de un Algoritmo


El estudio experimental presenta algunos inconvenientes: Es necesario implementar y probar el algoritmo para determinar su tiempo de ejecucin. El experimento puede ser hecho slo sobre un conjunto limitado de entradas, por lo que puede no ser indicativo sobre otros conjuntos de entradas no contempladas en el experimento. Para poder comparar dos algoritmos, debe usarse el mismo ambiente de hardware y software.

Medicin del Tiempo de Ejecucin de un Algoritmo


Como alternativa, se puede utilizar una metodologa general para analizar el tiempo de ejecucin de un algoritmo que:

Use una descripcin de alto-nivel del algoritmo en vez de una implementacin. Tome en consideracin todos los posibles conjuntos de entrada Permita evaluar la eficiencia de un algoritmo, independientemente de la plataforma de hardare y software en el que se implemente.

Medicin del Tiempo de Ejecucin de un Algoritmo


Eficiencia
Complejidad Est referida a conseguir una funcin que acote el tiempo de ejecucin del algoritmo T(n), a esta la llamamos orden del algoritmo O(n).
4
4

Ejemplo
3 T(n) 2 Lineal (T(n)) 1
1 2 Logartm ic a (T(n)) 3 T(n)

0 1 2 3 4

0 1 2 3 4 5 6

El nmero de comparaciones Es la cantidad de comparaciones entre claves que realiza el algoritmo durante su ejecucin. El nmero de movimientos Es la cantidad de intercambios de registros de datos que realiza el algoritmo durante su ejecucin.

Medicin del Tiempo de Ejecucin de un Algoritmo


Operaciones primitivas: operaciones de bajo nivel que pueden ser comnmente implementadas en la mayora de los lenguajes de programacin y que pueden ser identificadas en pseudo-cdigo. Llamar a un procedimiento o funcin; Ejecutar una operacin aritmtica (ej. una suma); Comparar dos nmeros, etc.

Inspeccionando el pseudo-cdigo se puede contar el nmero de operaciones primitivas ejecutadas por un algoritmo.

Medicin del Tiempo de Ejecucin de un Algoritmo


Ejemplo:
Algoritmo ArregloMaximo(A,n) Entrada: un arreglo A guardando nmeros enteros Salida: el elemento mximo de A Max A[0] for i 1 to n - 1 do if Max < A[i] then Max A[i] return Max (1 vez) (n veces) (n-1 veces en peor caso) (n-1 veces en peor caso) (1 vez)

Complejidad Temporal

Definicin: el tiempo requerido (unidades de tiempo) por un algoritmo para procesar una entrada de tamao n. Sea T(n) el tiempo de corrida de algn programa, debemos asumir: 1. El argumento n es un entero no negativo, y 2. T(n) es no negativo para todos los argumentos de n

Complejidad constante
Cuando la complejidad del algoritmo puede expresarse como una funcin constante T(n)=a, se dice que es constante, no depende de n. Ejemplo 1: El procedimiento, eleva al cubo, recibe n y regresa el cubo de n. T(n)=c1

int eleva al cubo (int n) { return n*n*n; }

Costo c1

# de veces 1

Complejidad lineal

Cuando la complejidad de un algoritmo puede expresarse como una funcin lineal T(n)=an + b donde a y b son constantes se dice que es lineal en n.

Complejidad lineal
Ejemplo2: El siguiente procedimiento inicializa un arreglo de n elementos. void inicializa(int *A, int n) { 1. i=1; 2. while (i<=n) { 3. 4. 5. } 6.} A[i]=1; i++ Costo c1 c2 c3 c4 # de veces 1 n+1 n n

Complejidad lineal

T(n)

= c1 + (n+1)c2 + nc3 + nc4 = nc2 + nc3 + nc4 + c1 + c2 = (c2+c3+c4)n + (c1+c2) = an + b

Si asignamos el valor de una unidad de tiempo para cada instruccin, la complejidad del procedimiento inicializa es T(n)=3n+2 y es lineal.

Complejidad cuadrtica

Cuando la complejidad de un algoritmo puede expresarse como una funcin cuadrtica del tipo T(n)=an2+bn+c donde a, b y c son constantes, se dice que el algoritmo es cuadrtico en n.

Complejidad cuadrtica
Ejemplo 3: Analicemos el siguiente cdigo. 1. 2. 3. for(i=1; i<=n-1; i++) for(j=1; j<=n-1; j++) { A[i,j]=1; }

Ciclo Interno: c1 + c2(n) + c3(n-1) + c4(n-1) = 1 + n + 2(n-1) =3n 1 Ciclo Externo: c1 + c2(n) + c3(n-1) + (3n - 1)(n-1) = 1 + 2n - 1 + 3n2 -3n - n + 1= 3n2 - 2n + 1

Casos de Complejidades
Complejidad en el mejor de los casos: se define T(n) como el tiempo mnimo de corrida para todas las entradas de tamao n. Complejidad en el peor de los casos: se define T(n) cmo el tiempo mximo de corrida para todas las entradas de tamao n. Complejidad promedio: otra medida comn de desempeo es Tavg(n), el tiempo promedio de corrida del programa sobre todas las entradas de tamao n. An cuando el tiempo promedio es una medida ms realista, en la prctica es ms difcil de calcular que el peor de los casos.

Casos de Complejidades
El peor de los casos Es un lmite superior del tiempo de corrida Frecuentemente ocurre Es ms fcil de calcular que el promedio.

Notacin Asinttica Cuando observamos entradas de tamao lo suficientemente grandes para que slo el orden de crecimiento de la complejidad sea relevante, estamos estudiando la eficiencia asinttica de los algoritmos.

Notacin O mayscula
Para especificar la cota superior de la razn de crecimiento de T(n) se usa la notacin O(f(n)). Formalmente, decimos que T(n) es O(f(n)) si existe un entero n0 y una constante c > 0 tal que para todos los enteros n n0, tenemos que 0 T(n) cf(n).

6000 4000 2000 0 0 1 10 50 100 500 1000 T(n)=3n+2 cf(n)

Notacin
Para especificar la cota inferior de la razn de crecimiento de T(n) se usa la notacin (f(n)). Formalmente, decimos que T(n) es (f(n)) si existe un entero n0 y una constante c > 0 tal que para todos los enteros n n0, tenemos que 0 cf(n) T(n).
35000 30000 25000 20000 15000 10000 5000 0 1 2 5 10 50 100 500 1000 T(n)=3(n log n) cf(n)=3logn

Notacin
Formalmente, decimos que T(n) es (f(n)) si existe un entero n0 y las constantes c1 y c2 > 0 tal que para todos los enteros n n0, tenemos que: 0 c1f(n) T(n) c2f(n) Ejemplo: 0 n2 2n2 3n2
3500000 3000000 2500000 2000000 1500000 1000000 500000 0 10 50 100 500 1000 T(n)=2n^2) c1f(n)=n^2 c2f(n)=3n^2

Anlisis de Complejidad de un Algoritmo


Instrucciones simples: si; el T(n) es constante Complejidad es constante O(1) Instrucciones secuenciales: Sean i1; i2; . ; ik El T(n) = Ti Complejidad es O(1)

con T1; T2; . ; Tk

respectivamente

Instrucciones secuenciales simples: s1; s2; . ; sk Suma de constantes es constante. Complejidad es O(1) Ciclos simples: for(i=0;i<n;i++) { s; } donde s is O(1) Complejidad es n O(1) o O(n)

Anlisis de Complejidad de un Algoritmo


Ciclos anidados: Ciclos internos estn afectados por los ciclos externos Se analizan de la parte mas interna hacia la parte externa

Ciclos con ndices que varan linealmente for(i=0;i<n;i++) for(j=0;j<n;j++) { s; } Complejidad es n O(n) O(n2) O(n) = n2

Ciclos con ndice que no varan linealmente h = 1; while ( h <= n ) { h toma valores 1, 2, 4, hasta que excede a n s; h = 2 * h; Hay 1 + log2n iteraciones } Complejidad es O(log n) O(n) = log n

Anlisis de Complejidad de un Algoritmo


Ciclos con ndices que dependen de otro ndice de un ciclo externo: for(j=0;j<n;j++) for(k=0;k<j;k++){ s; } Ciclo interno se ejecuta 1, 2, 3, ., n veces i = i=1 n(n+1) 2
Se debe distinguir este caso donde el contador de la iteracin se incrementa (o decrementa) por una constante O(nk) del caso previo donde el ndice cambia por un factor O(log n)

Complejidad es O(n2)

Principios generales para la notacin O

1.

Factores constantes no importan. Para cualquier constante positiva d y cualquier funcin T(n), T(n) es O(dT(n)). Trminos de orden menor, no importan. Suponga que T(n) es una funcin polinomial de forma: aknk + ak-1nk-1 +...+ a2n2 + a1n + a0 donde akn es positivo. Entonces podemos concluir que T(n) es O(nk)

2.

La regla de la suma

Suponga que un programa consiste de dos partes, una de las cuales es de complejidad O(n2) y la otra de O(n3). En muchos casos como este, es posible sumar estas dos complejidades usando la regla de la suma: Suponga que T1(n) es de O(f1(n)), mientras que T2(n) es de O(f2(n)), adems suponga que f2 no crece tan rpido como f1; esto es f2 es de O(f1). Entonces podemos concluir que T1(n) + T2(n) es O(f1(n)).

La regla de la suma
1. readln(n); 2. for i:=1 to n do 3. for j:=1 to n do 4. A[i,j]:=0; 5. for i:=1 to n do 6. A[i,i]:=1;

T1(n)=1 es =O(1),

T2(n)=O(n2)
80 60 40 20 0 1

, T3(n)=O(n)
T1(n) T2(n) T3(n)

T1(n)+T2(n)+T3(n) es de O(n2)

Complejidades comunes

Notacin O O(1) O(log n) O(n) O(n log n) O(n2) O(n3) O(2n)

Nombre Constante Logartmico Lineal n log n Cuadrtico Cbico Exponencial

Comparacin de algoritmos

Suponga que para algn problema tenemos la opcin de utilizar un programa lineal A cuyo tiempo de corrida es TA(n)=100n (milisegundos requeridos) o un programa cuadrtico B cuyo tiempo de corrida es TB(n)=2n2. Si TA(n)=100n, en un segundo 1000=100n puedo procesar una entrada de tamao n=10, mientras que con TB(n)=2n2 una de tamao 1000=2n2 proceso n=(500)1/2 22.3 = 22 elementos

Comparacin de algoritmos

20000 15000 10000 5000 0 0 20 40 60 80 100 TA TB

Tiempo (segundos) 1 10 100 1000

Mximo tamao del problema que se puede resolver con A 10 100 1000 10000

Mximo tamao del problema que se puede resolver con B 22 70 223 707

Autoevaluacin
1. Analizar el Tiempo de Ejecucin T(n) y la complejidad O(n), de los siguientes fragmentos de cdigo: a) x:= 0 s := n*n for i := 1 to n for j := s downto 1 do x := x +2 c) x := 1 while i <= n do j = n; while j > i do x := x * x j := j div 4 end i := i + 2 end b) for i := 1 to n do x = x * x for i := 1 to x do y := y * x

d) while i < n s = f(i) i = i * 2 end Nota: T(f(i)) = O(n2)

2. Un algoritmo A resulve un problema de tamao n en tiempo en n minutos. Otro algoritmo B resuelve el mismo problema de tamao n en n3 milisegundos. Haga una tabla comparativa de los tiempos de ejecucin de estos algoritmos para problemas de tamao 10, 100, 1000, 10000, 100000, 1000000....Cul de los dos es mejor? Bajo que circunstancias seleccionar al algoritmo A o al algoritmo B?

También podría gustarte