Académique Documents
Professionnel Documents
Culture Documents
An
alisis de Algoritmos
Tema 1: Introducci
on a la Algoritmia
UCLA-Decanato de Ciencias y Tecnologa
Prof. W. Angulo
Indice
1 Definici
on de Algoritmo y Generalidades
2 Complejidad de Algoritmos
2.1 Analisis de la Complejidad de Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
4
3 M
etodos de Medici
on de la Eficicencia Temporal de Algoritmos
4
3.1 Unidad de tiempo para medir la eficiencia temporal. Caso peor, caso mejor y caso promedio . . . 6
3.2 Medida del tiempo como funcion de Operaciones Elementales (OE) . . . . . . . . . . . . . . . . . 9
3.2.1 Reglas generales para el calculo del n
umero de OE . . . . . . . . . . . . . . . . . . . . . . 13
4 Introducci
on al An
alisis Asint
otico
14
W. Angulo
Definici
on de Algoritmo y Generalidades
Historicamente el termino ALGORITMO proviene del matematico arabe AlKhwarizmi, quien escribio un tratado sobre los n
umeros en el que preserva y difunde el conocimiento de los griegos y los indios como pilares
fundamentales de la civilizacion actual. El libro es bastante intuitivo y practico, pero su principal contribucion
fue simplificar las matem
aticas a un nivel entendible por personas no expertas para su epoca.
En particular, AlKhwarizmi muestra las ventajas de usar el sistema decimal indio y expone de manera
clara la forma sistem
atica para realizar c
alculos a traves de un conjunto de pasos dise
nados para ser usados con
alg
un tipo de dispositivo mecanico similar a un abaco, ms que con lapiz y papel. A
un mas, AlKhwarizmi se
preocupaba de que su dise
no redujera considerablemente el n
umero de operaciones necesarias en cada calculo.
La siguiente es una definicion formal del termino algoritmo.
Definici
on 1 (Algoritmo). Conjunto de instrucciones que permite la resoluci
on de un problema paso a paso;
metodo de notaci
on en las distintas formas del c
alculo.
En la actualidad se maneja una cantidad determinada de definiciones equivalentes a la anterior, como por
ejemplo:
Es una receta o metodo sistem
atico que contiene una secuencia de instrucciones para resolver un problema.
Es una secuencia finita de instrucciones, cada una de las cuales tiene un significado preciso y puede
ejecutarse con una cantidad finita de esfuerzo en un tiempo finito, para encontrar la soluci
on a un problema
especfico.
Es cualquier procedimiento computacional bien definido que toma alg
un valor, o conjunto de valores, como
entrada (input) y produce alg
un valor, o conjunto de valores, como salida (output).
Resumiendo, se puede ver un algoritmo como herramienta para la soluci
on de un problema computacional bien especificado. El planteamiento del problema especifica en terminos generales la relaci
on entrada/salida
deseada. As, el algoritmo describe un procedimiento de calculo especfico para lograr la relacion de entrada/salida.
Por ejemplo, se podra necesitar un algoritmo para ordenar una sucesi
on de n
umeros en orden no decreciente.
Este problema se presenta con frecuencia en la practica y sirve de base para introducir las tecnicas de dise
no
y herramientas de analisis de algoritmos. Considerando este problema de ordenamiento se tiene dos manera de
planteamientos:
1. General: Dada una sucesion de n
umeros {a1 , a2 , . . . , an } (con cada ai Z) obtener una sucesion
{a1 , a2 , . . . , an } de manera tal que
a1 a2 an .
2. En el sentido de la algoritmia:
Entrada: Una sucesion de n n
umeros {a1 , a2 , . . . , an } enteros.
Salida: Una permutaci
on {a1 , a2 , . . . , an } (reordenamiento) de la sucesion de entrada tal que a1
a2 an .
Un ejemplo numerico sera:
Entrada: La sucesion de 6 n
umeros {31, 41, 59, 26, 41, 58}.
Salida: La permutaci
on {26, 31, 41, 41, 58, 59}.
Para el algoritmo, la sucesion de entrada se le llama INSTANCIA del problema de ordenamiento. Por tal
razon, se dira en general que una instancia de un problema es la entrada (satisfaciendo cualquier restriccion
impuesta en el planteamiento del problema) necesaria para calcular la soluci
on del problema.
Analisis de Algoritmos
Definici
on 2 (Algoritmo Correcto). Se dice que un algoritmo es correcto si, para cada instancia de entrada,
se detiene con la salida correcta.
Por la definicion anterior, se dice que un algoritmo correcto resuelve el problema computacional. Por su
parte, un algoritmo incorrecta podra no detenerse en absoluto en algunos casos de entrada, o puede detenerse
con una respuesta que no sea la deseada.
Los algoritmos son importantes a la hora de crear programas para la resolucion de problemas por medio de
una computadora. Por esta razon, a parte de ser correctos, deben poseer las siguientes caractersticas:
Unicidad: los resultados intermedios en cada paso quedan definidos de manera u
nica y solo dependen de
las entradas y los resultados de los pasos anteriores.
Finitud: El algoritmo se detiene despues de ejecutar un n
umero finito de instrucciones.
Eficiencia: Que cada etapa del algoritmo se ejecute en un tiempo finito
Un algoritmo se puede especificar en cualquier idioma, y en general se especifica en Ingles como un programa
de ordenador, o incluso como un dise
no de hardware. Sin embargo, el u
nico requisito es que la especificaci
on
debe proporcionar una descripci
on exacta del procedimiento de c
alculo a seguir. Por ejemplo, el
algoritmo de insercion y ordenamiento (Insertion-Sort) puede escribirse en espa
nol de la manera siguiente
Algoritmo 1 Insertion-Sort
Entrada: A : arreglo de n elementos A[i] indizados desde i = 1 a i = n.
Salida: A: arreglo con los elementos A[i] indizados desde i = 1 a i = n y ordenados de menor a mayor.
1: para j 2 hasta n hacer
2:
Aux A[j] //almacena el elemento a comparar con los anteriores
3:
ij1
4:
mientras i > 0 y Aux < A[i] hacer
5:
//mientras no sea el fin de la lista y Aux sea menor con uno de los
6:
//elementos anteriores, hacer desplazamientos (insertar en otras posiciones)
7:
A[i + 1] A[i]
8:
ii1
9:
fin mientras
10:
A[i + 1] Aux //colocar Aux en la posicion del u
ltimo elemento desplazado.
11: fin para
La Figura 1 muestra una ejecucion de ejemplo de este algoritmo para el arreglo A = [5 2 4 6 1 3].
W. Angulo
Complejidad de Algoritmos
Si se debe escoger un algoritmo entre varios que resuelven un mismo problema es natural preguntarse: en
funcion de que se escogera?:
de su elegancia?;
de la legibilidad?;
de la interfaz de usuario?;
de su velocidad de ejecucion?;
de la memoria que consume?;
de su portabilidad?.
No cabe duda de que todos los factores influyen. Sin embargo, la forma mas conveniente de dar una respuesta
satisfactoria al como elegir un algoritmo es bajo la concepcion de que un algoritmo es una tecnologa que
debe ser evaluada y adquirida en funcion de la disposici
on de recursos y alguna noci
on de costo. Se
definira entonces un algortmo, tecnologicamente, complejo dependiendo de su EFICIENCIA para hacer
mejor uso de los recursos disponibles a un costo definido aceptable seg
un el problema a resolver. Obviamente,
toda vez que dicha eficiencia sea evaluada debidamente, los aspectos: elegancia, legibilidad, interfaz de usuario,
portabilidad y otros, tambien podran ser considerados como criterios de evaluacion y adquisicion de un algoritmo.
2.1
An
alisis de la Complejidad de Algoritmos
M
etodos de Medici
on de la Eficicencia Temporal de Algoritmos
Esta parte del curso estara centrada en el analisis de complejidad temporal de los algoritmos, pues, por tradicion
e incidencia directa en la obtencion de respuestas a corto plazo, el tiempo de ejecucion es el factor mas importante
para determinar la eficiencia de los algoritmos como criterio de eleccion entre varios que existan para la resolucion
de un problema especfico. En la practica siempre se ha evidenciado que resulta mas determinante una correcta
eleccion del algoritmo en funcion de su tiempo de ejecuci
on que los detalles de su implementacion o, incluso,
que la eleccion de un lenguaje programacion frente a otro.
En este orden de ideas, existen tres metodos para medir la eficiencia temporal de un algoritmo:
Analisis de Algoritmos
p Z y q Z}.
n N }.
En los algoritmos interesantes el dominio de definicion suele ser infinito. Contraejemplo: Jugar la partida
de ajedrez perfecta.
3. Tama
no de un caso: de manera formal se define como el n
umero de BITS que se necesitan para
representar el caso en una computadora. De manera menos formal, se considera como aquel n
umero
entero positivo n que mide el n
umero de componentes de un caso. Por ejemplo, si se trabaja
con:
N
umeros enteros: n es el valor que toma el n
umero entero.
Vectores o listas: n es el n
umero de items en el vector o la lista; de echo es la longitud de la lista.
Grafos: n es el n
umero de vertices, flechas o aristas, o las tres cosas
W. Angulo
3.1
Unidad de tiempo para medir la eficiencia temporal. Caso peor, caso mejor y
caso promedio
Tanto el metodo a priori como el metodo a posteriori son importantes puesto que, si bien el primero ofrece
estimaciones del comportamiento de los algoritmos de forma independiente del ordenador en donde seran implementados y sin necesidad de ejecutarlos, el segundo representa las medidas reales del comportamiento del
algoritmo. Estas medidas son funciones temporales de los datos de entrada y por lo tanto la idea de hacer la
evaluaci
on de eficiencia de un algoritmo dependera de la relaci
on funcional que exista entre el tiempo
empleado por un algoritmo en procesar una entrada de tama
no n y producir una solucion al problema.
La unidad de tiempo a la que debe hacer referencia la medida de eficiencia en el metodo a priori no
puede ser expresada en segundos o en otra unidad de tiempo concreta, pues no existe un ordenador
estandar al que puedan hacer referencia todas las medidas. Se denotara por T (n) el tiempo de ejecuci
on de
un algoritmo para una entrada de tama
no n y las razones por las cuales se elige el tama
no de la entrada
son:
Se quiere una complejidad relativa, no absoluta.
Es una medida general de lo que se puede encontrarnos al ejecutar el algoritmo: queremos predecir, no
nos interesa tanto cuanto tarda para una instancia particular sino para clases de instancias.
La complejidad se hace mas abstracta que pensada en funcion de cada entrada; en general pueden existir
infinitas entradas distintas.
Teoricamente T (n) debe indicar el n
umero de instrucciones ejecutadas por un ordenador idealizado.
Se deben 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 codigo ejecutado por dos maquinas de distinta velocidad, como
de dos codigos que implementen el mismo metodo. Esta diferencia es la que acota el siguiente principio:
Teorema 3 (Principio de Invarianza). Dos implementaciones distintas de un mismo algoritmo s
olo difieren en
cuanto a eficiencia en un factor constante para valores de la entradas suficientemente grandes.
De manera mas simple lo que el principio de invarianza establece es que: dado un algoritmo y dos implementaciones suyas M1 e M2 que tienen tiempos de ejecucion T1 (n) y T2 (n), respectivamente, entonces existe
una constante c > 0 y un n
umero natural n0 tales que para todo n n0 se verifica que
T1 (n) cT2 (n).
Con el Teorema 3 se puede decir sin problemas que un algoritmo tarda un tiempo del ORDEN de
T (n) si existen una constante real c > 0 y una implementaci
on I del algoritmo que tarda menos que
cT (n), para todo tama
no n de la entrada.
Lo anterior deja claro que los dos factores a tener muy en cuenta son la constante multiplicativa c y el
n
umero natural n0 para los que se verifican las condiciones.
Ejemplo 1 (Principio de Invarianza: Por analisis a priori). Si bien a priori un algoritmo de orden cuadr
atico es
mejor que uno de orden c
ubico, en el caso de tener dos algoritmos cuyos tiempos de ejecuci
on son T1 (n) = 106 n2
106
y T2 (n) = 5n3 el primero s
olo ser
a mejor que el segundo para tama
nos de la entrada superiores a
= 200.000
5
ya que la condici
on se verifica eligiendo el n
umero natural de manera tal que
( )( 6 )
2
10
n0 >
,
3
5
y la constante
(
)
5
5
3
c = 1 + 10 10
.
106
106
Un gr
afico de esta situaci
on se muestra en la Figura 1
Analisis de Algoritmos
Figura 2: Ilustracion del Principio de Invarianza para dos algoritmos con tiempos T1 (n) = 106 n2 y T2 (n) = 5n3
Ejemplo 2 (Principio de Invarianza: Por analisis a posteriori). El algoritmo de ordenamiento de una lista
de n
umeros dados por selecci
on (Selection-Sort) funciona de la manera siguiente: Dada una lista (vector)
A = [a1 , a2 , . . . , an ]
Buscar el mnimo elemento ai , para i = 1, . . . , n, de la lista A.
Intercambiarlo con el primero, es decir a1 .
Buscar el siguiente mnimo en el resto de la lista.
Intercambiarlo con el segundo.
Y en general:
Buscar el mnimo elemento entre una posici
on i y el final de la lista.
Intercambiar el mnimo con el elemento de la posici
on i
W. Angulo
De esta manera se puede escribir el siguiente algoritmo para ordenar una lista de n elementos indexados
desde el 1:
Algoritmo 2 Selection-Sort
Entrada: A : lista (arreglo) de n elementos A[i] indizados desde i = 1 a i = n.
Salida: A: lista (arreglo) con los elementos A[i] indizados desde i = 1 a i = n y ordenados de menor a mayor.
1: para i 1 hasta n 1 hacer
2:
minimoj i
3:
Aminimo A[i]
4:
para j i + 1 hasta n hacer
5:
si A[j] < Aminimo entonces
6:
minimoj j
7:
Aminimo A[j]
8:
fin si
9:
fin para
10:
A[minimoj] A[i]
11:
A[i] Aminimo
12: fin para
Considerando fijo el mismo computador para evaluar la complejidad temporal a posteriori del Algoritmo 2,
el experimento est
a dise
nado de la manera siguiente:
Se consideran dos implementaciones del mismo algoritmo:
M1 : en lenguaje C++.
M2 : en lenguaje Java.
Ordenar vectores en el peor caso para los siguientes tama
nos: n = 5000, n = 10000, n = 20000 y n = 50000.
La siguiente tabla muestra los resultados de tiempos de ejecuci
on para todos los cuatro tama
nos n de las
instancias dadas:
n
T1
T2
k = T1 /T2
5000 0.025 seg 0.03 seg 0.833333
10000
0.1 seg
0.12 seg 0.833333
20000
0.4 seg
0.48 seg 0.833333
50000 2.54 seg 3.08 seg 0.833333
2 para
En estos resultados se puede observar que en todos los casos T1 = kT2 para k = 0.833333 y que T1 < kT
k = 1. Esto nos dice que el principio de invarianza, a posteriori, se verifica para una constante C 0.833333.
En muchos casos, la complejidad de tiempo de un algoritmo es igual para todas las instancias de tama
no
n del problema. En otros casos, la complejidad de un algoritmo de tama
no n es distinta dependiendo de las
instancias de tama
no n del problema que resuelve. Es decir: el comportamiento de un algoritmo puede cambiar
notablemente para diferentes entradas (por ejemplo, lo ordenados que se encuentren ya los datos a ordenar).
Esto nos lleva a estudiar la complejidad del peor caso, mejor caso, y caso promedio:
Peor caso (generalmente): Para un tama
no dado n, la complejidad del algoritmo en el peor caso
resulta de tomar el maximo tiempo (complejidad maxima) en que se ejecuta el algoritmo, entre todas las
instancias del problema (que resuelve el algoritmo) de tama
no n.
Caso promedio (algunas veces): Para un tama
no dado n, la complejidad del algoritmo en el caso
promedio es el tiempo esperado del algoritmo sobre todas las entradas de tama
no n. Necesita asumir
una distribuci
on estadstica de las entradas y por tal razon se define de manera formal como la
esperanza matem
atica del tiempo de ejecucion del algoritmo para entradas de tama
no n.
Analisis de Algoritmos
3.2
10
W. Angulo
Analisis de Algoritmos
11
j=2
As:
j=
n(n + 1)
1.
2
[
]
n(n + 1)
T4 = 4
1
2
= 2n(n + 1) 4,
(j 1) =
j=2
As:
n(n 1)
.
2
[
]
n(n 1)
T7 = 3
2
3
= n(n 1),
2
es decir: T7 (n) =
3 2 3
n n.
2
2
Lnea 8: OE8 = 2 y
N8 =
(j 1) =
j=2
As:
n(n 1)
.
2
[
]
n(n 1)
T8 = 2
2
= n(n 1),
es decir: T8 (n) = n2 n.
Lnea 10: OE10 = 2 y N10 = (n 1). As T10 = 2 (n 1) = 2n 2.
Por lo anterior, el tiempo de ejecuci
on del algoritmo en el peor caso sera:
T (n) = T1 + T2 + T3 + T4 + T7 + T8 + T10
(
)
3 2 3
= (n 1 + 2n 2 + 2n 2) + (2n2 + 2n 4) +
n n + (n2 n) + (2n 2)
2
2
(
) (
)
3
3
= 2n2 + n2 + n2 + n + 2n + 2n + 2n n n + 2n (1 + 2 + 2 + 2 + 4)
2
2
(
)
(
)
3
3
= 2 + + 1 n2 + 1 + 2 + 2 + 2 1 + 2 n (1 + 2 + 2 + 2 + 4)
2
2
9 2 13
= n + n 11.
2
2
12
W. Angulo
j+3
j=2
, N7 = N8 =
j+3
j=2
1,
1 2
1
(n + 7n 8), N7 = N8 = (n2 + 3n 4).
4
4
Analisis de Algoritmos
13
En la Figura 3 se ilustran gr
aficamente el comportamiento de los tiempos para el mejor caso, el peor caso y
el caso promedio del Algoritmo 1. Se evidencia claramente que el tiempo de complejidad del caso promedio tiene
por cota inferior el tiempo en el mejor caso y por cota superior el tiempo en el peor caso (es un promedio entre
ambos casos), sin embargo el compotamiento tiende al peor caso para todo tama
no n de la instancia y a
un m
as
cuando n crece.
Figura 3: Tiempos del Algoritmo 1 para: el mejor caso, el peor caso y el caso promedio
Si se realiza la pregunta siguiente: Insertion-Sort es un buen algoritmo?, la respuesta sera: relativamente bueno para n peque
no y no tan bueno para n grande.
3.2.1
14
W. Angulo
(
)
T = T (C) + (n
umero de iteraciones) T (S1) + T (S2) + + T (Sn) .
5. El tiempo de ejecucion para el resto de sentencias iterativas (bucles): PARA, REPEAT, LOOP, se calculan
expresandolos como un bucle equivalente de sentencias mientras.
6. El tiempo de ejecucin de una llamada a un procedimiento o funcion: F(P1,P2,. . .,Pn) es 1 por la llamada,
mas el tiempo de ejecucion de cada parametro P1,P2,. . .,Pn, mas el tiempo que tarda en ejecutarse F.
Esto es:
(
)
T = 1 + T (P 1) + T (P 2) + T (P n) + T (F ).
No contabilizamos la copia de los argumentos a la pila de ejecucion, 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 parametros por referencia, por tratarse simplemente de
punteros, no contabiliza tampoco.
7. El tiempo de ejecucion de las llamadas a procedimientos recursivos va a dar lugar a ecuaciones en
recurrencia, que veremos posteriormente.
8. Tambien es necesario tener en cuenta, cuando el compilador las incorpore, las optimizaciones del codigo
y la forma de evaluaci
on de las expresiones, que pueden ocasionar cortocircuito o realizarse de forma
perezosa (lazy). En el presente trabajo supondremos que no se realizan optimizaciones, que existe el
cortocircuito y que no existe evaluaci
on perezosa.
Introducci
on al An
alisis Asint
otico
En las secciones anteriores se dijo que el tiempo de ejecucion de un algoritmo depende del tama
no n del problema.
En conseuencia, como es de esperar, la mayora de los algoritmos requiere m
as tiempo para completar su
ejecucion a medida que n crece. Por ejemplo, si se tiene un algoritmo que requiere (n3 + n) pasos para ser
ejecutado se puede estimar que su complejidad temporal es del orden de n3 ; lo que indicara que su complejidad
crece c
ubicamente.
Al analisis de complejidad temporal de un algoritmo, estimada en alg
un orden respecto del tama
no n cuando
este tiende a infinito (crece), se le conoce con el nombre de An
alisis Asint
otico. La justificacion de este analisis
es en cuanto a las siguientes premisas:
Los distintos algoritmos que resuelven un mismo problema pueden tener grandes diferencias en su tiempo
de ejecucion, a veces, de ordenes de magnitud considerablemente distintos.
Interesa calcular, de forma aproximada, el orden de magnitud que tiene el tiempo de ejecucion de cada
algoritmo.
Analisis de Algoritmos
15
En la practica el tama
no de los datos es muy grande y en consecuencia los costos de los algoritmos
pueden variar significativamente a pesar de que posean ordenes, respecto del tama
no n, no tan distintos
para sus tiempos de ejecucion.
El el analisis asint
otico, el orden (lineal, cuadratico, logartmico, exponencial, etc.) de la funcion T (n),
que mide la complejidad tempotal del algoritmo, es el que expresar
a el comportamiento DOMINANTE
cuando el tama
no de la ENTRADA ES GRANDE. Se dice que se tiene un comportamiento asint
otico
del algoritmo en el lmite cuando la entrada es suficientemente grande.
De acuerdo a lo anterior, el analisis asintotico tiene como objetivo proporcionar una m
etrica adecuada
para comparar algoritmos basada en el comportamiento de sus complejidades temporales cuando el tama
no n
del problema sea grande, esto es:
lm T (n).
n
En atencion a la complejidad temporal en el peor caso: sea Dn el conjunto de datos de entrada de tama
no
n para un algoritmo y sea
t : Dn Rang(t);
con Rang(t) un subconjunto de N, Q y R dependiendo el caso, la funcion que a cada dato I Dn le asigna el
valor t(I) representando el tiempo que tarda el algoritmo en procesar la entrada I. Entonces la complejidad del
algoritmo en el peor caso se denota y define matematicamente como
Tpeor (n) = max {t(I)}.
IDn
|I|=n
Para el Algoritmo 1
max {t(I)} =
IDn
|I|=n
9 2 13
n + n 11,
2
2
n 0.
t(I) = T (n) C
n + n 11 ,
2
2
indicando que cuando n se haga muy grande el tiempo t(I) que tarda el algoritmo para el procesamiento de la
RAPIDO
16
W. Angulo
Referencias
[1] Brezzi F., Lions J.-L. and Pironneau O. The Chimera method for a model problem, por aparecer en Numerical Mathematics and Advanced Applications, Springer-Verlag, Italie.