1_complejidad de algoritmos

14
Análisis de Algoritmos y Estructura de Datos Jacqueline Köhler C. 1 ANÁLISIS DE ALGORITMOS 1.1 COMPLEJIDAD DE ALGORITMOS Un algoritmo es una secuencia de instrucciones que se debe seguir para resolver un determinado problema, que además garantiza la obtención de una respuesta al terminar. Debe ser preciso y detallado, es decir, no usa intuición ni creatividad, ni tampoco requiere de decisiones subjetivas. Los algoritmos se remontan hasta muy atrás en la historia. El más antiguo conocido, el algoritmo para determinar el máximo común divisor de dos números, se atribuye a Euclides. En el párrafo anterior se mencionó que los algoritmos garantizan la obtención de una respuesta al terminar de seguir sus pasos para resolver un problema dado. Esto se traduce, entonces, en que los algoritmos ofrecen una solución general para un problema dado que esté acotado a un dominio determinado. Se denomina instancia de un problema a un caso particular de éste, y un algoritmo debe funcionar correctamente para todas las instancias del problema, sin considerar las restricciones propias de la implementación: capacidad de memoria, rangos de valores, etc. En muchas ocasiones ocurre que un problema puede ser resuelto por muchos algoritmos. Entonces surge el problema de escoger cuál de ellos utilizar. Si solo se requiere resolver unas pocas instancias sencillas del problema, no importa cuál sea el algoritmo seleccionado. No obstante, si la instancia a resolver es muy difícil o bien se requiere resolver muchas instancias, es importante escoger el mejor. Existen dos enfoques para determinar cuál algoritmo escoger:  Empírico (a posteriori ): consiste en programar todas las alternativas, probarlas con diversas instancias y comparar su desempeño. Por supuesto, este enfoque resulta muy poco práctico.  Teórico (a priori): consiste en determinar matemáticamente cuántos recursos se necesitan para cada algoritmo. Esta tarea se denomina estudio de la complejidad y consiste en la obtención de una expresión matemática que refleja el comportamiento del algoritmo en función de los datos de entrada. La complejidad o eficiencia de un algoritmo debe ser estudiada con respecto a algún recurso crítico: el tiempo de computación (cuánto tiempo toma ejecutar la implementación de un algoritmo), la cantidad de espacio necesaria para almacenar los datos requeridos, la cantidad de procesadores necesarios, etc. En general, la complejidad de tiempo es mayor que la complejidad de espacio ya que cualquier información almacenada debe ser leída o guardada en algún instante. Por ese motivo, generalmente se trabaja con la complejidad de tiempo. Se señaló anteriormente la complejidad de un algoritmo se determina en función de los datos de entrada. En efecto, se debe buscar una expresión matemática en función del tamaño de estos datos. Formalmente, el tamaño de un dato se refiere a la cantidad de bits necesarios para su almacenamiento. No obstante, esa noción depende de la implementación del algoritmo, por lo que no es adecuada para una evaluación teórica. En consecuencia, se considera simplemente que el tamaño es un número natural que indica la cantidad de elementos de un objeto, por ejemplo, la cantidad de elementos de un arreglo o bien el número de nodos y aristas de un grafo. El comportamiento real de un algoritmo depende de muchos factores propios de su implementación. Entre ellos se encuentran las restricciones de arquitectura, es decir, el compilador o intérprete utilizado,

Upload: ignacio-ibanez

Post on 06-Jul-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 114

983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

1 ANAacuteLISIS DE ALGORITMOS

11 COMPLEJIDAD DE ALGORITMOS

Un algoritmo es una secuencia de instrucciones que se debe seguir para resolver un determinadoproblema que ademaacutes garantiza la obtencioacuten de una respuesta al terminar Debe ser preciso ydetallado es decir no usa intuicioacuten ni creatividad ni tampoco requiere de decisiones subjetivas Losalgoritmos se remontan hasta muy atraacutes en la historia El maacutes antiguo conocido el algoritmo paradeterminar el maacuteximo comuacuten divisor de dos nuacutemeros se atribuye a Euclides

En el paacuterrafo anterior se mencionoacute que los algoritmos garantizan la obtencioacuten de una respuesta alterminar de seguir sus pasos para resolver un problema dado Esto se traduce entonces en que losalgoritmos ofrecen una solucioacuten general para un problema dado que esteacute acotado a un dominiodeterminado Se denomina instancia de un problema a un caso particular de eacuteste y un algoritmo debefuncionar correctamente para todas las instancias del problema sin considerar las restricciones propias

de la implementacioacuten capacidad de memoria rangos de valores etcEn muchas ocasiones ocurre que un problema puede ser resuelto por muchos algoritmos Entoncessurge el problema de escoger cuaacutel de ellos utilizar Si solo se requiere resolver unas pocas instanciassencillas del problema no importa cuaacutel sea el algoritmo seleccionado No obstante si la instancia aresolver es muy difiacutecil o bien se requiere resolver muchas instancias es importante escoger el mejorExisten dos enfoques para determinar cuaacutel algoritmo escoger

Empiacuterico (a posteriori) consiste en programar todas las alternativas probarlas con diversasinstancias y comparar su desempentildeo Por supuesto este enfoque resulta muy poco praacutectico

Teoacuterico (a priori) consiste en determinar matemaacuteticamente cuaacutentos recursos se necesitan para cadaalgoritmo Esta tarea se denomina estudio de la complejidad y consiste en la obtencioacuten de unaexpresioacuten matemaacutetica que refleja el comportamiento del algoritmo en funcioacuten de los datos deentrada

La complejidad o eficiencia de un algoritmo debe ser estudiada con respecto a alguacuten recurso criacutetico eltiempo de computacioacuten (cuaacutento tiempo toma ejecutar la implementacioacuten de un algoritmo) la cantidadde espacio necesaria para almacenar los datos requeridos la cantidad de procesadores necesarios etcEn general la complejidad de tiempo es mayor que la complejidad de espacio ya que cualquierinformacioacuten almacenada debe ser leiacuteda o guardada en alguacuten instante Por ese motivo generalmente setrabaja con la complejidad de tiempo

Se sentildealoacute anteriormente la complejidad de un algoritmo se determina en funcioacuten de los datos deentrada En efecto se debe buscar una expresioacuten matemaacutetica en funcioacuten del tamantildeo de estos datosFormalmente el tamantildeo de un dato se refiere a la cantidad de bits necesarios para su almacenamientoNo obstante esa nocioacuten depende de la implementacioacuten del algoritmo por lo que no es adecuada parauna evaluacioacuten teoacuterica En consecuencia se considera simplemente que el tamantildeo es un nuacutemero naturalque indica la cantidad de elementos de un objeto por ejemplo la cantidad de elementos de un arreglo obien el nuacutemero de nodos y aristas de un grafo

El comportamiento real de un algoritmo depende de muchos factores propios de su implementacioacutenEntre ellos se encuentran las restricciones de arquitectura es decir el compilador o inteacuterprete utilizado

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 214

983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

el lenguaje de programacioacuten y la maacutequina en que se ejecute Tambieacuten influyen algunos factoreshumanos como la forma de escribir el coacutedigo fuente o las estructuras de datos seleccionadas Enconsecuencia se hace necesario evaluar el comportamiento del algoritmo en forma independiente defactores humanos y de maacutequina

