Se supone que comprende la notación O grande. Los ejemplos están en JavaScript. Referencias informativas "Cracking the Coding Interview" de Gayle Laakmann McDowell
En algunos lenguajes como JavaScript o Python, las matrices se pueden cambiar de tamaño automáticamente, lo que significa que crecerán a medida que agregue elementos. En otros lenguajes como Java, las matrices tienen longitudes fijas, lo que significa que el tamaño se define cuando inicializa la matriz. Estas matrices que crecen automáticamente se denominan matrices dinámicas.
En Java, una ArrayList es una estructura de datos similar a una matriz que ofrece un cambio de tamaño dinámico sin dejar de proporcionar O(1) acceso. Cuando la matriz está llena, duplica su tamaño. Cada duplicación toma En) tiempo, pero ocurre tan raramente que su tiempo de inserción amortizado aún es O(1) .
Entre diferentes lenguajes de programación, el nombre de esta estructura de datos, así como su factor de cambio de tamaño (que es 2 en Java) varía. El factor de cambio de tamaño determina cuánto más grande se cambiará el tamaño de una matriz.
Al cambiar el tamaño, asumiendo que el factor de cambio de tamaño es 2, podemos observar que aumentamos a una matriz de tamaño N duplicando la matriz anterior (que es la mitad de N). Además, también necesitamos copiar N/2 elementos a esta nueva matriz.
Si sumamos el número de elementos que copiamos del aumento de capacidad final al primer aumento de capacidad: 2n 4n 8 n 16n ... 2 1 que suma poco menos que N. Por lo tanto, insertar N elementos lleva aproximadamente En) trabajo en total. Cada inserción es O(1) en promedio, aunque algunas inserciones toman En) tiempo en el peor de los casos.
Las matrices dinámicas en JavaScript suelen tener varios métodos principales, cada uno con diferentes complejidades temporales:
get(i): este método recupera el elemento en el índice i.
set(i, n): este método establece el elemento en el índice i a n.
pushback(n): este método agrega el elemento n al final de la matriz.
popback(): este método elimina el último elemento de la matriz.
resize(): este método duplica la capacidad de la matriz y copia todos los elementos a la nueva matriz.
getSize(): Este método devuelve el número de elementos de la matriz.
getCapacity(): Este método devuelve la capacidad actual de la matriz.
class DynamicArray { // size is # of filled slots while capacity is total slots in array constructor(capacity) { this.capacity = capacity; this.arr = new Array(this.capacity); this.size = 0; } // O(1) get(i) { if (i = this.size) return undefined; return this.arr[i]; } // O(1) set(i, n) { if (i = this.size) return undefined; this.arr[i] = n; } // O(1) amortized pushback(n) { if (this.size === this.capacity) { this.resize(); } this.arr[this.size] = n; this.size ; } // O(1) popback() { if (this.size === 0) return undefined; this.size--; let temp = this.arr[this.size]; this.arr[this.size] = undefined; return temp; } // O(n) resize() { this.capacity *= 2; let newArr = new Array(this.capacity); for (let i = 0; iConclusión
Los arreglos dinámicos son una poderosa estructura de datos que combina la flexibilidad del almacenamiento redimensionable con la eficiencia del acceso en tiempo constante. ¡Espero que esto ayude!
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3