You are on page 1of 9
Anélisis y efcienca de sigoritmos 163 EJEMPLO 6.4. Tiempo de ejecucion lineal de una funcion que calcula una ser ie de ntér- doable 5; tap ene ie / tiempo ©2 ete ses 1 tiempo return si 1 taempo €4 La funcién Tjn) del método es: pel tarts ns taste El tiempo crece a medida que lo hace n, por ello es preferible expresar el tiempo de ejecu- cién de tal forma que indique el comportamiento que va a tener Ia funcién con respecto al valor de n, Considerando todas las reflexiones anteriores, si T(n) es el tiempo de ejecucién de un pro- ‘grama con entrada de tamatio 7, ser posible valorar T(n) como el nimero de sentencias eje ccutadas por el programa, y la evaluaci6n se podra efectuar desde diferentes puntos de vista: Peor caso. Indica el tiempo peor que se puede tener, Este anilisis es perfectamente ade- ‘cuado para algoritmas cuyo tiempo de respuesta sea eritico, por ejemplo, para el caso del pro ‘grama de control de una central nucleat. Es el que se emplea en este libro, “Mejor caso. Indica el tiempo mejor que podemos tener. Caso medio. Se puede computar Tn) como el tiempo medio de ejecucién del programa sobre todas las posibles ejecuciones de entradas de tamafio n. El tiempo de cjecucién medio es ‘veces una medida mas realista de Io que el rendimiento sera en la practica, pero es, normal- ‘mente, mucho mis dificil de calcular que el tiempo de ejecucién en el caso peor. 6.4. NOTACION O-GRANDE La alta velocidad de las computadoras actuales (frecuencias del procesador de 3 GHz. ya son usuales en computadoras comerciales) hace que la medida cxacta de la cficiencia de ua algo: ritmo no sea una preocupacién vital en el disefio pero si el orden general de magnitud de la misma, Si el andlisis de dos algoritmos muestra que uno ejecuta 25 iteraciones mientras que otro ejecuta 40, la practica muestra que ambos son muy ripidos, entonces {c6mo valorar las diferencias? Ahora bien, si un algoritmo realiza 25 iteraciones y otro 2500 iteraciones, enton- ‘ces debemos estar preocupados por la rapidez o la lentitud de uno y otto. Anteriormente, en el Ejemplo 6.4, se ha expresado mediante la formula f(n) el nimero de sentencias ejecutadas para n datos. El factor dominante que se debe considerar para determinar cel orden de magnitud de la formula es el denominado factor de eficiencia, Por consiguiente, no se necesita determinar la medida completa de la eficiencia, basta con calcular el factor que 164 Estructura de datos en C++ determina la magnitud, Este factor se define como “O grande”, que representa “est en el orden de” y se expresa como O(n) , ¢s decir, “en el orden de n”. La notacién 0 indica la cota superior del tiempo de ejecucién de un algoritmo © programa. Asi, en lugar de decir que un algoritmo emplea un tiempo de 4n-J en procesar un array de longitud n, se dira que emplea un tiempo O(n) que se lee “O grande de n”, 0 bien “O de n” ¥y que informalmente significa “algunos tiempos constantes n’. Con la notacién O se e xpresa una aproximacion de la relacién entre el tamafio de un problema y la cantidad de proceso necesario para hacerlo. Por ejemplo, si £(n) =n? ~ 2n + 3.entonces £ (n) es 0(n") 6.4.1. Descripcién de tiempos de ejecucién con la notacién O Sea T(n) el tiempo de ejecucién de un programa, medido como una funcidn de la entrada de lamafio n. Se dice que “Z(n) es Ofg(n))” si g(n) acota superiormente a T{n). De modo mas riguroso, Tn) es O(g(n)) si existe un entero n, y una constante ¢ > 0 tal que para todos los enteros m2 no se tiene que T(n) < cen). EJEMPLO 6.5, Dadalafuncién ffn)= n° +3:n-+1 encontr ar su asintética). ‘© grande” (complejidad Para valores de_n 2 1 se puede demostrar que’ fin) =n + 3n 41S nb 4 Sn Fan = 5 oP Escogiendo la constante s = 5 y Entonces se puede asegurar que: = 1 se satisface la desigualdad £(n) <5 nt Fin) = omy Ahora bien, también se puede asegurar que f(n) ~ 9(n") y que fin) ~ O(n?) y asi sucesivamente con potencias mayores de n. Sin embargo, lo que realmente interesa es la cota su- prior mas ajustada que informa de la tasa de crecimiento de la funcién con respecto an Una funcién (x) puede estar acotada super iormente por un niimero indefinido de funciones a partir de ciertos valores x», fix) S$ gtx) ShOD S Rix) oo La complejidad asintética de la funcién £ (x) se considera que es la cota superior mas ajustada Fix) = o(gte) Anélisis y efciencia de sigoritmos 165 Nota La expresién la eficiencia de un algoritmo se simplfica con la funcién © grande. Si un algoritmo es cuadritico, se dice entonces que su eficiencia es O (n’). Esta funcién cexpresa cémo crece el tiempo de proceso del algoritmo, de tal forma que una eficiencia 0 (n*) Imuestra que crece con el cuiadrado del mlimero de entradas, 6.4.2. Determinar la notacién O La notacién O grande se puede obtener a partir de f(a) utiizando los siguientes pasos: 1, En cada término, establecer el coeficiente del término en I 2. Mantener el término mayor de la funcién y descartar los restantes. Los términos se ordenan de menor a mayor: logn on nlogsn Wont ak Dont EJEMPLO 6.6. Calcular ia funcion O grande de eficiencia de las siguientes funciones: a. fin) =a n/2 = Caso a 1, Se eliminan todos los coeticientes y se obtiene: 2. Se eliminan los factores més pequefios: 3. Lanotacién O correspondiente es: vein) = O(n") Caso b 1, Se eliminan todos los coeticientes y se obtiene: fin) Sah taht st tans 2. Se climinan los factores més pequefios y el término de exponente mayor es el primero: 166 Estructura de datos en C++ 3. Lanotacién O correspondiente es: (fim) = 0 " 6.4.3. Propiedades de la notacién O De la definicién conceptual de la notacién O se deducen las siguientes propiedades de Ia nota- cién 0. 1, Siendo ¢ una constante, ¢*O(fin)) = Offin)) Por ejemplo si fn) “ ,entonces #(n) = 3*0(n") = O(n) Offin)) + O(giny) = O(fin)+e(n)). Por ejemplo, si fn) = 26" y gin) = 20 O(find) + Olgimd) = OLF(mF9IN)) = 0120 3. Maximo(O(ftn)),O(g(n))) = OMaximo(fin),g(n)) Por ejemplo, Maximo {O(login)},0(n}) = OfMaxine (Log ind ,n}) = O(n 4. Offin)) * Olg(n)) = Otftn)*ein)) Por ejemplo, si f(n) = 20° y gin) = ns DUEI) I Ol xI) = OE *GO0) = OF2n! * mI = Ofa4) Ofloga(n)) = Oflogb(n)) para ab > 1 Las funciones logaritmicas son de orden logaritmico, independientemente de la base del logaritmo. 6. Ollog(nt)) = O(n*tog(n)p 7, Parak>1 — O(S i= 0") 8. OCS log() = O(nlogin)) 6.5. COMPLEJIDAD DE LAS SENTENCIAS BASICAS DE C++ Al analizar la complejidad de un método no recursivo, se han de aplicar las propiedades de la notacién Oy las siguientes consideraciones telativas al orden que tienen las sentencias, funda- mentalmente a las estructuras de control. Anélisis y efciencia de sigoritmos 167 + Las sentencias de asignacién, son de orden constante Of). # La complejidad de una sentencia de seleccisn es el maximo de las complejidades del blo- que chen y del blogue #1se. La complejidad de una sentencia de seleccién miiiple (switch) es el maximo de las complejidades de cada uno de los bloques case. + Para calcular la complejidad de un bucle, condicional o automatico, se ha de estimar el ‘imero maximo de iteraciones para el peor caso; entonces la complejidad del bucle es el producto del niimero de iteraciones por la complejidad de las sentencias que forman el ‘cuerpo del bucle. * La complejidad de un bloque se calcula como la suma de las complejidades de cada s tencia del bloque. La complejidad de a llamada a una funcién es de orden 1, complejidad constante. Es necesario considerar la complejidad de la funcién llamada, EJEMPLO 6.7. Determinar la complejidad de la funcién: double mayor double x, double yi El método consta de una sentencia de selecci6n, cada alternativa tiene complejidad cons- tante, O(1), entonces la complejidad de la funcién mayor () es Of). EJEMPLO 6.8. Determinar la complejidad de la siguiente funcién: sbevector (doublex(], nt n) La funcién consta de un bucle que se ejecuta n veces, O(n). El cuerpo del bucle consiste ‘en ejecutar una sentencia: complejidad constante 0/1), Como conclusién, la complejidad de la funcion es: on) *0(2) = O(a) EJEMPLO 6.9. Determinar la complejidad de la funcion: 168 Estructura de datos en C++ while (k

You might also like