Os arrays em JavaScript são muito fáceis de modificar, adicionando e removendo itens. De certa forma, mascara o fato de que a maioria dos arrays de linguagens tem tamanho fixo e requer operações complexas para redimensionar. Parece que o JavaScript facilita a escrita de código de array de baixo desempenho. Isso leva à pergunta:
Que desempenho (em termos de grande complexidade de tempo) posso esperar das implementações de JavaScript em relação ao desempenho do array?
Presumo que todas as implementações de JavaScript razoáveis têm no máximo os seguintes grandes O's.
- Acesso - O (1)
- Anexando - O (n)
- Anexando - O (n)
- Inserção - O (n)
- Exclusão - O (n)
- Troca - O (1)
O JavaScript permite que você preencha previamente um array até um certo tamanho, usando a new Array(length)
sintaxe. (Pergunta bônus: está criando um array desta maneira O (1) ou O (n)) Isto é mais parecido com um array convencional e, se usado como um array pré-dimensionado, pode permitir o acréscimo de O (1). Se a lógica de buffer circular for adicionada, você pode obter O (1) antes. Se uma matriz de expansão dinâmica for usada, O (log n) será o caso médio para ambos.
Posso esperar um desempenho melhor para algumas coisas do que minhas suposições aqui? Não espero que nada seja descrito em nenhuma especificação, mas, na prática, pode ser que todas as principais implementações usem arrays otimizados nos bastidores. Existem matrizes de expansão dinâmica ou algum outro algoritmo de aumento de desempenho em funcionamento?
PS
O motivo de estar me perguntando isso é que estou pesquisando alguns algoritmos de classificação, a maioria dos quais parece assumir que anexar e excluir são operações O (1) ao descrever seu grande O geral.
length
propriedade e pré-alocar espaço são duas coisas completamente diferentes.
array[5]
em A new Array(10)
é O (1)?
.length
mas isso é tudo.) Arrays realmente não são muito diferentes de instâncias de Object simples.