Está en la página 1de 4

2.1. Complejidad de un algoritmo. En el desarrollo de un programa computacional resulta necesario definir criterios para medir su rendimiento o comportamiento.

Estos criterios se centran principalmente en su simplicidad y en el uso eficiente de los recursos. Respecto al uso eficiente de los recursos, ste suele medirse en funcin de dos parmetros: el espacio, es decir, memoria que utiliza, y el tiempo, lo que tarda en ejecutarse. Ambos representan los costes que supone encontrar la solucin al problema planteado mediante un algoritmo. Dichos parmetros van a servir adems para comparar algoritmos entre s, permitiendo determinar el ms adecuado de entre varios que solucionan un mismo problema. En esta seccin nos referiremos exclusivamente a la eficiencia temporal. El anlisis de la eficiencia temporal de los algoritmos consta de dos fases: anlisis a priori y anlisis a posteriori. El anlisis a posteriori ofrece una medida real, consistente en medir el tiempo de ejecucin del algoritmo para unos valores de entrada dados y en un ordenador concreto. El anlisis a priori proporciona una medida terica, que consiste en obtener una funcin que acote (por arriba o por abajo) el tiempo de ejecucin del algoritmo para unos valores de entrada dados. Esta medida ofrece estimaciones del comportamiento de los algoritmos de forma independiente del ordenador en donde sern implementados y sin necesidad de ejecutarlos. La unidad de tiempo a la que debe hacer referencia esta medida de eficiencia temporal no puede ser expresada en segundos o en otra unidad de tiempo concreta, pues no existe un ordenador estndar al que puedan hacer referencia todas las medidas. Esta medida de eficiencia temporal se define como una funcin del tamao o talla de la entrada. Definicin 2.1.1. Se denomina tamao de la entrada el nmero de componentes sobre los que se va a ejecutar el algoritmo. Por ejemplo, la dimensin del vector a ordenar o el tamao de las matrices a multiplicar. En el caso de algoritmos que resuelvan determinado problema sobre grafos el tamao de la entrada podra ser el nmero de vrtices o el nmero de aristas. Denotaremos por T(n) el tiempo de ejecucin de un algoritmo para una entrada de tamao n, donde T(n) indica el nmero de instrucciones ejecutadas por un ordenador idealizado. Principio de Invarianza. Dado un algoritmo y dos implementaciones suyas I1 e I2, que tardan T1(n) y T2(n) segundos respectivamente, existe una constante real c > 0 y un nmero natural n0 tales que para todo n n0 se verifica que T1 (n) T2 (n) . Es decir, el tiempo de ejecucin de dos implementaciones distintas de un algoritmo dado, ya sea del mismo cdigo ejecutado por dos mquinas de distinta velocidad, como de dos cdigos diferentes que implementen el mismo mtodo, no va a diferir ms que en una constante multiplicativa. Definicin 2.1.2. Se dice que un algoritmo tarda un tiempo del orden de T(n) si existen

