Está en la página 1de 8

Algortmica y Lenguajes de Programacin Eficiencia y notacin asinttica (i)

Eficiencia y notacin asinttica. Introduccin


n

Para resolver un problema pueden existir varios algoritmos. Por tanto, es lgico elegir el mejor. Si el problema es sencillo o no hay que resolver muchos casos se podra elegir el ms fcil. Si el problema es complejo o existen muchos casos habra que elegir el algoritmo que menos recursos utilice. Los recursos ms importantes son el tiempo de ejecucin y el espacio de almacenamiento. Generalmente, el ms importante es el tiempo. Al hablar de la eficiencia de un algoritmo nos referiremos a lo rpido que se ejecuta. La eficiencia de un algoritmo depender, en general, del tamao de los datos de entrada.
2

Eficiencia y notacin asinttica. Ejemplares y


problemas
n

n n

A la hora de estudiar la eficiencia de distintos algoritmos es necesario distinguir problemas de ejemplares. Un problema sera una proposicin dirigida a averiguar el modo de obtener un resultado cuando ciertos datos son conocidos. Un ejemplar, en cambio, es un individuo de una especie o gnero. Ejemplos de problemas seran: multiplicar dos nmeros enteros o resolver una ecuacin de segundo grado. Ejemplares de dichos problemas seran: (425,7) o (1,1,2). Es decir: 4257 y x2+x+2. Un problema dado puede tener un nmero infinito de ejemplares (multiplicar dos nmeros enteros) o finito (jugar una partida de ajedrez). Un algoritmo que afirma resolver un problema debe resolver todos los ejemplares del mismo. Si hay un solo ejemplar que no sea resuelto por el algoritmo el algoritmo no es correcto.
3

Eficiencia y notacin asinttica. Casos mejor, peor


y medio
n

No todos los ejemplares de un problema son iguales. En el caso de la multiplicacin de dos nmeros enteros no es lo mismo multip (a y b 0) que a0. Al no ser todos los ejemplares iguales, la eficiencia del algoritmo puede variar en funcin del ejemplar o del grupo de ejemplares. A la hora de analizar un algoritmo es necesario saber que pueden darse tres tipos de ejemplares o casos:
n

Caso mejor: se trata de aquellos ejemplares del problema en los que el algoritmo es ms eficiente; por ejemplo: multiplicar un nmero por cero, insertar en una lista vaca, ordenar un vector que ya est ordenado, etc. Generalmente no nos interesa. Caso peor: se trata de aquellos ejemplares del problema en los que el algoritmo es menos eficiente (no siempre existe el caso peor). Ejemplos: insertar al final de una lista, ordenar un vector que est ordenado en orden inverso, etc. Nos interesa mucho. Caso medio: se trata del resto de ejemplares del problema. Por ejemplo: multiplicar dos nmeros enteros distintos de cero, insertar en a de una lista que no sea el principio ni el final, ordenar un vector que no est ordenado ni en orden directo ni inverso, etc. Es el caso que ms nos debera preocupar puesto que ser el ms habitual, sin embargo no siempre se puede calcular (habra que saber cules son las probabilidades de los distintos ejemplares). 4

Eficiencia y notacin asinttica. Operaciones


elementales
n

Una operacin elemental es aquella cuyo tiempo de ejecucin tiene una cota superior constante que slo depende de su implementacin (por ejemplo: el ordenador o el lenguaje de programacin utilizado). Las operaciones elementales son consideradas de coste unitario. A la hora de analizar un algoritmo importarn, por tanto, el nmero de operaciones elementales que precisa. La decisin de determinar que una operacin determinada es de coste unitario depender de los ejemplares del problema que la utilice. Por ejemplo, en la mayor parte de los casos la suma se considera de coste unitario puesto que al operar con los nmeros que se manejan habitualmente en un ordenador los tiempos que emplea la suma son similares; sin embargo, en caso de manejar nmeros muy grandes la suma no tendr un coste unitario puesto que tardar ms cuanto ms grandes sean los nmeros a sumar. 5

Eficiencia y notacin asinttica. Tamao de los


ejemplares
n

El tamao de un ejemplar sera el nmero de bits necesarios para representarlo en el ordenador. Sin embargo, no es necesario llegar a ese nivel de detalle; basta con determinar algn parmetro que nos permita dirimir entre dos ejemplares cul es el mayor. Por ejemplo:
n

Si tenemos un algoritmo que trabaja con vectores parece obvio que cuantas ms componentes tiene un vector mayor ser; as pues, en este caso el tamao ser el nmero de componentes. Si escribimos un algoritmo que permite sumar nmeros de cualquier nmero de cifras el tamao de los nmeros depender del nmero de cifras que contengan . Un algoritmo para multiplicar matrices considerar como tamao al producto del nmero de filas por el nmero de columnas.

