Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Anlisis 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
5 min
TIEMPO
ENTRADA
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()
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.
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.
Inspeccionando el pseudo-cdigo se puede contar el nmero de operaciones primitivas ejecutadas por un algoritmo.
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
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)
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).
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
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)
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
Complejidad es O(n2)
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
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
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
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?