Está en la página 1de 35

Universidad de San Carlos de Guatemala

Facultad de Ingeniería
Escuela de Ciencias y Sistemas
Estructuras de Datos
Secciones: B

Análisis de Algoritmos
Análisis de rendimiento de algoritmos

Guatemala, agosto 2021


Análisis de algoritmos
Es el proceso de encontrar la complejidad computacional de un
algoritmo en orden de la cantidad de recursos que este puede llegar a
utilizar.
Diferentes entradas de la misma longitud pueden llegar a provocar
comportamientos distintos en los algoritmos, entonces es necesario
medir el peor, promedio y el peor de los casos.
Generalmente se utiliza el análisis asintótico (análisis de limites) ya que
este es independiente del entorno.
¿Por que es necesario analizar los algoritmos?

Varias soluciones para el mismo problema

Logar el mejor tiempo de ejecución

Buscar el menor uso de recursos

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.

Idealmente un programa debe de cumplir con ambas características.


Varios métodos:

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)

• 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
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.
Formato general de la eficiencia

La complejidad de un algoritmo depende de la cantidad de datos de


entrada. Por lo tanto, en forma general, el formato se puede expresar
mediante una función:, donde n es la cantidad de elementos que un
algoritmo va a procesar.

Es decir, la eficiencia del algoritmo se examina como una función del


número de elementos que tienen que ser procesados.
Análisis de Tiempos
Tiempo de ejecución lineal de una función que calcula una serie de n
términos de tiempo.
double serie(double x, int n)
{
double s;
int i;
s = 0.0; // tiempo t1
for (i = 1; i <= n; i++) // tiempo t2
{
s = s + i * x; // tiempo t3 * n
}
return s; // tiempo t4
}

La función T(n) del método es:


Los bucles
determinan la
Cuando analizamos
algoritmos debemos prestar
atención a los bucles ya que

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

Generalizando el análisis, se puede decir que las iteraciones de los bucles


especificados se determinan por la siguiente fórmula:
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.
• Tipos comunes de bucles anidados: lineal logarítmico, cuadrático
dependiente y cuadrático.

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

Si una función, por iteración, se tarda un tiempo X en una computadora


y un tiempo Y en otra computadora, la complejidad del algoritmo no
cambia. Simplemente esta cambiando el entorno de ejecución
(velocidad de CPU, Lenguaje) que puede ser denotado por una
constante.

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

100 100 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

100 300 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

100 1000 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!

También podría gustarte