Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Estructuras de Datos
Secciones: B
Análisis de Algoritmos
Análisis de rendimiento de algoritmos
Buscar la eficiencia
Eficacia y eficiencia
• Eficacia
Lograr que el algoritmo logre realizar la tarea especificada.
• Eficiencia
Hacer un buen uso de los recursos para resolver un algoritmo. Alcanzar
una solución en el menor tiempo posible utilizando la menor cantidad
de recursos físicos. Factor Espacio-Tiempo.
Dificultade
Existen diferentes métodos con los que se
trata de medir la eficiencia de los algoritmos
(cantidad de operaciones, tiempo, memoria,
s en medir energía, datos transferidos, espacio, etc.)
la Hardware:
En la practica también se toma en cuenta el
eficiencia tipo de Hardware, el compilador, opciones
de la compilación e incluso el lenguaje de
programación utilizado.
Generalmente las
métricas utilizadas en el
análisis de algoritmos son
la cantidad de tiempo y
memoria RAM utilizados
por un algoritmo.
Eficiencia en Memoria (Complejidad
espacial)
complejidad de
generalmente estos
determinan la complejidad
del algoritmo
un algoritmo
Bucles Lineales
En los bucles lineales son los que su variable de control aumenta o decrece
con una suma o resta .
¿Cuántas veces se repite el cuerpo del bucle en el siguiente código?
i = 1
iterar (i <= n)
código de la aplicación
i = i + 1
fin_iterar
Respuesta: Si n es un entero, por ejemplo, de valor 100, la respuesta es 100 veces. El número de iteraciones es
directamente proporcional al factor del bucle, n. Como la eficiencia es directamente proporcional al número de
iteraciones, la función que expresa la eficiencia es:
Bucles Lineales – Ejemplo 2
¿Cuántas veces se repite el cuerpo del bucle en el siguiente código?
i = 1
iterar (i <= n)
código de la aplicación
i = i + 2
fin_iterar
Respuesta: La respuesta no siempre es tan evidente como en el ejercicio anterior. Ahora el contador i avanza de
2 en 2, por lo que la respuesta es n/2. En este caso, el factor de eficiencia es:
Bucles Logarítmicos
Consideremos un bucle en el que su variable de control se multiplique o se divida dentro de dicho bucle.
¿Cuántas veces se repetirá el cuerpo del bucle en los siguientes segmentos de programa?
i = 1 i = 1000
mientras (i < 1000) mientras (i > 1)
código de aplicación código de aplicación
i = i * 2 i = i / 2
fin_mientras fin_mientras
Bucles Logarítmicos
En ambos bucles se ejecutan 10 iteraciones. La razón es que, en cada
iteración, el valor de i se dobla en el bucle de multiplicar y se divide por la
mitad en el bucle de división. Por consiguiente, el número de iteraciones es
una función del multiplicador o divisor, en este caso 2.
• Bucle multiplicar
• Bucle dividir
Dependiente
Lineal Logarítmica Cuadrática
Cuadrática
Análisis
asintótico de
Evalúa los limites de una
función de forma
independiente del entorno
Algoritmos
Análisis asintótico de Algoritmos
• Notación O-Grande
• Peor de los casos. O(g(x))
• El mas utilizado debido a que indica la complejidad mas alta de algoritmo.
• Notación Ω-Grande.
• El mejor de los casos. Ω(g(x))
• Notación Θ-Grande
• El promedio de los casos. Θ(g(x))
f(x)=O(g(x))
Notación O-Grande (Cota superior asintótica)
• Indica la cota superior de una función.
• Simula el limite máximo de entradas de una función.
• Intentar determinar el peor de los casos de una función.
• Utilizado para medir complexidad de una función en términos de tiempo o
memoria.
• Los análisis de realizan cuando n (cantidad de elementos) tiende a infinito.
• Basado únicamente en la cantidad de elementos de entrada y los que
opera la función.
• Independiente del entrono (hardware o software) donde se ejecute.
Independencia del entorno
O(n) * c
Cuando Utilizarla
• Dispositivos con poca memoria.
• Aplicaciones con grandes entradas de datos. ¡Escalabilidad!
• Aplicaciones con eficiencia critica. ¡Velocidad!
• Aplicaciones en tiempo real. ¡Velocidad!
¡¡¡Siempre!!!
Órdenes comunes para la notación O-grande
Notación Nombre
O(1) orden constante
O(log log n) orden sublogarítmica
O(log n) orden logarítmica
O(n) orden lineal o de primer orden
O(n · log n) orden lineal logarítmica
O(n2) orden cuadrática o de segundo orden
O(n3), ... orden cúbica o de tercer orden, ...
O(nc) orden potencial fija
O(cn), n > 1 orden exponencial
O(n!) orden factorial
O(nn) orden potencial exponencial
O(1) Orden Constante
Significa que la cantidad de datos es irrelevante para el algoritmo, siempre va a
tardar el mismo tiempo en terminar. Lamentablemente es difícil que un algoritmo
no trivial caiga en esta categoría.
Elementos Tiempo
1 k segundos
10 k segundos
100 k segundos
Ejemplos:
• Acceder al elemento de un arreglo
• Insertar en elemento en una lista enlazada
• Añadir o sacar un elemento de una pila
O(log n) Orden Logarítmico
En este caso el tiempo incrementa conforme aumenta el número de elementos, pero de forma
logarítmica por lo que para grandes cantidades de datos el tiempo es relativamente corto.
Elementos Tiempo
1 1 segundo
10 2 segundos
100 3 segundos
1000 4 segundos
10000 5 segundos
Ejemplos:
• Búsqueda binaria
• Encontrar menor/mayor elemento en un árbol binario de búsqueda
• Algunos algoritmos Divide y Vencerás
O(n) Orden Lineal
Si se incrementa la cantidad de elementos el tiempo incrementa de forma proporcional.
Elementos Tiempo
1 1 segundo
10 10 segundos
Ejemplos:
• Recorrer un arreglo o lista enlazada
• Búsqueda lineal
• Comparar dos cadenas
O(n log n) Orden lineal logarítmica
Es una combinación de las anteriores. Común en algoritmitos de búsqueda.
Elementos Tiempo
1 1 segundo
10 20 segundos
Ejemplos:
• Merge Sort
• Heap Sort
• Quick Sort
O(n^2) Orden Cuadrático
La cantidad de tiempo que tarda el algoritmo comienza a dispararse, no es muy eficiente con una
gran cantidad de datos.
Elementos Tiempo
1 1 segundo
10 100 segundos
Ejemplos:
• Bubble sort
• Selection sort
• Iterar un arreglo de 2 dimensiones
Cuadro de Complejidad O-grande
Análisis de Algoritmos. Notación O-Grande
• El análisis se realiza por función.
• Las asignaciones, operaciones de aritméticas y operaciones lógicas son
consideradas de Orden constante O(1).
• Los bucles generar la complejidad de los algoritmos.
• Si existen bucles anidados, se multiplica la complejidad del bucle interno por
la del bucle externo.
• Cada instrucción de la función es tomada en cuenta. Se obvian los
comentarios.
• f(n) esta compuesta de la sumatoria de todos los tiempos de cada instrucción.
• Solo se toma en cuenta los elementos con la potencia mas grande.
Ejemplo de Análisis
a=5 //Constante = 1 T(n) = 3 + 3n^2 + 2n + 1
b=6 //Constante = 1 T(n) = 3n^2 + 2n + 4
c=10 //Constante = 1 T(n) = n^2 + n
for i in range(n): //Bucle hasta n T(n) = n^2
for j in range(n): //Bucle anidado hasta n
x = i * i //Constante = 1 Se eliminan las constantes y se toma el
y = j * j //Constante = 1 elementó con el coeficiente mas grande.
z = i * j //Constante = 1
f(n) = n^2
for k in range(n): // Bucle hasta n
Simplemente, O(n^2)
w = a*k + 45 //Constante = 1
v = b*b //Constante = 1
El orden o la complexidad del algoritmo es
d = 33 //Constante = 1
cuadrático.
Complejidad de estructuras de datos comunes
Complejidad de algoritmos de búsqueda
HT2 – Análisis de Algoritmos
Calcular la complejidad temporal del siguiente algoritmo
utilizando notación O Grande.
¡Muchas Gracias!