You are on page 1of 57

Anlisis de Algoritmos

Ma. Luisa Velasco Ramrez

Algoritmo
Es un conjunto finito de instrucciones precisas para resolver un problema. Su ejecucin requiere ciertos recursos.

1.1. Introduccin.

0 ms entradas

Memoria

Comunicaciones

ALGORITMO

1 ms salidas

Caractersticas de un algoritmo
Debe ser Preciso; Esto es, debe especificar sin ambigedad el orden en que se deben ejecutar las instrucciones.

Debe estar Definido; Esto es, cada vez que se ejecute bajo las mismas condiciones, la secuencia de ejecucin deber ser la misma proporcionndonos el mismo resultado.

Debe ser Finito; Esto es, siempre que sea adecuado se realizarn un nmero finito de instrucciones, en un tiempo finito y requiriendo una cantidad finita de esfuerzo.

Razones para Estudiar los Algoritmos


Evitar reinventar la rueda. Ayuda cuando se desarrollen propios algoritmos. Ayuda a entender herramientas que usan algoritmos particulares. til conocer tcnicas empleadas para resolver problemas de determinados tipos. Utilizar el algoritmo ms eficiente

Eficiencia de Algoritmos
Desarrollar programas que sean prcticos, en trminos de requerimientos de almacenamiento y tiempo de ejecucin Cmo determinar cul es "el mejor"?

Estrategia emprica Estrategia terica Consiste en determinar matemticamente la cantidad de recursos (tiempo, espacio) que necesitar el algoritmo en funcin del tamao del ejemplar considerado.

El tamao de un ejemplar x corresponde formalmente al nmero de dgitos binarios necesarios para representarlo en la computadora. Pero a nivel algortmico se considerar el tamao como el nmero de elementos lgicos contenidos en el ejemplar.

Concepto de Eficiencia
Un algoritmo es eficiente cuando logra llegar a sus objetivos planteados utilizando la menor cantidad de recursos posibles, es decir, minimizando el uso memoria, de pasos y de esfuerzo humano.

Un algoritmo es eficaz cuando alcanza el objetivo primordial.

Dos

fundamentales:

Espacio y tiempo. La eficiencia en espacio es una medida de la cantidad de memoria requerida por un programa.

La eficiencia en tiempo se mide en trminos de la cantidad de tiempo de ejecucin del programa.

Recurso Tiempo:
Aplicaciones informticas que trabajan en tiempo real requieren que los clculos se realicen en el menor tiempo posible. Aplicaciones que manejan un gran volumen de informacin si no se tratan adecuadamente pueden necesitar tiempos impracticables.

Recurso Memoria:
Las mquinas tienen una memoria limitada

Anlisis A Priori y Prueba A Posteriori


El Anlisis A Priori (o terico) es siempre un estudio terico previo a la implementacin. Puede servir para evitar la implementacin, si el algoritmo es poco eficiente.

Esto es interesante porque:


La prediccin del costo del algoritmo puede evitar una implementacin posiblemente laboriosa. Es aplicable en la etapa de diseo de los algoritmos, constituyendo uno de los factores fundamentales a tener en cuenta.

Prueba A Posteriori
En la Prueba A Posteriori (experimental o emprica) se recogen estadsticas de tiempo y espacio consumidas por el algoritmo mientras se ejecuta. La estrategia emprica consiste en programar los algoritmos y ejecutarlos en una computadora sobre algunos ejemplares de prueba, haciendo medidas para:

una mquina concreta, un lenguaje concreto, un compilador concreto y datos concretos

Concepto de Instancia
Un problema computacional tiene una o ms instancias, que son valores particulares para los datos de entrada, sobre los cuales se puede ejecutar el algoritmo para resolver el problema.

En la teora de algoritmos es muy frecuente usar el trmino instancia para indicar un caso especfico de un problema. As, por ejemplo, si el problema es la multiplicacin de 2 enteros positivos una instancia es el par de nmeros a multiplicar.

Tamao de los Datos


Variable o expresin en funcin de la cual se intentara medir la complejidad del algoritmo

Se definen entonces las funciones de cantidad de recursos en base al tamao (o talla) de la entrada.
Suele depender del nmero de datos del problema.

