Está en la página 1de 16

Notas de Curso 2015-1

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].

Figura 1: Ejemplo de ejecucion de Insert-Sort

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

En atencion a la tecnologa algortmica, el an


alisis de complejidad de algortmos es aquel destinado a
evaluar la eficiencia de dicho algoritmo. Y por su parte, como ya se indico, la eficiencia del algoritmo
sera una medida del uso de los recursos y el costo asociados a su ejecucion en un computador. Por tal razon, el
analisis de complejidad se puede dividir en dos partes:
Analisis de la complejidad o coste espacial : que mide el espacio de memoria para contener y manipular
el algoritmo como un programa, mas: los datos, medios de almacenamiento secundarios y redes entre otros
(complejidad en espacio).
Analisis de la complejidad o coste temporal : que mide el tiempo que tarda en ejecutarse para resolver
el problema.
Ambos analisis determinaran el coste o complejidad computacional del algoritmo, pero debe tenerse
en cuenta que no siempre coincidiran consumo espacial
optimo con mnimo coste temporal. A
un mas,
ambos factores entrar
an, normalmente, en competencia y por tal razon en ocasiones se estara en obligacion de
adoptar compromisos razonables entre ambos costos; lo que se denomina en tecnologa algortmica: equilibrio
de costos.

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

Metodo a posteriori o emprico: que consiste en programar el algoritmo y evaluarlo en un n


umero
muy grande de casos en los que se mide su tiempo de ejecucion.
Metodo a priori o te
orico: Se mide su rapidez de ejecucion, antes de programarlo, mediante herramientas matematicas; expresando el tiempo como una funcion del tama
no de los casos considerados para
la resolucion de un problema especfico.
Metodo hbrido: Parte se mide teoricamente y parte se mide experimentalmente.
Las desventajas del metodo emprico tienen su origen en que:
Restringe la comparacion de algoritmos sobre diversos soportes; depende del lenguaje de programacion.
Requiere programar cada uno de los algoritmos para ver cual es el mejor; implicando un coste economico.
Por otro lado, consecuentemente, las ventajas del metodo teorico son:
Analiza el algoritmo y no al programa en concreto; por lo que resulta ser independiente del leguaje de
programaci
on.
No hay que programar los algoritmos.
Cualquiera que sea el metodo que se utilice, se deben tener en cuenta las siguientes definiciones b
asicas:
1. Caso: es el dato inicial al cual se le aplicara el algoritmo. Por ejemplo, si se quiere aplicar el algoritmo
de multiplicaci
on rusa a dos n
umeros enteros: p y q, entonces algunos casos seran:
(p, q) = (34, 6), (p, q) = (23, 43), (p, q) = (90, 32), . . .
Otro ejemplo: para el Algoritmo 1 un caso ser el arreglo A = [5 2 4 6 1 3] que es un vector de N6 .
2. Dominio de definici
on: es el conjunto de casos a los que es posible aplicar el algoritmo. Por ejemplo,
para el algoritmo que multiplica dos n
umeros enteros a la rusa el dominio de definicion sera:
{(p, q);

p Z y q Z}.

Para el Algoritmo 1, por ejemplo, el dominio sera:


