Python_Tema6_Parte1_Complejidad-algoritmo_v1
Python_Tema6_Parte1_Complejidad-algoritmo_v1
Programando en Python
Complejidad de los algoritmos
1
IBM SkillsBuild | Introducción a Python
Índice
Introducción 3
¿Qué es un algoritmo? 4
¿El tamaño importa? 4
La complejidad algorítmica no es un número. Es una función 4
Código y Complejidad 5
Escenario de peor caso 6
Órden de Complejidad 6
Órden de Complejidad más conocidas 7
Constante: 7
Lineal: 8
Polinómico: 8
Logarítmico: 8
Enelogarítmico: 9
Exponencial: 9
Comparación 10
2
IBM SkillsBuild | Introducción a Python
Introducción
3
IBM SkillsBuild | Introducción a Python
¿Qué es un algoritmo?
De todas estas características las que podemos
variar para medir nuestra complejidad serían los
datos de entrada. Ya que no es lo mismo, en un
algoritmo de ordenamiento, ordenar 10 elementos
En primer lugar, hablemos de Algoritmo. Un
que ordenar 1.000.000 de elementos. El algoritmo
algoritmo es una secuencia de instrucciones cuyo
debería poder ordenar los elementos sin importar el
objetivo es la resolución de un problema. Existen
tamaño del vector, pero sí incide directamente en el
muchos problemas que tiene algoritmos que los
tiempo en resolver el problema.
solucionen. Además, un mismo problema puede
tener varias soluciones (¿o no tener ninguna?). Si Con esto podemos empezar a medir los distintos
tenemos varias soluciones de un mismo problema, algoritmos de ordenamiento. Si ordenamos un vector
¿Cuál sería la mejor solución? Para eso necesitamos de diez millones con varios algoritmos y vemos cuál
evaluar dicho algoritmo, al resultado de la evaluación se demora menos, podríamos decir cuál tiene mayor
lo llamaremos complejidad algorítmica. o menor complejidad algorítmica.
Analicemos el siguiente código escrito en Python: Lo que interesa es saber cómo puede crecer en
unidades de tiempo la resolución de un problema. En
este ejemplo es claro que el tiempo crece
def codigo_1( number ):
linealmente con respecto al valor de entrada.
a = 0
for j in range(1, number+1):
a += a + j Código y Complejidad
for k in range(number, 0, -1):
a -= 1 Es posible calcular visualmente la complejidad de
a *= 2 algunos algoritmos sencillos. Veamos algunos
return a ejemplos:
def codigo_2():
En este algoritmo tenemos unas instrucciones y a = 0
varios bucles. Empecemos con contar las a -= 1
instrucciones. a *= 2
5
IBM SkillsBuild | Introducción a Python
F(x)=1
6
IBM SkillsBuild | Introducción a Python
Viéndolo de esta manera podríamos simplificar las Cuando nos advierten de una complejidad
ecuaciones de Big-O eliminando algunas algorítmica de un algoritmo podemos tener una idea
características que en ingreso masivo de datos son de cómo será su comportamiento.
irrelevantes.
Si por ejemplo tenemos un algoritmo de
Si comparamos varios algoritmos tales como: orden , entonces podemos
definir su orden de cualquiera de las siguientes
O(3n+1)
formas:
O(20n)
O(15n+150)
O(n)
Orden de complejidad más
conocidas
Podemos ver en sus gráficas que, sin importar la
variable que corta al eje Y o la pendiente de la curva, Constante:
todas crecen con la misma inclinación. Todas estas
Es la más sencilla y siempre presenta un tiempo de
de ecuaciones podemos agruparlas y referirnos a
ejecución constante. Ejemplo:
ellas como orden Lineal.
O(n2+n+45)
O(100n2+101n)
O(100m2+101n+) € O(n2)
7
IBM SkillsBuild | Introducción a Python
Lineal: Ejemplos:
return x
Polinómico:
Son los algoritmos más comunes. Cuando c es 2 se Logarítmico:
le llama cuadrático, cuando es 3 se le llama cúbico, y
No suelen ser muchos. Estos algoritmos indican que
en general, polinómico. Cuando n es muy grande
el tiempo es menor que el tamaño de los datos de
suelen ser muy complicados. Estos algoritmos suelen
entrada. No importa indicar la base del logaritmo. Un
tener bucles anidados. Si tienen 2 bucles anidados
ejemplo es una búsqueda dicotómica.
sería un cuadrático.
8
IBM SkillsBuild | Introducción a Python
Este algoritmo busca un elemento en un array No se incluye el código debido a las distintas
ordenado dividiendo el array en 2 mitades, identifica versiones, estudios y discusiones de este algoritmo.
en cuál de las mitades se encuentra, luego divide esa Pero compartiremos el comportamiento de este
parte en 2 mitades iguales y busca nuevamente hasta orden de complejidad:
encontrar el elemento, es un algoritmo recursivo:
def bin(a,x,low,high):
ans = -1
if low==high: ans = -1
else:
mid = (low+((high-low)//2))
if x < a[mid]: ans = bin(a,x,low,mid)
elif x > a[mid]: ans =
bin(a,x,mid+1,high)
else: ans = mid
return ans
Exponencial:
Es una de las peores complejidades algorítmicas.
Sube demasiado a medida que crece los datos de
entrada. Puede verse en la Figura como crece una
función de este tipo. Un ejemplo de este código es la
solución de Fibonacci, el cual genera bucles 2
recursividades en cada ejecución. Ejemplo:
Enelogarítmico:
def exponencial(n):
Tan bueno como el anterior, en este orden
if n==1 or n==2:
encontramos el algoritmo QuickSort. El ejemplo
return 1
podemos verlo en Wikipedia en este return exponencial(n-1)+exponencial(n-
enlace https://en.wikipedia.org/wiki/Quicksort. 2)
9
IBM SkillsBuild | Introducción a Python
10