Este tamao puede ser: 1. la cantidad de dgitos para un nmero, 2. la cantidad de elementos para un arreglo, 3. la cantidad de caracteres de una cadena, 4. en problemas de ordenacin es el nmero de elementos a ordenar, 5. en matrices puede ser el nmero de filas, columnas o elementos totales, 6. en algoritmos recursivos es el nmero de recursiones o llamadas propias que hace la funcin.

Peor caso: indica el mayor tiempo obtenido,


teniendo en consideracin todas las entradas posibles.

Anlisis Peor Caso, Mejor Caso y Caso Promedio

Mejor caso: indica el menor tiempo obtenido, teniendo en consideracin todas las entradas posibles.

Media: indica el tiempo medio obtenido, considerando todas las entradas posibles.

Ejemplo
Sea A una lista de n elementos A1 , A2, A3, ... , An. Ordenar significa permutar estos elementos de tal forma que los mismos queden de acuerdo con un orden preestablecido. Ascendente A1<=A2<=A3 ..........<=An Descendente A1>=A2 >=........>=An Caso peor: Que el vector est ordenado en sentido inverso. Caso mejor: Que el vector est ordenado. Caso medio: Cuando el vector est desordenado aleatoriamente.

Metas en el diseo de programas de cmputo:


El diseo de un algoritmo que sea fcil de entender, codificar y depurar (Ingeniera de Software). El diseo de un algoritmo que haga uso eficiente de los recursos de la computadora (Anlisis y Diseo de algoritmos).

El anlisis de algoritmos permite medir la dificultad inherente de un problema y evaluar la eficiencia de un algoritmo.

Tiempo de Ejecucin
Una medida que suele ser til conocer es el tiempo de ejecucin de un algoritmo en funcin de N, lo que denominaremos T(N). Esta funcin se puede medir fsicamente
(ejecutando el programa, reloj en mano), o calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instruccin.

S1; FOR i:= 1 TO N DO S2 END; requiere: T(N):= t1 + t2*N

Siendo t1 el tiempo que lleve ejecutar la serie "S1" de sentencias, y t2 el que lleve la serie "S2".

Tmin(N) <= T(N) <= Tmax(N) Los extremos son habitualmente conocidos como "caso peor" y "caso mejor".

De este modo, el tiempo de ejecucin puede ser definido como una funcin de la entrada. Se definir T(n) como el tiempo de ejecucin de un algoritmo para una entrada de tamao n.

Concepto de Complejidad
La complejidad (o costo) de un algoritmo es una medida de la cantidad de recursos (tiempo, memoria) que el algoritmo necesita. La complejidad de un algoritmo se expresa en funcin del tamao (o talla) del problema.

Se expresa como f(n)

El comportamiento de la funcin determina la eficiencia. No es nica para un algoritmo: depende de los datos.

Para un mismo tamao del problema, las distintas presentaciones inciales de los datos dan lugar a distintas funciones de complejidad.
Es el caso de una ordenacin si los datos estn todos inicialmente desordenados, parcialmente ordenados o en orden inverso.

La complejidad de un algoritmo se expresar en trminos de la cantidad de operaciones que realiza. Cada operacin requiere cierta cantidad constante de tiempo para ser ejecutada, por esta razn si se cuenta el nmero de operaciones realizadas por el algoritmo se obtiene una estimacin del tiempo que le tomar resolver el problema.

Dado un algoritmo, se puede determinar que tipos de operaciones utiliza y cuantas veces las ejecuta para una entrada especfica.

Para hacer una estimacin de la cantidad de tiempo que tarda un algoritmo en ejecutarse, no es necesario contar el nmero total de operaciones que realiza. Se puede elegir alguna, a la que se identificar como operacin bsica que observe un comportamiento parecido al del nmero total de operaciones realizadas y que, por lo tanto, ser proporcional al tiempo total de ejecucin.

En general, debe procurarse que la operacin bsica, en la cual se basa el anlisis, de alguna forma est relacionada con el tipo de problema que se intenta resolver, ignorando las asignaciones de valores inciales y las operaciones sobre variables para control de ciclos (ndices).

Ejemplo 1. El siguiente algoritmo obtiene el producto de los dos valores ms grandes contenidos en un arreglo A de n enteros.