En resumen, para cada problema es necesario analizar la naturaleza de los datos para determinar qu parmetro define el tamao de los ejemplares. La eficiencia de los algoritmos siempre vendr dada en funcin de dichos tamaos:
n n n

Algoritmos con vectores en funcin del nmero de componentes. Algoritmos con matrices en funcin del nmero de filas y columnas. Etc.

Eficiencia y notacin asinttica. Midiendo la


eficiencia (i)
n

n n

Tenemos que nos interesa saber qu algoritmo utiliza ms eficientemente los recursos, en general, el tiempo de ejecucin. Esta eficiencia en tiempo depende del tamao de los datos de entrada que vendr dado por algn parmetro que define dichos datos (nmero de componentes, filas y columnas, etc.) La eficiencia adems de depender del tamao de los ejemplares depende de la naturaleza de los mismos: caso mejor, caso peor y caso medio. Para calcular la eficiencia es posible considerar slo el nmero de veces que se debe ejecutar una operacin elemental pues stas tendrn un coste unitario. En qu unidad mediremos esta eficiencia? Podramos pensar en utilizar segundos, sin embargo, el tiempo de ejecucin depende del ordenador utilizado...
7

Eficiencia y notacin asinttica. Midiendo la


eficiencia (ii)
n

La solucin est en el principio de invarianza, dicho principio afirma que dos implementaciones distintas del mismo algoritmo no diferirn en su eficiencia ms que en una constante multiplicativa. Por ejemplo, si un algoritmo escrito en FORTRAN se compila en un Pentium III 1MHz y en un 486 tendramos dos implementaciones distintas del mismo algoritmo siendo ms eficiente la primera. Si al ejecutar este algoritmo en el Pentium III para un problema dado tarda 3 segundos y en el 486 para el mismo problema tarda 30 segundos, el principio de invarianza nos dice que un problema que en el Pentium III requiera 1 minuto necesitara en el 486 aproximadamente 10. De esta forma, no habr unidad para medir la eficiencia, nos limitaremos a decir que el tiempo de ejecucin de un algoritmo ser t(n), es decir, una funcin del tamao de los ejemplares; en unas mquinas el tiempo de ejecucin ser at(n) y en otras ser bt(n).
8

Eficiencia y notacin asinttica. Notacin O(n)


O grande de n (i)
n

Sabemos que podemos definir la eficiencia de un algoritmo como una funcin t(n). A la hora de analizar un algoritmo nos interesa, principalmente, la forma en que se comporta el algoritmo al aumentar el tamao de los datos; es decir, cmo aumenta su tiempo de ejecucin. Esto se conoce como eficiencia asinttica de un algoritmo y nos permitir comparar distintos algoritmos puesto que deberamos elegir aquellos que se comportarn mejor al crecer los datos. La notacin asinttica se describe por medio de una funcin cuyo dominio es el conjunto de nmeros naturales, N. Se describe la notacin O o lmite asinttico superior como:

O( g ( n)) = { f ( n)/ c > 0, n0 > 0,0 f ( n) cg ( n)n n0 } f ( n) : Z + R + g ( n) : Z + R +


9

Eficiencia y notacin asinttica. Notacin O(n)


O grande de n (ii)
O ( g ( n)) = { f ( n)/ c > 0, n0 > 0,0 f ( n) c g ( n)n n0 } f ( n) : Z + R + g ( n) : Z + R +
n

La notacin anterior bsicamente nos dice que si tenemos un algoritmo cuyo tiempo de ejecucin es f(n) podemos encontrar otra funcin de n, g(n), y un tamao de problema n0 de tal forma que g(n) acota superiormente al tiempo de ejecucin para todos los problemas de tamao superior a n0. Esta notacin, como veremos a continuacin, facilitar en las comparaciones de eficiencia entre algoritmos diferentes. 10

Eficiencia y notacin asinttica. Notacin O(n)


O grande de n (iii)
Comparacin de eficiencias asintticas

n
Tiempo de ejecucin

Tamao del problema O(n) O(n2 ) O(an) log(n) n!

En la grfica se puede ver distintos rdenes de complejidad tpicos. O(log(n)) crece de manera imperceptible mientras que O(n!), O(an) y O(na) crecen muy rpidamente. La mayor parte de algoritmos son O(na), los algoritmos ms eficientes son O(log(n)); es muy difcil lograr algoritmos O(1) tiempo constante-.
11

Eficiencia y notacin asinttica. Notacin O(n)


O grande de n (iv)
n