Ahora surge el problema de determinar la eficiencia de un algoritmo de alguacuten modo estaacutendar Si eltiempo de ejecucioacuten depende de la implementacioacuten no es posible medirlo en segundos pues no todoslos computadores tardan lo mismo en ejecutar un mismo programa Este problema puede ser resueltogracias al principio de invariancia que indica que dos implementaciones diferentes de un mismoalgoritmo no difieren en su eficiencia maacutes que en una constante multiplicativa Asiacute es posibleexpresar la complejidad en teacuterminos del tamantildeo de la entrada como 983223 Maacutes adelante con elestudio de la notacioacuten asintoacutetica se veraacute que es posible ignorar la constante y decir simplemente queel algoritmo estaacute en el orden de En algunos casos la complejidad recibe un nombre especial Unalgoritmo es Lineal si estaacute en el orden de Cuadraacutetico se estaacute en el orden de

Polinomial si estaacute en el orden de Exponencial si estaacute en el orden de

Otro aspecto importante al evaluar la complejidad de un algoritmo es que frecuentemente losproblemas tienen diversas instancias de un mismo tamantildeo y el tiempo que tarda un algoritmo enresolverlas puede variar mucho En consecuencia no tiene sentido evaluar la eficiencia de un algoritmosolo en funcioacuten del tamantildeo de la instancia pues el algoritmo debe funcionar correctamente para todaslas instancias En el mejor escenario el tiempo requerido suele ser poco Sin embargo si el tiempo derespuesta es criacutetico es necesario considerar el tiempo requerido para el peor escenario posibleTambieacuten puede ser uacutetil analizar el caso promedio aunque resulta muy difiacutecil pues esto requiere conocera priori la distribucioacuten de los casos a resolver En consecuencia el anaacutelisis de la complejidad del caso

medio no seraacute considerado en este curso

111 LA BUacuteSQUEDA DE LA EFICIENCIA

Es sabido que los computadores son cada vez maacutes raacutepidos Esto podriacutea conducir a la idea de que laeficiencia de los algoritmos es cada vez menos importante Sin embargo no necesariamente es asiacuteSuponga que se tiene un algoritmo exponencial para resolver un problema y una maacutequina quetarda 10 983255 2 segundos en resolver una instancia de tamantildeo Para una instancia de tamantildeo 10 se necesitan 01024 segundos

Para otra de tamantildeo 20 1048576 segundos (cerca de 2 minutos)

Para una tercera de tamantildeo 38 algo maacutes de 318 diacuteas

Si es reemplazada por una maacutequina que tarda 10 983255 2 segundos en resolver una instancia detamantildeo se tiene que

Para una instancia de tamantildeo 10 se necesitan 0001024 segundos Para la de tamantildeo 20 1048576 segundos Para la de tamantildeo 38 algo maacutes de 76 horas

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 314

983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Considere ahora un algoritmo cuacutebico y suponga que tarda 10 983255 segundos en resolver unainstancia de tamantildeo

Para una instancia de tamantildeo 10 se necesitan 10 segundos Para la de tamantildeo 20 80 segundos Para la de tamantildeo 38 algo maacutes de 9 minutos

Si ahora se evaluacutea el algoritmo en la maacutequina que tarda 10 983255 segundos en resolver unainstancia de tamantildeo se tiene que Para una instancia de tamantildeo 10 se necesitan 01 segundos Para la de tamantildeo 20 08 segundos

Para la de tamantildeo 38 54872 segundos

La figura 11 refleja el anaacutelisis anterior

FIGURA 11 Comparacioacuten del desempentildeo de dos algoritmos

Se puede concluir que para instancias pequentildeas es mejor el algoritmo original pero para instanciasgrandes el algoritmo cuacutebico ( ) es muchiacutesimo mejor En ocasiones dependiendo del tipo deinstancias con las que se requiera trabajar resulta adecuado proponer un tercer algoritmo que loscombine a ambos

112 CAacuteLCULO DE LA COMPLEJIDAD

Se denomina operacioacuten elemental o instruccioacuten baacutesica a una instruccioacuten cuyo tiempo de ejecucioacuten estaacuteacotado superiormente por una constante que solo depende de la implementacioacuten usada (la maacutequinaque ejecute el programa el lenguaje de programacioacuten empleado etc) por lo que se asume que tienen

un tiempo de ejecucioacuten unitario El ejemplo 11 muestra una justificacioacuten para esta simplificacioacuten

Ejemplo 11 Considere que un algoritmo requiere efectuar operaciones de adicioacuten operaciones demultiplicacioacuten y operaciones de asignacioacuten Ademaacutes se sabe que una suma nunca requieremaacutes de microsegundos una multiplicacioacuten nunca requiere maacutes de microsegundos y unaasignacioacuten nunca requiere maacutes de segundos

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 414

983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Por la definicioacuten anterior se tiene que el tiempo de ejecucioacuten del algoritmo estaacute acotado por le + + Esto quiere decir que le max 983255 + + Pero se sabeque el tiempo requerido por cada operacioacuten elemental no es importante pues se descartan lasconstantes por lo que se asume que pueden ser ejecutadas en tiempo unitario Por tanto sepuede afirmar que el algoritmo en cuestioacuten es del orden de

+ +

Formalizando la idea del ejemplo 11 se tiene que para un algoritmo dado la complejidad de tiempoqueda determinada por el tiempo de ejecucioacuten de cada instruccioacuten baacutesica y el nuacutemero de veces que seejecuta esa instruccioacuten

Sea un algoritmo para resolver un problema dado 991270 una secuencia de instrucciones baacutesicas del algoritmo el tiempo de ejecucioacuten de la instruccioacuten 1 le le el nuacutemero de veces que se ejecuta 1 le le

La complejidad de tiempo del algoritmo A estaacute dada por

= 983223

Como todas las instrucciones baacutesicas requieren un tiempo constante se puede suponer que esostiempos son iguales es decir = = ⋯ = = 1 Luego se tiene

=

Es decir la complejidad de tiempo corresponde al nuacutemero total de instrucciones baacutesicas necesarias deejecutar para una computacioacuten completa del algoritmo

Ejemplo 12 El problema de la suma de matrices consiste en dadas isin 983255 calcular = + isin983255 Podemos resolver este problema usando el siguiente algoritmo

Dadas isin 983255Para larr 1 a hacer

Para

larr 1 a

hacer

larr + Devolver

Complejidad Aquiacute se observan dos ciclos Para y una asignacioacuten que es una instruccioacuten baacutesica

El primer ciclo Para se ejecuta veces Ademaacutes el ciclo Para anidado dentro del primero se ejecuta veces

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 514

983096

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Luego la instruccioacuten baacutesica anidada en los dos ciclos se ejecuta veces (por el segundociclo) por las veces que se ejecuta el primer ciclo

La asignacioacuten tiene lugar en un tiempo

La complejidad de tiempo del algoritmo dado queda definida por

= 983255 983255

Asumiendo = 1 = 983255

En particular si =

=

Del ejemplo 12 se desprenden las siguientes conclusiones que se resumen en la figura 12

Las instrucciones simples se ejecutan en un tiempo constante que se aproxima a 1

Las instrucciones condicionales se consideran como una instruccioacuten simple Los ciclos iterativos se ejecutan la cantidad de veces que tienen establecido repetirse Esto es si el

ciclo Para repite sus instrucciones desde 1 a su tiempo es Los ciclos iterativos anidados se ejecutan en su tiempo correspondiente multiplicado por las veces

que se repita el ciclo en el cual estaacuten anidados

FIGURA 12 Resumen para el caacutelculo de complejidad computacional

Ejemplo 13 Problema buscar un valor en un arreglo de enterosEntrada el arreglo A y el valor cSalida la posicioacuten del valor en el arreglo

Buscar(A c) jlarr 1Mientras A[j] lt c y j lt n hacer

jlarr j+1Si A[j] = c hacer

devolver j

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 614

983097

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