{A Nn ;

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

Mejor caso (falso): Para un tama


no dado n, la complejidad del algoritmo en el mejor caso es el
menor tiempo en que se ejecuta el algoritmo para entradas de tama
no n.
Por defecto se toma la complejidad del PEOR CASO como medida de la complejidad T (n) del algoritmo.

3.2

Medida del tiempo como funci


on de Operaciones Elementales (OE)

En el momento de medir el tiempo, siempre se hara en funci


on del n
umero de operaciones elementales
que realiza dicho algoritmo, entendiendo por operaciones elementales (en adelante OE) aquellas que el ordenador
realiza en tiempo acotado por una constante (que no depende del tamao de la entrada). Seran consideradas
como OE:
operaciones aritmeticas basicas;
asignaciones a variables de tipos basicos o predefinidos por el compilador;
comparaciones logicas;
operaciones logicas basicas;
los saltos: llamadas a funciones y procedimientos, retornos desde ellos etc.
transferencias de control;
el acceso a estructuras indexadas basicas como: vectores
otras;
todo esto bajo la hipotesis de que se ha fijando un modelo de computo abstracto (maquina hipotetica) para
tener claramente cuales son las OE a emplear en la medicion del tiempo. Cada una de las operaciones anteriores
se contabiliza como 1 OE.
Observaci
on 1.
1. En conclusi
on, el tiempo de ejecuci
on de un algoritmo va a ser una funci
on que mide el n
umero de
operaciones elementales que realiza el algoritmo para un tama
no de entrada n dado.
2. En general, es posible realizar el estudio de la complejidad de un algoritmo s
olo en base a un conjunto
reducido de sentencias, aquellas que caracterizan que el algoritmo sea lento o r
apido en el sentido que nos
interesa.
3. Es posible distinguir entre los tiempos de ejecuci
on de las diferentes operaciones elementales, lo cual es
necesario a veces por las caractersticas especficas del ordenador. Por ejemplo, se podra considerar que
las operaciones + y presentan complejidades diferentes debido a su implementaci
on. Sin embargo, en
este texto tendremos en cuenta, a menos que se indique lo contrario, todas las operaciones elementales del
lenguaje, y supondremos que sus tiempos de ejecuci
on son todos iguales.
Ejemplo 3. A continuaci
on se determinar
an los tiempos de ejecuci
on del Algoritmo 1 para el mejor caso, el
peor caso y el caso promedio como medidas del n
umero de OE que realiza para el tama
no de entrada n dado.
Lo primero que se debe hacer es el conteo de OE por cada lnea considerando que es el coste o tiempo de
ejecuci
on individual de cada lnea en el algoritmo. Posteriormente cada uno de estos costes debe ser m
ultiplicado
por las veces que el algoritmo incurre en el, totalizar y de esa manera obtener el T (n).
1. N
umero de OE que realiza:
Lnea 1. Se ejecuta 1 OE: la asignaci
on: j 2.

10

W. Angulo

Lnea 2. Se ejecutan 2 OE: un acceso A[j] al vector A y la asignaci


on Aux A[j].
Lnea 3. Se ejecutan 2 OE: la operaci
on arirmetica j 1 y la asignaci
on i j 1.
Lnea 4. Se ejecutan 4 OE: dos comparaciones {i > 0, Aux < A[i]}, un acceso A[i] al vector A y la operaci
on
l
ogica con Y.
Lnea 5. Se ejecuta 0 OE: es un comentario.
Lnea 6. Se ejecuta 0 OE: es un comentario.
Lnea 7. Se ejecutan 3 OE: dos accesos {A[i + 1], A[i]} al vector A y la asignaci
on A[i + 1] A[i].
Lnea 8. Se ejecutan 2 OE: la operaci
on arirmetica i 1 y la asignaci
on i i 1.
Lnea 10. Se ejecutan 2 OE: un accesos A[i + 1] al vector A y la asignaci
on A[i + 1] Aux.
2. Tiempo en el mejor caso: Para este caso el vector A est
a ordenado y no se ejecutar
a el bucle correspondiente a la inserci
on. De esta manera se consideran s
olo las OE por lneas, y parte de estas, que se
ejecutan, se cuenta el n
umero de veces que se lleva a cabo la ejecuci
on y el tiempo de la lnea ser
a calculado
de la manera siguiente: Sea K N el n
umero total de lneas en el algoritmo. Entonces el tiempo que tarda
la k-esima fila vendr
a dado por
Tk = OEk Nk ; k = 1, . . . , K,
donde OEk y Nk denotan, respectivamente, el n
umero total de OE que se ejecutan en la lnea k y el
n
umero de veces que se repite la ejecuci
on. En este orden de ideas se tendr
a:
Lnea 1: OE1 = 1 y N1 = (n 1). As T1 = 1 (n 1) = (n 1).
Lnea 2: OE2 = 2 y N2 = (n 1). As T2 = 2 (n 1) = 2(n 1).
Lnea 3: OE3 = 2 y N3 = (n 1). As T3 = 2 (n 1) = 2(n 1).
Lnea 4: OE4 = 4 aunque el resultado de la evaluaci
on resulte ser FALSE y cortocircuite el bucle MIENTRAS. Es
importante se
nalar que se est
a suponiendo que las operaciones se evaluan seg
un la norma algortmica:
de izquierda a derecha y que para el caso de las expresiones l
ogicas se produce cortocircuito
apenas se obtenga el resultado que impida la entrada a un bucle. Por lo tanto, para este Algoritmo en
el mejor tiempo, si la condici
on para entrar al bucle se hubiese planteado (fortuita o erroneamente)
de la forma: Aux < A[i] y i > 0, entonces la comparaci
on Aux < A[i] resulta FALSE y produce
un cortocircuito que impedira seguir evaluando el resto de la expresi
on. En tal situaci
on se debe
tomar tomar OE4 = 2; ya que s
olo se evalua la mitad: el acceso A[i] al vector A y la comparaci
on
con el valor Aux. En vista de que no es esta la situaci
on, con N4 = (n 1), se tiene en definitiva
que T4 = 4 (n 1) = 4(n 1).
Lnea 10: OE10 = 2 y N10 = (n 1). As T10 = 2 (n 1) = 2(n 1).
Por lo anterior, el tiempo de ejecuci
on del algoritmo en el mejor caso sera:
T (n) = T1 + T2 + T3 + T4 + T10
= (n 1) + 2(n 1) + 2(n 1) + 4(n 1) + 2(n 1)
= 11(n 1).
Esto quiere decir que es una funci
on lineal con respecto al tama
no n de los datos:
T (n) = n +
con y ; en este caso = 11 y = 11.
3. Tiempo en el peor caso: Para este caso el vector A est
a desordenado con A en el orden inverso y se
ejecutar
a el bucle correspondiente a la inserci
on para toda j = 2, . . . , n. En este caso se tendr
a que:

Analisis de Algoritmos

11

Lnea 1: OE1 = 1 y N1 = (n 1). As T1 = 1 (n 1) = n 1.


Lnea 2: OE2 = 2 y N2 = (n 1). As T2 = 2 (n 1) = 2n 2.
Lnea 3: OE3 = 2 y N3 = (n 1). As T3 = 2 (n 1) = 2n 2.
Lnea 4: OE4 = 4 con resultado de la evaluaci
on igual a TRUE y
N4 =

j=2

As:

j=

n(n + 1)
1.
2

[
]
n(n + 1)
T4 = 4
1
2
= 2n(n + 1) 4,

es decir: T4 (n) = 2n2 + 2n 4.


Lnea 7: OE7 = 3 y
N7 =

(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

Esto quiere decir que es una funci


on cuadr
atica con respecto al tama
no n de los datos:
T (n) = n2 + n +
con , y constantes; en este caso = 9/2, = 13/2 y = 11.
4. Tiempo en el caso promedio: Cuando en el Algoritmo 1 se est
a considerando al elemento A[i], ya se
han ordenado (i 1) datos. Si A[i] es el m
as grande de todos los i n
umeros, entonces el ciclo interior no
se ejecuta y dentro de este ciclo interior no hay en absoluto ning
un movimiento de datos (inserci
on). Si
A[i] es el segundo m
as grande de todos los i n
umeros, habr
a un intercambio de datos, y as sucesivamente.
En el sentido de un tiempo promedio, podemos decir que A[i] tiene cierta probabilidad de que sea el m
as
grande para i = 1, . . . , n. Por lo tanto, las OE dentro del ciclo interior se ver
an afectadas por la densidad
de probabilidad que se le asocie al dato. Ya que existen i posibilidades, entonces se puede considerar a
priori que son equiprobables y por lo tanto cada una tendr
a una probabilidad asociada de 1/i. Esta
tambien es la la probabilidad de que A[i] sea el j-esimo m
as grande para 1 j i. En consecuencia el
promedio dentro del ciclo ser
a:
2 3
i + 1 (j + 1)
i+3
+ + +
=
=
.
i
i
i
i
2
j=1
i

De esta manera el tiempo Tk las lneas k = 4, k = 7 y k = 8 tendr


a el siguiente Nk :
N4 =

j+3
j=2

, N7 = N8 =

j+3
j=2

1,

que al desarrollar se convierten en:


N4 =

1 2
1
(n + 7n 8), N7 = N8 = (n2 + 3n 4).
4
4

Por lo anterior, el tiempo de ejecuci


on del algoritmo en el caso promedio sera:
T (n) = T1 + T2 + T3 + T4 + T7 + T8 + T10
3
1
= (n 1 + 2n 2 + 2n 2) + (n2 + 7n 8) + (n2 + 3n 4) + (n2 + 3n 4) + (2n 2)
4
2
(
)
(
)
5 2
15
= 1+
n + 1+2+2+7+
+ 2 n (1 + 2 + 2 + 2 + 8 + 5)
4
4
9
71
= n2 + n 20.
4
4
Al igual que el tiempo en el peor caso, el tiempo en el caso promedio es una funci
on cuadr
atica con
respecto al tama
no n de los datos:
T (n) = n2 + n +
con , y constantes; en este caso = 9/4, = 71/4 y = 20. Esto indica que el caso promedio es,
relativamente, tan costoso como lo es el peor caso.

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

Reglas generales para el c


alculo del n
umero de OE

La siguiente lista presenta un conjunto de reglas generales para el calculo del n


umero de OE, siempre considerando el peor caso. Estas reglas definen el n
umero de OE de cada estructura basica del lenguaje, por lo que el
n
umero de OE de un algoritmo puede hacerse por induccion sobre ellas.
1. Se considera que el tiempo de una OE es, por definicion, 1.
2. El tiempo de ejecucion de una secuencia consecutiva de instrucciones se calcula sumando los tiempos de
ejecucion de cada una de las instrucciones.
3. El tiempo de ejecucion de la estructura selectiva
si <condicion C> entonces
<accion S1>
sino
<accion S2>
fin_si
es
T = T (C) + max{T (S1), T (S2)}.

14

W. Angulo

4. El tiempo de ejecucion de un bucle de sentencias


mientras <condicion C> hacer
<accion S1>
<accion S2>
:
<accion Sn>
fin_mientras
es

(
)
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

que es el t(I) para la instancia I Dn , de tama


no |I| = n, que representa al vector A = [a1 , a2 , . . . , an ] tal que
an an1 a2 a1 .
En el analisis asint
otico Tpeor (n) representa una cota superior para la complejidad temporal T (n) del
algoritmo, es decir: existe una constante C > 0 tal que
peor (n);
T (n) CT

n 0.

En el caso del Algoritmo 1, cualquier instancia I Dn dada, de tama


no |I| = n que no sea ni el vector A ya
ordenado ni el vector A desordenado tal que an an1 a2 a1 , esta tendra un tiempo de ejecucion
(
)
9 2 13

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

instancia I NO CRECE MAS


que una funcion cuadratica respecto de n. Es decir: t(I) A LO
SUMO crece TAN DE PRISA como crece Tpeor (n). De echo t(I) se calcula a partir de las OE salvo que,
con respecto al calculo del Tpeor , el n
umero de veces que estas se ejecutan variara y por tanto las constantes
que definen la funcion cuadratica: , y , pueden tomar cualquier valor incluyendo al cero.
La idea fundamental consiste, entonces, en tratar de encontrar una funcion Tpeor (n), facil de calcular y
conocida, que acote asint
oticamente el orden de crecimiento de la complejidad temporal T (n) del algoritmo.

Esto proporcionara GARANTIAS


sobre la eficiencia del algoritmo ya que su costo n
unca excedera el costo
en el peor caso; lo que se conoce como eficiencia asint
otica del algoritmo.

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.