El orden de complejidad se define como una funcin que domina la ecuacin que expresa en forma exacta el tiempo de ejecucin del algoritmo. g(x) domina a f(x), si dada una constante C cualquiera, C g ( x) f ( x )x g(x) domina asintticamente a f(x), si g(x) domina a f(x) para valores muy grandes de x. Por ejemplo, si f(n)=n2 + 5n + 100 y g(n)= n2 entonces g(n) domina a f(n).
12

Eficiencia y notacin asinttica. Notacin O(n)


O grande de n (v)
n

En prximas lecciones se ver la forma de calcular complejidades de algoritmos. Sin embargo, podemos adelantar algunas reglas:

O(C g) = O(g) , C es una constante. O(f g) = O(f) O(g) , y viceversa. O(f / g) = O(f) / O(g) , y viceversa. O(f+g) = funcin dominante entre O(f) y O(g) n log2 n domina a log2 n bn domina a cn si b>=c nk domina a nm si k>=m loga n domina a logb n si b>=a>=1 n! domina a bn bn domina a na si a>=0 n domina a loga n si a>=1 loga n domina a 1 si a>=1
13

Eficiencia y notacin asinttica. Notacin O(n)


O grande de n (vi)
Paso 1
n

Por ejemplo, el orden de complejidad del algoritmo siguiente...


para i de 1 a n para j de 1 a n escribir i+j fpara fpara

para i de 1 a n para j de 1 a n escribir i+j fpara fpara Paso 2 para i de 1 a n para j de 1 a n escribir i+j fpara fpara Paso 3 para i de 1 a n para j de 1 a n escribir i+j fpara fpara O(nn) = O(n )
2

La complejidad de esta sentencia es constante O(1)

Se calculara como se muestra a la derecha llegndose a la conclusin de que su complejidad es O(n2). Esto quiere decir, por ejemplo, que si el tamao de los datos aumenta en un orden de magnitud (se multiplica por 10), el tiempo de ejecucin aumentara (en realidad estara acotado superiormente) en dos rdenes de magnitud (se multiplicara por 100).

O(n1) = O(n)

La complejidad del bucle es el producto del nmero de ejecuciones por la complejidad de la/s sentencia/s ejecutada/s.

La complejidad del bucle es el producto del nmero de ejecuciones por la complejidad de la/s sentencia/s ejecutada/s.

14

Eficiencia y notacin asinttica. Resumen (i)


n n

Para resolver un problema pueden existir varios algoritmos. Por tanto, es lgico elegir aquel que use menos recursos (tiempo o espacio). Al hablar de la eficiencia en tiempo de ejecucin de un algoritmo nos referiremos a lo rpido que se ejecuta. La eficiencia de un algoritmo depender, en general, del tamao datos de entrada. El tamao de un ejemplar sera el nmero de bits necesarios para representarlo en el ordenador. Sin embargo, basta con determinar algn parmetro que nos permita dirimir entre dos ejemplares cul es e (nmero de componentes, filas y columnas, etc.) Ejemplos de problemas seran: multiplicar dos nmeros enteros o resolver una ecuacin de segundo grado . Ejemplares de dichos problemas seran: (425,7) o (1,1,2). Es decir: 4257 y x2+x+2 . Un problema dado puede tener un nmero infinito de ejemplares (multiplicar dos nmeros enteros) o finito (jugar una partida de ajedrez). Un algoritmo que afirma resolver un problema debe resolver todos los ejemplares del mismo. Si hay un solo ejemplar que no sea resuelto por el algoritmo el algoritmo no es correcto.
15

Eficiencia y notacin asinttica. Resumen (ii)


n

n n

No todos los ejemplares de un problema son iguales. Por ello, la eficiencia del algoritmo puede variar en funcin del ejemplar o del grupo de ejemplares . A la hora de analizar un algoritmo es necesario saber que pueden darse tres tipos de ejemplares o casos: caso mejor, caso peor y caso medio. Una operacin elemental es aquella cuyo tiempo de ejecucin tiene una cota superior constante que slo depende de su implementacin. Se considera que son de coste unitario. La eficiencia no tiene unidades de medida, se usa la notacin O(n). La notacin anterior bsicamente nos dice que si tenemos un algoritmo cuyo tiempo de ejecucin es f(n) podemos encontrar otra funcin de n, g(n), y un tamao de problema n0 de tal forma que g(n) acota superiormente al tiempo de ejecucin para todos los problemas de tamao superior a n0. Esta notacin , como veremos a continuacin, facilitar en las comparaciones de eficiencia entre algoritmos diferentes. Existen reglas y mtodos para calcular el orden de complejidad de nuestros algoritmos para poder compararlos.

16

También podría gustarte