Pressupõe compreensão da notação Big O. Os exemplos estão em JavaScript. Referências informativas "Cracking the Coding Interview" por Gayle Laakmann McDowell
Em algumas linguagens como JavaScript ou Python, os arrays são automaticamente redimensionáveis, o que significa que eles crescerão conforme você acrescenta itens. Em outras linguagens como Java, os arrays têm comprimentos fixos, o que significa que o tamanho é definido quando você inicializa o array. Esses arrays que crescem automaticamente são chamados de arrays dinâmicos.
Em Java, um ArrayList é uma estrutura de dados semelhante a um array que oferece redimensionamento dinâmico enquanto ainda fornece O(1) acesso. Quando a matriz está cheia, ela dobra de tamanho. Cada duplicação leva Sobre) tempo, mas acontece tão raramente que seu tempo de inserção amortizado ainda é O(1) .
Entre diferentes linguagens de programação, o nome desta estrutura de dados, bem como seu fator de redimensionamento (que é 2 em Java) varia. O fator de redimensionamento determina quanto maior um array será redimensionado.
Ao redimensionar, assumindo que o fator de redimensionamento é 2, podemos observar que aumentamos para um array de tamanho N dobrando o array anterior (que é metade de N). Além disso, também precisamos copiar N/2 elementos para esta nova matriz.
Se somarmos o número de elementos que copiamos do aumento de capacidade final para o primeiro aumento de capacidade: 2n 4n 8 n 16n ... 2 1 que soma pouco menos que N. Portanto, inserir N elementos leva cerca de Sobre) trabalho no total. Cada inserção é O(1) em média, embora algumas inserções demorem Sobre) tempo na pior das hipóteses.
Matrizes dinâmicas em JavaScript normalmente têm vários métodos principais, cada um com diferentes complexidades de tempo:
get(i): Este método recupera o elemento no índice i.
set(i, n): Este método define o elemento no índice i como n.
pushback(n): Este método adiciona o elemento n ao final do array.
popback(): Este método remove o último elemento do array.
resize(): Este método dobra a capacidade do array e copia todos os elementos para o novo array.
getSize(): Este método retorna o número de elementos do array.
getCapacity(): Este método retorna a capacidade atual do array.
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; iConclusão
Matrizes dinâmicas são uma estrutura de dados poderosa que combina a flexibilidade do armazenamento redimensionável com a eficiência do acesso em tempo constante. Espero que isto ajude!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3