Inteligencia Artificial Un Enfoque Moderno Stuart J Russell
Inteligencia Artificial Un Enfoque Moderno Stuart J Russell
Inteligencia Artificial Un Enfoque Moderno Stuart J Russell
Se dice que la complejidad de un algoritmo es constante si los pasos necesarios para completar la
ejecución de un algoritmo permanecen constantes, independientemente del número de entradas.
La complejidad constante se denota por O (c) donde c puede ser cualquier número constante.
Escribamos un algoritmo simple en Python que encuentre el cuadrado del primer elemento en la
lista y luego lo imprima en la pantalla.
Si dibuja un trazado de línea con el tamaño variable de la entrada de items en el eje X y el número
de pasos en el eje Y, obtendrá una línea recta.
Se dice que la complejidad de un algoritmo es lineal si los pasos necesarios para completar la
ejecución de un algoritmo aumentan o disminuyen linealmente con el número de entradas. La
complejidad lineal se denota por O (n).
En este ejemplo, escribamos un programa simple que muestre todos los elementos de la lista en la
consola:
La complejidad de la función linear_algo es lineal en el ejemplo anterior, ya que el número de
iteraciones del bucle for será igual al tamaño de la matriz de items entrada. Por ejemplo, si hay 6
elementos en la lista de ítems, el for-loop se ejecutará 6 veces, y así sucesivamente.
La gráfica para la complejidad lineal con entradas en el eje X,Y el número de pasos en el eje x es la
siguiente:
Otro punto a tener en cuenta aquí es que, en caso de un gran número de entradas, las constantes
se vuelven insignificantes. Por ejemplo, eche un vistazo a la siguiente secuencia de comandos:
En el script anterior, hay dos bucles for que se repiten en la lista de items entrada. Por lo tanto, la
complejidad del algoritmo se convierte en O (2n), sin embargo, en el caso de elementos infinitos en
la lista de entrada, el doble del infinito sigue siendo igual al infinito, por lo tanto, podemos ignorar
la constante 2 (ya que en última instancia es insignificante) y la complejidad Del algoritmo
permanece O (n).
Podemos verificar y visualizar esto aún más al trazar las entradas en el eje X,Y el número de pasos
en el eje Y como se muestra a continuación:
Complejidad cuadrática (O (n ^ 2))
Se dice que la complejidad de un algoritmo es cuadrática cuando los pasos necesarios para ejecutar
un algoritmo son una función cuadrática del número de elementos en la entrada. La complejidad
cuadrática se denota como O (n ^ 2). Eche un vistazo al siguiente ejemplo para ver una función con
complejidad cuadrática:
En la secuencia de comandos anterior, puede ver que tenemos un bucle externo que itera a través
de todos los elementos en la lista de entrada y luego un bucle interno anidado, que nuevamente se
itera a través de todos los elementos en la lista de entrada. El número total de pasos realizados es
n * n, donde n es el número de elementos en la matriz de entrada.
El siguiente gráfico traza el número de entradas frente a los pasos para un algoritmo con
complejidad cuadrática.
Encontrar la complejidad de funciones complejas
En los ejemplos anteriores, vimos que solo se estaba ejecutando una función en la entrada. ¿Qué
pasa si se están realizando múltiples funciones en la entrada? Echa un vistazo al siguiente ejemplo.
En la secuencia de comandos anterior se están realizando varias tareas, primero, se imprime una
cadena 5 veces en la consola usando la declaración de print. A continuación, imprimimos la lista de
entrada dos veces en la pantalla y, finalmente, otra cadena se imprime tres veces en la consola. Para
encontrar la complejidad de tal algoritmo, necesitamos dividir el código del algoritmo en partes y
tratar de encontrar la complejidad de las piezas individuales.
La complejidad de esta parte es O (5). Dado que se están realizando cinco pasos constantes en este
fragmento de código, independientemente de la entrada.
A continuación, tenemos:
Finalmente, en el siguiente fragmento de código, una cadena se imprime tres veces, por lo que la
complejidad es O (3)
Para encontrar la complejidad general, simplemente tenemos que agregar estas complejidades
individuales. Hagámoslo así:
O(8) + O(2n)
Anteriormente dijimos que cuando la entrada (que tiene una longitud n en este caso) se vuelve
extremadamente grande, las constantes se vuelven insignificantes, es decir, dos veces o la mitad del
infinito sigue siendo infinito. Por lo tanto, podemos ignorar las constantes. La complejidad final del
algoritmo será O (n).
Además de la complejidad del mejor y el peor de los casos, también puede calcular la complejidad
promedio de un algoritmo, lo que le indica que "a partir de una entrada aleatoria, ¿cuál es la
complejidad de tiempo esperada del algoritmo"?