En otro caso hacerdevolver 0

Para determinar el tiempo de ejecucioacuten del algoritmo es necesario calcular la cantidad deoperaciones elementales que se realizan

En la liacutenea 1 se ejecuta 1 operacioacuten (asignacioacuten) En la liacutenea 2 se ejecuta la condicioacuten del ciclo conformada por un total de 4 operaciones

dos comparaciones un acceso al arreglo y un y loacutegico La liacutenea 3 cuenta con dos operaciones un incremento y una asignacioacuten La liacutenea 4 estaacute conformada por una comparacioacuten y un acceso al vector arreglo (2

operaciones)

La liacutenea 5 contiene una operacioacuten de retorno si la condicioacuten se cumple Anaacutelogamente la liacutenea 7 contiene una operacioacuten de retorno si la condicioacuten no se cumple

En el mejor caso solo se ejecuta la liacutenea 1 y la primera mitad de la condicioacuten de la liacutenea 2 esdecir solo 2 operaciones A continuacioacuten se ejecutan las liacuteneas 5 a 7 Asiacute para el mejor caso

= 1 + 2 + 3 = 6

En el peor caso se ejecuta la liacutenea 1 y el ciclo se repite hasta que se cumple la segundacondicioacuten Cada iteracioacuten del ciclo estaacute dada por las instrucciones de las liacuteneas 2 y 3 maacutes unaejecucioacuten adicional de la liacutenea 2 (para salir del ciclo) La ejecucioacuten termina con la liacutenea 7 Asiacutepara el peor caso se tiene que

= 1 + 4 + 2

+ 4 + 2 + 1 = 6 + 2

12 MODELO DE MAacuteQUINA

Se utiliza el modelo RAM (Maacutequina de Acceso Aleaotrio Random Access Machine en ingleacutes)definido por el esquema de la figura 13

Se denomina entrada a los datos del problema que se entregan al algoritmo y salida a la respuestaentregada por eacuteste

FIGURA 13 Modelo RAM

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 214

983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

el lenguaje de programacioacuten y la maacutequina en que se ejecute Tambieacuten influyen algunos factoreshumanos como la forma de escribir el coacutedigo fuente o las estructuras de datos seleccionadas Enconsecuencia se hace necesario evaluar el comportamiento del algoritmo en forma independiente defactores humanos y de maacutequina

Ahora surge el problema de determinar la eficiencia de un algoritmo de alguacuten modo estaacutendar Si eltiempo de ejecucioacuten depende de la implementacioacuten no es posible medirlo en segundos pues no todoslos computadores tardan lo mismo en ejecutar un mismo programa Este problema puede ser resueltogracias al principio de invariancia que indica que dos implementaciones diferentes de un mismoalgoritmo no difieren en su eficiencia maacutes que en una constante multiplicativa Asiacute es posibleexpresar la complejidad en teacuterminos del tamantildeo de la entrada como 983223 Maacutes adelante con elestudio de la notacioacuten asintoacutetica se veraacute que es posible ignorar la constante y decir simplemente queel algoritmo estaacute en el orden de En algunos casos la complejidad recibe un nombre especial Unalgoritmo es Lineal si estaacute en el orden de Cuadraacutetico se estaacute en el orden de

Polinomial si estaacute en el orden de Exponencial si estaacute en el orden de

Otro aspecto importante al evaluar la complejidad de un algoritmo es que frecuentemente losproblemas tienen diversas instancias de un mismo tamantildeo y el tiempo que tarda un algoritmo enresolverlas puede variar mucho En consecuencia no tiene sentido evaluar la eficiencia de un algoritmosolo en funcioacuten del tamantildeo de la instancia pues el algoritmo debe funcionar correctamente para todaslas instancias En el mejor escenario el tiempo requerido suele ser poco Sin embargo si el tiempo derespuesta es criacutetico es necesario considerar el tiempo requerido para el peor escenario posibleTambieacuten puede ser uacutetil analizar el caso promedio aunque resulta muy difiacutecil pues esto requiere conocera priori la distribucioacuten de los casos a resolver En consecuencia el anaacutelisis de la complejidad del caso

medio no seraacute considerado en este curso

111 LA BUacuteSQUEDA DE LA EFICIENCIA

Es sabido que los computadores son cada vez maacutes raacutepidos Esto podriacutea conducir a la idea de que laeficiencia de los algoritmos es cada vez menos importante Sin embargo no necesariamente es asiacuteSuponga que se tiene un algoritmo exponencial para resolver un problema y una maacutequina quetarda 10 983255 2 segundos en resolver una instancia de tamantildeo Para una instancia de tamantildeo 10 se necesitan 01024 segundos

Para otra de tamantildeo 20 1048576 segundos (cerca de 2 minutos)

Para una tercera de tamantildeo 38 algo maacutes de 318 diacuteas

Si es reemplazada por una maacutequina que tarda 10 983255 2 segundos en resolver una instancia detamantildeo se tiene que

Para una instancia de tamantildeo 10 se necesitan 0001024 segundos Para la de tamantildeo 20 1048576 segundos Para la de tamantildeo 38 algo maacutes de 76 horas

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 314

983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Considere ahora un algoritmo cuacutebico y suponga que tarda 10 983255 segundos en resolver unainstancia de tamantildeo

Para una instancia de tamantildeo 10 se necesitan 10 segundos Para la de tamantildeo 20 80 segundos Para la de tamantildeo 38 algo maacutes de 9 minutos

Si ahora se evaluacutea el algoritmo en la maacutequina que tarda 10 983255 segundos en resolver unainstancia de tamantildeo se tiene que Para una instancia de tamantildeo 10 se necesitan 01 segundos Para la de tamantildeo 20 08 segundos

Para la de tamantildeo 38 54872 segundos

La figura 11 refleja el anaacutelisis anterior

FIGURA 11 Comparacioacuten del desempentildeo de dos algoritmos

Se puede concluir que para instancias pequentildeas es mejor el algoritmo original pero para instanciasgrandes el algoritmo cuacutebico ( ) es muchiacutesimo mejor En ocasiones dependiendo del tipo deinstancias con las que se requiera trabajar resulta adecuado proponer un tercer algoritmo que loscombine a ambos

112 CAacuteLCULO DE LA COMPLEJIDAD

Se denomina operacioacuten elemental o instruccioacuten baacutesica a una instruccioacuten cuyo tiempo de ejecucioacuten estaacuteacotado superiormente por una constante que solo depende de la implementacioacuten usada (la maacutequinaque ejecute el programa el lenguaje de programacioacuten empleado etc) por lo que se asume que tienen

un tiempo de ejecucioacuten unitario El ejemplo 11 muestra una justificacioacuten para esta simplificacioacuten

Ejemplo 11 Considere que un algoritmo requiere efectuar operaciones de adicioacuten operaciones demultiplicacioacuten y operaciones de asignacioacuten Ademaacutes se sabe que una suma nunca requieremaacutes de microsegundos una multiplicacioacuten nunca requiere maacutes de microsegundos y unaasignacioacuten nunca requiere maacutes de segundos

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 414

983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Por la definicioacuten anterior se tiene que el tiempo de ejecucioacuten del algoritmo estaacute acotado por le + + Esto quiere decir que le max 983255 + + Pero se sabeque el tiempo requerido por cada operacioacuten elemental no es importante pues se descartan lasconstantes por lo que se asume que pueden ser ejecutadas en tiempo unitario Por tanto sepuede afirmar que el algoritmo en cuestioacuten es del orden de

+ +

Formalizando la idea del ejemplo 11 se tiene que para un algoritmo dado la complejidad de tiempoqueda determinada por el tiempo de ejecucioacuten de cada instruccioacuten baacutesica y el nuacutemero de veces que seejecuta esa instruccioacuten

