Introducción a las estructuras de datos en JavaScript
JavaScript es uno de los lenguajes de programación más populares que se utiliza en el desarrollo web hoy en día. Es fácil de aprender y tiene una gran comunidad de desarrolladores. Una de las áreas en las que los desarrolladores de JavaScript a menudo pasan por alto es el uso de estructuras de datos.
Las estructuras de datos son formas de organizar y almacenar datos en un programa. Esto puede ser muy útil cuando se trabaja con grandes cantidades de información y se necesita una forma eficiente de acceder y manipular los datos. Javascript proporciona varias estructuras de datos principales, cada una con sus propias fortalezas y debilidades.
Arrays
Un array es una estructura de datos que puede contener varios valores. Esto se puede utilizar para almacenar números, strings, objetos y otras estructuras de datos. Los arrays se pueden inicializar de la siguiente manera:
let numeros = [1, 2, 3, 4, 5];
let nombres = ["Juan", "Maria", "Pedro"];
let objetos = [
{ id: 1, nombre: "Objeto 1" },
{ id: 2, nombre: "Objeto 2" },
];
Objetos
Los objetos son una estructura de datos que nos permite almacenar propiedades y valores. En JavaScript, los objetos se pueden inicializar de la siguiente manera:
let objeto = {
nombre: "Juan",
edad: 31,
direccion: { calle: "Av. Siempre Viva", numero: 123 },
};
Set
Un Set
es una estructura de datos que nos permite almacenar elementos únicos. Es decir, no se pueden duplicar elementos en un Set. Para crear un conjunto, puede hacerlo de la siguiente manera:
let miSet = new Set();
miSet.add(1);
miSet.add(2);
miSet.add(3);
Map
Un Map
es una estructura de datos que nos permite almacenar pares clave-valor. Es decir, un valor que está asociado a una clave. Para crear un Map
, puede hacerlo de la siguiente manera:
let miMap = new Map();
miMap.set("nombre", "Juan");
miMap.set("edad", 31);
miMap.set("direccion", { calle: "Av. Siempre Viva", numero: 123 });
Las estructuras de datos son una herramienta vital para cualquier programador. Configurar y utilizar las estructuras de datos adecuadas puede hacer que su código sea más claro y eficiente. Esperamos que esta breve introducción a las principales estructuras de datos en JavaScript te haya ayudado a mejorar tu comprensión de la programación, y que te animes a utilizar estas estructuras en tus futuros proyectos.
Arreglos: cómo almacenar y acceder a datos de forma eficiente
Los arreglos son una de las estructuras de datos más utilizadas en JavaScript. Nos permiten almacenar una serie de elementos, como números o cadenas de texto, en una sola variable. Los arreglos también son muy eficientes cuando se trata de acceder a los elementos.
Para empezar, podemos crear un arreglo vacío de la siguiente manera:
const miArreglo = [];
Después, podemos agregar elementos al arreglo utilizando el método push() de la siguiente manera:
miArreglo.push("Manzana");
miArreglo.push("Banana");
miArreglo.push("Naranja");
También podemos acceder a los elementos del arreglo utilizando su índice. Es importante mencionar que los índices de los arreglos comienzan en cero. Por lo tanto, para obtener la primera fruta (Manzana) del arreglo, debemos utilizar el índice 0 de la siguiente manera:
console.log(miArreglo[0]); // Manzana
También podemos recorrer un arreglo utilizando un ciclo for. En el siguiente ejemplo, veremos cómo podemos utilizar un ciclo for para imprimir todas las frutas en nuestro arreglo.
for (let i = 0; i < miArreglo.length; i++) {
console.log(miArreglo[i]);
}
Este ciclo for recorre cada elemento del arreglo utilizando el índice i. Primero, el valor de i es 0, lo que significa que se imprimirá la primera fruta (Manzana). Luego, el valor de i se incrementa en 1 y se imprimirá la siguiente fruta (Banana). El ciclo continúa hasta que i es igual a la longitud del arreglo.
Una función muy útil que nos provee JavaScript es la función forEach(). Esta función nos permite recorrer un arreglo de una manera más sencilla. En el siguiente ejemplo, usaremos la función forEach() para imprimir todas las frutas en nuestro arreglo.
miArreglo.forEach(function (fruta) {
console.log(fruta);
});
Este código hace lo mismo que el ciclo for anterior, pero usando la función forEach(). La función forEach() recibe como parámetro una función que se ejecutará para cada elemento del arreglo. En este caso, nuestra función simplemente imprime la fruta.
Los arreglos son una herramienta muy útil para almacenar y acceder a datos de forma eficiente en JavaScript. Utilizando los métodos
push()
, los índices y la funciónforEach()
podemos agregar, acceder y recorrer nuestro arreglo de una manera sencilla y efectiva.
Objetos: la versatilidad de las propiedades y métodos
Los objetos son una de las estructuras de datos más importantes en JavaScript. Son una forma de almacenar y organizar información de una manera flexible y poderosa. En esencia, un objeto es un conjunto de propiedades y métodos.
Las propiedades son simplemente variables que están vinculadas al objeto. Cada propiedad tiene un nombre y un valor asociado. El valor puede ser cualquier tipo de datos válido en JavaScript, incluyendo números, cadenas, booleanos, arrays, funciones e incluso otros objetos. Por ejemplo, un objeto que representa una persona podría tener propiedades como “nombre”, “edad”, “dirección”, “teléfono”, etc.
Los métodos son funciones que están vinculadas al objeto. Cada método tiene un nombre y un cuerpo de función que define lo que hace ese método. Los métodos pueden acceder y modificar las propiedades del objeto, realizar cálculos complejos, interactuar con otros objetos y mucho más. Por ejemplo, un objeto que representa una calculadora podría tener métodos como “sumar”, “restar”, “multiplicar” y “dividir”.
La verdadera versatilidad de los objetos radica en su capacidad para combinar propiedades y métodos de una manera poderosa y flexible. Por ejemplo, un objeto que representa un usuario en un sistema web podría tener propiedades como “nombre”, “correo electrónico”, “contraseña” y “perfil de usuario”. Además, podría tener métodos para validar la información del usuario, autenticar el inicio de sesión y actualizar su perfil.
A continuación, se muestra un ejemplo básico de un objeto en JavaScript:
let usuario = {
nombre: "Juan",
edad: 30,
correo: "[email protected]",
saludar: function () {
console.log(
"Hola, mi nombre es " +
this.nombre +
" y tengo " +
this.edad +
" años."
);
},
};
usuario.saludar();
// Output: Hola, mi nombre es Juan y tengo 30 años.
En este ejemplo, definimos un objeto llamado “usuario” con tres propiedades (“nombre”, “edad”, “correo”) y un método llamado “saludar”. El método “saludar” usa la palabra clave “this” para acceder a las propiedades del objeto y construir una cadena de saludo personalizada.
Los objetos son una forma poderosa y flexible de organizar y manipular información en JavaScript. A través de sus propiedades y métodos, pueden representar casi cualquier cosa imaginable, desde personas hasta calculadoras, juegos y aplicaciones web completas. Si está aprendiendo JavaScript, es fundamental que se familiarice con los objetos y cómo trabajar con ellos de manera efectiva.
Listas vinculadas: la opción cuando la cantidad de datos puede variar
Las listas vinculadas son una estructura de datos muy útil cuando se necesita almacenar una cantidad variable de elementos. A diferencia de los arrays, en los que el tamaño debe ser definido al momento de su creación, las listas vinculadas pueden crecer o reducir su tamaño dinámicamente.
Para entender las listas vinculadas, se puede pensar en una cadena de eslabones, en la que cada eslabón tiene una referencia al siguiente. El primer eslabón se llama head, y el último se llama tail. Cada eslabón, o nodo, tiene dos componentes: el valor del elemento almacenado y una referencia al siguiente nodo.
Veamos un ejemplo en JavaScript:
class Node {
constructor(value, next) {
this.value = value;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
}
push(value) {
const newNode = new Node(value, null);
if (!this.head) {
this.head = newNode;
this.tail = newNode;
} else {
this.tail.next = newNode;
this.tail = newNode;
}
}
}
En este ejemplo, la class Node
define la estructura de un nodo. La class LinkedList
tiene dos propiedades: la head
, que apunta al primer nodo de la lista, y la tail
, que apunta al último nodo de la lista. El método push
agrega un nuevo nodo al final de la lista.
Cuando se crea una instancia de la LinkedList
, ambas propiedades están inicialmente en null
. El método push
comprueba si la head
es nula, en cuyo caso establece la head
y la tail
en el nuevo nodo. De lo contrario, se establece el next
del último nodo en el nuevo nodo, y la tail
se actualiza al nuevo nodo.
Es posible recorrer la lista vinculada mediante un bucle while, como se muestra a continuación:
let current = linkedList.head;
while (current) {
console.log(current.value);
current = current.next;
}
En este ejemplo, el bucle itera sobre cada nodo de la lista hasta que se llega al final (cuando current
es null
).
Las listas vinculadas son útiles cuando no se sabe de antemano la cantidad de elementos que deben almacenarse, ya que los arrays tienen un tamaño fijo. Sin embargo, también tienen algunas desventajas en términos de rendimiento, ya que acceder a un elemento en una lista vinculada requiere recorrer la lista desde el principio hasta el nodo deseado.
Las listas vinculadas son una opción poderosa y flexible para almacenar datos en JavaScript. Si bien tienen algunas desventajas en términos de rendimiento, son una excelente opción cuando la cantidad de elementos puede variar y es difícil predecir la cantidad de memoria necesaria de antemano.
Pilas: cómo manejar elementos en orden de ingreso y salida
Cuando hablamos de pilas en programación, nos referimos a una estructura de datos que se caracteriza por manejar elementos en orden de ingreso y salida. La particularidad de las pilas es que el último elemento en ingresar es el primero en salir, por lo que debemos pensar en ellas como si fueran una pila de platos en la que siempre tomamos el último que pusimos para utilizarlo.
En el lenguaje de programación JavaScript, las pilas se pueden implementar de varias maneras, pero en esta oportunidad nos enfocaremos en una de ellas: utilizando un array o matriz.
Para crear una pila en JavaScript, lo primero que debemos hacer es crear un array vacío. A medida que vayamos ingresando elementos a la pila, iremos agregándolos al final del array utilizando el método push()
. Para sacar un elemento de la pila, podemos utilizar el método pop()
, el cual nos permitirá obtener el último elemento ingresado en la pila y, al mismo tiempo, eliminarlo del array.
Veamos un ejemplo de cómo crear y utilizar una pila en JavaScript:
// Creamos un array vacío para la pila
let pila = [];
// Agregamos elementos a la pila
pila.push("elemento 1");
pila.push("elemento 2");
pila.push("elemento 3");
// Obtenemos y eliminamos el último elemento ingresado en la pila
let ultimoElemento = pila.pop();
console.log(ultimoElemento); // Imprime "elemento 3"
Es importante destacar que cuando utilizamos el método pop()
sobre una pila vacía, JavaScript nos devolverá undefined
. Por esta razón, es necesario comprobar que la pila tenga elementos antes de intentar sacar uno.
Además de push()
y pop()
, existen otros métodos útiles para el manejo de pilas en JavaScript, como por ejemplo length
, que nos devuelve la cantidad de elementos en la pila, y slice()
, que nos permite obtener un subconjunto de la pila sin modificarla.
Las pilas son una estructura de datos muy útil en programación para manejar elementos en orden de ingreso y salida. En JavaScript, las podemos implementar utilizando un array y los métodos
push()
ypop()
. Con un poco de práctica, podremos utilizarlas para resolver problemas en nuestras aplicaciones de manera más eficiente.
Colas: cómo manejar elementos en orden de ingreso y salida
En JavaScript, las colas son una estructura de datos que nos permiten manejar elementos en orden de ingreso y salida. Podemos visualizar una cola como una línea en la que los elementos se agregan por un extremo y se eliminan por el otro.
Las colas son útiles en situaciones en las que necesitamos realizar tareas en un orden específico, por ejemplo, procesar una gran cantidad de datos en el orden en que llegaron. También son útiles en situaciones en las que varias tareas compiten por recursos limitados y necesitan esperar su turno.
Para implementar una cola en JavaScript podemos utilizar un array. Podemos agregar elementos al final del array utilizando el método push()
, y eliminar elementos del principio del array utilizando el método shift()
.
const queue = [];
queue.push("elemento 1");
queue.push("elemento 2");
queue.push("elemento 3");
console.log(queue.shift()); // Output: "elemento 1"
console.log(queue.shift()); // Output: "elemento 2"
console.log(queue.shift()); // Output: "elemento 3"
En el ejemplo anterior, creamos un array vacío queue
. Luego, agregamos tres elementos al final del array utilizando push()
. Finalmente, eliminamos los elementos uno por uno utilizando shift()
y los imprimimos en la consola.
Otro método útil para trabajar con colas es unshift()
, que nos permite agregar elementos al principio del array.
const queue = [];
queue.unshift("elemento 1");
queue.unshift("elemento 2");
queue.unshift("elemento 3");
console.log(queue.pop()); // Output: "elemento 1"
console.log(queue.pop()); // Output: "elemento 2"
console.log(queue.pop()); // Output: "elemento 3"
En este ejemplo utilizamos unshift()
para agregar tres elementos al principio del array. Luego, utilizamos pop()
para eliminar los elementos uno por uno del final del array.
También podemos utilizar un objeto para implementar una cola en JavaScript. En este caso, necesitamos llevar un registro de la posición del primer elemento y del último elemento en la cola. Podemos agregar elementos al final del objeto utilizando la posición del último elemento, y eliminar elementos del principio del objeto utilizando la posición del primer elemento.
const queue = {
start: 0,
end: 0,
elements: {},
push: function (element) {
this.elements[this.end] = element;
this.end++;
},
shift: function () {
if (this.start === this.end) return undefined;
const element = this.elements[this.start];
delete this.elements[this.start];
this.start++;
return element;
},
};
queue.push("elemento 1");
queue.push("elemento 2");
queue.push("elemento 3");
console.log(queue.shift()); // Output: "elemento 1"
console.log(queue.shift()); // Output: "elemento 2"
console.log(queue.shift()); // Output: "elemento 3"
En este ejemplo creamos un objeto queue
con tres propiedades: start
y end
que representan las posiciones del primer elemento y del último elemento en la cola, respectivamente, y elements
, que es un objeto en el que almacenamos los elementos de la cola. También creamos dos métodos: push()
y shift()
, que nos permiten agregar elementos al final y eliminar elementos del principio de la cola, respectivamente.
Para utilizar la cola, llamamos a los métodos push()
para agregar tres elementos y luego llamamos a shift()
para eliminar los elementos uno por uno.
Las colas son una estructura de datos útil en JavaScript para manejar elementos en orden de ingreso y salida. Podemos implementar una cola utilizando un array o un objeto, dependiendo de nuestras necesidades.
Árboles: una estructura jerárquica para representar datos relacionados
En la programación, a menudo necesitamos organizar y almacenar grandes cantidades de datos de manera eficiente para poder acceder a ellos rápidamente. Una de las estructuras de datos más útiles para esto son los árboles.
Los árboles son excelentes para organizar datos relacionados jerárquicamente. La estructura básica de un árbol consiste en un nodo raíz que se conecta a otros nodos por medio de enlaces llamados ramas. Cada nodo puede tener varios nodos descendientes, que a su vez pueden tener otros descendientes. Cada nodo, excepto la raíz, tiene exactamente un nodo padre.
Los árboles son muy útiles para modelar una variedad de problemas, como organizar archivos en una computadora (en la que cada carpeta es un nodo y los archivos son hojas), la estructura jerárquica de una organización o empresa, o la estructura de un sitio web.
En JavaScript, podemos implementar árboles utilizando objetos y referencias de objetos. Aquí hay un ejemplo simple:
const tree = {
value: "A",
children: [
{
value: "B",
children: [
{
value: "D",
children: [],
},
{
value: "E",
children: [],
},
],
},
{
value: "C",
children: [
{
value: "F",
children: [],
},
{
value: "G",
children: [],
},
],
},
],
};
En este ejemplo, cada nodo contiene un valor, que representa el dato almacenado en ese nodo, y un arreglo children
que contiene los nodos descendientes. En este caso, la raíz tiene dos nodos descendientes, B
y C
, que a su vez tienen sus propios nodos descendientes.
El uso de estructuras de árbol puede ayudar a mejorar significativamente la eficiencia y claridad del código en proyectos grandes y complejos. Además, muchas bibliotecas y marcos de trabajo populares como React y Vue.js utilizan árboles para manejar componentes y estructuras DOM, lo que los convierte en una habilidad muy valiosa para cualquier desarrollador JavaScript.
Los árboles son una estructura de datos poderosa y flexible que pueden ayudar a organizar y almacenar datos relacionados de manera jerárquica. En JavaScript, podemos implementarlos utilizando objetos y referencias de objetos. Si bien pueden ser un concepto complejo al principio, dominar los árboles es una habilidad imprescindible para cualquier desarrollador serio de JavaScript.
Grafos: cómo representar relaciones complejas entre datos
En el mundo de la programación, a menudo nos enfrentamos a problemas en los que necesitamos modelar relaciones complejas entre datos. Uno de los casos más comunes es el de los grafos. En este artículo, exploraremos cómo representar grafos en JavaScript y veremos algunos ejemplos prácticos de código.
Un grafo es un conjunto de nodos interconectados por aristas. Cada nodo representa un objeto o entidad, mientras que las aristas representan las relaciones entre ellos. Los grafos son una forma poderosa de modelar sistemas complejos, ya que nos permiten visualizar y analizar las relaciones entre los datos de una manera más clara y concisa.
En JavaScript, podemos representar un grafo usando dos enfoques diferentes: la matriz de adyacencia y la lista de adyacencia. La matriz de adyacencia es una matriz bidimensional que indica si hay una arista entre dos nodos. Si la posición (i, j) de la matriz es igual a 1, significa que hay una arista que va desde el nodo i al nodo j. Por otro lado, en la lista de adyacencia, cada nodo es representado por un objeto que mantiene una lista de sus vecinos directos.
Veamos un ejemplo de cómo podemos crear un grafo utilizando la matriz de adyacencia en JavaScript:
const graph = [
[0, 1, 1, 0],
[1, 0, 0, 1],
[1, 0, 0, 1],
[0, 1, 1, 0],
];
En este ejemplo, el grafo tiene cuatro nodos, representados por los índices 0, 1, 2 y 3. La matriz muestra que hay una arista entre el nodo 0 y el nodo 1, entre el nodo 0 y el nodo 2, entre el nodo 1 y el nodo 3, y entre el nodo 2 y el nodo 3.
Ahora veamos cómo podemos representar el mismo grafo utilizando la lista de adyacencia:
const graph = [
[1, 2],
[0, 3],
[0, 3],
[1, 2],
];
En este caso, cada nodo es representado por un objeto que contiene una lista de sus vecinos. El nodo 0 tiene como vecinos los nodos 1 y 2, el nodo 1 tiene como vecinos los nodos 0 y 3, y así sucesivamente.
Una vez que hemos creado nuestro grafo en JavaScript, podemos usar una variedad de algoritmos y técnicas para analizarlo y extraer información útil. Por ejemplo, podemos buscar el camino más corto entre dos nodos, calcular las distancias entre los nodos y encontrar ciclos en el grafo.
Los grafos son una herramienta poderosa e invaluable para modelar sistemas complejos en la programación. En JavaScript, podemos representar grafos de manera eficiente utilizando matrices de adyacencia y listas de adyacencia. Con las herramientas adecuadas, podemos analizar y extraer información útil de los grafos para resolver problemas desafiantes en el mundo de la programación.
Hash tables: una forma rápida y eficiente de buscar y almacenar datos
Las Hash tables son una de las estructuras de datos más útiles y eficientes en JavaScript. Son ideales para guardar y buscar datos porque son muy rápidas en la búsqueda y almacenamiento de información. Además, su implementación en código es muy sencilla y suelen ser muy útiles en situaciones en las que necesitas buscar datos por su identificador único, como una clave o un índice.
Para entender cómo funciona una Hash table, imagina un diccionario en el que buscas una palabra específica. En lugar de buscar en todas las páginas del libro, vas directamente a la página en la que se encuentra la letra inicial de la palabra y buscas entre las palabras que empiezan con esa letra. Es mucho más rápido que revisar todas las páginas de principio a fin. En JavaScript, una Hash table funciona de manera similar. En lugar de buscar a través de todos los elementos en busca de un valor específico, la Hash table utiliza un algoritmo de Hash para indexar las posiciones de almacenamiento.
Para utilizar una Hash table en JavaScript, primero debes crear un objeto vacío. Este objeto actuará como tu Hash table y las claves y valores serán sus propiedades. Por ejemplo:
const miHash = {}; // Crea un objeto vacío
Luego, puedes agregar pares clave-valor con la sintaxis nombreObjeto["clave"] = valor;
Por ejemplo:
miHash["a"] = 1;
miHash["b"] = 2;
miHash["c"] = 3;
También puedes crear una Hash table con valores preestablecidos utilizando la siguiente sintaxis:
const miHash = {
a: 1,
b: 2,
c: 3,
};
Para buscar un valor específico en una Hash table, simplemente debes usar la clave como índice para encontrarlo. Por ejemplo:
const valor = miHash["b"]; // Retorna 2
Una de las principales ventajas de las Hash tables es su velocidad de búsqueda. En una Hash table correctamente implementada, la búsqueda y el almacenamiento de elementos deberían tener una complejidad de tiempo constante, lo que significa que no importa cuántos elementos hay en la tabla, el tiempo de búsqueda siempre será el mismo.
Las Hash tables son una herramienta invaluable en la programación de JavaScript. Son una forma rápida y eficiente de almacenar y buscar datos, y con su fácil implementación en código, las convierten en una de las estructuras de datos más populares en la programación Web.
Algoritmos de búsqueda y ordenamiento: cómo manipular y organizar datos para una mejor gestión
Cuando estamos trabajando con grandes cantidades de datos en JavaScript, es crucial conocer los algoritmos de búsqueda y ordenamiento. Estas herramientas nos permiten manipular y organizar los datos para una gestión más eficiente y efectiva.
Los algoritmos de búsqueda nos ayudan a encontrar elementos específicos dentro de un conjunto de datos. Javascript tiene diferentes tipos de algoritmos de búsqueda, incluyendo la búsqueda lineal y la búsqueda binaria. Si estamos buscando un único elemento dentro de un conjunto de datos, la búsqueda lineal es probablemente la opción más sencilla y efectiva. Sin embargo, si estamos trabajando con un conjunto de datos ordenado, la búsqueda binaria puede ser mucho más eficiente.
Veamos un ejemplo de ambos tipos de búsqueda:
// Búsqueda lineal
let array = [5, 9, 2, 4, 1, 8];
let searchValue = 1;
for (let i = 0; i < array.length; i++) {
if (array[i] === searchValue) {
console.log("Found value at index " + i);
break;
}
}
// Búsqueda binaria
let sortedArray = [1, 2, 4, 5, 8, 9];
let binarySearch = (arr, val, start = 0, end = arr.length - 1) => {
if (start > end) return -1;
let mid = Math.floor((start + end) / 2);
if (arr[mid] === val) return mid;
if (arr[mid] > val) return binarySearch(arr, val, start, mid - 1);
if (arr[mid] < val) return binarySearch(arr, val, mid + 1, end);
};
console.log("Found value at index " + binarySearch(sortedArray, 8));
Los algoritmos de ordenamiento, por otro lado, nos permiten organizar nuestros datos en una estructura coherente y ordenada. Los algoritmos de ordenamiento más conocidos son el ordenamiento burbuja, el ordenamiento por selección y el ordenamiento por inserción. Cada uno de estos algoritmos tiene sus propias ventajas y desventajas, dependiendo del conjunto de datos y la cantidad de elementos que estemos manipulando.
Veamos un ejemplo del algoritmo de ordenamiento por selección:
let array = [5, 9, 2, 4, 1, 8];
let selectionSort = (arr) => {
for (let i = 0; i < arr.length; i++) {
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
let temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
};
console.log(selectionSort(array));
Es importante recordar que los algoritmos de búsqueda y ordenamiento tienen diferentes complejidades de tiempo y espacio. Por lo tanto, es importante tener en cuenta estas diferencias cuando estamos seleccionando el algoritmo adecuado para nuestro conjunto de datos.
Los algoritmos de búsqueda y ordenamiento son herramientas valiosas que nos permiten manipular y organizar nuestros datos de manera efectiva en JavaScript. Además, al seleccionar los algoritmos adecuados para nuestro conjunto de datos, podemos optimizar el rendimiento de nuestro código y mejorar el tiempo de ejecución.