Sunteți pe pagina 1din 2

Palma Rodríguez Uzziel N.

T: 06
Complejidad algorítmica
Una vez dispongamos de un algoritmo que funciona correctamente, es necesario definir
criterios para medir su rendimiento o comportamiento. Estos criterios se centran
principalmente en su simplicidad y en el uso eficiente de los recursos.
A menudo se piensa que un algoritmo sencillo no es muy eficiente. Sin embargo, la sencillez
es una característica muy interesante a la hora de diseñar un algoritmo, pues facilita su
verificación, el estudio de su eficiencia y su mantenimiento. De ahí que muchas veces se
busque la simplicidad y legibilidad del código frente a alternativas más crípticas y eficientes
del algoritmo. Respecto al uso eficiente de los recursos, éste suele medirse en función de
dos parámetros: el espacio, es decir, memoria que utiliza, y el tiempo, lo que tarda en
ejecutarse. Ambos representan los costes que supone encontrar la solución al problema
planteado mediante un algoritmo. Dichos parámetros van a servir además para comparar
algoritmos entre sí, permitiendo determinar el más adecuado de entre varios que solucionan
un mismo problema.
Un algoritmo será más eficiente comparado con otro, siempre que consuma menos
recursos, como el tiempo y espacio de memoria necesarios para ejecutarlo. La eficiencia
de un algoritmo puede ser cuantificada con las siguientes medidas de complejidad:
1. Complejidad Temporal o Tiempo de ejecución: Tiempo de cómputo necesario para
ejecutar algún programa.
2. Complejidad Espacial: Memoria que utiliza un programa para su ejecución. La eficiencia
en memoria de un algoritmo indica la cantidad de espacio requerido para ejecutar el
algoritmo; es decir, el espacio en memoria que ocupan todas las variables propias al
algoritmo. Para calcular la memoria estática de un algoritmo se suma la memoria que
ocupan las variables declaradas en el algoritmo. Para el caso de la memoria dinámica, el
cálculo no es tan simple ya que, este depende de cada ejecución del algoritmo.
Este análisis se basa en las Complejidades Temporales, con este fin, para cada problema
determinaremos una medida N, que llamaremos tamaño de la entrada o número de datos
a procesar por el programa, intentaremos hallar respuestas en función de dicha N. El
concepto exacto que cuantifica N dependerá de la naturaleza del problema, si hablamos de
un array se puede ver a N como el rango del array, para una matriz, el número de elementos
que la componen; para un grafo, podría ser el número de nodos o arcos que lo arman, no
se puede establecer una regla para N, pues cada problema acarrea su propia lógica y
complejidad.
Así pues, la complejidad de un algoritmo deberá estar relacionada con el número de
operaciones elementales necesarias (asignaciones, comparaciones, sumas, restas,
multiplicaciones, divisiones, iteraciones, etc.) para resolver un problema dado. El número
de estas operaciones dependerá de los datos de entrada y estos pueden dar lugar desde
una solución especialmente favorable hasta una especialmente costosa. Por ejemplo, en la
búsqueda secuencial de un vector ordenado, si el valor buscado es el menor lo
obtendremos con muy pocas operaciones, sin embargo, si buscamos el último, la solución
supondrá recorrer todo el vector. Por ello se habla del mejor, del peor caso y del caso medio.
Para el peor caso de un algoritmo, expresaremos la función que mide el número de
operaciones según el tamaño del problema como f(n), que tomaremos como medida
aproximada de la eficiencia.
Las cotas de complejidad, también llamadas medidas asintóticas sirven para clasificar
funciones de tal forma que podamos compararlas. Las medidas asintóticas permiten
analizar qué tan rápido crece el tiempo de ejecución de un algoritmo cuando crece el
tamaño de los datos de entrada, sin importar el lenguaje en el que esté implementado ni el
tipo de máquina en la que se ejecute. Existen diversas notaciones asintóticas para medir la
complejidad, las tres cotas de complejidad más comunes son: la notación O (o mayúscula),
la notación Ω (omega mayúscula) y la notación θ (theta mayúscula) y todas se basan en el
peor caso.
Algoritmos de ordenamiento
-Bubble sort Tiempo: O(n²) Espacio: O(1)
-Heap sort Tiempo: O(n log n) Espacio: O(1)

-Cocktail sort Tiempo: O(n²) Espacio: O(1)


-Insertion sort Tiempo: O(n²) Espacio: O(1)
-Bucket sort Tiempo: O(n) Espacio: O(n)
-Counting sort Tiempo: O(n+k) Espacio: O(n+k)

-Merge sort Tiempo: O(n log n) Espacio: O(n)


-Radix sort Tiempo: O(nk) Espacio: O(n)
-Selection sort Tiempo: O(n²) Espacio: O(1)
-Quick sort Tiempo: O(n²) Espacio: O(log n)

-Shell sort Tiempo: O(n1.25) Espacio: O(1)


Algoritmos de búsqueda
-Búsqueda lineal (secuencial) Tiempo: O(n)

-Búsqueda binaria Tiempo: O (log n)


-Búsqueda mediante transformación de llaves hash Tiempo: O (n)
Gómez Fuentes, M. y Cervantes Ojeda, J. (2014). Introducción al Análisis y al Diseño
de Algoritmos. 1ª ed. México, Ed. UAM Cuajimalpa.
Pinto López, R. (2010) Estructura de datos y algoritmos. Artículo en línea. Recuperado el
16 de octubre del 2018 en: https://es.slideshare.net/rolfpinto/teora-de-la-complejidad-
algoritmica
Abellanas M. , Lodares D. (1991) Análisis de algoritmos y teoría de grafos. 1ª ed. México,
Ed. Macrobit
FCEAT (2013) La complejidad de los algoritmos. (En línea) Recuperado el 16 de octubre
del 2018 en http://fceat.uas.edu.mx/files/LIBRO-ALGORITMOS--314-.pdf

S-ar putea să vă placă și