Sea un algoritmo para resolver un problema dado 991270 una secuencia de instrucciones baacutesicas del algoritmo el tiempo de ejecucioacuten de la instruccioacuten 1 le le el nuacutemero de veces que se ejecuta 1 le le

La complejidad de tiempo del algoritmo A estaacute dada por

= 983223

Como todas las instrucciones baacutesicas requieren un tiempo constante se puede suponer que esostiempos son iguales es decir = = ⋯ = = 1 Luego se tiene

=

Es decir la complejidad de tiempo corresponde al nuacutemero total de instrucciones baacutesicas necesarias deejecutar para una computacioacuten completa del algoritmo

Ejemplo 12 El problema de la suma de matrices consiste en dadas isin 983255 calcular = + isin983255 Podemos resolver este problema usando el siguiente algoritmo

Dadas isin 983255Para larr 1 a hacer

Para

larr 1 a

hacer

larr + Devolver

Complejidad Aquiacute se observan dos ciclos Para y una asignacioacuten que es una instruccioacuten baacutesica

El primer ciclo Para se ejecuta veces Ademaacutes el ciclo Para anidado dentro del primero se ejecuta veces

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 514

983096

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Luego la instruccioacuten baacutesica anidada en los dos ciclos se ejecuta veces (por el segundociclo) por las veces que se ejecuta el primer ciclo

La asignacioacuten tiene lugar en un tiempo

La complejidad de tiempo del algoritmo dado queda definida por

= 983255 983255

Asumiendo = 1 = 983255

En particular si =

=

Del ejemplo 12 se desprenden las siguientes conclusiones que se resumen en la figura 12

Las instrucciones simples se ejecutan en un tiempo constante que se aproxima a 1

Las instrucciones condicionales se consideran como una instruccioacuten simple Los ciclos iterativos se ejecutan la cantidad de veces que tienen establecido repetirse Esto es si el

ciclo Para repite sus instrucciones desde 1 a su tiempo es Los ciclos iterativos anidados se ejecutan en su tiempo correspondiente multiplicado por las veces

que se repita el ciclo en el cual estaacuten anidados

FIGURA 12 Resumen para el caacutelculo de complejidad computacional

Ejemplo 13 Problema buscar un valor en un arreglo de enterosEntrada el arreglo A y el valor cSalida la posicioacuten del valor en el arreglo

Buscar(A c) jlarr 1Mientras A[j] lt c y j lt n hacer

jlarr j+1Si A[j] = c hacer

devolver j

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 614

983097

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

En otro caso hacerdevolver 0

Para determinar el tiempo de ejecucioacuten del algoritmo es necesario calcular la cantidad deoperaciones elementales que se realizan

En la liacutenea 1 se ejecuta 1 operacioacuten (asignacioacuten) En la liacutenea 2 se ejecuta la condicioacuten del ciclo conformada por un total de 4 operaciones

dos comparaciones un acceso al arreglo y un y loacutegico La liacutenea 3 cuenta con dos operaciones un incremento y una asignacioacuten La liacutenea 4 estaacute conformada por una comparacioacuten y un acceso al vector arreglo (2

operaciones)

La liacutenea 5 contiene una operacioacuten de retorno si la condicioacuten se cumple Anaacutelogamente la liacutenea 7 contiene una operacioacuten de retorno si la condicioacuten no se cumple

En el mejor caso solo se ejecuta la liacutenea 1 y la primera mitad de la condicioacuten de la liacutenea 2 esdecir solo 2 operaciones A continuacioacuten se ejecutan las liacuteneas 5 a 7 Asiacute para el mejor caso

= 1 + 2 + 3 = 6

En el peor caso se ejecuta la liacutenea 1 y el ciclo se repite hasta que se cumple la segundacondicioacuten Cada iteracioacuten del ciclo estaacute dada por las instrucciones de las liacuteneas 2 y 3 maacutes unaejecucioacuten adicional de la liacutenea 2 (para salir del ciclo) La ejecucioacuten termina con la liacutenea 7 Asiacutepara el peor caso se tiene que

= 1 + 4 + 2

+ 4 + 2 + 1 = 6 + 2

12 MODELO DE MAacuteQUINA

Se utiliza el modelo RAM (Maacutequina de Acceso Aleaotrio Random Access Machine en ingleacutes)definido por el esquema de la figura 13

Se denomina entrada a los datos del problema que se entregan al algoritmo y salida a la respuestaentregada por eacuteste

FIGURA 13 Modelo RAM

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 314

983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Considere ahora un algoritmo cuacutebico y suponga que tarda 10 983255 segundos en resolver unainstancia de tamantildeo

Para una instancia de tamantildeo 10 se necesitan 10 segundos Para la de tamantildeo 20 80 segundos Para la de tamantildeo 38 algo maacutes de 9 minutos

Si ahora se evaluacutea el algoritmo en la maacutequina que tarda 10 983255 segundos en resolver unainstancia de tamantildeo se tiene que Para una instancia de tamantildeo 10 se necesitan 01 segundos Para la de tamantildeo 20 08 segundos

Para la de tamantildeo 38 54872 segundos

La figura 11 refleja el anaacutelisis anterior

FIGURA 11 Comparacioacuten del desempentildeo de dos algoritmos

Se puede concluir que para instancias pequentildeas es mejor el algoritmo original pero para instanciasgrandes el algoritmo cuacutebico ( ) es muchiacutesimo mejor En ocasiones dependiendo del tipo deinstancias con las que se requiera trabajar resulta adecuado proponer un tercer algoritmo que loscombine a ambos

112 CAacuteLCULO DE LA COMPLEJIDAD

Se denomina operacioacuten elemental o instruccioacuten baacutesica a una instruccioacuten cuyo tiempo de ejecucioacuten estaacuteacotado superiormente por una constante que solo depende de la implementacioacuten usada (la maacutequinaque ejecute el programa el lenguaje de programacioacuten empleado etc) por lo que se asume que tienen

un tiempo de ejecucioacuten unitario El ejemplo 11 muestra una justificacioacuten para esta simplificacioacuten

Ejemplo 11 Considere que un algoritmo requiere efectuar operaciones de adicioacuten operaciones demultiplicacioacuten y operaciones de asignacioacuten Ademaacutes se sabe que una suma nunca requieremaacutes de microsegundos una multiplicacioacuten nunca requiere maacutes de microsegundos y unaasignacioacuten nunca requiere maacutes de segundos

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 414

983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Por la definicioacuten anterior se tiene que el tiempo de ejecucioacuten del algoritmo estaacute acotado por le + + Esto quiere decir que le max 983255 + + Pero se sabeque el tiempo requerido por cada operacioacuten elemental no es importante pues se descartan lasconstantes por lo que se asume que pueden ser ejecutadas en tiempo unitario Por tanto sepuede afirmar que el algoritmo en cuestioacuten es del orden de

+ +

Formalizando la idea del ejemplo 11 se tiene que para un algoritmo dado la complejidad de tiempoqueda determinada por el tiempo de ejecucioacuten de cada instruccioacuten baacutesica y el nuacutemero de veces que seejecuta esa instruccioacuten

Sea un algoritmo para resolver un problema dado 991270 una secuencia de instrucciones baacutesicas del algoritmo el tiempo de ejecucioacuten de la instruccioacuten 1 le le el nuacutemero de veces que se ejecuta 1 le le

La complejidad de tiempo del algoritmo A estaacute dada por

= 983223

Como todas las instrucciones baacutesicas requieren un tiempo constante se puede suponer que esostiempos son iguales es decir = = ⋯ = = 1 Luego se tiene

