45
Complejidad Complejidad Apoyo SSD5 Apoyo SSD5

16 Complejidad

  • Upload
    uvm

  • View
    2.965

  • Download
    0

Embed Size (px)

Citation preview

ComplejidadComplejidad

Apoyo SSD5Apoyo SSD5

Mtl Lourdes CahuichMtl Lourdes Cahuich 22

IntroducciónIntroducción

�� Complejidad es la medida del uso de Complejidad es la medida del uso de algún recurso por parte de un algoritmo. algún recurso por parte de un algoritmo.

�� Estos recursos pueden ser requerimientos Estos recursos pueden ser requerimientos de almacenamiento, memoria o tiempo. de almacenamiento, memoria o tiempo.

Mtl Lourdes CahuichMtl Lourdes Cahuich 33

Tiempo de un algoritmoTiempo de un algoritmo

�� Por lo general, la cantidad de tiempo que Por lo general, la cantidad de tiempo que un algoritmo toma para completarse es el un algoritmo toma para completarse es el recurso más frecuentemente encontrado recurso más frecuentemente encontrado en el contexto de complejidaden el contexto de complejidad

Mtl Lourdes CahuichMtl Lourdes Cahuich 44

Análisis AsintóticoAnálisis Asintótico

�� El análisis asintótico es la determinación El análisis asintótico es la determinación de la cantidad de recursos usados por un de la cantidad de recursos usados por un algoritmo.algoritmo.

�� Usualmente, este recurso es el tiempo de Usualmente, este recurso es el tiempo de ejecución del algoritmo.ejecución del algoritmo.

�� El tiempo de ejecución de un programa es El tiempo de ejecución de un programa es sobre todo una cantidad física. sobre todo una cantidad física.

Mtl Lourdes CahuichMtl Lourdes Cahuich 55

Análisis asintóticoAnálisis asintótico

�� En principio, podemos detenernos a mirar En principio, podemos detenernos a mirar y ver cuánto tiempo toma el programa y ver cuánto tiempo toma el programa para ejecutarse.para ejecutarse.

�� De hecho, todos los sistemas De hecho, todos los sistemas computacionales soportan un reloj interno, computacionales soportan un reloj interno, y uno puede medir el tiempo de ejecución y uno puede medir el tiempo de ejecución aún sin la ayuda de un dispositivo externo aún sin la ayuda de un dispositivo externo para hacerlopara hacerlo

Mtl Lourdes CahuichMtl Lourdes Cahuich 66

Tiempo de ejecuciónTiempo de ejecución

�� El primer aspecto a notar es que el tiempo El primer aspecto a notar es que el tiempo de ejecución no es una cantidad fija, al de ejecución no es una cantidad fija, al contrario, el tiempo de ejecución en casi contrario, el tiempo de ejecución en casi todos los programas depende de la todos los programas depende de la entrada específica proporcionada al entrada específica proporcionada al programa. programa.

Mtl Lourdes CahuichMtl Lourdes Cahuich 77

Tiempo de ejecuciónTiempo de ejecución

�� Los tiempos de ejecución pueden diferir Los tiempos de ejecución pueden diferir drásticamente. drásticamente.

�� Sin embargo, se acostumbra referir el Sin embargo, se acostumbra referir el tiempo de ejecución de un programa como tiempo de ejecución de un programa como una entrada de tamaño una entrada de tamaño nn, significando el , significando el peor tiempo posible de ejecución para peor tiempo posible de ejecución para todas esas entradas. todas esas entradas.

Mtl Lourdes CahuichMtl Lourdes Cahuich 88

Complejidad en el peor casoComplejidad en el peor caso

�� Esta medida es llamada Esta medida es llamada complejidad del complejidad del peor casopeor caso

�� De forma alternativa, podemos analizar el De forma alternativa, podemos analizar el promedio de tiempo que toma procesar promedio de tiempo que toma procesar una entrada de cierto tamaño, lo que es una entrada de cierto tamaño, lo que es llamado complejidad del caso promedio. llamado complejidad del caso promedio.

Mtl Lourdes CahuichMtl Lourdes Cahuich 99

ComplejidadComplejidad

�� Desafortunadamente, este último es más Desafortunadamente, este último es más difícil de tratar que el primero, por lo que difícil de tratar que el primero, por lo que nos enfocaremos en la complejidad del nos enfocaremos en la complejidad del peor casopeor caso

Mtl Lourdes CahuichMtl Lourdes Cahuich 1010

Problemas para medir el tiempoProblemas para medir el tiempo