una constante real c > 0 y una implementacin I del algoritmo que tarda menos que cT(n), para todo n tamao de la entrada. El comportamiento de un algoritmo puede cambiar notablemente para diferentes entradas pues para muchos programas el tiempo de ejecucin es en realidad una funcin de la entrada especfica, y no slo del tamao de sta. As suelen estudiarse tres casos para un mismo algoritmo: caso peor, caso mejor y caso medio. El caso mejor corresponde a la traza (secuencia de sentencias) del algoritmo que realiza menos instrucciones. Anlogamente, el caso peor corresponde a la traza del algoritmo que realiza ms instrucciones, lo cual nos asegura que al menos el algoritmo se desempear de esa forma . Respecto al caso medio, corresponde a la traza del algoritmo que realiza un nmero de instrucciones igual a la esperanza matemtica de la variable aleatoria definida por todas las posibles trazas del algoritmo para un tamao de la entrada dado, con las probabilidades de que stas ocurran para esa entrada. Esta es la medida ms difcil de calcular pues debemos saber cmo estn distribuidos los datos. Por otra parte, sino conocemos la distribucin de las entradas, entonces la mejor opcin es analizar el caso peor. A la hora de medir el tiempo, siempre lo haremos en funcin del nmero de operaciones elementales que realiza el algoritmo dado, entendiendo por operaciones elementales aquellas que el ordenador realiza en tiempo acotado por una constante. As, consideraremos operaciones elementales las operaciones aritmticas bsicas, asignaciones a variables de tipo predefinido por el compilador, los saltos (llamadas a funciones y procedimientos, retorno desde ellos, etc.), las comparaciones lgicas y el acceso a estructuras indexadas bsicas, como son los vectores y matrices. Cada una de ellas contabilizar como 1 operacin elemental. Resumiendo, el tiempo de ejecucin de un algoritmo va a ser una funcin que mide el nmero de operaciones elementales que realiza el algoritmo para un tamao de entrada dado. Analicemos el siguiente algoritmo para determinar si un grafo es o no bipartido.
PROCEDURE Bipartido(VAR n : INTEGER, a: MATRIX) INTEGER VAR clase :vector, i : INTEGER, j :INTEGER; BEGIN (1) clase[1]=0; (2) IF a[1][2]==0 THEN clase[2]=0; ELSE clase[2]=1; (3) FOR i=3 TO n DO (4) IF a[1][i]==0 THEN clase[i]=0; ELSE clase[i]=1; (5) FOR j=2 TO i-1 DO (6) IF clase[i]==clase[j] && a[i][j]=1 THEN RETURN 0; END END (7) FOR i=1 TO n DO (8) PRINT clase[i]; END RETURN 1; END

En este algoritmo n es el nmero de vrtices del grafo, a es la matriz de adyacencia del grafo y clase es un arreglo con elementos iguales a 0 1 en dependencia de la clase que

se le asigna a cada vrtice. El procedimiento devuelve 1 si el grafo es bipartido o 0 en caso contrario. Si el grafo es bipartido se imprime el arreglo clase.
El caso mejor se produce cuando el grafo no es bipartido y los vrtices 1, 2 y 3 estn conectados entre s, pues entonces el algoritmo realiza slo la operacin del paso (1), las dos operaciones del paso (2), las dos operaciones del paso (4) y las tres operaciones del paso (6), es decir que T(n)=8. El caso peor se produce o bien cuando el grafo es bipartido o bien cuando el grafo no es bipartido pero la contradiccin aparece al asignar la clase al ltimo vrtice. Calculemos T(n) para el caso cuando el grafo es bipartido. (1) (2) (3) (4) (5) (6) (7) (8) una operacin dos operaciones se realiza n-2 veces dos operaciones se realiza i-2 veces para i desde 3 hasta n dos operaciones se realiza n veces una operacin
n i 1 n + T ( n) = 3 + 2 2 + n = 3 + n + 2 ( n 2 ) + 2 (i 2) i =3 j =2 i =3

T (n) = 3n 1 + 2(n 2) (n 1) / 2 = n 2 + 1 Definicin 2.1.3 Sea f : N [0,+) Se define el conjunto de funciones de orden O(f) como el conjunto de todas las funciones g : N [0,+) para las cuales existen c R y n0 N tales que g (n) cf (n) . Diremos que una funcin t : N [0,+) es de orden O( f) si t O( f ) . Definicin 2.1.4. Dado un algoritmo diremos que su orden de complejidad es O(f) si su tiempo de ejecucin para el peor caso es de orden O( f), es decir, T(n) es de orden O(f).

Intuitivamente, t O( f ) indica que t est acotada superiormente por algn mltiplo de f. Normalmente estaremos interesados en la menor funcin f tal que t pertenezca a O(f). As tendremos: O(1) O(log n) O(n) O(n ) O(n ) O(a ) O(n!)
n a 2

orden constante orden logartmico orden lineal orden cuadrtico orden polinomial (a > 2) orden exponencial (a > 1) orden factorial

En la siguiente tabla se comparan los tiempos para los diferentes ordenes de

complejidad. n 2 8 32 100 log n 1 3 5 6 n2 4 64 1024 104 2n 4 256 4,3 x 109 1,2 x 1027 n! 2 40320 2,6 x 1035 9,3 x 10177

Como puede observarse los algoritmos cuya complejidad es descrita por una funcin polinomial pueden ser ejecutados para entradas grandes en una cantidad de tiempo razonable, mientras que los algoritmos exponenciales son de poca utilidad excepto para entradas pequeas

También podría gustarte