=

Es decir la complejidad de tiempo corresponde al nuacutemero total de instrucciones baacutesicas necesarias deejecutar para una computacioacuten completa del algoritmo

Ejemplo 12 El problema de la suma de matrices consiste en dadas isin 983255 calcular = + isin983255 Podemos resolver este problema usando el siguiente algoritmo

Dadas isin 983255Para larr 1 a hacer

Para

larr 1 a

hacer

larr + Devolver

Complejidad Aquiacute se observan dos ciclos Para y una asignacioacuten que es una instruccioacuten baacutesica

El primer ciclo Para se ejecuta veces Ademaacutes el ciclo Para anidado dentro del primero se ejecuta veces

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 514

983096

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Luego la instruccioacuten baacutesica anidada en los dos ciclos se ejecuta veces (por el segundociclo) por las veces que se ejecuta el primer ciclo

La asignacioacuten tiene lugar en un tiempo

La complejidad de tiempo del algoritmo dado queda definida por

= 983255 983255

Asumiendo = 1 = 983255

En particular si =

=

Del ejemplo 12 se desprenden las siguientes conclusiones que se resumen en la figura 12

Las instrucciones simples se ejecutan en un tiempo constante que se aproxima a 1

Las instrucciones condicionales se consideran como una instruccioacuten simple Los ciclos iterativos se ejecutan la cantidad de veces que tienen establecido repetirse Esto es si el

ciclo Para repite sus instrucciones desde 1 a su tiempo es Los ciclos iterativos anidados se ejecutan en su tiempo correspondiente multiplicado por las veces

que se repita el ciclo en el cual estaacuten anidados

FIGURA 12 Resumen para el caacutelculo de complejidad computacional

Ejemplo 13 Problema buscar un valor en un arreglo de enterosEntrada el arreglo A y el valor cSalida la posicioacuten del valor en el arreglo

Buscar(A c) jlarr 1Mientras A[j] lt c y j lt n hacer

jlarr j+1Si A[j] = c hacer

devolver j

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 614

983097

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

En otro caso hacerdevolver 0

Para determinar el tiempo de ejecucioacuten del algoritmo es necesario calcular la cantidad deoperaciones elementales que se realizan

En la liacutenea 1 se ejecuta 1 operacioacuten (asignacioacuten) En la liacutenea 2 se ejecuta la condicioacuten del ciclo conformada por un total de 4 operaciones

dos comparaciones un acceso al arreglo y un y loacutegico La liacutenea 3 cuenta con dos operaciones un incremento y una asignacioacuten La liacutenea 4 estaacute conformada por una comparacioacuten y un acceso al vector arreglo (2

operaciones)

La liacutenea 5 contiene una operacioacuten de retorno si la condicioacuten se cumple Anaacutelogamente la liacutenea 7 contiene una operacioacuten de retorno si la condicioacuten no se cumple

En el mejor caso solo se ejecuta la liacutenea 1 y la primera mitad de la condicioacuten de la liacutenea 2 esdecir solo 2 operaciones A continuacioacuten se ejecutan las liacuteneas 5 a 7 Asiacute para el mejor caso

= 1 + 2 + 3 = 6

En el peor caso se ejecuta la liacutenea 1 y el ciclo se repite hasta que se cumple la segundacondicioacuten Cada iteracioacuten del ciclo estaacute dada por las instrucciones de las liacuteneas 2 y 3 maacutes unaejecucioacuten adicional de la liacutenea 2 (para salir del ciclo) La ejecucioacuten termina con la liacutenea 7 Asiacutepara el peor caso se tiene que

= 1 + 4 + 2

+ 4 + 2 + 1 = 6 + 2

12 MODELO DE MAacuteQUINA

Se utiliza el modelo RAM (Maacutequina de Acceso Aleaotrio Random Access Machine en ingleacutes)definido por el esquema de la figura 13

Se denomina entrada a los datos del problema que se entregan al algoritmo y salida a la respuestaentregada por eacuteste

FIGURA 13 Modelo RAM

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 414

983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Por la definicioacuten anterior se tiene que el tiempo de ejecucioacuten del algoritmo estaacute acotado por le + + Esto quiere decir que le max 983255 + + Pero se sabeque el tiempo requerido por cada operacioacuten elemental no es importante pues se descartan lasconstantes por lo que se asume que pueden ser ejecutadas en tiempo unitario Por tanto sepuede afirmar que el algoritmo en cuestioacuten es del orden de

+ +

Formalizando la idea del ejemplo 11 se tiene que para un algoritmo dado la complejidad de tiempoqueda determinada por el tiempo de ejecucioacuten de cada instruccioacuten baacutesica y el nuacutemero de veces que seejecuta esa instruccioacuten

Sea un algoritmo para resolver un problema dado 991270 una secuencia de instrucciones baacutesicas del algoritmo el tiempo de ejecucioacuten de la instruccioacuten 1 le le el nuacutemero de veces que se ejecuta 1 le le

La complejidad de tiempo del algoritmo A estaacute dada por

= 983223

Como todas las instrucciones baacutesicas requieren un tiempo constante se puede suponer que esostiempos son iguales es decir = = ⋯ = = 1 Luego se tiene

=

Es decir la complejidad de tiempo corresponde al nuacutemero total de instrucciones baacutesicas necesarias deejecutar para una computacioacuten completa del algoritmo

Ejemplo 12 El problema de la suma de matrices consiste en dadas isin 983255 calcular = + isin983255 Podemos resolver este problema usando el siguiente algoritmo

Dadas isin 983255Para larr 1 a hacer

Para

larr 1 a

hacer

larr + Devolver

Complejidad Aquiacute se observan dos ciclos Para y una asignacioacuten que es una instruccioacuten baacutesica

El primer ciclo Para se ejecuta veces Ademaacutes el ciclo Para anidado dentro del primero se ejecuta veces

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 514

983096

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Luego la instruccioacuten baacutesica anidada en los dos ciclos se ejecuta veces (por el segundociclo) por las veces que se ejecuta el primer ciclo

La asignacioacuten tiene lugar en un tiempo

La complejidad de tiempo del algoritmo dado queda definida por

= 983255 983255

Asumiendo = 1 = 983255

En particular si =

=

Del ejemplo 12 se desprenden las siguientes conclusiones que se resumen en la figura 12

Las instrucciones simples se ejecutan en un tiempo constante que se aproxima a 1

Las instrucciones condicionales se consideran como una instruccioacuten simple Los ciclos iterativos se ejecutan la cantidad de veces que tienen establecido repetirse Esto es si el

ciclo Para repite sus instrucciones desde 1 a su tiempo es Los ciclos iterativos anidados se ejecutan en su tiempo correspondiente multiplicado por las veces

que se repita el ciclo en el cual estaacuten anidados

FIGURA 12 Resumen para el caacutelculo de complejidad computacional

Ejemplo 13 Problema buscar un valor en un arreglo de enterosEntrada el arreglo A y el valor cSalida la posicioacuten del valor en el arreglo

Buscar(A c) jlarr 1Mientras A[j] lt c y j lt n hacer

jlarr j+1Si A[j] = c hacer

devolver j

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 614

983097

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

En otro caso hacerdevolver 0

Para determinar el tiempo de ejecucioacuten del algoritmo es necesario calcular la cantidad deoperaciones elementales que se realizan

En la liacutenea 1 se ejecuta 1 operacioacuten (asignacioacuten) En la liacutenea 2 se ejecuta la condicioacuten del ciclo conformada por un total de 4 operaciones

