Está en la página 1de 38

Semana 2:

Análisis de Complejidad

Semestre 1 - 2024
Análisis de Algoritmos y Estructura de Datos
Multidisciplina
Departamento de Ingeniería Informática
U1 S2 1
Objetivo

• Aplicar conceptos de Tiempo de ejecución y Complejidad


algorítmica para evaluar algoritmos.
• Describir conceptos de Complejidad algorítmica y mecanismos de
cálculo para evaluar algoritmos iterativos

2
Contenido

• Eficacia vs Eficiencia de un algoritmo


• Conteo de Instrucciones
• Análisis de Complejidad
• Complejidad de algoritmos iterativos

3
Contexto

Implementación
Solución 1 Pseudocódigo 1
1

Implementación
Solución 2 Pseudocódigo 2
2

Implementación
Solución 3 Pseudocódigo 3
3

4
Eficiencia de un algoritmo

• Hay dos características que debemos siempre


considerar al construir algoritmos
• Eficacia
• RAE: “Capacidad de lograr el efecto que se desea o se espera.”
• El algoritmo hace correctamente lo que debe hacer

• Eficiencia
• RAE:
“Capacidad de disponer de alguien o de algo para conseguir un
efecto determinado”
• El algoritmo usa la menor cantidad de recursos para cumplir
con su tarea
¿Por qué estudiar algoritmos
eficientes?
• El tiempo de ejecución y el espacio en memoria son recursos
limitados.

Arquitectura avanzada

Hardware rápido Interfaces gráficas de


Rendimiento de usuario simples, fáciles e
una aplicación intuitivas
Redes rápidas

Algoritmos eficientes
Eficiencia de un algoritmo

• ¿Cómo se puede medir la eficiencia de un algoritmo?


• Tiempo
• Número de instrucciones
• Cantidad de memoria usada
• “Dificultad de un conjunto de instrucciones”
• ¿Es el tiempo una buena medida para medir la eficiencia de un
algoritmo? ¿Qué factores influyen en este tiempo?
Eficiencia de un algoritmo
¿Se pueden comparar?

• Dados dos algoritmos A y B que resuelven un mismo problema


• Ambos son eficaces
• Los algoritmos fueron ejecutados en dos máquinas distintas y A fue más rápido que
B.
• Los algoritmos fueron ejecutados en la misma máquina y A (en C) fue más rápido
que B (en JAVA)
• Los algoritmos fueron ejecutados en la misma máquina y en el mismo lenguaje, pero
por dos programadores distintos, y A fue más rápido que B
• Los algoritmos fueron ejecutados en la misma máquina, en el mismo lenguaje, por el
mismo programador, pero usando dos compiladores distintos y A fue más rápido
que B.
• Todo lo anterior igual (máquina, lenguaje, programador, compilador, etc, etc, etc)
pero usando dos instancias del problema distintas, y A fue más rápido que B.
Complejidad

• Se entiende como la cantidad de recursos necesarios para ejecutar un


algoritmo
• Tiempo (pasos): Time complexity
• Memoria: Space complexity
• Buscamos medir cómo crece el tiempo de ejecución del algoritmo con
respecto a alguna variable de entrada del algoritmo. Normalmente es
expresada como una función en términos del tamaño de la entrada n ->
f(n).
• Se representa al “tiempo” de un algoritmo en términos de T(n)
• T(n) -> número de pasos a ser ejecutados en un computador ideal.
• Finalmente acotamos de manera superior entontrando el orden-> O(n)
Contando instrucciones

• Instrucción básica:
• instrucción cuyo tiempo de ejecución está acotado superiormente por una
constante.

10
Modelo de máquina

• RAM (“Random Access Machine”)

11
Modelo de máquina

• Cada instrucción básica o simple requiere exactamente un paso de tiempo.


• Asignación: ←
• Aritméticas: +, -, *, /, //, MOD
• Lógicas: AND, OR, NOT
• Comparación: >, <, >=, <=, =, <>
• Input/Output: READ(), WRITE() y RETURN

• Los ciclos y subrutinas no se consideran operaciones simples. Son la composición de


muchas operaciones de un solo paso. El tiempo que toma ejecutar un ciclo o ejecutar
una subrutina depende del número de iteraciones de ciclo o la naturaleza específica
del subprograma.

• Cada acceso a memoria toma exactamente un paso de tiempo. Además, se dispone de


tanta memoria como se necesite. El modelo no diferencia entre la caché o el disco.

12
Una definición más formal

• Para un algoritmo dado, la complejidad de tiempo queda determinada por el


tiempo de ejecución de cada instrucción básica y el número de veces que se
ejecuta esa instrucción. Sea:

A un algoritmo para resolver un problema dado,


𝐼 , … , 𝐼 secuencia de instrucciones básicas del algoritmo A,
𝑡 : tiempo de ejecución de la instrucción, 𝐼 1 ≤ 𝑗 ≤ 𝑘
𝑓 : número de veces que se ejecuta, 𝐼 1 ≤ 𝑗 ≤ 𝑘

13
Una definición más formal