�� Otro problema al medir el tiempo de Otro problema al medir el tiempo de ejecución es que éste obviamente ejecución es que éste obviamente depende mucho de la máquina usada depende mucho de la máquina usada para ejecutar el programa.para ejecutar el programa.

�� También, depende del compilador usado, También, depende del compilador usado, el nivel de optimización, la carga de la el nivel de optimización, la carga de la computadora, computadora, etcetc

Mtl Lourdes CahuichMtl Lourdes Cahuich 1111

Tiempo lógico de ejecuciónTiempo lógico de ejecución

�� Para evitar estas complicaciones, Para evitar estas complicaciones, podemos usar una medida diferente: podemos usar una medida diferente: tiempo de ejecución lógicotiempo de ejecución lógico, el cual es el , el cual es el número de pasos en la ejecución del número de pasos en la ejecución del algoritmo.algoritmo.

�� Por "un paso" nos referimos Por "un paso" nos referimos esencialmente a un ciclo de CPU esencialmente a un ciclo de CPU

Mtl Lourdes CahuichMtl Lourdes Cahuich 1212

Tiempo lógico de ejecuciónTiempo lógico de ejecución

�� El contar el número de pasos nos permite El contar el número de pasos nos permite tener una medida útil del tiempo de tener una medida útil del tiempo de ejecución. ejecución.

�� Sin embargo, si un algoritmo va a ser Sin embargo, si un algoritmo va a ser ejecutado en una computadora específica, ejecutado en una computadora específica, es todavía necesario desarrollar medidas es todavía necesario desarrollar medidas del tiempo de ejecución en unas cuantos del tiempo de ejecución en unas cuantos casos.casos.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1313

¿Cómo Determinar el Tiempo de ¿Cómo Determinar el Tiempo de Ejecución Lógico?Ejecución Lógico?

�� Es importante ignorar los pequeños Es importante ignorar los pequeños detalles y ver el comportamiento a grandetalles y ver el comportamiento a gran--escala escala

�� Usemos un ejemplo para explicar cómo Usemos un ejemplo para explicar cómo determinar el tiempo lógico de ejecucióndeterminar el tiempo lógico de ejecución

Mtl Lourdes CahuichMtl Lourdes Cahuich 1414

Determinar el tiempo lógicoDeterminar el tiempo lógico

�� Considera el algoritmo de ordenación por Considera el algoritmo de ordenación por selección.selección.

�� De este programa, De este programa, establecer las establecer las variables locales toma un número variables locales toma un número pequeño y constante de pasos pequeño y constante de pasos

Mtl Lourdes CahuichMtl Lourdes Cahuich 1515

Determinar el tiempo lógicoDeterminar el tiempo lógico

�� Si recuerdan el algoritmo de ordenamiento Si recuerdan el algoritmo de ordenamiento por selección, cada elemento se por selección, cada elemento se comparaba contra todos los demás y en comparaba contra todos los demás y en cada paso se ubica un elemento en la cada paso se ubica un elemento en la posición correspondienteposición correspondiente

Mtl Lourdes CahuichMtl Lourdes Cahuich 1616

Determinar el tiempo lógicoDeterminar el tiempo lógico

�� El cuerpo del bucle externo es ejecutado El cuerpo del bucle externo es ejecutado v.sizev.size() () -- 11 veces, donde veces, donde v.sizev.size()()es el número de elementos vector es el número de elementos vector

�� Definiremos aDefiniremos a nn como el número de como el número de elementos en el vector elementos en el vector

Mtl Lourdes CahuichMtl Lourdes Cahuich 1717

Determinar el tiempo lógicoDeterminar el tiempo lógico

�� Durante su primera ejecución, el bucle Durante su primera ejecución, el bucle interno itera (n interno itera (n -- 1) veces.1) veces.

�� Durante su segunda ejecución (cuando Durante su segunda ejecución (cuando iiiguala a 1), el bucle interno itera (n iguala a 1), el bucle interno itera (n -- 2) 2) veces. veces.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1818

Determinar el tiempo lógicoDeterminar el tiempo lógico

�� El cuerpo de este bucle interno contiene El cuerpo de este bucle interno contiene un estatutoun estatuto--ifif. .

�� Este estatuto puede ser ejecutado en una Este estatuto puede ser ejecutado en una cantidad constante de tiempo. cantidad constante de tiempo.

Mtl Lourdes CahuichMtl Lourdes Cahuich 1919

Determinar el tiempo lógicoDeterminar el tiempo lógico

