BEng & M.Sc. Sebastian David Ariza Coll
Un algoritmo es un conjunto de pasos o reglas para resolver un problema o realizar una tarea. En informática, se usa para diseñar programas y puede representarse con pseudocódigo, diagramas de flujo o código. Los algoritmos se aplican tanto a problemas simples como complejos, y su calidad depende de que sean correctos, eficientes, escalables y fáciles de mantener.
Un ejemplo sencillo de algoritmo es ordenar tres números de menor a mayor:
Problema: Ordenar los números 8, 3 y 5.
Algoritmo (pasos):
Comparar el primer número con el segundo.
Si el primero es mayor, intercambiarlos.
Comparar el segundo número con el tercero.
Si el segundo es mayor, intercambiarlos.
Volver a comparar el primero con el segundo para asegurar el orden.
Resultado: 3, 5, 8.
La complejidad de un algoritmo mide qué tan eficiente es, es decir, cómo cambian el tiempo de ejecución o el uso de memoria cuando aumenta el tamaño de los datos de entrada.
Hay dos tipos principales:
Complejidad temporal (Time Complexity): mide cuánto tiempo tarda el algoritmo en ejecutarse según el tamaño de la entrada, usando notación Big-O como O(1), O(n) o O(n²).
Complejidad espacial (Space Complexity): mide cuánta memoria utiliza el algoritmo dependiendo del tamaño de la entrada.
Analizar la complejidad ayuda a elegir el algoritmo más adecuado según los datos, los recursos disponibles y la velocidad deseada.
Cantidad de memoria o espacio que utiliza un algoritmo en función del tamaño de la entrada.
Cantidad de tiempo que tarda un algoritmo en ejecutarse en función del tamaño de la entrada.
Medida de la eficiencia de un algoritmo.
Procedimiento paso a paso o conjunto de reglas para resolver un problema específico o realizar una tarea particular.
Algoritmos muy complejos pueden gastar mucha energía, lo cual es un problema en dispositivos con batería o sistemas eficientes.
Un algoritmo puede funcionar bien en una máquina pero no estar optimizado para otra.
Las máquinas tienen CPU, memoria y almacenamiento limitados, lo que puede causar lentitud o fallos.
La complejidad del algoritmo determina cómo funciona cuando crecen los datos; algunos se vuelven muy lentos con entradas grandes.
Python es un lenguaje de programación de propósito general que se usa en áreas como desarrollo web, ciencia de datos y aprendizaje automático.
Es fácil de aprender y tiene una gran comunidad de desarrolladores.
La presentación cubre conceptos básicos como:
listas
tuplas, sets
diccionarios
cadenas de texto
números.
En el análisis de algoritmos, la eficiencia significa usar bien los recursos (tiempo y memoria), mientras que la eficacia significa resolver correctamente el problema. Al diseñar algoritmos, es importante equilibrar ambas para obtener resultados correctos sin gastar recursos innecesarios.
Donde:
f(n) puede ser cualquier función matemática que representa cómo varía el tiempo de ejecución con respecto al tamaño de entrada n.
El análisis teórico estima la eficiencia de un algoritmo sin ejecutarlo en una computadora.
Se basa en un estudio matemático que cuenta las operaciones que realiza el algoritmo según el tamaño de la entrada.
Generalmente se analiza el mejor caso, el caso promedio y, sobre todo, el peor caso para entender cómo crece su tiempo de ejecución.
Definir la operación básica: Se identifican las operaciones que consumen la mayor cantidad de tiempo en el algoritmo. Por ejemplo, en un algoritmo de búsqueda, la comparación de elementos puede ser la operación básicas.
Contar las operaciones: Se cuenta el número de veces que se realiza la operación básica en función del tamaño de entrada. Esto se hace siguiendo la lógica del algoritmo y analizando las iteraciones y repeticiones.
Expresar el tiempo de ejecución: Se expresa el número total de operaciones básicas en términos de la variable que representa el tamaño de entrada (por lo general, se denota como 'n'). Esto proporciona una ecuación matemática que representa cómo crece el tiempo de ejecución con respecto a 'n'.
Simplificar la ecuación: Se aplican técnicas matemáticas para simplificar la ecuación y eliminar términos insignificantes o de menor impacto.
Obtener la complejidad: Finalmente, se obtiene la complejidad del algoritmo en términos de notación asintótica, como el Big O, que describe cómo crece el tiempo de ejecución en el peor caso a medida que el tamaño de entrada se acerca a infinito.
El análisis teórico permite estimar la eficiencia de un algoritmo sin implementarlo ni ejecutarlo, lo que ayuda a comparar y elegir el algoritmo más adecuado para distintos problemas y tamaños de entrada. Sin embargo, no siempre refleja exactamente el rendimiento real, por lo que también es importante realizar pruebas prácticas (experimentación empírica).
En el análisis de algoritmos, los escenarios de entrada se refieren a diferentes casos o situaciones que pueden ocurrir durante la ejecución de un algoritmo y que afectan su rendimiento. Estos escenarios de entrada ayudan a evaluar cómo se comporta el algoritmo en diferentes circunstancias y son importantes para comprender la eficiencia y la eficacia del algoritmo en general.
Peor caso: es el escenario en el que el algoritmo tiene el peor desempeño posible, con el mayor tiempo de ejecución o consumo máximo de recursos. Sucede cuando la entrada está en su forma más desfavorable y el algoritmo tiene que realizar un número máximo de operaciones.
Mejor caso: se refiere a la situación en la que el algoritmo tiene el mejor desempeño posible, es decir, el menor tiempo de ejecución o el menor uso de recursos. Este escenario se produce cuando la entrada está en su forma más favorable para el algoritmo y no se requiere realizar muchas operaciones.
Caso promedio: representa un escenario promedio en el que se consideran todas las posibles entradas del mismo tamaño y se toma en cuenta su probabilidad de ocurrencia. El rendimiento del algoritmo se evalúa tomando en cuenta la distribución de entradas posibles y el tiempo de ejecución promedio esperado.
Sea T(n) una función que representa el tiempo de ejecución de un algoritmo.
Decimos que:
Si existen constantes
Tales que:
Interpretación: El algoritmo NO crece más rápido que
Sea T(n) una función que representa el tiempo de ejecución de un algoritmo.
Decimos que:
Si existen constantes
Tales que:
Interpretación: El algoritmo al menos tan rápido como
Sea T(n) una función que representa el tiempo de ejecución de un algoritmo.
Decimos que:
Si existen constantes
Tales que:
Interpretación: el crecimiento es exactamente del orden de:
Algoritmo A
Entrada: n
Para i ← 1 hasta n hacer
x ← x + 1
FinPara
FinAlgoritmoAlgoritmo B
Entrada: n
Para i ← 1 hasta n hacer
Para j ← 1 hasta n hacer
x ← x + 1
FinPara
FinPara
FinAlgoritmoAlgoritmo C
Entrada: n
Para i ← 1 hasta n hacer
Para j ← 1 hasta i hacer
x ← x + 1
FinPara
FinPara
FinAlgoritmoAlgoritmo Factorial(n)
Si n = 1 entonces
retornar 1
FinSi
retornar n * Factorial(n-1)
FinAlgoritmoAlgoritmo Suma(n)
Si n = 1 entonces
retornar 1
FinSi
retornar n + Suma(n-1)
FinAlgoritmoAlgoritmo Busqueda(n)
Si n = 1 entonces
retornar
FinSi
Busqueda(n/2)
FinAlgoritmoAlgoritmo Divide(n)
Si n = 1 entonces
retornar
FinSi
Divide(n/2)
Divide(n/2)
FinAlgoritmoAlgoritmo Ejemplo(n)
Si n = 1 entonces
retornar
FinSi
Para i ← 1 hasta n hacer
x ← x + 1
FinPara
Ejemplo(n/2)
Ejemplo(n/2)
FinAlgoritmo