<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: devi amaolo </title>
    <description>The latest articles on DEV Community by devi amaolo  (@deviamaolo).</description>
    <link>https://dev.to/deviamaolo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F545633%2Fd086e9b1-9146-4753-95cf-e857f8098869.jpg</url>
      <title>DEV Community: devi amaolo </title>
      <link>https://dev.to/deviamaolo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deviamaolo"/>
    <language>en</language>
    <item>
      <title>JavaScript Engine (V8)</title>
      <dc:creator>devi amaolo </dc:creator>
      <pubDate>Thu, 29 Sep 2022 22:51:42 +0000</pubDate>
      <link>https://dev.to/deviamaolo/javascript-engine-v8-3fmb</link>
      <guid>https://dev.to/deviamaolo/javascript-engine-v8-3fmb</guid>
      <description>&lt;p&gt;Con el nacimiento de las tecnologías web (HTTP, HTML, navegadores primitivos) las páginas web eran muy básicas y estáticas, solo se podia consumir texto e imágenes, nada como lo conocemos hoy en día. Los usuarios del navegador NetScape, dándose cuenta de la necesidad de evolucionar las páginas pidieron una mejora, y que las páginas web fueran dinámicas (que los usuarios pudieran interactuar con la página)&lt;/p&gt;

&lt;p&gt;JavaScript fue creado por Brendan Eich, inspirado por otros lenguajes como Java, el propósito de JS fue dar solución a la problemática de las páginas estáticas.&lt;/p&gt;

&lt;p&gt;El primer lenguaje (creado por Brendan Eich) que permitía darle un poco de interactividad a las páginas fue Mocha, este fue pensado para el navegador Netscape, que luego fue mejorando con el tiempo y ese mismo año lo sustituyó LiveScript. Luego, a finales del 95 surge de estos dos intentos finalmente JavaScript.&lt;/p&gt;