�� Por lo tanto, tenemos la siguiente suma Por lo tanto, tenemos la siguiente suma que representa el número de operaciones que representa el número de operaciones desarrolladas usando ordenación por desarrolladas usando ordenación por selección. selección.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2020

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Cada término de esta suma representa el Cada término de esta suma representa el número de pasos desarrollados por cada número de pasos desarrollados por cada iteración del bucle externo.iteración del bucle externo.

�� (n (n -- 1) + (n 1) + (n -- 2) + (n 2) + (n -- 3) + ... + 3 + 2 + 1 3) + ... + 3 + 2 + 1

Mtl Lourdes CahuichMtl Lourdes Cahuich 2121

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� La suma de esta expresión iguala a La suma de esta expresión iguala a (n2 (n2 --n) / 2n) / 2. .

�� Resumiremos este resultado diciendo que Resumiremos este resultado diciendo que la ordenación por selección es un la ordenación por selección es un algoritmo cuadráticoalgoritmo cuadrático..

Mtl Lourdes CahuichMtl Lourdes Cahuich 2222

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Observa que cuadrático significa que al Observa que cuadrático significa que al duplicar el tamaño de la entrada resultará duplicar el tamaño de la entrada resultará en un incremento cuádruple en el tiempo en un incremento cuádruple en el tiempo de ejecución de ejecución

Mtl Lourdes CahuichMtl Lourdes Cahuich 2323

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Una entrada diez veces más grande Una entrada diez veces más grande tomará cien veces más en procesarse. tomará cien veces más en procesarse.

�� En otras palabras, los algoritmos En otras palabras, los algoritmos cuadráticos no escalan muy bien las cuadráticos no escalan muy bien las entradas grandes.entradas grandes.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2424

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Lo opuesto a los Lo opuesto a los algoritmos cuadráticosalgoritmos cuadráticosson los son los algoritmos logarítmicosalgoritmos logarítmicos. .

�� En los En los algoritmos logarítmicosalgoritmos logarítmicos, el número , el número de pasos requeridos para solucionar un de pasos requeridos para solucionar un problema no se incrementa de manera problema no se incrementa de manera significativa cuando el número de significativa cuando el número de entradas se incrementa dramáticamente. entradas se incrementa dramáticamente.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2525

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Un ejemplo de algoritmo logarítmico es Un ejemplo de algoritmo logarítmico es una búsqueda binaria.una búsqueda binaria.

�� En una búsqueda binaria, el número de En una búsqueda binaria, el número de elementos (la entrada) en donde se elementos (la entrada) en donde se realiza la búsqueda se reduce a la mitad realiza la búsqueda se reduce a la mitad en cada pasada. en cada pasada.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2626

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Esto permite que la búsqueda binaria Esto permite que la búsqueda binaria trabaje muy bien aún en conjuntos de trabaje muy bien aún en conjuntos de datos muy grandes.datos muy grandes.

Mtl Lourdes CahuichMtl Lourdes Cahuich 2727

Notación Notación BigBig--OhOh

�� La notación La notación BigBig--OhOh ofrece una buena ofrece una buena opción para comparar el tiempo de opción para comparar el tiempo de ejecución de los algoritmos. ejecución de los algoritmos.

�� En un análisis asintótico, usamos la En un análisis asintótico, usamos la notación notación BigBig--OhOh para referirnos al orden para referirnos al orden más alto, o término más dominante del más alto, o término más dominante del análisis del tiempo de ejecución de una análisis del tiempo de ejecución de una función función

Mtl Lourdes CahuichMtl Lourdes Cahuich 2828

BigBig OhOh (orden)(orden)

�� La propiedad más importante de la La propiedad más importante de la notación notación BigBig--OhOh es que nos permite es que nos permite ignorar términos y constantes de orden ignorar términos y constantes de orden bajo, como en el siguiente ejemplo.bajo, como en el siguiente ejemplo.

�� 500n500n33 + 10n+ 10n2 2 + 17n + 121345 = + 17n + 121345 = O(nO(n33) )

Mtl Lourdes CahuichMtl Lourdes Cahuich 2929

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� En el ejemplo anterior, el término de orden En el ejemplo anterior, el término de orden más alto en la ecuación del tiempo de más alto en la ecuación del tiempo de ejecución es 500nejecución es 500n33. .

�� Como lo hicimos con los términos de Como lo hicimos con los términos de orden bajo, también podemos ignorar la orden bajo, también podemos ignorar la constante en este término y establecer constante en este término y establecer que el tiempo de ejecución es que el tiempo de ejecución es O(nO(n33))..

