Las matrices en JavaScript son muy fáciles de modificar agregando y eliminando elementos. De alguna manera enmascara el hecho de que la mayoría de las matrices de idiomas son de tamaño fijo y requieren operaciones complejas para cambiar su tamaño. Parece que JavaScript facilita la escritura de código de matriz de bajo rendimiento. Esto lleva a la pregunta:
¿Qué rendimiento (en términos de gran complejidad de tiempo O) puedo esperar de las implementaciones de JavaScript con respecto al rendimiento de la matriz?
Supongo que todas las implementaciones de JavaScript razonables tienen como máximo las siguientes O grandes.
- Acceso - O (1)
- Anexando - O (n)
- Anteponer - O (n)
- Inserción - O (n)
- Supresión - O (n)
- Intercambio - O (1)
JavaScript le permite rellenar previamente una matriz a un cierto tamaño, utilizando new Array(length)
sintaxis. (Pregunta adicional: ¿Está creando una matriz de esta manera O (1) u O (n)) Esto es más como una matriz convencional, y si se usa como una matriz de tamaño predeterminado, puede permitir que se agregue O (1). Si se agrega lógica de búfer circular, puede lograr O (1) anteponer. Si se usa una matriz de expansión dinámica, O (log n) será el caso promedio para ambos.
¿Puedo esperar un mejor rendimiento para algunas cosas que mis suposiciones aquí? No espero que se describa nada en las especificaciones, pero en la práctica, podría ser que todas las implementaciones principales usen arreglos optimizados detrás de escena. ¿Hay matrices que se expanden dinámicamente u otros algoritmos que mejoran el rendimiento en funcionamiento?
PD
La razón por la que me pregunto esto es que estoy investigando algunos algoritmos de clasificación, la mayoría de los cuales parecen asumir que agregar y eliminar son operaciones O (1) al describir su gran O general.
length
propiedad y preasignar espacio son dos cosas completamente diferentes.
array[5]
un new Array(10)
is O (1)?
.length
pero eso es todo). Las matrices en realidad no son muy diferentes de las instancias de objetos simples.