En este algoritmo se realizan las siguientes operaciones: a) Comparacin entre mayor1; mayor2 y los elementos del arreglo. b) Asignaciones a mayor1 y mayor2 c) Asignacin al ndice i d) Asignacin a la funcin e) Producto de los mayores f) Incremento al ndice g) Comparacin entre el ndice i y la longitud del arreglo n

Las operaciones (c), (f) y (g) no se consideran por realizarse entre ndices, las operaciones (d) y (e) se ejecutan una sola vez y no son proporcionales al nmero total de operaciones. Entonces, se tiene que las operaciones que se pueden considerar para hacer el anlisis son: las comparaciones entre mayor1; mayor2 y los elementos del arreglo y las asignaciones a los elementos mayores.

Resumiendo, el anlisis de un algoritmo se puede hacer considerando slo aquella operacin que cumpla los siguientes criterios:

a) Debe estar relacionada con el tipo de problema que se resuelve. b) Debe ejecutarse un nmero de veces cuyo modelo de crecimiento sea similar al del nmero total de operaciones que efecta el algoritmo. Si ninguna de las operaciones encontradas cumple con ambos criterios, es posible declinar el primero. Si an as no es posible encontrar una operacin representativa, se debe hacer un anlisis global, contando todas las operaciones.

Con los conceptos enunciados hasta aqu es posible calcular la funcin complejidad temporal ft(n) para un algoritmo simple.

Considrese el siguiente Algoritmo, para hacer el anlisis de su comportamiento tomemos como operacin bsica las comparaciones con elementos del arreglo y como caso muestra: A = [2; 7; 4; 1; 3] y n = 5: Si Valor = 2, se hace una comparacin, ft(5) = 1 Si Valor = 4, se hacen tres comparaciones, ft(5) =3 Si Valor = 8, se hacen cinco comparaciones, y ft(5) = 5

rdenes de Complejidad
Se dice que O(f(n)) define un "orden de complejidad". Se elegir como representante de este orden a la funcin f(n) ms sencilla del mismo.

As se tiene:
O(1) orden constante O(log n) orden logartmico O(n) orden lineal O(n2 ) orden cuadrtico O(n3) orden cubica O(na) orden polinomial (a > 2) O(an) orden exponencial (a > 2) O(n!) orden factorial

La mejor tcnica para diferenciar la eficiencia de los algoritmos es el estudio de los rdenes de complejidad. El orden de complejidad se expresa generalmente en trminos de la cantidad de datos procesados por el programa, denominada n, que puede ser el tamao dado o estimado.

Notacin Asinttica
El inters principal del anlisis de algoritmos radica en saber cmo crece el tiempo de ejecucin, cuando el tamao de la entrada crece.

Esto es la eficiencia asinttica del algoritmo. Indican como crece t, para valores suficientemente grandes (asintticamente) sin considerar constantes

Reglas
Sentencias if Suele ser constante O(1) Bucles for (i=0; i < n; i++) O(n) s; O(1) O(n)
O(n) O(1)

for (i=o; i < n i++)


for (j=0; j < n; j++) s;

h=1
while (h < n) {
s; h = 2 * h; }

for (i=o; i < n i++) O(n)


for (j=0; j < n; j++) O(n) s; O(1)

El logaritmo en base a de un nmero n, es otro nmero b, tal que cumple esta ecuacin: ab = n.

h = n; While (h >1) { for (i =o; i< n; i++) caso 1 O(n) { s; } caso 2 O(1) h = h/2; caso 3 O(log n) }(while)

Resultado:

El algoritmo tiene orden de complejidad:

O (n log n)

Calcule el orden de complejidad de los siguientes algoritmos: i)for( i =0; i<n; i++){ for( j=0; j<n; j++){ suma = 0; for( k = 0; k<n; k++) suma += a[i][k] * b[k][j]; } }

i= 1; while(i <= n) { x *= 6; i++; }

if (x < y) { resta = y x; } else { resta = x y; }

Fuente Bibliogrfica:
Prez Corts, E. & Kinney Romero, Ren(2005).Anlisis de Algoritmos. Disponible en: http://docencia.izt.uam.mx/pece/pagina_academica/AA/ Docum/AAPrimera.PDF
Anlisis de Algortmos. M.C.C. Ericka Rechy Ramrez Ejercicios de Complejidad.

You might also like