Mtl Lourdes CahuichMtl Lourdes Cahuich 3030

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� La mayoría de los algoritmos que encontramos La mayoría de los algoritmos que encontramos caen en alguna de las siguientes clases.caen en alguna de las siguientes clases.�� O(1)O(1) –– tiempo constantetiempo constante

�� O(log(nO(log(n)))) –– tiempo logarítmicotiempo logarítmico

�� O(nO(n)) –– tiempo linealtiempo lineal

�� O(n log(n))O(n log(n)) –– tiempo "ntiempo "n--loglog--n" n"

�� O(nO(n22)) –– tiempo cuadráticotiempo cuadrático

�� O(nO(n33)) –– tiempo cúbicotiempo cúbico

�� O(2O(2nn)) –– tiempo exponencialtiempo exponencial

Mtl Lourdes CahuichMtl Lourdes Cahuich 3131

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Los algoritmos que tiene un tiempo de Los algoritmos que tiene un tiempo de ejecución arriba de ejecución arriba de O( n O( n log(nlog(n)))) escalan escalan muy bien a instancias de problemas muy bien a instancias de problemas grandes. grandes.

Mtl Lourdes CahuichMtl Lourdes Cahuich 3232

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Los algoritmos cuadráticos y más aún los Los algoritmos cuadráticos y más aún los algoritmos cúbicos, muestran un algoritmos cúbicos, muestran un desempeño muy degradado cuando la desempeño muy degradado cuando la entrada es grande.entrada es grande.

�� Por último, los algoritmos exponenciales Por último, los algoritmos exponenciales pueden ser usados solamente con pueden ser usados solamente con entradas muy pequeñas entradas muy pequeñas

Mtl Lourdes CahuichMtl Lourdes Cahuich 3333

Diferencias en los tiempos de los Diferencias en los tiempos de los algoritmosalgoritmos

�� Es importante expresar el tiempo de Es importante expresar el tiempo de ejecución lógico en términos del tiempo ejecución lógico en términos del tiempo físico, usando unidades familiares como físico, usando unidades familiares como segundos, minutos, horas, etc., para tener segundos, minutos, horas, etc., para tener una idea de lo que estas caracterizaciones una idea de lo que estas caracterizaciones realmente significan. realmente significan.

Mtl Lourdes CahuichMtl Lourdes Cahuich 3434

�� Primero, consideremos un algoritmo Primero, consideremos un algoritmo O(nO(nlog(nlog(n)))) que toma 1 segundo en una que toma 1 segundo en una entrada de tamaño 1000 entrada de tamaño 1000

6.48 horas107

33.3 minutos106

2.77 minutos100000

13.3 segundos10000

6.2 segundos5000

2.2 segundos2000

1 segundo1000

tiempo de ejecucióntamaño de la entrada

Mtl Lourdes CahuichMtl Lourdes Cahuich 3535

�� En comparación, aquí se muestra un En comparación, aquí se muestra un algoritmo cuadrático que también toma 1 algoritmo cuadrático que también toma 1 segundo en una entrada de tamaño 1000.segundo en una entrada de tamaño 1000.

3.25 años107

11.5 días106

2.77 horas100000

1.66 minutos10000

25 segundos5000

4 segundos2000

1 segundo1000

tiempo de ejecucióntamaño de la entrada

Mtl Lourdes CahuichMtl Lourdes Cahuich 3636

�� Imagina que un algoritmo exponencial Imagina que un algoritmo exponencial toma un segundo en una entrada de toma un segundo en una entrada de tamaño 10. tamaño 10.

�� Podemos esperar aproximadamente los Podemos esperar aproximadamente los siguientes tiempos de ejecución para siguientes tiempos de ejecución para instancias más grandes instancias más grandes

Mtl Lourdes CahuichMtl Lourdes Cahuich 3737

Ejecución exponencialEjecución exponencial

4.02 1019 años100

35700 años50

34.9 años40

1.09 años35

12.1 días30

9.1 horas25

17.1 minutos20

32 segundos15

1 segundo10

tiempo de ejecucióntamaño de la entrada

Mtl Lourdes CahuichMtl Lourdes Cahuich 3838

�� Desafortunadamente, existen algunos Desafortunadamente, existen algunos problemas computacionales famosos que problemas computacionales famosos que parecen requerir tiempos de ejecución parecen requerir tiempos de ejecución exponencialexponencial

