Cálculo de la notación Big-O
Clase 12 de 18 • Curso de Complejidad Algorítmica con JavaScript
Contenido del curso
Clase 12 de 18 • Curso de Complejidad Algorítmica con JavaScript
Contenido del curso
Sebastián Londero
Jean Nuñez
Eduardo Jose Pizarro Campos
Anfernee Valera
Jean Nuñez
Marcelo Arias
Fernando Quinteros Gutierrez
Moises Hernandez
Marcelo Arias
Abelardo Salazar
Marcelo Arias
Añaqui Apolinar Morales
Jose Angel Morales Gonzalez
Jeffersson Muñoz Torres
Brandon Argel Verdeja Domínguez
Jose Manuel Hernandez De la Cruz
Esteban Blanco Ortuno
Jesús Manuel Alarcón Maldonado
Diego Reyes Cabrera
Marcelo Arias
Jorge Miguel Diaz
Marcelo Arias
Jesus Manuel Hernandez Diaz
Marcelo Arias
carlos avendaño soria
Bryan Castano
Stanley Melgar
let bar = 'test' // O(1) if() {} // O(1) for() {} // O(n) while() {} // O(n) for() { for() {} }// O(n^2)
Uffff esto es muy bueno, ahora si entiendo, la comparacion
Gracias.
Me está encantando el curso :D, les comparto mis apuntes de esta clase:
Notación Big-O en complejidad temporal
let bar = 'test' // O(1) if() {} // O(1) for() {} // O(n) while() {} // O(n) for() { for() {} }// O(n^2)
Big-O complejidad algoritmica espacial
let bar = 'test' // 0(1) if () {} // 0(1) for () {} // 0(1) let resultado = [1,2,...,n] // 0(n) let dimensional = [[2,4],[6,8],[10,12]] //0(n^2)
El crecimiento importa
La complejidad de un algoritmo nace de cuántos recursos utiliza el algoritmo al ejecutarse.
La notacion Big-O solo se enfoca en el crecimiento.
Un algoritmo puede correr en una computadora muy vieja-lenta o en una muy nueva-rapida, pero el crecimiento (ritmo) sea el mismo, la complejidad será la misma. Pero esto es en base a los recursos que esa computadora tiene.
Conclusión
Revisamos el código en nuestro algoritmo para medir su complejidad en la notación Big-O.
La notacion Big-O se enfoca en el crecimiento
¡Correcto! 🚀
🗳️ Cálculo de la notación Big-O
Apuntes
Notación Big-O en complejidad temporal
let bar = 'test' // O(1) if(){} // O(1) for(){} // O(n) while(){} // O(n) for(){ for(){} } // O(n^2)
Notación Big-O en complejidad espacial
let bar = 'test' // O(1) if(){} // O(1) for(){} // O(1) let resultado = [1, 2, ..., n] // O(n) let dimensional = [[1, 2], [3, 4], ...] // O(n²)
El crecimiento importa
Como calculamos la notación Big-o y un closure y de la recursividad ?
¡Hola Moisés! Gran pregunta 😎 En los Closures sólo seguimos las mismas reglas para evaluar líneas de código, incluidas cuando nos presentamos a funciones dentro de otras funciones. Llamar funciones equivaldría un O(1).
function iniciar() { let nombre = "John"; // O(1) function mostrarNombre() { alert(nombre); // O(1) } mostrarNombre(); // O(1) }
En el caso de evaluar funciones recursivas, aquí te escribo otro ejemplo:
Una función recursiva es similar a una función iterativa (que usa for o while). En ambos existen iteraciones, o repeticiones de líneas de código, como en esta función recursiva suma:
function suma(n) { if (n <= 0) { return 0; } else { return 1 + suma(n-1); } }
En la anterior función suma() estamos repitiendo un fragmento de código dependiendo de cuánto n valga. Similar a los ciclos for. La notación asignada para los ciclos for es O(n), y la notación asignada para esta clase de funciones recursivas también es O(n).
¿Cómo se evaluaría en el caso de objetos y de instancias de clases?
¡Hola Abelardo! Gran pregunta. 😯 La notación Big-O se evalúa siguiendo una serie de reglas por cada línea de código. En este caso, las instancias de clases u objetos son fragmentos de código que podríamos interpretar como O(1).
class Usuario { constructor(nombre) { this.nombre = nombre; // O(1) } } const usuario = new Usuario('John'); // O(1)
Por otro lado, por ejemplo, si evaluásemos ciclos como for, o while, tendríamos fragmentos de código que se repetirían (y se ejecutarían) provocando un mayor consumo de recursos (tiempo o espacio), o sea, mayor complejidad con O(n).
Esta clase me complemento mas para entender la complejidad espacio tiempo, vengo de la complejidad algoritmica con python pero este es mas teorico y con ejemplos mas faciles de digeriri
Y en qué nivel de big-o queda una función recursiva? O(2^n)?
Esa es logaritmica si utilizas memorizacion
Cálculo de la notación Big-O
Notación Big-O en complejidad temporal
let bar = 'test' // O(1) if() {} // O(1) for() {} // O(n) while() {} // O(n) for() { for() {} }// O(n^2)
Big-O complejidad algorítmica espacial
let bar = 'test' // 0(1) if () {} // 0(1) for () {} // 0(1) let resultado = [1,2,...,n] // 0(n) let dimensional = [[2,4],[6,8],[10,12]] //0(n^2)
Para simplificar la notación quitamos los valores variantes no tan importantes, por ejemplo; con el número pi = 3.14159265358979, mientras más dígitos mayor precisos serán los resultados, pero ya que en los algoritmos el tiempo de ejecución siempre cambiará es mejor eliminar estas variaciones, quedándonos sólo con las clases, de la siguiente manera.
O(2n) ⇒ O(n)
O(50) ⇒ O(1)
O(n² + 50) ⇒ O(n²)
El crecimiento importa
La complejidad de un algoritmo nace de cuántos recursos utiliza el algoritmo al ejecutarse.
Así como un algoritmo se puede tardar más o menos dependiendo de factores como la computadora, memoria, etc. La complejidad de un algoritmo será siempre la misma, aunque en un dispositivo tarde 10 segundos y en otro 10 milisegundos, el ritmo de crecimiento se conserva.
Es por esto que la notación Big-O solo se enfoca en el crecimiento, y no en datos absolutos.
¿ De qué depende la optimización en ambas complejidades algorítmicas tanto temporal o espacial?
Big-O complejidad algoritmica espacial
let bar = 'test' // 0(1) if () {} // 0(1) for () {} // 0(1) let resultado = [1,2,...,n] // 0(n) let dimensional = [[2,4],[6,8],[10,12]] //0(n^2)
De los pocos lugares donde conseguí la explicación de Big O tan bien explicada, concisa y aplicada también a la complejidad de espacio fue acá en Platzi! 💚. La mayoría se enfoca en tiempo y dejan el espacio por fuera!
Entonces, una complejidad de O (n^3) debería ser simplificada a la notación O (n^2)?
¡Hola Diego! No, una complejidad de O(n^3) no debería ser simplificada a la notación O(n^2). Pues representan diferentes clases de algoritmos:
Un arreglo de n dimensiones tendría un big lineal O(n) pero si fuera determinado, es decir si supiéramos la dimensión ¿Seria constante O(1)?
¡Hola Jorge! Si sabes la dimensión exacta del arreglo, eso no convierte la complejidad de O(n) en O(1) porque la notación Big O se usa para describir cómo se comporta un algoritmo en relación con el tamaño de la entrada en el peor de los casos, en términos de tiempo o espacio.
Por ejemplo, si estás recorriendo un arreglo bidimensional de tamaño nxn, incluso si sabes que n es constante, todavía tienes que recorrer n^2 elementos, por lo que la complejidad del tiempo es O(n^2).
Y si mi funcion tiene un codicional if, y un ciclo for como se calcularia el Big-O total por asi decirlo?
¡Hola Jesus!
La condicional if toma O(1), el ciclo tomaría O(n).
esto está re bueno! pero no entiendo por que en otros cursos que tocan el mismo tema no lo explican así, es decir hablan de lo mismo, algoritmos pero de forma diferente, lo que hace que andes buscando en un curso y luego saltes a otro a ver si lo explicaron mejor.
El Alogritmo para Multiplicar Matrices n.m en C \nEs un Algorithmo O ( n.m.h ) lo que es Eq ~ O ( n³ ) para multiplicar todos los Elmenetos de una Array[ n] [ m] cual es una Matrix .\n
Un Algoritmo de typo Password Cracker por Fuerza Bruta si que puede ser una O[ n! ] y n aumenta cuando aumenta el numero de characters de my password a cracker! tanto como el numero de letras en [ Alphabet ] y este aumentara mucho mas si se incluyesen specialCharacters : [ | "#$%&*/+-.,_ {[( * ) ] } . por tanto si que pueden existir algoritmos con complejidad superior a Polinomios n3 . \n
La notación Big-O consiste en encontrar la función que describe el crecimiento en el uso de recursos (tiempo o espacio), de allí que lo importante sea únicamente la función, no su desplazamiento a través del eje (que serian los términos independientes como "2" multiplicando o "50" sumando).