You are on page 1of 6

3004597 Estructuras de Datos Modulo 12

Universidad Nacional de Colombia Sede Medelln

MODULO 12
OBJETIVOS Por medio de este mdulo se pretende: Afiance sus conocimientos acerca de la medida del orden de los algoritmos. Aplique mtodos prcticos que le permitan calcular el orden de un algoritmo dado y aprenda a interpretar los resultados. Compare la eficiencia de diferentes algoritmos que llevan a cabo la misma tarea por medio del clculo del orden.

CONTENIDO 1. Mtodos de anlisis de algoritmos 1.1 Reglas tericas 1.2 Reglas prcticas 1.3 Barmetro 1.3.1 A Referencias B Taller Seleccin de barmetro

01-2006

3004597 Estructuras de Datos Modulo 12

Universidad Nacional de Colombia Sede Medelln

MTODOS DE ANLISIS DE ALGORITMOS

Realmente no existe una frmula siempre aplicable para analizar la eficiencia de un algoritmo. Bsicamente se trata de una cuestin de buen juicio, intuicin y experiencia. A menudo un primer anlisis da origen a una funcin de apariencia complicada, que envuelve sumatorias y recurrencias y el siguiente paso es simplificar esta expresin buscando una funcin que represente el orden del algoritmo de la manera ms sencilla posible. A continuacin se presentan algunos ejemplos prcticos. Es importante recordar que N representa el tamao del programa y su principal caracterstica es que vara en cada ejecucin, por ejemplo, en un programa de ordenamiento de un arreglo, N sera el nmero de elementos del arreglo. 1.1 REGLAS TERICAS A continuacin se presentan varias reglas que son muy tiles para efectuar clculos de rdenes de algoritmos: 1. Sea k una constante, si f es de orden O(g) entonces k*f es de orden O(g) 2. Si f1 es de orden O(h1), f2 es de orden O(h2) y fn es de orden O(hn), entonces f1 + f2 + + fn es de orden O( max(h1,h2, , hn) ). 3. Si f es de orden O(h1) y g es de orden O(h2) entonces f*g es de orden O(h1*h2) 4. Sean los reales 0<a<b entonces O(n ) es subconjunto (es decir, pertenece a) de O(n ) 5. Sea P(n) un polinomio de grado k entonces P(n) es de orden O(n ) 6. Sean los reales a, b > 1 entonces O(loga) = O(logb) La regla 6 permite olvidar la base en la que se calculan los algoritmos en expresiones de complejidad. La combinacin de las reglas 1 y 5 es probablemente la ms usada, permitiendo ignorar todos los componentes de un polinomio, menos su grado. Por ltimo, la regla 2 es bsica para analizar el concepto de secuencia en un programa: la composicin secuencial de varios trozos de programa es de orden de complejidad igual a la suma de los rdenes de sus partes. 1.2 REGLAS PRCTICAS Las siguientes reglas son tiles al momento de analizar el orden un algoritmo, se basan en las reglas tericas dadas en la seccin anterior, pero ahora se muestran aplicadas a programacin: Sentencias sencillas: Se conocen como sentencias sencillas a las sentencias de asignacin, entrada/salida, clculos aritmticos simples y en general toda instruccin bsica que tome un tiempo de ejecucin constante y que no trabaje sobre variables estructuradas cuyo tamao est relacionado con el tamao N del problema. Todas las sentencias sencillas tienen orden de complejidad O(1) (conocido como orden constante).
k a b

01-2006

3004597 Estructuras de Datos Modulo 12

Universidad Nacional de Colombia Sede Medelln

Secuencias: El orden de una secuencia de instrucciones en un programa, es la suma de los rdenes de las instrucciones que la componen. Decisin (IF ELSE IF ELSE, SWITCH CASE): El orden de un bloque de decisiones es el orden del peor caso posible. (Es decir, se calcula el orden de cada bloque if, else if, else y el mayor de estos se establece como orden de todo el bloque de decisin). (Este es un ejemplo del criterio de peor caso). Bucles (WHILE, FOR) El orden de un bucle iterativo es igual al producto del orden de la funcin que indica el nmero de iteraciones que ejecutar el bucle segn el tamao del problema y del orden de las operaciones internas en el bucle. Este producto de rdenes es, a su vez, igual al orden del producto de la funcin que expresa el nmero de iteraciones y las que representan a las operaciones internas al bucle. Si el bucle se ejecuta un nmero fijo de veces, independiente de N, entonces la repeticin slo introduce una constante multiplicativa que puede absorberse. Llamadas a procedimientos (Funciones) La complejidad de llamar a un procedimiento (funcin) viene dada por la complejidad del contenido del procedimiento. El coste de llamar al procedimiento es una constante que podemos obviar inmediatamente de nuestro anlisis de orden. El clculo de la complejidad asociada a un procedimiento puede complicarse notablemente si se trata de procedimientos recursivos, en ocasiones se requiere utilizar tcnicas propias de la matemtica discreta y del clculo de series. Ejemplo 1.1: Orden de un bucle Calcular el orden de la siguiente seccin de programa: int c=N; while( c>1 ) { sentencias de orden 1 c=c/2; } El valor inicial de c es N, siendo igual a N/2 despus de k iteraciones, el bucle se ejecutar un k nmero de veces k dado por la ecuacin N/2 = 1, as que para obtener el nmero de veces que se ejecutar el interior del ciclo para un tamao de programa N dado, basta despejar k de esta ecuacin: k N = 2 sacando log2 a ambos lados: k = log2(N) as que de acuerdo a las reglas tericas, se concluye que la seccin de programa es de orden O(log(n))
k

01-2006

3004597 Estructuras de Datos Modulo 12

Universidad Nacional de Colombia Sede Medelln