• Luego, la complejidad de tiempo del algoritmo A es:

𝑇(𝑛) = 𝑓 ∗𝑡

• Como todas las instrucciones básicas requieren un tiempo constante, se puede


suponer que esos tiempos son iguales, es decir:

14
Ejemplo 1: intercambio

• Algoritmo: Dadas dos variables a, b intercambia su contenido

intercambio(NUM a, NUM b)
NUM temporal ← a
a ← b
b ← temporal

Complejidad: 𝑇(𝑛) = 1 + 1 + 1 = 3

15
Ejemplo 2: conversión

• Algoritmo: convierte días a segundos

dias_segundos(NUM dias): NUM


NUM segundos ← dias * 24 * 3600
RETURN segundos

Complejidad:𝑇(𝑛) = 3 + 1 = 4

16
Ejemplo 3: paridad

• Algoritmo: determina la paridad de un número

paridad(NUM n): NUM


NUM par ← 0
IF (n MOD 2) = 0 THEN
par ← 1
RETURN par

Complejidad:𝑇(𝑛) = 1 + 2 + 1 + 1 = 5

17
Ejemplo 4: mayor
• Algoritmo: determina el mayor de tres números

mayor(NUM a, NUM b, NUM c): NUM


NUM mayor
IF a >= b AND a >= c THEN
mayor ← a
ELSE
IF b >= c THEN
mayor ← b
ELSE
mayor ← c
RETURN mayor

Complejidad:𝑇(𝑛) = 3 + 1 + 1 + 1 = 6

18
Ejemplo 5: suma de elementos

• Algoritmo: Dada una colección lineal de números A, suma sus n elementos

suma_elementos(NUM A[n]): NUM


NUM suma ← 0
FOR i ← 1 TO n
suma ← suma + A[i]
RETURN suma

Complejidad:𝑇(𝑛) = 1 + 3(𝑛 + 1) + 2𝑛 + 1 = 5𝑛 + 5

19
Ejemplo 6: suma de elementos (otra
versión)

• Algoritmo: Dada una colección lineal de números A, suma sus n elementos

suma_elementos(NUM A[n]): NUM


NUM suma ← 0
i ← 1
WHILE i <= n DO
suma ← suma + A[i]
i ← i + 1
RETURN suma

Complejidad:𝑇(𝑛) = 2 + (𝑛 + 1) + 4𝑛 + 1 = 5𝑛 + 4

20
Ejemplo 7: suma de matrices

• Algoritmo: Dadas A, B ∈ 𝑀( × ) calcula 𝐶 = 𝐵 + 𝐴

suma_matrices(NUM A[m][n], NUM B[m][n]): NUM [][]


NUM C[m][n]
FOR i ← 1 TO m
FOR j ← 1 TO n
C[i][j] ← A[i][j] + B[i][j]
RETURN C

Complejidad: 𝑇(𝑛) = 5𝑚𝑛 + 6𝑚 + 4


si m = n entonces𝑇(𝑛) = 5𝑛 + 6𝑛 + 4

21
Ejemplo 8: suma de elementos pares

• Algoritmo: Dada una colección lineal A, suma los elementos pares A

suma_pares(NUM A[n]): NUM


NUM suma ← 0
FOR i ← 1 TO n
IF (A[i] MOD 2) = 0 THEN
suma ← suma + A[i]
RETURN suma

Complejidad:𝑇(𝑛) = 1 + 3(𝑛 + 1) + 4𝑛 + 1 = 7𝑛 + 5

22
Problema propuesto nro. 1

• Suponga que tiene una colección lineal de enteros positivos.

• Escriba un algoritmo para calcular la colección lineal productoria


de . En una colección lineal productoria el elemento i es el
producto de todos los enteros en excepto i .

• Calcule la complejidad de tiempo del algoritmo propuesto.

23
Orden de complejidad - Notación O

• Simplifica el análisis al ignorar los


niveles de detalle que no afectan la
comparación de algoritmos.

• Dadas y , se
dice que es de orden
si
existen constantes tales que

24
Notación O

• 𝑓 𝑛 = 2𝑛 + 2~𝑂 𝑛 , 𝑝𝑜𝑟𝑞𝑢𝑒 𝑐𝑜𝑛 𝑐 = 4 𝑦 𝑛 = 1, 2𝑛 + 2 ≤ 4𝑛 𝑝𝑎𝑟𝑎 𝑛 ≥ 1

25
Propiedades de las asintóticas

1. Regal de la suma
2. Constantes multiplicativas
3. Regla de la multiplicación
4. Cotas
5. ) Transitividad

26
Ejemplo 9: factorial

• Algoritmo: Dado n ∈ ℕ calcular 𝑛!

calcula_factorial(NUM n): NUM


NUM factorial ← 1
WHILE n >= 1 DO
factorial ← factorial * n
n ← n - 1
RETURN factorial

Complejidad:𝑇 𝑛 = 5𝑛 + 3 ~ 𝑂 𝑛 + 𝑂 1 ~ 𝑂 𝑛

27
Ejemplo 10: suma de matrices

