Tema 1.2 - Eficiencia Algorítmica
Comparación de Algoritmos
La calidad del algoritmo depende de
Eficiencia
Medida de los recursos que emplea un algoritmo en su ejecución.
Recursos Computacionales
- Tiempo (ejecución).
- Espacio (memoria).
- Nº procesadores.
Recursos No Computacionales
- Dificultad de implementación.
- Disponibilidad de bibliotecas.
Tiempo algorítmico
La comparación en tiempo depende de:
- Datos de entrada.
- Calidad del código generado por el compilador.
- Rapidez del procesador.
- Complejidad intrínseca del algoritmo.
Estudios sobre el tiempo
- Teórico (a priori): Función que acote el tiempo de ejecución para unos valores de los datos de entrada.
- Real (a posteriori): Tiempo de ejecución para una determinada entrada y en un ordenador concreto.
Principio de Invarianza
Definición
Dado un algoritmo y dos implementaciones e , que tardan y respectivamente, existe una constante real positiva y un natural tales que:
El tiempo de ejecución de dos implementaciones distintas no va a diferir más que en una constante multiplicativa.
Estudio real y teórico de un algoritmo
En el estudio real de un algoritmo se mide el tiempo de ejecución de este en una máquina
En el estudio teórico de un algoritmo se trata de estimar el comportamiento del algoritmo independientemente de la máquina que lo vaya a ejecutar
Complejidad algorítmica
La complejidad algorítmica ayuda a determinar la eficiencia de un algoritmo. Esta nos permite obtener medidas aproximadas, relativas al tamaño del problema. Este análisis es independiente de la máquina donde se ejecutará el problema
Tiempo empleado:
Dado un conjuto de datos de entrada , se dice que es el tiempo que se empleará para resolver el problema
⚠️ En este caso el tiempo no se mide en segundos sino en pasos o instrucciones
Ejemplo
Tomando como ejemplo un bucle tal que…for i=0 to 10: suma += i
Entonces podemos plantear que el número de instrucciones que se ejecutarán será . Siendo el número de veces que se ejecutará el bucle, en este caso . Y siendo una constante que representa el número de instrucciones que se ejecutan en cada iteración.
Medidas Asintóticas
Las medidas asintóticas nos permiten describir la complejidad de un algoritmo a base de definir unas clases de equivalencia las cuales crecen de la misma forma, dependiendo de la entrada, que los algoritmos que estamos estudiado
El concepto de asintótico se refiere a que el estudio de los algoritmos se realiza para estradas de datos suficientemente grandes
Notación (’o’ mayúscula)
Esta notación busca expresar la cota superior. Esto quiere decir que esta notación representa todas aquellas funciónes que crecen en complejidad como mucho tan rápido como nuestro algoritmo
Esta notación representa: El peor de los casos
El orden de complejidades es el siguiente…
💡 Siendo lo mejor y lo peor
Notación (Omega)
Esta notación busca expresar la cota inferiror. Esto quiere decir que esta notación representa todas aquellas funciónes que crecen en complejidad como mínimo tan rápido como nuestro algoritmo
Esta notación representa: El mejor de los casos
Notación (Theta)
Esta notación busca expresar el exacto de la función. Esto quiere decir que esta notación representa todas aquellas funciónes que crecen en complejidad tan rápido como nuestro algoritmo
Esta notación representa: El caso promedio
Cálculo de la Eficiencia
Sentencias simples (+,-,=,…)
Las instrucciones simples, como las lecturas, escrituras, asignación, …; Tienen una complejidad constante:
Bloques de sentencia (for/while)
Los bloques de sentencias, son aquellos que ejecutan una serie de sentencias simples. En este caso se aplica la regla del máximo, osea, se toma la complejidad mayor de todas las complejidades contenidas en el bloque de sentencias
Ejemplo:
Sentencias condicionales (if/else)
En el caso de las sentencias condicionales, se tomará la complejidad mayor de los dos bloques
Funciones
La complejidad de una función equivale a la complejidad del código que ejecuta. Podemos entender una función como un bloque de código
Recursividad
La complejidad de una función recursiva se puede medir usado uno de los siguiente métodos:
- Método de sustitución
- Árbol de recursividad
- Expansión de recurrencias
- Ecuación característica
Divide y Vencerás
Siendo…
- → Sub-problemas generados
- → Divisor del problema
- → Complejidad del método de combinación