Está en la página 1de 5

Instituto Tecnológico de Santo Domingo

IDS343 – Estructura de Datos y Algoritmos I


Ensayo 6
Eliardo Benoit #1086299
Unidad VI. Análisis y Eficiencia de Algoritmos

Para comenzar a entender lenguajes como C++ y demás debemos primero entender
conceptos fundamentales de la programación, conceptos como algoritmo y
programa que son esenciales, pilares fundamentales de lo que es la programación
en esencia, para esto hay que tener una definición bien clara y saber cómo
distinguirlos.
Un algoritmo es un conjunto de instrucciones ordenadas, finitas y delimitadas que
se crean con el fin de describir de forma sistemática la ejecución de una tarea.

Los algoritmos son de uso común en el día a día, y se pueden encontrar en


manuales de uso, instrucciones para ejecutar un plan, o guías para ejecutar
procesos. Sin embargo, el uso del término es más común en el ámbito de la
programación.

Un programa es una secuencia lógica de instrucciones para ejecutar tareas


específicas en una computadora. Dichas secuencias están escritas en código y son
diseñadas por programadores, usando uno o más algoritmos.

La diferencia entre un algoritmo y un programa es que si bien ambos hacen


referencia una serie de instrucciones, los algoritmos pueden estar escritos en
código o en lenguaje natural, mientras que los programas sólo pueden estar escritos
en lenguaje de programación.

Además, los algoritmos pueden ser ejecutados por un ser humano, mientras que los
programas están diseñados para ser ejecutados por máquinas.

Los algoritmos poseen una serie de propiedades o características que son


esenciales para una buena creación de este, estas son:

• Un algoritmo debe ser preciso e indicar el orden de realización de cada paso.


• Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se
debe obtener el mismo resultado cada vez.
• Un algoritmo debe ser finito. El algoritmo se debe terminar en algún
momento, o sea, debe tener un número finito de pasos.
• Un algoritmo debe ser legible. El texto que lo describe debe ser claro, tal
que permita entenderlo " leerlo fácilmente.
Un algoritmo es considerado eficiente si su consumo de recursos está en la media o
por debajo de los niveles aceptables. Hablando a grandes rasgos, 'aceptable'
significa: que el algoritmo corre en un tiempo razonable en una computadora dada.
Siguiendo el temario podemos dar introducción a los bucles, estos es una secuencia
que repite varias veces un mismo trozo de código, hasta que la condición asignada
al bucle deja de cumplirse. Los bucles más comunes son:
• Lineales
• Algoritmicos
• Anidados
En general, el formato de la eficiencia se puede expresar mediante una función: f
(n) = eficiencia, Es decir, la eficiencia del algoritmo se examina como una función
del número de elementos a ser procesados.
La medida del rendimiento de un programa se consigue mediante la complejidad
del espacio y del tiempo y de un programa.
La complejidad del espacio de un programa es la cantidad de memoria que se
necesita para ejecutar hasta la compleción (terminación). El avance tecnológico
proporciona hoy en día memoria abundante, por esa razón el análisis de algoritmos
se centra, fundamentalmente, en el tiempo de ejecución, si bien puede estudiarse de
forma análoga a la del tiempo.
La complejidad del tiempo de un programa es la cantidad de tiempo de
computadora que se necesita para ejecutarse. Se utiliza una función, T(n), para
representar el número de unidades de tiempo tomadas por un programa o algoritmo
para cualquier entrada de tamaño n. Si la función T(n) de un programa es T(n) = c
* n entonces el tiempo de ejecución es linealmente proporcional al tamaño de la
entrada sobre la que se ejecuta. Tal programa se dice que es de tiempo lineal o
simplemente lineal.
Usamos la notación Θ grande para acotar de manera asintótica el crecimiento de un
tiempo de ejecución a que esté dentro de factores constantes por arriba y por
abajo.
Sería conveniente tener una forma de notación asintótica que signifique "el tiempo
de ejecución crece a lo más por este tanto, pero puede crecer más lentamente".
Usamos la notación "O grande" justo para estas ocasiones.

Decimos que el tiempo de ejecución es "O grande de f(n)f(n)f, left parenthesis, n,


right parenthesis" o simplemente "O de f(n)f(n)f, left parenthesis, n, right
parenthesis". Usamos la notación O grande para cotas superiores asintóticas, ya
que acota el crecimiento del tiempo de ejecución por arriba para entradas
suficientemente grandes.
La notación O grande se puede obtener a partir de f(n) utilizando los siguientes
pasos:
1. En cada término, establecer el coeficiente del término en 1.
2. Mantener el término mayor de la función y descartar los restantes. Los términos
se ordenan de menor a mayor:

Al analizar la complejidad de un método no recursivo, se han de aplicar las


propiedades de la notación O y las siguientes consideraciones relativas al orden
que tienen las sentencias, fundamentalmente a las estructuras de control.
• Las sentencias de asignación son de orden constante O(1).
• La complejidad de una sentencia de selección es el máximo de las
complejidades del bloque then y del bloque else.
• La complejidad de una sentencia de selección múltiple (switch) es el
máximo de las complejidades de cada uno de los bloques case.
• Para calcular la complejidad de un bucle, condicional o automático, se ha de
estimar el número máximo de iteraciones para el peor caso; entonces la
complejidad del bucle es el producto del número de iteraciones por la
complejidad de las sentencias que forman el cuerpo del bucle.
• La complejidad de un bloque se calcula como la suma de las complejidades
de cada sentencia del bloque.
• La complejidad de la llamada a una función es de orden 1, complejidad
constante. Es necesario considerar la complejidad de la función llamada.

También podría gustarte