dos comparaciones un acceso al arreglo y un y loacutegico La liacutenea 3 cuenta con dos operaciones un incremento y una asignacioacuten La liacutenea 4 estaacute conformada por una comparacioacuten y un acceso al vector arreglo (2

operaciones)

La liacutenea 5 contiene una operacioacuten de retorno si la condicioacuten se cumple Anaacutelogamente la liacutenea 7 contiene una operacioacuten de retorno si la condicioacuten no se cumple

En el mejor caso solo se ejecuta la liacutenea 1 y la primera mitad de la condicioacuten de la liacutenea 2 esdecir solo 2 operaciones A continuacioacuten se ejecutan las liacuteneas 5 a 7 Asiacute para el mejor caso

= 1 + 2 + 3 = 6

En el peor caso se ejecuta la liacutenea 1 y el ciclo se repite hasta que se cumple la segundacondicioacuten Cada iteracioacuten del ciclo estaacute dada por las instrucciones de las liacuteneas 2 y 3 maacutes unaejecucioacuten adicional de la liacutenea 2 (para salir del ciclo) La ejecucioacuten termina con la liacutenea 7 Asiacutepara el peor caso se tiene que

= 1 + 4 + 2

+ 4 + 2 + 1 = 6 + 2

12 MODELO DE MAacuteQUINA

Se utiliza el modelo RAM (Maacutequina de Acceso Aleaotrio Random Access Machine en ingleacutes)definido por el esquema de la figura 13

Se denomina entrada a los datos del problema que se entregan al algoritmo y salida a la respuestaentregada por eacuteste

FIGURA 13 Modelo RAM

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 514

983096

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Luego la instruccioacuten baacutesica anidada en los dos ciclos se ejecuta veces (por el segundociclo) por las veces que se ejecuta el primer ciclo

La asignacioacuten tiene lugar en un tiempo

La complejidad de tiempo del algoritmo dado queda definida por

= 983255 983255

Asumiendo = 1 = 983255

En particular si =

=

Del ejemplo 12 se desprenden las siguientes conclusiones que se resumen en la figura 12

Las instrucciones simples se ejecutan en un tiempo constante que se aproxima a 1

Las instrucciones condicionales se consideran como una instruccioacuten simple Los ciclos iterativos se ejecutan la cantidad de veces que tienen establecido repetirse Esto es si el

ciclo Para repite sus instrucciones desde 1 a su tiempo es Los ciclos iterativos anidados se ejecutan en su tiempo correspondiente multiplicado por las veces

que se repita el ciclo en el cual estaacuten anidados

FIGURA 12 Resumen para el caacutelculo de complejidad computacional

Ejemplo 13 Problema buscar un valor en un arreglo de enterosEntrada el arreglo A y el valor cSalida la posicioacuten del valor en el arreglo

Buscar(A c) jlarr 1Mientras A[j] lt c y j lt n hacer

jlarr j+1Si A[j] = c hacer

devolver j

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 614

983097

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

En otro caso hacerdevolver 0

Para determinar el tiempo de ejecucioacuten del algoritmo es necesario calcular la cantidad deoperaciones elementales que se realizan

En la liacutenea 1 se ejecuta 1 operacioacuten (asignacioacuten) En la liacutenea 2 se ejecuta la condicioacuten del ciclo conformada por un total de 4 operaciones

dos comparaciones un acceso al arreglo y un y loacutegico La liacutenea 3 cuenta con dos operaciones un incremento y una asignacioacuten La liacutenea 4 estaacute conformada por una comparacioacuten y un acceso al vector arreglo (2

operaciones)

La liacutenea 5 contiene una operacioacuten de retorno si la condicioacuten se cumple Anaacutelogamente la liacutenea 7 contiene una operacioacuten de retorno si la condicioacuten no se cumple

En el mejor caso solo se ejecuta la liacutenea 1 y la primera mitad de la condicioacuten de la liacutenea 2 esdecir solo 2 operaciones A continuacioacuten se ejecutan las liacuteneas 5 a 7 Asiacute para el mejor caso

= 1 + 2 + 3 = 6

En el peor caso se ejecuta la liacutenea 1 y el ciclo se repite hasta que se cumple la segundacondicioacuten Cada iteracioacuten del ciclo estaacute dada por las instrucciones de las liacuteneas 2 y 3 maacutes unaejecucioacuten adicional de la liacutenea 2 (para salir del ciclo) La ejecucioacuten termina con la liacutenea 7 Asiacutepara el peor caso se tiene que

= 1 + 4 + 2

+ 4 + 2 + 1 = 6 + 2

12 MODELO DE MAacuteQUINA

Se utiliza el modelo RAM (Maacutequina de Acceso Aleaotrio Random Access Machine en ingleacutes)definido por el esquema de la figura 13

Se denomina entrada a los datos del problema que se entregan al algoritmo y salida a la respuestaentregada por eacuteste

FIGURA 13 Modelo RAM

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 614

983097

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

En otro caso hacerdevolver 0

Para determinar el tiempo de ejecucioacuten del algoritmo es necesario calcular la cantidad deoperaciones elementales que se realizan

En la liacutenea 1 se ejecuta 1 operacioacuten (asignacioacuten) En la liacutenea 2 se ejecuta la condicioacuten del ciclo conformada por un total de 4 operaciones

dos comparaciones un acceso al arreglo y un y loacutegico La liacutenea 3 cuenta con dos operaciones un incremento y una asignacioacuten La liacutenea 4 estaacute conformada por una comparacioacuten y un acceso al vector arreglo (2

operaciones)

La liacutenea 5 contiene una operacioacuten de retorno si la condicioacuten se cumple Anaacutelogamente la liacutenea 7 contiene una operacioacuten de retorno si la condicioacuten no se cumple

En el mejor caso solo se ejecuta la liacutenea 1 y la primera mitad de la condicioacuten de la liacutenea 2 esdecir solo 2 operaciones A continuacioacuten se ejecutan las liacuteneas 5 a 7 Asiacute para el mejor caso

= 1 + 2 + 3 = 6

En el peor caso se ejecuta la liacutenea 1 y el ciclo se repite hasta que se cumple la segundacondicioacuten Cada iteracioacuten del ciclo estaacute dada por las instrucciones de las liacuteneas 2 y 3 maacutes unaejecucioacuten adicional de la liacutenea 2 (para salir del ciclo) La ejecucioacuten termina con la liacutenea 7 Asiacutepara el peor caso se tiene que

= 1 + 4 + 2

+ 4 + 2 + 1 = 6 + 2

12 MODELO DE MAacuteQUINA

Se utiliza el modelo RAM (Maacutequina de Acceso Aleaotrio Random Access Machine en ingleacutes)definido por el esquema de la figura 13

Se denomina entrada a los datos del problema que se entregan al algoritmo y salida a la respuestaentregada por eacuteste

FIGURA 13 Modelo RAM

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 714

983089983088

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

El anaacutelisis de complejidad de un algoritmo se hace respecto al mejor caso (sus entradas maacutes favorablesen cuanto al tiempo requerido) al peor caso (las entradas menos favorables) y al caso medioAntes de seguir adelante es necesario conocer algunas definiciones Paso tiempo de una instruccioacuten baacutesica

Complejidad local nuacutemero total de pasos de la ejecucioacuten completa del algoritmo para una entrada

dada Complejidad asintoacutetica menor cota superior de la complejidad local

Complejidad del mejor caso tiempo para ejecutar el algoritmo con la entrada maacutes favorable Complejidad del peor caso tiempo en ejecutar el algoritmo con la entrada maacutes desfavorable Complejidad del caso medio tiempo promedio en ejecutar el algoritmo con todas las entradas

posibles