• Algoritmo: Dadas A, B ∈ 𝑀( × ) calcula 𝐶 = 𝐵 + 𝐴

suma_matrices(NUM A[m][n], NUM B[m][n]): NUM [][]


NUM C[m][n]
FOR i ← 1 TO m
FOR j ← 1 TO n
C[i][j] ← A[i][j] + B[i][j]
RETURN C

Complejidad: 𝑇(𝑛) = 5𝑚𝑛 + 6𝑚 + 4


si m = n entonces𝑇 𝑛 = 5𝑛 + 6𝑛 + 4~
𝑂 𝑛 + 𝑂 𝑛 + 𝑂 1 ~𝑂 𝑛

28
Ejemplo 11: multiplicación de matrices

• Algoritmo: Dadas A ∈ 𝑀 × y B ∈ 𝑀( × ) calcula 𝐶 = 𝐴B


multiplica_matrices(NUM A[m][n], NUM B[n][p]): NUM [][]
NUM C[m][p]
FOR i ← 1 TO m
FOR j ← 1 TO p
C[i][j] ← 0
FOR k ← 1 TO n
C[i][j] ← C[i][j] + A[i][k] * B[k][j]
RETURN C

Complejidad:
si 𝑛 ≥ 𝑚, 𝑝 entonces: 𝑇 𝑛 = 6𝑛 + 7𝑛 + 6𝑛 + 3 ~
𝑂 𝑛 + 𝑂 𝑛 + 𝑂 𝑛 + 𝑂 1 ~𝑂 𝑛

29
Ejemplo 12: múltiples mensajes

• Problema: ¿Cuántas veces se muestra el mensaje? Para el cálculo considere WRITE()


una instrucción básica.

muestra_mensaje(CHAR mensaje[m], NUM n)


i ← 1
WHILE i <= n DO
WRITE(mensaje)
i ← i * 2

Complejidad:𝑇 𝑛 = 1 + 𝑙𝑜𝑔 𝑛 ~𝑂 1 + 𝑂 𝑙𝑜𝑔 𝑛 ~𝑂 𝑙𝑜𝑔 𝑛

30
Ejemplo 13: múltiples mensajes

• Problema: ¿Cuántas veces se muestra el mensaje? Para el cálculo considere WRITE()


una instrucción básica.

muestra_mensaje(CHAR mensaje[m], NUM n)


FOR i ← 1 TO n
FOR j ← 1 TO i
WRITE(mensaje)

Complejidad: 𝑇 𝑛 = ~𝑂 𝑛

31
Ejemplo 14: múltiples mensajes
• Problema: ¿Cuántas veces se muestra el mensaje? Para el cálculo considere WRITE()
una instrucción básica.

muestra_mensaje(CHAR mensaje[m], NUM n)


NUM i ← 0
NUM p ← 0
WHILE P <= n DO
i ← i + 1
p ← p + i
WRITE(mensaje)

Para de iterar con p > n en la k-ésima iteración


~𝑘 > 𝑛 𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠 𝑘 > 𝑛 → 𝑇 𝑛 = 𝑛 ~ 𝑂 𝑛

32
Tipos de orden de complejidad
• O(f(n))
La función de O() nos indicará qué tan bueno es un algoritmo para distintas
entradas de datos
Ecuación Orden Tipo
T(n)=c O(1) Constante
T(n)=c log2 n O(log2 n) Orden logarítmico
T(n)=c n O(n) Orden lineal
T(n)=c n2 O(n2) Orden cuadrático
T(n)=c n3 O(n3) Orden cúbico
T(n)=c 2n O(2n) Orden exponencial
T(n)=c n! O(n!) Orden factorial
33
Análisis de algoritmos
Complejidad de algoritmos
iterativos
• Se debe conocer el tiempo de ejecución teórico de cada instrucción
(modelo RAM teórico)
• Anotar la suma de todos los tiempos
• Resolver y acotar la función
• Identificar n0, k y f(n)
• O(f(n))

35
Problema propuesto nro. 2

• Un elemento de mayoría en una colección lineal A de tamaño n es un


elemento que aparece más de n/2 veces, por lo tanto, a lo más hay uno
de esos elementos en una colección lineal.
• Por ejemplo, en la colección lineal [3 3 4 2 4 4 2 4 4] el 4 es el elemento
de mayoría, mientras que en la colección [3 3 4 2 4 4 2 4] no existe un
elemento de mayoría.
• Escriba un algoritmo, en pseudocódigo, para encontrar un elemento de
mayoría en una colección lineal.
• No se puede utilizar una colección lineal auxiliar. Calcular la complejidad
de tiempo del algoritmo propuesto T(n) y el orden de complejidad O(n).

36
• Clase de refuerzo:
Próximas Fechas Miércoles
• Clase de Laboratorio :
Libre

I A

E1 A

U1 - S1

• Resumen semanal: • Próxima semana:


• Conceptos de eficiencia algorítmica y • Métodos de ordenamiento
análisis de algoritmos L4
• Formalización de conceptos de
complejidad algorítmica
• Cálculo de complejidad 37
Consultas

38

También podría gustarte