�� Encontrar si un circuito Encontrar si un circuito booleanobooleano con n con n entradas puede producir siempre entradas puede producir siempre "verdadero" como resultado es uno de "verdadero" como resultado es uno de ellos: existen 2n combinaciones posibles ellos: existen 2n combinaciones posibles de entrada, y no se conocen atajos para de entrada, y no se conocen atajos para simplificar el cálculo. simplificar el cálculo.

¿Cómo determinamos el ¿Cómo determinamos el tiempo de ejecución asintótico tiempo de ejecución asintótico

de un algoritmo? de un algoritmo?

Mtl Lourdes CahuichMtl Lourdes Cahuich 4040

Determinar el tiempo en cada Determinar el tiempo en cada algoritmoalgoritmo

�� cualquier secuencia de estatutos básicos, cualquier secuencia de estatutos básicos, como 1)tareas de tipo incorporado ó 2) como 1)tareas de tipo incorporado ó 2) operaciones de tipo incorporado (suma, operaciones de tipo incorporado (suma, multiplicación, comparación, incremento, multiplicación, comparación, incremento, decremento, operaciones decremento, operaciones booleanasbooleanas, etc.), , etc.), toman tiempo constante (toman tiempo constante (O(1)O(1)).).

Mtl Lourdes CahuichMtl Lourdes Cahuich 4141

Determinar el tiempo en cada Determinar el tiempo en cada algoritmoalgoritmo

�� Las llamadas a la función tienen que ser Las llamadas a la función tienen que ser contabilizadas por separado. contabilizadas por separado.

�� Primero, está el costo de organizar la Primero, está el costo de organizar la llamada de la función. llamada de la función.

�� Si sólo se usan parámetros de referencia, Si sólo se usan parámetros de referencia, este costo es este costo es O(1)O(1). .

Mtl Lourdes CahuichMtl Lourdes Cahuich 4242

Determinar el tiempo en cada Determinar el tiempo en cada algoritmoalgoritmo

�� Pero, si se invocaPero, si se invoca--porpor--valor, tenemos que valor, tenemos que contar el costo de copiar la entrada. contar el costo de copiar la entrada.

�� El mismo comentario aplica para regresar El mismo comentario aplica para regresar el resultado del cálculo. el resultado del cálculo.

�� Y, por supuesto, tenemos que contar la Y, por supuesto, tenemos que contar la evaluación del cuerpo de la función evaluación del cuerpo de la función

Mtl Lourdes CahuichMtl Lourdes Cahuich 4343

Determinar el tiempo en cada Determinar el tiempo en cada algoritmoalgoritmo

�� Un bucleUn bucle--forfor toma el tiempo toma el tiempo t(0) + t(1) + ... t(0) + t(1) + ... + + t(nt(n--1)1) donde donde t(kt(k)) es el tiempo requerido es el tiempo requerido por el cuerpo del bucle cuando i iguala a por el cuerpo del bucle cuando i iguala a kk, en otras palabras, el tiempo requerido , en otras palabras, el tiempo requerido para completar la iteración para completar la iteración kk del bucledel bucle--forfor

for (for (intint i = 0; i < n; ++i)i = 0; i < n; ++i){{cuerpocuerpo

} }

Mtl Lourdes CahuichMtl Lourdes Cahuich 4444

Determinar el tiempo en cada Determinar el tiempo en cada algoritmoalgoritmo

�� Si el cuerpo se toma el tiempo Si el cuerpo se toma el tiempo O(1)O(1), el , el tiempo del bucle resulta en tiempo del bucle resulta en O(nO(n)). .

�� Pero, si el cuerpo se toma el tiempo Pero, si el cuerpo se toma el tiempo O(iO(i)), , obtenemos obtenemos O(nO(n22)) para el bucle completo. para el bucle completo.

�� Por último, si el cuerpo se toma el tiempo Por último, si el cuerpo se toma el tiempo O(iO(i22)) obtenemos obtenemos O(nO(n33)) para el bucle para el bucle completo completo

Mtl Lourdes CahuichMtl Lourdes Cahuich 4545

Determinar el tiempo en cada Determinar el tiempo en cada algoritmoalgoritmo

�� Otras estructuras de bucle pueden ser Otras estructuras de bucle pueden ser manejadas de la misma forma.manejadas de la misma forma.

�� Agrega el costo de cada ejecución Agrega el costo de cada ejecución individual del cuerpo del bucle, tomando individual del cuerpo del bucle, tomando en cuenta que este costo puede depender en cuenta que este costo puede depender de los valores de algunos parámetros del de los valores de algunos parámetros del bucle.bucle.