Dado un algoritmo A para resolver un problema sean todas las posibles entradas tiempo de ejecutar para la entrada 1 le le

probabilidad de que ocurra la entrada

1 le le

La complejidad del mejor caso es = 1 le le

La complejidad del peor caso es = 1 le le

La complejidad del caso medio estaacute dada por

La complejidad maacutes utilizada para confrontar los rendimientos de los algoritmos es la del peor casoUna de las razones es que da una cota para todas las entradas incluyendo aquellas muy malas que elanaacutelisis del caso promedio no puede ofrecer Otra razoacuten es que la complejidad del caso medio es maacutesdifiacutecil de calcular dado que es necesario conocer todas las posibles entradas del algoritmo y susprobabilidades

13 NOTACIOacuteN O

Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es del orden de de ( sim Ω) si existen constantes

y

tales que

le 983223 forall ge (figura 14) En otras palabras

estaacute acotada inferiormente

por 983223 para todo valor ge La figura 14 muestra un ejemplo

Ejemplo 143 +1 sim 3 + sim 5 sim 1 0 983223 2 sim 2

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 814

983089983089

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

FIGURA 14 Ejemplo de notacioacuten O

Propiedades de la notacioacuten O1 + = + Regla de la suma

2

983223 = 983223 = Constantes multiplicativas 3 983223 = 983223 Regla de la multiplicacioacuten 4

ge rArr + = Cotas

5 ge rArr ℎ sim ℎ sim Transitividad

Observaciones La notacioacuten O desprecia las constantes aditivas y multiplicativas

La medida de la complejidad es una aproximacioacuten al tiempo real que el algoritmo requiere paraencontrar la solucioacuten Por ello aparece el siacutembolo ~ en lugar de =

14 OTRAS NOTACIONES

Ademaacutes de la notacioacuten O existen otras notaciones asintoacuteticas que ayudan a acotar la complejidad de unalgoritmo

Notacioacuten Ω Dadas ℝ rarr ℝ y ℝ rarr ℝ se dice que es omega de denotado por sim Ω si existen constantes y tales que ge 983223 forall ge En otras palabras estaacute acotadainferiormente por 983223 para todo valor ge

Notacioacuten Θ Dadas ℝ rarr ℝ y ℝ rarr ℝ si ~Og y ~Ωg a la vez se dice que ~ΘgExpresado de otro modo ~Θg si existen constantes y tales que 983223 le le 983223 forall ge Es decir estaacute acotada inferiormente por 983223 y superiormente por 983223 para todo valor ge

Notacioacuten o Dadas ℝ rarr ℝ

y ℝ rarr ℝ

se dice que es o (tambieacuten llamada o chica u ominuacutescula) de denotado por sim o si le 983223 forall ge y forall gt 0 En otraspalabras estaacute acotada inferiormente por 983223 para todo valor ge

15 COMPLEJIDAD DE ALGORITMOS SECUENCIALES E ITERATIVOS

Anteriormente se estudioacute la forma de estimar el tiempo de ejecucioacuten para un algoritmo dado mediantela contabilizacioacuten de las instrucciones que se ejecutan ante un escenario dado Para determinar la

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 914

983089983090

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

complejidad del algoritmo basta con aplicar las cotas descritas sobre la foacutermula obtenida para eltiempo de ejecucioacuten

Asiacute para el ejemplo 13 se tiene que

~6 = 1 ~6 + 2 =

Ejemplo 15 Problema dadas isin 983255 y isin 983255 calcular = isin 983255Entrada isin 983255 isin 983255Salida isin 983255

Para larr 1 a hacerPara

larr

1 a

hacer

larr +

Para larr 2 a hacer larr + +

Complejidad Aquiacute se observan tres ciclos Para anidados El primer ciclo Para se ejecuta veces Por cada vez que se ejecuta el primer ciclo el segundo ciclo Para se ejecuta veces Por cada vez que se ejecuta el segundo ciclo se tiene una instruccioacuten baacutesica y un tercer ciclo

que se ejecuta minus 1 veces

there4 La complejidad de tiempo queda definida por sim 983223 983223 En particular si = = entonces sim

En este caso la complejidad del mejor caso es igual a la complejidad del peor caso y a lacomplejidad del caso medio ya que cualquiera sea la entrada el algoritmo ejecuta todos lospasos

Ejemplo 16El factorial de un nuacutemero natural se define por la multiplicacioacuten desde 1 al nuacutemero = 1 983223 2 983223 3 983223 991270 983223

Problema dado calcular Entrada isin ℕSalida Si = 0 oacute = 1 entonces larr 1 En caso contrario hacer larr 1

Para larr 2 a hacer

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1014

983089983091

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

larr 983223

Complejidad

Para la instruccioacuten condicional (Si) y la asignacioacuten se considera un tiempo unitario Para el caso contrario de la instruccioacuten condicional se tiene

bull

Asignacioacuten con tiempo 1bull Ciclo Para que se ejecuta n-1 vecesbull Dentro del ciclo Para una asignacioacuten con tiempo 1

Con los tiempos de cada instruccioacuten y por las propiedades de la notacioacuten O la complejidad delalgoritmo 13 es = 1 + 1 983223 [1 + minus 1 983223 1] = 1 + 1 + n minus 1 Aplicando laspropiedades de la notacioacuten O se tiene que = 1 + 1 + minus 1 Aquiacute sepodriacutea ocupar la regla de la suma pero se debe recordar que la notacioacuten O desprecia lasconstantes aditivas y multiplicativas por tanto ~

Ejemplo 17 La utilidad del uso de la complejidad aparece en su mayor expresioacuten cuando se necesita optarpor alguna alternativa entre diferentes algoritmos para resolver un problema determinado Paraesto se debe saber discriminar entre un algoritmo y otro para poder tomar la mejor decisioacutenSuponga que la entrada de cierto problema tiene tamantildeo y que para resolverlo se encuentraen la literatura las siguientes alternativasa Algoritmo de tiempo b

Transformarlo en otro problema para el cual se conoce un algoritmo de tiempo Latransformacioacuten demora log

c

Modelarlo en un aacuterbol de decisioacuten de veacutertices y ejecutar por cada veacutertice del aacuterbol unalgoritmo de tiempo

La alternativa a no tiene mayor anaacutelisisEn la alternativa b se encuentra una transformacioacuten Esto no es maacutes que la aplicacioacuten de unalgoritmo seguido de otro Se puede observar entonces que la complejidad es + log Entre estas dos funciones se debe determinar la mayor para que la alternativa quede acotada a supeor caso Por ello la complejidad de la alternativa b es ~log

La alternativa c del ejemplo 17 presenta un modelamiento con un aacuterbol por cada veacutertice delaacuterbol se ejecuta un algoritmo de tiempo Ahora bien siendo los veacutertices del aacuterbol yutilizando la regla de la multiplicacioacuten la alternativa c queda con complejidad ~

Se tiene entoncesa

b

log c

Se debe elegir la alternativa cuyo valor de funcioacuten sea menor esto es porque el algoritmoelegido debe ser el maacutes raacutepido es decir que ocupe menor tiempo de ejecucioacuten Luego en elejemplo 17 la alternativa elegida es la b

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1114

983089983092

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Ahora que ya se tienen las herramientas para analizar la complejidad de un algoritmo es pertinente daralgunas definiciones adicionales relativas a la eficiencia de algoritmos Un algoritmo es eficiente si su complejidad es un polinomio de la entrada es decir es de la forma~ 983223 donde es una constante Para algunos problemas es posible determinar el liacutemite inferior del problema que corresponde al

