Tarea
Tarea
Tarea
de Nuevo León
Facultad de Ingeniería
Mecanica y Electrica
Materia:Algoritmos Computacionales
Integrantes
Nombre Matricula Carrera
Roberto Carlos 2222950 ITS
Lozano Páez
¿Qué es un algortmo?
Un algoritmo es un conjunto de pasos o instrucciones claras, finitas y precisas que se siguen para
resolver un problema o realizar una tarea específica. Los algoritmos se utilizan en diferentes
campos, especialmente en matemáticas, informática y lógica, para automatizar procesos y tomar
decisiones de manera eficiente.
2. Complejidad espacial
La complejidad espacial mide cuánta memoria consumen los programas en función del tamaño de
la entrada. Algunos programas pueden ser más rápidos, pero a costa de utilizar más memoria,
mientras que otros pueden ser más lentos, pero más eficientes en cuanto al uso de espacio.
3. Consideraciones prácticas
Además de la eficiencia teórica, hay varios factores prácticos que también deben ser considerados:
Constantes ocultas en la notación Big-O: Aunque dos programas pueden tener la misma
complejidad asintótica (por ejemplo, ambos O(n log n)), uno podría tener una constante
oculta que lo haga más lento en la práctica para entradas pequeñas o medianas.
Uso de recursos del sistema: Un programa puede consumir más recursos del sistema,
como ancho de banda de red o acceso al disco, lo que podría afectar su rendimiento en
ciertos entornos..
Escalabilidad: Observa cómo se comporta cada programa a medida que los datos de
entrada crecen. Algunos programas pueden comportarse de manera aceptable con
pequeñas cantidades de datos, pero volverse ineficientes con grandes cantidades.
4. Legibilidad y mantenibilidad
Además del rendimiento, es importante considerar la legibilidad del código y su
mantenibilidad:
Un programa más simple y fácil de entender puede ser más valioso a largo plazo,
incluso si no es el más eficiente en cuanto a tiempo o espacio.
Un algoritmo más complejo puede ser difícil de depurar o modificar, lo que podría ser
problemático en entornos de desarrollo en constante cambio.
¿Cómo se puede medir?
Mediante instrucciones básicas:
• Llamadas a funciones
• Asignaciónde escalares
• Saltos implícitoso explícitos
• Evaluaciones de condiciones
La notación asintótica es una herramienta utilizada en análisis de algoritmos
para describir el comportamiento del tiempo de ejecución o el consumo de
recursos (como memoria) a medida que el tamaño de la entrada crece. Sirve
para medir la eficiencia de un algoritmo en términos de su rendimiento
cuando se trabaja con grandes volúmenes de datos.
Las notaciones asintóticas más comunes son:
1. Notación Big-O (O grande):
La notación Big-O describe el peor caso o el límite superior del tiempo de
ejecución de un algoritmo. Es decir, proporciona una cota superior del
crecimiento del tiempo de ejecución conforme crece el tamaño de la
entrada. En otras palabras, mide cómo escala el algoritmo en el peor
escenario posible.
Ejemplo: Si un algoritmo tiene un tiempo de ejecución de
O(n)O(n)O(n), significa que el tiempo de ejecución crece de manera
lineal a medida que el tamaño de la entrada (n) aumenta.
Ejemplos de notaciones Big-O comunes:
O(1)O(1)O(1): Tiempo constante, no importa el tamaño de la entrada.
O(logn)O(\log n)O(logn): Tiempo logarítmico, el tiempo de ejecución
crece lentamente conforme aumenta la entrada.
O(n)O(n)O(n): Tiempo lineal, el tiempo de ejecución crece
proporcionalmente al tamaño de la entrada.
O(n2)O(n^2)O(n2): Tiempo cuadrático, el tiempo de ejecución crece al
cuadrado del tamaño de la entrada.
O(2n)O(2^n)O(2n): Tiempo exponencial, el tiempo de ejecución crece
muy rápidamente con respecto al tamaño de la entrada.
2. Notación Omega (Ω):
La notación Omega describe el mejor caso o el límite inferior del tiempo de
ejecución de un algoritmo. Proporciona una cota inferior, lo que significa que
el tiempo de ejecución del algoritmo no puede ser más rápido que este
límite cuando el tamaño de la entrada crece.
Ejemplo: Si un algoritmo tiene un tiempo de ejecución de Ω(n)\
Omega(n)Ω(n), significa que, en el mejor caso, el algoritmo tarda al
menos un tiempo lineal.
3. Notación Theta (Θ):
La notación Theta proporciona una descripción más precisa del tiempo de
ejecución de un algoritmo, ya que describe tanto el mejor como el peor caso
en un mismo rango. Es decir, indica que el tiempo de ejecución del algoritmo
crece exactamente a ese ritmo asintóticamente.
Ejemplo: Si un algoritmo tiene un tiempo de ejecución de Θ(n)\
Theta(n)Θ(n), significa que su tiempo de ejecución es lineal tanto en el
mejor como en el peor caso.
Importancia de la notación asintótica:
Comparación de algoritmos: Permite comparar la eficiencia de
diferentes algoritmos, independientemente de las diferencias en
hardware o implementación.
Escalabilidad: Ayuda a predecir cómo se comportará un algoritmo con
grandes volúmenes de datos.
Abstracción: Al enfocarse en el crecimiento de la función, se ignoran
constantes o términos de menor grado que son irrelevantes para
grandes tamaños de entrada.
¿Cómo pudo saber si mi programa es eficiente?
Medir la eficiencia de un programa es un proceso que involucra evaluar
varios aspectos, como el tiempo de ejecución, el uso de memoria y cómo se
comporta el programa conforme crece el tamaño de la entrada. Aquí te dejo
algunos pasos y técnicas que puedes usar para medir la eficiencia de un
programa:
1. Medir el Tiempo de Ejecución (Tiempo de CPU)
El tiempo de ejecución es una métrica fundamental para determinar la
eficiencia de un programa. Puedes medir cuánto tiempo tarda en ejecutarse
para diferentes tamaños de entrada. Existen varias herramientas y funciones
en distintos lenguajes de programación para medir el tiempo.
2. Análisis de Complejidad Temporal y Espacial
Puedes utilizar análisis teórico para determinar cómo crece el tiempo de
ejecución o el uso de memoria de un programa en función del tamaño de la
entrada. La notación asintótica (Big-O, Big-Theta, Big-Omega) es muy útil
para realizar este análisis.
Complejidad temporal: Estudia cómo cambia el tiempo de ejecución
con respecto al tamaño de la entrada. Por ejemplo, si tu programa
tiene una complejidad O(n)O(n)O(n), su tiempo de ejecución crecerá
de manera lineal a medida que aumente la entrada.
Complejidad espacial: Estudia cuánta memoria usa el programa en
función del tamaño de la entrada.
3. Uso de Herramientas de Perfilado (Profiling)
Las herramientas de profiling te permiten medir el rendimiento de un
programa mientras se ejecuta, dándote métricas sobre:
Funciones que consumen más tiempo.
Memoria utilizada.
Tiempo de CPU por función.
Algunas herramientas populares de profiling incluyen:
gprof: Para programas en C/C++.
Valgrind: Para análisis de memoria en C/C++.
perf: Herramienta de Linux para análisis de rendimiento general.
Py-Spy o cProfile: Para programas en Python.
VisualVM: Para programas en Java.
5. Medición de Uso de Memoria
Además de medir el tiempo de ejecución, también es importante evaluar el
consumo de memoria. Existen herramientas específicas que ayudan a medir
cuánta memoria está utilizando tu programa:
En C/C++, herramientas como Valgrind pueden ayudarte a detectar
fugas de memoria y medir el uso general de la memoria.
6. Pruebas con Diferentes Tamaños de Entrada
Para analizar cómo tu programa escala, es útil ejecutarlo con diferentes
tamaños de entrada y observar su comportamiento. Esto te dará una idea
clara de cómo el rendimiento varía:
Elige varios tamaños de entrada (pequeños, medianos y grandes).
Mide el tiempo de ejecución y el uso de memoria para cada tamaño.
Anota cómo cambian estas métricas a medida que crece la entrada.
IMPLEMENTACIÓNES
Programa 1: Total de pagos en un mes
Intervalo de confianza:
Dado que el codigo que usamos tiene una variacion de tiempos entre cada caso esto se
debe a causas externas como el propio software del rpograma que puede ser algo pesado
para el dispositivo en cual se ejecuta el programa, como tambien puede saer uan de las
causas el propio hardware del dispositivo. Pero como los datos al ser difrenetes es normal
que tengamos difrerenets tiempos en cada uno de los casos
El intervalo de confianza se calcula para estimar la variabilidad en los tiempos de
ejecución. Sin embargo, en este caso, la variación observada es inesperada para un
algoritmo. La variabilidad podría ser el resultado de fluctuaciones en el entorno de
ejecución o en el sistema operativo.
Limitaciónes:
Limitaciones del hardware y Software:
Estas variaciones pueden tambien ser en algunos casos el propio software y
hardware el dispositivo en el que se ejecute este programa ya que puede ser algo
pesado para el propio dispositivo en el que lo queremos ejecutar.
Precisiones de Medición:
Esta medicion de tiempo que obtuvimos en en base al contador del propio
programa asi que estas mediciones de tiempo pueden ser no tan precisas.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: