Flujo potencial, conceptos básicos y ejemplos resueltos.
05 - Analisis de Algoritmos.pptx
1. Análisis de Algoritmos
Universidad de San Carlos de Guatemala
Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Estructuras de Datos
Secciones: A, B y C
Guatemala, agosto 2019
2. Recordando …
• Algoritmo
Un conjunto de instrucciones que resuelven un problema especifico a
partir de entradas concretas.
• Seudocódigo
Representación de algoritmos en lenguaje natural (ej. Español) y otra
parte en código estructurado.
• Programa
Representación concreta de un algoritmo en un lenguaje de
programación que es ejecutado por una computadora.
3. Necesidad
• Varias soluciones para el mismo problema.
• Tiempo de ejecución.
• Memoria utilizada.
• Buscar la eficacia y la eficiencia.
4. 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.
Idealmente un programa debe de cumplir con ambas características.
5. Dificultades en medir la eficiencia
• Existen diferentes métodos con los que se trata de medir la eficiencia
de los algoritmos (cantidad de operaciones, tiempo, memoria,
energía, datos transferidos, etc.).
• En la practica también se toma en cuenta el tipo de Hardware, el
compilador, opciones de la compilación e incluso el lenguaje de
programación utilizado.
6. Algoritmia
• Estudio sistemático de las técnicas fundamentales utilizadas para
diseñar y analizar algoritmos eficientes.
• El estudio en la eficiencia de los algoritmos se centra,
fundamentalmente, en el análisis de la ejecución de bucles.
7. Eficiencia en Memoria (Complejidad espacial)
• Enfocada a la cantidad de memoria (RAM) que es utilizada por un
programa cuando se ejecuta.
• Consideraciones:
• Memoria requerida por el código del algoritmo
• Memoria requerida para almacenar datos de entrada
• Memoria requerida para almacenar datos de salida
• Memoria requerida para cálculos y asignaciones de datos
8. Eficiencia en tiempo (Complejidad temporal)
• Enfocada a la cantidad de tiempo de ejecución de algoritmo.
• El resultado es generalmente representado utilizado la notación O
grande.
• Generalmente se utilizan puntos de comparación para medir el
tiempo de un algoritmo. Comparación de algoritmos.
9. Formato general de la eficiencia
• En general, el formato se puede expresar mediante una función:
𝑓 𝑛 = 𝑒𝑓𝑖𝑐𝑖𝑒𝑛𝑐𝑖𝑎
• Es decir, la eficiencia del algoritmo se examina como una función del
número de elementos que tienen que ser procesados.
10. Bucles Lineales
• En los bucles se repiten las sentencias del cuerpo del bucle un
número determinado de veces, que determina la eficiencia del
mismo. Normalmente, en los algoritmos los bucles son el término
dominante en cuanto a la eficiencia del mismo.
11. Bucles Lineales – Ejemplo 1
¿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:
𝒇 𝒏 = 𝒏
12. 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:
𝒇 𝒏 = 𝒏
𝟐
13. 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
mientras (i < 1000)
código de aplicación
i = i * 2
fin_mientras
i = 1000
mientras (i > 1)
código de aplicación
i = i / 2
fin_mientras
15. 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 2𝑖𝑡𝑒𝑟𝑎𝑐𝑖𝑜𝑛𝑒𝑠 < 1000
• Bucle dividir 1000
2𝑖𝑡𝑒𝑟𝑎𝑐𝑖𝑜𝑛𝑒𝑠 ≥ 1
Generalizando el análisis, se puede decir que las iteraciones de los bucles
especificados se determinan por la siguiente fórmula:
𝒇 𝒏 = 𝐥𝐨𝐠𝟐 𝒏
16. Bucles Anidados
• En el caso de bucles anidados, se determinan cuántas iteraciones
contiene cada bucle. El total es entonces el producto del número de
iteraciones del bucle interno y el número de iteraciones del bucle
externo.
• Existen tres tipos de bucles anidados: lineal logarítmico, cuadrático
dependiente y cuadrático.
Lineal Logarítmica
Dependiente
Cuadrática
Cuadrática
𝑓 𝑛 = 𝑛 log2 𝑛 𝑓 𝑛 =
𝑛(𝑛 + 1)
2
𝑓 𝑛 = 𝑛2
17. Análisis de Tiempo
Tiempo de ejecución lineal de una función que calcula una serie de n términos.
double serie(double x, int n)
{
double s;
int i;
s = 0.0; // tiempo t1
for (i = 1; i <= n; i++) // tiempo t2
{
s += i * x; // tiempo t3
}
return s; // tiempo t4
}
La función T(n) del método es: 𝑻 𝒏 = 𝒕𝟏 + 𝒏 ∗ 𝒕𝟐 + 𝒏 ∗ 𝒕𝟑 + 𝒕𝟒
18. Análisis 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))
19. 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.
20. Independencia del entorno
Si una función, por iteración, se tarda un tiempo X en una computadora
(Laptop) y un tiempo Y en otra computadora (Servidor), la complejidad
del algoritmo no cambia. Simplemente esta cambiando el entorno
(velocidad de CPU, Lenguaje) de ejecución (c).
O(n) * c
21. Cuando Utilizarla
• Dispositivos con poca memoria.
• Aplicaciones con grandes entradas de datos. ¡Escalabilidad!
• Aplicaciones con eficiencia critica. ¡Velocidad!
• Aplicaciones en tiempo real. ¡Velocidad!
¡¡¡Siempre!!!
22. Ó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
23. 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
24. 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.
Ejemplos:
• Búsqueda binaria
• Encontrar menor/mayor elemento en un árbol binario de búsqueda
• Algunos algoritmos Divide y Vencerás
Elementos Tiempo
1 1 segundo
10 2 segundos
100 3 segundos
1000 4 segundos
10000 5 segundos
25. O(n) Orden Lineal
Si se incrementa la cantidad de elementos el tiempo incrementa de forma proporcional.
Ejemplos:
• Recorrer un arreglo o lista enlazada
• Búsqueda lineal
• Comparar dos cadenas
Elementos Tiempo
1 1 segundo
10 10 segundos
100 100 segundos
26. O(n log n) Orden lineal logarítmica
Es una combinación de las anteriores. Común en algoritmitos de búsqueda.
Ejemplos:
• Merge Sort
• Heap Sort
• Quick Sort
Elementos Tiempo
1 1 segundo
10 20 segundos
100 300 segundos
27. O(n log n) Orden lineal logarítmica
Es una combinación de las anteriores. Común en algoritmitos de búsqueda.
Ejemplos:
• Merge Sort
• Heap Sort
• Quick Sort
Elementos Tiempo
1 1 segundo
10 20 segundos
100 300 segundos
28. 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.
Ejemplos:
• Bubble sort
• Selection sort
• Iterar un arreglo de 2 dimensiones
Elementos Tiempo
1 1 segundo
10 100 segundos
100 1000 segundos
30. 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.
31. Ejemplo de Análisis
a=5 //Constante = 1
b=6 //Constante = 1
c=10 //Constante = 1
for i in range(n): //Bucle hasta n
for j in range(n): //Bucle anidado hasta n
x = i * i //Constante = 1
y = j * j //Constante = 1
z = i * j //Constante = 1
for k in range(n): // Bucle hasta n
w = a*k + 45 //Constante = 1
v = b*b //Constante = 1
d = 33 //Constante = 1
T(n) = 3 + 3n^2 + 2n + 1
T(n) = 3n^2 + 2n + 4
Se eliminan las constantes y se toma el
elementó con el coeficiente mas grande.
f(n) = n^2
Simplemente, O(n^2)
El orden o la complexidad del algoritmo es
cuadrático.
34. Tarea 5 – Lista de Actividades
• Agregar la siguiente funcionalidad:
• Leer un archivo CSV, que corresponde a la lista de actividades. El archivo debe
de tener cabecera. Los valores nulos serán representados por una X.
• Graficar la lista de actividades utilizando Graphviz.
• Desarrollar en C++.
• Utilizarse Docker para ejecutar el programa.
Fecha de entrega: Martes 3 de septiembre
Método de entrega: Classroom. Enviar enlace del Commit o del repositorio de GitHub.
Solo se toma en cuenta los elementos con la potencia mas grande, debido a que cuando se n tiende a infinito el elemento con la mayor potencia predomina.
https://runestone.academy/runestone/static/pythoned/AlgorithmAnalysis/NotacionOGrande.html