tiempo miacutenimo para resolverlo Este liacutemite es una caracteriacutestica del problema y refleja su dificultadintriacutenseca para resolverlo Cualquier algoritmo que lo resuelva utilizaraacute por lo menos ese tiempo

Un algoritmo es oacuteptimo si su complejidad es ~ donde es el liacutemite inferior del problema

Una observacioacuten importante

Hay un aspecto del caacutelculo de la complejidad que suele dar origen a confusioacuten y estaacute ligado a la nocioacuten deinstruccioacuten baacutesica Habiacutea quedado establecido que las instrucciones baacutesicas son aquellas cuyo tiempo deejecucioacuten estaacute acotado superiormente por una constante que solo depende de la implementacioacuten usada Enotras palabras pueden asociarse a las operaciones unarias y binarias que incorpora el procesador (asignacioacutencambio de signo operaciones aritmeacuteticas operaciones loacutegicas comparaciones etc) Sin embargo en losejemplos anteriores pareciera que no se hubiese considerado la condicioacuten de la sentencia Si o de los ciclos

Para y Mientras o bien que se hubiese considerado como instruccioacuten simple a alguna sentencia que enrealidad contiene varias operaciones

En efecto si se tiene una sentencia como = 3 983223 5 + minus minus 6Al momento de compilar o interpretar el programa se traduce en una serie de sentencias (los teacuterminos corresponden a variables temporales creadas por el compilador o inteacuterprete)

= 5 + = 3 lowast = minus

=

minus 6

= No obstante como se asume que cada una de ellas tiene un tiempo de ejecucioacuten unitario y la notacioacutenasintoacutetica descarta las constantes aditivas y multiplicativas es posible ignorar este aspecto

En el caso de las comparaciones y operaciones loacutegicas se observa el mismo fenoacutemeno Considere laexpresioacuten

ne 3 lt 8Cuando se compila o interpreta el programa esto se traduce en una secuencia de operaciones de la forma (losnuacutemeros agregados al comienzo de cada instruccioacuten simplemente permiten identificar cada liacutenea para dirigirlos saltos)

0 si ne 3 3 1 = falso2 4 3 = verdadero4 si lt 8 7 5 = falso6 8 7 = verdadero8 = y

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1214

983089983093

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

16 COMPLEJIDAD DE ALGORITMOS RECURSIVOS

Se denomina recursioacuten al proceso de resolver un problema grande descomponieacutendolo en uno o maacutessubproblemas que son de estructura ideacutentica a la del problema original pero maacutes simples de resolverque aquel Cada subproblema se resuelve de forma similar repitiendo la descomposicioacuten hasta generar

subproblemas tan simples que se resuelven sin necesidad de descomponerlos La solucioacuten del problemaoriginal se obtiene combinando las soluciones de los subproblemas en un proceso inverso a ladescomposicioacuten realizada

La recursioacuten estaacute muy ligada a la recurrencia matemaacutetica que en cuando se define una funcioacuten f enteacuterminos de ella misma Dos ejemplos claacutesicos de recurrencia matemaacutetica son el caacutelculo del factorial ylos nuacutemeros de Fibonacci que se muestran en los ejemplos 18 y 19 respectivamente

Ejemplo 123 Funcioacuten recurrente para el factorial

= 983223 minus 1 ge 1

1 = 0

Ejemplo 124 Funcioacuten recurrente para los nuacutemeros de Fibonacci

= minus 1 + minus 2 ge 21 = 11 = 0 Cabe destacar que la recursividad es una propiedad de la estrategia para resolver un problema y no delproblema en siacute Asiacute pues se dice que un algoritmo es recursivo si corresponde a un procedimiento quese invoca a siacute mismo hasta recibir como entrada un caso base

En programacioacuten la recursioacuten puede darse de dos formas

1

Directa en alguacuten paso del conjunto de instrucciones aparece una invocacioacuten al propioprocedimiento2 Indirecta el procedimiento llama a otro procedimiento y este uacuteltimo llama a su vez al primero

Asimismo si un procedimiento llama a otros y en alguacuten momento alguno de ellos llama alprimero tambieacuten es un caso de recursioacuten indirecta

En toda definicioacuten recursiva de un problema se debe establecer una condicioacuten de borde es decir unacondicioacuten que no requiera otra definicioacuten recursiva para su resolucioacuten Eacutesta condicioacuten determina elcriterio de parada del algoritmo recursivo

Para el ejemplo 123 por definicioacuten se tiene que

0 = 11 = 0 983223 1 = 1 983223 12 = 1 983223 2 = 1 983223 1 983223 23 = 2 983223 3 = 1 983223 1 983223 2 983223 3 etc

Al definir 3 estamos usando 2 y asiacute hasta llegar al 0 En este caso la condicioacuten de borde es elfactorial de cero (0 = 1) En este punto se observa que la funcioacuten ya no se llama a siacute misma sino queentrega el resultado y se detiene En otras palabras se asigna un valor directamente

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1314

983089983094

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Dado larr 983223 minus 1 Devolver Factorial

Procedimiento

Si = 0 oacute 1 entoncesDevolver 1

En caso contrario hacerDevolver 983223 minus 1

La complejidad de un algoritmo recursivo se expresa mediante una ecuacioacuten de recurrencia Porejemplo sea el tiempo para calcular Entonces = minus 1 + 1 gt 01 = 0 Si se resuelve esa ecuacioacuten por sustitucioacuten se encuentra

= minus 1 + 1 = = minus 2 + 1 + 1 = minus 2 + 2 = = minus 3 + 1 + 1 + 1 = minus 3 + 3 = 991270 = minus + = 991270 = 1 + minus 1 = = 0 + = + 1

Luego la complejidad del Algoritmo Factorial Recursivo es

~

Una observacioacuten importante es que en este caso la complejidad del algoritmo iterativo es igual a la delalgoritmo recursivo No obstante esto no siempre es asiacute Para algunos problemas es maacutes eficiente elalgoritmo recursivo para otros el algoritmo iterativo es mejor Maacutes auacuten existen problemas para loscuales es imposible desarrollar un algoritmo iterativo que no sea una simulacioacuten de la recursioacuten Lasecuencia de Fibonacci del ejemplo 19 es un caso en que el algoritmo iterativo es maacutes eficiente

ComplejidadDado que un algoritmo recursivo se invoca a siacute mismo al expresar el orden de su complejidad seobtiene una ecuacioacuten de recurrencia Esta ecuacioacuten depende del proceso de descomposicioacuten delproblema en subproblemas

Reduccioacuten por sustraccioacuten si el tamantildeo del problema decrece en una cantidad constante en cadallamada se realizan llamadas recursivas y las operaciones correspondientes a la parte no recursivadel algoritmo toman un tiempo entonces

= minus + si ge

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt

8172019 1_Complejidad de Algoritmos

httpslidepdfcomreaderfull1complejidad-de-algoritmos 1414

983089983095

Anaacutelisis de Algoritmos y Estructura de Datos

Jacqueline Koumlhler C

Una observacioacuten importante es que se considera un tiempo polinomial para la resolucioacuten de unproblema solamente porque interesa que la solucioacuten recursiva sea eficiente Un tiempo exponencialpor ejemplo seriacutea mucho maacutes costoso que un caso iterativo

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt 1 = 1 gt 1

Reduccioacuten por divisioacuten si el algoritmo con un problema de tamantildeo realiza llamadas recursivas consubproblemas de tamantildeo

y las operaciones correspondientes a la parte no recursiva que corresponde

a descomponer el problema en los subproblemas y luego combinar las soluciones de eacutestos toman untiempo entonces

= + si ge

La solucioacuten de esta ecuacioacuten de recurrencia es de la forma

= lt log = gt