Ejemplo 1.2: Aplicacin de la regla del producto El orden de un proceso iterativo (ciclo) es igual al producto del orden de la funcin que indica el nmero de iteraciones en funcin del tamao del problema y del orden de la operacin interna en el bucle. El orden de este producto es, a su vez, igual al orden del producto de la funcin que expresa el nmero de iteraciones multiplicado por el orden de las operaciones internas al bucle. En este ejemplo se tiene un algoritmo para ordenar cada una de las filas de una matriz cuadrada de n x n elementos. El bucle iterativo es: for(int i=0; i<n; n++) { Ordenar fila i; } O su equivalente en la forma bsica "mientras": int i=0; while( i<=n ) { Ordenar fila i; i++; } Es inmediato que el nmero de repeticiones del ciclo es n, que es una funcin de orden lineal O(n). Supngase que para ordenar la fila se utiliza un algoritmo de tipo cuadrtico. Entonces el orden de complejidad de todo el algoritmo ser cbico, ya que, por la regla del producto: O(n).O(n ) = O(n.n ) = O(n )
2 2 3

1.3 BARMETRO En el ejemplo anterior se dieron todos los detalles del anlisis. Los detalles como la inicializacin de los ciclos (que se consideraron mediante una constante) raramente se consideran de manera explcita. (Sin embargo, en el siguiente ejemplo se muestra que no siempre pueden hacerse ignorarse las inicializaciones y control de los ciclos). Por lo general es suficiente escoger alguna instruccin representativa (que por regla general es la instruccin simple que ms se repite en el algoritmo) y contar cuantas veces es ejecutada, de la ecuacin resultante de esta operacin se calcula el orden del algoritmo. A esta instruccin representativa se le conoce como barmetro, la seleccin del barmetro adecuado en el algoritmo es una de las fases ms importantes del anlisis de orden. Por supuesto, se considera que el tiempo de ejecucin de la instruccin seleccionada como barmetro puede delimitarse con una constante. En el ejemplo anterior, un buen barmetro sera el if dentro del ciclo interior, en este caso, el barmetro se ejecuta n(n-1)/2 veces cuando se organiza un vector de n elementos.

01-2006

3004597 Estructuras de Datos Modulo 12

Universidad Nacional de Colombia Sede Medelln

1.3.1

SELECCIN DEL BARMETRO

Cuando un algoritmo incluye varios ciclos anidados, como es el caso del sort de seleccin, cualquier instruccin del ciclo interior puede escogerse, usualmente, como barmetro. Sin embargo, existen casos donde es necesario tener en cuenta el control implcito de los ciclos. Consideremos el siguiente algoritmo: T es un arreglo de n enteros tales que 0<=T[i]<=i para todo i<n. Sea s la suma de los elementos de T. Cunto tiempo toma la ejecucin del algoritmo? void ejemplo(int *T, int n) { int k=0; for(int i=0; i<n; i++) { for(int j=0; j<T[i]; j++) { k=k+T[j]; } } } Orden: O(n+s) O(Max(n,s))

contador 1 n+1 s+n s s n ----------------3n + 3s + 2

Para cada valor de i la instruccin k=k+T[j] se ejecuta T[i] veces. El nmero total de veces que es ejecutada k=k+T[j] es por tanto T[i] = s veces donde la sumatoria va de i=0 a i=n-1. Si esta instruccin fuera seleccionada como barmetro, se concluira que el algoritmo toma un tiempo de ejecucin de orden s. Un ejemplo simple es suficiente para convencernos de que este no es el caso. Supongamos que T[i] =1 cuando i tiene raz cuadrada exacta y T[i] = 0 de lo contrario. En este caso s=sqrt(n) como fcilmente puede comprobarse y de acuerdo al barmetro anterior concluiramos que el algoritmo es de orden O(sqrt(n)), Sin embargo, claramente el algoritmo toma un tiempo de orden O(n) ya que cada elemento de T se procesa al menos 1 vez (en la condicin del ciclo for). Esta circunstancia ocurre debido a que la instruccin k=k+T[j] no siempre se ejecuta en el ciclo ms interno, pero su condicin s. El anlisis detallado del algoritmo es como sigue: Sea a, el tiempo necesario para ejecutar una vuelta del ciclo interior, incluyendo el tiempo consumido en el control del ciclo. Para ejecutar el ciclo interior completamente para un valor de i dado se requiere un tiempo b+aT[i], donde b es una constante que representa el tiempo de inicializacin del ciclo. Este tiempo no es cero cuando T[i] = 0. A continuacin, el tiempo necesario para ejecutar una vuelta del ciclo exterior es c+b+aT[i], donde c es una nueva constante. Finalmente, el algoritmo completo toma un tiempo d+[c+b+aT[i]], donde la sumatoria va desde i=0 hasta i=n-1. Cuando se simplifica, esta expresin lleva a (c+b)n+as+d. Por tanto, el tiempo depende de dos parmetros independientes n y s y no puede ser expresado como una funcin de slo una de estas variables.

01-2006

3004597 Estructuras de Datos Modulo 12

Universidad Nacional de Colombia Sede Medelln

Esta situacin es tpica en algoritmos de manejo de grafos, donde el tiempo de ejecucin depende tanto del nmero de nodos como del nmero de enlaces. Volviendo a nuestro problema, podemos expresar el orden de este algoritmo de dos maneras: O(n+s) O(max(n, s)). ANEXOS A REFERENCIAS http://web.jet.es/jqc/progii.html. Pagina Web del curso Programacin II de Ingeniera Informtica de la UNED. Jeronimo Quesada 1998. B TALLER Crear un algoritmo que calcule el n-simo trmino de la serie de Fibonacci y calcular su orden.

01-2006

You might also like