&lt;p&gt;El nombre de JavaScript surge por motivos de marketing, ya que como el lenguaje Java estaba tomando fuerza en ese entonces, decidieron que este lenguaje tendría mejor aceptación si se le colocaba JavaScript (pero no son lo mismo, son dos lenguajes de programación totalmente diferentes. &lt;/p&gt;

&lt;p&gt;A medida que JavaScript se hizo popular, surgieron variaciones de este lenguaje, por ejemplo, en 1995 la empresa Microsoft decidió hacer su variación del lenguaje para utilizarlo en su navegador Internet Explorer. Pero la organización de estándares ECMA International (que en ese momento surgió como un comité) decidió que los navegadores solo iban a aceptar como lenguaje JavaScript ya que era muy peligroso que distintos navegadores tuvieran su propio lenguaje de programación, y que esta organización se iba a encargar de ir añadiendo los nuevos cambios que surgieran en el lenguaje y publicar sus estándares. &lt;/p&gt;

&lt;h2&gt;
  
  
  Motor V8
&lt;/h2&gt;

&lt;p&gt;Primero veamos que es un motor de JavaScript:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Un motor de JavaScript es un programa de computadora que ejecuta código JavaScript&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dicho de otra manera es aquel que se va a encargar de interpretar el código de JavaScript en el navegador.&lt;/p&gt;

&lt;p&gt;Las empresas han desarrollado motores de javascript para poder interpretar el codigo en sus navegadores tales como: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScriptCore (Apple) para Safari&lt;/li&gt;
&lt;li&gt;Chakra (Microsoft) para Edge hasta 2019, ahora usa V8&lt;/li&gt;
&lt;li&gt;SpiderMonkey (Mozilla) para Firefox&lt;/li&gt;
&lt;li&gt;V8 (Google) para Chrome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En el año 2008 surge el motor de JavaScript de Google que corre en el navegador, con el nombre V8 JavaScript Engine. Este motor fue un paso crucial en la historia de JavaScript ya que resolvió la problemática de la lentitud del tiempo de interpretación. &lt;/p&gt;

&lt;p&gt;La razón detrás de esta mejora tan grande radica principalmente en la combinación de intérprete y compilador. Hoy en día, los cuatro motores utilizan esta técnica. El intérprete ejecuta el código fuente casi de inmediato. El compilador traduce el código fuente en código máquina que el sistema del usuario ejecuta de manera directa.&lt;/p&gt;

&lt;p&gt;Node.js es la forma como podemos trabajar JavaScript de lado del servidor y este también corre con el motor V8. &lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo funciona el JavaScript Engine?
&lt;/h2&gt;

&lt;p&gt;Cuando estamos trabajando con JavaScript y queremos que la computadora entienda las instrucciones que va a ejecutar, va a ocurrir un error, ya que la computadora no entiende JavaScript, entonces, tenemos que convertir JavaScript a código binario, que es el lenguaje que entienden las computadoras.&lt;/p&gt;

&lt;p&gt;Por fortuna, no tenemos que realizar esto manualmente ya que el motor V8 de JavaScript hace esta tarea por nosotros, convirtiendo JavaScript en código binario. &lt;/p&gt;

&lt;p&gt;JavaScript es un lenguaje interpretado, y compilado en tiempo real, esto significa que cuando el motor lo interpreta no tenemos que compilarlo previamente sino que compila el código al momento en que lo estamos ejecutando.&lt;/p&gt;

&lt;p&gt;El motor V8 de Google para el navegador Chrome hace que JavaScript sea muchísimo más rápido. El mismo es Open Source, y por esto ciertos navegadores como Edge, Opera y Brave lo han implementado para la construcción de sus motores. También el navegador de Android está basado en V8.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué nace V8?
&lt;/h2&gt;

&lt;p&gt;El motor de V8 nace con la finalidad de optimizar el rendimiento de la aplicación Google Maps en los navegadores, ya que la aplicación tenía un mejor o peor rendimiento dependiendo del motor, pero igualmente corría muy lenta.&lt;/p&gt;

&lt;p&gt;Para esto, el equipo de Google creó un motor para Chrome que ejecutara muchisimo más rápido Google Maps, permitiendo a los usuarios hacer gran cantidad de cosas. Al probarlo, se dieron cuenta que la rapidez del motor para ejecutar Google Maps permitía además usar JavaScript para hacer aplicaciones con mucha más interacción. Por lo que desarrollaron un motor más robusto para que podamos construir productos web más robustos donde haya mucha interacción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendiendo el proceso de V8
&lt;/h2&gt;

&lt;p&gt;Una vez que el motor corre el archivo de JavaScript, lo primero que hace es generar un entorno global, y procede a realizar 3 pasos. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Dentro de este entorno, crea un objeto global conocido como window (en los navegadores es Window y en Node.js es global)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Genera la variable this, donde en este entorno (scope global) this hace referencia al objeto window.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Después de haber creado el entorno global y el objeto global, crea un contexto de ejecución en donde correrá el código a través de una pila de ejecución. (Call Stack) &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Luego, cuando JavaScript empiece a interactuar con el navegador ocurre un parseo (digamos que es una inspeccion) del documento completo para encontrar las keywords y mandarlas al Abstract Syntax Tree (AST), que es una estructura de árbol donde podemos ver como estan estructuradas las keywords (variables, funciones, objetos, todo en si) por dentro.&lt;/p&gt;

&lt;p&gt;Ahora que tiene el árbol sintáctico listo con las keywords desestructuradas, comienza a interpretar el código y lo convierte en bytecode (que no es tan bajo como machine code, pero la máquina si puede entenderlo).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo4ijicpsgbldcsog7fo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwo4ijicpsgbldcsog7fo.png" alt="Image description" width="478" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finalmente antes de convertirlo en bytecode, puede ocurrir un paso interior donde si el motor detecta que el código puede ser optimizado (debido a que hayan variables repetidas, funciones declaradas, y errores en el código) por el motor en un intento de ayudarnos a que no ocurran errores, y una vez que lo optimiza, lo compila y lo convierte en bytecode. En este proceso puede ocurrir el Hoisting donde una variable (sucede mas que todo con var y function) es subida y guardada en memoria antes de ejecutar cualquier tipo de código, y puede devolvernos un comportamiento erróneo de nuestro código. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmwu7cj9wmr3fe2j1v1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftmwu7cj9wmr3fe2j1v1k.png" alt="Image description" width="486" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta fue una pequeña introducción a que es el motor v8 y su función a la hora de ejecutar código JavaScript.&lt;/p&gt;

&lt;p&gt;articulos para profundizar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/javascript-under-the-hood-v8/"&gt;Under the Hood of the V8 Engine&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://cabulous.medium.com/how-v8-javascript-engine-works-5393832d80a7"&gt;How V8 JavaScript engine works step by step&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.campusmvp.es/recursos/post/fundamentos-de-javascript-por-que-deberias-saber-como-funciona-el-motor.aspx"&gt;Fundamentos de JavaScript&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Complejidad Algorítmica y Notación Big O</title>
      <dc:creator>devi amaolo </dc:creator>
      <pubDate>Fri, 24 Jun 2022 05:46:28 +0000</pubDate>
      <link>https://dev.to/deviamaolo/complejidad-algoritmica-y-notacion-big-o-3b00</link>
      <guid>https://dev.to/deviamaolo/complejidad-algoritmica-y-notacion-big-o-3b00</guid>
      <description>&lt;p&gt;En este artículo vamos a entender que es un algoritmo y como usar la notación Big O para poder analizar la complejidad temporal del mismo. Esto nos va a ayudar a entender el uso de recursos de cómputo y la eficiencia en velocidad dentro de nuestros programas, además suele ser una forma de evaluar a developers o ingenieros de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es un algoritmo?
&lt;/h2&gt;

&lt;p&gt;Un algoritmo es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. O sea, una serie de pasos a seguir para completar una tarea.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué hace bueno a un algoritmo?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Resuelve un problema: Este es el objetivo principal del algoritmo, fue diseñado para eso. Si no cumple el objetivo, no sirve para nada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debe ser comprensible: El mejor algoritmo del mundo no te va a servir si es demasiado complicado de implementar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hacerlo eficientemente: No sólo queremos tener la respuesta perfecta (o la más cercana), si no que también queremos que lo haga usando la menor cantidad de recursos posibles.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;De hecho estas dos condiciones a veces van en contra: encontrar la solución perfecta atenta contra el tiempo que va a tardar, y hacerlo rápido atenta contra la precisión de la respuesta. Vamos a tener que saber qué usamos en cada caso.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cómo medimos la eficienta del un algoritmo?
&lt;/h2&gt;

&lt;p&gt;Lo más fácil y rápido de hacer es contar cuanto tiempo le lleva al algoritmo encontrar la respuesta que buscamos. Pero eso nos diria la eficiencia de ese algoritmo sólamente para la computadora que lo corrió, con los datos que tenia y en el lenguaje que se haya implementado, no? Entonces como hacemos para comparar la eficiencia de distintos algoritmos? Para eso se hace un análisis conocido como Asymptotic Analysis, vamos a entender el concepto mas adelante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Complejidad de un algoritmo
&lt;/h2&gt;

&lt;p&gt;En general nos interesa conocer qué tan &lt;em&gt;complejos&lt;/em&gt; son los algoritmos, o en realidad, lo contrario: que tan eficiente es un algoritmo.&lt;br&gt;
Hay muchos aspectos que afectan la complejidad de un algoritmo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tiempo&lt;/li&gt;
&lt;li&gt;Espacio&lt;/li&gt;
&lt;li&gt;Otros recursos:

&lt;ul&gt;
&lt;li&gt;Red&lt;/li&gt;
&lt;li&gt;Gráficos&lt;/li&gt;
&lt;li&gt;Hardware (Impresoras, Cpus, Sensores, etc...)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;La mas común, y en la que nos vamos a concentrar mayormento es la complejidad de tiempo, es decir la &lt;em&gt;velocidad&lt;/em&gt; algoritmo, o cuanto tarda en correr. Otro tipo de complejidad importante es el espacio, o sea la cantidad de memoria (RAM o disco) que necesitamos para poder corer un algoritmo. De hecho, a veces cambiamos la complejidad de tiempo por la de memoria, un algoritmo va a consumir más espacio en memoria, pero va a correr más rápido.&lt;br&gt;
Otros algoritmos pueden requerir otros recursos, como por ejemplo algún algoritmo que se ejecute distribuido por la red, en ese caso el algoritmo se verá limitado por la velocidad y tamaño de la misma. Otro usarán otros tipos de recursos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Circunstancias
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;¿Cómo sabemos cuando un auto es más rápido que otro?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Bueno, si los ponemos en un tramo igual, y tomamos nuestros relojes para medir cuánto tardan, podremos ver que uno llega más rápido que otro a la meta. Que un auto tarda menos que otro. Tal vez unos 10, o 20, o 30 minutos.&lt;/p&gt;

&lt;p&gt;Entonces, medir es clave para determinar el mejor. Pero la Complejidad en sí no trata de si un auto llega 10, o 20 o 30 minutos más rápido a la meta. Si no del ritmo con el que aumenta. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La teoría de la complejidad estudia el consumo de recursos (tiempo, espacio) que un algoritmo ocupa. la complejidad algorítmica no se fija en el tiempo de ejecución del algoritmo (segundos, minutos, horas, etc), se fija en el ritmo y que tan eficiente puede ser un algoritmo en base al problema que está resolviendo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;¿Qué es este ritmo con el que aumentan los datos? ( EN CRIOLLO )&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Supongamos que tenemos dos algoritmos para ordenar números.&lt;br&gt;
Entonces tenemos un algoritmo A, medimos cuánto se tardará en ordenar diez, veinte y treinta números, y resulta vamos a requerir 10 segundos, 20 segundos y 40 segundos. Luego viene un algoritmo B, medimos otra vez, y requerirá 10 segundos, 10 segundos y 10 segundos. El aumento de tiempo es distinto en ambos. Entonces tenemos un algoritmo A que cada vez se demora más en calcular el ordenamiento (multiplicando cada vez por 2), y un algoritmo B que demora el mismo tiempo (multiplicando cada vez por 1). Este factor es el ritmo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56gtmhhgorno4baxek8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F56gtmhhgorno4baxek8k.png" alt="Comparacion de algoritmos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cota superior asintótica ( Big O Notation )
&lt;/h2&gt;

&lt;p&gt;Vamos a usar una función que sirve de cota superior  de otra función cuando el argumento tiende a infinito.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1hq6ljdqvx5nec7ljjq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1hq6ljdqvx5nec7ljjq.png" alt="Big 0 definicion matematica"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Definicion formal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Una función f(x) pertenece a O(g(x)) cuando existe una constante positiva c tal que a partir de un valor x0, f(x) no sobrepasa a cg(x). Quiere decir que la función f es inferior a g a partir de un valor dado salvo por un factor constante.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Puede parecer un poco dificil pero en la practica es mucho más simple que eso. La notación Big O intenta analizar la complejidad de los algoritmos según crece el número de entradas ( &lt;em&gt;n&lt;/em&gt; ) que tiene que analizar, en general es el tamaño del dataset que usa como entrada. Y lo que busca es una función que crezca de una forma con respecto a &lt;em&gt;n&lt;/em&gt; tal que nuestro algoritmo nunca crezca más rápido que esa función, aunque si puede crecer más lento. Básicamente, estamos buscando algo para poder decir: mirá este algoritmo nunca va a tardar más que esto, capaz tarda menos, pero más no.&lt;/p&gt;

&lt;p&gt;Lo que hace a Big-O tan importante es que se destaca en concentrarse en el caso peor de tu algoritmo. En el tope superior de nuestras mediciones. Si nuestro algoritmo empezó con unas mediciones muy buenas, pero de pronto creció mucho en el consumo de un recurso. Big-O tomará en cuenta esto último para determinar qué crecimiento le pertenece. &lt;/p&gt;

&lt;p&gt;Buscamos descubrir una función (Constante, Lineal, Polinomial, Logarítmica, Exponencial) la cual  sea mayor o igual que la complejidad de un algoritmo&lt;/p&gt;

&lt;p&gt;Clases de Big-O&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e3zcomviumw8odiz1j4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2e3zcomviumw8odiz1j4.png" alt="clases big O"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos a intentar crear un algoritmo en el que su ritmo de crecimiento no sea muy elevado.&lt;/p&gt;

&lt;p&gt;Comparación Gráfica&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5pxligt8d1xmle916v4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5pxligt8d1xmle916v4.png" alt="comparacion grafica"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arriba podemos ver una comparación gráfica de las distintas complejidades de los algoritmos.&lt;/p&gt;

&lt;p&gt;Si tuvieramos una computadora capaz de ejecutar 1.000.000 instrucciones por segundo, veamos cuanto tiempo tardarían algoritmos de distinta complejidad en terminar de correr con un N de entrada de 1000.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu09r3zzu0t8nm5gftxy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu09r3zzu0t8nm5gftxy3.png" alt="comparacion de instrucciones"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Calculo de Notación Big-O en complejidad temporal
&lt;/h3&gt;

&lt;p&gt;Vamos a ver Las reglas en el codigo para Big-O en calculo de complejida temporal &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmou5m797vjio5g2ekgtz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmou5m797vjio5g2ekgtz.png" alt="reglas de codigo"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;let bar = 'test' // O(1)&lt;br&gt;
if(){} // O(1)&lt;br&gt;
for(){} // O(n)&lt;br&gt;
while(){} // O(n)&lt;br&gt;
for(){ for(){} } // O(n^2)&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h4&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Simplificar la notación&lt;br&gt;
&lt;/h4&gt;

&lt;p&gt;Simplificar la notación de la complejidad se lleva a la expresión del elemento con mayor grado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy18cw9tat7l79r6ptvj0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy18cw9tat7l79r6ptvj0.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  ¿Por qué nos quedamos con el grado mayor al simplificar Big-O?
&lt;/h4&gt;

&lt;p&gt;En Big-O queremos comprender qué tanto recurso (como tiempo o espacio) nos gasta un algoritmo cuándo aumentamos los datos. Y cada grado aumenta a un ritmo totalmente distinto.&lt;/p&gt;

&lt;p&gt;Por ejemplo n crece más que 1000:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyia8rsvchcdpgq5eq07q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyia8rsvchcdpgq5eq07q.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No es necesario quedarnos con los grados pequeños: Podemos simplificar y quedarnos con lo importante. &lt;/p&gt;

&lt;p&gt;Ahora lo podemos poner en práctica analizando los siguientes programas: &lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;// Complejidad Temporal -&amp;gt; O( n + 3 ) -&amp;gt; O(n)&lt;/p&gt;

&lt;p&gt;function linearSearch(arreglo, clave) {&lt;br&gt;
  for (let indice = 0; indice &amp;lt; arreglo.length; indice++) { // O(n)&lt;br&gt;
    if (arreglo[indice] === clave) { // O(1)&lt;br&gt;
      return indice; // O(1)&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  return -1; // O(1)&lt;br&gt;
}&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;// Complejidad Temporal -&amp;gt; O( 1 + n * n + 1 + 1 + 1 + 1 + 1 ) -&amp;gt; O(n^2 +6) -&amp;gt; O(n^2)&lt;/p&gt;

&lt;p&gt;function bubbleSort(arreglo) {&lt;br&gt;
  let longitud = arreglo.length; // O(1)&lt;br&gt;
  for (let i = 0; i &amp;lt; longitud; i++) { // O(n)&lt;br&gt;
    for (let j = 0; j &amp;lt; longitud; j++) { // O(n)&lt;br&gt;
      if (arreglo[j] &amp;gt; arreglo[j + 1]) { // O(1)&lt;br&gt;
        let temporal = arreglo[j]; // O(1)&lt;br&gt;
        arreglo[j] = arreglo[j + 1]; // O(1)&lt;br&gt;
        arreglo[j + 1] = temporal; // O(1)&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  return arreglo; // O(1)&lt;br&gt;
}&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;//Complejidad Temporal -&amp;gt; O( n^2 )&lt;/p&gt;

&lt;p&gt;function selectionSort(arreglo) {&lt;br&gt;
  let longitud = arreglo.length; // O(1)&lt;/p&gt;

&lt;p&gt;for (let i = 0; i &amp;lt; longitud; i++) { // O(n)&lt;br&gt;
    let minimo = i; // O(1)&lt;br&gt;
    for (let j = i + 1; j &amp;lt; longitud; j++) { // O(n)&lt;br&gt;
      if (arreglo[j] &amp;lt; arreglo[minimo]) { // O(1)&lt;br&gt;
        minimo = j; // O(1)&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
    if (minimo != i) { // O(1)&lt;br&gt;
      let temporal = arreglo[i]; // O(1)&lt;br&gt;
      arreglo[i] = arreglo[minimo]; // O(1)&lt;br&gt;
      arreglo[minimo] = temporal; // O(1)&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
  return arreglo; // O(1)&lt;br&gt;
}&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Notas finales sobre algoritmos&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;Hasta ahora sabes que un algoritmo con O(1) es mejor que uno con O(n). Pero, ¿Y si ese algoritmo con O(1) se ejecuta en 1000 horas?&lt;/p&gt;

&lt;p&gt;La complejidad algorítmica es importante, pero dónde se ejecuta tu algoritmo determina qué tan importante es.&lt;/p&gt;

&lt;p&gt;Cuando la Complejidad Algorítmica deja de ser relevante, es donde debemos mejorar nuestro algoritmo para alcanzar nuestro objetivo de eficiencia.&lt;/p&gt;

&lt;p&gt;Tal vez tengamos el mejor algoritmo jamás visto, pero si lo ejecutamos en una computadora de hace 20 años con Intel Celeron no podemos esperar mucha rapidez&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Solo hay Big-O para tiempo?
&lt;/h3&gt;

&lt;p&gt;No, también se puede aplicar al cálculo del espacio, por ejemplo en JavaScript es más relevante apuntar al tiempo, que al espacio. Porque en el código JavaScript usualmente no corre en dispositivos con memoria muy limitada a diferencia de dispositivos embebidos donde el espacio que tiene en la memoria es más reducido y por lo tanto más relevante para nuestro análisis.&lt;/p&gt;

&lt;p&gt;Esto no significa que no haya casos particulares, o que el espacio siempre sea menos importante que el tiempo, sólo es el ambiente del software con JavaScript. la complejidad es el estudio de los recursos que utilizan los algoritmos. Estos recursos pueden ser cualquier concepto de hardware y software. Como acceso a la memoria, comparaciones de condiciones, o lo que se necesite limitar.&lt;/p&gt;

&lt;h3&gt;
  
  
  finalmente
&lt;/h3&gt;

&lt;p&gt;Esta lectura fue un resumen a grandes rasgos sobre la complejidad algorítmica. Si te interesa profundizar sobre el tema y su aplicación en estructuras de datos te recomiendo los siguientes recursos gratuitos ofrecidos por Freecodecamp: &lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=RBSGKlAvoiM&amp;amp;t=315s&amp;amp;ab_channel=freeCodeCamp.org" rel="noopener noreferrer"&gt;Data Structures Easy to Advanced Course&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=Mo4vesaut8g&amp;amp;t=213s&amp;amp;ab_channel=freeCodeCamp.org" rel="noopener noreferrer"&gt;Big O Notation - Full Course&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>algorithms</category>
      <category>computerscience</category>
    </item>
  </channel>
</rss>
